From f8ddba4a33665609e206d2d80e5a875cc3325bc5 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sun, 9 Apr 2023 21:51:06 +0800 Subject: [PATCH 01/23] add config and format code --- .eslintrc.js | 99 +- .github/workflows/codeql-analysis.yml | 58 +- .github/workflows/nodejs-windows.yml | 1 - .github/workflows/nodejs.yml | 50 +- .husky/pre-commit | 4 + .prettierignore | 2 + examples/bucket-exists.js | 17 +- examples/compose-object-test-example.js | 103 +- examples/compose-object.js | 63 +- examples/copy-object.js | 37 +- examples/fget-object.js | 30 +- examples/fput-object.js | 28 +- examples/get-bucket-encryption.js | 13 +- examples/get-bucket-lifecycle.js | 13 +- examples/get-bucket-notification.js | 16 +- examples/get-bucket-policy.js | 14 +- examples/get-bucket-replication.js | 10 +- examples/get-bucket-tagging.js | 14 +- examples/get-bucket-versioning.js | 13 +- examples/get-object-legal-hold.js | 30 +- examples/get-object-lock-config.js | 13 +- examples/get-object-retention.js | 30 +- examples/get-object-tagging.js | 20 +- examples/get-object.html | 16 +- examples/get-object.js | 47 +- examples/get-partialobject.js | 27 +- examples/list-buckets.js | 12 +- examples/list-incomplete-uploads.js | 18 +- examples/list-objects-v2-with-metadata.js | 28 +- examples/list-objects-v2.js | 18 +- examples/list-objects.js | 37 +- examples/make-bucket.js | 16 +- examples/minio/listen-bucket-notification.js | 25 +- examples/presigned-getobject-request-date.js | 33 +- examples/presigned-getobject.js | 16 +- examples/presigned-postpolicy.js | 30 +- examples/presigned-putobject.js | 16 +- examples/put-object-retention.js | 34 +- examples/put-object.js | 28 +- examples/remove-all-bucket-notification.js | 16 +- examples/remove-bucket-encryption.js | 13 +- examples/remove-bucket-lifecycle.js | 12 +- examples/remove-bucket-replication.js | 10 +- examples/remove-bucket-tagging.js | 13 +- examples/remove-bucket.js | 14 +- examples/remove-incomplete-upload.js | 15 +- examples/remove-object-tagging.js | 15 +- examples/remove-object.js | 32 +- examples/remove-objects.js | 39 +- examples/reset-object-lock-config.js | 10 +- examples/select-object-content.js | 26 +- examples/set-accelerate-end-point.js | 14 +- examples/set-bucket-encryption.js | 42 +- examples/set-bucket-lifecycle.js | 62 +- examples/set-bucket-notification.js | 22 +- examples/set-bucket-policy.js | 14 +- examples/set-bucket-replication.js | 43 +- examples/set-bucket-tagging.js | 15 +- examples/set-bucket-versioning.js | 15 +- examples/set-object-legal-hold.js | 29 +- examples/set-object-lock-config.js | 12 +- examples/set-object-tagging.js | 17 +- examples/stat-object.js | 13 +- gulpfile.js | 105 +- package-lock.json | 17782 +++++++++++------ package.json | 47 +- src/main/AssumeRoleProvider.js | 62 +- src/main/CredentialProvider.js | 13 +- src/main/Credentials.js | 38 +- src/main/errors.js | 2 +- src/main/extensions.js | 44 +- src/main/helpers.js | 481 +- src/main/minio.js | 2336 +-- src/main/notification.js | 67 +- src/main/object-uploader.js | 106 +- src/main/s3-endpoints.js | 34 +- src/main/signing.js | 112 +- src/main/transformers.js | 164 +- src/main/xml-parsers.js | 412 +- src/test/functional/functional-tests.js | 5268 ++--- src/test/unit/test.js | 1309 +- 81 files changed, 17617 insertions(+), 12357 deletions(-) create mode 100644 .husky/pre-commit create mode 100644 .prettierignore diff --git a/.eslintrc.js b/.eslintrc.js index 40e7e7db..bfd7f589 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,41 +1,70 @@ module.exports = { - 'env': { - 'node': true, - 'mocha': true, - 'es6': true + env: { + node: true, + mocha: true, + es6: true, }, - 'extends': 'eslint:recommended', - 'parserOptions': { - 'sourceType': 'module', - "ecmaVersion": 8 + ignorePatterns: ["src/test/*.*"], + overrides: [], + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "prettier", // This should be the last entry. + ], + parser: "@typescript-eslint/parser", + plugins: ["@typescript-eslint", "simple-import-sort", "import"], + parserOptions: { + sourceType: "module", + ecmaVersion: 8, }, - 'rules': { - 'indent': [ - 'error', - 2, + rules: { + "no-console": ["error"], + // "no-var": ["error"], + "comma-dangle": 0, + "prefer-const": 0, + // "quotes": ["error", "double"], + "comma-spacing": 0, // ["error", { before: false, after: true }], + "semi-spacing": 0, // ["warn", { before: false, after: true }], + "space-before-blocks": 0, // ["warn", "always"], + "switch-colon-spacing": ["warn", { after: true, before: false }], + "keyword-spacing": 0, // ["warn", { before: true, after: true }], + "template-curly-spacing": 0, // ["error", "never"], + "rest-spread-spacing": 0, // ["error", "never"], + "no-multi-spaces": 0, // ["warn", { ignoreEOLComments: false }], + + "simple-import-sort/imports": "error", + "simple-import-sort/exports": "error", + "import/extensions": ["error", "never"], + indent: "off", + "linebreak-style": ["error", "unix"], + semi: ["error", "never"], + "spaced-comment": [ + "error", + "always", { - 'FunctionDeclaration': { 'parameters': 'first' }, - 'FunctionExpression': { 'parameters': 'first' }, - 'CallExpression': { 'arguments': 'first' }, - 'ArrayExpression': 'first', - 'ObjectExpression': 'first' - } + line: { + markers: ["/"], + exceptions: ["-", "+"], + }, + block: { + markers: ["!"], + exceptions: ["*"], + balanced: true, + }, + }, ], - 'linebreak-style': [ - 'error', - (process.platform === 'win32' ? 'windows' : 'unix') // all windows platforms are denoted by win32 - ], - 'semi': ['error', 'never'], - 'spaced-comment': ['error', 'always', { - 'line': { - 'markers': ['/'], - 'exceptions': ['-', '+'] - }, - 'block': { - 'markers': ['!'], - 'exceptions': ['*'], - 'balanced': true - } - }] - } + "@typescript-eslint/no-explicit-any": ["warn"], + + "@typescript-eslint/prefer-optional-chain": 0, // ["warn"], + "no-empty-function": 0, + "@typescript-eslint/no-empty-function": 0, // ["warn"], + "@typescript-eslint/no-var-requires": 0, + "@typescript-eslint/no-this-alias": 0, + "@typescript-eslint/no-empty-interface": ["warn"], + + "@typescript-eslint/no-array-constructor": ["off"], + + "no-extra-parens": 0, + "@typescript-eslint/no-extra-parens": 0, + }, } diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6dfb4844..94aa3d45 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,12 +13,12 @@ name: "CodeQL" on: push: - branches: [ master, release ] + branches: [master, release] pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: [master] schedule: - - cron: '37 2 * * 4' + - cron: "37 2 * * 4" jobs: analyze: @@ -32,39 +32,39 @@ jobs: strategy: fail-fast: false matrix: - language: [ 'javascript' ] + language: ["javascript"] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.github/workflows/nodejs-windows.yml b/.github/workflows/nodejs-windows.yml index 043d1ae2..6c56d2bb 100644 --- a/.github/workflows/nodejs-windows.yml +++ b/.github/workflows/nodejs-windows.yml @@ -39,4 +39,3 @@ jobs: npm run lint npm run browserify npm run test - diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 0c6fba2f..1e9c288f 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -1,28 +1,60 @@ name: CI - Linux on: + push: pull_request: branches: - master jobs: + style: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "npm" + + - run: npm ci + + - run: npm run format-check + - run: npm run lint + build: + name: Build on node lts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: "18.x" + cache: "npm" + + - run: npm ci + + - run: npm run build + + - run: npm run browserify + + test: name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: - max-parallel: 1 + max-parallel: 3 matrix: node_version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] os: [ubuntu-latest] steps: - - uses: actions/checkout@v1 - with: - fetch-depth: 0 - ref: '' + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node_version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node_version }} - - name: Start Server -> Run Unit and Functional Tests ( install, lint, browserify, test) + cache: "npm" + + - run: npm i + + - name: Start Server -> Run Unit and Functional Tests (test) env: CI: true MINIO_CI_CD: true @@ -38,8 +70,4 @@ jobs: wget --quiet -O /tmp/minio https://dl.min.io/server/minio/release/linux-amd64/minio chmod +x /tmp/minio /tmp/minio -C /tmp/minio-config server /tmp/data{1...4} & - npm install - npm run lint - npm run browserify npm run test - diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100644 index 00000000..57757f4e --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npm run lint-staged diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..5d446a24 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,2 @@ +/dist/ +*.md diff --git a/examples/bucket-exists.js b/examples/bucket-exists.js index e9f8c39d..7fcef5b8 100644 --- a/examples/bucket-exists.js +++ b/examples/bucket-exists.js @@ -14,23 +14,22 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. - -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) -s3Client.bucketExists('my-bucketname', function(err, exists) { +s3Client.bucketExists("my-bucketname", function (err, exists) { if (err) { return console.log(err) } if (exists) { - console.log("Bucket exists.") + console.log("Bucket exists.") } }) diff --git a/examples/compose-object-test-example.js b/examples/compose-object-test-example.js index cc439b6f..9c047d78 100644 --- a/examples/compose-object-test-example.js +++ b/examples/compose-object-test-example.js @@ -16,38 +16,35 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. -const os = require('os') +const os = require("os") const splitFile = require("split-file") -const fs = require('fs') +const fs = require("fs") var Minio = require("../dist/main/minio") var Helpers = require("../dist/main/helpers") - var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) const oneMB = 1024 * 1024 - // Create a bucket prior to running: mc mb local/source-bucket function sampleRunComposeObject() { var tmpDir = os.tmpdir() - const bucketName = "source-bucket" // generate 100 MB buffer and write to a file. var local100mbFileToBeSplitAndComposed = Buffer.alloc(100 * oneMB, 0) - const composedObjName = '_100-mb-file-to-test-compose' + const composedObjName = "_100-mb-file-to-test-compose" const tmpSubDir = `${tmpDir}/compose` var fileToSplit = `${tmpSubDir}/${composedObjName}` let partObjNameList = [] - fs.mkdir(tmpSubDir, { recursive: true }, function(err) { + fs.mkdir(tmpSubDir, { recursive: true }, function (err) { if (err) { console.log(err) } else { @@ -55,13 +52,13 @@ function sampleRunComposeObject() { } }) - try { fs.writeFileSync(fileToSplit, local100mbFileToBeSplitAndComposed) console.log("Written 100 MB File ") // 100 MB split into 26 MB part size. ( just to test unequal parts ). But change as required. - splitFile.splitFileBySize(fileToSplit, (26 * oneMB)) + splitFile + .splitFileBySize(fileToSplit, 26 * oneMB) .then((names) => { console.log("Split and write 100 MB File(s) ", names) const putPartRequests = names.map((partFileName) => { @@ -70,60 +67,62 @@ function sampleRunComposeObject() { return s3Client.fPutObject(bucketName, partObjName, partFileName, {}) }) - Promise.all(putPartRequests).then(() => { - console.log("Uploaded part Files: ", names) - const sourcePartObjList = partObjNameList.map((partObjName) => { - return new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: partObjName + Promise.all(putPartRequests) + .then(() => { + console.log("Uploaded part Files: ", names) + const sourcePartObjList = partObjNameList.map((partObjName) => { + return new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: partObjName, + }) }) - }) - const destObjConfig = new Helpers.CopyDestinationOptions({ - Bucket: bucketName, - Object: composedObjName - }) + const destObjConfig = new Helpers.CopyDestinationOptions({ + Bucket: bucketName, + Object: composedObjName, + }) - s3Client.composeObject(destObjConfig, sourcePartObjList).then(() => { - console.log("Composed to a single file: ", composedObjName) + s3Client + .composeObject(destObjConfig, sourcePartObjList) + .then(() => { + console.log("Composed to a single file: ", composedObjName) - /** Begin Clean up ***/ - // To verify that the parts are uploaded properly, comment the below code blocks and verify - const sourcePartObjList = partObjNameList.map((partObjName) => { - return s3Client.removeObject(bucketName, partObjName) - }) + /** Begin Clean up ***/ + // To verify that the parts are uploaded properly, comment the below code blocks and verify + const sourcePartObjList = partObjNameList.map((partObjName) => { + return s3Client.removeObject(bucketName, partObjName) + }) - Promise.all(sourcePartObjList).then(() => { - console.log("Removed source parts: ") + Promise.all(sourcePartObjList) + .then(() => { + console.log("Removed source parts: ") - // Uncomment to remove the composed object itself. commented for verification. - /* + // Uncomment to remove the composed object itself. commented for verification. + /* s3Client.removeObject(bucketName, composedObjName).then(()=>{ console.log("Clean up: Removed the composed Object ") }).catch(()=>{ console.log("Error removing composed object", er) }) */ + }) + .catch((er) => { + console.log("Error removing parts used in composing", er) + }) - }).catch(er => { - console.log("Error removing parts used in composing", er) - }) - - /** End Clean up **/ - - // Clean up generated parts locally - Helpers.removeDirAndFiles(tmpSubDir) - console.log("Clean up temp parts directory : ") + /** End Clean up **/ - }).catch((e) => { - console.log("Error Composing parts into an object", e) + // Clean up generated parts locally + Helpers.removeDirAndFiles(tmpSubDir) + console.log("Clean up temp parts directory : ") + }) + .catch((e) => { + console.log("Error Composing parts into an object", e) + }) + }) + .catch((e) => { + console.log("Error Uploading parts ", e) }) - - }).catch(e => { - console.log("Error Uploading parts ", e) - }) - - }) .catch((e) => { // this is a client error not related to compose object @@ -133,8 +132,6 @@ function sampleRunComposeObject() { // this is a client error not related to compose object console.log("Error Creating local files ", err) } - - } sampleRunComposeObject() diff --git a/examples/compose-object.js b/examples/compose-object.js index 0704df73..3b70e9d7 100644 --- a/examples/compose-object.js +++ b/examples/compose-object.js @@ -20,36 +20,39 @@ var Minio = require("../dist/main/minio") var Helpers = require("../dist/main/helpers") - var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) const bucketName = "source-bucket" -const sourceList = [new Helpers.CopySourceOptions( { - Bucket: bucketName, - Object: "parta", - // other options if any. -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partb", - // other options if any. - // VersionID:"" -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partc", - -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partd", -})] +const sourceList = [ + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: "parta", + // other options if any. + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: "partb", + // other options if any. + // VersionID:"" + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: "partc", + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: "partd", + }), +] const destOption = new Helpers.CopyDestinationOptions({ - Bucket: bucketName, - Object: "100MB.zip", + Bucket: bucketName, + Object: "100MB.zip", /** Other possible options */ /* Encryption:{ type:Helpers.ENCRYPTION_TYPES.KMS, @@ -65,11 +68,11 @@ const destOption = new Helpers.CopyDestinationOptions({ */ }) - -const composePromise = s3Client.composeObject(destOption,sourceList) -composePromise.then((result) => { - console.log("ComposeObject Success..." , result) -}) - .catch((e)=>{ - console.log("composeObject Promise Error",e) +const composePromise = s3Client.composeObject(destOption, sourceList) +composePromise + .then((result) => { + console.log("ComposeObject Success...", result) + }) + .catch((e) => { + console.log("composeObject Promise Error", e) }) diff --git a/examples/copy-object.js b/examples/copy-object.js index 4972d5e1..e5c1f902 100644 --- a/examples/copy-object.js +++ b/examples/copy-object.js @@ -14,26 +14,31 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname, my-objectname, - // my-src-bucketname and my-src-objectname are dummy values, please replace - // them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname, my-objectname, +// my-src-bucketname and my-src-objectname are dummy values, please replace +// them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' -}) + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", +}) var conds = new Minio.CopyConditions() -conds.setMatchETag('bd891862ea3e22c93ed53a098218791d') +conds.setMatchETag("bd891862ea3e22c93ed53a098218791d") -s3Client.copyObject('my-bucketname', 'my-objectname', '/my-src-bucketname/my-src-objectname', conds, function(e, data) { - if (e) { - return console.log(e) +s3Client.copyObject( + "my-bucketname", + "my-objectname", + "/my-src-bucketname/my-src-objectname", + conds, + function (e, data) { + if (e) { + return console.log(e) + } + console.log("Successfully copied the object:") + console.log("etag = " + data.etag + ", lastModified = " + data.lastModified) } - console.log("Successfully copied the object:") - console.log("etag = " + data.etag + ", lastModified = " + data.lastModified) -}) - +) diff --git a/examples/fget-object.js b/examples/fget-object.js index 77e71b36..ebde2dac 100644 --- a/examples/fget-object.js +++ b/examples/fget-object.js @@ -17,26 +17,32 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) // Get a full object. -s3Client.fGetObject('my-bucketname', 'my-objectname', '/tmp/objfile', function(e) { +s3Client.fGetObject("my-bucketname", "my-objectname", "/tmp/objfile", function (e) { if (e) { return console.log(e) } - console.log('done') + console.log("done") }) -//To get a specific version of an object -s3Client.fGetObject('my-bucketname', 'my-objectname', '/tmp/objfile', {versionId:"03fd1247-90d9-4b71-a27e-209d484a234b"}, function(e) { - if (e) { - return console.log(e) +//To get a specific version of an object +s3Client.fGetObject( + "my-bucketname", + "my-objectname", + "/tmp/objfile", + { versionId: "03fd1247-90d9-4b71-a27e-209d484a234b" }, + function (e) { + if (e) { + return console.log(e) + } + console.log("success") } - console.log('success') -}) +) diff --git a/examples/fput-object.js b/examples/fput-object.js index a4f50597..1d20dcb6 100644 --- a/examples/fput-object.js +++ b/examples/fput-object.js @@ -14,27 +14,27 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname - // and my-objectname are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname +// and my-objectname are dummy values, please replace them with original values. -var Minio = require('minio') -var Fs = require('fs') +var Minio = require("minio") +var Fs = require("fs") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) var metaData = { - 'Content-Type': 'application/octet-stream', - 'X-Amz-Meta-Testing': 1234, - 'example': 5678 + "Content-Type": "application/octet-stream", + "X-Amz-Meta-Testing": 1234, + example: 5678, } // Put a file in bucket my-bucketname. -var file = 'my-testfile' -s3Client.fPutObject('my-bucketname', 'my-objectname', file, metaData, function(e) { +var file = "my-testfile" +s3Client.fPutObject("my-bucketname", "my-objectname", file, metaData, function (e) { if (e) { return console.log(e) } @@ -43,8 +43,8 @@ s3Client.fPutObject('my-bucketname', 'my-objectname', file, metaData, function(e // Put a file in bucket my-bucketname with content-type detected automatically. // In this case it is `text/plain`. -var file = 'my-testfile.txt' -s3Client.fPutObject('my-bucketname', 'my-objectname', file, function(e) { +var file = "my-testfile.txt" +s3Client.fPutObject("my-bucketname", "my-objectname", file, function (e) { if (e) { return console.log(e) } diff --git a/examples/get-bucket-encryption.js b/examples/get-bucket-encryption.js index d3db82c7..fde994fd 100644 --- a/examples/get-bucket-encryption.js +++ b/examples/get-bucket-encryption.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -18,17 +17,17 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) -s3Client.getBucketEncryption("my-bucket", function (error, enConfig){ +s3Client.getBucketEncryption("my-bucket", function (error, enConfig) { if (error) { return console.log(error) } console.log(enConfig) -}) \ No newline at end of file +}) diff --git a/examples/get-bucket-lifecycle.js b/examples/get-bucket-lifecycle.js index 6dd16413..e252525a 100644 --- a/examples/get-bucket-lifecycle.js +++ b/examples/get-bucket-lifecycle.js @@ -17,19 +17,18 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) - -s3Client.getBucketLifecycle('my-bucketname', function (err,res){ +s3Client.getBucketLifecycle("my-bucketname", function (err, res) { if (err) { return console.log(err) } console.log(res) console.log("Success") -}) \ No newline at end of file +}) diff --git a/examples/get-bucket-notification.js b/examples/get-bucket-notification.js index dc36001d..8b142204 100644 --- a/examples/get-bucket-notification.js +++ b/examples/get-bucket-notification.js @@ -14,23 +14,21 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. - -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) -s3Client.getBucketNotification('my-bucketname', function(e, bucketNotification) { +s3Client.getBucketNotification("my-bucketname", function (e, bucketNotification) { if (e) { return console.log(e) } console.log(bucketNotification) console.log("True") }) - diff --git a/examples/get-bucket-policy.js b/examples/get-bucket-policy.js index 6e2a8027..c8b36101 100644 --- a/examples/get-bucket-policy.js +++ b/examples/get-bucket-policy.js @@ -17,17 +17,17 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // are dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) // Retrieves the bucket policy and logs it to the console. -s3Client.getBucketPolicy('testbucket', (err, policy) => { - if (err) throw err +s3Client.getBucketPolicy("testbucket", (err, policy) => { + if (err) throw err - console.log(`Bucket policy: ${policy}`) + console.log(`Bucket policy: ${policy}`) }) diff --git a/examples/get-bucket-replication.js b/examples/get-bucket-replication.js index 3e37a595..c6c634c9 100644 --- a/examples/get-bucket-replication.js +++ b/examples/get-bucket-replication.js @@ -17,15 +17,15 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) -s3Client.getBucketReplication('bucketname', function (err, replicationConfig){ +s3Client.getBucketReplication("bucketname", function (err, replicationConfig) { if (err) { return console.log(err) } diff --git a/examples/get-bucket-tagging.js b/examples/get-bucket-tagging.js index bb03e273..2d94f71a 100644 --- a/examples/get-bucket-tagging.js +++ b/examples/get-bucket-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -18,18 +17,17 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) - -s3Client.getBucketTagging('bucketname', function (err, tagsList){ +s3Client.getBucketTagging("bucketname", function (err, tagsList) { if (err) { return console.log(err) } console.log("Success", tagsList) -}) \ No newline at end of file +}) diff --git a/examples/get-bucket-versioning.js b/examples/get-bucket-versioning.js index 41240ede..3f27569f 100644 --- a/examples/get-bucket-versioning.js +++ b/examples/get-bucket-versioning.js @@ -17,19 +17,18 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) - -s3Client.getBucketVersioning('my-bucketname', function (err,res){ +s3Client.getBucketVersioning("my-bucketname", function (err, res) { if (err) { return console.log(err) } console.log(res) console.log("Success") -}) \ No newline at end of file +}) diff --git a/examples/get-object-legal-hold.js b/examples/get-object-legal-hold.js index 1e42a14b..8aa3aa94 100644 --- a/examples/get-object-legal-hold.js +++ b/examples/get-object-legal-hold.js @@ -17,38 +17,40 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) //Get Legalhold config -s3Client.getObjectLegalHold('bucketName', 'objectName', {}, function(err, res) { +s3Client.getObjectLegalHold("bucketName", "objectName", {}, function (err, res) { if (err) { - return console.log('Unable to get legal hold config for the object', err.message) // Print only the message. + return console.log("Unable to get legal hold config for the object", err.message) // Print only the message. } console.log(res) }) //With versionId -s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId:'my-obj-version-uuid' }, function(err, res) { +s3Client.getObjectLegalHold("bucketName", "objectName", { versionId: "my-obj-version-uuid" }, function (err, res) { if (err) { - return console.log('Unable to get legal hold config for the object', err.message) // Print only the message. + return console.log("Unable to get legal hold config for the object", err.message) // Print only the message. } console.log(res) }) //Promise based version: -const objectLegalHoldPromise = s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId:'my-obj-version-uuid' }) -objectLegalHoldPromise.then((data) => { - console.log("Success...", data) +const objectLegalHoldPromise = s3Client.getObjectLegalHold("bucketName", "objectName", { + versionId: "my-obj-version-uuid", }) - .catch((e)=>{ +objectLegalHoldPromise + .then((data) => { + console.log("Success...", data) + }) + .catch((e) => { // Print only the error message. if called on an object without object lock config. // e.g: "The specified object does not have a ObjectLock configuration" - console.log(e.message) - + console.log(e.message) }) diff --git a/examples/get-object-lock-config.js b/examples/get-object-lock-config.js index 7c18cd26..c3adf092 100644 --- a/examples/get-object-lock-config.js +++ b/examples/get-object-lock-config.js @@ -17,18 +17,17 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) - -s3Client.getObjectLockConfig('my-bucketname', function (err,lockConfig){ +s3Client.getObjectLockConfig("my-bucketname", function (err, lockConfig) { if (err) { return console.log(err) } console.log(lockConfig) -}) \ No newline at end of file +}) diff --git a/examples/get-object-retention.js b/examples/get-object-retention.js index dc9909b3..84355c6d 100644 --- a/examples/get-object-retention.js +++ b/examples/get-object-retention.js @@ -17,24 +17,24 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) +const bucketName = "my-bucket" +const objectName = "my-object" -const bucketName = 'my-bucket' -const objectName ="my-object" +const versionId = "my-versionId" -const versionId ="my-versionId" - -const objRetPromise = s3Client.getObjectRetention(bucketName, objectName, {versionId:versionId} ) -objRetPromise.then((data) => { - console.log("Success", data) -}) - .catch((e)=>{ - console.log(" Error",e) - }) \ No newline at end of file +const objRetPromise = s3Client.getObjectRetention(bucketName, objectName, { versionId: versionId }) +objRetPromise + .then((data) => { + console.log("Success", data) + }) + .catch((e) => { + console.log(" Error", e) + }) diff --git a/examples/get-object-tagging.js b/examples/get-object-tagging.js index bc52ce74..59f62b02 100644 --- a/examples/get-object-tagging.js +++ b/examples/get-object-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -18,27 +17,26 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are // dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require("minio") var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: "s3.amazonaws.com", + accessKey: "YOUR-ACCESSKEYID", + secretKey: "YOUR-SECRETACCESSKEY", }) - -s3Client.getObjectTagging('bucketname', "objectName", function (err, tagsList){ +s3Client.getObjectTagging("bucketname", "objectName", function (err, tagsList) { if (err) { return console.log(err) } - console.log("Success",tagsList) + console.log("Success", tagsList) }) //Get tags on a version of an object. -s3Client.getObjectTagging('bucketname', "objectName", { versionId: "" }, function (err, tagsList){ +s3Client.getObjectTagging("bucketname", "objectName", { versionId: "" }, function (err, tagsList) { if (err) { return console.log(err) } - console.log("Success",tagsList) -}) \ No newline at end of file + console.log("Success", tagsList) +}) diff --git a/examples/get-object.html b/examples/get-object.html index 9740a7c6..a198eab2 100644 --- a/examples/get-object.html +++ b/examples/get-object.html @@ -1,27 +1,27 @@ - + @@ -6,22 +6,22 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) var size = 0 // Get a full object. - s3Client.getObject('my-bucketname', 'my-objectname', function (e, dataStream) { + s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function (chunk) { + dataStream.on('data', function(chunk) { size += chunk.length }) - dataStream.on('end', function () { - console.log('End. Total size = ' + size) + dataStream.on('end', function() { + console.log("End. Total size = " + size) }) - dataStream.on('error', function (e) { + dataStream.on('error', function(e) { console.log(e) }) }) diff --git a/examples/get-object.js b/examples/get-object.js index aba5a2f6..7945148f 100644 --- a/examples/get-object.js +++ b/examples/get-object.js @@ -22,44 +22,39 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) var size = 0 // Get a full object. -s3Client.getObject('my-bucketname', 'my-objectname', function (e, dataStream) { +s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function (chunk) { + dataStream.on('data', function(chunk) { size += chunk.length }) - dataStream.on('end', function () { - console.log('End. Total size = ' + size) + dataStream.on('end', function() { + console.log("End. Total size = " + size) }) - dataStream.on('error', function (e) { + dataStream.on('error', function(e) { console.log(e) }) }) //Get a specific version of an object var versionedObjSize = 0 -s3Client.getObject( - 'my-versioned-bucket', - 'my-versioned-object', - { versionId: 'my-versionId' }, - function (err, dataStream) { - if (err) { - return console.log(err) - } - dataStream.on('data', function (chunk) { - versionedObjSize += chunk.length - }) - dataStream.on('end', function () { - console.log('End. Total size = ' + versionedObjSize) - }) - dataStream.on('error', function (err) { - console.log(err) - }) +s3Client.getObject('my-versioned-bucket', 'my-versioned-object', {versionId:"my-versionId"}, function(err, dataStream) { + if (err) { + return console.log(err) } -) + dataStream.on('data', function(chunk) { + versionedObjSize += chunk.length + }) + dataStream.on('end', function() { + console.log('End. Total size = ' + versionedObjSize) + }) + dataStream.on('error', function(err) { + console.log(err) + }) +}) diff --git a/examples/get-partialobject.js b/examples/get-partialobject.js index b06ea314..8b7d46ab 100644 --- a/examples/get-partialobject.js +++ b/examples/get-partialobject.js @@ -17,44 +17,45 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. + var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Download the object my-objectname at an offset 1024, for a total of 4096 bytes. var size = 0 -s3Client.getPartialObject('my-bucketname', 'my-objectname', 1024, 4096, function (e, dataStream) { +s3Client.getPartialObject('my-bucketname', 'my-objectname', 1024, 4096, function(e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function (chunk) { + dataStream.on('data', function(chunk) { size += chunk.length }) - dataStream.on('end', function () { - console.log('End. Total size = ' + size) + dataStream.on('end', function() { + console.log("End. Total size = " + size) }) - dataStream.on('error', function (e) { + dataStream.on('error', function(e) { console.log(e) }) }) var versionedObjSize = 0 // reads 30 bytes from the offset 10. -s3Client.getPartialObject('mybucket', 'photo.jpg', 10, 30, { versionId: 'my-versionId' }, function (err, dataStream) { +s3Client.getPartialObject('mybucket', 'photo.jpg', 10, 30, {versionId:"my-versionId"},function(err, dataStream) { if (err) { return console.log(err) } - dataStream.on('data', function (chunk) { + dataStream.on('data', function(chunk) { versionedObjSize += chunk.length }) - dataStream.on('end', function () { + dataStream.on('end', function() { console.log('End. Total size = ' + versionedObjSize) }) - dataStream.on('error', function (err) { + dataStream.on('error', function(err) { console.log(err) }) }) diff --git a/examples/list-buckets.js b/examples/list-buckets.js index bf57ee01..1d2b80c1 100644 --- a/examples/list-buckets.js +++ b/examples/list-buckets.js @@ -22,10 +22,10 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.listBuckets(function (e, buckets) { +s3Client.listBuckets(function(e, buckets) { if (e) return console.log(e) console.log('buckets :', buckets) }) diff --git a/examples/list-incomplete-uploads.js b/examples/list-incomplete-uploads.js index 6b4763e4..f90e7a92 100644 --- a/examples/list-incomplete-uploads.js +++ b/examples/list-incomplete-uploads.js @@ -14,22 +14,22 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-prefixname -// are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-prefixname + // are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + endPoint: 's3.amazonaws.com', + accessKey: 'YOUR-ACCESSKEYID', + secretKey: 'YOUR-SECRETACCESSKEY' }) // List all object paths in bucket my-bucketname that begins with my-prefixname. var incompleteObjectsStream = s3Client.listIncompleteUploads('my-bucketname', 'my-prefixname', true) -incompleteObjectsStream.on('data', function (obj) { +incompleteObjectsStream.on('data', function(obj) { console.log(obj) }) -incompleteObjectsStream.on('error', function (e) { +incompleteObjectsStream.on('error', function(e) { console.log(e) }) diff --git a/examples/list-objects-v2-with-metadata.js b/examples/list-objects-v2-with-metadata.js index 6b8733cb..b208dfa0 100644 --- a/examples/list-objects-v2-with-metadata.js +++ b/examples/list-objects-v2-with-metadata.js @@ -14,21 +14,23 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are -// dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are + // dummy values, please replace them with original values. + + var Minio = require('minio') -var Minio = require('minio') - -var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', -}) -// List all object paths in bucket my-bucketname. -var objectsStream = s3Client.extensions.listObjectsV2WithMetadata('my-bucketname', '', true, '') -objectsStream.on('data', function (obj) { + var s3Client = new Minio.Client({ + endPoint: 's3.amazonaws.com', + accessKey: 'YOUR-ACCESSKEYID', + secretKey: 'YOUR-SECRETACCESSKEY' + }) + // List all object paths in bucket my-bucketname. + var objectsStream = s3Client.extensions.listObjectsV2WithMetadata('my-bucketname', '', true,''); + objectsStream.on('data', function(obj) { console.log(obj) }) -objectsStream.on('error', function (e) { +objectsStream.on('error', function(e) { console.log(e) }) + + diff --git a/examples/list-objects-v2.js b/examples/list-objects-v2.js index 4e368e04..a7347b78 100644 --- a/examples/list-objects-v2.js +++ b/examples/list-objects-v2.js @@ -14,21 +14,21 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are -// dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are + // dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // List all object paths in bucket my-bucketname. -var objectsStream = s3Client.listObjectsV2('my-bucketname', '', true, '') -objectsStream.on('data', function (obj) { +var objectsStream = s3Client.listObjectsV2('my-bucketname', '', true,'') +objectsStream.on('data', function(obj) { console.log(obj) }) -objectsStream.on('error', function (e) { +objectsStream.on('error', function(e) { console.log(e) }) diff --git a/examples/list-objects.js b/examples/list-objects.js index 3d9cac6a..57c17e1b 100644 --- a/examples/list-objects.js +++ b/examples/list-objects.js @@ -22,42 +22,45 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // List all object paths in bucket my-bucketname. var objectsStream = s3Client.listObjects('my-bucketname', '', true) -objectsStream.on('data', function (obj) { +objectsStream.on('data', function(obj) { console.log(obj) }) -objectsStream.on('error', function (e) { +objectsStream.on('error', function(e) { console.log(e) }) + // List all object versions in bucket my-bucketname. -var objectsStreamWithVersions = s3Client.listObjects('my-bucketname', '', true, { IncludeVersion: true }) -objectsStreamWithVersions.on('data', function (obj) { +var objectsStreamWithVersions = s3Client.listObjects('my-bucketname', '', true, {IncludeVersion:true}) +objectsStreamWithVersions.on('data', function(obj) { console.log(obj) }) -objectsStreamWithVersions.on('error', function (e) { +objectsStreamWithVersions.on('error', function(e) { console.log(e) }) + // Example to list only the prefixes of a bucket. //Non versioned bucket with Prefix listing. function listPrefixesOfABucket(buckName) { - var objectsStream = s3Client.listObjects(buckName, '', false, {}) + var objectsStream=s3Client.listObjects(buckName, '', false , {}) var counter = 0 objectsStream.on('data', function (obj) { - if (obj.prefix) { + if(obj.prefix) { counter += 1 } }) - objectsStream.on('end', () => { - console.log('Non Versioned Prefix Count:', counter) + objectsStream.on('end',()=>{ + console.log("Non Versioned Prefix Count:", counter) }) objectsStream.on('error', function (e) { - console.log('::Error:', e) + console.log("::Error:",e) }) + } -listPrefixesOfABucket('your-bucket') +listPrefixesOfABucket('your-bucket') \ No newline at end of file diff --git a/examples/make-bucket.js b/examples/make-bucket.js index c91a6114..a610b250 100644 --- a/examples/make-bucket.js +++ b/examples/make-bucket.js @@ -22,18 +22,18 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Create a bucket name my-bucketname. -s3Client.makeBucket('my-bucketname', 'us-west-1', function (e) { +s3Client.makeBucket('my-bucketname', 'us-west-1', function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) // Create a bucket with object locking enabled. -s3Client.makeBucket('mybucket', 'us-east-1', { ObjectLocking: true }, function (err) { +s3Client.makeBucket('mybucket', 'us-east-1', { ObjectLocking:true }, function(err) { if (err) return console.log('Error creating bucket with lock .', err) console.log('Bucket created successfully in "us-east-1" and enabled object lock') -}) +}) \ No newline at end of file diff --git a/examples/minio/listen-bucket-notification.js b/examples/minio/listen-bucket-notification.js index df53bdbf..7d09bba8 100644 --- a/examples/minio/listen-bucket-notification.js +++ b/examples/minio/listen-bucket-notification.js @@ -22,7 +22,7 @@ const Minio = require('../') var s3Client = new Minio.Client({ endPoint: '...', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Start listening for notifications on the bucket, using our arn. @@ -46,15 +46,16 @@ let poller = s3Client.listenBucketNotification('bucket1', 'photos/', '.jpg', ['s // ownerIdentity: [Object], // arn: 'arn:aws:s3:::bucket1' }, // object: { key: 'photos%2Fobject.jpg', size: 10, sequencer: '...' } } } -poller.on('notification', (record) => { - console.log('New object: %s/%s (size: %d)', record.s3.bucket.name, record.s3.object.key, record.s3.object.size) +poller.on('notification', record => { + console.log('New object: %s/%s (size: %d)', record.s3.bucket.name, + record.s3.object.key, record.s3.object.size) - // Now that we've received our notification, we can cancel the listener. - // We could leave it open if we wanted to continue to receive notifications. - poller.stop() + // Now that we've received our notification, we can cancel the listener. + // We could leave it open if we wanted to continue to receive notifications. + poller.stop() }) // Create an object - this should trigger a notification. s3Client.putObject('bucket1', 'file.jpg', 'stringdata', (err, etag) => { - if (err) throw err + if (err) throw err }) diff --git a/examples/presigned-getobject-request-date.js b/examples/presigned-getobject-request-date.js index dea7c00e..82dd818c 100644 --- a/examples/presigned-getobject-request-date.js +++ b/examples/presigned-getobject-request-date.js @@ -15,7 +15,7 @@ */ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname -// are dummy values, please replace them with original values. +// are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,28 +23,21 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true, // Default is true. + useSSL: true // Default is true. }) // Presigned get object URL for my-objectname at my-bucketname, it expires in 7 days by default. var requestDate = new Date() -requestDate.setHours(0, 0, 0, 0) +requestDate.setHours(0,0,0,0) -requestDate.setHours(0, 0, 0, 0) -s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {}, requestDate, function (e, presignedUrl) { +requestDate.setHours(0,0,0,0) +s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {}, requestDate, function(e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) // Versioning support -s3Client.presignedGetObject( - 'my-bucketname', - 'my-objectname', - 1000, - { versionId: '10fa9946-3f64-4137-a58f-888065c0732e' }, - requestDate, - function (e, presignedUrl) { - if (e) return console.log(e) - console.log(presignedUrl) - } -) +s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {versionId:"10fa9946-3f64-4137-a58f-888065c0732e"},requestDate, function(e, presignedUrl) { + if (e) return console.log(e) + console.log(presignedUrl) +}) \ No newline at end of file diff --git a/examples/presigned-getobject.js b/examples/presigned-getobject.js index e9b33841..4eca964e 100644 --- a/examples/presigned-getobject.js +++ b/examples/presigned-getobject.js @@ -14,8 +14,8 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname -// are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname + // are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,11 +23,11 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true, // Default is true. + useSSL: true // Default is true. }) // Presigned get object URL for my-objectname at my-bucketname, it expires in 7 days by default. -var presignedUrl = s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, function (e, presignedUrl) { +var presignedUrl = s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) diff --git a/examples/presigned-postpolicy.js b/examples/presigned-postpolicy.js index 21c85b67..7e56df4b 100644 --- a/examples/presigned-postpolicy.js +++ b/examples/presigned-postpolicy.js @@ -14,8 +14,8 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-objectname and my-bucketname -// are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-objectname and my-bucketname + // are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,31 +23,31 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true, // Default is true. + useSSL: true // Default is true. }) // Construct a new postPolicy. var policy = s3Client.newPostPolicy() // Set the object name my-objectname. -policy.setKey('my-objectname') +policy.setKey("my-objectname") // Set the bucket to my-bucketname. -policy.setBucket('my-bucketname') +policy.setBucket("my-bucketname") -var expires = new Date() +var expires = new Date expires.setSeconds(24 * 60 * 60 * 10) //10 days policy.setExpires(expires) -policy.setContentLengthRange(1024, 1024 * 1024) // Min upload length is 1KB Max upload size is 1MB +policy.setContentLengthRange(1024, 1024*1024) // Min upload length is 1KB Max upload size is 1MB policy.setContentType('text/plain') policy.setContentDisposition('attachment; filename=text.txt') policy.setUserMetaData({ - key: 'value', + key: 'value' }) -s3Client.presignedPostPolicy(policy, function (e, data) { +s3Client.presignedPostPolicy(policy, function(e, data) { if (e) return console.log(e) var curl = [] curl.push(`curl ${data.postURL}`) diff --git a/examples/presigned-putobject.js b/examples/presigned-putobject.js index 4b85884e..9e6a7794 100644 --- a/examples/presigned-putobject.js +++ b/examples/presigned-putobject.js @@ -14,8 +14,8 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname -// are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname + // are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,10 +23,10 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true, // Default is true. + useSSL: true // Default is true. }) -var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function (e, presignedUrl) { +var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) diff --git a/examples/put-object-retention.js b/examples/put-object-retention.js index 55f6d920..f8d47350 100644 --- a/examples/put-object-retention.js +++ b/examples/put-object-retention.js @@ -22,26 +22,22 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) + const bucketName = 'my-bucket' -const objectName = 'my-object' +const objectName ="my-object" const expirationDate = new Date() expirationDate.setDate(expirationDate.getDate() + 1) -expirationDate.setUTCHours(0, 0, 0, 0) //Should be start of the day.(midnight) -const versionId = 'my-versionId' +expirationDate.setUTCHours(0,0,0,0)//Should be start of the day.(midnight) +const versionId ="my-versionId" -const objRetPromise = s3Client.putObjectRetention(bucketName, objectName, { - mode: 'GOVERNANCE', - retainUntilDate: expirationDate.toISOString(), - versionId: versionId, +const objRetPromise = s3Client.putObjectRetention(bucketName, objectName, { mode:"GOVERNANCE", retainUntilDate:expirationDate.toISOString(), versionId:versionId} ) +objRetPromise.then(() => { + console.log("Success") }) -objRetPromise - .then(() => { - console.log('Success') - }) - .catch((e) => { - console.log(' Error', e) - }) + .catch((e)=>{ + console.log(" Error",e) + }) \ No newline at end of file diff --git a/examples/put-object.js b/examples/put-object.js index fb19a4f6..bfbc516b 100644 --- a/examples/put-object.js +++ b/examples/put-object.js @@ -14,8 +14,8 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname -// and my-objectname are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname + // and my-objectname are dummy values, please replace them with original values. var Minio = require('minio') var Fs = require('fs') @@ -23,47 +23,47 @@ var Fs = require('fs') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Upload a stream var file = 'my-testfile.ogg' var fileStream = Fs.createReadStream(file) -var fileStat = Fs.stat(file, function (e, stat) { +var fileStat = Fs.stat(file, function(e, stat) { if (e) { return console.log(e) } - s3Client.putObject('my-bucketname', 'my-objectname.ogg', fileStream, stat.size, 'audio/ogg', function (e) { + s3Client.putObject('my-bucketname', 'my-objectname.ogg', fileStream, stat.size, 'audio/ogg', function(e) { if (e) { return console.log(e) } - console.log('Successfully uploaded the stream') + console.log("Successfully uploaded the stream") }) }) // Upload a buffer var buf = new Buffer(10) buf.fill('a') -s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function (e) { +s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function(e) { if (e) { return console.log(e) } - console.log('Successfully uploaded the buffer') + console.log("Successfully uploaded the buffer") }) // Upload a string -var str = 'random string to be uploaded' -s3Client.putObject('my-bucketname', 'my-objectname3', str, 'text/plain', function (e) { +var str = "random string to be uploaded" +s3Client.putObject('my-bucketname', 'my-objectname3', str, 'text/plain', function(e) { if (e) { return console.log(e) } - console.log('Successfully uploaded the string') + console.log("Successfully uploaded the string") }) // Upload a Buffer without content-type (default: 'application/octet-stream') -s3Client.putObject('my-bucketname', 'my-objectname4', buf, function (e) { +s3Client.putObject('my-bucketname', 'my-objectname4', buf, function(e) { if (e) { return console.log(e) } - console.log('Successfully uploaded the Buffer') + console.log("Successfully uploaded the Buffer") }) diff --git a/examples/remove-all-bucket-notification.js b/examples/remove-all-bucket-notification.js index c099576b..01438f8a 100644 --- a/examples/remove-all-bucket-notification.js +++ b/examples/remove-all-bucket-notification.js @@ -14,20 +14,22 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are -// dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are + // dummy values, please replace them with original values. + var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.removeAllBucketNotification('my-bucketname', function (e) { +s3Client.removeAllBucketNotification('my-bucketname', function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) + diff --git a/examples/remove-bucket-encryption.js b/examples/remove-bucket-encryption.js index 18b39efe..71902152 100644 --- a/examples/remove-bucket-encryption.js +++ b/examples/remove-bucket-encryption.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,12 +23,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.removeBucketEncryption('my-bucket', function (error) { +s3Client.removeBucketEncryption("my-bucket", function (error){ if (error) { return console.log(error) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/remove-bucket-lifecycle.js b/examples/remove-bucket-lifecycle.js index f2e0a9b1..0935496b 100644 --- a/examples/remove-bucket-lifecycle.js +++ b/examples/remove-bucket-lifecycle.js @@ -22,12 +22,14 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) + s3Client.removeBucketLifecycle('bucketname', function (err) { if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) + diff --git a/examples/remove-bucket-replication.js b/examples/remove-bucket-replication.js index bab8511e..c22baf90 100644 --- a/examples/remove-bucket-replication.js +++ b/examples/remove-bucket-replication.js @@ -22,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.removeBucketReplication('bucketname', function (err) { +s3Client.removeBucketReplication('bucketname', function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) diff --git a/examples/remove-bucket-tagging.js b/examples/remove-bucket-tagging.js index 0a0c5199..ca7a16e9 100644 --- a/examples/remove-bucket-tagging.js +++ b/examples/remove-bucket-tagging.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,12 +23,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.removeBucketTagging('bucketname', function (err) { +s3Client.removeBucketTagging('bucketname', function (err){ if (err) { return console.log(err) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/remove-bucket.js b/examples/remove-bucket.js index 2a74b422..8f3a0672 100644 --- a/examples/remove-bucket.js +++ b/examples/remove-bucket.js @@ -14,22 +14,22 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname -// are dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname + // are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Remove a bucket name my-bucketname. // This operation will only work if your bucket is empty. -s3Client.removeBucket('my-bucketname', function (e) { +s3Client.removeBucket('my-bucketname', function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) diff --git a/examples/remove-incomplete-upload.js b/examples/remove-incomplete-upload.js index 3f9787e3..df09b822 100644 --- a/examples/remove-incomplete-upload.js +++ b/examples/remove-incomplete-upload.js @@ -14,20 +14,21 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and -// my-objectname are dummy values, please replace them with original values. + + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and + // my-objectname are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Remove a partially uploaded object name my-objectname. -s3Client.removeIncompleteUpload('my-bucketname', 'my-objectname', function (e) { +s3Client.removeIncompleteUpload('my-bucketname', 'my-objectname', function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) diff --git a/examples/remove-object-tagging.js b/examples/remove-object-tagging.js index 6e8ba856..9d8cfdec 100644 --- a/examples/remove-object-tagging.js +++ b/examples/remove-object-tagging.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,20 +23,20 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -s3Client.removeObjectTagging('bucketname', 'object-name', function (err) { +s3Client.removeObjectTagging('bucketname', "object-name", function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) //remove tags on a version of an object -s3Client.removeObjectTagging('bucketname', 'object-name', { versionId: 'my-object-version-id' }, function (err) { +s3Client.removeObjectTagging('bucketname', 'object-name', { versionId: "my-object-version-id" }, function (err){ if (err) { return console.log(err) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/remove-object.js b/examples/remove-object.js index 0604567b..c868e8db 100644 --- a/examples/remove-object.js +++ b/examples/remove-object.js @@ -14,6 +14,7 @@ * limitations under the License. */ + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and // my-objectname are dummy values, please replace them with original values. @@ -22,41 +23,36 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Remove an object name my-objectname. -s3Client.removeObject('my-bucketname', 'my-objectname', function (e) { +s3Client.removeObject('my-bucketname', 'my-objectname', function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) // Remove an object with name 'my-objectname' and a versionId. -s3Client.removeObject('my-bucketname', 'my-objectname', { versionId: 'my-versionId' }, function (e) { +s3Client.removeObject('my-bucketname', 'my-objectname', {versionId:"my-versionId"}, function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) // Remove an object with name 'my-objectname' and a versionId with object renetion override with governanceBypass:true. -s3Client.removeObject( - 'my-bucketname', - 'my-objectname', - { versionId: 'my-versionId', governanceBypass: true }, - function (e) { - if (e) { - return console.log(e) - } - console.log('Success') +s3Client.removeObject('my-bucketname', 'my-objectname', {versionId:"my-versionId", governanceBypass:true}, function(e) { + if (e) { + return console.log(e) } -) + console.log("Success") +}) // force delete object/prefix -s3Client.removeObject('force-del-test', 'test/', { forceDelete: true }, function (e) { +s3Client.removeObject('force-del-test', 'test/', {forceDelete:true}, function(e) { if (e) { return console.log(e) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/remove-objects.js b/examples/remove-objects.js index 859ab48c..e45dd575 100644 --- a/examples/remove-objects.js +++ b/examples/remove-objects.js @@ -17,6 +17,7 @@ // Note: YOUR-ACCESSKEYID and YOUR-SECRETACCESSKEY are dummy values, please // replace them with original values. + var Minio = require('minio') var s3Client = new Minio.Client({ @@ -24,7 +25,7 @@ var s3Client = new Minio.Client({ port: 9000, useSSL: false, accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) const objectsList = [] @@ -32,9 +33,11 @@ const bucketName = 'my-bucket' const prefix = 'my-prefix' const recursive = false -function removeObjects(bucketName, prefix, recursive, includeVersion) { - // List all object paths in bucket - var objectsStream = s3Client.listObjects(bucketName, prefix, recursive, { IncludeVersion: includeVersion }) + + +function removeObjects (bucketName, prefix, recursive, includeVersion) { +// List all object paths in bucket + var objectsStream = s3Client.listObjects(bucketName, prefix, recursive, {IncludeVersion: includeVersion}) objectsStream.on('data', function (obj) { if (includeVersion) { @@ -53,7 +56,7 @@ function removeObjects(bucketName, prefix, recursive, includeVersion) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) }) } @@ -61,19 +64,21 @@ function removeObjects(bucketName, prefix, recursive, includeVersion) { removeObjects(bucketName, prefix, recursive, true) // Versioned objects of a bucket to be deleted. removeObjects(bucketName, prefix, recursive, false) // Normal objects of a bucket to be deleted. + // Delete Multiple objects and respective versions. function removeObjectsMultipleVersions() { + const deleteList = [ - { versionId: '03ed08e1-34ff-4465-91ed-ba50c1e80f39', name: 'prefix-1/out.json.gz' }, - { versionId: '35517ae1-18cb-4a21-9551-867f53a10cfe', name: 'dir1/dir2/test.pdf' }, - { versionId: '3053f564-9aea-4a59-88f0-7f25d6320a2c', name: 'dir1/dir2/test.pdf' }, + {versionId: '03ed08e1-34ff-4465-91ed-ba50c1e80f39', name: 'prefix-1/out.json.gz'}, + {versionId: "35517ae1-18cb-4a21-9551-867f53a10cfe", name:"dir1/dir2/test.pdf"}, + {versionId: "3053f564-9aea-4a59-88f0-7f25d6320a2c", name:"dir1/dir2/test.pdf"} ] - s3Client.removeObjects('my-bucket', deleteList, function (e) { + s3Client.removeObjects("my-bucket", deleteList, function (e) { if (e) { return console.log(e) } - console.log('Successfully deleted..') + console.log("Successfully deleted..") }) } -removeObjectsMultipleVersions() +removeObjectsMultipleVersions() \ No newline at end of file diff --git a/examples/reset-object-lock-config.js b/examples/reset-object-lock-config.js index 2780b6b7..b820a9a0 100644 --- a/examples/reset-object-lock-config.js +++ b/examples/reset-object-lock-config.js @@ -22,13 +22,13 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) //Example to reset/remove object lock config. -s3Client.setObjectLockConfig('my-bucketname', {}, function (err) { +s3Client.setObjectLockConfig('my-bucketname', {}, function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) diff --git a/examples/select-object-content.js b/examples/select-object-content.js index 1b6421cb..25530542 100644 --- a/examples/select-object-content.js +++ b/examples/select-object-content.js @@ -14,34 +14,38 @@ * limitations under the License. */ + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. -var Minio = require('../dist/main/minio') +var Minio = require("../dist/main/minio") var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Reference: https://aws.amazon.com/blogs/storage/querying-data-without-servers-or-databases-using-amazon-s3-select/ const selectRequestConfig = { // expression:"SELECT * FROM s3object s where s.\"Name\" = 'Jane'", - expression: 'SELECT * FROM s3object s', - expressionType: 'SQL', - inputSerialization: { - CSV: { FileHeaderInfo: 'Use', RecordDelimiter: '\n', FieldDelimiter: ',' }, - CompressionType: 'NONE', + expression:"SELECT * FROM s3object s", + expressionType:"SQL", + inputSerialization : {'CSV': {"FileHeaderInfo": "Use", + RecordDelimiter: "\n", + FieldDelimiter: ",", }, - outputSerialization: { CSV: { RecordDelimiter: '\n', FieldDelimiter: ',' } }, - requestProgress: { Enabled: true }, + 'CompressionType': 'NONE'}, + outputSerialization : {'CSV': {RecordDelimiter: "\n", + FieldDelimiter: ",",}}, + requestProgress:{Enabled:true}, // scanRange:{ start:50, end:100 } } -s3Client.selectObjectContent('my-bucketname', 'my-objectname', selectRequestConfig, function (e, stat) { +s3Client.selectObjectContent('my-bucketname', 'my-objectname', selectRequestConfig, function(e, stat) { if (e) { return console.log(e) } console.log(stat) }) + diff --git a/examples/set-accelerate-end-point.js b/examples/set-accelerate-end-point.js index 5f50921e..2d41d83e 100644 --- a/examples/set-accelerate-end-point.js +++ b/examples/set-accelerate-end-point.js @@ -14,6 +14,7 @@ * limitations under the License. */ + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. @@ -22,18 +23,19 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Enable S3 transfer accelerate endpoint. -s3Client.SetS3TransferAccelerate('s3-accelerate.amazonaws.com') +s3Client.SetS3TransferAccelerate("s3-accelerate.amazonaws.com") // Upload a buffer var buf = new Buffer(10) buf.fill('a') -s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function (e) { +s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function(e) { if (e) { return console.log(e.message) } - console.log('Success') + console.log("Success") }) + diff --git a/examples/set-bucket-encryption.js b/examples/set-bucket-encryption.js index 7163c52a..94e5c22b 100644 --- a/examples/set-bucket-encryption.js +++ b/examples/set-bucket-encryption.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,17 +23,18 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) //Apply default encryption. -s3Client.setBucketEncryption('my-bucket', function (error) { +s3Client.setBucketEncryption("my-bucket", function (error){ if (error) { return console.log(error) } - console.log('Success') + console.log("Success") }) + //Set Encryption Rule. Only one rule is allowed. /** @@ -41,22 +43,24 @@ s3Client.setBucketEncryption('my-bucket', function (error) { */ var encryptionConfig = { - Rule: [ + Rule:[ { ApplyServerSideEncryptionByDefault: { - SSEAlgorithm: 'AES256', - }, - }, - ], + SSEAlgorithm:"AES256" + } + } + ] + } -s3Client.setBucketEncryption('my-bucket', encryptionConfig, function (error) { +s3Client.setBucketEncryption("my-bucket", encryptionConfig, function (error){ if (error) { return console.log(error) } - console.log('Success') + console.log("Success") }) + /** * KMS ID based SSE Encryption * Sample Configuration: @@ -86,19 +90,19 @@ s3Client.setBucketEncryption('my-bucket', encryptionConfig, function (error) { */ const kmsIdEncryptionConfig = { - Rule: [ + Rule:[ { ApplyServerSideEncryptionByDefault: { - KMSMasterKeyID: 'my-minio-key', //as per env value - SSEAlgorithm: 'aws:kms', // this is important - }, - }, - ], + KMSMasterKeyID:'my-minio-key', //as per env value + SSEAlgorithm:"aws:kms" // this is important + } + } + ] } -s3Client.setBucketEncryption('my-bucket', kmsIdEncryptionConfig, function (error) { +s3Client.setBucketEncryption("my-bucket", kmsIdEncryptionConfig, function (error){ if (error) { return console.log(error) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/set-bucket-lifecycle.js b/examples/set-bucket-lifecycle.js index 547e9cac..a7af5788 100644 --- a/examples/set-bucket-lifecycle.js +++ b/examples/set-bucket-lifecycle.js @@ -22,54 +22,54 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -const lifecycleConfig = { - Rule: [ - { - ID: 'Expiration Days Rule', - Status: 'Enabled', - Filter: { - Prefix: '', - }, - Expiration: { - Days: '3650', - }, + +const lifecycleConfig= { + Rule: [{ + "ID": "Expiration Days Rule", + "Status": "Enabled", + "Filter": { + "Prefix":"", }, - ], + "Expiration": { + "Days": "3650" + } + } + ] } -s3Client.setBucketLifecycle('bucketname', lifecycleConfig, function (err) { +s3Client.setBucketLifecycle('bucketname',lifecycleConfig, function (err) { if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) //Example to demonstrate Expiration Date const expirationDate = new Date() expirationDate.setDate(expirationDate.getDate() + 1) // Expire next day. -expirationDate.setUTCHours(0, 0, 0, 0) //Should be start of the day.(midnight) +expirationDate.setUTCHours(0,0,0,0)//Should be start of the day.(midnight) -const lifecycleConfigWithExpirationDate = { - Rule: [ - { - ID: 'Expiration Date Rule', - Status: 'Enabled', - Filter: { - Prefix: '', - }, - Expiration: { - Date: expirationDate.toISOString(), - }, +const lifecycleConfigWithExpirationDate= { + Rule: [{ + "ID": "Expiration Date Rule", + "Status": "Enabled", + "Filter": { + "Prefix":"", }, - ], + "Expiration": { + Date:expirationDate.toISOString() + } + } + ] } -s3Client.setBucketLifecycle('bucketname', lifecycleConfigWithExpirationDate, function (err) { +s3Client.setBucketLifecycle('bucketname',lifecycleConfigWithExpirationDate, function (err) { if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) + diff --git a/examples/set-bucket-notification.js b/examples/set-bucket-notification.js index a11e9f7c..bd81ec05 100644 --- a/examples/set-bucket-notification.js +++ b/examples/set-bucket-notification.js @@ -14,8 +14,9 @@ * limitations under the License. */ -// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are -// dummy values, please replace them with original values. + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are + // dummy values, please replace them with original values. + var Minio = require('minio') @@ -24,11 +25,11 @@ var s3Client = new Minio.Client({ port: 9000, useSSL: false, accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) var config = new Minio.NotificationConfig() -var arn = Minio.buildARN('minio', 'sqs', '', '1', 'webhook') +var arn = Minio.buildARN('minio', 'sqs', '','1', 'webhook') var queue = new Minio.QueueConfig(arn) queue.addFilterSuffix('.jpg') @@ -37,9 +38,10 @@ queue.addEvent(Minio.ObjectCreatedAll) config.add(queue) -s3Client.setBucketNotification('my-bucketname', config, function (e) { +s3Client.setBucketNotification('my-bucketname', config, function(e) { if (e) { return console.log(e) } - console.log('Success') + console.log("Success") }) + diff --git a/examples/set-bucket-policy.js b/examples/set-bucket-policy.js index ea44fcef..ae97c92a 100644 --- a/examples/set-bucket-policy.js +++ b/examples/set-bucket-policy.js @@ -22,7 +22,7 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Bucket policy - GET requests on "testbucket" bucket will not need authentication. @@ -66,7 +66,7 @@ var policy = ` ` s3Client.setBucketPolicy('testbucket', policy, (err) => { - if (err) throw err + if (err) throw err - console.log('Set bucket policy') + console.log('Set bucket policy') }) diff --git a/examples/set-bucket-replication.js b/examples/set-bucket-replication.js index 582863c3..5268d7a9 100644 --- a/examples/set-bucket-replication.js +++ b/examples/set-bucket-replication.js @@ -22,34 +22,33 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -const arnFromMcCli = - 'arn:minio:replication::1277fcbe7df0bab76ab0c64cf7c45a0d27e01917ee5f11e913f3478417833660:destination' + +const arnFromMcCli = "arn:minio:replication::1277fcbe7df0bab76ab0c64cf7c45a0d27e01917ee5f11e913f3478417833660:destination" var replicationConfig = { - role: arnFromMcCli, - rules: [ - { - DeleteMarkerReplication: { - Status: 'Disabled', - }, - DeleteReplication: { - Status: [], - }, - Destination: { - Bucket: 'arn:aws:s3:::destination', - }, - Priority: '1', - Status: 'Enabled', + role:arnFromMcCli, + rules:[{ + "DeleteMarkerReplication": { + "Status": "Disabled" + }, + "DeleteReplication": { + "Status": [ + ] + }, + "Destination": { + "Bucket": "arn:aws:s3:::destination" }, - ], + "Priority": "1", + "Status": "Enabled" + }] } -s3Client.setBucketReplication('bucketname', replicationConfig, function (err) { +s3Client.setBucketReplication('bucketname',replicationConfig, function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) diff --git a/examples/set-bucket-tagging.js b/examples/set-bucket-tagging.js index ee5dfd4b..6acbfcc1 100644 --- a/examples/set-bucket-tagging.js +++ b/examples/set-bucket-tagging.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,14 +23,14 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -var tagsMap = { tagkey: 'tagvalue' } +var tagsMap = {"tagkey":"tagvalue"} -s3Client.setBucketTagging('bucketname', tagsMap, function (err) { +s3Client.setBucketTagging('bucketname', tagsMap, function (err){ if (err) { return console.log(err) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/set-bucket-versioning.js b/examples/set-bucket-versioning.js index 4175ef52..90fee452 100644 --- a/examples/set-bucket-versioning.js +++ b/examples/set-bucket-versioning.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,14 +23,14 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -var versioningStateConfig = { Status: 'Enabled' } +var versioningStateConfig = {Status:"Enabled"} -s3Client.setBucketVersioning('my-bucket', versioningStateConfig, function (error) { +s3Client.setBucketVersioning("my-bucket", versioningStateConfig, function (error){ if (error) { return console.log(error) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/set-object-legal-hold.js b/examples/set-object-legal-hold.js index df22f9aa..0320639c 100644 --- a/examples/set-object-legal-hold.js +++ b/examples/set-object-legal-hold.js @@ -22,11 +22,11 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) //Set legal hold config of an object. -s3Client.setObjectLegalHold('bucketName', 'objectName', { status: 'ON' }, function (err, res) { +s3Client.setObjectLegalHold('bucketName', 'objectName', {status:"ON"}, function(err, res) { if (err) { return console.log('Unable to set legal hold config for the object', err) } @@ -34,14 +34,9 @@ s3Client.setObjectLegalHold('bucketName', 'objectName', { status: 'ON' }, functi }) //Set legal hold config of an object with versionId. -s3Client.setObjectLegalHold( - 'bucketName', - 'objectName', - { status: 'ON', versionId: 'my-obj-version-uuid' }, - function (err, res) { - if (err) { - return console.log('Unable to set legal hold config for the object version', err) - } - console.log('Success') +s3Client.setObjectLegalHold('bucketName', 'objectName', { status:"ON", versionId:'my-obj-version-uuid' }, function(err, res) { + if (err) { + return console.log('Unable to set legal hold config for the object version', err) } -) + console.log('Success') +}) \ No newline at end of file diff --git a/examples/set-object-lock-config.js b/examples/set-object-lock-config.js index 3b5faae3..4d90bb86 100644 --- a/examples/set-object-lock-config.js +++ b/examples/set-object-lock-config.js @@ -22,21 +22,21 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) //Set Object lock on a bucket -s3Client.setObjectLockConfig('my-bucketname', { mode: 'COMPLIANCE', unit: 'Days', validity: 10 }, function (err) { +s3Client.setObjectLockConfig('my-bucketname', {mode:"COMPLIANCE",unit:'Days', validity:10 }, function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) //To reset/remove object lock config. -s3Client.setObjectLockConfig('my-bucketname', {}, function (err) { +s3Client.setObjectLockConfig('my-bucketname', {}, function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) diff --git a/examples/set-object-tagging.js b/examples/set-object-tagging.js index 4d51079c..8a1e11d4 100644 --- a/examples/set-object-tagging.js +++ b/examples/set-object-tagging.js @@ -1,3 +1,4 @@ + /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -22,22 +23,22 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) -var tagsMap = { tagkey: 'tagvalue' } +var tagsMap = {"tagkey":"tagvalue"} -s3Client.setObjectTagging('bucketname', 'object-name', tagsMap, function (err) { +s3Client.setObjectTagging('bucketname', "object-name", tagsMap, function (err){ if (err) { return console.log(err) } - console.log('Success') + console.log("Success") }) //Put tags on a version of an object -s3Client.setObjectTagging('bucketname', 'object-name', tagsMap, { versionId: 'my-version-id' }, function (err) { +s3Client.setObjectTagging('bucketname', "object-name", tagsMap, { versionId: "my-version-id" }, function (err){ if (err) { return console.log(err) } - console.log('Success') -}) + console.log("Success") +}) \ No newline at end of file diff --git a/examples/stat-object.js b/examples/stat-object.js index e20f6988..3c46543d 100644 --- a/examples/stat-object.js +++ b/examples/stat-object.js @@ -14,6 +14,7 @@ * limitations under the License. */ + // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. @@ -22,10 +23,10 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY', + secretKey: 'YOUR-SECRETACCESSKEY' }) // Get stat information for my-objectname. -s3Client.statObject('my-bucketname', 'my-objectname', function (e, stat) { +s3Client.statObject('my-bucketname', 'my-objectname', function(e, stat) { if (e) { return console.log(e) } @@ -34,7 +35,7 @@ s3Client.statObject('my-bucketname', 'my-objectname', function (e, stat) { // Get stat information for a specific version of 'my-objectname' //Bucket must be versioning enabled. -s3Client.statObject('my-bucketname', 'my-objectname', { versionId: 'my-uuid' }, function (e, stat) { +s3Client.statObject('my-bucketname', 'my-objectname', {versionId:"my-uuid"},function(e, stat) { if (e) { return console.log(e) } diff --git a/src/main/AssumeRoleProvider.js b/src/main/AssumeRoleProvider.js index 1f394459..27f95398 100644 --- a/src/main/AssumeRoleProvider.js +++ b/src/main/AssumeRoleProvider.js @@ -1,11 +1,10 @@ import Http from 'http' import Https from 'https' - -import CredentialProvider from './CredentialProvider' -import Credentials from './Credentials' -import { makeDateLong, parseXml, toSha256 } from './helpers' -import { signV4ByServiceName } from './signing' -const { URLSearchParams, URL } = require('url') +import {makeDateLong, parseXml, toSha256} from "./helpers" +import {signV4ByServiceName} from "./signing" +import CredentialProvider from "./CredentialProvider" +import Credentials from "./Credentials" +const {URLSearchParams, URL} = require('url') class AssumeRoleProvider extends CredentialProvider { constructor({ @@ -21,7 +20,7 @@ class AssumeRoleProvider extends CredentialProvider { externalId, token, webIdentityToken, - action = 'AssumeRole', + action = "AssumeRole" }) { super({}) @@ -40,21 +39,23 @@ class AssumeRoleProvider extends CredentialProvider { this.sessionToken = sessionToken /** - * Internal Tracking variables - */ + * Internal Tracking variables + */ this.credentials = null this.expirySeconds = null this.accessExpiresAt = null + } + getRequestConfig() { const url = new URL(this.stsEndpoint) const hostValue = url.hostname const portValue = url.port - const isHttp = url.protocol.includes('http:') + const isHttp = url.protocol.includes("http:") const qryParams = new URLSearchParams() - qryParams.set('Action', this.action) - qryParams.set('Version', '2011-06-15') + qryParams.set("Action", this.action) + qryParams.set("Version", "2011-06-15") const defaultExpiry = 900 let expirySeconds = parseInt(this.durationSeconds) @@ -63,60 +64,61 @@ class AssumeRoleProvider extends CredentialProvider { } this.expirySeconds = expirySeconds // for calculating refresh of credentials. - qryParams.set('DurationSeconds', this.expirySeconds) + qryParams.set("DurationSeconds", this.expirySeconds) if (this.policy) { - qryParams.set('Policy', this.policy) + qryParams.set("Policy", this.policy) } if (this.roleArn) { - qryParams.set('RoleArn', this.roleArn) + qryParams.set("RoleArn", this.roleArn) } if (this.roleSessionName != null) { - qryParams.set('RoleSessionName', this.roleSessionName) + qryParams.set("RoleSessionName", this.roleSessionName) } if (this.token != null) { - qryParams.set('Token', this.token) + qryParams.set("Token", this.token) } if (this.webIdentityToken) { - qryParams.set('WebIdentityToken', this.webIdentityToken) + qryParams.set("WebIdentityToken", this.webIdentityToken) } if (this.externalId) { - qryParams.set('ExternalId', this.externalId) + qryParams.set("ExternalId", this.externalId) } + const urlParams = qryParams.toString() const contentSha256 = toSha256(urlParams) const date = new Date() /** - * Nodejs's Request Configuration. - */ + * Nodejs's Request Configuration. + */ const requestOptions = { hostname: hostValue, port: portValue, - path: '/', + path: "/", protocol: url.protocol, - method: 'POST', + method: "POST", headers: { - 'Content-Type': 'application/x-www-form-urlencoded', - 'content-length': urlParams.length, - host: hostValue, - 'x-amz-date': makeDateLong(date), - 'x-amz-content-sha256': contentSha256, - }, + "Content-Type": "application/x-www-form-urlencoded", + "content-length": urlParams.length, + "host": hostValue, + "x-amz-date": makeDateLong(date), + 'x-amz-content-sha256': contentSha256 + } } - const authorization = signV4ByServiceName(requestOptions, this.accessKey, this.secretKey, this.region, date, 'sts') + const authorization = signV4ByServiceName(requestOptions, this.accessKey, this.secretKey, this.region, date, "sts") requestOptions.headers.authorization = authorization return { requestOptions, requestData: urlParams, - isHttp: isHttp, + isHttp: isHttp } } @@ -131,7 +133,7 @@ class AssumeRoleProvider extends CredentialProvider { const promise = new Promise((resolve, reject) => { const requestObj = Transport.request(requestOptions, (resp) => { let resChunks = [] - resp.on('data', (rChunk) => { + resp.on('data', rChunk => { resChunks.push(rChunk) }) resp.on('end', () => { @@ -150,11 +152,12 @@ class AssumeRoleProvider extends CredentialProvider { requestObj.end() }) return promise + } - parseCredentials(respObj = {}) { - if (respObj.ErrorResponse) { - throw new Error('Unable to obtain credentials:', respObj) + parseCredentials(respObj={}) { + if(respObj.ErrorResponse){ + throw new Error("Unable to obtain credentials:", respObj) } const { AssumeRoleResponse: { @@ -163,24 +166,27 @@ class AssumeRoleProvider extends CredentialProvider { AccessKeyId: accessKey, SecretAccessKey: secretKey, SessionToken: sessionToken, - Expiration: expiresAt, - } = {}, - } = {}, - } = {}, + Expiration: expiresAt + } = {} + } = {} + } = {} } = respObj + this.accessExpiresAt = expiresAt const newCreds = new Credentials({ accessKey, secretKey, - sessionToken, + sessionToken }) this.setCredentials(newCreds) return this.credentials + } + async refreshCredentials() { try { const assumeRoleCredentials = await this.performRequest() @@ -209,4 +215,4 @@ class AssumeRoleProvider extends CredentialProvider { } } -export default AssumeRoleProvider +export default AssumeRoleProvider \ No newline at end of file diff --git a/src/main/CredentialProvider.js b/src/main/CredentialProvider.js index ae81a89f..c1b59bec 100644 --- a/src/main/CredentialProvider.js +++ b/src/main/CredentialProvider.js @@ -1,11 +1,15 @@ -import Credentials from './Credentials' +import Credentials from "./Credentials" class CredentialProvider { - constructor({ accessKey, secretKey, sessionToken }) { + constructor({ + accessKey, + secretKey, + sessionToken + }) { this.credentials = new Credentials({ accessKey, secretKey, - sessionToken, + sessionToken }) } @@ -17,10 +21,11 @@ class CredentialProvider { if (credentials instanceof Credentials) { this.credentials = credentials } else { - throw new Error('Unable to set Credentials . it should be an instance of Credentials class') + throw new Error("Unable to set Credentials . it should be an instance of Credentials class") } } + setAccessKey(accessKey) { this.credentials.setAccessKey(accessKey) } @@ -44,6 +49,8 @@ class CredentialProvider { getSessionToken() { return this.credentials.getSessionToken() } + + } -export default CredentialProvider +export default CredentialProvider \ No newline at end of file diff --git a/src/main/Credentials.js b/src/main/Credentials.js index 07992385..acd0d247 100644 --- a/src/main/Credentials.js +++ b/src/main/Credentials.js @@ -1,36 +1,42 @@ -class Credentials { - constructor({ accessKey, secretKey, sessionToken }) { +class Credentials{ + constructor({ + accessKey, + secretKey, + sessionToken + }) { this.accessKey = accessKey this.secretKey = secretKey - this.sessionToken = sessionToken + this.sessionToken=sessionToken } - setAccessKey(accessKey) { + + setAccessKey(accessKey){ this.accessKey = accessKey } - getAccessKey() { + getAccessKey(){ return this.accessKey } - setSecretKey(secretKey) { - this.secretKey = secretKey + setSecretKey(secretKey){ + this.secretKey=secretKey } - getSecretKey() { + getSecretKey(){ return this.secretKey } - setSessionToken(sessionToken) { + setSessionToken (sessionToken){ this.sessionToken = sessionToken } - getSessionToken() { + getSessionToken (){ return this.sessionToken } - - get() { + + get(){ return { - accessKey: this.accessKey, - secretKey: this.secretKey, - sessionToken: this.sessionToken, + accessKey:this.accessKey, + secretKey:this.secretKey, + sessionToken:this.sessionToken } } + } -export default Credentials +export default Credentials \ No newline at end of file diff --git a/src/main/extensions.js b/src/main/extensions.js index 27a4e597..2e923d11 100644 --- a/src/main/extensions.js +++ b/src/main/extensions.js @@ -16,12 +16,18 @@ import Stream from 'stream' -import * as errors from './errors' -import { isBoolean, isNumber, isString, isValidBucketName, isValidPrefix, pipesetup, uriEscape } from './helpers' import * as transformers from './transformers' +import * as errors from './errors.js' + +import { isValidPrefix, isValidBucketName, uriEscape, + isBoolean, isNumber, isString, + pipesetup } from './helpers.js' + export default class extensions { - constructor(client) { + + constructor(client) + { this.client = client } @@ -66,7 +72,7 @@ export default class extensions { var continuationToken = '' var objects = [] var ended = false - var readStream = Stream.Readable({ objectMode: true }) + var readStream = Stream.Readable({objectMode: true}) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -76,8 +82,8 @@ export default class extensions { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) - .on('error', (e) => readStream.emit('error', e)) - .on('data', (result) => { + .on('error', e => readStream.emit('error', e)) + .on('data', result => { if (result.isTruncated) { continuationToken = result.nextContinuationToken } else { @@ -153,7 +159,7 @@ export default class extensions { } var method = 'GET' var transformer = transformers.getListObjectsV2WithMetadataTransformer() - this.client.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.client.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) diff --git a/src/main/helpers.js b/src/main/helpers.js index 0811ed56..724d1b31 100644 --- a/src/main/helpers.js +++ b/src/main/helpers.js @@ -14,26 +14,25 @@ * limitations under the License. */ -import mime from 'mime-types' import stream from 'stream' +import mime from 'mime-types' var Crypto = require('crypto-browserify') -const { XMLParser } = require('fast-xml-parser') -const fxp = new XMLParser() +const { XMLParser } = require("fast-xml-parser") +const fxp = new XMLParser() const ipaddr = require('ipaddr.js') -import { isBrowser } from 'browser-or-node' +import { isBrowser } from "browser-or-node" const fs = require('fs') -const path = require('path') +const path = require("path") import _ from 'lodash' +import * as errors from './errors.js' import querystring from 'query-string' -import * as errors from './errors' - // Returns a wrapper function that will promisify a given callback function. // It will preserve 'this'. export function promisify(fn) { - return function () { + return function() { // If the last argument is a function, assume its the callback. let callback = arguments[arguments.length - 1] @@ -67,15 +66,14 @@ export function uriEscape(string) { if (buf.length === 1) { // length 1 indicates that elem is not a unicode character. // Check if it is an unreserved characer. - if ( - ('A' <= elem && elem <= 'Z') || - ('a' <= elem && elem <= 'z') || - ('0' <= elem && elem <= '9') || - elem === '_' || - elem === '.' || - elem === '~' || - elem === '-' - ) { + if ('A' <= elem && elem <= 'Z' || + 'a' <= elem && elem <= 'z' || + '0' <= elem && elem <= '9' || + elem === '_' || + elem === '.' || + elem === '~' || + elem === '-') + { // Unreserved characer should not be encoded. acc = acc + elem return acc @@ -84,7 +82,7 @@ export function uriEscape(string) { // elem needs encoding - i.e elem should be encoded if it's not unreserved // character or if it's a unicode character. for (var i = 0; i < buf.length; i++) { - acc = acc + '%' + buf[i].toString(16).toUpperCase() + acc = acc + "%" + buf[i].toString(16).toUpperCase() } return acc }, '') @@ -94,7 +92,7 @@ export function uriResourceEscape(string) { return uriEscape(string).replace(/%2F/g, '/') } -export function getScope(region, date, serviceName = 's3') { +export function getScope(region, date, serviceName="s3") { return `${makeDateShort(date)}/${region}/${serviceName}/aws4_request` } @@ -115,6 +113,7 @@ export function isVirtualHostStyle(endpoint, protocol, bucket, pathStyle) { return isAmazonEndpoint(endpoint) || !pathStyle } + export function isValidIP(ip) { return ipaddr.isValid(ip) } @@ -219,22 +218,22 @@ export function isValidPrefix(prefix) { // check if typeof arg number export function isNumber(arg) { - return typeof arg === 'number' + return typeof(arg) === 'number' } // check if typeof arg function export function isFunction(arg) { - return typeof arg === 'function' + return typeof(arg) === 'function' } // check if typeof arg string export function isString(arg) { - return typeof arg === 'string' + return typeof(arg) === 'string' } // check if typeof arg object export function isObject(arg) { - return typeof arg === 'object' && arg !== null + return typeof(arg) === 'object' && arg !== null } // check if object is readable stream @@ -244,7 +243,7 @@ export function isReadableStream(arg) { // check if arg is boolean export function isBoolean(arg) { - return typeof arg === 'boolean' + return typeof(arg) === 'boolean' } // check if arg is array @@ -265,7 +264,11 @@ export function makeDateLong(date) { // Gives format like: '2017-08-07T16:28:59.889Z' date = date.toISOString() - return date.slice(0, 4) + date.slice(5, 7) + date.slice(8, 13) + date.slice(14, 16) + date.slice(17, 19) + 'Z' + return date.slice(0, 4) + + date.slice(5, 7) + + date.slice(8, 13) + + date.slice(14, 16) + + date.slice(17, 19) + 'Z' } // Create a Date string with format: @@ -276,7 +279,9 @@ export function makeDateShort(date) { // Gives format like: '2017-08-07T16:28:59.889Z' date = date.toISOString() - return date.slice(0, 4) + date.slice(5, 7) + date.slice(8, 10) + return date.slice(0, 4) + + date.slice(5, 7) + + date.slice(8, 10) } // pipesetup sets up pipe() from left to right os streams array @@ -284,7 +289,7 @@ export function makeDateShort(date) { // will be emitted at the last stream. This makes error handling simple export function pipesetup(...streams) { return streams.reduce((src, dst) => { - src.on('error', (err) => dst.emit('error', err)) + src.on('error', err => dst.emit('error', err)) return src.pipe(dst) }) } @@ -317,8 +322,8 @@ export function insertContentType(metaData, filePath) { export function prependXAMZMeta(metaData) { var newMetadata = Object.assign({}, metaData) for (var key in metaData) { - if (!isAmzHeader(key) && !isSupportedHeader(key) && !isStorageclassHeader(key)) { - newMetadata['X-Amz-Meta-' + key] = newMetadata[key] + if(!isAmzHeader(key) && !isSupportedHeader(key) && !isStorageclassHeader(key)) { + newMetadata["X-Amz-Meta-" + key ] = newMetadata[key] delete newMetadata[key] } } @@ -328,12 +333,7 @@ export function prependXAMZMeta(metaData) { // Checks if it is a valid header according to the AmazonS3 API export function isAmzHeader(key) { var temp = key.toLowerCase() - return ( - temp.startsWith('x-amz-meta-') || - temp === 'x-amz-acl' || - temp.startsWith('x-amz-server-side-encryption-') || - temp === 'x-amz-server-side-encryption' - ) + return temp.startsWith("x-amz-meta-") || temp === "x-amz-acl" || temp.startsWith("x-amz-server-side-encryption-") || temp === "x-amz-server-side-encryption" } // Checks if it is a supported Header export function isSupportedHeader(key) { @@ -343,21 +343,20 @@ export function isSupportedHeader(key) { 'content-encoding', 'content-disposition', 'content-language', - 'x-amz-website-redirect-location', - ] - return supported_headers.indexOf(key.toLowerCase()) > -1 + 'x-amz-website-redirect-location'] + return (supported_headers.indexOf(key.toLowerCase()) > -1) } // Checks if it is a storage header export function isStorageclassHeader(key) { - return key.toLowerCase() === 'x-amz-storage-class' + return key.toLowerCase() === "x-amz-storage-class" } export function extractMetadata(metaData) { var newMetadata = {} for (var key in metaData) { - if (isSupportedHeader(key) || isStorageclassHeader(key) || isAmzHeader(key)) { - if (key.toLowerCase().startsWith('x-amz-meta-')) { - newMetadata[key.slice(11, key.length)] = metaData[key] + if(isSupportedHeader(key) || isStorageclassHeader(key) || isAmzHeader(key)) { + if(key.toLowerCase().startsWith("x-amz-meta-")) { + newMetadata[key.slice(11,key.length)] = metaData[key] } else { newMetadata[key] = metaData[key] } @@ -366,42 +365,44 @@ export function extractMetadata(metaData) { return newMetadata } -export function getVersionId(headers = {}) { - const versionIdValue = headers['x-amz-version-id'] - return versionIdValue || null + +export function getVersionId(headers={}){ + const versionIdValue = headers["x-amz-version-id"] + return versionIdValue || null } -export function getSourceVersionId(headers = {}) { - const sourceVersionId = headers['x-amz-copy-source-version-id'] - return sourceVersionId || null +export function getSourceVersionId(headers={}){ + const sourceVersionId = headers["x-amz-copy-source-version-id"] + return sourceVersionId || null } -export function sanitizeETag(etag = '') { - var replaceChars = { '"': '', '"': '', '"': '', '"': '', '"': '' } - return etag.replace(/^("|"|")|("|"|")$/g, (m) => replaceChars[m]) +export function sanitizeETag(etag='') { + var replaceChars = {'"':'','"':'','"':'','"':'','"':''} + return etag.replace(/^("|"|")|("|"|")$/g, m => replaceChars[m]) + } -export const RETENTION_MODES = { - GOVERNANCE: 'GOVERNANCE', - COMPLIANCE: 'COMPLIANCE', +export const RETENTION_MODES ={ + GOVERNANCE:"GOVERNANCE", + COMPLIANCE:"COMPLIANCE" } -export const RETENTION_VALIDITY_UNITS = { - DAYS: 'Days', - YEARS: 'Years', +export const RETENTION_VALIDITY_UNITS={ + DAYS:"Days", + YEARS:"Years" } -export const LEGAL_HOLD_STATUS = { - ENABLED: 'ON', - DISABLED: 'OFF', +export const LEGAL_HOLD_STATUS={ + ENABLED:"ON", + DISABLED:"OFF" } -const objectToBuffer = (payload) => { +const objectToBuffer = (payload) =>{ const payloadBuf = Buffer.from(Buffer.from(payload)) return payloadBuf } -export const toMd5 = (payload) => { +export const toMd5=(payload)=>{ let payLoadBuf = objectToBuffer(payload) // use string from browser and buffer from nodejs // browser support is tested only against minio server @@ -409,7 +410,7 @@ export const toMd5 = (payload) => { return Crypto.createHash('md5').update(payLoadBuf).digest().toString('base64') } -export const toSha256 = (payload) => { +export const toSha256=(payload)=>{ return Crypto.createHash('sha256').update(payload).digest('hex') } @@ -423,20 +424,21 @@ export const toArray = (param) => { return param } -export const sanitizeObjectKey = (objectName) => { +export const sanitizeObjectKey=(objectName)=>{ // + symbol characters are not decoded as spaces in JS. so replace them first and decode to get the correct result. - let asStrName = (objectName ? objectName.toString() : '').replace(/\+/g, ' ') + let asStrName = (objectName ? objectName.toString() : "").replace(/\+/g, ' ') const sanitizedName = decodeURIComponent(asStrName) return sanitizedName } -export const PART_CONSTRAINTS = { - // absMinPartSize - absolute minimum part size (5 MiB) - ABS_MIN_PART_SIZE: 1024 * 1024 * 5, + +export const PART_CONSTRAINTS ={ +// absMinPartSize - absolute minimum part size (5 MiB) + ABS_MIN_PART_SIZE:1024 * 1024 * 5, // MIN_PART_SIZE - minimum part size 16MiB per object after which - MIN_PART_SIZE: 1024 * 1024 * 16, + MIN_PART_SIZE : 1024 * 1024 * 16, // MAX_PARTS_COUNT - maximum number of parts for a single multipart session. - MAX_PARTS_COUNT: 10000, + MAX_PARTS_COUNT : 10000, // MAX_PART_SIZE - maximum part size 5GiB for a single multipart upload // operation. MAX_PART_SIZE: 1024 * 1024 * 1024 * 5, @@ -445,22 +447,23 @@ export const PART_CONSTRAINTS = { MAX_SINGLE_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 5, // MAX_MULTIPART_PUT_OBJECT_SIZE - maximum size 5TiB of object for // Multipart operation. - MAX_MULTIPART_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 1024 * 5, + MAX_MULTIPART_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 1024 * 5 } -export const ENCRYPTION_TYPES = { +export const ENCRYPTION_TYPES ={ // SSEC represents server-side-encryption with customer provided keys - SSEC: 'SSE-C', + SSEC: "SSE-C", // KMS represents server-side-encryption with managed keys - KMS: 'KMS', + KMS: "KMS" + } -const GENERIC_SSE_HEADER = 'X-Amz-Server-Side-Encryption' +const GENERIC_SSE_HEADER="X-Amz-Server-Side-Encryption" -const ENCRYPTION_HEADERS = { +const ENCRYPTION_HEADERS ={ // sseGenericHeader is the AWS SSE header used for SSE-S3 and SSE-KMS. - sseGenericHeader: GENERIC_SSE_HEADER, + sseGenericHeader : GENERIC_SSE_HEADER, // sseKmsKeyID is the AWS SSE-KMS key id. - sseKmsKeyID: GENERIC_SSE_HEADER + '-Aws-Kms-Key-Id', + sseKmsKeyID : GENERIC_SSE_HEADER + "-Aws-Kms-Key-Id", } /** @@ -468,18 +471,18 @@ const ENCRYPTION_HEADERS = { * @param encConfig * @returns an object with key value pairs that can be used in headers. */ -function getEncryptionHeaders(encConfig) { +function getEncryptionHeaders (encConfig) { const encType = encConfig.type const encHeaders = {} - if (!_.isEmpty(encType)) { - if (encType === ENCRYPTION_TYPES.SSEC) { + if(!_.isEmpty(encType) ){ + if( encType === ENCRYPTION_TYPES.SSEC) { return { - [encHeaders[ENCRYPTION_HEADERS.sseGenericHeader]]: 'AES256', + [encHeaders[ENCRYPTION_HEADERS.sseGenericHeader]]: "AES256" } - } else if (encType === ENCRYPTION_TYPES.KMS) { + } else if(encType === ENCRYPTION_TYPES.KMS){ return { - [ENCRYPTION_HEADERS.sseGenericHeader]: encConfig.SSEAlgorithm, - [ENCRYPTION_HEADERS.sseKmsKeyID]: encConfig.KMSMasterKeyID, + [ENCRYPTION_HEADERS.sseGenericHeader]:encConfig.SSEAlgorithm, + [ENCRYPTION_HEADERS.sseKmsKeyID]:encConfig.KMSMasterKeyID } } } @@ -489,86 +492,86 @@ function getEncryptionHeaders(encConfig) { export class CopySourceOptions { /** - * - * @param Bucket __string__ Bucket Name - * @param Object __string__ Object Name - * @param VersionID __string__ Valid versionId - * @param MatchETag __string__ Etag to match - * @param NoMatchETag __string__ Etag to exclude - * @param MatchModifiedSince __string__ Modified Date of the object/part. UTC Date in string format - * @param MatchUnmodifiedSince __string__ Modified Date of the object/part to exclude UTC Date in string format - * @param MatchRange __boolean__ true or false Object range to match - * @param Start - * @param End - * @param Encryption - */ + * + * @param Bucket __string__ Bucket Name + * @param Object __string__ Object Name + * @param VersionID __string__ Valid versionId + * @param MatchETag __string__ Etag to match + * @param NoMatchETag __string__ Etag to exclude + * @param MatchModifiedSince __string__ Modified Date of the object/part. UTC Date in string format + * @param MatchUnmodifiedSince __string__ Modified Date of the object/part to exclude UTC Date in string format + * @param MatchRange __boolean__ true or false Object range to match + * @param Start + * @param End + * @param Encryption + */ constructor({ - Bucket = '', - Object = '', - VersionID = '', - MatchETag = '', - NoMatchETag = '', - MatchModifiedSince = null, - MatchUnmodifiedSince = null, - MatchRange = false, - Start = 0, - End = 0, - Encryption = {}, - } = {}) { - this.Bucket = Bucket - this.Object = Object - this.VersionID = VersionID - this.MatchETag = MatchETag - this.NoMatchETag = NoMatchETag - this.MatchModifiedSince = MatchModifiedSince - this.MatchUnmodifiedSince = MatchUnmodifiedSince - this.MatchRange = MatchRange - this.Start = Start - this.End = End - this.Encryption = Encryption - } - - validate() { + Bucket="", + Object="", + VersionID="", + MatchETag="", + NoMatchETag="", + MatchModifiedSince=null, + MatchUnmodifiedSince=null, + MatchRange=false, + Start=0, + End=0, + Encryption= {}, + }={}) { + + this.Bucket=Bucket + this.Object=Object + this.VersionID=VersionID + this.MatchETag=MatchETag + this.NoMatchETag=NoMatchETag + this.MatchModifiedSince=MatchModifiedSince + this.MatchUnmodifiedSince=MatchUnmodifiedSince + this.MatchRange=MatchRange + this.Start=Start + this.End=End + this.Encryption=Encryption + } + + validate(){ if (!isValidBucketName(this.Bucket)) { throw new errors.InvalidBucketNameError('Invalid Source bucket name: ' + this.Bucket) } if (!isValidObjectName(this.Object)) { throw new errors.InvalidObjectNameError(`Invalid Source object name: ${this.Object}`) } - if ((this.MatchRange && this.Start !== -1 && this.End !== -1 && this.Start > this.End) || this.Start < 0) { - throw new errors.InvalidObjectNameError('Source start must be non-negative, and start must be at most end.') - } else if ((this.MatchRange && !isNumber(this.Start)) || !isNumber(this.End)) { - throw new errors.InvalidObjectNameError( - 'MatchRange is specified. But Invalid Start and End values are specified. ' - ) + if (this.MatchRange && (this.Start !==-1 && this.End !==-1) && this.Start > this.End || this.Start < 0) { + throw new errors.InvalidObjectNameError("Source start must be non-negative, and start must be at most end.") + } else if(this.MatchRange&& !isNumber(this.Start) || !isNumber(this.End) ){ + throw new errors.InvalidObjectNameError("MatchRange is specified. But Invalid Start and End values are specified. ") } return true } - getHeaders() { - let headerOptions = {} - headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object) + getHeaders (){ + let headerOptions ={} + headerOptions["x-amz-copy-source"]=encodeURI(this.Bucket+"/"+this.Object) if (!_.isEmpty(this.VersionID)) { - headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object) + '?versionId=' + this.VersionID + headerOptions["x-amz-copy-source"]=encodeURI(this.Bucket+"/"+this.Object)+"?versionId="+this.VersionID } if (!_.isEmpty(this.MatchETag)) { - headerOptions['x-amz-copy-source-if-match'] = this.MatchETag + headerOptions["x-amz-copy-source-if-match"]=this.MatchETag } if (!_.isEmpty(this.NoMatchETag)) { - headerOptions['x-amz-copy-source-if-none-match'] = this.NoMatchETag + headerOptions["x-amz-copy-source-if-none-match"]=this.NoMatchETag } if (!_.isEmpty(this.MatchModifiedSince)) { - headerOptions['x-amz-copy-source-if-modified-since'] = this.MatchModifiedSince + headerOptions["x-amz-copy-source-if-modified-since"]= this.MatchModifiedSince } if (!_.isEmpty(this.MatchUnmodifiedSince)) { - headerOptions['x-amz-copy-source-if-unmodified-since'] = this.MatchUnmodifiedSince + headerOptions["x-amz-copy-source-if-unmodified-since"]= this.MatchUnmodifiedSince } return headerOptions + } } @@ -582,96 +585,92 @@ export class CopyDestinationOptions { * @param LegalHold __string__ ON | OFF * @param RetainUntilDate __string__ UTC Date String * @param Mode - */ + */ constructor({ - Bucket = '', - Object = '', - Encryption = null, - UserMetadata = null, - UserTags = null, + Bucket="", + Object="", + Encryption=null, + UserMetadata=null, + UserTags=null, LegalHold = null, - RetainUntilDate = null, - Mode = null, // + RetainUntilDate=null, + Mode=null, // }) { - this.Bucket = Bucket - this.Object = Object - this.Encryption = Encryption - this.UserMetadata = UserMetadata - this.UserTags = UserTags + this.Bucket=Bucket + this.Object=Object + this.Encryption=Encryption + this.UserMetadata=UserMetadata + this.UserTags=UserTags this.LegalHold = LegalHold - this.Mode = Mode // retention mode - this.RetainUntilDate = RetainUntilDate + this.Mode=Mode // retention mode + this.RetainUntilDate=RetainUntilDate } - getHeaders() { - const replaceDirective = 'REPLACE' - const headerOptions = {} + getHeaders (){ + const replaceDirective = "REPLACE" + const headerOptions ={} - const userTags = this.UserTags + const userTags= this.UserTags if (!_.isEmpty(userTags)) { - headerOptions['X-Amz-Tagging-Directive'] = replaceDirective - headerOptions['X-Amz-Tagging'] = isObject(userTags) - ? querystring.stringify(userTags) - : isString(userTags) - ? userTags - : '' + headerOptions["X-Amz-Tagging-Directive"]=replaceDirective + headerOptions["X-Amz-Tagging"]=isObject(userTags)? querystring.stringify(userTags):isString(userTags)?userTags:"" } if (!_.isEmpty(this.Mode)) { - headerOptions['X-Amz-Object-Lock-Mode'] = this.Mode // GOVERNANCE or COMPLIANCE + headerOptions["X-Amz-Object-Lock-Mode"]=this.Mode // GOVERNANCE or COMPLIANCE } if (!_.isEmpty(this.RetainUntilDate)) { - headerOptions['X-Amz-Object-Lock-Retain-Until-Date'] = this.RetainUntilDate // needs to be UTC. + headerOptions["X-Amz-Object-Lock-Retain-Until-Date"]=this.RetainUntilDate// needs to be UTC. } - if (!_.isEmpty(this.LegalHold)) { - headerOptions['X-Amz-Object-Lock-Legal-Hold'] = this.LegalHold // ON or OFF + if (!_.isEmpty(this.LegalHold) ){ + headerOptions["X-Amz-Object-Lock-Legal-Hold"]= this.LegalHold// ON or OFF } - if (!_.isEmpty(this.UserMetadata)) { + if(!_.isEmpty(this.UserMetadata)){ const headerKeys = Object.keys(this.UserMetadata) - headerKeys.forEach((key) => { - headerOptions[`X-Amz-Meta-${key}`] = this.UserMetadata[key] + headerKeys.forEach((key)=>{ + headerOptions[`X-Amz-Meta-${key}`]=this.UserMetadata[key] }) + } - if (!_.isEmpty(this.Encryption)) { + if (!_.isEmpty(this.Encryption)){ const encryptionHeaders = getEncryptionHeaders(this.Encryption) - Object.keys(encryptionHeaders).forEach((key) => { - headerOptions[key] = encryptionHeaders[key] + Object.keys(encryptionHeaders).forEach((key)=>{ + headerOptions[key]=encryptionHeaders[key] }) + } return headerOptions } - validate() { + validate(){ if (!isValidBucketName(this.Bucket)) { throw new errors.InvalidBucketNameError('Invalid Destination bucket name: ' + this.Bucket) } if (!isValidObjectName(this.Object)) { throw new errors.InvalidObjectNameError(`Invalid Destination object name: ${this.Object}`) } - if (!_.isEmpty(this.UserMetadata) && !isObject(this.UserMetadata)) { + if(!_.isEmpty(this.UserMetadata) && !isObject(this.UserMetadata)){ throw new errors.InvalidObjectNameError(`Destination UserMetadata should be an object with key value pairs`) } - if (!_.isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)) { - throw new errors.InvalidObjectNameError( - `Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]` - ) + if(!_.isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)){ + throw new errors.InvalidObjectNameError(`Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]`) } - if (!_.isEmpty(this.Encryption) && _.isEmpty(this.Encryption)) { + if (!_.isEmpty(this.Encryption) && _.isEmpty(this.Encryption) ){ throw new errors.InvalidObjectNameError(`Invalid Encryption configuration for destination object `) } return true } } -export const partsRequired = (size) => { - let maxPartSize = PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE / (PART_CONSTRAINTS.MAX_PARTS_COUNT - 1) - let requiredPartSize = size / maxPartSize - if (size % maxPartSize > 0) { +export const partsRequired= (size) =>{ + let maxPartSize =PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE/ (PART_CONSTRAINTS.MAX_PARTS_COUNT - 1) + let requiredPartSize = size /maxPartSize + if ((size % maxPartSize) >0) { requiredPartSize++ } requiredPartSize = Math.trunc(requiredPartSize) @@ -685,7 +684,7 @@ export const partsRequired = (size) => { let startIndexParts = [] let endIndexParts = [] -export function calculateEvenSplits(size, objInfo) { +export function calculateEvenSplits(size , objInfo) { if (size === 0) { return null } @@ -694,49 +693,53 @@ export function calculateEvenSplits(size, objInfo) { endIndexParts = new Array(reqParts) let start = objInfo.Start - if (_.isEmpty(objInfo.Start) || start === -1) { + if (_.isEmpty( objInfo.Start) || start === -1 ){ start = 0 } - const divisorValue = Math.trunc(size / reqParts) + const divisorValue= Math.trunc(size/reqParts) - const reminderValue = size % reqParts + const reminderValue = size%reqParts let nextStart = start - for (let i = 0; i < reqParts; i++) { - let curPartSize = divisorValue - if (i < reminderValue) { + for (let i =0; i < reqParts; i++ ){ + let curPartSize= divisorValue + if (i < reminderValue ){ curPartSize++ } - const currentStart = nextStart + const currentStart =nextStart let currentEnd = currentStart + curPartSize - 1 nextStart = currentEnd + 1 - startIndexParts[i] = currentStart - endIndexParts[i] = currentEnd + startIndexParts[i]= currentStart + endIndexParts[i]=currentEnd } - return { startIndex: startIndexParts, endIndex: endIndexParts, objInfo: objInfo } + return {startIndex:startIndexParts, endIndex:endIndexParts, objInfo:objInfo} + } + + export function removeDirAndFiles(dirPath, removeSelf) { - if (removeSelf === undefined) removeSelf = true - try { - var files = fs.readdirSync(dirPath) - } catch (e) { - return - } + if (removeSelf === undefined) + removeSelf = true + try { var files = fs.readdirSync(dirPath) } + catch(e) { return } if (files.length > 0) for (var i = 0; i < files.length; i++) { var filePath = path.join(dirPath, files[i]) - if (fs.statSync(filePath).isFile()) fs.unlinkSync(filePath) - else removeDirAndFiles(filePath) + if (fs.statSync(filePath).isFile()) + fs.unlinkSync(filePath) + else + removeDirAndFiles(filePath) } - if (removeSelf) fs.rmdirSync(dirPath) + if (removeSelf) + fs.rmdirSync(dirPath) } -export const parseXml = (xml) => { +export const parseXml = (xml) => { let result = null result = fxp.parse(xml) if (result.Error) { @@ -749,44 +752,46 @@ export const parseXml = (xml) => { export class SelectResults { constructor({ records, // parsed data as stream - response, // original response stream + response,// original response stream stats, // stats as xml - progress, // stats as xml + progress // stats as xml }) { - this.records = records + + this.records= records this.response = response - this.stats = stats + this.stats= stats this.progress = progress } - setStats(stats) { + setStats(stats){ this.stats = stats } - getStats() { + getStats () { return this.stats } - setProgress(progress) { + setProgress(progress){ this.progress = progress } - getProgress() { + getProgress (){ return this.progress } - setResponse(response) { + setResponse(response){ this.response = response } - getResponse() { + getResponse (){ return this.response } - setRecords(records) { + setRecords(records){ this.records = records } - getRecords() { + getRecords(){ return this.records } + } export const DEFAULT_REGION = 'us-east-1' diff --git a/src/main/minio.js b/src/main/minio.js index f5869865..c5edfcb8 100644 --- a/src/main/minio.js +++ b/src/main/minio.js @@ -14,77 +14,58 @@ * limitations under the License. */ -import async from 'async' -import BlockStream2 from 'block-stream2' import fs from 'fs' import Http from 'http' import Https from 'https' -import _ from 'lodash' -import mkdirp from 'mkdirp' -import path from 'path' -import querystring from 'query-string' import Stream from 'stream' -import { TextEncoder } from 'web-encoding' +import BlockStream2 from 'block-stream2' import Xml from 'xml' import xml2js from 'xml2js' +import async from 'async' +import querystring from 'query-string' +import mkdirp from 'mkdirp' +import path from 'path' +import _ from 'lodash' +import { TextEncoder } from "web-encoding" -import CredentialProvider from './CredentialProvider' -import * as errors from './errors' -import extensions from './extensions' import { - calculateEvenSplits, - CopyDestinationOptions, - CopySourceOptions, - DEFAULT_REGION, - extractMetadata, - getScope, - getSourceVersionId, - getVersionId, - insertContentType, - isAmazonEndpoint, - isArray, - isBoolean, - isFunction, - isNumber, - isObject, - isReadableStream, - isString, - isValidBucketName, - isValidDate, - isValidEndpoint, - isValidObjectName, - isValidPort, - isValidPrefix, - isVirtualHostStyle, - LEGAL_HOLD_STATUS, - makeDateLong, + extractMetadata, prependXAMZMeta, isValidPrefix, isValidEndpoint, isValidBucketName, + isValidPort, isValidObjectName, isAmazonEndpoint, getScope, + uriEscape, uriResourceEscape, isBoolean, isFunction, isNumber, + isString, isObject, isArray, isValidDate, pipesetup, + readableStream, isReadableStream, isVirtualHostStyle, + insertContentType, makeDateLong, promisify, getVersionId, sanitizeETag, + toMd5, toSha256, + RETENTION_MODES, RETENTION_VALIDITY_UNITS, + LEGAL_HOLD_STATUS, CopySourceOptions, CopyDestinationOptions, getSourceVersionId, PART_CONSTRAINTS, partsRequired, - pipesetup, - prependXAMZMeta, - promisify, - readableStream, - RETENTION_MODES, - RETENTION_VALIDITY_UNITS, - sanitizeETag, - toMd5, - toSha256, - uriEscape, - uriResourceEscape, -} from './helpers' -import { NotificationConfig, NotificationPoller } from './notification' + calculateEvenSplits, + DEFAULT_REGION +} from './helpers.js' + +import { signV4, presignSignatureV4, postPresignSignatureV4 } from './signing.js' + import ObjectUploader from './object-uploader' -import { getS3Endpoint } from './s3-endpoints' -import { postPresignSignatureV4, presignSignatureV4, signV4 } from './signing' + import * as transformers from './transformers' -import { parseSelectObjectContentResponse } from './xml-parsers' -var Package = require('../../package') +import * as errors from './errors.js' + +import { getS3Endpoint } from './s3-endpoints.js' + +import { NotificationConfig, NotificationPoller } from './notification' + +import extensions from './extensions' +import CredentialProvider from "./CredentialProvider" + +import { parseSelectObjectContentResponse} from "./xml-parsers" + +var Package = require('../../package.json') export class Client { constructor(params) { - if (typeof params.secure !== 'undefined') - throw new Error('"secure" option deprecated, "useSSL" should be used instead') + if (typeof params.secure !== 'undefined') throw new Error('"secure" option deprecated, "useSSL" should be used instead') // Default values if not specified. if (typeof params.useSSL === 'undefined') params.useSSL = true if (!params.port) params.port = 0 @@ -96,9 +77,7 @@ export class Client { throw new errors.InvalidArgumentError(`Invalid port : ${params.port}`) } if (!isBoolean(params.useSSL)) { - throw new errors.InvalidArgumentError( - `Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"` - ) + throw new errors.InvalidArgumentError(`Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"`) } // Validate region only if its set. @@ -132,9 +111,7 @@ export class Client { // if custom transport is set, use it. if (params.transport) { if (!isObject(params.transport)) { - throw new errors.InvalidArgumentError( - 'Invalid transport type : ${params.transport}, expected to be type "object"' - ) + throw new errors.InvalidArgumentError('Invalid transport type : ${params.transport}, expected to be type "object"') } transport = params.transport } @@ -168,7 +145,7 @@ export class Client { if (!this.secretKey) this.secretKey = '' this.anonymous = !this.accessKey || !this.secretKey - if (params.credentialsProvider) { + if(params.credentialsProvider) { this.credentialsProvider = params.credentialsProvider this.checkAndRefreshCreds() } @@ -178,35 +155,35 @@ export class Client { this.region = params.region } - this.partSize = 64 * 1024 * 1024 + this.partSize = 64*1024*1024 if (params.partSize) { this.partSize = params.partSize this.overRidePartSize = true } - if (this.partSize < 5 * 1024 * 1024) { + if (this.partSize < 5*1024*1024) { throw new errors.InvalidArgumentError(`Part size should be greater than 5MB`) } - if (this.partSize > 5 * 1024 * 1024 * 1024) { + if (this.partSize > 5*1024*1024*1024) { throw new errors.InvalidArgumentError(`Part size should be less than 5GB`) } - this.maximumPartSize = 5 * 1024 * 1024 * 1024 - this.maxObjectSize = 5 * 1024 * 1024 * 1024 * 1024 + this.maximumPartSize = 5*1024*1024*1024 + this.maxObjectSize = 5*1024*1024*1024*1024 // SHA256 is enabled only for authenticated http requests. If the request is authenticated // and the connection is https we use x-amz-content-sha256=UNSIGNED-PAYLOAD // header for signature calculation. this.enableSHA256 = !this.anonymous && !params.useSSL - this.s3AccelerateEndpoint = params.s3AccelerateEndpoint || null + this.s3AccelerateEndpoint = ( params.s3AccelerateEndpoint || null ) this.reqOptions = {} } // This is s3 Specific and does not hold validity in any other Object storage. - getAccelerateEndPointIfSet(bucketName, objectName) { - if (!_.isEmpty(this.s3AccelerateEndpoint) && !_.isEmpty(bucketName) && !_.isEmpty(objectName)) { + getAccelerateEndPointIfSet(bucketName, objectName){ + if (!_.isEmpty(this.s3AccelerateEndpoint) && !_.isEmpty(bucketName) && !_.isEmpty(objectName) ) { // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html // Disable transfer acceleration for non-compliant bucket names. - if (bucketName.indexOf('.') !== -1) { + if (bucketName.indexOf(".")!== -1) { throw new Error(`Transfer Acceleration is not supported for non compliant bucket:${bucketName}`) } // If transfer acceleration is requested set new host. @@ -214,13 +191,13 @@ export class Client { // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html return this.s3AccelerateEndpoint } - return false + return false } /** * @param endPoint _string_ valid S3 acceleration end point */ - setS3TransferAccelerate(endPoint) { + setS3TransferAccelerate(endPoint){ this.s3AccelerateEndpoint = endPoint } @@ -229,26 +206,7 @@ export class Client { if (!isObject(options)) { throw new TypeError('request options should be of type "object"') } - this.reqOptions = _.pick(options, [ - 'agent', - 'ca', - 'cert', - 'ciphers', - 'clientCertEngine', - 'crl', - 'dhparam', - 'ecdhCurve', - 'family', - 'honorCipherOrder', - 'key', - 'passphrase', - 'pfx', - 'rejectUnauthorized', - 'secureOptions', - 'secureProtocol', - 'servername', - 'sessionIdContext', - ]) + this.reqOptions = _.pick(options, ['agent', 'ca', 'cert', 'ciphers', 'clientCertEngine', 'crl', 'dhparam', 'ecdhCurve', 'family', 'honorCipherOrder', 'key', 'passphrase', 'pfx', 'rejectUnauthorized', 'secureOptions', 'secureProtocol', 'servername', 'sessionIdContext']) } // returns *options* object that can be used with http.request() @@ -261,7 +219,7 @@ export class Client { var headers = opts.headers var query = opts.query - var reqOptions = { method } + var reqOptions = {method} reqOptions.headers = {} // Verify if virtual host supported. @@ -284,9 +242,9 @@ export class Client { // For Amazon S3 endpoint, get endpoint based on region. if (isAmazonEndpoint(reqOptions.host)) { const accelerateEndPoint = this.getAccelerateEndPointIfSet(bucketName, objectName) - if (accelerateEndPoint) { + if (accelerateEndPoint ) { reqOptions.host = `${accelerateEndPoint}` - } else { + }else { reqOptions.host = getS3Endpoint(region) } } @@ -309,16 +267,14 @@ export class Client { if (query) reqOptions.path += `?${query}` reqOptions.headers.host = reqOptions.host - if ( - (reqOptions.protocol === 'http:' && reqOptions.port !== 80) || - (reqOptions.protocol === 'https:' && reqOptions.port !== 443) - ) { + if ((reqOptions.protocol === 'http:' && reqOptions.port !== 80) || + (reqOptions.protocol === 'https:' && reqOptions.port !== 443)) { reqOptions.headers.host = `${reqOptions.host}:${reqOptions.port}` } reqOptions.headers['user-agent'] = this.userAgent if (headers) { // have all header keys in lower case - to make signing easy - _.map(headers, (v, k) => (reqOptions.headers[k.toLowerCase()] = v)) + _.map(headers, (v, k) => reqOptions.headers[k.toLowerCase()] = v) } // Use any request option specified in minioClient.setRequestOptions() @@ -364,14 +320,13 @@ export class Client { return this.partSize } var partSize = this.partSize - for (;;) { - // while(true) {...} throws linting error. + for (;;) { // while(true) {...} throws linting error. // If partSize is big enough to accomodate the object size, then use it. - if (partSize * 10000 > size) { + if ((partSize * 10000) > size) { return partSize } // Try part sizes as 64MB, 80MB, 96MB etc. - partSize += 16 * 1024 * 1024 + partSize += 16*1024*1024 } } @@ -436,7 +391,7 @@ export class Client { // Buffer is of type 'object' throw new TypeError('payload should be of type "string" or "Buffer"') } - statusCodes.forEach((statusCode) => { + statusCodes.forEach(statusCode => { if (!isNumber(statusCode)) { throw new TypeError('statusCode should be of type "number"') } @@ -447,7 +402,7 @@ export class Client { if (!isBoolean(returnResponse)) { throw new TypeError('returnResponse should be of type "boolean"') } - if (!isFunction(cb)) { + if(!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } if (!options.headers) options.headers = {} @@ -472,7 +427,7 @@ export class Client { if (!isString(sha256sum)) { throw new TypeError('sha256sum should be of type "string"') } - statusCodes.forEach((statusCode) => { + statusCodes.forEach(statusCode => { if (!isNumber(statusCode)) { throw new TypeError('statusCode should be of type "number"') } @@ -483,7 +438,7 @@ export class Client { if (!isBoolean(returnResponse)) { throw new TypeError('returnResponse should be of type "boolean"') } - if (!isFunction(cb)) { + if(!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } @@ -516,29 +471,30 @@ export class Client { var authorization = signV4(reqOptions, this.accessKey, this.secretKey, region, date) reqOptions.headers.authorization = authorization } - var req = this.transport.request(reqOptions, (response) => { + var req = this.transport.request(reqOptions, response => { if (!statusCodes.includes(response.statusCode)) { // For an incorrect region, S3 server always sends back 400. // But we will do cache invalidation for all errors so that, // in future, if AWS S3 decides to send a different status code or // XML error code we will still work fine. - delete this.regionMap[options.bucketName] + delete(this.regionMap[options.bucketName]) var errorTransformer = transformers.getErrorTransformer(response) - pipesetup(response, errorTransformer).on('error', (e) => { - this.logHTTP(reqOptions, response, e) - cb(e) - }) + pipesetup(response, errorTransformer) + .on('error', e => { + this.logHTTP(reqOptions, response, e) + cb(e) + }) return } this.logHTTP(reqOptions, response) if (returnResponse) return cb(null, response) // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. - response.on('data', () => {}) + response.on('data', ()=>{}) cb(null) }) let pipe = pipesetup(stream, req) - pipe.on('error', (e) => { + pipe.on('error', e => { this.logHTTP(reqOptions, null, e) cb(e) }) @@ -565,7 +521,7 @@ export class Client { var region = DEFAULT_REGION pipesetup(response, transformer) .on('error', cb) - .on('data', (data) => { + .on('data', data => { if (data) region = data }) .on('end', () => { @@ -590,12 +546,12 @@ export class Client { // obtained region. var pathStyle = this.pathStyle && typeof window === 'undefined' - this.makeRequest({ method, bucketName, query, pathStyle }, '', [200], DEFAULT_REGION, true, (e, response) => { + this.makeRequest({method, bucketName, query, pathStyle}, '', [200], DEFAULT_REGION, true, (e, response) => { if (e) { if (e.name === 'AuthorizationHeaderMalformed') { var region = e.Region if (!region) return cb(e) - this.makeRequest({ method, bucketName, query }, '', [200], region, true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], region, true, (e, response) => { if (e) return cb(e) extractRegion(response) }) @@ -614,24 +570,24 @@ export class Client { // * `region` _string_ - region valid values are _us-west-1_, _us-west-2_, _eu-west-1_, _eu-central-1_, _ap-southeast-1_, _ap-northeast-1_, _ap-southeast-2_, _sa-east-1_. // * `makeOpts` _object_ - Options to create a bucket. e.g {ObjectLocking:true} (Optional) // * `callback(err)` _function_ - callback function with `err` as the error argument. `err` is null if the bucket is successfully created. - makeBucket(bucketName, region, makeOpts = {}, cb) { + makeBucket(bucketName, region, makeOpts={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } // Backward Compatibility - if (isObject(region)) { - cb = makeOpts - makeOpts = region + if(isObject(region)){ + cb= makeOpts + makeOpts=region region = '' } if (isFunction(region)) { cb = region region = '' - makeOpts = {} + makeOpts={} } - if (isFunction(makeOpts)) { - cb = makeOpts - makeOpts = {} + if(isFunction(makeOpts)){ + cb=makeOpts + makeOpts={} } if (!isString(region)) { @@ -659,38 +615,38 @@ export class Client { var createBucketConfiguration = [] createBucketConfiguration.push({ _attr: { - xmlns: 'http://s3.amazonaws.com/doc/2006-03-01/', - }, + xmlns: 'http://s3.amazonaws.com/doc/2006-03-01/' + } }) createBucketConfiguration.push({ - LocationConstraint: region, + LocationConstraint: region }) var payloadObject = { - CreateBucketConfiguration: createBucketConfiguration, + CreateBucketConfiguration: createBucketConfiguration } payload = Xml(payloadObject) } var method = 'PUT' var headers = {} - if (makeOpts.ObjectLocking) { - headers['x-amz-bucket-object-lock-enabled'] = true + if(makeOpts.ObjectLocking){ + headers["x-amz-bucket-object-lock-enabled"]=true } if (!region) region = DEFAULT_REGION - const processWithRetry = (err) => { - if (err && (region === '' || region === DEFAULT_REGION)) { - if (err.code === 'AuthorizationHeaderMalformed' && err.region !== '') { + const processWithRetry = (err) =>{ + if (err && (region === "" || region === DEFAULT_REGION)) { + if(err.code === "AuthorizationHeaderMalformed" && err.region !== ""){ // Retry with region returned as part of error - this.makeRequest({ method, bucketName, headers }, payload, [200], err.region, false, cb) + this.makeRequest({method, bucketName, headers}, payload, [200], err.region, false, cb) } else { return cb && cb(err) } } return cb && cb(err) } - this.makeRequest({ method, bucketName, headers }, payload, [200], region, false, processWithRetry) + this.makeRequest({method, bucketName, headers}, payload, [200], region, false, processWithRetry) } // List of buckets created. @@ -706,13 +662,13 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'GET' - this.makeRequest({ method }, '', [200], DEFAULT_REGION, true, (e, response) => { + this.makeRequest({method}, '', [200], DEFAULT_REGION, true, (e, response) => { if (e) return cb(e) var transformer = transformers.getListBucketTransformer() var buckets pipesetup(response, transformer) - .on('data', (result) => (buckets = result)) - .on('error', (e) => cb(e)) + .on('data', result => buckets = result) + .on('error', e => cb(e)) .on('end', () => cb(null, buckets)) }) } @@ -746,7 +702,7 @@ export class Client { var uploadIdMarker = '' var uploads = [] var ended = false - var readStream = Stream.Readable({ objectMode: true }) + var readStream = Stream.Readable({objectMode: true}) readStream._read = () => { // push one upload info per _read() if (uploads.length) { @@ -754,34 +710,30 @@ export class Client { } if (ended) return readStream.push(null) this.listIncompleteUploadsQuery(bucket, prefix, keyMarker, uploadIdMarker, delimiter) - .on('error', (e) => readStream.emit('error', e)) - .on('data', (result) => { - result.prefixes.forEach((prefix) => uploads.push(prefix)) - async.eachSeries( - result.uploads, - (upload, cb) => { - // for each incomplete upload add the sizes of its uploaded parts - this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { - if (err) return cb(err) - upload.size = parts.reduce((acc, item) => acc + item.size, 0) - uploads.push(upload) - cb() - }) - }, - (err) => { - if (err) { - readStream.emit('error', err) - return - } - if (result.isTruncated) { - keyMarker = result.nextKeyMarker - uploadIdMarker = result.nextUploadIdMarker - } else { - ended = true - } - readStream._read() + .on('error', e => readStream.emit('error', e)) + .on('data', result => { + result.prefixes.forEach(prefix => uploads.push(prefix)) + async.eachSeries(result.uploads, (upload, cb) => { + // for each incomplete upload add the sizes of its uploaded parts + this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { + if (err) return cb(err) + upload.size = parts.reduce((acc, item) => acc + item.size, 0) + uploads.push(upload) + cb() + }) + }, err => { + if (err) { + readStream.emit('error', err) + return } - ) + if (result.isTruncated) { + keyMarker = result.nextKeyMarker + uploadIdMarker = result.nextUploadIdMarker + } else { + ended = true + } + readStream._read() + }) }) } return readStream @@ -800,7 +752,7 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'HEAD' - this.makeRequest({ method, bucketName }, '', [200], '', false, (err) => { + this.makeRequest({method, bucketName}, '', [200], '', false, err => { if (err) { if (err.code == 'NoSuchBucket' || err.code == 'NotFound') return cb(null, false) return cb(err) @@ -822,9 +774,9 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'DELETE' - this.makeRequest({ method, bucketName }, '', [204], '', false, (e) => { + this.makeRequest({method, bucketName}, '', [204], '', false, (e) => { // If the bucket was successfully removed, remove the region map entry. - if (!e) delete this.regionMap[bucketName] + if (!e) delete(this.regionMap[bucketName]) cb(e) }) } @@ -847,17 +799,17 @@ export class Client { } var removeUploadId async.during( - (cb) => { + cb => { this.findUploadId(bucketName, objectName, (e, uploadId) => { if (e) return cb(e) removeUploadId = uploadId cb(null, uploadId) }) }, - (cb) => { + cb => { var method = 'DELETE' var query = `uploadId=${removeUploadId}` - this.makeRequest({ method, bucketName, objectName, query }, '', [204], '', false, (e) => cb(e)) + this.makeRequest({method, bucketName, objectName, query}, '', [204], '', false, e => cb(e)) }, cb ) @@ -871,7 +823,7 @@ export class Client { // * `filePath` _string_: path to which the object data will be written to // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err)` _function_: callback is called with `err` in case of error. - fGetObject(bucketName, objectName, filePath, getOpts = {}, cb) { + fGetObject(bucketName, objectName, filePath, getOpts={}, cb) { // Input validation. if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) @@ -898,46 +850,43 @@ export class Client { var objStat // Rename wrapper. - var rename = (err) => { + var rename = err => { if (err) return cb(err) fs.rename(partFile, filePath, cb) } - async.waterfall( - [ - (cb) => this.statObject(bucketName, objectName, getOpts, cb), - (result, cb) => { - objStat = result - // Create any missing top level directories. - mkdirp(path.dirname(filePath), cb) - }, - (ignore, cb) => { - partFile = `${filePath}.${objStat.etag}.part.minio` - fs.stat(partFile, (e, stats) => { - var offset = 0 - if (e) { - partFileStream = fs.createWriteStream(partFile, { flags: 'w' }) - } else { - if (objStat.size === stats.size) return rename() - offset = stats.size - partFileStream = fs.createWriteStream(partFile, { flags: 'a' }) - } - this.getPartialObject(bucketName, objectName, offset, 0, getOpts, cb) - }) - }, - (downloadStream, cb) => { - pipesetup(downloadStream, partFileStream) - .on('error', (e) => cb(e)) - .on('finish', cb) - }, - (cb) => fs.stat(partFile, cb), - (stats, cb) => { - if (stats.size === objStat.size) return cb() - cb(new Error('Size mismatch between downloaded file and the object')) - }, - ], - rename - ) + async.waterfall([ + cb => this.statObject(bucketName, objectName, getOpts, cb), + (result, cb) => { + objStat = result + // Create any missing top level directories. + mkdirp(path.dirname(filePath), cb) + }, + (ignore, cb) => { + partFile = `${filePath}.${objStat.etag}.part.minio` + fs.stat(partFile, (e, stats) => { + var offset = 0 + if (e) { + partFileStream = fs.createWriteStream(partFile, {flags: 'w'}) + } else { + if (objStat.size === stats.size) return rename() + offset = stats.size + partFileStream = fs.createWriteStream(partFile, {flags: 'a'}) + } + this.getPartialObject(bucketName, objectName, offset, 0, getOpts, cb) + }) + }, + (downloadStream, cb) => { + pipesetup(downloadStream, partFileStream) + .on('error', e => cb(e)) + .on('finish', cb) + }, + cb => fs.stat(partFile, cb), + (stats, cb) => { + if (stats.size === objStat.size) return cb() + cb(new Error('Size mismatch between downloaded file and the object')) + } + ], rename) } // Callback is called with readable stream of the object content. @@ -947,7 +896,7 @@ export class Client { // * `objectName` _string_: name of the object // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err, stream)` _function_: callback is called with `err` in case of error. `stream` is the object content stream - getObject(bucketName, objectName, getOpts = {}, cb) { + getObject(bucketName, objectName, getOpts={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -975,7 +924,7 @@ export class Client { // * `length` _number_: length of the object that will be read in the stream (optional, if not specified we read the rest of the file from the offset) // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err, stream)` _function_: callback is called with `err` in case of error. `stream` is the object content stream - getPartialObject(bucketName, objectName, offset, length, getOpts = {}, cb) { + getPartialObject(bucketName, objectName, offset, length, getOpts={}, cb) { if (isFunction(length)) { cb = length length = 0 @@ -1011,7 +960,7 @@ export class Client { offset = 0 } if (length) { - range += `${+length + offset - 1}` + range += `${(+length + offset) - 1}` } } @@ -1027,7 +976,7 @@ export class Client { var method = 'GET' var query = querystring.stringify(getOpts) - this.makeRequest({ method, bucketName, objectName, headers, query }, '', expectedStatusCodes, '', true, cb) + this.makeRequest({method, bucketName, objectName, headers, query}, '', expectedStatusCodes, '', true, cb) } // Uploads the object using contents from a file @@ -1065,130 +1014,126 @@ export class Client { var size var partSize - async.waterfall( - [ - (cb) => fs.stat(filePath, cb), - (stats, cb) => { - size = stats.size - var cbTriggered = false - var origCb = cb - cb = function () { - if (cbTriggered) { - return - } - cbTriggered = true - return origCb.apply(this, arguments) + async.waterfall([ + cb => fs.stat(filePath, cb), + (stats, cb) => { + size = stats.size + var cbTriggered = false + var origCb = cb + cb = function () { + if (cbTriggered) { + return } - if (size > this.maxObjectSize) { - return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)) + cbTriggered = true + return origCb.apply(this, arguments) + } + if (size > this.maxObjectSize) { + return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)) + } + if (size <= this.partSize) { + // simple PUT request, no multipart + var multipart = false + var uploader = this.getUploader(bucketName, objectName, metaData, multipart) + var hash = transformers.getHashSummer(this.enableSHA256) + var start = 0 + var end = size - 1 + var autoClose = true + if (size === 0) end = 0 + var options = {start, end, autoClose} + pipesetup(fs.createReadStream(filePath, options), hash) + .on('data', data => { + var md5sum = data.md5sum + var sha256sum = data.sha256sum + var stream = fs.createReadStream(filePath, options) + uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { + callback(err, objInfo) + cb(true) + }) + }) + .on('error', e => cb(e)) + return + } + this.findUploadId(bucketName, objectName, cb) + }, + (uploadId, cb) => { + // if there was a previous incomplete upload, fetch all its uploaded parts info + if (uploadId) return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) + // there was no previous upload, initiate a new one + this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])) + }, + (uploadId, etags, cb) => { + partSize = this.calculatePartSize(size) + var multipart = true + var uploader = this.getUploader(bucketName, objectName, metaData, multipart) + + // convert array to object to make things easy + var parts = etags.reduce(function(acc, item) { + if (!acc[item.part]) { + acc[item.part] = item } - if (size <= this.partSize) { - // simple PUT request, no multipart - var multipart = false - var uploader = this.getUploader(bucketName, objectName, metaData, multipart) + return acc + }, {}) + var partsDone = [] + var partNumber = 1 + var uploadedSize = 0 + async.whilst( + cb => { cb(null, uploadedSize < size) }, + cb => { + var cbTriggered = false + var origCb = cb + cb = function () { + if (cbTriggered) { + return + } + cbTriggered = true + return origCb.apply(this, arguments) + } + var part = parts[partNumber] var hash = transformers.getHashSummer(this.enableSHA256) - var start = 0 - var end = size - 1 + var length = partSize + if (length > (size - uploadedSize)) { + length = size - uploadedSize + } + var start = uploadedSize + var end = uploadedSize + length - 1 var autoClose = true - if (size === 0) end = 0 - var options = { start, end, autoClose } + var options = {autoClose, start, end} + // verify md5sum of each part pipesetup(fs.createReadStream(filePath, options), hash) - .on('data', (data) => { - var md5sum = data.md5sum - var sha256sum = data.sha256sum + .on('data', data => { + var md5sumHex = (Buffer.from(data.md5sum, 'base64')).toString('hex') + if (part && (md5sumHex === part.etag)) { + // md5 matches, chunk already uploaded + partsDone.push({part: partNumber, etag: part.etag}) + partNumber++ + uploadedSize += length + return cb() + } + // part is not uploaded yet, or md5 mismatch var stream = fs.createReadStream(filePath, options) - uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { - callback(err, objInfo) - cb(true) - }) + uploader(uploadId, partNumber, stream, length, + data.sha256sum, data.md5sum, (e, objInfo) => { + if (e) return cb(e) + partsDone.push({part: partNumber, etag: objInfo.etag}) + partNumber++ + uploadedSize += length + return cb() + }) }) - .on('error', (e) => cb(e)) - return + .on('error', e => cb(e)) + }, + e => { + if (e) return cb(e) + cb(null, partsDone, uploadId) } - this.findUploadId(bucketName, objectName, cb) - }, - (uploadId, cb) => { - // if there was a previous incomplete upload, fetch all its uploaded parts info - if (uploadId) return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) - // there was no previous upload, initiate a new one - this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])) - }, - (uploadId, etags, cb) => { - partSize = this.calculatePartSize(size) - var multipart = true - var uploader = this.getUploader(bucketName, objectName, metaData, multipart) - - // convert array to object to make things easy - var parts = etags.reduce(function (acc, item) { - if (!acc[item.part]) { - acc[item.part] = item - } - return acc - }, {}) - var partsDone = [] - var partNumber = 1 - var uploadedSize = 0 - async.whilst( - (cb) => { - cb(null, uploadedSize < size) - }, - (cb) => { - var cbTriggered = false - var origCb = cb - cb = function () { - if (cbTriggered) { - return - } - cbTriggered = true - return origCb.apply(this, arguments) - } - var part = parts[partNumber] - var hash = transformers.getHashSummer(this.enableSHA256) - var length = partSize - if (length > size - uploadedSize) { - length = size - uploadedSize - } - var start = uploadedSize - var end = uploadedSize + length - 1 - var autoClose = true - var options = { autoClose, start, end } - // verify md5sum of each part - pipesetup(fs.createReadStream(filePath, options), hash) - .on('data', (data) => { - var md5sumHex = Buffer.from(data.md5sum, 'base64').toString('hex') - if (part && md5sumHex === part.etag) { - // md5 matches, chunk already uploaded - partsDone.push({ part: partNumber, etag: part.etag }) - partNumber++ - uploadedSize += length - return cb() - } - // part is not uploaded yet, or md5 mismatch - var stream = fs.createReadStream(filePath, options) - uploader(uploadId, partNumber, stream, length, data.sha256sum, data.md5sum, (e, objInfo) => { - if (e) return cb(e) - partsDone.push({ part: partNumber, etag: objInfo.etag }) - partNumber++ - uploadedSize += length - return cb() - }) - }) - .on('error', (e) => cb(e)) - }, - (e) => { - if (e) return cb(e) - cb(null, partsDone, uploadId) - } - ) - }, - // all parts uploaded, complete the multipart upload - (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb), - ], - (err, ...rest) => { - if (err === true) return - callback(err, ...rest) - } - ) + ) + }, + // all parts uploaded, complete the multipart upload + (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb) + ], (err, ...rest) => { + if (err === true) return + callback(err, ...rest) + }) } // Uploads the object. @@ -1252,14 +1197,15 @@ export class Client { // Get the part size and forward that to the BlockStream. Default to the // largest block size possible if necessary. - if (!isNumber(size)) size = this.maxObjectSize + if (!isNumber(size)) + size = this.maxObjectSize size = this.calculatePartSize(size) // s3 requires that all non-end chunks be at least `this.partSize`, // so we chunk the stream until we hit either that size or the end before // we flush it to s3. - let chunker = new BlockStream2({ size, zeroPadding: false }) + let chunker = new BlockStream2({size, zeroPadding: false}) // This is a Writable stream that can be written to in order to upload // to the specified bucket and object automatically. @@ -1297,7 +1243,7 @@ export class Client { if (!isString(srcObject)) { throw new TypeError('srcObject should be of type "string"') } - if (srcObject === '') { + if (srcObject === "") { throw new errors.InvalidPrefixError(`Empty source prefix`) } @@ -1309,48 +1255,49 @@ export class Client { headers['x-amz-copy-source'] = uriResourceEscape(srcObject) if (conditions !== null) { - if (conditions.modified !== '') { + if (conditions.modified !== "") { headers['x-amz-copy-source-if-modified-since'] = conditions.modified } - if (conditions.unmodified !== '') { + if (conditions.unmodified !== "") { headers['x-amz-copy-source-if-unmodified-since'] = conditions.unmodified } - if (conditions.matchETag !== '') { + if (conditions.matchETag !== "") { headers['x-amz-copy-source-if-match'] = conditions.matchETag } - if (conditions.matchEtagExcept !== '') { + if (conditions.matchEtagExcept !== "") { headers['x-amz-copy-source-if-none-match'] = conditions.matchETagExcept } } var method = 'PUT' - this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, headers}, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) - .on('error', (e) => cb(e)) - .on('data', (data) => cb(null, data)) + .on('error', e => cb(e)) + .on('data', data => cb(null, data)) }) } /** - * Internal Method to perform copy of an object. - * @param sourceConfig __object__ instance of CopySourceOptions @link ./helpers/CopySourceOptions - * @param destConfig __object__ instance of CopyDestinationOptions @link ./helpers/CopyDestinationOptions - * @param cb __function__ called with null if there is an error - * @returns Promise if no callack is passed. - */ - copyObjectV2(sourceConfig, destConfig, cb) { - if (!(sourceConfig instanceof CopySourceOptions)) { + * Internal Method to perform copy of an object. + * @param sourceConfig __object__ instance of CopySourceOptions @link ./helpers/CopySourceOptions + * @param destConfig __object__ instance of CopyDestinationOptions @link ./helpers/CopyDestinationOptions + * @param cb __function__ called with null if there is an error + * @returns Promise if no callack is passed. + */ + copyObjectV2(sourceConfig, destConfig, cb){ + + if(!(sourceConfig instanceof CopySourceOptions )){ throw new errors.InvalidArgumentError('sourceConfig should of type CopySourceOptions ') } - if (!(destConfig instanceof CopyDestinationOptions)) { + if(!(destConfig instanceof CopyDestinationOptions )){ throw new errors.InvalidArgumentError('destConfig should of type CopyDestinationOptions ') } - if (!destConfig.validate()) { + if(!destConfig.validate()){ return false } - if (!destConfig.validate()) { + if(!destConfig.validate()){ return false } if (!isFunction(cb)) { @@ -1359,16 +1306,16 @@ export class Client { const headers = Object.assign({}, sourceConfig.getHeaders(), destConfig.getHeaders()) - const bucketName = destConfig.Bucket - const objectName = destConfig.Object + const bucketName = destConfig.Bucket + const objectName= destConfig.Object const method = 'PUT' - this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, headers}, '', [200], '', true, (e, response) => { if (e) return cb(e) const transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) - .on('error', (e) => cb(e)) - .on('data', (data) => { + .on('error', e => cb(e)) + .on('data', data => { const resHeaders = response.headers const copyObjResponse = { @@ -1376,13 +1323,13 @@ export class Client { Key: destConfig.Object, LastModified: data.LastModified, MetaData: extractMetadata(resHeaders), - VersionId: getVersionId(resHeaders), - SourceVersionId: getSourceVersionId(resHeaders), - Etag: sanitizeETag(resHeaders.etag), - Size: +resHeaders['content-length'], + VersionId:getVersionId(resHeaders), + SourceVersionId:getSourceVersionId(resHeaders), + Etag:sanitizeETag(resHeaders.etag), + Size: +resHeaders['content-length'] } - return cb(null, copyObjResponse) + return cb(null, copyObjResponse) }) }) } @@ -1396,7 +1343,7 @@ export class Client { } // list a batch of objects - listObjectsQuery(bucketName, prefix, marker, listQueryOpts = {}) { + listObjectsQuery(bucketName, prefix, marker, listQueryOpts={}) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1406,7 +1353,11 @@ export class Client { if (!isString(marker)) { throw new TypeError('marker should be of type "string"') } - let { Delimiter, MaxKeys, IncludeVersion } = listQueryOpts + let{ + Delimiter, + MaxKeys, + IncludeVersion, + } = listQueryOpts if (!isObject(listQueryOpts)) { throw new TypeError('listQueryOpts should be of type "object"') @@ -1453,7 +1404,7 @@ export class Client { var method = 'GET' var transformer = transformers.getListObjectsTransformer() - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -1478,7 +1429,7 @@ export class Client { // * `obj.lastModified` _Date_: modified time stamp // * `obj.isDeleteMarker` _boolean_: true if it is a delete marker // * `obj.versionId` _string_: versionId of the object - listObjects(bucketName, prefix, recursive, listOpts = {}) { + listObjects(bucketName, prefix, recursive, listOpts={}) { if (prefix === undefined) prefix = '' if (recursive === undefined) recursive = false if (!isValidBucketName(bucketName)) { @@ -1497,14 +1448,14 @@ export class Client { throw new TypeError('listOpts should be of type "object"') } var marker = '' - const listQueryOpts = { - Delimiter: recursive ? '' : '/', // if recursive is false set delimiter to '/' + const listQueryOpts={ + Delimiter:recursive ? '' : '/', // if recursive is false set delimiter to '/' MaxKeys: 1000, - IncludeVersion: listOpts.IncludeVersion, + IncludeVersion:listOpts.IncludeVersion, } var objects = [] var ended = false - var readStream = Stream.Readable({ objectMode: true }) + var readStream = Stream.Readable({objectMode: true}) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -1514,8 +1465,8 @@ export class Client { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsQuery(bucketName, prefix, marker, listQueryOpts) - .on('error', (e) => readStream.emit('error', e)) - .on('data', (result) => { + .on('error', e => readStream.emit('error', e)) + .on('data', result => { if (result.isTruncated) { marker = result.nextMarker || result.versionIdMarker } else { @@ -1590,7 +1541,7 @@ export class Client { } var method = 'GET' var transformer = transformers.getListObjectsV2Transformer() - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -1636,7 +1587,7 @@ export class Client { var continuationToken = '' var objects = [] var ended = false - var readStream = Stream.Readable({ objectMode: true }) + var readStream = Stream.Readable({objectMode: true}) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -1646,8 +1597,8 @@ export class Client { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsV2Query(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) - .on('error', (e) => readStream.emit('error', e)) - .on('data', (result) => { + .on('error', e => readStream.emit('error', e)) + .on('data', result => { if (result.isTruncated) { continuationToken = result.nextContinuationToken } else { @@ -1672,7 +1623,7 @@ export class Client { // * `stat.metaData` _string_: MetaData of the object // * `stat.lastModified` _Date_: modified time stamp // * `stat.versionId` _string_: version id of the object if available - statObject(bucketName, objectName, statOpts = {}, cb) { + statObject(bucketName, objectName, statOpts={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1682,10 +1633,10 @@ export class Client { // backward compatibility if (isFunction(statOpts)) { cb = statOpts - statOpts = {} + statOpts={} } - if (!isObject(statOpts)) { + if(!isObject(statOpts)){ throw new errors.InvalidArgumentError('statOpts should be of type "object"') } if (!isFunction(cb)) { @@ -1694,19 +1645,19 @@ export class Client { var query = querystring.stringify(statOpts) var method = 'HEAD' - this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, query},'' , [200], '', true, (e, response) => { if (e) return cb(e) // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. - response.on('data', () => {}) + response.on('data', ()=>{}) const result = { size: +response.headers['content-length'], metaData: extractMetadata(response.headers), lastModified: new Date(response.headers['last-modified']), - versionId: getVersionId(response.headers), - etag: sanitizeETag(response.headers.etag), + versionId:getVersionId(response.headers), + etag:sanitizeETag(response.headers.etag) } cb(null, result) @@ -1720,7 +1671,7 @@ export class Client { // * `objectName` _string_: name of the object // * `removeOpts` _object_: Version of the object in the form `{versionId:'my-uuid', governanceBypass:true|false, forceDelete:true|false}`. Default is `{}`. (optional) // * `callback(err)` _function_: callback function is called with non `null` value in case of error - removeObject(bucketName, objectName, removeOpts = {}, cb) { + removeObject(bucketName, objectName, removeOpts={} , cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1730,10 +1681,10 @@ export class Client { // backward compatibility if (isFunction(removeOpts)) { cb = removeOpts - removeOpts = {} + removeOpts={} } - if (!isObject(removeOpts)) { + if(!isObject(removeOpts)){ throw new errors.InvalidArgumentError('removeOpts should be of type "object"') } if (!isFunction(cb)) { @@ -1742,22 +1693,22 @@ export class Client { const method = 'DELETE' const queryParams = {} - if (removeOpts.versionId) { - queryParams.versionId = `${removeOpts.versionId}` + if(removeOpts.versionId){ + queryParams.versionId=`${removeOpts.versionId}` } const headers = {} - if (removeOpts.governanceBypass) { - headers['X-Amz-Bypass-Governance-Retention'] = true + if(removeOpts.governanceBypass){ + headers["X-Amz-Bypass-Governance-Retention"]=true } - if (removeOpts.forceDelete) { - headers['x-minio-force-delete'] = true + if(removeOpts.forceDelete){ + headers["x-minio-force-delete"]=true } - const query = querystring.stringify(queryParams) + const query = querystring.stringify( queryParams ) - let requestOptions = { method, bucketName, objectName, headers } - if (query) { - requestOptions['query'] = query + let requestOptions = {method, bucketName, objectName, headers} + if(query){ + requestOptions['query']=query } this.makeRequest(requestOptions, '', [200, 204], '', false, cb) @@ -1786,17 +1737,14 @@ export class Client { const query = 'delete' const method = 'POST' - let result = objectsList.reduce( - (result, entry) => { - result.list.push(entry) - if (result.list.length === maxEntries) { - result.listOfList.push(result.list) - result.list = [] - } - return result - }, - { listOfList: [], list: [] } - ) + let result = objectsList.reduce((result, entry) => { + result.list.push(entry) + if (result.list.length === maxEntries) { + result.listOfList.push(result.list) + result.list = [] + } + return result + }, {listOfList: [], list:[]}) if (result.list.length > 0) { result.listOfList.push(result.list) @@ -1804,42 +1752,39 @@ export class Client { const encoder = new TextEncoder() - async.eachSeries( - result.listOfList, - (list) => { - var objects = [] - list.forEach(function (value) { - if (isObject(value)) { - objects.push({ Key: value.name, VersionId: value.versionId }) - } else { - objects.push({ Key: value }) - } - }) - let deleteObjects = { Delete: { Quiet: true, Object: objects } } - const builder = new xml2js.Builder({ headless: true }) - let payload = builder.buildObject(deleteObjects) - payload = encoder.encode(payload) - const headers = {} - - headers['Content-MD5'] = toMd5(payload) - - this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', true, (e, response) => { - if (e) return cb(e) - let removeObjectsResult - pipesetup(response, transformers.removeObjectsTransformer()) - .on('data', (data) => { - removeObjectsResult = data - }) - .on('error', cb) - .on('end', () => { - cb(null, removeObjectsResult) - }) - }) - }, - cb - ) + async.eachSeries(result.listOfList, (list) => { + var objects=[] + list.forEach(function(value){ + if (isObject(value)) { + objects.push({"Key": value.name, "VersionId": value.versionId}) + } else { + objects.push({"Key": value}) + } + }) + let deleteObjects = {"Delete": {"Quiet": true, "Object": objects}} + const builder = new xml2js.Builder({ headless: true }) + let payload = builder.buildObject(deleteObjects) + payload = encoder.encode(payload) + const headers = {} + + headers['Content-MD5'] = toMd5(payload) + + this.makeRequest({ method, bucketName, query, headers}, payload, [200], '', true, (e, response) => { + if (e) return cb(e) + let removeObjectsResult + pipesetup(response, transformers.removeObjectsTransformer()) + .on('data', data => { + removeObjectsResult = data + }) + .on('error', cb) + .on('end', () => { + cb(null, removeObjectsResult) + }) + }) + }, cb) } + // Get the policy on a bucket or an object prefix. // // __Arguments__ @@ -1856,12 +1801,12 @@ export class Client { let method = 'GET' let query = 'policy' - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let policy = Buffer.from('') pipesetup(response, transformers.getConcater()) - .on('data', (data) => (policy = data)) + .on('data', data => policy = data) .on('error', cb) .on('end', () => { cb(null, policy.toString()) @@ -1894,7 +1839,7 @@ export class Client { method = 'PUT' } - this.makeRequest({ method, bucketName, query }, policy, [204], '', false, cb) + this.makeRequest({method, bucketName, query}, policy, [204], '', false, cb) } // Generate a generic presigned URL which can be @@ -1944,19 +1889,16 @@ export class Client { // This statement is added to ensure that we send error through // callback on presign failure. var url - var reqOptions = this.getRequestOptions({ method, region, bucketName, objectName, query }) + var reqOptions = this.getRequestOptions({method, + region, + bucketName, + objectName, + query}) this.checkAndRefreshCreds() try { - url = presignSignatureV4( - reqOptions, - this.accessKey, - this.secretKey, - this.sessionToken, - region, - requestDate, - expires - ) + url = presignSignatureV4(reqOptions, this.accessKey, this.secretKey, + this.sessionToken, region, requestDate, expires) } catch (pe) { return cb(pe) } @@ -1986,16 +1928,10 @@ export class Client { requestDate = new Date() } - var validRespHeaders = [ - 'response-content-type', - 'response-content-language', - 'response-expires', - 'response-cache-control', - 'response-content-disposition', - 'response-content-encoding', - ] - validRespHeaders.forEach((header) => { - if (respHeaders !== undefined && respHeaders[header] !== undefined && !isString(respHeaders[header])) { + var validRespHeaders = ['response-content-type', 'response-content-language', 'response-expires', 'response-cache-control', + 'response-content-disposition', 'response-content-encoding'] + validRespHeaders.forEach(header => { + if (respHeaders !== undefined && respHeaders[header] !== undefined && !isString(respHeaders[header])) { throw new TypeError(`response header ${header} should be of type "string"`) } }) @@ -2057,8 +1993,8 @@ export class Client { postPolicy.policy.conditions.push(['eq', '$x-amz-algorithm', 'AWS4-HMAC-SHA256']) postPolicy.formData['x-amz-algorithm'] = 'AWS4-HMAC-SHA256' - postPolicy.policy.conditions.push(['eq', '$x-amz-credential', this.accessKey + '/' + getScope(region, date)]) - postPolicy.formData['x-amz-credential'] = this.accessKey + '/' + getScope(region, date) + postPolicy.policy.conditions.push(["eq", "$x-amz-credential", this.accessKey + "/" + getScope(region, date)]) + postPolicy.formData['x-amz-credential'] = this.accessKey + "/" + getScope(region, date) if (this.sessionToken) { postPolicy.policy.conditions.push(['eq', '$x-amz-security-token', this.sessionToken]) @@ -2076,9 +2012,9 @@ export class Client { opts.region = region opts.bucketName = postPolicy.formData.bucket var reqOptions = this.getRequestOptions(opts) - var portStr = this.port == 80 || this.port === 443 ? '' : `:${this.port.toString()}` + var portStr = (this.port == 80 || this.port === 443) ? '' : `:${this.port.toString()}` var urlStr = `${reqOptions.protocol}//${reqOptions.host}${portStr}${reqOptions.path}` - cb(null, { postURL: urlStr, formData: postPolicy.formData }) + cb(null, {postURL: urlStr,formData: postPolicy.formData}) }) } @@ -2098,12 +2034,12 @@ export class Client { var method = 'POST' let headers = Object.assign({}, metaData) var query = 'uploads' - this.makeRequest({ method, bucketName, objectName, query, headers }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, query, headers}, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getInitiateMultipartTransformer() pipesetup(response, transformer) - .on('error', (e) => cb(e)) - .on('data', (uploadId) => cb(null, uploadId)) + .on('error', e => cb(e)) + .on('data', uploadId => cb(null, uploadId)) }) } @@ -2135,35 +2071,32 @@ export class Client { var parts = [] - etags.forEach((element) => { + etags.forEach(element => { parts.push({ - Part: [ - { - PartNumber: element.part, - }, - { - ETag: element.etag, - }, - ], + Part: [{ + PartNumber: element.part + }, { + ETag: element.etag + }] }) }) - var payloadObject = { CompleteMultipartUpload: parts } + var payloadObject = {CompleteMultipartUpload: parts} var payload = Xml(payloadObject) - this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, query}, payload, [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getCompleteMultipartTransformer() pipesetup(response, transformer) - .on('error', (e) => cb(e)) - .on('data', (result) => { + .on('error', e => cb(e)) + .on('data', result => { if (result.errCode) { // Multipart Complete API returns an error XML after a 200 http status cb(new errors.S3Error(result.errMessage)) } else { const completeMultipartResult = { etag: result.etag, - versionId: getVersionId(response.headers), + versionId:getVersionId(response.headers) } cb(null, completeMultipartResult) } @@ -2230,12 +2163,12 @@ export class Client { query += `uploadId=${uriEscape(uploadId)}` var method = 'GET' - this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getListPartsTransformer() pipesetup(response, transformer) - .on('error', (e) => cb(e)) - .on('data', (data) => cb(null, data)) + .on('error', e => cb(e)) + .on('data', data => cb(null, data)) }) } @@ -2278,7 +2211,7 @@ export class Client { } var method = 'GET' var transformer = transformers.getListMultipartTransformer() - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -2299,11 +2232,12 @@ export class Client { var latestUpload var listNext = (keyMarker, uploadIdMarker) => { this.listIncompleteUploadsQuery(bucketName, objectName, keyMarker, uploadIdMarker, '') - .on('error', (e) => cb(e)) - .on('data', (result) => { - result.uploads.forEach((upload) => { + .on('error', e => cb(e)) + .on('data', result => { + result.uploads.forEach(upload => { if (upload.key === objectName) { - if (!latestUpload || upload.initiated.getTime() > latestUpload.initiated.getTime()) { + if (!latestUpload || + (upload.initiated.getTime() > latestUpload.initiated.getTime())) { latestUpload = upload return } @@ -2378,31 +2312,24 @@ export class Client { } var upload = (query, stream, length, sha256sum, md5sum, cb) => { var method = 'PUT' - let headers = { 'Content-Length': length } + let headers = {'Content-Length': length} if (!multipart) { headers = Object.assign({}, metaData, headers) } if (!this.enableSHA256) headers['Content-MD5'] = md5sum - this.makeRequestStream( - { method, bucketName, objectName, query, headers }, - stream, - sha256sum, - [200], - '', - true, - (e, response) => { - if (e) return cb(e) - const result = { - etag: sanitizeETag(response.headers.etag), - versionId: getVersionId(response.headers), - } - // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) - response.on('data', () => {}) - cb(null, result) - } - ) + this.makeRequestStream({method, bucketName, objectName, query, headers}, + stream, sha256sum, [200], '', true, (e, response) => { + if (e) return cb(e) + const result = { + etag: sanitizeETag(response.headers.etag), + versionId:getVersionId(response.headers) + } + // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) + response.on('data', () => {}) + cb(null, result) + }) } if (multipart) { return multipartUploader @@ -2423,13 +2350,9 @@ export class Client { } var method = 'PUT' var query = 'notification' - var builder = new xml2js.Builder({ - rootName: 'NotificationConfiguration', - renderOpts: { pretty: false }, - headless: true, - }) + var builder = new xml2js.Builder({rootName:'NotificationConfiguration', renderOpts:{'pretty':false}, headless:true}) var payload = builder.buildObject(config) - this.makeRequest({ method, bucketName, query }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, query}, payload, [200], '', false, cb) } removeAllBucketNotification(bucketName, cb) { @@ -2447,13 +2370,13 @@ export class Client { } var method = 'GET' var query = 'notification' - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getBucketNotificationTransformer() var bucketNotification pipesetup(response, transformer) - .on('data', (result) => (bucketNotification = result)) - .on('error', (e) => cb(e)) + .on('data', result => bucketNotification = result) + .on('error', e => cb(e)) .on('end', () => cb(null, bucketNotification)) }) } @@ -2478,7 +2401,7 @@ export class Client { return listener } - getBucketVersioning(bucketName, cb) { + getBucketVersioning(bucketName,cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2486,14 +2409,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } var method = 'GET' - var query = 'versioning' + var query = "versioning" - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let versionConfig = Buffer.from('') pipesetup(response, transformers.bucketVersioningTransformer()) - .on('data', (data) => { + .on('data', data => { versionConfig = data }) .on('error', cb) @@ -2503,11 +2426,11 @@ export class Client { }) } - setBucketVersioning(bucketName, versionConfig, cb) { + setBucketVersioning(bucketName,versionConfig, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if (!Object.keys(versionConfig).length) { + if(!Object.keys(versionConfig).length){ throw new errors.InvalidArgumentError('versionConfig should be of type "object"') } if (!isFunction(cb)) { @@ -2515,59 +2438,57 @@ export class Client { } var method = 'PUT' - var query = 'versioning' - var builder = new xml2js.Builder({ - rootName: 'VersioningConfiguration', - renderOpts: { pretty: false }, - headless: true, - }) + var query = "versioning" + var builder = new xml2js.Builder({rootName:'VersioningConfiguration', renderOpts:{'pretty':false}, headless:true}) var payload = builder.buildObject(versionConfig) - this.makeRequest({ method, bucketName, query }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, query}, payload, [200], '', false, cb) } /** To set Tags on a bucket or object based on the params - * __Arguments__ - * taggingParams _object_ Which contains the following properties - * bucketName _string_, - * objectName _string_ (Optional), - * tags _object_ of the form {'':'','':''} - * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, - * cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. - */ - setTagging(taggingParams) { - const { bucketName, objectName, tags, putOpts = {}, cb } = taggingParams + * __Arguments__ + * taggingParams _object_ Which contains the following properties + * bucketName _string_, + * objectName _string_ (Optional), + * tags _object_ of the form {'':'','':''} + * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, + * cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. + */ + setTagging(taggingParams){ + + const { bucketName, objectName, tags, putOpts={}, cb} = taggingParams const method = 'PUT' - let query = 'tagging' + let query ="tagging" - if (putOpts && putOpts.versionId) { - query = `${query}&versionId=${putOpts.versionId}` + if(putOpts && putOpts.versionId){ + query =`${query}&versionId=${putOpts.versionId}` } - const tagsList = [] + const tagsList=[] for (const [key, value] of Object.entries(tags)) { - tagsList.push({ Key: key, Value: value }) + tagsList.push( { Key: key, Value: value} ) } const taggingConfig = { Tagging: { TagSet: { - Tag: tagsList, - }, - }, + Tag: tagsList + } + } } const encoder = new TextEncoder() - const headers = {} - const builder = new xml2js.Builder({ headless: true, renderOpts: { pretty: false } }) + const headers ={} + const builder = new xml2js.Builder({ headless:true,renderOpts:{'pretty':false},}) let payload = builder.buildObject(taggingConfig) payload = encoder.encode(payload) headers['Content-MD5'] = toMd5(payload) const requestOptions = { method, bucketName, query, headers } - if (objectName) { - requestOptions['objectName'] = objectName + if(objectName){ + requestOptions['objectName']=objectName } headers['Content-MD5'] = toMd5(payload) this.makeRequest(requestOptions, payload, [200], '', false, cb) + } /** Set Tags on a Bucket @@ -2576,21 +2497,21 @@ export class Client { * tags _object_ of the form {'':'','':''} * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setBucketTagging(bucketName, tags, cb) { + setBucketTagging(bucketName,tags,cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if (!isObject(tags)) { + if(!isObject(tags)){ throw new errors.InvalidArgumentError('tags should be of type "object"') } - if (Object.keys(tags).length > 10) { + if(Object.keys(tags).length > 10){ throw new errors.InvalidArgumentError('maximum tags allowed is 10"') } if (!isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } - return this.setTagging({ bucketName, tags, cb }) + return this.setTagging({bucketName, tags, cb}) } /** Set Tags on an Object @@ -2601,7 +2522,7 @@ export class Client { * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setObjectTagging(bucketName, objectName, tags, putOpts = {}, cb) { + setObjectTagging(bucketName, objectName, tags, putOpts={}, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2609,22 +2530,22 @@ export class Client { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if (isFunction(putOpts)) { - cb = putOpts - putOpts = {} + if(isFunction(putOpts)){ + cb=putOpts + putOpts={} } - if (!isObject(tags)) { + if(!isObject(tags)){ throw new errors.InvalidArgumentError('tags should be of type "object"') } - if (Object.keys(tags).length > 10) { + if(Object.keys(tags).length > 10){ throw new errors.InvalidArgumentError('Maximum tags allowed is 10"') } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - return this.setTagging({ bucketName, objectName, tags, putOpts, cb }) + return this.setTagging({bucketName, objectName, tags, putOpts, cb}) } /** Remove Tags on an Bucket/Object based on params @@ -2634,12 +2555,12 @@ export class Client { * removeOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeTagging({ bucketName, objectName, removeOpts, cb }) { + removeTagging({bucketName, objectName, removeOpts, cb}){ const method = 'DELETE' - let query = 'tagging' + let query ="tagging" if (removeOpts && Object.keys(removeOpts).length && removeOpts.versionId) { - query = `${query}&versionId=${removeOpts.versionId}` + query =`${query}&versionId=${removeOpts.versionId}` } const requestOptions = { method, bucketName, objectName, query } @@ -2654,14 +2575,14 @@ export class Client { * bucketName _string_ * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeBucketTagging(bucketName, cb) { + removeBucketTagging(bucketName, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - return this.removeTagging({ bucketName, cb }) + return this.removeTagging({bucketName, cb}) } /** Remove tags associated with an object @@ -2671,18 +2592,19 @@ export class Client { * removeOpts _object_ (Optional) e.g. {VersionID:"my-object-version-id"} * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeObjectTagging(bucketName, objectName, removeOpts, cb) { + removeObjectTagging(bucketName, objectName, removeOpts, cb){ + if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isValidObjectName(objectName)) { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if (isFunction(removeOpts)) { - cb = removeOpts - removeOpts = {} + if(isFunction(removeOpts)){ + cb=removeOpts + removeOpts={} } - if (removeOpts && Object.keys(removeOpts).length && !isObject(removeOpts)) { + if(removeOpts && Object.keys(removeOpts).length && !isObject(removeOpts)){ throw new errors.InvalidArgumentError('removeOpts should be of type "object"') } @@ -2690,7 +2612,7 @@ export class Client { throw new TypeError('callback should be of type "function"') } - return this.removeTagging({ bucketName, objectName, removeOpts, cb }) + return this.removeTagging({bucketName, objectName, removeOpts, cb}) } /** Get Tags associated with a Bucket @@ -2698,9 +2620,9 @@ export class Client { * bucketName _string_ * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - getBucketTagging(bucketName, cb) { + getBucketTagging(bucketName, cb){ const method = 'GET' - const query = 'tagging' + const query ="tagging" const requestOptions = { method, bucketName, query } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2708,8 +2630,8 @@ export class Client { if (e) return cb(e) let tagsList pipesetup(response, transformer) - .on('data', (result) => (tagsList = result)) - .on('error', (e) => cb(e)) + .on('data', result => tagsList = result) + .on('error', e => cb(e)) .on('end', () => cb(null, tagsList)) }) } @@ -2720,33 +2642,33 @@ export class Client { * getOpts _object_ (Optional) e.g {versionId:"my-object-version-id"} * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - getObjectTagging(bucketName, objectName, getOpts = {}, cb = () => false) { + getObjectTagging(bucketName, objectName, getOpts={}, cb=()=>false){ const method = 'GET' - let query = 'tagging' + let query ="tagging" - if (!isValidBucketName(bucketName)) { + if(!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if (!isValidObjectName(objectName)) { + if(!isValidObjectName(objectName)) { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if (isFunction(getOpts)) { - cb = getOpts - getOpts = {} + if(isFunction(getOpts)){ + cb=getOpts + getOpts={} } - if (!isObject(getOpts)) { + if(!isObject(getOpts)){ throw new errors.InvalidArgumentError('getOpts should be of type "object"') } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - if (getOpts && getOpts.versionId) { - query = `${query}&versionId=${getOpts.versionId}` + if(getOpts && getOpts.versionId){ + query =`${query}&versionId=${getOpts.versionId}` } const requestOptions = { method, bucketName, query } - if (objectName) { - requestOptions['objectName'] = objectName + if(objectName){ + requestOptions['objectName']=objectName } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2754,10 +2676,11 @@ export class Client { if (e) return cb(e) let tagsList pipesetup(response, transformer) - .on('data', (result) => (tagsList = result)) - .on('error', (e) => cb(e)) + .on('data', result => tagsList = result) + .on('error', e => cb(e)) .on('end', () => cb(null, tagsList)) }) + } /** Put lifecycle configuration on a bucket. @@ -2766,17 +2689,13 @@ export class Client { * policyConfig _object_ a valid policy configuration object. * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - applyBucketLifecycle(bucketName, policyConfig, cb) { + applyBucketLifecycle(bucketName, policyConfig, cb){ const method = 'PUT' - const query = 'lifecycle' + const query="lifecycle" const encoder = new TextEncoder() - const headers = {} - const builder = new xml2js.Builder({ - rootName: 'LifecycleConfiguration', - headless: true, - renderOpts: { pretty: false }, - }) + const headers ={} + const builder = new xml2js.Builder({ rootName:'LifecycleConfiguration', headless:true, renderOpts:{'pretty':false},}) let payload = builder.buildObject(policyConfig) payload = encoder.encode(payload) const requestOptions = { method, bucketName, query, headers } @@ -2789,13 +2708,13 @@ export class Client { * bucketName _string_ * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeBucketLifecycle(bucketName, cb) { + removeBucketLifecycle(bucketName, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'DELETE' - const query = 'lifecycle' - this.makeRequest({ method, bucketName, query }, '', [204], '', false, cb) + const query="lifecycle" + this.makeRequest({method, bucketName, query}, '', [204], '', false, cb) } /** Set/Override lifecycle configuration on a bucket. if the configuration is empty, it removes the configuration. @@ -2803,13 +2722,13 @@ export class Client { * lifeCycleConfig _object_ one of the following values: (null or '') to remove the lifecycle configuration. or a valid lifecycle configuration * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setBucketLifecycle(bucketName, lifeCycleConfig = null, cb) { + setBucketLifecycle(bucketName, lifeCycleConfig=null, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if (_.isEmpty(lifeCycleConfig)) { + if(_.isEmpty(lifeCycleConfig)){ this.removeBucketLifecycle(bucketName, cb) - } else { + }else { this.applyBucketLifecycle(bucketName, lifeCycleConfig, cb) } } @@ -2818,12 +2737,12 @@ export class Client { * bucketName _string_ * `cb(config)` _function_ - callback function with lifecycle configuration as the error argument. */ - getBucketLifecycle(bucketName, cb) { + getBucketLifecycle(bucketName, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'GET' - const query = 'lifecycle' + const query ="lifecycle" const requestOptions = { method, bucketName, query } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2831,13 +2750,15 @@ export class Client { if (e) return cb(e) let lifecycleConfig pipesetup(response, transformer) - .on('data', (result) => (lifecycleConfig = result)) - .on('error', (e) => cb(e)) + .on('data', result => lifecycleConfig = result) + .on('error', e => cb(e)) .on('end', () => cb(null, lifecycleConfig)) }) + } - setObjectLockConfig(bucketName, lockConfigOpts = {}, cb) { + setObjectLockConfig(bucketName, lockConfigOpts={}, cb) { + const retentionModes = [RETENTION_MODES.COMPLIANCE, RETENTION_MODES.GOVERNANCE] const validUnits = [RETENTION_VALIDITY_UNITS.DAYS, RETENTION_VALIDITY_UNITS.YEARS] @@ -2848,29 +2769,27 @@ export class Client { if (lockConfigOpts.mode && !retentionModes.includes(lockConfigOpts.mode)) { throw new TypeError(`lockConfigOpts.mode should be one of ${retentionModes}`) } - if (lockConfigOpts.unit && !validUnits.includes(lockConfigOpts.unit)) { + if (lockConfigOpts.unit && !validUnits.includes(lockConfigOpts.unit)){ throw new TypeError(`lockConfigOpts.unit should be one of ${validUnits}`) } - if (lockConfigOpts.validity && !isNumber(lockConfigOpts.validity)) { + if (lockConfigOpts.validity && !isNumber(lockConfigOpts.validity)){ throw new TypeError(`lockConfigOpts.validity should be a number`) } const method = 'PUT' - const query = 'object-lock' + const query = "object-lock" - let config = { - ObjectLockEnabled: 'Enabled', + let config={ + ObjectLockEnabled:"Enabled" } const configKeys = Object.keys(lockConfigOpts) // Check if keys are present and all keys are present. - if (configKeys.length > 0) { - if (_.difference(configKeys, ['unit', 'mode', 'validity']).length !== 0) { - throw new TypeError( - `lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.` - ) + if(configKeys.length > 0){ + if(_.difference(configKeys, ['unit','mode','validity']).length !== 0){ + throw new TypeError(`lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.`) } else { - config.Rule = { - DefaultRetention: {}, + config.Rule={ + DefaultRetention:{} } if (lockConfigOpts.mode) { config.Rule.DefaultRetention.Mode = lockConfigOpts.mode @@ -2883,17 +2802,13 @@ export class Client { } } - const builder = new xml2js.Builder({ - rootName: 'ObjectLockConfiguration', - renderOpts: { pretty: false }, - headless: true, - }) + const builder = new xml2js.Builder({rootName:'ObjectLockConfiguration', renderOpts:{'pretty':false}, headless:true}) const payload = builder.buildObject(config) const headers = {} - headers['Content-MD5'] = toMd5(payload) + headers['Content-MD5'] =toMd5(payload) - this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, query, headers}, payload, [200], '', false, cb) } getObjectLockConfig(bucketName, cb) { @@ -2904,14 +2819,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = 'object-lock' + const query = "object-lock" - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let objectLockConfig = Buffer.from('') pipesetup(response, transformers.objectLockTransformer()) - .on('data', (data) => { + .on('data', data => { objectLockConfig = data }) .on('error', cb) @@ -2921,7 +2836,7 @@ export class Client { }) } - putObjectRetention(bucketName, objectName, retentionOpts = {}, cb) { + putObjectRetention(bucketName, objectName, retentionOpts={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2932,19 +2847,16 @@ export class Client { throw new errors.InvalidArgumentError('retentionOpts should be of type "object"') } else { if (retentionOpts.governanceBypass && !isBoolean(retentionOpts.governanceBypass)) { - throw new errors.InvalidArgumentError('Invalid value for governanceBypass', retentionOpts.governanceBypass) + throw new errors.InvalidArgumentError('Invalid value for governanceBypass',retentionOpts.governanceBypass) } - if ( - retentionOpts.mode && - ![RETENTION_MODES.COMPLIANCE, RETENTION_MODES.GOVERNANCE].includes(retentionOpts.mode) - ) { + if (retentionOpts.mode && ![RETENTION_MODES.COMPLIANCE,RETENTION_MODES.GOVERNANCE].includes((retentionOpts.mode))) { throw new errors.InvalidArgumentError('Invalid object retention mode ', retentionOpts.mode) } if (retentionOpts.retainUntilDate && !isString(retentionOpts.retainUntilDate)) { - throw new errors.InvalidArgumentError('Invalid value for retainUntilDate', retentionOpts.retainUntilDate) + throw new errors.InvalidArgumentError('Invalid value for retainUntilDate',retentionOpts.retainUntilDate) } if (retentionOpts.versionId && !isString(retentionOpts.versionId)) { - throw new errors.InvalidArgumentError('Invalid value for versionId', retentionOpts.versionId) + throw new errors.InvalidArgumentError('Invalid value for versionId',retentionOpts.versionId) } } if (!isFunction(cb)) { @@ -2952,59 +2864,59 @@ export class Client { } const method = 'PUT' - let query = 'retention' + let query = "retention" const headers = {} - if (retentionOpts.governanceBypass) { - headers['X-Amz-Bypass-Governance-Retention'] = true + if(retentionOpts.governanceBypass){ + headers["X-Amz-Bypass-Governance-Retention"]=true } - const builder = new xml2js.Builder({ rootName: 'Retention', renderOpts: { pretty: false }, headless: true }) - const params = {} + const builder = new xml2js.Builder({rootName:'Retention', renderOpts:{'pretty':false}, headless:true}) + const params ={} - if (retentionOpts.mode) { - params.Mode = retentionOpts.mode + if(retentionOpts.mode){ + params.Mode =retentionOpts.mode } - if (retentionOpts.retainUntilDate) { - params.RetainUntilDate = retentionOpts.retainUntilDate + if(retentionOpts.retainUntilDate){ + params.RetainUntilDate =retentionOpts.retainUntilDate } - if (retentionOpts.versionId) { + if(retentionOpts.versionId){ query += `&versionId=${retentionOpts.versionId}` } let payload = builder.buildObject(params) headers['Content-MD5'] = toMd5(payload) - this.makeRequest({ method, bucketName, objectName, query, headers }, payload, [200, 204], '', false, cb) + this.makeRequest({method, bucketName, objectName, query, headers}, payload, [200, 204], '', false, cb) } - getObjectRetention(bucketName, objectName, getOpts, cb) { + getObjectRetention(bucketName ,objectName, getOpts, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isValidObjectName(objectName)) { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if (!isObject(getOpts)) { + if(!isObject(getOpts)){ throw new errors.InvalidArgumentError('callback should be of type "object"') - } else if (getOpts.versionId && !isString(getOpts.versionId)) { + }else if(getOpts.versionId && !isString(getOpts.versionId)){ throw new errors.InvalidArgumentError('VersionID should be of type "string"') } if (cb && !isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - let query = 'retention' - if (getOpts.versionId) { + let query = "retention" + if(getOpts.versionId){ query += `&versionId=${getOpts.versionId}` } - this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName,objectName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let retentionConfig = Buffer.from('') pipesetup(response, transformers.objectRetentionTransformer()) - .on('data', (data) => { + .on('data', data => { retentionConfig = data }) .on('error', cb) @@ -3014,50 +2926,47 @@ export class Client { }) } + setBucketEncryption(bucketName, encryptionConfig, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if (isFunction(encryptionConfig)) { - cb = encryptionConfig + if(isFunction(encryptionConfig)){ + cb= encryptionConfig encryptionConfig = null } - if (!_.isEmpty(encryptionConfig) && encryptionConfig.Rule.length > 1) { + if(!_.isEmpty(encryptionConfig) && encryptionConfig.Rule.length >1){ throw new errors.InvalidArgumentError('Invalid Rule length. Only one rule is allowed.: ' + encryptionConfig.Rule) } if (cb && !isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - let encryptionObj = encryptionConfig - if (_.isEmpty(encryptionConfig)) { - encryptionObj = { - // Default MinIO Server Supported Rule - Rule: [ + let encryptionObj =encryptionConfig + if(_.isEmpty(encryptionConfig)) { + encryptionObj={ + // Default MinIO Server Supported Rule + Rule:[ { ApplyServerSideEncryptionByDefault: { - SSEAlgorithm: 'AES256', - }, - }, - ], - } - } + SSEAlgorithm:"AES256" + } + } + ] + + }} let method = 'PUT' - let query = 'encryption' - let builder = new xml2js.Builder({ - rootName: 'ServerSideEncryptionConfiguration', - renderOpts: { pretty: false }, - headless: true, - }) + let query = "encryption" + let builder = new xml2js.Builder({rootName:'ServerSideEncryptionConfiguration', renderOpts:{'pretty':false}, headless:true}) let payload = builder.buildObject(encryptionObj) const headers = {} - headers['Content-MD5'] = toMd5(payload) + headers['Content-MD5'] =toMd5(payload) - this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, query,headers}, payload, [200], '', false, cb) } getBucketEncryption(bucketName, cb) { @@ -3068,14 +2977,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = 'encryption' + const query = "encryption" - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let bucketEncConfig = Buffer.from('') pipesetup(response, transformers.bucketEncryptionTransformer()) - .on('data', (data) => { + .on('data', data => { bucketEncConfig = data }) .on('error', cb) @@ -3092,12 +3001,13 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'DELETE' - const query = 'encryption' + const query = "encryption" - this.makeRequest({ method, bucketName, query }, '', [204], '', false, cb) + this.makeRequest({method, bucketName, query}, '', [204], '', false, cb) } - setBucketReplication(bucketName, replicationConfig = {}, cb) { + + setBucketReplication(bucketName, replicationConfig={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3106,7 +3016,7 @@ export class Client { } else { if (_.isEmpty(replicationConfig.role)) { throw new errors.InvalidArgumentError('Role cannot be empty') - } else if (replicationConfig.role && !isString(replicationConfig.role)) { + }else if (replicationConfig.role && !isString(replicationConfig.role)) { throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role) } if (_.isEmpty(replicationConfig.rules)) { @@ -3118,23 +3028,23 @@ export class Client { } const method = 'PUT' - let query = 'replication' + let query = "replication" const headers = {} const replicationParamsConfig = { ReplicationConfiguration: { Role: replicationConfig.role, - Rule: replicationConfig.rules, - }, + Rule: replicationConfig.rules + } } - const builder = new xml2js.Builder({ renderOpts: { pretty: false }, headless: true }) + const builder = new xml2js.Builder({ renderOpts:{'pretty':false},headless: true }) let payload = builder.buildObject(replicationParamsConfig) - headers['Content-MD5'] = toMd5(payload) + headers['Content-MD5'] =toMd5(payload) - this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, query, headers}, payload, [200], '', false, cb) } getBucketReplication(bucketName, cb) { @@ -3145,14 +3055,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = 'replication' + const query = "replication" - this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let replicationConfig = Buffer.from('') pipesetup(response, transformers.replicationConfigTransformer()) - .on('data', (data) => { + .on('data', data => { replicationConfig = data }) .on('error', cb) @@ -3162,16 +3072,17 @@ export class Client { }) } - removeBucketReplication(bucketName, cb) { + removeBucketReplication(bucketName, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'DELETE' - const query = 'replication' - this.makeRequest({ method, bucketName, query }, '', [200, 204], '', false, cb) + const query="replication" + this.makeRequest({method, bucketName, query}, '', [200, 204], '', false, cb) } - getObjectLegalHold(bucketName, objectName, getOpts = {}, cb) { + + getObjectLegalHold(bucketName, objectName, getOpts={}, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3179,34 +3090,35 @@ export class Client { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if (isFunction(getOpts)) { - cb = getOpts + if(isFunction(getOpts)){ + cb= getOpts getOpts = {} } - if (!isObject(getOpts)) { + if (!isObject(getOpts)) { throw new TypeError('getOpts should be of type "Object"') - } else if (Object.keys(getOpts).length > 0 && getOpts.versionId && !isString(getOpts.versionId)) { - throw new TypeError('versionId should be of type string.:', getOpts.versionId) + } else if(Object.keys(getOpts).length> 0 && getOpts.versionId && !isString((getOpts.versionId))){ + throw new TypeError('versionId should be of type string.:',getOpts.versionId ) } + if (!isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - let query = 'legal-hold' + let query = "legal-hold" - if (getOpts.versionId) { - query += `&versionId=${getOpts.versionId}` + if (getOpts.versionId){ + query +=`&versionId=${getOpts.versionId}` } - this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { + this.makeRequest({method, bucketName, objectName, query}, '', [200], '', true, (e, response) => { if (e) return cb(e) let legalHoldConfig = Buffer.from('') pipesetup(response, transformers.objectLegalHoldTransformer()) - .on('data', (data) => { + .on('data', data => { legalHoldConfig = data }) .on('error', cb) @@ -3214,9 +3126,10 @@ export class Client { cb(null, legalHoldConfig) }) }) + } - setObjectLegalHold(bucketName, objectName, setOpts = {}, cb) { + setObjectLegalHold(bucketName, objectName, setOpts={}, cb){ if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3225,21 +3138,22 @@ export class Client { } const defaultOpts = { - status: LEGAL_HOLD_STATUS.ENABLED, + status:LEGAL_HOLD_STATUS.ENABLED } - if (isFunction(setOpts)) { - cb = setOpts - setOpts = defaultOpts + if(isFunction(setOpts)){ + cb= setOpts + setOpts =defaultOpts } if (!isObject(setOpts)) { throw new TypeError('setOpts should be of type "Object"') - } else { - if (![LEGAL_HOLD_STATUS.ENABLED, LEGAL_HOLD_STATUS.DISABLED].includes(setOpts.status)) { - throw new TypeError('Invalid status: ' + setOpts.status) + }else { + + if(![LEGAL_HOLD_STATUS.ENABLED, LEGAL_HOLD_STATUS.DISABLED].includes((setOpts.status))){ + throw new TypeError('Invalid status: '+setOpts.status ) } - if (setOpts.versionId && !setOpts.versionId.length) { - throw new TypeError('versionId should be of type string.:' + setOpts.versionId) + if(setOpts.versionId && !setOpts.versionId.length){ + throw new TypeError('versionId should be of type string.:'+ setOpts.versionId ) } } @@ -3247,307 +3161,315 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } - if (_.isEmpty(setOpts)) { - setOpts = { - defaultOpts, + if( _.isEmpty(setOpts)){ + setOpts={ + defaultOpts } } const method = 'PUT' - let query = 'legal-hold' + let query = "legal-hold" - if (setOpts.versionId) { - query += `&versionId=${setOpts.versionId}` + if (setOpts.versionId){ + query +=`&versionId=${setOpts.versionId}` } - let config = { - Status: setOpts.status, + let config={ + Status: setOpts.status } - const builder = new xml2js.Builder({ rootName: 'LegalHold', renderOpts: { pretty: false }, headless: true }) + const builder = new xml2js.Builder({rootName:'LegalHold', renderOpts:{'pretty':false}, headless:true}) const payload = builder.buildObject(config) const headers = {} headers['Content-MD5'] = toMd5(payload) - this.makeRequest({ method, bucketName, objectName, query, headers }, payload, [200], '', false, cb) + this.makeRequest({method, bucketName, objectName, query, headers}, payload, [200], '', false, cb) } - async setCredentialsProvider(credentialsProvider) { - if (!(credentialsProvider instanceof CredentialProvider)) { - throw new Error('Unable to get credentials. Expected instance of CredentialProvider') + async setCredentialsProvider(credentialsProvider){ + if(!(credentialsProvider instanceof CredentialProvider)){ + throw new Error("Unable to get credentials. Expected instance of CredentialProvider") } this.credentialsProvider = credentialsProvider await this.checkAndRefreshCreds() } - async checkAndRefreshCreds() { - if (this.credentialsProvider) { - return await this.fetchCredentials() + async checkAndRefreshCreds(){ + if(this.credentialsProvider ) { + return await this.fetchCredentials() } } - async fetchCredentials() { - if (this.credentialsProvider) { + async fetchCredentials(){ + if(this.credentialsProvider ){ const credentialsConf = await this.credentialsProvider.getCredentials() - if (credentialsConf) { + if(credentialsConf) { this.accessKey = credentialsConf.getAccessKey() this.secretKey = credentialsConf.getSecretKey() this.sessionToken = credentialsConf.getSessionToken() - } else { - throw new Error('Unable to get credentials. Expected instance of BaseCredentialsProvider') + }else{ + throw new Error("Unable to get credentials. Expected instance of BaseCredentialsProvider") } - } else { - throw new Error('Unable to get credentials. Expected instance of BaseCredentialsProvider') + }else{ + throw new Error("Unable to get credentials. Expected instance of BaseCredentialsProvider") } } /** - * Internal Method to abort a multipart upload request in case of any errors. - * @param bucketName __string__ Bucket Name - * @param objectName __string__ Object Name - * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. - * @param cb __function__ callback function - */ - abortMultipartUpload(bucketName, objectName, uploadId, cb) { + * Internal Method to abort a multipart upload request in case of any errors. + * @param bucketName __string__ Bucket Name + * @param objectName __string__ Object Name + * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. + * @param cb __function__ callback function + */ + abortMultipartUpload(bucketName, objectName, uploadId, cb){ const method = 'DELETE' - let query = `uploadId=${uploadId}` + let query =`uploadId=${uploadId}` - const requestOptions = { method, bucketName, objectName: objectName, query } + const requestOptions = { method, bucketName, objectName:objectName, query } this.makeRequest(requestOptions, '', [204], '', false, cb) } /** - * Internal method to upload a part during compose object. - * @param partConfig __object__ contains the following. - * bucketName __string__ - * objectName __string__ - * uploadID __string__ - * partNumber __number__ - * headers __object__ - * @param cb called with null incase of error. - */ - uploadPartCopy(partConfig, cb) { - const { bucketName, objectName, uploadID, partNumber, headers } = partConfig + * Internal method to upload a part during compose object. + * @param partConfig __object__ contains the following. + * bucketName __string__ + * objectName __string__ + * uploadID __string__ + * partNumber __number__ + * headers __object__ + * @param cb called with null incase of error. + */ + uploadPartCopy (partConfig , cb) { + const { + bucketName, objectName, uploadID, partNumber , headers + } = partConfig const method = 'PUT' - let query = `uploadId=${uploadID}&partNumber=${partNumber}` - const requestOptions = { method, bucketName, objectName: objectName, query, headers } - return this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { + let query =`uploadId=${uploadID}&partNumber=${partNumber}` + const requestOptions = { method, bucketName, objectName:objectName, query, headers } + return this.makeRequest(requestOptions, '', [200], '', true,(e, response) => { let partCopyResult = Buffer.from('') if (e) return cb(e) pipesetup(response, transformers.uploadPartTransformer()) - .on('data', (data) => { + .on('data', data => { partCopyResult = data }) .on('error', cb) .on('end', () => { let uploadPartCopyRes = { - etag: sanitizeETag(partCopyResult.ETag), - key: objectName, - part: partNumber, + etag:sanitizeETag(partCopyResult.ETag), + key:objectName, + part:partNumber } cb(null, uploadPartCopyRes) }) - }) + } + ) } - composeObject(destObjConfig = {}, sourceObjList = [], cb) { + composeObject (destObjConfig={}, sourceObjList=[], cb){ const me = this // many async flows. so store the ref. const sourceFilesLength = sourceObjList.length - if (!isArray(sourceObjList)) { + if(!(isArray(sourceObjList ))){ throw new errors.InvalidArgumentError('sourceConfig should an array of CopySourceOptions ') } - if (!(destObjConfig instanceof CopyDestinationOptions)) { + if(!(destObjConfig instanceof CopyDestinationOptions )){ throw new errors.InvalidArgumentError('destConfig should of type CopyDestinationOptions ') } if (sourceFilesLength < 1 || sourceFilesLength > PART_CONSTRAINTS.MAX_PARTS_COUNT) { - throw new errors.InvalidArgumentError( - `"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.` - ) + throw new errors.InvalidArgumentError(`"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.`) } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - for (let i = 0; i < sourceFilesLength; i++) { - if (!sourceObjList[i].validate()) { + for(let i=0;i { + const getStatOptions = (srcConfig) =>{ let statOpts = {} - if (!_.isEmpty(srcConfig.VersionID)) { - statOpts = { - versionId: srcConfig.VersionID, + if(!_.isEmpty(srcConfig.VersionID)) { + statOpts= { + versionId: srcConfig.VersionID } } return statOpts } - const srcObjectSizes = [] - let totalSize = 0 - let totalParts = 0 + const srcObjectSizes=[] + let totalSize=0 + let totalParts=0 - const sourceObjStats = sourceObjList.map((srcItem) => - me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)) - ) + const sourceObjStats = sourceObjList.map( (srcItem) => me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)) ) - return Promise.all(sourceObjStats) - .then((srcObjectInfos) => { - const validatedStats = srcObjectInfos.map((resItemStat, index) => { - const srcConfig = sourceObjList[index] - - let srcCopySize = resItemStat.size - // Check if a segment is specified, and if so, is the - // segment within object bounds? - if (srcConfig.MatchRange) { - // Since range is specified, - // 0 <= src.srcStart <= src.srcEnd - // so only invalid case to check is: - const srcStart = srcConfig.Start - const srcEnd = srcConfig.End - if (srcEnd >= srcCopySize || srcStart < 0) { - throw new errors.InvalidArgumentError( - `CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})` - ) - } - srcCopySize = srcEnd - srcStart + 1 - } - - // Only the last source may be less than `absMinPartSize` - if (srcCopySize < PART_CONSTRAINTS.ABS_MIN_PART_SIZE && index < sourceFilesLength - 1) { - throw new errors.InvalidArgumentError( - `CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.` - ) - } + return Promise.all(sourceObjStats).then(srcObjectInfos =>{ - // Is data to copy too large? - totalSize += srcCopySize - if (totalSize > PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE) { - throw new errors.InvalidArgumentError(`Cannot compose an object of size ${totalSize} (> 5TiB)`) - } + const validatedStats = srcObjectInfos.map( (resItemStat, index)=>{ - // record source size - srcObjectSizes[index] = srcCopySize + const srcConfig = sourceObjList[index] - // calculate parts needed for current source - totalParts += partsRequired(srcCopySize) - // Do we need more parts than we are allowed? - if (totalParts > PART_CONSTRAINTS.MAX_PARTS_COUNT) { - throw new errors.InvalidArgumentError( - `Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts` - ) + let srcCopySize =resItemStat.size + // Check if a segment is specified, and if so, is the + // segment within object bounds? + if (srcConfig.MatchRange) { + // Since range is specified, + // 0 <= src.srcStart <= src.srcEnd + // so only invalid case to check is: + const srcStart = srcConfig.Start + const srcEnd = srcConfig.End + if (srcEnd >= srcCopySize || srcStart < 0 ){ + throw new errors.InvalidArgumentError(`CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})`) } + srcCopySize = srcEnd - srcStart + 1 + } - return resItemStat - }) + // Only the last source may be less than `absMinPartSize` + if (srcCopySize < PART_CONSTRAINTS.ABS_MIN_PART_SIZE && index < sourceFilesLength-1) { + throw new errors.InvalidArgumentError(`CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.`) + } - if ((totalParts === 1 && totalSize <= PART_CONSTRAINTS.MAX_PART_SIZE) || totalSize === 0) { - return this.copyObject(sourceObjList[0], destObjConfig, cb) // use copyObjectV2 + // Is data to copy too large? + totalSize += srcCopySize + if (totalSize > PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE) { + throw new errors.InvalidArgumentError(`Cannot compose an object of size ${totalSize} (> 5TiB)`) } - // preserve etag to avoid modification of object while copying. - for (let i = 0; i < sourceFilesLength; i++) { - sourceObjList[i].MatchETag = validatedStats[i].etag + // record source size + srcObjectSizes[index] = srcCopySize + + // calculate parts needed for current source + totalParts += partsRequired(srcCopySize) + // Do we need more parts than we are allowed? + if (totalParts > PART_CONSTRAINTS.MAX_PARTS_COUNT ){ + throw new errors.InvalidArgumentError(`Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts`) } - const splitPartSizeList = validatedStats.map((resItemStat, idx) => { - const calSize = calculateEvenSplits(srcObjectSizes[idx], sourceObjList[idx]) - return calSize - }) + return resItemStat - function getUploadPartConfigList(uploadId) { - const uploadPartConfigList = [] + }) - splitPartSizeList.forEach((splitSize, splitIndex) => { - const { startIndex: startIdx, endIndex: endIdx, objInfo: objConfig } = splitSize + if ((totalParts === 1 && totalSize <= PART_CONSTRAINTS.MAX_PART_SIZE) || (totalSize === 0)) { + return this.copyObject( sourceObjList[0], destObjConfig, cb) // use copyObjectV2 + } - let partIndex = splitIndex + 1 // part index starts from 1. - const totalUploads = Array.from(startIdx) + // preserve etag to avoid modification of object while copying. + for(let i=0;i{ + const calSize = calculateEvenSplits(srcObjectSizes[idx], sourceObjList[idx]) + return calSize - totalUploads.forEach((splitStart, upldCtrIdx) => { - let splitEnd = endIdx[upldCtrIdx] + }) - const sourceObj = `${objConfig.Bucket}/${objConfig.Object}` - headers['x-amz-copy-source'] = `${sourceObj}` - headers['x-amz-copy-source-range'] = `bytes=${splitStart}-${splitEnd}` + function getUploadPartConfigList (uploadId) { + const uploadPartConfigList = [] - const uploadPartConfig = { - bucketName: destObjConfig.Bucket, - objectName: destObjConfig.Object, - uploadID: uploadId, - partNumber: partIndex, - headers: headers, - sourceObj: sourceObj, - } + splitPartSizeList.forEach((splitSize, splitIndex) => { - uploadPartConfigList.push(uploadPartConfig) - }) - }) + const { + startIndex: startIdx, + endIndex: endIdx, + objInfo: objConfig, + } = splitSize - return uploadPartConfigList - } + let partIndex = splitIndex + 1 // part index starts from 1. + const totalUploads = Array.from(startIdx) - const performUploadParts = (uploadId) => { - const uploadList = getUploadPartConfigList(uploadId) + const headers = sourceObjList[splitIndex].getHeaders() - async.map(uploadList, me.uploadPartCopy.bind(me), (err, res) => { - if (err) { - return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb) + totalUploads.forEach((splitStart, upldCtrIdx) => { + let splitEnd = endIdx[upldCtrIdx] + + const sourceObj = `${objConfig.Bucket}/${objConfig.Object}` + headers['x-amz-copy-source'] = `${sourceObj}` + headers["x-amz-copy-source-range"] = `bytes=${splitStart}-${splitEnd}` + + const uploadPartConfig = { + bucketName: destObjConfig.Bucket, + objectName: destObjConfig.Object, + uploadID: uploadId, + partNumber: partIndex, + headers: headers, + sourceObj: sourceObj } - const partsDone = res.map((partCopy) => ({ etag: partCopy.etag, part: partCopy.part })) - return me.completeMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, partsDone, cb) + + uploadPartConfigList.push(uploadPartConfig) }) - } - const newUploadHeaders = destObjConfig.getHeaders() + }) + + return uploadPartConfigList + } + + const performUploadParts = (uploadId) =>{ + + const uploadList = getUploadPartConfigList(uploadId) - me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId) => { - if (err) { - return cb(err, null) + async.map(uploadList, me.uploadPartCopy.bind(me), (err, res)=>{ + if(err){ + return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb) } - performUploadParts(uploadId) + const partsDone = res.map((partCopy)=>({etag:partCopy.etag, part:partCopy.part})) + return me.completeMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, partsDone, cb) }) + + } + + const newUploadHeaders = destObjConfig.getHeaders() + + me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId)=>{ + if(err){ + return cb(err, null) + } + performUploadParts(uploadId) }) - .catch((error) => { + + }) + .catch((error)=>{ cb(error, null) }) + } - selectObjectContent(bucketName, objectName, selectOpts = {}, cb) { + selectObjectContent(bucketName, objectName, selectOpts={}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`) } if (!isValidObjectName(objectName)) { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if (!_.isEmpty(selectOpts)) { + if(!_.isEmpty(selectOpts)){ + if (!isString(selectOpts.expression)) { throw new TypeError('sqlExpression should be of type "string"') } - if (!_.isEmpty(selectOpts.inputSerialization)) { + if(!_.isEmpty(selectOpts.inputSerialization)) { if (!isObject(selectOpts.inputSerialization)) { throw new TypeError('inputSerialization should be of type "object"') } - } else { + }else{ throw new TypeError('inputSerialization is required') } - if (!_.isEmpty(selectOpts.outputSerialization)) { + if(!_.isEmpty(selectOpts.outputSerialization)) { if (!isObject(selectOpts.outputSerialization)) { throw new TypeError('outputSerialization should be of type "object"') } - } else { + }else{ throw new TypeError('outputSerialization is required') } - } else { + + }else{ throw new TypeError('valid select configuration is required') } @@ -3557,45 +3479,48 @@ export class Client { const method = 'POST' let query = `select` - query += '&select-type=2' + query += "&select-type=2" const config = [ { - Expression: selectOpts.expression, + "Expression": selectOpts.expression }, { - ExpressionType: selectOpts.expressionType || 'SQL', + "ExpressionType":selectOpts.expressionType || "SQL" }, { - InputSerialization: [selectOpts.inputSerialization], + "InputSerialization": [selectOpts.inputSerialization] }, { - OutputSerialization: [selectOpts.outputSerialization], - }, + "OutputSerialization": [selectOpts.outputSerialization] + } ] // Optional - if (selectOpts.requestProgress) { - config.push({ RequestProgress: selectOpts.requestProgress }) + if(selectOpts.requestProgress){ + config.push( + {"RequestProgress":selectOpts.requestProgress} + ) } // Optional - if (selectOpts.scanRange) { - config.push({ ScanRange: selectOpts.scanRange }) + if(selectOpts.scanRange){ + config.push( + {"ScanRange": selectOpts.scanRange} + + ) } - const builder = new xml2js.Builder({ - rootName: 'SelectObjectContentRequest', - renderOpts: { pretty: false }, - headless: true, - }) + + const builder = new xml2js.Builder({rootName:'SelectObjectContentRequest', renderOpts:{'pretty':false}, headless:true}) const payload = builder.buildObject(config) - this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { + + this.makeRequest({method, bucketName, objectName, query}, payload, [200], '', true, (e, response) => { if (e) return cb(e) let selectResult pipesetup(response, transformers.selectObjectContentTransformer()) - .on('data', (data) => { + .on('data', data => { selectResult = parseSelectObjectContentResponse(data) }) .on('error', cb) @@ -3606,7 +3531,8 @@ export class Client { } get extensions() { - if (!this.clientExtensions) { + if(!this.clientExtensions) + { this.clientExtensions = new extensions(this) } return this.clientExtensions @@ -3640,47 +3566,49 @@ Client.prototype.getBucketPolicy = promisify(Client.prototype.getBucketPolicy) Client.prototype.setBucketPolicy = promisify(Client.prototype.setBucketPolicy) Client.prototype.removeIncompleteUpload = promisify(Client.prototype.removeIncompleteUpload) Client.prototype.getBucketVersioning = promisify(Client.prototype.getBucketVersioning) -Client.prototype.setBucketVersioning = promisify(Client.prototype.setBucketVersioning) -Client.prototype.setBucketTagging = promisify(Client.prototype.setBucketTagging) -Client.prototype.removeBucketTagging = promisify(Client.prototype.removeBucketTagging) -Client.prototype.getBucketTagging = promisify(Client.prototype.getBucketTagging) -Client.prototype.setObjectTagging = promisify(Client.prototype.setObjectTagging) -Client.prototype.removeObjectTagging = promisify(Client.prototype.removeObjectTagging) -Client.prototype.getObjectTagging = promisify(Client.prototype.getObjectTagging) -Client.prototype.setBucketLifecycle = promisify(Client.prototype.setBucketLifecycle) -Client.prototype.getBucketLifecycle = promisify(Client.prototype.getBucketLifecycle) -Client.prototype.removeBucketLifecycle = promisify(Client.prototype.removeBucketLifecycle) -Client.prototype.setObjectLockConfig = promisify(Client.prototype.setObjectLockConfig) -Client.prototype.getObjectLockConfig = promisify(Client.prototype.getObjectLockConfig) -Client.prototype.putObjectRetention = promisify(Client.prototype.putObjectRetention) -Client.prototype.getObjectRetention = promisify(Client.prototype.getObjectRetention) +Client.prototype.setBucketVersioning=promisify(Client.prototype.setBucketVersioning) +Client.prototype.setBucketTagging=promisify(Client.prototype.setBucketTagging) +Client.prototype.removeBucketTagging=promisify(Client.prototype.removeBucketTagging) +Client.prototype.getBucketTagging=promisify(Client.prototype.getBucketTagging) +Client.prototype.setObjectTagging=promisify(Client.prototype.setObjectTagging) +Client.prototype.removeObjectTagging=promisify(Client.prototype.removeObjectTagging) +Client.prototype.getObjectTagging=promisify(Client.prototype.getObjectTagging) +Client.prototype.setBucketLifecycle=promisify(Client.prototype.setBucketLifecycle) +Client.prototype.getBucketLifecycle=promisify(Client.prototype.getBucketLifecycle) +Client.prototype.removeBucketLifecycle=promisify(Client.prototype.removeBucketLifecycle) +Client.prototype.setObjectLockConfig=promisify(Client.prototype.setObjectLockConfig) +Client.prototype.getObjectLockConfig=promisify(Client.prototype.getObjectLockConfig) +Client.prototype.putObjectRetention =promisify(Client.prototype.putObjectRetention) +Client.prototype.getObjectRetention =promisify(Client.prototype.getObjectRetention) Client.prototype.setBucketEncryption = promisify(Client.prototype.setBucketEncryption) Client.prototype.getBucketEncryption = promisify(Client.prototype.getBucketEncryption) Client.prototype.removeBucketEncryption = promisify(Client.prototype.removeBucketEncryption) -Client.prototype.setBucketReplication = promisify(Client.prototype.setBucketReplication) -Client.prototype.getBucketReplication = promisify(Client.prototype.getBucketReplication) -Client.prototype.removeBucketReplication = promisify(Client.prototype.removeBucketReplication) -Client.prototype.setObjectLegalHold = promisify(Client.prototype.setObjectLegalHold) -Client.prototype.getObjectLegalHold = promisify(Client.prototype.getObjectLegalHold) +Client.prototype.setBucketReplication =promisify(Client.prototype.setBucketReplication) +Client.prototype.getBucketReplication =promisify(Client.prototype.getBucketReplication) +Client.prototype.removeBucketReplication=promisify(Client.prototype.removeBucketReplication) +Client.prototype.setObjectLegalHold=promisify(Client.prototype.setObjectLegalHold) +Client.prototype.getObjectLegalHold=promisify(Client.prototype.getObjectLegalHold) Client.prototype.composeObject = promisify(Client.prototype.composeObject) -Client.prototype.selectObjectContent = promisify(Client.prototype.selectObjectContent) +Client.prototype.selectObjectContent=promisify(Client.prototype.selectObjectContent) export class CopyConditions { constructor() { - this.modified = '' - this.unmodified = '' - this.matchETag = '' - this.matchETagExcept = '' + this.modified = "" + this.unmodified = "" + this.matchETag = "" + this.matchETagExcept = "" } setModified(date) { - if (!(date instanceof Date)) throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) + throw new TypeError('date must be of type Date') this.modified = date.toUTCString() } setUnmodified(date) { - if (!(date instanceof Date)) throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) + throw new TypeError('date must be of type Date') this.unmodified = date.toUTCString() } @@ -3698,7 +3626,7 @@ export class CopyConditions { export class PostPolicy { constructor() { this.policy = { - conditions: [], + conditions: [] } this.formData = {} } @@ -3792,5 +3720,5 @@ export class PostPolicy { } } -export * from './helpers' export * from './notification' +export * from './helpers' diff --git a/src/main/notification.js b/src/main/notification.js index 95e6ff3e..4a0537d8 100644 --- a/src/main/notification.js +++ b/src/main/notification.js @@ -15,9 +15,8 @@ */ import { EventEmitter } from 'events' - -import { DEFAULT_REGION, pipesetup, uriEscape } from './helpers' import * as transformers from './transformers' +import {DEFAULT_REGION, pipesetup, uriEscape} from './helpers' // Notification config - array of target configs. // Target configs can be @@ -46,17 +45,17 @@ class TargetConfig { setId(id) { this.Id = id } - addEvent(newevent) { + addEvent(newevent){ if (!this.Event) this.Event = [] this.Event.push(newevent) } addFilterSuffix(suffix) { - if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } - this.Filter.S3Key.FilterRule.push({ Name: 'suffix', Value: suffix }) + if (!this.Filter) this.Filter = {S3Key : {FilterRule:[]}} + this.Filter.S3Key.FilterRule.push({Name:"suffix", Value:suffix}) } addFilterPrefix(prefix) { - if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } - this.Filter.S3Key.FilterRule.push({ Name: 'prefix', Value: prefix }) + if (!this.Filter) this.Filter = {S3Key : {FilterRule:[]}} + this.Filter.S3Key.FilterRule.push({Name:"prefix", Value:prefix}) } } @@ -85,18 +84,19 @@ export class CloudFunctionConfig extends TargetConfig { } export const buildARN = (partition, service, region, accountId, resource) => { - return 'arn:' + partition + ':' + service + ':' + region + ':' + accountId + ':' + resource + return "arn:" + partition + ":" + service + ":" + region + ":" + accountId + ":" + resource } -export const ObjectCreatedAll = 's3:ObjectCreated:*' -export const ObjectCreatedPut = 's3:ObjectCreated:Put' -export const ObjectCreatedPost = 's3:ObjectCreated:Post' -export const ObjectCreatedCopy = 's3:ObjectCreated:Copy' -export const ObjectCreatedCompleteMultipartUpload = 's3:ObjectCreated:CompleteMultipartUpload' -export const ObjectRemovedAll = 's3:ObjectRemoved:*' -export const ObjectRemovedDelete = 's3:ObjectRemoved:Delete' -export const ObjectRemovedDeleteMarkerCreated = 's3:ObjectRemoved:DeleteMarkerCreated' -export const ObjectReducedRedundancyLostObject = 's3:ReducedRedundancyLostObject' + +export const ObjectCreatedAll = "s3:ObjectCreated:*" +export const ObjectCreatedPut = "s3:ObjectCreated:Put" +export const ObjectCreatedPost = "s3:ObjectCreated:Post" +export const ObjectCreatedCopy = "s3:ObjectCreated:Copy" +export const ObjectCreatedCompleteMultipartUpload = "s3:ObjectCreated:CompleteMultipartUpload" +export const ObjectRemovedAll = "s3:ObjectRemoved:*" +export const ObjectRemovedDelete = "s3:ObjectRemoved:Delete" +export const ObjectRemovedDeleteMarkerCreated = "s3:ObjectRemoved:DeleteMarkerCreated" +export const ObjectReducedRedundancyLostObject = "s3:ReducedRedundancyLostObject" // Poll for notifications, used in #listenBucketNotification. // Listening constitutes repeatedly requesting s3 whether or not any @@ -143,7 +143,7 @@ export class NotificationPoller extends EventEmitter { queries.push(`suffix=${suffix}`) } if (this.events) { - this.events.forEach((s3event) => queries.push('events=' + uriEscape(s3event))) + this.events.forEach(s3event => queries.push('events='+uriEscape(s3event))) } queries.sort() @@ -157,7 +157,7 @@ export class NotificationPoller extends EventEmitter { let transformer = transformers.getNotificationTransformer() pipesetup(response, transformer) - .on('data', (result) => { + .on('data', result => { // Data is flushed periodically (every 5 seconds), so we should // handle it after flushing from the JSON parser. let records = result.Records @@ -165,14 +165,14 @@ export class NotificationPoller extends EventEmitter { if (!records) records = [] // Iterate over the notifications and emit them individually. - records.forEach((record) => { + records.forEach(record => { this.emit('notification', record) }) // If we're done, stop. if (this.ending) response.destroy() }) - .on('error', (e) => this.emit('error', e)) + .on('error', e => this.emit('error', e)) .on('end', () => { // Do it again, if we haven't cancelled yet. process.nextTick(() => { @@ -181,4 +181,5 @@ export class NotificationPoller extends EventEmitter { }) }) } + } diff --git a/src/main/object-uploader.js b/src/main/object-uploader.js index 6a731204..9412d034 100644 --- a/src/main/object-uploader.js +++ b/src/main/object-uploader.js @@ -14,11 +14,10 @@ * limitations under the License. */ +import { Transform } from 'stream' import Crypto from 'crypto' import * as querystring from 'query-string' -import { Transform } from 'stream' - -import { getVersionId, sanitizeETag } from './helpers' +import { getVersionId, sanitizeETag } from "./helpers" // We extend Transform because Writable does not implement ._flush(). export default class ObjectUploader extends Transform { @@ -53,7 +52,7 @@ export default class ObjectUploader extends Transform { this.id = null // Handle errors. - this.on('error', (err) => { + this.on('error', err => { callback(err) }) } @@ -61,7 +60,7 @@ export default class ObjectUploader extends Transform { _transform(chunk, encoding, callback) { this.emptyStream = false let method = 'PUT' - let headers = { 'Content-Length': chunk.length } + let headers = {'Content-Length': chunk.length} let md5digest = '' // Calculate and set Content-MD5 header if SHA256 is not set. @@ -81,14 +80,14 @@ export default class ObjectUploader extends Transform { headers: Object.assign({}, this.metaData, headers), query: '', bucketName: this.bucketName, - objectName: this.objectName, + objectName: this.objectName } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { if (err) return callback(err) let result = { etag: sanitizeETag(response.headers.etag), - versionId: getVersionId(response.headers), + versionId :getVersionId(response.headers) } // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) response.on('data', () => {}) @@ -142,7 +141,7 @@ export default class ObjectUploader extends Transform { if (!etags) etags = [] // oldParts will become an object, allowing oldParts[partNumber].etag - this.oldParts = etags.reduce(function (prev, item) { + this.oldParts = etags.reduce(function(prev, item) { if (!prev[item.part]) { prev[item.part] = item } @@ -165,13 +164,13 @@ export default class ObjectUploader extends Transform { let oldPart = this.oldParts[partNumber] // Calulcate the md5 hash, if it has not already been calculated. - if (!md5digest) { + if(!md5digest) { md5digest = Crypto.createHash('md5').update(chunk).digest() } if (oldPart && md5digest.toString('hex') === oldPart.etag) { // The md5 matches, the chunk has already been uploaded. - this.etags.push({ part: partNumber, etag: oldPart.etag }) + this.etags.push({part: partNumber, etag: oldPart.etag}) callback() return @@ -181,15 +180,13 @@ export default class ObjectUploader extends Transform { // Write the chunk with an uploader. let query = querystring.stringify({ partNumber: partNumber, - uploadId: this.id, + uploadId: this.id }) let options = { - method, - query, - headers, + method, query, headers, bucketName: this.bucketName, - objectName: this.objectName, + objectName: this.objectName } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { @@ -197,9 +194,10 @@ export default class ObjectUploader extends Transform { // In order to aggregate the parts together, we need to collect the etags. let etag = response.headers.etag - if (etag) etag = etag.replace(/^"/, '').replace(/"$/, '') + if (etag) + etag = etag.replace(/^"/, '').replace(/"$/, '') - this.etags.push({ part: partNumber, etag }) + this.etags.push({part: partNumber, etag}) // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) response.on('data', () => {}) @@ -212,13 +210,12 @@ export default class ObjectUploader extends Transform { _flush(callback) { if (this.emptyStream) { let method = 'PUT' - let headers = Object.assign({}, this.metaData, { 'Content-Length': 0 }) + let headers = Object.assign({}, this.metaData, {'Content-Length': 0}) let options = { - method, - headers, + method, headers, query: '', bucketName: this.bucketName, - objectName: this.objectName, + objectName: this.objectName } this.client.makeRequest(options, '', [200], '', true, (err, response) => { @@ -226,7 +223,7 @@ export default class ObjectUploader extends Transform { let result = { etag: sanitizeETag(response.headers.etag), - versionId: getVersionId(response.headers), + versionId: getVersionId(response.headers) } // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) @@ -250,16 +247,17 @@ export default class ObjectUploader extends Transform { // This is called when all of the chunks uploaded successfully, thus // completing the multipart upload. - this.client.completeMultipartUpload(this.bucketName, this.objectName, this.id, this.etags, (err, etag) => { - if (err) return callback(err) - - // Call our callback on the next tick to allow the streams infrastructure - // to finish what its doing before we continue. - process.nextTick(() => { - this.callback(null, etag) - }) - - callback() - }) + this.client.completeMultipartUpload(this.bucketName, this.objectName, this.id, + this.etags, (err, etag) => { + if (err) return callback(err) + + // Call our callback on the next tick to allow the streams infrastructure + // to finish what its doing before we continue. + process.nextTick(() => { + this.callback(null, etag) + }) + + callback() + }) } } diff --git a/src/main/s3-endpoints.js b/src/main/s3-endpoints.js index 9c84e278..ee5e773a 100644 --- a/src/main/s3-endpoints.js +++ b/src/main/s3-endpoints.js @@ -14,7 +14,7 @@ * limitations under the License. */ -import { isString } from './helpers' +import { isString } from './helpers.js' // List of currently supported endpoints. let awsS3Endpoint = { @@ -32,7 +32,7 @@ let awsS3Endpoint = { 'ap-southeast-2': 's3-ap-southeast-2.amazonaws.com', 'ap-northeast-1': 's3-ap-northeast-1.amazonaws.com', 'cn-north-1': 's3.cn-north-1.amazonaws.com.cn', - 'ap-east-1': 's3.ap-east-1.amazonaws.com', + 'ap-east-1': 's3.ap-east-1.amazonaws.com' // Add new endpoints here. } diff --git a/src/main/signing.js b/src/main/signing.js index c4bd38b6..ded424bc 100644 --- a/src/main/signing.js +++ b/src/main/signing.js @@ -16,9 +16,9 @@ import Crypto from 'crypto' import _ from 'lodash' - -import * as errors from './errors' -import { getScope, isArray, isNumber, isObject, isString, makeDateLong, makeDateShort, uriEscape } from './helpers' +import { uriEscape, getScope, isString, isObject, isArray, isNumber, + makeDateShort, makeDateLong } from './helpers.js' +import * as errors from './errors.js' const signV4Algorithm = 'AWS4-HMAC-SHA256' @@ -50,7 +50,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload } const headersArray = signedHeaders.reduce((acc, i) => { // Trim spaces from the value (required by V4 spec) - const val = `${headers[i]}`.replace(/ +/g, ' ') + const val = `${headers[i]}`.replace(/ +/g, " ") acc.push(`${i.toLowerCase()}:${val}`) return acc }, []) @@ -63,7 +63,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload requestQuery = requestQuery .split('&') .sort() - .map((element) => (element.indexOf('=') === -1 ? element + '=' : element)) + .map(element => element.indexOf('=') === -1 ? element + '=' : element) .join('&') } @@ -78,7 +78,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload } // generate a credential string -function getCredential(accessKey, region, requestDate, serviceName = 's3') { +function getCredential(accessKey, region, requestDate,serviceName="s3") { if (!isString(accessKey)) { throw new TypeError('accessKey should be of type "string"') } @@ -88,7 +88,7 @@ function getCredential(accessKey, region, requestDate, serviceName = 's3') { if (!isObject(requestDate)) { throw new TypeError('requestDate should be of type "object"') } - return `${accessKey}/${getScope(region, requestDate, serviceName)}` + return `${accessKey}/${getScope(region, requestDate,serviceName)}` } // Returns signed headers array - alphabetically sorted @@ -125,12 +125,12 @@ function getSignedHeaders(headers) { const ignoredHeaders = ['authorization', 'content-length', 'content-type', 'user-agent'] return _.map(headers, (v, header) => header) - .filter((header) => ignoredHeaders.indexOf(header) === -1) + .filter(header => ignoredHeaders.indexOf(header) === -1) .sort() } // returns the key used for calculating signature -function getSigningKey(date, region, secretKey, serviceName = 's3') { +function getSigningKey(date, region, secretKey,serviceName="s3") { if (!isObject(date)) { throw new TypeError('date should be of type "object"') } @@ -141,16 +141,14 @@ function getSigningKey(date, region, secretKey, serviceName = 's3') { throw new TypeError('secretKey should be of type "string"') } const dateLine = makeDateShort(date) - let hmac1 = Crypto.createHmac('sha256', 'AWS4' + secretKey) - .update(dateLine) - .digest(), + let hmac1 = Crypto.createHmac('sha256', 'AWS4' + secretKey).update(dateLine).digest(), hmac2 = Crypto.createHmac('sha256', hmac1).update(region).digest(), hmac3 = Crypto.createHmac('sha256', hmac2).update(serviceName).digest() return Crypto.createHmac('sha256', hmac3).update('aws4_request').digest() } // returns the string that needs to be signed -function getStringToSign(canonicalRequest, requestDate, region, serviceName = 's3') { +function getStringToSign(canonicalRequest, requestDate, region,serviceName="s3") { if (!isString(canonicalRequest)) { throw new TypeError('canonicalRequest should be of type "string"') } @@ -190,7 +188,7 @@ export function postPresignSignatureV4(region, date, secretKey, policyBase64) { } // Returns the authorization header -export function signV4(request, accessKey, secretKey, region, requestDate, serviceName = 's3') { +export function signV4(request, accessKey, secretKey, region, requestDate, serviceName="s3") { if (!isObject(request)) { throw new TypeError('request should be of type "object"') } @@ -214,20 +212,19 @@ export function signV4(request, accessKey, secretKey, region, requestDate, servi const sha256sum = request.headers['x-amz-content-sha256'] const signedHeaders = getSignedHeaders(request.headers) - const canonicalRequest = getCanonicalRequest(request.method, request.path, request.headers, signedHeaders, sha256sum) - const serviceIdentifier = serviceName || 's3' - const stringToSign = getStringToSign(canonicalRequest, requestDate, region, serviceIdentifier) - const signingKey = getSigningKey(requestDate, region, secretKey, serviceIdentifier) + const canonicalRequest = getCanonicalRequest(request.method, request.path, request.headers, + signedHeaders, sha256sum) + const serviceIdentifier = serviceName || "s3" + const stringToSign = getStringToSign(canonicalRequest, requestDate, region,serviceIdentifier) + const signingKey = getSigningKey(requestDate, region, secretKey,serviceIdentifier) const credential = getCredential(accessKey, region, requestDate, serviceIdentifier) const signature = Crypto.createHmac('sha256', signingKey).update(stringToSign).digest('hex').toLowerCase() - return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${signedHeaders - .join(';') - .toLowerCase()}, Signature=${signature}` + return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${signedHeaders.join(';').toLowerCase()}, Signature=${signature}` } -export function signV4ByServiceName(request, accessKey, secretKey, region, requestDate, serviceName = 's3') { - return signV4(request, accessKey, secretKey, region, requestDate, serviceName) +export function signV4ByServiceName( request, accessKey, secretKey, region, requestDate, serviceName="s3") { + return signV4(request, accessKey, secretKey, region,requestDate, serviceName) } // returns a presigned URL string export function presignSignatureV4(request, accessKey, secretKey, sessionToken, region, requestDate, expires) { @@ -286,7 +283,8 @@ export function presignSignatureV4(request, accessKey, secretKey, sessionToken, const path = resource + '?' + query - const canonicalRequest = getCanonicalRequest(request.method, path, request.headers, signedHeaders, hashedPayload) + const canonicalRequest = getCanonicalRequest(request.method, path, + request.headers, signedHeaders, hashedPayload) const stringToSign = getStringToSign(canonicalRequest, requestDate, region) const signingKey = getSigningKey(requestDate, region, secretKey) diff --git a/src/main/transformers.js b/src/main/transformers.js index a3816dff..5b06b462 100644 --- a/src/main/transformers.js +++ b/src/main/transformers.js @@ -14,14 +14,14 @@ * limitations under the License. */ -import Crypto from 'crypto' -import JSONParser from 'json-stream' +import * as xmlParsers from './xml-parsers.js' import * as _ from 'lodash' import Through2 from 'through2' +import Crypto from 'crypto' +import JSONParser from 'json-stream' -import * as errors from './errors' -import { isFunction } from './helpers' -import * as xmlParsers from './xml-parsers' +import { isFunction } from './helpers.js' +import * as errors from './errors.js' // getConcater returns a stream that concatenates the input and emits // the concatenated output when 'end' has reached. If an optional @@ -39,29 +39,26 @@ export function getConcater(parser, emitError) { objectMode = true } - return Through2( - { objectMode }, - function (chunk, enc, cb) { - bufs.push(chunk) - cb() - }, - function (cb) { - if (emitError) { - cb(parser(Buffer.concat(bufs).toString())) - // cb(e) would mean we have to emit 'end' by explicitly calling this.push(null) - this.push(null) - return - } - if (bufs.length) { - if (parser) { - this.push(parser(Buffer.concat(bufs).toString())) - } else { - this.push(Buffer.concat(bufs)) - } - } - cb() - } - ) + return Through2({objectMode}, + function (chunk, enc, cb) { + bufs.push(chunk) + cb() + }, function (cb) { + if (emitError) { + cb(parser(Buffer.concat(bufs).toString())) + // cb(e) would mean we have to emit 'end' by explicitly calling this.push(null) + this.push(null) + return + } + if (bufs.length) { + if (parser) { + this.push(parser(Buffer.concat(bufs).toString())) + } else { + this.push(Buffer.concat(bufs)) + } + } + cb() + }) } // Generates an Error object depending on http statusCode and XML body @@ -101,7 +98,7 @@ export function getErrorTransformer(response) { // in HEAD bucket and ListObjects response. headerInfo.amzBucketRegion = response.headersSent ? response.getHeader('x-amz-bucket-region') : null - return getConcater((xmlString) => { + return getConcater(xmlString => { let getError = () => { // Message should be instantiated for each S3Errors. var e = new errors.S3Error(message) @@ -130,29 +127,27 @@ export function getHashSummer(enableSHA256) { var md5 = Crypto.createHash('md5') var sha256 = Crypto.createHash('sha256') - return Through2.obj( - function (chunk, enc, cb) { - if (enableSHA256) { - sha256.update(chunk) - } else { - md5.update(chunk) - } - cb() - }, - function (cb) { - var md5sum = '' - var sha256sum = '' - if (enableSHA256) { - sha256sum = sha256.digest('hex') - } else { - md5sum = md5.digest('base64') - } - var hashData = { md5sum, sha256sum } - this.push(hashData) - this.push(null) - cb() + return Through2.obj(function(chunk, enc, cb) { + + if (enableSHA256) { + sha256.update(chunk) + } else { + md5.update(chunk) + } + cb() + }, function(cb) { + var md5sum = '' + var sha256sum = '' + if (enableSHA256) { + sha256sum = sha256.digest('hex') + } else { + md5sum = md5.digest('base64') } - ) + var hashData = {md5sum, sha256sum} + this.push(hashData) + this.push(null) + cb() + }) } // Following functions return a stream object that parses XML @@ -219,44 +214,45 @@ export function getNotificationTransformer() { return new JSONParser() } -export function bucketVersioningTransformer() { +export function bucketVersioningTransformer(){ return getConcater(xmlParsers.parseBucketVersioningConfig) } export function getTagsTransformer() { - return getConcater(xmlParsers.parseTagging) + return getConcater( xmlParsers.parseTagging) } -export function lifecycleTransformer() { +export function lifecycleTransformer(){ return getConcater(xmlParsers.parseLifecycleConfig) } -export function objectLockTransformer() { + +export function objectLockTransformer(){ return getConcater(xmlParsers.parseObjectLockConfig) } -export function objectRetentionTransformer() { +export function objectRetentionTransformer(){ return getConcater(xmlParsers.parseObjectRetentionConfig) } -export function bucketEncryptionTransformer() { +export function bucketEncryptionTransformer(){ return getConcater(xmlParsers.parseBucketEncryptionConfig) } -export function replicationConfigTransformer() { +export function replicationConfigTransformer(){ return getConcater(xmlParsers.parseReplicationConfig) } -export function objectLegalHoldTransformer() { +export function objectLegalHoldTransformer(){ return getConcater(xmlParsers.parseObjectLegalHoldConfig) } -export function uploadPartTransformer() { +export function uploadPartTransformer(){ return getConcater(xmlParsers.uploadPartParser) } -export function selectObjectContentTransformer() { - return getConcater() +export function selectObjectContentTransformer(){ + return getConcater() } export function removeObjectsTransformer() { return getConcater(xmlParsers.removeObjectsParser) -} +} \ No newline at end of file diff --git a/src/main/xml-parsers.js b/src/main/xml-parsers.js index 3c8e6e64..f05b8f82 100644 --- a/src/main/xml-parsers.js +++ b/src/main/xml-parsers.js @@ -13,22 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { XMLParser } = require('fast-xml-parser') -const fxp = new XMLParser() +const { XMLParser } = require("fast-xml-parser") +const fxp = new XMLParser() import _ from 'lodash' - -import * as errors from './errors' +import * as errors from './errors.js' import { isObject, - parseXml, - readableStream, - RETENTION_VALIDITY_UNITS, sanitizeETag, - sanitizeObjectKey, - SelectResults, toArray, -} from './helpers' -var crc32 = require('buffer-crc32') + sanitizeObjectKey, + RETENTION_VALIDITY_UNITS, + parseXml, + readableStream, + SelectResults +} from "./helpers" +var crc32 = require("buffer-crc32") + // Parse XML and return information as Javascript types @@ -37,7 +37,7 @@ export function parseError(xml, headerInfo) { var xmlErr = {} var xmlObj = fxp.parse(xml) if (xmlObj.Error) { - xmlErr = xmlObj.Error + xmlErr = xmlObj.Error } var e = new errors.S3Error() @@ -54,8 +54,8 @@ export function parseError(xml, headerInfo) { // parse XML response for copy object export function parseCopyObject(xml) { var result = { - etag: '', - lastModified: '', + etag: "", + lastModified: "" } var xmlobj = parseXml(xml) @@ -63,13 +63,9 @@ export function parseCopyObject(xml) { throw new errors.InvalidXMLError('Missing tag: "CopyObjectResult"') } xmlobj = xmlobj.CopyObjectResult - if (xmlobj.ETag) - result.etag = xmlobj.ETag.replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') + if (xmlobj.ETag) result.etag = xmlobj.ETag.replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') if (xmlobj.LastModified) result.lastModified = new Date(xmlobj.LastModified) return result @@ -80,7 +76,7 @@ export function parseListMultipart(xml) { var result = { uploads: [], prefixes: [], - isTruncated: false, + isTruncated: false } var xmlobj = parseXml(xml) @@ -90,24 +86,24 @@ export function parseListMultipart(xml) { } xmlobj = xmlobj.ListMultipartUploadsResult if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextKeyMarker) result.nextKeyMarker = xmlobj.NextKeyMarker + if (xmlobj.NextKeyMarker) result.nextKeyMarker = xmlobj.NextKeyMarker if (xmlobj.NextUploadIdMarker) result.nextUploadIdMarker = xmlobj.nextUploadIdMarker if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach((prefix) => { - result.prefixes.push({ prefix: sanitizeObjectKey(toArray(prefix.Prefix)[0]) }) + toArray(xmlobj.CommonPrefixes).forEach(prefix => { + result.prefixes.push({prefix: sanitizeObjectKey(toArray(prefix.Prefix)[0])}) }) } if (xmlobj.Upload) { - toArray(xmlobj.Upload).forEach((upload) => { + toArray(xmlobj.Upload).forEach(upload => { var key = upload.Key var uploadId = upload.UploadId - var initiator = { id: upload.Initiator.ID, displayName: upload.Initiator.DisplayName } - var owner = { id: upload.Owner.ID, displayName: upload.Owner.DisplayName } + var initiator = {id: upload.Initiator.ID, displayName: upload.Initiator.DisplayName} + var owner = {id: upload.Owner.ID, displayName: upload.Owner.DisplayName} var storageClass = upload.StorageClass var initiated = new Date(upload.Initiated) - result.uploads.push({ key, uploadId, initiator, owner, storageClass, initiated }) + result.uploads.push({key, uploadId, initiator, owner, storageClass, initiated}) }) } return result @@ -125,10 +121,10 @@ export function parseListBucket(xml) { if (xmlobj.Buckets) { if (xmlobj.Buckets.Bucket) { - toArray(xmlobj.Buckets.Bucket).forEach((bucket) => { + toArray(xmlobj.Buckets.Bucket).forEach(bucket => { var name = bucket.Name var creationDate = new Date(bucket.CreationDate) - result.push({ name, creationDate }) + result.push({name, creationDate}) }) } } @@ -138,32 +134,32 @@ export function parseListBucket(xml) { // parse XML response for bucket notification export function parseBucketNotification(xml) { var result = { - TopicConfiguration: [], - QueueConfiguration: [], - CloudFunctionConfiguration: [], + TopicConfiguration : [], + QueueConfiguration : [], + CloudFunctionConfiguration : [], } // Parse the events list - var genEvents = function (events) { + var genEvents = function(events) { var result = [] if (events) { - toArray(events).forEach((s3event) => { + toArray(events).forEach(s3event => { result.push(s3event) }) } return result } // Parse all filter rules - var genFilterRules = function (filters) { + var genFilterRules = function(filters) { var result = [] if (filters) { filters = toArray(filters) if (filters[0].S3Key) { filters[0].S3Key = toArray(filters[0].S3Key) if (filters[0].S3Key[0].FilterRule) { - toArray(filters[0].S3Key[0].FilterRule).forEach((rule) => { + toArray(filters[0].S3Key[0].FilterRule).forEach(rule => { var Name = toArray(rule.Name)[0] var Value = toArray(rule.Value)[0] - result.push({ Name, Value }) + result.push({Name, Value}) }) } } @@ -176,32 +172,32 @@ export function parseBucketNotification(xml) { // Parse all topic configurations in the xml if (xmlobj.TopicConfiguration) { - toArray(xmlobj.TopicConfiguration).forEach((config) => { + toArray(xmlobj.TopicConfiguration).forEach(config => { var Id = toArray(config.Id)[0] var Topic = toArray(config.Topic)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.TopicConfiguration.push({ Id, Topic, Event, Filter }) + result.TopicConfiguration.push({ Id, Topic, Event, Filter}) }) } // Parse all topic configurations in the xml if (xmlobj.QueueConfiguration) { - toArray(xmlobj.QueueConfiguration).forEach((config) => { + toArray(xmlobj.QueueConfiguration).forEach(config => { var Id = toArray(config.Id)[0] var Queue = toArray(config.Queue)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.QueueConfiguration.push({ Id, Queue, Event, Filter }) + result.QueueConfiguration.push({ Id, Queue, Event, Filter}) }) } // Parse all QueueConfiguration arrays if (xmlobj.CloudFunctionConfiguration) { - toArray(xmlobj.CloudFunctionConfiguration).forEach((config) => { + toArray(xmlobj.CloudFunctionConfiguration).forEach(config => { var Id = toArray(config.Id)[0] var CloudFunction = toArray(config.CloudFunction)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.CloudFunctionConfiguration.push({ Id, CloudFunction, Event, Filter }) + result.CloudFunctionConfiguration.push({ Id, CloudFunction, Event, Filter}) }) } @@ -220,7 +216,7 @@ export function parseListParts(xml) { var result = { isTruncated: false, parts: [], - marker: undefined, + marker: undefined } if (!xmlobj.ListPartsResult) { throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"') @@ -229,16 +225,13 @@ export function parseListParts(xml) { if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated if (xmlobj.NextPartNumberMarker) result.marker = +toArray(xmlobj.NextPartNumberMarker)[0] if (xmlobj.Part) { - toArray(xmlobj.Part).forEach((p) => { - var part = +toArray(p.PartNumber)[0] + toArray(xmlobj.Part).forEach(p => { + var part = + toArray(p.PartNumber)[0] var lastModified = new Date(p.LastModified) - var etag = p.ETag.replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') - result.parts.push({ part, lastModified, etag }) + var etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') + result.parts.push({part, lastModified, etag}) }) } return result @@ -264,27 +257,32 @@ export function parseCompleteMultipart(xml) { var location = toArray(xmlobj.Location)[0] var bucket = toArray(xmlobj.Bucket)[0] var key = xmlobj.Key - var etag = xmlobj.ETag.replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') - .replace(/^"/g, '') - .replace(/"$/g, '') + var etag = xmlobj.ETag.replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') + .replace(/^"/g, '').replace(/"$/g, '') - return { location, bucket, key, etag } + return {location, bucket, key, etag} } // Complete Multipart can return XML Error after a 200 OK response if (xmlobj.Code && xmlobj.Message) { var errCode = toArray(xmlobj.Code)[0] var errMessage = toArray(xmlobj.Message)[0] - return { errCode, errMessage } + return {errCode, errMessage} } } -const formatObjInfo = (content, opts = {}) => { - let { Key, LastModified, ETag, Size, VersionId, IsLatest } = content - - if (!isObject(opts)) { +const formatObjInfo = (content, opts={}) => { + + let { + Key, + LastModified, + ETag, + Size, + VersionId, + IsLatest + } = content + + if(!isObject(opts)){ opts = {} } @@ -296,10 +294,10 @@ const formatObjInfo = (content, opts = {}) => { name, lastModified, etag, - size: Size, - versionId: VersionId, - isLatest: IsLatest, - isDeleteMarker: opts.IsDeleteMarker ? opts.IsDeleteMarker : false, + size:Size, + versionId:VersionId, + isLatest:IsLatest, + isDeleteMarker:opts.IsDeleteMarker ? opts.IsDeleteMarker: false } } @@ -307,56 +305,56 @@ const formatObjInfo = (content, opts = {}) => { export function parseListObjects(xml) { var result = { objects: [], - isTruncated: false, + isTruncated: false } let isTruncated = false let nextMarker, nextVersionKeyMarker const xmlobj = parseXml(xml) - const parseCommonPrefixesEntity = (responseEntity) => { - if (responseEntity) { + const parseCommonPrefixesEntity = responseEntity => { + if(responseEntity){ toArray(responseEntity).forEach((commonPrefix) => { - result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) + result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0}) }) } } const listBucketResult = xmlobj.ListBucketResult - const listVersionsResult = xmlobj.ListVersionsResult + const listVersionsResult=xmlobj.ListVersionsResult - if (listBucketResult) { - if (listBucketResult.IsTruncated) { + if(listBucketResult){ + if ( listBucketResult.IsTruncated) { isTruncated = listBucketResult.IsTruncated } if (listBucketResult.Contents) { - toArray(listBucketResult.Contents).forEach((content) => { + toArray(listBucketResult.Contents).forEach(content => { const name = sanitizeObjectKey(toArray(content.Key)[0]) const lastModified = new Date(toArray(content.LastModified)[0]) const etag = sanitizeETag(toArray(content.ETag)[0]) const size = content.Size - result.objects.push({ name, lastModified, etag, size }) + result.objects.push({name, lastModified, etag, size}) }) } - - if (listBucketResult.NextMarker) { + + if( listBucketResult.NextMarker){ nextMarker = listBucketResult.NextMarker } parseCommonPrefixesEntity(listBucketResult.CommonPrefixes) } - - if (listVersionsResult) { - if (listVersionsResult.IsTruncated) { + + if(listVersionsResult){ + if(listVersionsResult.IsTruncated){ isTruncated = listVersionsResult.IsTruncated } if (listVersionsResult.Version) { - toArray(listVersionsResult.Version).forEach((content) => { + toArray(listVersionsResult.Version).forEach(content => { result.objects.push(formatObjInfo(content)) }) } if (listVersionsResult.DeleteMarker) { - toArray(listVersionsResult.DeleteMarker).forEach((content) => { - result.objects.push(formatObjInfo(content, { IsDeleteMarker: true })) + toArray(listVersionsResult.DeleteMarker).forEach(content => { + result.objects.push(formatObjInfo(content, {IsDeleteMarker:true})) }) } @@ -369,7 +367,7 @@ export function parseListObjects(xml) { parseCommonPrefixesEntity(listVersionsResult.CommonPrefixes) } - result.isTruncated = isTruncated + result.isTruncated= isTruncated if (isTruncated) { result.nextMarker = nextVersionKeyMarker || nextMarker } @@ -380,7 +378,7 @@ export function parseListObjects(xml) { export function parseListObjectsV2(xml) { var result = { objects: [], - isTruncated: false, + isTruncated: false } var xmlobj = parseXml(xml) if (!xmlobj.ListBucketResult) { @@ -390,17 +388,17 @@ export function parseListObjectsV2(xml) { if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken if (xmlobj.Contents) { - toArray(xmlobj.Contents).forEach((content) => { + toArray(xmlobj.Contents).forEach(content => { var name = sanitizeObjectKey(toArray(content.Key)[0]) var lastModified = new Date(content.LastModified) var etag = sanitizeETag(content.ETag) var size = content.Size - result.objects.push({ name, lastModified, etag, size }) + result.objects.push({name, lastModified, etag, size}) }) } if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => { - result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) + toArray(xmlobj.CommonPrefixes).forEach(commonPrefix => { + result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size:0}) }) } return result @@ -410,7 +408,7 @@ export function parseListObjectsV2(xml) { export function parseListObjectsV2WithMetadata(xml) { var result = { objects: [], - isTruncated: false, + isTruncated: false } var xmlobj = parseXml(xml) if (!xmlobj.ListBucketResult) { @@ -421,7 +419,7 @@ export function parseListObjectsV2WithMetadata(xml) { if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken if (xmlobj.Contents) { - toArray(xmlobj.Contents).forEach((content) => { + toArray(xmlobj.Contents).forEach(content => { var name = sanitizeObjectKey(content.Key) var lastModified = new Date(content.LastModified) var etag = sanitizeETag(content.ETag) @@ -432,60 +430,57 @@ export function parseListObjectsV2WithMetadata(xml) { } else { metadata = null } - result.objects.push({ name, lastModified, etag, size, metadata }) + result.objects.push({name, lastModified, etag, size, metadata}) }) } if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => { - result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) + toArray(xmlobj.CommonPrefixes).forEach(commonPrefix => { + result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size:0}) }) } return result } -export function parseBucketVersioningConfig(xml) { +export function parseBucketVersioningConfig(xml){ var xmlObj = parseXml(xml) return xmlObj.VersioningConfiguration } -export function parseTagging(xml) { +export function parseTagging(xml){ const xmlObj = parseXml(xml) - let result = [] - if (xmlObj.Tagging && xmlObj.Tagging.TagSet && xmlObj.Tagging.TagSet.Tag) { + let result =[] + if(xmlObj.Tagging && xmlObj.Tagging.TagSet&& xmlObj.Tagging.TagSet.Tag){ const tagResult = xmlObj.Tagging.TagSet.Tag // if it is a single tag convert into an array so that the return value is always an array. - if (isObject(tagResult)) { + if(isObject(tagResult)){ result.push(tagResult) - } else { + }else{ result = tagResult } } return result } -export function parseLifecycleConfig(xml) { +export function parseLifecycleConfig(xml){ const xmlObj = parseXml(xml) return xmlObj.LifecycleConfiguration } -export function parseObjectLockConfig(xml) { + +export function parseObjectLockConfig(xml){ const xmlObj = parseXml(xml) - let lockConfigResult = {} - if (xmlObj.ObjectLockConfiguration) { + let lockConfigResult={} + if(xmlObj.ObjectLockConfiguration) { lockConfigResult = { - objectLockEnabled: xmlObj.ObjectLockConfiguration.ObjectLockEnabled, + objectLockEnabled: xmlObj.ObjectLockConfiguration.ObjectLockEnabled } let retentionResp - if ( - xmlObj.ObjectLockConfiguration && - xmlObj.ObjectLockConfiguration.Rule && - xmlObj.ObjectLockConfiguration.Rule.DefaultRetention - ) { + if(xmlObj.ObjectLockConfiguration && xmlObj.ObjectLockConfiguration.Rule && xmlObj.ObjectLockConfiguration.Rule.DefaultRetention){ retentionResp = xmlObj.ObjectLockConfiguration.Rule.DefaultRetention || {} - lockConfigResult.mode = retentionResp.Mode + lockConfigResult.mode= retentionResp.Mode } - if (retentionResp) { + if(retentionResp) { const isUnitYears = retentionResp.Years if (isUnitYears) { lockConfigResult.validity = isUnitYears @@ -499,102 +494,104 @@ export function parseObjectLockConfig(xml) { } } -export function parseObjectRetentionConfig(xml) { + +export function parseObjectRetentionConfig(xml){ const xmlObj = parseXml(xml) const retentionConfig = xmlObj.Retention return { - mode: retentionConfig.Mode, - retainUntilDate: retentionConfig.RetainUntilDate, + mode:retentionConfig.Mode, + retainUntilDate:retentionConfig.RetainUntilDate } } -export function parseBucketEncryptionConfig(xml) { +export function parseBucketEncryptionConfig(xml){ let encConfig = parseXml(xml) return encConfig } -export function parseReplicationConfig(xml) { +export function parseReplicationConfig(xml){ const xmlObj = parseXml(xml) const replicationConfig = { ReplicationConfiguration: { role: xmlObj.ReplicationConfiguration.Role, - rules: toArray(xmlObj.ReplicationConfiguration.Rule), - }, + rules: toArray(xmlObj.ReplicationConfiguration.Rule) + } } return replicationConfig } -export function parseObjectLegalHoldConfig(xml) { +export function parseObjectLegalHoldConfig(xml){ const xmlObj = parseXml(xml) return xmlObj.LegalHold } -export function uploadPartParser(xml) { +export function uploadPartParser (xml){ const xmlObj = parseXml(xml) const respEl = xmlObj.CopyPartResult return respEl } -export function removeObjectsParser(xml) { +export function removeObjectsParser(xml){ const xmlObj = parseXml(xml) - if (xmlObj.DeleteResult && xmlObj.DeleteResult.Error) { + if(xmlObj.DeleteResult && xmlObj.DeleteResult.Error){ // return errors as array always. as the response is object in case of single object passed in removeObjects return toArray(xmlObj.DeleteResult.Error) } return [] } -export function parseSelectObjectContentResponse(res) { +export function parseSelectObjectContentResponse(res){ + // extractHeaderType extracts the first half of the header message, the header type. function extractHeaderType(stream) { - const headerNameLen = Buffer.from(stream.read(1)).readUInt8() + const headerNameLen = Buffer.from(stream.read(1)).readUInt8() const headerNameWithSeparator = Buffer.from(stream.read(headerNameLen)).toString() - const splitBySeparator = (headerNameWithSeparator || '').split(':') - const headerName = splitBySeparator.length >= 1 ? splitBySeparator[1] : '' + const splitBySeparator = (headerNameWithSeparator|| "").split(":") + const headerName = splitBySeparator.length >= 1 ? splitBySeparator[1] : "" return headerName } - function extractHeaderValue(stream) { - const bodyLen = Buffer.from(stream.read(2)).readUInt16BE() - const bodyName = Buffer.from(stream.read(bodyLen)).toString() + function extractHeaderValue(stream){ + const bodyLen= Buffer.from(stream.read(2)).readUInt16BE() + const bodyName= Buffer.from(stream.read(bodyLen)).toString() return bodyName } - const selectResults = new SelectResults({}) // will be returned + + const selectResults = new SelectResults({})// will be returned const responseStream = readableStream(res) // convert byte array to a readable responseStream - while (responseStream._readableState.length) { - // Top level responseStream read tracker. + while( responseStream._readableState.length ) { // Top level responseStream read tracker. let msgCrcAccumulator // accumulate from start of the message till the message crc start. const totalByteLengthBuffer = Buffer.from(responseStream.read(4)) msgCrcAccumulator = crc32(totalByteLengthBuffer) const headerBytesBuffer = Buffer.from(responseStream.read(4)) - msgCrcAccumulator = crc32(headerBytesBuffer, msgCrcAccumulator) + msgCrcAccumulator = crc32(headerBytesBuffer,msgCrcAccumulator) const calculatedPreludeCrc = msgCrcAccumulator.readInt32BE() // use it to check if any CRC mismatch in header itself. - const preludeCrcBuffer = Buffer.from(responseStream.read(4)) // read 4 bytes i.e 4+4 =8 + 4 = 12 ( prelude + prelude crc) - msgCrcAccumulator = crc32(preludeCrcBuffer, msgCrcAccumulator) + const preludeCrcBuffer = Buffer.from(responseStream.read(4))// read 4 bytes i.e 4+4 =8 + 4 = 12 ( prelude + prelude crc) + msgCrcAccumulator = crc32(preludeCrcBuffer,msgCrcAccumulator) - const totalMsgLength = totalByteLengthBuffer.readInt32BE() - const headerLength = headerBytesBuffer.readInt32BE() + const totalMsgLength=totalByteLengthBuffer.readInt32BE() + const headerLength=headerBytesBuffer.readInt32BE() const preludeCrcByteValue = preludeCrcBuffer.readInt32BE() - if (preludeCrcByteValue !== calculatedPreludeCrc) { + if(preludeCrcByteValue !== calculatedPreludeCrc){ // Handle Header CRC mismatch Error - throw new Error( - `Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}` - ) + throw new Error(`Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}`) } const headers = {} if (headerLength > 0) { const headerBytes = Buffer.from(responseStream.read(headerLength)) - msgCrcAccumulator = crc32(headerBytes, msgCrcAccumulator) + msgCrcAccumulator = crc32(headerBytes,msgCrcAccumulator) const headerReaderStream = readableStream(headerBytes) - while (headerReaderStream._readableState.length) { + while ( + headerReaderStream._readableState.length + ) { let headerTypeName = extractHeaderType(headerReaderStream) headerReaderStream.read(1) // just read and ignore it. headers[headerTypeName] = extractHeaderValue(headerReaderStream) @@ -603,83 +600,80 @@ export function parseSelectObjectContentResponse(res) { let payloadStream const payLoadLength = totalMsgLength - headerLength - 16 - if (payLoadLength > 0) { + if(payLoadLength > 0) { const payLoadBuffer = Buffer.from(responseStream.read(payLoadLength)) msgCrcAccumulator = crc32(payLoadBuffer, msgCrcAccumulator) // read the checksum early and detect any mismatch so we can avoid unnecessary further processing. const messageCrcByteValue = Buffer.from(responseStream.read(4)).readInt32BE() const calculatedCrc = msgCrcAccumulator.readInt32BE() // Handle message CRC Error - if (messageCrcByteValue !== calculatedCrc) { - throw new Error( - `Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}` - ) + if(messageCrcByteValue !== calculatedCrc){ + throw new Error(`Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}`) } payloadStream = readableStream(payLoadBuffer) } - const messageType = headers['message-type'] + const messageType = headers["message-type"] switch (messageType) { - case 'error': { - const errorMessage = headers['error-code'] + ':"' + headers['error-message'] + '"' - throw new Error(errorMessage) + case "error": { + const errorMessage = headers["error-code"] + ":\"" + headers["error-message"] + "\"" + throw new Error(errorMessage) + } + case "event": { + const contentType = headers["content-type"] + const eventType = headers["event-type"] + + switch (eventType) { + case "End": { + selectResults.setResponse(res) + return selectResults + } + + case "Records": { + const readData = payloadStream.read(payLoadLength) + selectResults.setRecords(readData) + break + } + + case "Progress": { + switch (contentType) { + case "text/xml": { + const progressData = payloadStream.read(payLoadLength) + selectResults.setProgress(progressData.toString()) + break + } + default: { + const errorMessage = `Unexpected content-type ${contentType} sent for event-type Progress` + throw new Error(errorMessage) + } + } } - case 'event': { - const contentType = headers['content-type'] - const eventType = headers['event-type'] - - switch (eventType) { - case 'End': { - selectResults.setResponse(res) - return selectResults - } - - case 'Records': { - const readData = payloadStream.read(payLoadLength) - selectResults.setRecords(readData) - break - } - - case 'Progress': - { - switch (contentType) { - case 'text/xml': { - const progressData = payloadStream.read(payLoadLength) - selectResults.setProgress(progressData.toString()) - break - } - default: { - const errorMessage = `Unexpected content-type ${contentType} sent for event-type Progress` - throw new Error(errorMessage) - } - } - } - break - case 'Stats': - { - switch (contentType) { - case 'text/xml': { - const statsData = payloadStream.read(payLoadLength) - selectResults.setStats(statsData.toString()) - break - } - default: { - const errorMessage = `Unexpected content-type ${contentType} sent for event-type Stats` - throw new Error(errorMessage) - } - } - } - break - default: { - // Continuation message: Not sure if it is supported. did not find a reference or any message in response. - // It does not have a payload. - const warningMessage = `Un implemented event detected ${messageType}.` - // eslint-disable-next-line no-console - console.warn(warningMessage) - } - } // eventType End - } // Event End + break + case "Stats": { + switch (contentType) { + case "text/xml": { + const statsData = payloadStream.read(payLoadLength) + selectResults.setStats(statsData.toString()) + break + } + default: { + const errorMessage = `Unexpected content-type ${contentType} sent for event-type Stats` + throw new Error(errorMessage) + } + } + } + break + default: { + // Continuation message: Not sure if it is supported. did not find a reference or any message in response. + // It does not have a payload. + const warningMessage = `Un implemented event detected ${messageType}.` + // eslint-disable-next-line no-console + console.warn(warningMessage) + } + } // eventType End + } // Event End } // messageType End } // Top Level Stream End -} + +} \ No newline at end of file diff --git a/src/test/functional/functional-tests.js b/src/test/functional/functional-tests.js index 655e99a5..2a938ef0 100644 --- a/src/test/functional/functional-tests.js +++ b/src/test/functional/functional-tests.js @@ -26,20 +26,20 @@ const url = require('url') const chai = require('chai') const assert = chai.assert const superagent = require('superagent') -const uuid = require('uuid') +const uuid = require("uuid") const splitFile = require('split-file') -const step = require('mocha-steps').step +const step = require("mocha-steps").step let helpers try { - helpers = require('../../../dist/main/helpers') + helpers = require("../../../dist/main/helpers") } catch (err) { helpers = require('minio/dist/main/helpers') } let AssumeRoleProvider try { - AssumeRoleProvider = require('../../../dist/main/AssumeRoleProvider') + AssumeRoleProvider = require("../../../dist/main/AssumeRoleProvider") } catch (err) { AssumeRoleProvider = require('minio/dist/main/AssumeRoleProvider') } @@ -52,23 +52,29 @@ try { minio = require('minio') } -const { getVersionId, isArray, CopyDestinationOptions, CopySourceOptions, removeDirAndFiles, DEFAULT_REGION } = helpers +const { + getVersionId, isArray, + CopyDestinationOptions, + CopySourceOptions, + removeDirAndFiles, + DEFAULT_REGION +} = helpers require('source-map-support').install() -const isWindowsPlatform = process.platform === 'win32' +const isWindowsPlatform = process.platform === "win32" describe('functional tests', function () { this.timeout(30 * 60 * 1000) var clientConfigParams = {} - var region_conf_env = process.env['MINIO_REGION'] + var region_conf_env=process.env['MINIO_REGION'] if (process.env['SERVER_ENDPOINT']) { - var res = process.env['SERVER_ENDPOINT'].split(':') + var res = process.env['SERVER_ENDPOINT'].split(":") clientConfigParams.endPoint = res[0] clientConfigParams.port = parseInt(res[1]) - var access_Key_env = process.env['ACCESS_KEY'] - var secret_key_env = process.env['SECRET_KEY'] + var access_Key_env= process.env['ACCESS_KEY'] + var secret_key_env=process.env['SECRET_KEY'] // If the user provides ENABLE_HTTPS, 1 = secure, anything else = unsecure. // Otherwise default useSSL as true. @@ -88,7 +94,8 @@ describe('functional tests', function () { console.error(`Error: SECRET_KEY Environment variable is not set`) process.exit(1) } - clientConfigParams.useSSL = enable_https_env == '1' + clientConfigParams.useSSL = (enable_https_env == '1') + } else { // If credentials aren't given, default to play.min.io. clientConfigParams.endPoint = 'play.min.io' @@ -104,6 +111,7 @@ describe('functional tests', function () { // if not set, putObject with stream data and undefined length will use about 500Mb chunkSize (5Tb/10000). clientConfigParams.partSize = 64 * 1024 * 1024 + // dataDir is falsy if we need to generate data on the fly. Otherwise, it will be // a directory with files to read from, i.e. /mint/data. var dataDir = process.env['MINT_DATA_DIR'] @@ -113,6 +121,7 @@ describe('functional tests', function () { usEastConfig.region = server_region var clientUsEastRegion = new minio.Client(usEastConfig) + var traceStream // FUNCTIONAL_TEST_TRACE env variable contains the path to which trace // will be logged. Set it to /dev/stdout log to the stdout. @@ -122,13 +131,13 @@ describe('functional tests', function () { if (trace_func_test_file_path === 'process.stdout') { traceStream = process.stdout } else { - traceStream = fs.createWriteStream(trace_func_test_file_path, { flags: 'a' }) + traceStream = fs.createWriteStream(trace_func_test_file_path, {flags: 'a'}) } traceStream.write('====================================\n') client.traceOn(traceStream) } - var bucketName = 'minio-js-test-' + uuid.v4() + var bucketName = "minio-js-test-" + uuid.v4() var objectName = uuid.v4() var _1byteObjectName = 'datafile-1-b' @@ -153,13 +162,13 @@ describe('functional tests', function () { var _5mbmd5 = crypto.createHash('md5').update(_5mb).digest('hex') // create new http agent to check requests release sockets - var httpAgent = (clientConfigParams.useSSL ? https : http).Agent({ keepAlive: true }) - client.setRequestOptions({ agent: httpAgent }) + var httpAgent = (clientConfigParams.useSSL ? https : http).Agent({keepAlive: true}) + client.setRequestOptions({agent: httpAgent}) var metaData = { 'Content-Type': 'text/html', 'Content-Language': 'en', 'X-Amz-Meta-Testing': 1234, - randomstuff: 5678, + 'randomstuff': 5678 } var tmpDir = os.tmpdir() @@ -172,8 +181,8 @@ describe('functional tests', function () { return s } - before((done) => client.makeBucket(bucketName, server_region, done)) - after((done) => client.removeBucket(bucketName, done)) + before(done => client.makeBucket(bucketName, server_region, done)) + after(done => client.removeBucket(bucketName, done)) if (traceStream) { after(() => { @@ -186,26 +195,25 @@ describe('functional tests', function () { describe('makeBucket with period and region', () => { if (clientConfigParams.endPoint === 's3.amazonaws.com') { - step('makeBucket(bucketName, region, cb)_region:eu-central-1_', (done) => - client.makeBucket(`${bucketName}.sec.period`, 'eu-central-1', done) - ) - step('removeBucket(bucketName, cb)__', (done) => client.removeBucket(`${bucketName}.sec.period`, done)) + step('makeBucket(bucketName, region, cb)_region:eu-central-1_', done => client.makeBucket(`${bucketName}.sec.period`, + 'eu-central-1', done)) + step('removeBucket(bucketName, cb)__', done => client.removeBucket(`${bucketName}.sec.period`, done)) } }) describe('listBuckets', () => { - step('listBuckets(cb)__', (done) => { + step('listBuckets(cb)__', done => { client.listBuckets((e, buckets) => { if (e) return done(e) - if (_.find(buckets, { name: bucketName })) return done() + if (_.find(buckets, {name: bucketName})) return done() done(new Error('bucket not found')) }) }) - step('listBuckets()__', (done) => { - client - .listBuckets() - .then((buckets) => { - if (!_.find(buckets, { name: bucketName })) return done(new Error('bucket not found')) + step('listBuckets()__', done => { + client.listBuckets() + .then(buckets => { + if (!_.find(buckets, {name: bucketName})) + return done(new Error('bucket not found')) }) .then(() => done()) .catch(done) @@ -214,7 +222,7 @@ describe('functional tests', function () { describe('makeBucket with region', () => { let isDifferentServerRegion = false - step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-2_`, (done) => { + step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-2_`, done => { try { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-2', assert.fail) } catch (e) { @@ -222,20 +230,20 @@ describe('functional tests', function () { done() } }) - step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-1_`, (done) => { - if (!isDifferentServerRegion) { + step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-1_`, done => { + if(!isDifferentServerRegion) { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-1', done) } done() }) - step(`removeBucket(bucketName, cb)_bucketName:${bucketName}-region_`, (done) => { - if (!isDifferentServerRegion) { + step(`removeBucket(bucketName, cb)_bucketName:${bucketName}-region_`, done => { + if(!isDifferentServerRegion) { clientUsEastRegion.removeBucket(`${bucketName}-region`, done) } done() }) - step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region, region:us-east-1_`, (done) => { - if (!isDifferentServerRegion) { + step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region, region:us-east-1_`, done => { + if(!isDifferentServerRegion) { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-1', (e) => { if (e) { // Some object storage servers like Azure, might not delete a bucket rightaway @@ -248,10 +256,9 @@ describe('functional tests', function () { } done() }) - step(`removeBucket(bucketName)_bucketName:${bucketName}-region_`, (done) => { - if (!isDifferentServerRegion) { - clientUsEastRegion - .removeBucket(`${bucketName}-region`) + step(`removeBucket(bucketName)_bucketName:${bucketName}-region_`, done => { + if(!isDifferentServerRegion) { + clientUsEastRegion.removeBucket(`${bucketName}-region`) .then(() => done()) .catch(done) } @@ -260,84 +267,70 @@ describe('functional tests', function () { }) describe('bucketExists', () => { - step(`bucketExists(bucketName, cb)_bucketName:${bucketName}_`, (done) => client.bucketExists(bucketName, done)) - step(`bucketExists(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { + step(`bucketExists(bucketName, cb)_bucketName:${bucketName}_`, done => client.bucketExists(bucketName, done)) + step(`bucketExists(bucketName, cb)_bucketName:${bucketName}random_`, done => { client.bucketExists(bucketName + 'random', (e, exists) => { if (e === null && !exists) return done() done(new Error()) }) }) - step(`bucketExists(bucketName)_bucketName:${bucketName}_`, (done) => { - client - .bucketExists(bucketName) + step(`bucketExists(bucketName)_bucketName:${bucketName}_`, done => { + client.bucketExists(bucketName) .then(() => done()) .catch(done) }) }) + describe('removeBucket', () => { - step(`removeBucket(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { + step(`removeBucket(bucketName, cb)_bucketName:${bucketName}random_`, done => { client.removeBucket(bucketName + 'random', (e) => { if (e.code === 'NoSuchBucket') return done() done(new Error()) }) }) - step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region-1, region:us-east-1_`, (done) => { - client - .makeBucket(`${bucketName}-region-1`, '') + step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region-1, region:us-east-1_`, done => { + client.makeBucket(`${bucketName}-region-1`, '') .then(() => client.removeBucket(`${bucketName}-region-1`)) .then(() => done()) .catch(done) }) }) describe('tests for putObject getObject removeObject with multipath', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}, stream:100Kib_`, - (done) => { - client - .putObject(bucketName, _MultiPath100kbObjectBufferName, _100kb) - .then(() => done()) - .catch(done) - } - ) + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}, stream:100Kib_`, done => { + client.putObject(bucketName, _MultiPath100kbObjectBufferName, _100kb) + .then(() => done()) + .catch(done) + }) - step( - `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, - (done) => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _MultiPath100kbObjectBufferName, (e, stream) => { - if (e) return done(e) - stream.on('data', (data) => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() - done(new Error('content mismatch')) - }) + step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, done => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _MultiPath100kbObjectBufferName, (e, stream) => { + if (e) return done(e) + stream.on('data', data => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === _100kbmd5) return done() + done(new Error('content mismatch')) }) - } - ) + }) + }) + + step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, done => { + client.removeObject(bucketName, _MultiPath100kbObjectBufferName) + .then(() => done()) + .catch(done) + }) - step( - `removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, - (done) => { - client - .removeObject(bucketName, _MultiPath100kbObjectBufferName) - .then(() => done()) - .catch(done) - } - ) }) describe('tests for putObject copyObject getObject getPartialObject statObject removeObject', function () { var tmpFileUpload = `${tmpDir}/${_100kbObjectName}` - step( - `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUpload}_`, - (done) => { - fs.writeFileSync(tmpFileUpload, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUpload, done) - } - ) + step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUpload}_`, done => { + fs.writeFileSync(tmpFileUpload, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUpload, done) + }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is not provided and there is no file extension, @@ -350,15 +343,12 @@ describe('functional tests', function () { }) var tmpFileUploadWithExt = `${tmpDir}/${_100kbObjectName}.txt` - step( - `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}, metaData:${metaData}_`, - (done) => { - fs.writeFileSync(tmpFileUploadWithExt, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, metaData, done) - } - ) + step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}, metaData:${metaData}_`, done => { + fs.writeFileSync(tmpFileUploadWithExt, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, metaData, done) + }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is provided, even though we have an extension, @@ -372,169 +362,128 @@ describe('functional tests', function () { }) }) - step( - `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}_`, - (done) => { - fs.writeFileSync(tmpFileUploadWithExt, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, done) - } - ) + step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}_`, done => { + fs.writeFileSync(tmpFileUploadWithExt, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, done) + }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is not provided but we have a file extension, // we need to infer `content-type` from the file extension - if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') - return done(new Error('content-type mismatch')) + if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') return done(new Error('content-type mismatch')) done() }) }) - step( - `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}, metaData:${metaData}_`, - (done) => { - var stream = readableStream(_100kb) - client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, metaData, done) - } - ) + step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}, metaData:${metaData}_`, done => { + var stream = readableStream(_100kb) + client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, metaData, done) + }) - step( - `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}_`, - (done) => { - var stream = readableStream(_100kb) - client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, done) - } - ) + step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}_`, done => { + var stream = readableStream(_100kb) + client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, done) + }) - step( - `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, - (done) => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _100kbObjectName, (e, stream) => { - if (e) return done(e) - stream.on('data', (data) => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() - done(new Error('content mismatch')) - }) + step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _100kbObjectName, (e, stream) => { + if (e) return done(e) + stream.on('data', data => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === _100kbmd5) return done() + done(new Error('content mismatch')) }) - } - ) + }) + }) - step( - `putObject(bucketName, objectName, stream, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_`, - (done) => { - client.putObject(bucketName, _100kbObjectBufferName, _100kb, '', done) - } - ) + step(`putObject(bucketName, objectName, stream, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_`, done => { + client.putObject(bucketName, _100kbObjectBufferName, _100kb, '', done) + }) - step( - `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, - (done) => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _100kbObjectBufferName, (e, stream) => { - if (e) return done(e) - stream.on('data', (data) => hash.update(data)) - stream.on('error', done) + step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, done => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _100kbObjectBufferName, (e, stream) => { + if (e) return done(e) + stream.on('data', data => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === _100kbmd5) return done() + done(new Error('content mismatch')) + }) + }) + }) + + step(`putObject(bucketName, objectName, stream, metaData)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_, metaData:{}`, done => { + client.putObject(bucketName, _100kbObjectBufferName, _100kb, {}) + .then(() => done()) + .catch(done) + }) + + step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:0, length=1024_`, done => { + client.getPartialObject(bucketName, _100kbObjectBufferName, 0, 1024) + .then(stream => { + stream.on('data', function() {}) + stream.on('end', done) + }) + .catch(done) + }) + + step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024, length=1024_`, done => { + var expectedHash = crypto.createHash('md5').update(_100kb.slice(1024, 2048)).digest('hex') + var hash = crypto.createHash('md5') + client.getPartialObject(bucketName, _100kbObjectBufferName, 1024, 1024) + .then(stream => { + stream.on('data', data => hash.update(data)) stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() + if (hash.digest('hex') === expectedHash) return done() done(new Error('content mismatch')) }) }) - } - ) + .catch(done) + }) - step( - `putObject(bucketName, objectName, stream, metaData)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_, metaData:{}`, - (done) => { - client - .putObject(bucketName, _100kbObjectBufferName, _100kb, {}) - .then(() => done()) - .catch(done) - } - ) - - step( - `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:0, length=1024_`, - (done) => { - client - .getPartialObject(bucketName, _100kbObjectBufferName, 0, 1024) - .then((stream) => { - stream.on('data', function () {}) - stream.on('end', done) - }) - .catch(done) - } - ) - - step( - `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024, length=1024_`, - (done) => { - var expectedHash = crypto.createHash('md5').update(_100kb.slice(1024, 2048)).digest('hex') - var hash = crypto.createHash('md5') - client - .getPartialObject(bucketName, _100kbObjectBufferName, 1024, 1024) - .then((stream) => { - stream.on('data', (data) => hash.update(data)) - stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() - done(new Error('content mismatch')) - }) - }) - .catch(done) - } - ) - - step( - `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024`, - (done) => { - var hash = crypto.createHash('md5') - client - .getPartialObject(bucketName, _100kbObjectBufferName, 1024) - .then((stream) => { - stream.on('data', (data) => hash.update(data)) - stream.on('end', () => { - if (hash.digest('hex') === _100kb1kboffsetmd5) return done() - done(new Error('content mismatch')) - }) - }) - .catch(done) - } - ) - - step( - `getObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, - (done) => { - client - .getObject(bucketName, _100kbObjectBufferName) - .then((stream) => { - stream.on('data', function () {}) - stream.on('end', done) + step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024`, done => { + var hash = crypto.createHash('md5') + client.getPartialObject(bucketName, _100kbObjectBufferName, 1024) + .then(stream => { + stream.on('data', data => hash.update(data)) + stream.on('end', () => { + if (hash.digest('hex') === _100kb1kboffsetmd5) return done() + done(new Error('content mismatch')) }) - .catch(done) - } - ) + }) + .catch(done) + }) - step( - `putObject(bucketName, objectName, stream, metadata, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, - (done) => { - var stream = readableStream(_65mb) - client.putObject(bucketName, _65mbObjectName, stream, metaData, () => { - setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() - done(new Error('http request did not release network socket')) - }, 100) + step(`getObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, done => { + client.getObject(bucketName, _100kbObjectBufferName) + .then(stream => { + stream.on('data', function() {}) + stream.on('end', done) }) - } - ) + .catch(done) + }) + + step(`putObject(bucketName, objectName, stream, metadata, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { + var stream = readableStream(_65mb) + client.putObject(bucketName, _65mbObjectName, stream, metaData, () => { + setTimeout(() => { + if (Object.values(httpAgent.sockets).length === 0) return done() + done(new Error('http request did not release network socket')) + }, 100) + }) - step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { + }) + + step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { var hash = crypto.createHash('md5') client.getObject(bucketName, _65mbObjectName, (e, stream) => { if (e) return done(e) - stream.on('data', (data) => hash.update(data)) + stream.on('data', data => hash.update(data)) stream.on('error', done) stream.on('end', () => { if (hash.digest('hex') === _65mbmd5) return done() @@ -543,116 +492,89 @@ describe('functional tests', function () { }) }) - step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName} non-existent object`, (done) => { + step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName} non-existent object`, done => { client.getObject(bucketName, 'an-object-that-does-not-exist', (e, stream) => { - if (stream) return done(new Error('on errors the stream object should not exist')) - if (!e) return done(new Error('expected an error object')) - if (e.code !== 'NoSuchKey') return done(new Error('expected NoSuchKey error')) + if (stream) return done(new Error("on errors the stream object should not exist")) + if (!e) return done(new Error("expected an error object")) + if (e.code !== 'NoSuchKey') return done(new Error("expected NoSuchKey error")) done() }) }) - step( - `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, offset:0, length:100*1024_`, - (done) => { - var hash = crypto.createHash('md5') - var expectedHash = crypto - .createHash('md5') - .update(_65mb.slice(0, 100 * 1024)) - .digest('hex') - client.getPartialObject(bucketName, _65mbObjectName, 0, 100 * 1024, (e, stream) => { - if (e) return done(e) - stream.on('data', (data) => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() - done(new Error('content mismatch')) - }) + step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, offset:0, length:100*1024_`, done => { + var hash = crypto.createHash('md5') + var expectedHash = crypto.createHash('md5').update(_65mb.slice(0, 100 * 1024)).digest('hex') + client.getPartialObject(bucketName, _65mbObjectName, 0, 100 * 1024, (e, stream) => { + if (e) return done(e) + stream.on('data', data => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === expectedHash) return done() + done(new Error('content mismatch')) }) - } - ) + }) + }) - step( - `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, - (done) => { - client.copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName, (e) => { - if (e) return done(e) - done() - }) - } - ) + step(`copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, done => { + client.copyObject(bucketName, _65mbObjectNameCopy, "/" + bucketName + "/" + _65mbObjectName, (e) => { + if (e) return done(e) + done() + }) + }) - step( - `copyObject(bucketName, objectName, srcObject)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, - (done) => { - client - .copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName) - .then(() => done()) - .catch(done) - } - ) + step(`copyObject(bucketName, objectName, srcObject)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, done => { + client.copyObject(bucketName, _65mbObjectNameCopy, "/" + bucketName + "/" + _65mbObjectName) + .then(() => done()) + .catch(done) + }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { client.statObject(bucketName, _65mbObjectName, (e, stat) => { if (e) return done(e) if (stat.size !== _65mb.length) return done(new Error('size mismatch')) - if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) - return done(new Error('metadata "randomstuff" mismatch')) - if (`${metaData['X-Amz-Meta-Testing']}` !== stat.metaData['testing']) - return done(new Error('metadata "testing" mismatch')) - if (`${metaData['Content-Type']}` !== stat.metaData['content-type']) - return done(new Error('metadata "content-type" mismatch')) - if (`${metaData['Content-Language']}` !== stat.metaData['content-language']) - return done(new Error('metadata "content-language" mismatch')) + if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) return done(new Error('metadata "randomstuff" mismatch')) + if (`${metaData["X-Amz-Meta-Testing"]}` !== stat.metaData["testing"]) return done(new Error('metadata "testing" mismatch')) + if (`${metaData["Content-Type"]}` !== stat.metaData["content-type"]) return done(new Error('metadata "content-type" mismatch')) + if (`${metaData["Content-Language"]}` !== stat.metaData["content-language"]) return done(new Error('metadata "content-language" mismatch')) done() }) }) - step(`statObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { - client - .statObject(bucketName, _65mbObjectName) - .then((stat) => { - if (stat.size !== _65mb.length) return done(new Error('size mismatch')) + step(`statObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { + client.statObject(bucketName, _65mbObjectName) + .then(stat => { + if (stat.size !== _65mb.length) + return done(new Error('size mismatch')) }) .then(() => done()) .catch(done) }) - step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { - client - .removeObject(bucketName, _100kbObjectName) + step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + client.removeObject(bucketName, _100kbObjectName) .then(function () { - async.map( - [_100kbObjectBufferName, _65mbObjectName, _65mbObjectNameCopy], - (objectName, cb) => client.removeObject(bucketName, objectName, cb), - done - ) + async.map([_100kbObjectBufferName, _65mbObjectName, _65mbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) }) .catch(done) }) + }) describe('tests for copyObject statObject', function () { var etag var modifiedDate - step( - `putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream: 100kb, metaData:${metaData}_`, - (done) => { - client.putObject(bucketName, _100kbObjectName, _100kb, metaData, done) - } - ) + step(`putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream: 100kb, metaData:${metaData}_`, done => { + client.putObject(bucketName, _100kbObjectName, _100kb, metaData, done) + }) - step( - `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}_`, - (done) => { - client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, (e) => { - if (e) return done(e) - done() - }) - } - ) + step(`copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}_`, done => { + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, (e) => { + if (e) return done(e) + done() + }) + }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) if (stat.size !== _100kb.length) return done(new Error('size mismatch')) @@ -665,162 +587,123 @@ describe('functional tests', function () { }) }) - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptIncorrectEtag_`, - (done) => { - var conds = new minio.CopyConditions() - conds.setMatchETagExcept('TestEtag') - client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() - }) - } - ) - - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptCorrectEtag_`, - (done) => { - var conds = new minio.CopyConditions() - conds.setMatchETagExcept(etag) - client - .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) - .then(() => { - done(new Error('CopyObject should have failed.')) - }) - .catch(() => done()) - } - ) - - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchCorrectEtag_`, - (done) => { - var conds = new minio.CopyConditions() - conds.setMatchETag(etag) - client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptIncorrectEtag_`, done => { + var conds = new minio.CopyConditions() + conds.setMatchETagExcept('TestEtag') + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() + }) + }) + + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptCorrectEtag_`, done => { + var conds = new minio.CopyConditions() + conds.setMatchETagExcept(etag) + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) + .then(() => { + done(new Error("CopyObject should have failed.")) }) - } - ) - - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchIncorrectEtag_`, - (done) => { - var conds = new minio.CopyConditions() - conds.setMatchETag('TestETag') - client - .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) - .then(() => { - done(new Error('CopyObject should have failed.')) - }) - .catch(() => done()) - } - ) - - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since ${modifiedDate}`, - (done) => { - var conds = new minio.CopyConditions() - conds.setUnmodified(new Date(modifiedDate)) - client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() + .catch(() => done()) + }) + + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchCorrectEtag_`, done => { + var conds = new minio.CopyConditions() + conds.setMatchETag(etag) + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() + }) + }) + + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchIncorrectEtag_`, done => { + var conds = new minio.CopyConditions() + conds.setMatchETag('TestETag') + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) + .then(() => { + done(new Error("CopyObject should have failed.")) }) - } - ) - - step( - `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since 2010-03-26T12:00:00Z_`, - (done) => { - var conds = new minio.CopyConditions() - conds.setUnmodified(new Date('2010-03-26T12:00:00Z')) - client - .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) - .then(() => { - done(new Error('CopyObject should have failed.')) - }) - .catch(() => done()) - } - ) + .catch(() => done()) + }) - step( - `statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, - (done) => { - client.statObject(bucketName, _100kbObjectNameCopy, (e, stat) => { - if (e) return done(e) - if (stat.size !== _100kb.length) return done(new Error('size mismatch')) - done() + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since ${modifiedDate}`, done => { + var conds = new minio.CopyConditions() + conds.setUnmodified(new Date(modifiedDate)) + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() + }) + }) + + step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since 2010-03-26T12:00:00Z_`, done => { + var conds = new minio.CopyConditions() + conds.setUnmodified(new Date("2010-03-26T12:00:00Z")) + client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) + .then(() => { + done(new Error("CopyObject should have failed.")) }) - } - ) - - step( - `removeObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, - (done) => { - async.map( - [_100kbObjectName, _100kbObjectNameCopy], - (objectName, cb) => client.removeObject(bucketName, objectName, cb), - done - ) - } - ) + .catch(() => done()) + }) + + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, done => { + client.statObject(bucketName, _100kbObjectNameCopy, (e, stat) => { + if (e) return done(e) + if (stat.size !== _100kb.length) return done(new Error('size mismatch')) + done() + }) + }) + + step(`removeObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, done => { + async.map([_100kbObjectName, _100kbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) + }) + }) describe('listIncompleteUploads removeIncompleteUpload', () => { - step( - `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, metaData:${metaData}`, - (done) => { - client.initiateNewMultipartUpload(bucketName, _65mbObjectName, metaData, done) + step(`initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, metaData:${metaData}`, done => { + client.initiateNewMultipartUpload(bucketName, _65mbObjectName, metaData, done) + }) + step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix:${_65mbObjectName}, recursive: true_`, function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + this.skip() } - ) - step( - `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix:${_65mbObjectName}, recursive: true_`, - function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - this.skip() - } - var found = false - client - .listIncompleteUploads(bucketName, _65mbObjectName, true) - .on('error', (e) => done(e)) - .on('data', (data) => { - if (data.key === _65mbObjectName) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) - }) + var found = false + client.listIncompleteUploads(bucketName, _65mbObjectName, true) + .on('error', e => done(e)) + .on('data', data => { + if (data.key === _65mbObjectName) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) + }) + }) + step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive: true_`, function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + this.skip() } - ) - step( - `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive: true_`, - function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - this.skip() - } - var found = false - client - .listIncompleteUploads(bucketName, '', true) - .on('error', (e) => done(e)) - .on('data', (data) => { - if (data.key === _65mbObjectName) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) - }) - } - ) - step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${bucketName}, prefix:${_65mbObjectName}_`, (done) => { - client.removeIncompleteUpload(bucketName, _65mbObjectName).then(done).catch(done) + var found = false + client.listIncompleteUploads(bucketName, "", true) + .on('error', e => done(e)) + .on('data', data => { + if (data.key === _65mbObjectName) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) + }) + }) + step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${bucketName}, prefix:${_65mbObjectName}_`, done => { + client.removeIncompleteUpload(bucketName, _65mbObjectName) + .then(done) + .catch(done) }) }) @@ -828,132 +711,96 @@ describe('functional tests', function () { var tmpFileUpload = `${tmpDir}/${_65mbObjectName}` var tmpFileDownload = `${tmpDir}/${_65mbObjectName}.download` - step( - `fPutObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, - (done) => { - fs.writeFileSync(tmpFileUpload, _65mb) - client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, () => { - setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() - done(new Error('http request did not release network socket')) - }, 100) + step(`fPutObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, done => { + fs.writeFileSync(tmpFileUpload, _65mb) + client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, () => { + setTimeout(() => { + if (Object.values(httpAgent.sockets).length === 0) return done() + done(new Error('http request did not release network socket')) + }, 100) + }) + }) + + step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}, metaData: ${metaData}_`, done => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done)) + step(`fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, done => { + client.fGetObject(bucketName, _65mbObjectName, tmpFileDownload) + .then(() => { + var md5sum = crypto.createHash('md5').update(fs.readFileSync(tmpFileDownload)).digest('hex') + if (md5sum === _65mbmd5) return done() + return done(new Error('md5sum mismatch')) }) - } - ) - - step( - `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}, metaData: ${metaData}_`, - (done) => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done) - ) - step( - `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, - (done) => { - client - .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) - .then(() => { - var md5sum = crypto.createHash('md5').update(fs.readFileSync(tmpFileDownload)).digest('hex') - if (md5sum === _65mbmd5) return done() - return done(new Error('md5sum mismatch')) - }) - .catch(done) - } - ) - - step( - `removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, - (done) => { - fs.unlinkSync(tmpFileDownload) - client - .removeObject(bucketName, _65mbObjectName) - .then(() => done()) - .catch(done) - } - ) + .catch(done) + }) - step( - `fPutObject(bucketName, objectName, filePath, metaData)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, - (done) => { - client - .fPutObject(bucketName, _65mbObjectName, tmpFileUpload) - .then(() => done()) - .catch(done) - } - ) + step(`removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { + fs.unlinkSync(tmpFileDownload) + client.removeObject(bucketName, _65mbObjectName) + .then(() => done()) + .catch(done) + }) - step( - `fGetObject(bucketName, objectName, filePath)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, - (done) => { - client - .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) - .then(() => done()) - .catch(done) - } - ) - - step( - `removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, - (done) => { - fs.unlinkSync(tmpFileUpload) - fs.unlinkSync(tmpFileDownload) - client.removeObject(bucketName, _65mbObjectName, done) - } - ) - }) - describe('fGetObject-resume', () => { - var localFile = `${tmpDir}/${_5mbObjectName}` + step(`fPutObject(bucketName, objectName, filePath, metaData)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, done => { + client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload) + .then(() => done()) + .catch(done) + }) + + step(`fGetObject(bucketName, objectName, filePath)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, done => { + client.fGetObject(bucketName, _65mbObjectName, tmpFileDownload) + .then(() => done()) + .catch(done) + }) + + step(`removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { + fs.unlinkSync(tmpFileUpload) + fs.unlinkSync(tmpFileDownload) + client.removeObject(bucketName, _65mbObjectName, done) + }) + }) + describe('fGetObject-resume', () => { + var localFile = `${tmpDir}/${_5mbObjectName}` var etag = '' - step( - `putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_5mbObjectName}, stream:5mb_`, - (done) => { - var stream = readableStream(_5mb) - client - .putObject(bucketName, _5mbObjectName, stream, _5mb.length, {}) - .then((resp) => { - etag = resp - done() - }) - .catch(done) - } - ) - step( - `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}, filePath:${localFile}`, - (done) => { - var bufPart = Buffer.alloc(_100kb.length) - _5mb.copy(bufPart, 0, 0, _100kb.length) - var tmpFile = `${tmpDir}/${_5mbObjectName}.${etag}.part.minio` - // create a partial file - fs.writeFileSync(tmpFile, bufPart) - client - .fGetObject(bucketName, _5mbObjectName, localFile) - .then(() => { - var md5sum = crypto.createHash('md5').update(fs.readFileSync(localFile)).digest('hex') - if (md5sum === _5mbmd5) return done() - return done(new Error('md5sum mismatch')) - }) - .catch(done) - } - ) - step( - `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}_`, - (done) => { - fs.unlinkSync(localFile) - client.removeObject(bucketName, _5mbObjectName, done) - } - ) + step(`putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_5mbObjectName}, stream:5mb_`, done => { + var stream = readableStream(_5mb) + client.putObject(bucketName, _5mbObjectName, stream, _5mb.length, {}) + .then((resp) => { + etag = resp + done() + }) + .catch(done) + }) + step(`fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}, filePath:${localFile}`, done => { + var bufPart = Buffer.alloc(_100kb.length) + _5mb.copy(bufPart, 0, 0, _100kb.length) + var tmpFile = `${tmpDir}/${_5mbObjectName}.${etag}.part.minio` + // create a partial file + fs.writeFileSync(tmpFile, bufPart) + client.fGetObject(bucketName, _5mbObjectName, localFile) + .then(() => { + var md5sum = crypto.createHash('md5').update(fs.readFileSync(localFile)).digest('hex') + if (md5sum === _5mbmd5) return done() + return done(new Error('md5sum mismatch')) + }) + .catch(done) + }) + step(`removeObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}_`, done => { + fs.unlinkSync(localFile) + client.removeObject(bucketName, _5mbObjectName, done) + }) }) describe('bucket policy', () => { let policy = `{"Version":"2012-10-17","Statement":[{"Action":["s3:GetBucketLocation","s3:ListBucket"],"Effect":"Allow","Principal":{"AWS":["*"]},"Resource":["arn:aws:s3:::${bucketName}"],"Sid":""},{"Action":["s3:GetObject"],"Effect":"Allow","Principal":{"AWS":["*"]},"Resource":["arn:aws:s3:::${bucketName}/*"],"Sid":""}]}` - step(`setBucketPolicy(bucketName, bucketPolicy, cb)_bucketName:${bucketName}, bucketPolicy:${policy}_`, (done) => { - client.setBucketPolicy(bucketName, policy, (err) => { + step(`setBucketPolicy(bucketName, bucketPolicy, cb)_bucketName:${bucketName}, bucketPolicy:${policy}_`, done => { + client.setBucketPolicy(bucketName, policy, err => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`getBucketPolicy(bucketName, cb)_bucketName:${bucketName}_`, (done) => { + step(`getBucketPolicy(bucketName, cb)_bucketName:${bucketName}_`, done => { client.getBucketPolicy(bucketName, (err, response) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -966,6 +813,7 @@ describe('functional tests', function () { }) describe('Test Remove Objects Response in case of Errors', () => { + // Since functional tests are run with root credentials, it is not implemented. // Test steps // ============= @@ -980,6 +828,7 @@ describe('functional tests', function () { // verify the response // response.Error is an array // -[]- empty array indicates success for all objects + // Note: the response code is 200. so the consumer should inspect the response // Sample Response format: /** @@ -999,284 +848,250 @@ describe('functional tests', function () { * VersionId: 'test-v-is' * } */ + /* let readOnlyPolicy ='{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetBucketLocation","s3:GetObject"],"Resource":["arn:aws:s3:::*"]}]}' let readWritePolicy ='{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:*"],"Resource":["arn:aws:s3:::*"]}]}' */ + }) + describe('presigned operations', () => { - step( - `presignedPutObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires: 1000_`, - (done) => { - client.presignedPutObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'PUT' - options.headers = { - 'content-length': _1byte.length, - } - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', (e) => done(e)) - response.on('end', () => done()) - response.on('data', () => {}) - }) - request.on('error', (e) => done(e)) - request.write(_1byte) - request.end() - }) - } - ) - - step( - `presignedPutObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:-123_`, - (done) => { - // negative values should trigger an error - client - .presignedPutObject(bucketName, _1byteObjectName, -123) - .then(() => { - done(new Error('negative values should trigger an error')) - }) - .catch(() => done()) - } - ) - - step( - `presignedPutObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, - (done) => { - // Putting the same object should not cause any error - client - .presignedPutObject(bucketName, _1byteObjectName) - .then(() => done()) - .catch(done) - } - ) + step(`presignedPutObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires: 1000_`, done => { + client.presignedPutObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'PUT' + options.headers = { + 'content-length': _1byte.length + } + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', e => done(e)) + response.on('end', () => done()) + response.on('data', () => {}) + }) + request.on('error', e => done(e)) + request.write(_1byte) + request.end() + }) + }) - step( - `presignedGetObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, - (done) => { - client.presignedGetObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', (e) => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } - }) - }) - request.on('error', (e) => done(e)) - request.end() + step(`presignedPutObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:-123_`, done => { + // negative values should trigger an error + client.presignedPutObject(bucketName, _1byteObjectName, -123) + .then(() => { + done(new Error('negative values should trigger an error')) }) - } - ) + .catch(() => done()) + }) - step( - `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, - (done) => { - client.presignedUrl('GET', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', (e) => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } - }) + step(`presignedPutObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, done => { + // Putting the same object should not cause any error + client.presignedPutObject(bucketName, _1byteObjectName) + .then(() => done()) + .catch(done) + }) + + step(`presignedGetObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { + client.presignedGetObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', e => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } }) - request.on('error', (e) => done(e)) - request.end() }) - } - ) - - step( - `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, - (done) => { - var requestDate = new Date() - requestDate.setHours(0, 0, 0, 0) - client.presignedUrl('GET', bucketName, _1byteObjectName, 86400, requestDate, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', (e) => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } - }) + request.on('error', e => done(e)) + request.end() + }) + }) + + step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { + client.presignedUrl('GET', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', e => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } }) - request.on('error', (e) => done(e)) - request.end() }) - } - ) + request.on('error', e => done(e)) + request.end() + }) + }) - step( - `presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, - (done) => { - client.presignedGetObject(bucketName, _1byteObjectName, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', (e) => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } - }) + step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, done => { + var requestDate = new Date() + requestDate.setHours(0, 0, 0, 0) + client.presignedUrl('GET', bucketName, _1byteObjectName, 86400, requestDate, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', e => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } }) - request.on('error', (e) => done(e)) - request.end() }) - } - ) - - step( - `presignedGetObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:this.does.not.exist, expires:2938_`, - (done) => { - client - .presignedGetObject(bucketName, 'this.does.not.exist', 2938) - .then(assert.fail) - .catch(() => done()) - } - ) - - step( - `presignedGetObject(bucketName, objectName, expires, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, - (done) => { - var respHeaders = { - 'response-content-type': 'text/html', - 'response-content-language': 'en', - 'response-expires': 'Sun, 07 Jun 2020 16:07:58 GMT', - 'response-cache-control': 'No-cache', - 'response-content-disposition': 'attachment; filename=testing.txt', - 'response-content-encoding': 'gzip', - } - client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) - if (respHeaders['response-content-type'] !== response.headers['content-type']) { - return done(new Error(`content-type header mismatch`)) - } - if (respHeaders['response-content-language'] !== response.headers['content-language']) { - return done(new Error(`content-language header mismatch`)) - } - if (respHeaders['response-expires'] !== response.headers['expires']) { - return done(new Error(`expires header mismatch`)) - } - if (respHeaders['response-cache-control'] !== response.headers['cache-control']) { - return done(new Error(`cache-control header mismatch`)) - } - if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { - return done(new Error(`content-disposition header mismatch`)) - } - if (respHeaders['response-content-encoding'] !== response.headers['content-encoding']) { - return done(new Error(`content-encoding header mismatch`)) + request.on('error', e => done(e)) + request.end() + }) + }) + + step(`presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, done => { + client.presignedGetObject(bucketName, _1byteObjectName, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', e => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') } - response.on('data', () => {}) - done() }) - request.on('error', (e) => done(e)) - request.end() }) + request.on('error', e => done(e)) + request.end() + }) + }) + + step(`presignedGetObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:this.does.not.exist, expires:2938_`, done => { + client.presignedGetObject(bucketName, 'this.does.not.exist', 2938) + .then(assert.fail) + .catch(() => done()) + }) + + step(`presignedGetObject(bucketName, objectName, expires, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { + var respHeaders = { + 'response-content-type': 'text/html', + 'response-content-language': 'en', + 'response-expires': 'Sun, 07 Jun 2020 16:07:58 GMT', + 'response-cache-control': 'No-cache', + 'response-content-disposition': 'attachment; filename=testing.txt', + 'response-content-encoding': 'gzip' } - ) - - step( - `presignedGetObject(bucketName, objectName, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, contentDisposition special chars`, - (done) => { - var respHeaders = { - 'response-content-disposition': - 'attachment; filename="abc|"@#$%&/(<>)/=?!{[\']}+*-_:,;def.png"; filename*=UTF-8\'\'t&21st&20ng.png', - } - client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) - if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { - return done(new Error(`content-disposition header mismatch`)) - } - response.on('data', () => {}) - done() - }) - request.on('error', (e) => done(e)) - request.end() + client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (respHeaders['response-content-type'] !== response.headers['content-type']) { + return done(new Error(`content-type header mismatch`)) + } + if (respHeaders['response-content-language'] !== response.headers['content-language']) { + return done(new Error(`content-language header mismatch`)) + } + if (respHeaders['response-expires'] !== response.headers['expires']) { + return done(new Error(`expires header mismatch`)) + } + if (respHeaders['response-cache-control'] !== response.headers['cache-control']) { + return done(new Error(`cache-control header mismatch`)) + } + if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { + return done(new Error(`content-disposition header mismatch`)) + } + if (respHeaders['response-content-encoding'] !== response.headers['content-encoding']) { + return done(new Error(`content-encoding header mismatch`)) + } + response.on('data', () => {}) + done() }) + request.on('error', e => done(e)) + request.end() + }) + }) + + step(`presignedGetObject(bucketName, objectName, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, contentDisposition special chars`, done => { + var respHeaders = { + 'response-content-disposition': 'attachment; filename="abc|"@#$%&/(<>)/=?!{[\']}+*-_:,;def.png"; filename*=UTF-8\'\'t&21st&20ng.png', } - ) - - step( - `presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, - (done) => { - var requestDate = new Date() - requestDate.setHours(0, 0, 0, 0) - client.presignedGetObject(bucketName, _1byteObjectName, 86400, {}, requestDate, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', (e) => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } - }) + client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { + return done(new Error(`content-disposition header mismatch`)) + } + response.on('data', () => {}) + done() + }) + request.on('error', e => done(e)) + request.end() + }) + }) + + step(`presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, done => { + var requestDate = new Date() + requestDate.setHours(0, 0, 0, 0) + client.presignedGetObject(bucketName, _1byteObjectName, 86400, {}, requestDate, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', e => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } }) - request.on('error', (e) => done(e)) - request.end() }) - } - ) + request.on('error', e => done(e)) + request.end() + }) + }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:expiresin10days_', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:expiresin10days_', done => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) - var expires = new Date() + var expires = new Date expires.setSeconds(24 * 60 * 60 * 10) policy.setExpires(expires) @@ -1289,11 +1104,11 @@ describe('functional tests', function () { if (e) return done(e) done() }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentType', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentType', done => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) @@ -1304,15 +1119,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function (e) { + req.end(function(e) { if (e) return done(e) done() }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentTypeStartsWith', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentTypeStartsWith', done => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) @@ -1323,15 +1138,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function (e) { + req.end(function(e) { if (e) return done(e) done() }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_inline', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_inline', done => { var policy = client.newPostPolicy() var objectName = 'test-content-disposition' + uuid.v4() policy.setKey(objectName) @@ -1343,15 +1158,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function (e) { + req.end(function(e) { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_attachment', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_attachment', done => { var policy = client.newPostPolicy() var objectName = 'test-content-disposition' + uuid.v4() policy.setKey(objectName) @@ -1367,18 +1182,18 @@ describe('functional tests', function () { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setUserMetaData_', (done) => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setUserMetaData_', done => { var policy = client.newPostPolicy() var objectName = 'test-metadata' + uuid.v4() policy.setKey(objectName) policy.setBucket(bucketName) policy.setUserMetaData({ key: 'my-value', - anotherKey: 'another-value', + anotherKey: 'another-value' }) client.presignedPostPolicy(policy, (e, data) => { @@ -1386,74 +1201,69 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function (e) { + req.end(function(e) { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', (e) => done(e)) + req.on('error', e => done(e)) }) }) - step('presignedPostPolicy(postPolicy)_postPolicy: null_', (done) => { - client - .presignedPostPolicy(null) + step('presignedPostPolicy(postPolicy)_postPolicy: null_', done => { + client.presignedPostPolicy(null) .then(() => { done(new Error('null policy should fail')) }) .catch(() => done()) }) - step( - `presignedUrl(httpMethod, bucketName, objectName, expires, reqParams, cb)_httpMethod:GET, bucketName:${bucketName}, expires:1000_`, - (done) => { - client.presignedUrl('GET', bucketName, '', 1000, { prefix: 'data', 'max-keys': 1000 }, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - options.headers = {} - var str = '' - if (options.protocol === 'https:') transport = https - var callback = function (response) { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', (e) => done(e)) - response.on('end', function () { - if (!str.match(`${_1byteObjectName}`)) { - return done(new Error('Listed object does not match the object in the bucket!')) - } - done() - }) - response.on('data', function (chunk) { - str += chunk - }) - } - var request = transport.request(options, callback) - request.end() - }) - } - ) - - step( - `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:DELETE, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, - (done) => { - client.presignedUrl('DELETE', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'DELETE' - options.headers = {} - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 204) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', (e) => done(e)) - response.on('end', () => done()) - response.on('data', () => {}) + step(`presignedUrl(httpMethod, bucketName, objectName, expires, reqParams, cb)_httpMethod:GET, bucketName:${bucketName}, expires:1000_`, done => { + client.presignedUrl('GET', bucketName, '', 1000, {'prefix': 'data', 'max-keys': 1000}, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + options.headers = { + } + var str = '' + if (options.protocol === 'https:') transport = https + var callback = function (response) { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', e => done(e)) + response.on('end', function () { + if (!str.match(`${_1byteObjectName}`)) { + return done(new Error('Listed object does not match the object in the bucket!')) + } + done() }) - request.on('error', (e) => done(e)) - request.end() - }) - } - ) + response.on('data', function (chunk) { + str += chunk + }) + } + var request = transport.request(options, callback) + request.end() + }) + }) + + step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:DELETE, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { + client.presignedUrl('DELETE', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'DELETE' + options.headers = { + } + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 204) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', e => done(e)) + response.on('end', () => done()) + response.on('data', () => {}) + }) + request.on('error', e => done(e)) + request.end() + }) + }) }) describe('listObjects', function () { @@ -1463,41 +1273,35 @@ describe('functional tests', function () { var listArray = [] var listPrefixArray = [] - step( - `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, - (done) => { - _.times(listObjectsNum, (i) => objArray.push(`${listObjectPrefix}.${i}`)) - objArray = objArray.sort() - async.mapLimit( - objArray, - 20, - (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, {}, cb), - done - ) - } - ) + step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { + _.times(listObjectsNum, i => objArray.push(`${listObjectPrefix}.${i}`)) + objArray = objArray.sort() + async.mapLimit( + objArray, + 20, + (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, {}, cb), + done + ) + }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix: miniojsprefix, recursive:true_`, - (done) => { - client - .listObjects(bucketName, listObjectPrefix, true) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listPrefixArray)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', (data) => { - listPrefixArray.push(data.name) - }) - } - ) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix: miniojsprefix, recursive:true_`, done => { + client.listObjects(bucketName, listObjectPrefix, true) + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray, listPrefixArray)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', data => { + listPrefixArray.push(data.name) + }) + }) - step('listObjects(bucketName, prefix, recursive)_recursive:true_', (done) => { + step('listObjects(bucketName, prefix, recursive)_recursive:true_', done => { try { - client.listObjects('', '', true).on('end', () => { - return done(new Error(`listObjects should throw exception when empty bucketname is passed`)) - }) + client.listObjects("", "", true) + .on('end', () => { + return done(new Error(`listObjects should throw exception when empty bucketname is passed`)) + }) } catch (e) { if (e.name === 'InvalidBucketNameError') { done() @@ -1507,60 +1311,53 @@ describe('functional tests', function () { } }) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { listArray = [] - client - .listObjects(bucketName, '', false) + client.listObjects(bucketName, '', false) .on('error', done) .on('end', () => { if (_.isEqual(objArray, listArray)) return done() return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) }) - .on('data', (data) => { + .on('data', data => { listArray.push(data.name) }) }) - step( - `listObjectsV2(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, - (done) => { - listArray = [] - client - .listObjectsV2(bucketName, '', true, '') - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() - return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', (data) => { - listArray.push(data.name) - }) - } - ) - - step( - `listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, - (done) => { - listArray = [] - client.extensions - .listObjectsV2WithMetadata(bucketName, '', true, '') - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() - return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', (data) => { - listArray.push(data.name) - }) - } - ) + step(`listObjectsV2(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, done => { + listArray = [] + client.listObjectsV2(bucketName, '', true, '') + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray, listArray)) return done() + return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', data => { + listArray.push(data.name) + }) + }) - step( - `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}_Remove ${listObjectsNum} objects`, - (done) => { - async.mapLimit(listArray, 20, (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) - } - ) + step(`listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, done => { + listArray = [] + client.extensions.listObjectsV2WithMetadata(bucketName, '', true, '') + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray, listArray)) return done() + return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', data => { + listArray.push(data.name) + }) + }) + + step(`removeObject(bucketName, objectName, callback)_bucketName:${bucketName}_Remove ${listObjectsNum} objects`, done => { + async.mapLimit( + listArray, + 20, + (objectName, cb) => client.removeObject(bucketName, objectName, cb), + done + ) + }) }) describe('removeObjects', function () { @@ -1569,23 +1366,19 @@ describe('functional tests', function () { var objArray = [] var objectsList = [] - step( - `putObject(bucketName, objectName, stream, size, contentType, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, - (done) => { - _.times(listObjectsNum, (i) => objArray.push(`${listObjectPrefix}.${i}`)) - objArray = objArray.sort() - async.mapLimit( - objArray, - 20, - (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, '', cb), - done - ) - } - ) + step(`putObject(bucketName, objectName, stream, size, contentType, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { + _.times(listObjectsNum, i => objArray.push(`${listObjectPrefix}.${i}`)) + objArray = objArray.sort() + async.mapLimit( + objArray, + 20, + (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, '', cb), + done + ) + }) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { - client - .listObjects(bucketName, listObjectPrefix, false) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { + client.listObjects(bucketName, listObjectPrefix, false) .on('error', done) .on('end', () => { try { @@ -1595,21 +1388,20 @@ describe('functional tests', function () { } }) } catch (e) { - if (e.name === 'InvalidArgumentError') { + if (e.name === "InvalidArgumentError") { done() } } }) - .on('data', (data) => { + .on('data', data => { objectsList.push(data.name) }) }) objectsList = [] - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { - client - .listObjects(bucketName, listObjectPrefix, false) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { + client.listObjects(bucketName, listObjectPrefix, false) .on('error', done) .on('end', () => { client.removeObjects(bucketName, objectsList, function (e) { @@ -1619,27 +1411,27 @@ describe('functional tests', function () { done() }) }) - .on('data', (data) => { + .on('data', data => { objectsList.push(data.name) }) }) // Non latin characters - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:fileΊ, stream:1b`, (done) => { - client - .putObject(bucketName, 'fileΊ', _1byte) + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:fileΊ, stream:1b`, done => { + client.putObject(bucketName, 'fileΊ', _1byte) .then(() => done()) .catch(done) }) - step(`removeObjects with non latin characters`, (done) => { - client - .removeObjects(bucketName, ['fileΊ']) + step(`removeObjects with non latin characters`, done => { + client.removeObjects(bucketName, ['fileΊ']) .then(() => done()) .catch(done) }) + }) + describe('bucket notifications', () => { describe('#listenBucketNotification', () => { before(function () { @@ -1651,120 +1443,109 @@ describe('functional tests', function () { } }) - step( - `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, prefix:photos/, suffix:.jpg, events:bad_`, - (done) => { - let poller = client.listenBucketNotification(bucketName, 'photos/', '.jpg', ['bad']) - poller.on('error', (error) => { - if (error.code !== 'NotImplemented') { - assert.match(error.message, /A specified event is not supported for notifications./) - assert.equal(error.code, 'InvalidArgument') + step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, prefix:photos/, suffix:.jpg, events:bad_`, done => { + let poller = client.listenBucketNotification(bucketName, 'photos/', '.jpg', ['bad']) + poller.on('error', error => { + if (error.code !== 'NotImplemented') { + assert.match(error.message, /A specified event is not supported for notifications./) + assert.equal(error.code, 'InvalidArgument') + } + done() + }) + }) + step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events: s3:ObjectCreated:*_`, done => { + let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectCreated:*']) + let records = 0 + let pollerError = null + poller.on('notification', record => { + records++ + + assert.equal(record.eventName, 's3:ObjectCreated:Put') + assert.equal(record.s3.bucket.name, bucketName) + assert.equal(record.s3.object.key, objectName) + }) + poller.on('error', error => { + pollerError = error + }) + setTimeout(() => { // Give it some time for the notification to be setup. + if (pollerError) { + if (pollerError.code !== 'NotImplemented') { + done(pollerError) + } else { + done() } - done() - }) - } - ) - step( - `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events: s3:ObjectCreated:*_`, - (done) => { - let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectCreated:*']) - let records = 0 - let pollerError = null - poller.on('notification', (record) => { - records++ - - assert.equal(record.eventName, 's3:ObjectCreated:Put') - assert.equal(record.s3.bucket.name, bucketName) - assert.equal(record.s3.object.key, objectName) - }) - poller.on('error', (error) => { - pollerError = error - }) - setTimeout(() => { - // Give it some time for the notification to be setup. - if (pollerError) { - if (pollerError.code !== 'NotImplemented') { - done(pollerError) - } else { + return + } + client.putObject(bucketName, objectName, 'stringdata', (err) => { + if (err) return done(err) + setTimeout(() => { // Give it some time to get the notification. + poller.stop() + client.removeObject(bucketName, objectName, err => { + if (err) return done(err) + if (!records) return done(new Error('notification not received')) done() - } - return - } - client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) - setTimeout(() => { - // Give it some time to get the notification. - poller.stop() - client.removeObject(bucketName, objectName, (err) => { - if (err) return done(err) - if (!records) return done(new Error('notification not received')) - done() - }) - }, 10 * 1000) - }) - }, 10 * 1000) - } - ) + }) + }, 10 * 1000) + }) + }, 10 * 1000) + }) // This test is very similar to that above, except it does not include // Minio.ObjectCreatedAll in the config. Thus, no events should be emitted. - step( - `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events:s3:ObjectRemoved:*`, - (done) => { - let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectRemoved:*']) - poller.on('notification', assert.fail) - poller.on('error', (error) => { - if (error.code !== 'NotImplemented') { - done(error) - } - }) + step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events:s3:ObjectRemoved:*`, done => { + let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectRemoved:*']) + poller.on('notification', assert.fail) + poller.on('error', error => { + if (error.code !== 'NotImplemented') { + done(error) + } + }) - client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) - // It polls every five seconds, so wait for two-ish polls, then end. - setTimeout(() => { - poller.stop() - poller.removeAllListeners('notification') - // clean up object now - client.removeObject(bucketName, objectName, done) - }, 11 * 1000) - }) - } - ) + client.putObject(bucketName, objectName, 'stringdata', (err) => { + if (err) return done(err) + // It polls every five seconds, so wait for two-ish polls, then end. + setTimeout(() => { + poller.stop() + poller.removeAllListeners('notification') + // clean up object now + client.removeObject(bucketName, objectName, done) + }, 11 * 1000) + }) + }) }) }) describe('Bucket Versioning API', () => { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = 'minio-js-test-version-' + uuid.v4() + const versionedBucketName = "minio-js-test-version-" + uuid.v4() before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) describe('Versioning Steps test', function () { - step('Check if versioning is enabled on a bucket', (done) => { + step("Check if versioning is enabled on a bucket", done => { client.getBucketVersioning(versionedBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step('Enable versioning on a bucket', (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + step("Enable versioning on a bucket", done => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step('Suspend versioning on a bucket', (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { + step("Suspend versioning on a bucket", done => { + client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step('Check if versioning is Suspended on a bucket', (done) => { + step("Check if versioning is Suspended on a bucket", done => { client.getBucketVersioning(versionedBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -1772,15 +1553,14 @@ describe('functional tests', function () { }) }) }) + }) describe('Versioning tests on a buckets', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = 'minio-js-test-version-' + uuid.v4() + const versionedBucketName = "minio-js-test-version-" + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir - ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) - : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) @@ -1788,199 +1568,145 @@ describe('functional tests', function () { describe('Versioning Steps test', function () { let versionId - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, - (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - } - ) + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, - (done) => { - client - .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - } - ) + step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { + client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + }) - step( - `statObject(bucketName, objectName, statOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, - (done) => { - client.statObject(versionedBucketName, versioned_100kbObjectName, {}, (e, res) => { - versionId = res.versionId - done() - }) - } - ) + step(`statObject(bucketName, objectName, statOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { + client.statObject(versionedBucketName, versioned_100kbObjectName, {}, (e, res) => { + versionId = res.versionId + done() + }) + }) - step( - `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, - (done) => { - client.removeObject(versionedBucketName, versioned_100kbObjectName, { versionId: versionId }, () => { - done() - }) - } - ) + step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { + client.removeObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, () => { + done() + }) + }) + + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { + client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, - (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - } - ) }) }) describe('Versioning tests on a buckets: getObject, fGetObject, getPartialObject, putObject, removeObject with versionId support', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = 'minio-js-test-version-' + uuid.v4() + const versionedBucketName = "minio-js-test-version-" + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir - ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) - : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) describe('Versioning Test for getObject, getPartialObject, putObject, removeObject with versionId support', function () { let versionId = null - step( - `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${versionedBucketName},{Status:"Enabled"}`, - (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + step(`Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${versionedBucketName},{Status:"Enabled"}`, (done) => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) + + step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { + client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then((res = {}) => { + if (res.versionId) { + versionId = res.versionId // In gateway mode versionId will not be returned. + } done() }) - } - ) + .catch(done) + }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, - (done) => { - client - .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then((res = {}) => { - if (res.versionId) { - versionId = res.versionId // In gateway mode versionId will not be returned. - } + step(`getObject(bucketName, objectName, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { + if (versionId) { + client.getObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, function (e, dataStream) { + const objVersion = getVersionId(dataStream.headers) + if (objVersion) { done() - }) - .catch(done) + } else { + done(new Error('versionId not found in getObject response')) + } + }) + } else { + done() } - ) + }) - step( - `getObject(bucketName, objectName, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, - (done) => { - if (versionId) { - client.getObject( - versionedBucketName, - versioned_100kbObjectName, - { versionId: versionId }, - function (e, dataStream) { - const objVersion = getVersionId(dataStream.headers) - if (objVersion) { - done() - } else { - done(new Error('versionId not found in getObject response')) - } - } - ) - } else { - done() - } - } - ) - step( - `fGetObject(bucketName, objectName, filePath, getOpts={})_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, - (done) => { - if (versionId) { - var tmpFileDownload = `${tmpDir}/${versioned_100kbObjectName}.download` - client.fGetObject( - versionedBucketName, - versioned_100kbObjectName, - tmpFileDownload, - { versionId: versionId }, - function () { - done() - } - ) - } else { + step(`fGetObject(bucketName, objectName, filePath, getOpts={})_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { + if (versionId) { + var tmpFileDownload = `${tmpDir}/${versioned_100kbObjectName}.download` + client.fGetObject(versionedBucketName, versioned_100kbObjectName, tmpFileDownload, {versionId: versionId}, function () { done() - } + }) + } else { + done() } - ) + }) - step( - `getPartialObject(bucketName, objectName, offset, length, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, - (done) => { - if (versionId) { - client.getPartialObject( - versionedBucketName, - versioned_100kbObjectName, - 10, - 30, - { versionId: versionId }, - function (e, dataStream) { - const objVersion = getVersionId(dataStream.headers) - if (objVersion) { - done() - } else { - done(new Error('versionId not found in getPartialObject response')) - } - } - ) - } else { - done() - } - } - ) - step( - `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName},removeOpts:{versionId:${versionId}`, - (done) => { - if (versionId) { - client.removeObject(versionedBucketName, versioned_100kbObjectName, { versionId: versionId }, () => { + step(`getPartialObject(bucketName, objectName, offset, length, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { + if (versionId) { + client.getPartialObject(versionedBucketName, versioned_100kbObjectName, 10, 30, {versionId: versionId}, function (e, dataStream) { + const objVersion = getVersionId(dataStream.headers) + if (objVersion) { done() - }) - } else { - // In gateway mode, use regular delete to remove an object so that the bucket can be cleaned up. - client.removeObject(versionedBucketName, versioned_100kbObjectName, () => { - done() - }) - } + } else { + done(new Error('versionId not found in getPartialObject response')) + } + }) + } else { + done() } - ) + }) - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, - (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName},removeOpts:{versionId:${versionId}`, done => { + if (versionId) { + client.removeObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, () => { + done() + }) + } else { + // In gateway mode, use regular delete to remove an object so that the bucket can be cleaned up. + client.removeObject(versionedBucketName, versioned_100kbObjectName, () => { done() }) } - ) + }) + + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { + client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) + }) }) describe('Versioning Supported listObjects', function () { - const versionedBucketName = 'minio-js-test-version-list' + uuid.v4() - const prefixName = 'Prefix1' - const versionedObjectName = 'datafile-100-kB' + const versionedBucketName = "minio-js-test-version-list" + uuid.v4() + const prefixName = "Prefix1" + const versionedObjectName = "datafile-100-kB" const objVersionIdCounter = [1, 2, 3, 4, 5] // This should track adding 5 versions of the same object. let listObjectsNum = objVersionIdCounter.length let objArray = [] @@ -1989,94 +1715,154 @@ describe('functional tests', function () { const objNameWithPrefix = `${prefixName}/${versionedObjectName}` - before((done) => - client.makeBucket(versionedBucketName, '', () => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + before((done) => client.makeBucket(versionedBucketName, '', () => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + + })) + after((done) => client.removeBucket(versionedBucketName, done)) + + + step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${versionedBucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { + if (isVersioningSupported) { + let count = 1 + objVersionIdCounter.forEach(() => { + client.putObject(versionedBucketName, objNameWithPrefix, readableStream(_1byte), _1byte.length, {}, (e, data) => { + objArray.push(data) + if (count === objVersionIdCounter.length) { + done() + } + count += 1 + }) + }) + } else { + done() + } + }) + + step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { + if (isVersioningSupported) { + client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', data => { + listPrefixArray.push(data) + }) + } else { + done() + } + }) + + step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: ${prefixName}, recursive:true_`, done => { + if (isVersioningSupported) { + listPrefixArray = [] + client.listObjects(versionedBucketName, prefixName, true, {IncludeVersion: true}) + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', data => { + listPrefixArray.push(data) + }) + } else { + done() + } + }) + + + step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}_Remove ${listObjectsNum} objects`, done => { + if (isVersioningSupported) { + let count = 1 + listPrefixArray.forEach((item) => { + client.removeObject(versionedBucketName, item.name, {versionId: item.versionId}, () => { + if (count === listPrefixArray.length) { + done() + } + count += 1 + }) + }) + } else { + done() + } + }) + }) + + describe('Versioning tests on a bucket for Deletion of Multiple versions', function () { + // Isolate the bucket/object for easy debugging and tracking. + const versionedBucketName = "minio-js-test-version-" + uuid.v4() + const versioned_100kbObjectName = 'datafile-100-kB' + const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) + + before((done) => client.makeBucket(versionedBucketName, '', done)) + after((done) => client.removeBucket(versionedBucketName, done)) + + + describe('Test for removal of multiple versions', function () { + let isVersioningSupported = false + const objVersionList = [] + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) isVersioningSupported = true done() }) }) - ) - after((done) => client.removeBucket(versionedBucketName, done)) - step( - `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${versionedBucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, - (done) => { + step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { if (isVersioningSupported) { - let count = 1 - objVersionIdCounter.forEach(() => { - client.putObject( - versionedBucketName, - objNameWithPrefix, - readableStream(_1byte), - _1byte.length, - {}, - (e, data) => { - objArray.push(data) - if (count === objVersionIdCounter.length) { - done() - } - count += 1 - } - ) - }) + client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) } else { done() } - } - ) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, - (done) => { + }) + // Put two versions of the same object. + step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { + // Put two versions of the same object. if (isVersioningSupported) { - client - .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', (data) => { - listPrefixArray.push(data) - }) + client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) } else { done() } - } - ) + }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: ${prefixName}, recursive:true_`, - (done) => { + step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { if (isVersioningSupported) { - listPrefixArray = [] - client - .listObjects(versionedBucketName, prefixName, true, { IncludeVersion: true }) + client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) .on('error', done) .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) + if (_.isEqual(2, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected ${2}`)) }) - .on('data', (data) => { - listPrefixArray.push(data) + .on('data', data => { + // Pass list object response as is to remove objects + objVersionList.push(data) }) } else { done() } - } - ) + }) - step( - `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}_Remove ${listObjectsNum} objects`, - (done) => { + step(`removeObjects(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove ${objVersionList.length} objects`, done => { if (isVersioningSupported) { let count = 1 - listPrefixArray.forEach((item) => { - client.removeObject(versionedBucketName, item.name, { versionId: item.versionId }, () => { - if (count === listPrefixArray.length) { + objVersionList.forEach(() => { + // remove multiple versions of the object. + client.removeObjects(versionedBucketName, objVersionList, () => { + if (count === objVersionList.length) { done() } count += 1 @@ -2085,171 +1871,75 @@ describe('functional tests', function () { } else { done() } - } - ) + }) + + }) }) - describe('Versioning tests on a bucket for Deletion of Multiple versions', function () { + describe('Bucket Tags API', () => { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = 'minio-js-test-version-' + uuid.v4() - const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir - ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) - : Buffer.alloc(100 * 1024, 0) - - before((done) => client.makeBucket(versionedBucketName, '', done)) - after((done) => client.removeBucket(versionedBucketName, done)) - - describe('Test for removal of multiple versions', function () { - let isVersioningSupported = false - const objVersionList = [] - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, - (done) => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - } - ) + const tagsBucketName = "minio-js-test-tags-" + uuid.v4() + before((done) => client.makeBucket(tagsBucketName, '', done)) + after((done) => client.removeBucket(tagsBucketName, done)) - step( - `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - } else { - done() - } - } - ) - // Put two versions of the same object. - step( - `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, - (done) => { - // Put two versions of the same object. - if (isVersioningSupported) { - client - .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - } else { - done() - } - } - ) - - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, - (done) => { - if (isVersioningSupported) { - client - .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) - .on('error', done) - .on('end', () => { - if (_.isEqual(2, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected ${2}`)) - }) - .on('data', (data) => { - // Pass list object response as is to remove objects - objVersionList.push(data) - }) - } else { - done() - } - } - ) - - step( - `removeObjects(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove ${objVersionList.length} objects`, - (done) => { - if (isVersioningSupported) { - let count = 1 - objVersionList.forEach(() => { - // remove multiple versions of the object. - client.removeObjects(versionedBucketName, objVersionList, () => { - if (count === objVersionList.length) { - done() - } - count += 1 - }) - }) - } else { - done() - } - } - ) - }) - }) - - describe('Bucket Tags API', () => { - // Isolate the bucket/object for easy debugging and tracking. - const tagsBucketName = 'minio-js-test-tags-' + uuid.v4() - before((done) => client.makeBucket(tagsBucketName, '', done)) - after((done) => client.removeBucket(tagsBucketName, done)) - - describe('set, get and remove Tags on a bucket', function () { - step(`Set tags on a bucket_bucketName:${tagsBucketName}`, (done) => { - client.setBucketTagging(tagsBucketName, { 'test-tag-key': 'test-tag-value' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) - step(`Get tags on a bucket_bucketName:${tagsBucketName}`, (done) => { - client.getBucketTagging(tagsBucketName, (err, tagList) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - if (isArray(tagList)) { + describe('set, get and remove Tags on a bucket', function () { + step(`Set tags on a bucket_bucketName:${tagsBucketName}`, done => { + client.setBucketTagging(tagsBucketName, {'test-tag-key': 'test-tag-value'}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) + step(`Get tags on a bucket_bucketName:${tagsBucketName}`, done => { + client.getBucketTagging(tagsBucketName, (err, tagList) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + if (isArray(tagList)) { done() } }) }) - step(`remove Tags on a bucket_bucketName:${tagsBucketName}`, (done) => { + step(`remove Tags on a bucket_bucketName:${tagsBucketName}`, done => { client.removeBucketTagging(tagsBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) + }) + }) describe('Object Tags API', () => { // Isolate the bucket/object for easy debugging and tracking. - const tagsBucketName = 'minio-js-test-tags-' + uuid.v4() + const tagsBucketName = "minio-js-test-tags-" + uuid.v4() before((done) => client.makeBucket(tagsBucketName, '', done)) after((done) => client.removeBucket(tagsBucketName, done)) + const tagObjName = 'datafile-100-kB' const tagObject = Buffer.alloc(100 * 1024, 0) + describe('set, get and remove Tags on an object', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${tagsBucketName}, objectName:${tagObjName}, stream:100Kib_`, - (done) => { - client - .putObject(tagsBucketName, tagObjName, tagObject) - .then(() => done()) - .catch(done) - } - ) - step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { - client.setObjectTagging(tagsBucketName, tagObjName, { 'test-tag-key-obj': 'test-tag-value-obj' }, (err) => { + step(`putObject(bucketName, objectName, stream)_bucketName:${tagsBucketName}, objectName:${tagObjName}, stream:100Kib_`, done => { + client.putObject(tagsBucketName, tagObjName, tagObject) + .then(() => done()) + .catch(done) + }) + + step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { + client.setObjectTagging(tagsBucketName, tagObjName, {'test-tag-key-obj': 'test-tag-value-obj'}, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { + step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { client.getObjectTagging(tagsBucketName, tagObjName, (err, tagList) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -2259,97 +1949,87 @@ describe('functional tests', function () { }) }) - step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { + step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { client.removeObjectTagging(tagsBucketName, tagObjName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`removeObject object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { + step(`removeObject object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { client.removeObject(tagsBucketName, tagObjName, () => { done() }) }) }) + }) describe('Object Tags API with Versioning support', () => { // Isolate the bucket/object for easy debugging and tracking. - const tagsVersionedBucketName = 'minio-js-test-tags-version-' + uuid.v4() + const tagsVersionedBucketName = "minio-js-test-tags-version-" + uuid.v4() before((done) => client.makeBucket(tagsVersionedBucketName, '', done)) after((done) => client.removeBucket(tagsVersionedBucketName, done)) + const tagObjName = 'datafile-100-kB' const tagObject = Buffer.alloc(100 * 1024, 0) let isVersioningSupported = false let versionId = null describe('set, get and remove Tags on a versioned object', function () { - step( - `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${tagsVersionedBucketName},{Status:"Enabled"}`, - (done) => { - client.setBucketVersioning(tagsVersionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - } - ) - step( - `putObject(bucketName, objectName, stream)_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(tagsVersionedBucketName, tagObjName, tagObject) - .then((res = {}) => { - if (res.versionId) { - versionId = res.versionId // In gateway mode versionId will not be returned. - } - done() - }) - .catch(done) - } else { - done() - } - } - ) + step(`Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${tagsVersionedBucketName},{Status:"Enabled"}`, (done) => { + client.setBucketVersioning(tagsVersionedBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + }) - step(`Set tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { + step(`putObject(bucketName, objectName, stream)_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName}, stream:100Kib_`, done => { if (isVersioningSupported) { - client.setObjectTagging( - tagsVersionedBucketName, - tagObjName, - { 'test-tag-key-obj': 'test-tag-value-obj' }, - { versionId: versionId }, - (err) => { - if (err) return done(err) + client.putObject(tagsVersionedBucketName, tagObjName, tagObject) + .then((res = {}) => { + if (res.versionId) { + versionId = res.versionId // In gateway mode versionId will not be returned. + } done() - } - ) + }) + .catch(done) + } else { + done() + } + }) + + step(`Set tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { + if (isVersioningSupported) { + client.setObjectTagging(tagsVersionedBucketName, tagObjName, {'test-tag-key-obj': 'test-tag-value-obj'}, {versionId: versionId}, (err) => { + if (err) return done(err) + done() + }) } else { done() } }) - step(`Get tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { + step(`Get tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { if (isVersioningSupported) { - client.getObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err, tagList) => { + client.getObjectTagging(tagsVersionedBucketName, tagObjName, {versionId: versionId}, (err, tagList) => { if (err) return done(err) if (isArray(tagList)) { done() } - }) - } else { + })}else{ done() } }) - step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { + step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { + if (isVersioningSupported) { - client.removeObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err) => { + client.removeObjectTagging(tagsVersionedBucketName, tagObjName, {versionId: versionId}, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() @@ -2358,9 +2038,9 @@ describe('functional tests', function () { done() } }) - step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { + step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { if (isVersioningSupported) { - client.removeObject(tagsVersionedBucketName, tagObjName, { versionId: versionId }, () => { + client.removeObject(tagsVersionedBucketName, tagObjName, {versionId: versionId}, () => { done() }) } else { @@ -2368,29 +2048,27 @@ describe('functional tests', function () { } }) }) + }) describe('Bucket Lifecycle API', () => { - const bucketName = 'minio-js-test-lifecycle-' + uuid.v4() + const bucketName = "minio-js-test-lifecycle-" + uuid.v4() before((done) => client.makeBucket(bucketName, '', done)) after((done) => client.removeBucket(bucketName, done)) describe('Set, Get Lifecycle config Tests', function () { - step(`Set lifecycle config on a bucket:_bucketName:${bucketName}`, (done) => { + step(`Set lifecycle config on a bucket:_bucketName:${bucketName}`, done => { const lifecycleConfig = { - Rule: [ - { - ID: 'Transition and Expiration Rule', - Status: 'Enabled', - Filter: { - Prefix: '', - }, - Expiration: { - Days: '3650', - }, + Rule: [{ + "ID": "Transition and Expiration Rule", + "Status": "Enabled", + "Filter": { + "Prefix": "", }, - ], - } + "Expiration": { + "Days": "3650" + } + }]} client.setBucketLifecycle(bucketName, lifecycleConfig, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -2398,7 +2076,7 @@ describe('functional tests', function () { }) }) - step('Set lifecycle config of a bucket', (done) => { + step("Set lifecycle config of a bucket", done => { client.getBucketLifecycle(bucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -2406,16 +2084,18 @@ describe('functional tests', function () { }) }) - step('Remove lifecycle config of a bucket', (done) => { + step("Remove lifecycle config of a bucket", done => { client.removeBucketLifecycle(bucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) + }) }) + describe('Versioning Supported preSignedUrl Get, Put Tests', function () { /** * Test Steps @@ -2427,7 +2107,7 @@ describe('functional tests', function () { * 6. Cleanup bucket. */ - const versionedBucketName = 'minio-js-test-ver-presign-' + uuid.v4() + const versionedBucketName = "minio-js-test-ver-presign-" + uuid.v4() const versionedPresignObjName = 'datafile-1-b' const _100_byte = Buffer.alloc(100 * 1024, 0) const _200_byte = Buffer.alloc(200 * 1024, 0) @@ -2435,186 +2115,167 @@ describe('functional tests', function () { const objectsList = [] const expectedVersionsCount = 2 - before((done) => - client.makeBucket(versionedBucketName, '', () => { - client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) + + before((done) => client.makeBucket(versionedBucketName, '', () => { + client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() }) - ) + + })) after((done) => client.removeBucket(versionedBucketName, done)) - step( - `presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:1`, - (done) => { - if (isVersioningSupported) { - client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { - if (e) { - done(e) - } - let mobileClientReqWithProtocol = http - var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - upldRequestOptions.method = 'PUT' - upldRequestOptions.headers = { - 'content-length': _100_byte.length, - } - if (upldRequestOptions.protocol === 'https:') { - mobileClientReqWithProtocol = https - } - const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) - response.on('error', (err) => { - done(err) - }) - response.on('end', () => { - done() - }) - response.on('data', () => { - // just drain - }) - }) + step(`presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:1`, done => { - uploadRequest.on('error', (er) => { - done(er) + if (isVersioningSupported) { + client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { + if (e) { + done(e) + } + let mobileClientReqWithProtocol = http + var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + upldRequestOptions.method = 'PUT' + upldRequestOptions.headers = { + 'content-length': _100_byte.length + } + if (upldRequestOptions.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { + if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + response.on('error', (err) => { + done(err) + }) + response.on('end', () => { + done() + }) + response.on('data', () => { + // just drain }) + }) - uploadRequest.write(_100_byte) - uploadRequest.end() + uploadRequest.on('error', (er) => { + done(er) }) - } else { - done() - } + + uploadRequest.write(_100_byte) + uploadRequest.end() + }) + } else { + done() } - ) - step( - `presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:2`, - (done) => { - if (isVersioningSupported) { - client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { - if (e) { - done(e) - } - let mobileClientReqWithProtocol = http - var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - upldRequestOptions.method = 'PUT' - upldRequestOptions.headers = { - 'content-length': _200_byte.length, - } - if (upldRequestOptions.protocol === 'https:') { - mobileClientReqWithProtocol = https - } - const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) - response.on('error', (err) => { - done(err) - }) - response.on('end', () => { - done() - }) - response.on('data', () => { - // just drain - }) - }) + }) - uploadRequest.on('error', (er) => { - done(er) + step(`presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:2`, done => { + if (isVersioningSupported) { + client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { + if (e) { + done(e) + } + let mobileClientReqWithProtocol = http + var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + upldRequestOptions.method = 'PUT' + upldRequestOptions.headers = { + 'content-length': _200_byte.length + } + if (upldRequestOptions.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { + if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + response.on('error', (err) => { + done(err) + }) + response.on('end', () => { + done() }) + response.on('data', () => { + // just drain + }) + }) - uploadRequest.write(_200_byte) - uploadRequest.end() + uploadRequest.on('error', (er) => { + done(er) }) - } else { - done() - } + + uploadRequest.write(_200_byte) + uploadRequest.end() + }) + } else { + done() } - ) + }) - step( - `listObjects(bucketName, '', true, {IncludeVersion: true}, cb)_bucketName:${versionedBucketName} _prefix:""`, - (done) => { - if (isVersioningSupported) { - const objectsStream = client.listObjects(versionedBucketName, '', true, { IncludeVersion: true }) - objectsStream.on('data', function (obj) { - objectsList.push({ versionId: obj.versionId, name: obj.name }) - }) + step(`listObjects(bucketName, '', true, {IncludeVersion: true}, cb)_bucketName:${versionedBucketName} _prefix:""`, done => { + if (isVersioningSupported) { + const objectsStream = client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) + objectsStream.on('data', function (obj) { + objectsList.push({versionId: obj.versionId, name: obj.name}) + }) - objectsStream.on('error', function () { - return done() - }) - objectsStream.on('end', function () { - const objectListCount = objectsList.length - if (objectListCount === expectedVersionsCount) { - done() - } else { - return done( - new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`) - ) - } - }) - } else { - done() - } + objectsStream.on('error', function () { + return done() + }) + objectsStream.on('end', function () { + const objectListCount = objectsList.length + if (objectListCount === expectedVersionsCount) { + done() + } else { + return done(new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`)) + } + }) + } else { + done() } - ) + }) - step( - `presignedGetObject(bucketName, objectName, 1000, respHeaders, requestDate, cb)_bucketName:${versionedBucketName} _objectName:${versionedPresignObjName} _version:(2/2)`, - (done) => { - if (isVersioningSupported) { - client.presignedGetObject( - versionedBucketName, - objectsList[1].name, - 1000, - { versionId: objectsList[1].versionId }, - new Date(), - (e, presignedUrl) => { - if (e) { - return done() - } - let mobileClientReqWithProtocol = http - const getReqOpts = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - getReqOpts.method = 'GET' - const _100kbmd5 = crypto.createHash('md5').update(_100_byte).digest('hex') - - const hash = crypto.createHash('md5') - if (getReqOpts.protocol === 'https:') { - mobileClientReqWithProtocol = https + step(`presignedGetObject(bucketName, objectName, 1000, respHeaders, requestDate, cb)_bucketName:${versionedBucketName} _objectName:${versionedPresignObjName} _version:(2/2)`, done => { + if (isVersioningSupported) { + client.presignedGetObject(versionedBucketName, objectsList[1].name, 1000, {versionId: objectsList[1].versionId}, new Date(), (e, presignedUrl) => { + if (e) { + return done() + } + let mobileClientReqWithProtocol = http + const getReqOpts = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + getReqOpts.method = 'GET' + const _100kbmd5 = crypto.createHash('md5').update(_100_byte).digest('hex') + + const hash = crypto.createHash('md5') + if (getReqOpts.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const request = mobileClientReqWithProtocol.request(getReqOpts, (response) => { + // if delete marker. method not allowed. + if (response.statusCode !== 200) return new Error(`error on get : ${response.statusCode}`) + response.on('error', () => { + return done() + }) + response.on('end', () => { + const hashValue = hash.digest('hex') + if (hashValue === _100kbmd5) { + done() + } else { + return done(new Error("Unable to retrieve version of an object using presignedGetObject")) } - const request = mobileClientReqWithProtocol.request(getReqOpts, (response) => { - // if delete marker. method not allowed. - if (response.statusCode !== 200) return new Error(`error on get : ${response.statusCode}`) - response.on('error', () => { - return done() - }) - response.on('end', () => { - const hashValue = hash.digest('hex') - if (hashValue === _100kbmd5) { - done() - } else { - return done(new Error('Unable to retrieve version of an object using presignedGetObject')) - } - }) - response.on('data', (data) => { - hash.update(data) - }) - }) - request.on('error', () => { - return done() - }) - request.end() - } - ) - } else { - done() - } + }) + response.on('data', (data) => { + hash.update(data) + }) + }) + request.on('error', () => { + return done() + }) + request.end() + }) + } else { + done() } - ) + }) - step(`removeObjects(bucketName, objectsList)_bucketName:${versionedBucketName}`, (done) => { + step(`removeObjects(bucketName, objectsList)_bucketName:${versionedBucketName}`, done => { if (isVersioningSupported) { client.removeObjects(versionedBucketName, objectsList, function (e) { if (e) { @@ -2633,10 +2294,10 @@ describe('functional tests', function () { // Gateway mode does not support this header. describe('Object Lock support makeBucket API Tests', function () { - const lockEnabledBucketName = 'minio-js-test-lock-mb-' + uuid.v4() + const lockEnabledBucketName = "minio-js-test-lock-mb-" + uuid.v4() let isFeatureSupported = false - step(`Check if bucket with object lock can be created:_bucketName:${lockEnabledBucketName}`, (done) => { - client.makeBucket(lockEnabledBucketName, { ObjectLocking: true }, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${lockEnabledBucketName}`, done => { + client.makeBucket(lockEnabledBucketName, {ObjectLocking: true}, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -2644,7 +2305,7 @@ describe('functional tests', function () { }) }) - step(`Get lock config on a bucket:_bucketName:${lockEnabledBucketName}`, (done) => { + step(`Get lock config on a bucket:_bucketName:${lockEnabledBucketName}`, done => { if (isFeatureSupported) { client.getObjectLockConfig(lockEnabledBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2656,7 +2317,7 @@ describe('functional tests', function () { } }) - step(`Check if bucket can be deleted:_bucketName:${lockEnabledBucketName}`, (done) => { + step(`Check if bucket can be deleted:_bucketName:${lockEnabledBucketName}`, done => { client.removeBucket(lockEnabledBucketName, (err) => { if (isFeatureSupported) { if (err && err.code === 'NotImplemented') return done() @@ -2667,35 +2328,32 @@ describe('functional tests', function () { } }) }) + }) describe('Object Lock support Set/Get API Tests', function () { - const lockConfigBucketName = 'minio-js-test-lock-conf-' + uuid.v4() + const lockConfigBucketName = "minio-js-test-lock-conf-" + uuid.v4() let isFeatureSupported = false - step(`Check if bucket with object lock can be created:_bucketName:${lockConfigBucketName}`, (done) => { - client.makeBucket(lockConfigBucketName, { ObjectLocking: true }, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${lockConfigBucketName}`, done => { + client.makeBucket(lockConfigBucketName, {ObjectLocking: true}, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) done() }) }) - step(`Update or replace lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { + step(`Update or replace lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { if (isFeatureSupported) { - client.setObjectLockConfig( - lockConfigBucketName, - { mode: 'GOVERNANCE', unit: 'Years', validity: 2 }, - (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - } - ) + client.setObjectLockConfig(lockConfigBucketName, {mode:"GOVERNANCE",unit:'Years', validity:2 }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) } else { done() } }) - step(`Get lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { + step(`Get lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2707,7 +2365,7 @@ describe('functional tests', function () { } }) - step(`Set lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { + step(`Set lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { if (isFeatureSupported) { client.setObjectLockConfig(lockConfigBucketName, {}, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2718,7 +2376,7 @@ describe('functional tests', function () { done() } }) - step(`Get and verify lock config on a bucket after reset/update:_bucketName:${lockConfigBucketName}`, (done) => { + step(`Get and verify lock config on a bucket after reset/update:_bucketName:${lockConfigBucketName}`, done => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2730,7 +2388,7 @@ describe('functional tests', function () { } }) - step(`Check if bucket can be deleted:_bucketName:${lockConfigBucketName}`, (done) => { + step(`Check if bucket can be deleted:_bucketName:${lockConfigBucketName}`, done => { client.removeBucket(lockConfigBucketName, (err) => { if (isFeatureSupported) { if (err && err.code === 'NotImplemented') return done() @@ -2741,7 +2399,9 @@ describe('functional tests', function () { } }) }) + }) + }) describe('Object retention API Tests', () => { @@ -2749,13 +2409,13 @@ describe('functional tests', function () { // Gateway mode does not support this header. describe('Object retention get/set API Test', function () { - const objRetentionBucket = 'minio-js-test-retention-' + uuid.v4() - const retentionObjName = 'RetentionObject' + const objRetentionBucket = "minio-js-test-retention-" + uuid.v4() + const retentionObjName = "RetentionObject" let isFeatureSupported = false let versionId = null - step(`Check if bucket with object lock can be created:_bucketName:${objRetentionBucket}`, (done) => { - client.makeBucket(objRetentionBucket, { ObjectLocking: true }, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${objRetentionBucket}`, done => { + client.makeBucket(objRetentionBucket, {ObjectLocking: true}, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -2763,92 +2423,73 @@ describe('functional tests', function () { }) }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}, stream:100Kib_`, - (done) => { - // Put two versions of the same object. - if (isFeatureSupported) { - client - .putObject(objRetentionBucket, retentionObjName, readableStream(_1byte), _1byte.length, {}) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}, stream:100Kib_`, done => { + // Put two versions of the same object. + if (isFeatureSupported) { + client.putObject(objRetentionBucket, retentionObjName, readableStream(_1byte), _1byte.length, {}) + .then(() => done()) + .catch(done) + } else { + done() } - ) + }) - step( - `statObject(bucketName, objectName, statOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, - (done) => { - if (isFeatureSupported) { - client.statObject(objRetentionBucket, retentionObjName, {}, (e, res) => { - versionId = res.versionId - done() - }) - } else { + step(`statObject(bucketName, objectName, statOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { + if (isFeatureSupported) { + client.statObject(objRetentionBucket, retentionObjName, {}, (e, res) => { + versionId = res.versionId done() - } + }) + } else { + done() } - ) - step( - `putObjectRetention(bucketName, objectName, putOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, - (done) => { - // Put two versions of the same object. - if (isFeatureSupported) { - let expirationDate = new Date() - // set expiry to start of next day. - expirationDate.setDate(expirationDate.getDate() + 1) - expirationDate.setUTCHours(0, 0, 0, 0) // Should be start of the day.(midnight) - - client - .putObjectRetention(objRetentionBucket, retentionObjName, { - governanceBypass: true, - mode: 'GOVERNANCE', - retainUntilDate: expirationDate.toISOString(), - versionId: versionId, - }) - .then(() => done()) - .catch(done) - } else { - done() - } - } - ) + }) - step( - `getObjectRetention(bucketName, objectName, getOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, - (done) => { - if (isFeatureSupported) { - client.getObjectRetention(objRetentionBucket, retentionObjName, { versionId: versionId }, () => { - done() - }) - } else { + step(`putObjectRetention(bucketName, objectName, putOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { + // Put two versions of the same object. + if (isFeatureSupported) { + let expirationDate = new Date() + // set expiry to start of next day. + expirationDate.setDate(expirationDate.getDate() + 1) + expirationDate.setUTCHours(0, 0, 0, 0) // Should be start of the day.(midnight) + + client.putObjectRetention(objRetentionBucket, retentionObjName, { + governanceBypass: true, + mode: "GOVERNANCE", + retainUntilDate: expirationDate.toISOString(), + versionId: versionId + }) + .then(() => done()) + .catch(done) + } else { + done() + } + }) + + step(`getObjectRetention(bucketName, objectName, getOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { + if (isFeatureSupported) { + client.getObjectRetention(objRetentionBucket, retentionObjName, {versionId: versionId}, () => { done() - } + }) + } else { + done() } - ) - step( - `removeObject(bucketName, objectName, removeOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, - (done) => { - if (isFeatureSupported) { - client.removeObject( - objRetentionBucket, - retentionObjName, - { versionId: versionId, governanceBypass: true }, - () => { - done() - } - ) - } else { + }) + + step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { + if (isFeatureSupported) { + client.removeObject(objRetentionBucket, retentionObjName, {versionId:versionId, governanceBypass:true}, () => { done() - } + }) + } else { + done() } - ) - step(`removeBucket(bucketName, )_bucketName:${objRetentionBucket}`, (done) => { + }) + + step(`removeBucket(bucketName, )_bucketName:${objRetentionBucket}`, done => { if (isFeatureSupported) { client.removeBucket(objRetentionBucket, () => { done() @@ -2856,39 +2497,40 @@ describe('functional tests', function () { } else { done() } + }) + }) }) describe('Bucket Encryption Related APIs', () => { // Isolate the bucket/object for easy debugging and tracking. // this is not supported in gateway mode. - const encBucketName = 'minio-js-test-bucket-enc-' + uuid.v4() + const encBucketName = "minio-js-test-bucket-enc-" + uuid.v4() before((done) => client.makeBucket(encBucketName, '', done)) after((done) => client.removeBucket(encBucketName, done)) + const encObjName = 'datafile-100-kB' const encObjFileContent = Buffer.alloc(100 * 1024, 0) let isEncryptionSupported = false - step(`Set Encryption on a bucket:_bucketName:${encBucketName}`, (done) => { + step(`Set Encryption on a bucket:_bucketName:${encBucketName}`, done => { // setBucketEncryption succeeds in NAS mode. const buckEncPromise = client.setBucketEncryption(encBucketName) - buckEncPromise - .then(() => { - done() - }) + buckEncPromise.then(() => { + done() + }) .catch(() => { done() }) }) - step(`Get encryption of a bucket:_bucketName:${encBucketName}`, (done) => { + step(`Get encryption of a bucket:_bucketName:${encBucketName}`, done => { const getBucEncObj = client.getBucketEncryption(encBucketName) - getBucEncObj - .then(() => { - done() - }) + getBucEncObj.then(() => { + done() + }) .catch((err) => { if (err && err.code === 'NotImplemented') { isEncryptionSupported = false @@ -2902,67 +2544,54 @@ describe('functional tests', function () { }) }) - step( - `Put an object to check for default encryption bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, - (done) => { - if (isEncryptionSupported) { - const putObjPromise = client.putObject(encBucketName, encObjName, encObjFileContent) - putObjPromise - .then(() => { - done() - }) - .catch(() => { - done() - }) - } else { + step(`Put an object to check for default encryption bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { + if (isEncryptionSupported) { + const putObjPromise = client.putObject(encBucketName, encObjName, encObjFileContent) + putObjPromise.then(() => { done() - } + }) + .catch(() => { + done() + }) + } else { + done() } - ) - - step( - `Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, - (done) => { - if (isEncryptionSupported) { - const statObjPromise = client.statObject(encBucketName, encObjName) - statObjPromise - .then(() => { - done() - }) - .catch(() => { - done() - }) - } else { + }) + + step(`Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { + if (isEncryptionSupported) { + const statObjPromise = client.statObject(encBucketName, encObjName) + statObjPromise.then(() => { done() - } + }) + .catch(() => { + done() + }) + } else { + done() } - ) - - step( - `Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}`, - (done) => { - if (isEncryptionSupported) { - const getBuckEnc = client.getBucketEncryption(encBucketName) - getBuckEnc - .then(() => { - done() - }) - .catch(() => { - done() - }) - } else { + }) + + step(`Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}`, done => { + if (isEncryptionSupported) { + const getBuckEnc = client.getBucketEncryption(encBucketName) + getBuckEnc.then(() => { done() - } + }) + .catch(() => { + done() + }) + } else { + done() } - ) + }) - step(`Remove object on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, (done) => { + step(`Remove object on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { if (isEncryptionSupported) { const removeObj = client.removeObject(encBucketName, encObjName) - removeObj - .then(() => { - done() - }) + removeObj.then(() => { + done() + }) .catch(() => { done() }) @@ -2971,13 +2600,12 @@ describe('functional tests', function () { } }) - step(`Remove encryption on a bucket:_bucketName:${encBucketName}`, (done) => { + step(`Remove encryption on a bucket:_bucketName:${encBucketName}`, done => { if (isEncryptionSupported) { const removeObj = client.removeBucketEncryption(encBucketName) - removeObj - .then(() => { - done() - }) + removeObj.then(() => { + done() + }) .catch(() => { done() }) @@ -2985,13 +2613,12 @@ describe('functional tests', function () { done() } }) - step(`Get encryption on a bucket:_bucketName:${encBucketName}`, (done) => { + step(`Get encryption on a bucket:_bucketName:${encBucketName}`, done => { if (isEncryptionSupported) { const getBuckEnc = client.getBucketEncryption(encBucketName) - getBuckEnc - .then(() => { - done() - }) + getBuckEnc.then(() => { + done() + }) .catch(() => { done() }) @@ -2999,6 +2626,7 @@ describe('functional tests', function () { done() } }) + }) describe('Bucket Replication API Tests', () => { @@ -3013,12 +2641,13 @@ describe('functional tests', function () { // Gateway mode does not support this header. let versionId = null describe('Object Legal hold get/set API Test', function () { - const objLegalHoldBucketName = 'minio-js-test-legalhold-' + uuid.v4() - const objLegalHoldObjName = 'LegalHoldObject' + const objLegalHoldBucketName = "minio-js-test-legalhold-" + uuid.v4() + const objLegalHoldObjName = "LegalHoldObject" let isFeatureSupported = false - step(`Check if bucket with object lock can be created:_bucketName:${objLegalHoldBucketName}`, (done) => { - client.makeBucket(objLegalHoldBucketName, { ObjectLocking: true }, (err) => { + + step(`Check if bucket with object lock can be created:_bucketName:${objLegalHoldBucketName}`, done => { + client.makeBucket(objLegalHoldBucketName, {ObjectLocking: true}, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -3026,128 +2655,92 @@ describe('functional tests', function () { }) }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}, stream:100Kib_`, - (done) => { - if (isFeatureSupported) { - client - .putObject(objLegalHoldBucketName, objLegalHoldObjName, readableStream(_1byte), _1byte.length, {}) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}, stream:100Kib_`, done => { + if (isFeatureSupported) { + client.putObject(objLegalHoldBucketName, objLegalHoldObjName, readableStream(_1byte), _1byte.length, {}) + .then(() => done()) + .catch(done) + } else { + done() } - ) + }) - step( - `statObject(bucketName, objectName, statOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.statObject(objLegalHoldBucketName, objLegalHoldObjName, {}, (e, res) => { - versionId = res.versionId - done() - }) - } else { + step(`statObject(bucketName, objectName, statOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.statObject(objLegalHoldBucketName, objLegalHoldObjName, {}, (e, res) => { + versionId = res.versionId done() - } + }) + } else { + done() } - ) + }) - step( - `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { - done() - }) - } else { + step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { done() - } + }) + } else { + done() } - ) + }) - step( - `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.setObjectLegalHold( - objLegalHoldBucketName, - objLegalHoldObjName, - { status: 'ON', versionId: versionId }, - () => { - done() - } - ) - } else { + step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {status:"ON", versionId:versionId}, () => { done() - } + }) + } else { + done() } - ) - step( - `getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { - done() - }) - } else { + }) + + step(`getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { done() - } + }) + } else { + done() } - ) + }) - step( - `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.setObjectLegalHold( - objLegalHoldBucketName, - objLegalHoldObjName, - { status: 'OFF', versionId: versionId }, - () => { - done() - } - ) - } else { + step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {status:"OFF", versionId:versionId}, () => { done() - } + }) + } else { + done() } - ) - step( - `getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, { versionId: versionId }, () => { - done() - }) - } else { + }) + + step(`getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {versionId: versionId}, () => { done() - } + }) + } else { + done() } - ) - step( - `removeObject(bucketName, objectName, removeOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, - (done) => { - if (isFeatureSupported) { - client.removeObject( - objLegalHoldBucketName, - objLegalHoldObjName, - { versionId: versionId, governanceBypass: true }, - () => { - done() - } - ) - } else { + }) + + step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { + if (isFeatureSupported) { + client.removeObject(objLegalHoldBucketName, objLegalHoldObjName, {versionId:versionId, governanceBypass:true}, () => { done() - } + }) + } else { + done() } - ) - step(`removeBucket(bucketName, )_bucketName:${objLegalHoldBucketName}`, (done) => { + }) + + step(`removeBucket(bucketName, )_bucketName:${objLegalHoldBucketName}`, done => { if (isFeatureSupported) { client.removeBucket(objLegalHoldBucketName, () => { done() @@ -3155,13 +2748,14 @@ describe('functional tests', function () { } else { done() } + }) - }) - }) + + })}) describe('Object Name special characters test without Prefix', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = 'minio-js-test-obj-spwpre-' + uuid.v4() + const bucketNameForSpCharObjects = "minio-js-test-obj-spwpre-" + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) @@ -3176,119 +2770,98 @@ describe('functional tests', function () { const objectContents = Buffer.alloc(100 * 1024, 0) describe('Without Prefix Test', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}, stream:100Kib_`, - (done) => { - client - .putObject(bucketNameForSpCharObjects, objectNameSpecialChars, objectContents) - .then(() => { - done() - }) - .catch(done) - } - ) - - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, - (done) => { - const listStream = client.listObjects(bucketNameForSpCharObjects, '', true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - } - ) - - step( - `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, - (done) => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, '', true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) - - listStream.on('error', function (e) { - done(e) - }) - } - ) - step( - `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, - (done) => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, '', true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) - - listStream.on('error', function (e) { - done(e) - }) - } - ) - - step( - `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, - (done) => { - client - .getObject(bucketNameForSpCharObjects, objectNameSpecialChars) - .then((stream) => { - stream.on('data', function () {}) - stream.on('end', done) - }) - .catch(done) - } - ) - step( - `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, - (done) => { - client.statObject(bucketNameForSpCharObjects, objectNameSpecialChars, (e) => { - if (e) return done(e) + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}, stream:100Kib_`, done => { + client.putObject(bucketNameForSpCharObjects, objectNameSpecialChars, objectContents) + .then(() => { done() }) - } - ) + .catch(done) + }) - step( - `removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, - (done) => { - client - .removeObject(bucketNameForSpCharObjects, objectNameSpecialChars) - .then(() => done()) - .catch(done) - } - ) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { + const listStream = client.listObjects(bucketNameForSpCharObjects, "", true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + }) + + step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, "", true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } + }) + + listStream.on('error', function (e) { + done(e) + }) + }) + step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, "", true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } + }) + + listStream.on('error', function (e) { + done(e) + }) + }) + + step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { + client.getObject(bucketNameForSpCharObjects, objectNameSpecialChars) + .then(stream => { + stream.on('data', function() {}) + stream.on('end', done) + }) + .catch(done) + }) + + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { + client.statObject(bucketNameForSpCharObjects, objectNameSpecialChars, (e) => { + if (e) return done(e) + done() + }) + }) + + step(`removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { + client.removeObject(bucketNameForSpCharObjects, objectNameSpecialChars) + .then(() => done()) + .catch(done) + }) }) + + }) describe('Object Name special characters test with a Prefix', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = 'minio-js-test-obj-spnpre-' + uuid.v4() + const bucketNameForSpCharObjects = "minio-js-test-obj-spnpre-" + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) @@ -3297,139 +2870,114 @@ describe('functional tests', function () { if (isWindowsPlatform) { objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 u0040 amȡȹɆple&0a!-_.'()&$@=;+,.pdf" } - const prefix = 'test' + const prefix = "test" const objectNameWithPrefixForSpecialChars = `${prefix}/${objectNameSpecialChars}` const objectContents = Buffer.alloc(100 * 1024, 0) + describe('With Prefix Test', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}, stream:100Kib`, - (done) => { - client - .putObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, objectContents) - .then(() => { - done() - }) - .catch(done) - } - ) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, - (done) => { - const listStream = client.listObjects(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { - done() - } else { - return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) - ) - } - }) - listStream.on('error', function (e) { - done(e) + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}, stream:100Kib`, done => { + client.putObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, objectContents) + .then(() => { + done() }) - } - ) + .catch(done) + }) - step( - `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, - (done) => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { - done() - } else { - return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) - ) - } - }) - listStream.on('error', function (e) { - done(e) - }) - } - ) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { + const listStream = client.listObjects(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj - step( - `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, - (done) => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { - done() - } else { - return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) - ) - } - }) - listStream.on('error', function (e) { - done(e) - }) - } - ) + }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + }) - step( - `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName_:${objectNameWithPrefixForSpecialChars}`, - (done) => { - client - .getObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) - .then((stream) => { - stream.on('data', function () {}) - stream.on('end', done) - }) - .catch(done) - } - ) + step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + }) - step( - `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, - (done) => { - client.statObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, (e) => { - if (e) return done(e) + step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { done() + } else { + return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + }) + + step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName_:${objectNameWithPrefixForSpecialChars}`, done => { + client.getObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) + .then(stream => { + stream.on('data', function() {}) + stream.on('end', done) }) - } - ) + .catch(done) + }) - step( - `removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, - (done) => { - client - .removeObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) - .then(() => done()) - .catch(done) - } - ) + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, done => { + client.statObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, (e) => { + if (e) return done(e) + done() + }) + }) + + step(`removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, done => { + client.removeObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) + .then(() => done()) + .catch(done) + }) }) + }) describe('Assume Role Tests', () => { // Run only in local environment. - const bucketName = 'minio-js-test-assume-role' + uuid.v4() + const bucketName = "minio-js-test-assume-role" + uuid.v4() before((done) => client.makeBucket(bucketName, '', done)) after((done) => client.removeBucket(bucketName, done)) + const objName = 'datafile-100-kB' const objContent = Buffer.alloc(100 * 1024, 0) - const canRunAssumeRoleTest = clientConfigParams.endPoint.includes('localhost') - const stsEndPoint = 'http://localhost:9000' + const canRunAssumeRoleTest = clientConfigParams.endPoint.includes("localhost") + const stsEndPoint = "http://localhost:9000" try { if (canRunAssumeRoleTest) { @@ -3440,208 +2988,162 @@ describe('functional tests', function () { secretKey: client.secretKey, }) - const aRoleConf = Object.assign({}, clientConfigParams, { credentialsProvider: assumeRoleProvider }) + const aRoleConf = Object.assign({}, clientConfigParams, {credentialsProvider: assumeRoleProvider}) const assumeRoleClient = new minio.Client(aRoleConf) - assumeRoleClient.region = server_region + assumeRoleClient.region= server_region describe('Put an Object', function () { - step( - `Put an object with assume role credentials: bucket:_bucketName:${bucketName}, _objectName:${objName}`, - (done) => { - const putObjPromise = assumeRoleClient.putObject(bucketName, objName, objContent) - putObjPromise - .then(() => { - done() - }) - .catch(done) - } - ) + step(`Put an object with assume role credentials: bucket:_bucketName:${bucketName}, _objectName:${objName}`, done => { + const putObjPromise = assumeRoleClient.putObject(bucketName, objName, objContent) + putObjPromise.then(() => { + done() + }) + .catch(done) + }) - step(`Remove an Object with assume role credentials:${bucketName}, _objectName:${objName}`, (done) => { + step(`Remove an Object with assume role credentials:${bucketName}, _objectName:${objName}`, done => { const removeObjPromise = assumeRoleClient.removeObject(bucketName, objName) - removeObjPromise - .then(() => { - done() - }) + removeObjPromise.then(() => { + done() + }) .catch(done) }) + }) } } catch (err) { // eslint-disable-next-line no-console - console.error('Error in Assume Role API.', err) + console.error("Error in Assume Role API.", err) } + }) describe('Put Object Response test with multipart on an Un versioned bucket:', () => { - const bucketToTestMultipart = 'minio-js-test-put-multiuv-' + uuid.v4() + + const bucketToTestMultipart = "minio-js-test-put-multiuv-" + uuid.v4() before((done) => client.makeBucket(bucketToTestMultipart, '', done)) after((done) => client.removeBucket(bucketToTestMultipart, done)) // Non multipart Test - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, - (done) => { + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, done => { + const stream = readableStream(_100kb) + client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { + if (e) done(e) + if (res.versionId === null && res.etag) { + done() + } + else{ + done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) + } + }) + }) + step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, done => { + client.removeObject(bucketToTestMultipart, _100kbObjectName) + .then(() => done()) + .catch(done) + }) + + + // Multipart Test + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, done => { + const stream = readableStream(_65mb) + client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { + if (e) done(e) + if (res.versionId === null && res.etag) { + done() + } + else{ + done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) + } + }) + }) + step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, done => { + client.removeObject(bucketToTestMultipart, _65mbObjectName) + .then(() => done()) + .catch(done) + }) + }) + + describe('Put Object Response test with multipart on Versioned bucket:', () => { + + const bucketToTestMultipart = "minio-js-test-put-multiv-" + uuid.v4() + let isVersioningSupported = false + let versionedObjectRes = null + let versionedMultiPartObjectRes = null + + before((done) => client.makeBucket(bucketToTestMultipart, '', () => { + client.setBucketVersioning(bucketToTestMultipart, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + + })) + after((done) => client.removeBucket(bucketToTestMultipart, done)) + + + + // Non multipart Test + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, done => { + + if (isVersioningSupported) { const stream = readableStream(_100kb) client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { if (e) done(e) - if (res.versionId === null && res.etag) { + if (res.versionId && res.etag) { + versionedObjectRes = res done() } else { - done( - new Error( - `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) - ) + done(new Error(`Incorrect response format, expected: {versionId:'some-version-hash', etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) } }) + } else { + done() } - ) - step( - `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, - (done) => { - client - .removeObject(bucketToTestMultipart, _100kbObjectName) + + }) + step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, done => { + if (isVersioningSupported) { + client.removeObject(bucketToTestMultipart, _100kbObjectName, {versionId: versionedObjectRes.versionId}) .then(() => done()) .catch(done) + } else { + done() } - ) + }) + // Multipart Test - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, - (done) => { + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, done => { + if (isVersioningSupported) { const stream = readableStream(_65mb) client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { if (e) done(e) - if (res.versionId === null && res.etag) { + if (res.versionId && res.etag) { + versionedMultiPartObjectRes = res done() } else { - done( - new Error( - `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) - ) + done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) } }) + } else { + done() } - ) - step( - `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, - (done) => { - client - .removeObject(bucketToTestMultipart, _65mbObjectName) + }) + step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, done => { + if (isVersioningSupported) { + client.removeObject(bucketToTestMultipart, _65mbObjectName, {versionId: versionedMultiPartObjectRes.versionId}) .then(() => done()) .catch(done) + } else { + done() } - ) - }) - - describe('Put Object Response test with multipart on Versioned bucket:', () => { - const bucketToTestMultipart = 'minio-js-test-put-multiv-' + uuid.v4() - let isVersioningSupported = false - let versionedObjectRes = null - let versionedMultiPartObjectRes = null - - before((done) => - client.makeBucket(bucketToTestMultipart, '', () => { - client.setBucketVersioning(bucketToTestMultipart, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - }) - ) - after((done) => client.removeBucket(bucketToTestMultipart, done)) - - // Non multipart Test - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, - (done) => { - if (isVersioningSupported) { - const stream = readableStream(_100kb) - client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { - if (e) done(e) - if (res.versionId && res.etag) { - versionedObjectRes = res - done() - } else { - done( - new Error( - `Incorrect response format, expected: {versionId:'some-version-hash', etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) - ) - } - }) - } else { - done() - } - } - ) - step( - `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, - (done) => { - if (isVersioningSupported) { - client - .removeObject(bucketToTestMultipart, _100kbObjectName, { versionId: versionedObjectRes.versionId }) - .then(() => done()) - .catch(done) - } else { - done() - } - } - ) - - // Multipart Test - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, - (done) => { - if (isVersioningSupported) { - const stream = readableStream(_65mb) - client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { - if (e) done(e) - if (res.versionId && res.etag) { - versionedMultiPartObjectRes = res - done() - } else { - done( - new Error( - `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) - ) - } - }) - } else { - done() - } - } - ) - step( - `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, - (done) => { - if (isVersioningSupported) { - client - .removeObject(bucketToTestMultipart, _65mbObjectName, { versionId: versionedMultiPartObjectRes.versionId }) - .then(() => done()) - .catch(done) - } else { - done() - } - } - ) + }) }) - describe('Compose Object API Tests', () => { + describe("Compose Object API Tests", () => { /** * Steps: * 1. Generate a 100MB file in temp dir @@ -3654,7 +3156,7 @@ describe('functional tests', function () { */ var _100mbFileToBeSplitAndComposed = Buffer.alloc(100 * 1024 * 1024, 0) - let composeObjectTestBucket = 'minio-js-test-compose-obj-' + uuid.v4() + let composeObjectTestBucket = "minio-js-test-compose-obj-" + uuid.v4() before((done) => client.makeBucket(composeObjectTestBucket, '', done)) after((done) => client.removeBucket(composeObjectTestBucket, done)) @@ -3664,12 +3166,11 @@ describe('functional tests', function () { let partFilesNamesWithPath = [] let partObjNameList = [] let isSplitSuccess = false - step(`Create a local file of 100 MB and split `, (done) => { + step(`Create a local file of 100 MB and split `, done => { try { fs.writeFileSync(fileToSplit, _100mbFileToBeSplitAndComposed) // 100 MB split into 26 MB part size. - splitFile - .splitFileBySize(fileToSplit, 26 * 1024 * 1024) + splitFile.splitFileBySize(fileToSplit, (26 * 1024 * 1024)) .then((names) => { partFilesNamesWithPath = names isSplitSuccess = true @@ -3684,382 +3185,322 @@ describe('functional tests', function () { }) step(`Upload parts to Bucket_bucketName:${composeObjectTestBucket}, _objectName:${partObjNameList}`, (done) => { + if (isSplitSuccess) { + const fileSysToBucket = partFilesNamesWithPath.map((partFileName) => { - const partObjName = partFileName.substr((tmpSubDir + '/').length) + const partObjName = partFileName.substr((tmpSubDir + "/").length) partObjNameList.push(partObjName) return client.fPutObject(composeObjectTestBucket, partObjName, partFileName, {}) }) - Promise.all(fileSysToBucket) - .then(() => { - done() - }) - .catch(done) + Promise.all(fileSysToBucket).then(() => { + done() + }).catch(done) + } else { done() } }) - step( - `composeObject(destObjConfig, sourceObjList, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, - (done) => { - if (isSplitSuccess) { - const sourcePartObjList = partObjNameList.map((partObjName) => { - return new CopySourceOptions({ - Bucket: composeObjectTestBucket, - Object: partObjName, - }) - }) + step(`composeObject(destObjConfig, sourceObjList, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, (done) => { - const destObjConfig = new CopyDestinationOptions({ + if (isSplitSuccess) { + const sourcePartObjList = partObjNameList.map((partObjName) => { + return new CopySourceOptions({ Bucket: composeObjectTestBucket, - Object: composedObjName, + Object: partObjName }) + }) - client.composeObject(destObjConfig, sourcePartObjList).then((e) => { - if (e) return done(e) - done() - }) - } else { + const destObjConfig = new CopyDestinationOptions({ + Bucket: composeObjectTestBucket, + Object: composedObjName + }) + + client.composeObject(destObjConfig, sourcePartObjList).then((e) => { + if (e) return done(e) done() - } + }) + } else { + done() } - ) - - step( - `statObject(bucketName, objectName, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, - (done) => { - if (isSplitSuccess) { - client.statObject(composeObjectTestBucket, composedObjName, (e) => { - if (e) return done(e) - done() - }) - } else { + }) + + step(`statObject(bucketName, objectName, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, done => { + if (isSplitSuccess) { + client.statObject(composeObjectTestBucket, composedObjName, (e) => { + if (e) return done(e) done() - } + }) + + } else { + done() } - ) - - step( - `Remove Object Parts from Bucket::_bucketName:${composeObjectTestBucket}, _objectNames:${partObjNameList}`, - (done) => { - if (isSplitSuccess) { - const sourcePartObjList = partObjNameList.map((partObjName) => { - return client.removeObject(composeObjectTestBucket, partObjName) - }) + }) - Promise.all(sourcePartObjList) - .then(() => { - done() - }) - .catch(done) - } else { + step(`Remove Object Parts from Bucket::_bucketName:${composeObjectTestBucket}, _objectNames:${partObjNameList}`, (done) => { + if (isSplitSuccess) { + const sourcePartObjList = partObjNameList.map((partObjName) => { + return client.removeObject(composeObjectTestBucket, partObjName) + }) + + Promise.all(sourcePartObjList).then(() => { done() - } + }).catch(done) + + } else { + done() } - ) - - step( - `Remove Composed target Object::_bucketName:${composeObjectTestBucket}, objectName:${composedObjName}`, - (done) => { - if (isSplitSuccess) { - client - .removeObject(composeObjectTestBucket, composedObjName) - .then(() => { - done() - }) - .catch(done) - } else { + }) + + step(`Remove Composed target Object::_bucketName:${composeObjectTestBucket}, objectName:${composedObjName}`, (done) => { + if (isSplitSuccess) { + client.removeObject(composeObjectTestBucket, composedObjName).then(() => { done() - } + }).catch(done) + } else { + done() } - ) + }) - step('Clean up temp directory part files', (done) => { + step("Clean up temp directory part files", (done) => { if (isSplitSuccess) { removeDirAndFiles(tmpSubDir) } done() }) + }) describe('Special Characters test on a prefix and an object', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = 'minio-js-test-obj-sppre' + uuid.v4() + const bucketNameForSpCharObjects = "minio-js-test-obj-sppre" + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) - const specialCharPrefix = 'SpecialMenÚäÃļÃŧexPrefix/' + const specialCharPrefix = "SpecialMenÚäÃļÃŧexPrefix/" let objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 \u0040 amȡȹɆple&0a!-_.*'()&$@=;:+,?<>.pdf" if (isWindowsPlatform) { objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 u0040 amȡȹɆple&0a!-_.'()&$@=;+,.pdf" } + const objectNameWithPrefix = `${specialCharPrefix}${objectNameSpecialChars}` const objectContents = Buffer.alloc(100 * 1024, 0) - step( - `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}, stream:100Kib`, - (done) => { - client - .putObject(bucketNameForSpCharObjects, objectNameWithPrefix, objectContents) - .then(() => { - done() - }) - .catch(done) - } - ) - - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, - (done) => { - const listStream = client.listObjects(bucketNameForSpCharObjects, '', false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected Prefix Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - } - ) - - step( - `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, - (done) => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, '', false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - // verify that the prefix special characters are handled - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}, stream:100Kib`, done => { + client.putObject(bucketNameForSpCharObjects, objectNameWithPrefix, objectContents) + .then(() => { + done() }) + .catch(done) + }) - listStream.on('error', function (e) { - done(e) - }) - } - ) - step( - `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, - (done) => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, '', false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } - }) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { + const listStream = client.listObjects(bucketNameForSpCharObjects, "", false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.prefix === specialCharPrefix) { + done() + } else { + return done(new Error(`Expected Prefix Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + }) - listStream.on('error', function (e) { - done(e) - }) - } - ) - - step( - `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, - (done) => { - client - .getObject(bucketNameForSpCharObjects, objectNameWithPrefix) - .then((stream) => { - stream.on('data', function () {}) - stream.on('end', done) - }) - .catch(done) - } - ) + step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, "", false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + // verify that the prefix special characters are handled + if (listedObject.prefix === specialCharPrefix) { + done() + } else { + return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } + }) - step( - `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, - (done) => { - client.statObject(bucketNameForSpCharObjects, objectNameWithPrefix, (e) => { - if (e) return done(e) + listStream.on('error', function (e) { + done(e) + }) + }) + + step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, "", false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.prefix === specialCharPrefix) { done() + } else { + return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } + }) + + listStream.on('error', function (e) { + done(e) + }) + }) + + step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, done => { + client.getObject(bucketNameForSpCharObjects, objectNameWithPrefix) + .then(stream => { + stream.on('data', function() {}) + stream.on('end', done) }) - } - ) - step( - `removeObject(bucketName, objectName)_bucketName:${objectNameWithPrefix}, _objectName:${objectNameWithPrefix}`, - (done) => { - client - .removeObject(bucketNameForSpCharObjects, objectNameWithPrefix) - .then(() => done()) - .catch(done) - } - ) + .catch(done) + }) + + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, done => { + client.statObject(bucketNameForSpCharObjects, objectNameWithPrefix, (e) => { + if (e) return done(e) + done() + }) + }) + step(`removeObject(bucketName, objectName)_bucketName:${objectNameWithPrefix}, _objectName:${objectNameWithPrefix}`, done => { + client.removeObject(bucketNameForSpCharObjects, objectNameWithPrefix) + .then(() => done()) + .catch(done) + }) + }) describe('Test listIncompleteUploads (Multipart listing) with special characters', () => { - const specialCharPrefix = 'SpecialMenÚäÃļÃŧexPrefix/' - const objectNameSpecialChars = 'äÃļÃŧex.pdf' + const specialCharPrefix = "SpecialMenÚäÃļÃŧexPrefix/" + const objectNameSpecialChars = "äÃļÃŧex.pdf" const spObjWithPrefix = `${specialCharPrefix}${objectNameSpecialChars}` - const spBucketName = 'minio-js-test-lin-sppre' + uuid.v4() + const spBucketName = "minio-js-test-lin-sppre" + uuid.v4() before((done) => client.makeBucket(spBucketName, '', done)) after((done) => client.removeBucket(spBucketName, done)) - step( - `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${spBucketName}, objectName:${spObjWithPrefix}, metaData:${metaData}`, - (done) => { - client.initiateNewMultipartUpload(spBucketName, spObjWithPrefix, metaData, done) - } - ) - - step( - `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}, recursive: true_`, - function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - done() - return - } + step(`initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${spBucketName}, objectName:${spObjWithPrefix}, metaData:${metaData}`, done => { + client.initiateNewMultipartUpload(spBucketName, spObjWithPrefix, metaData, done) + }) - var found = false - client - .listIncompleteUploads(spBucketName, spObjWithPrefix, true) - .on('error', (e) => done(e)) - .on('data', (data) => { - if (data.key === spObjWithPrefix) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) - }) + step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}, recursive: true_`, function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + done() + return } - ) - step( - `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, recursive: true_`, - function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - done() - return - } + var found = false + client.listIncompleteUploads(spBucketName, spObjWithPrefix, true) + .on('error', e => done(e)) + .on('data', data => { + if (data.key === spObjWithPrefix) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) + }) + }) - var found = false - client - .listIncompleteUploads(spBucketName, '', false) - .on('error', (e) => done(e)) - .on('data', (data) => { - // check the prefix - if (data.prefix === specialCharPrefix) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) - }) - } - ) - step( - `removeIncompleteUploads(bucketName, prefix)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}_`, - (done) => { - client.removeIncompleteUpload(spBucketName, spObjWithPrefix).then(done).catch(done) + step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, recursive: true_`, function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + done() + return } - ) + + var found = false + client.listIncompleteUploads(spBucketName, "", false) + .on('error', e => done(e)) + .on('data', data => { + // check the prefix + if (data.prefix === specialCharPrefix) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) + }) + }) + step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}_`, done => { + client.removeIncompleteUpload(spBucketName, spObjWithPrefix) + .then(done) + .catch(done) + }) }) describe('Select Object content API Test', function () { - const selObjContentBucket = 'minio-js-test-sel-object-' + uuid.v4() - const selObject = 'SelectObjectContent' + const selObjContentBucket = "minio-js-test-sel-object-" + uuid.v4() + const selObject = "SelectObjectContent" // Isolate the bucket/object for easy debugging and tracking. before((done) => client.makeBucket(selObjContentBucket, '', done)) after((done) => client.removeBucket(selObjContentBucket, done)) - step( - `putObject(bucketName, objectName, stream)_bucketName:${selObjContentBucket}, objectName:${selObject}, stream:csv`, - (done) => { - // Save a CSV file so that we can query later to test the results. - client - .putObject( - selObjContentBucket, - selObject, - 'Name,PhoneNumber,City,Occupation\n' + - 'Sam,(949) 123-45567,Irvine,Solutions Architect\n' + - 'Vinod,(949) 123-4556,Los Angeles,Solutions Architect\n' + - 'Jeff,(949) 123-45567,Seattle,AWS Evangelist\n' + - 'Jane,(949) 123-45567,Chicago,Developer\n' + - 'Sean,(949) 123-45567,Chicago,Developer\n' + - 'Mary,(949) 123-45567,Chicago,Developer\n' + - 'Kate,(949) 123-45567,Chicago,Developer', - {} - ) - .then(() => { - done() - }) - .catch(done) - } - ) - - step( - `selectObjectContent(bucketName, objectName, selectOpts)_bucketName:${selObjContentBucket}, objectName:${selObject}`, - (done) => { - const selectOpts = { - expression: 'SELECT * FROM s3object s where s."Name" = \'Jane\'', - expressionType: 'SQL', - inputSerialization: { - CSV: { FileHeaderInfo: 'Use', RecordDelimiter: '\n', FieldDelimiter: ',' }, - CompressionType: 'NONE', - }, - outputSerialization: { CSV: { RecordDelimiter: '\n', FieldDelimiter: ',' } }, - requestProgress: { Enabled: true }, - } + step(`putObject(bucketName, objectName, stream)_bucketName:${selObjContentBucket}, objectName:${selObject}, stream:csv`, done => { + // Save a CSV file so that we can query later to test the results. + client.putObject(selObjContentBucket, selObject, "Name,PhoneNumber,City,Occupation\n" + + "Sam,(949) 123-45567,Irvine,Solutions Architect\n" + + "Vinod,(949) 123-4556,Los Angeles,Solutions Architect\n" + + "Jeff,(949) 123-45567,Seattle,AWS Evangelist\n" + + "Jane,(949) 123-45567,Chicago,Developer\n" + + "Sean,(949) 123-45567,Chicago,Developer\n" + + "Mary,(949) 123-45567,Chicago,Developer\n" + + "Kate,(949) 123-45567,Chicago,Developer", {}) + .then(() => { + done() + }) + .catch(done) - client - .selectObjectContent(selObjContentBucket, selObject, selectOpts) - .then((result) => { - // verify the select query result string. - if (result.getRecords().toString() === 'Jane,(949) 123-45567,Chicago,Developer\n') { - // \n for csv line ending. - done() - } else { - return done( - new Error( - `Expected Result did not match received:${result - .getRecords() - .toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"` - ) - ) - } - }) - .catch(done) + }) + + step(`selectObjectContent(bucketName, objectName, selectOpts)_bucketName:${selObjContentBucket}, objectName:${selObject}`, done => { + + const selectOpts = { + expression: "SELECT * FROM s3object s where s.\"Name\" = 'Jane'", + expressionType: "SQL", + inputSerialization : {'CSV': {"FileHeaderInfo": "Use", + RecordDelimiter: "\n", + FieldDelimiter: ",", + }, + 'CompressionType': 'NONE'}, + outputSerialization : {'CSV': {RecordDelimiter: "\n", + FieldDelimiter: ",",}}, + requestProgress: {Enabled: true} } - ) + + client.selectObjectContent(selObjContentBucket, selObject, selectOpts) + .then((result) => { + // verify the select query result string. + if (result.getRecords().toString() === "Jane,(949) 123-45567,Chicago,Developer\n") { // \n for csv line ending. + done() + } + else{ + return done(new Error(`Expected Result did not match received:${result.getRecords().toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"`)) + } + }) + .catch(done) + }) step(`Remove Object post select of content:_bucketName:${selObjContentBucket},objectName:${selObject}`, (done) => { - client - .removeObject(selObjContentBucket, selObject) + client.removeObject(selObjContentBucket, selObject) .then(() => done()) .catch(done) }) }) + describe('Force Deletion of objects with versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdWithVerBucket = 'minio-js-fd-version-' + uuid.v4() + const fdWithVerBucket = "minio-js-fd-version-" + uuid.v4() const fdObjectName = 'datafile-100-kB' const fdObject = dataDir ? fs.readFileSync(dataDir + '/' + fdObjectName) : Buffer.alloc(100 * 1024, 0) @@ -4069,260 +3510,209 @@ describe('functional tests', function () { describe('Test for force removal of multiple versions', function () { let isVersioningSupported = false const objVersionList = [] - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdWithVerBucket},versionConfig:{Status:"Enabled"} `, - (done) => { - client.setBucketVersioning(fdWithVerBucket, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - } - ) + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${fdWithVerBucket},versionConfig:{Status:"Enabled"} `, (done) => { + client.setBucketVersioning(fdWithVerBucket, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(fdWithVerBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { + if (isVersioningSupported) { + client.putObject(fdWithVerBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + } else { + done() } - ) + + }) // Put two versions of the same object. - step( - `putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(fdWithVerBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { + if (isVersioningSupported) { + client.putObject(fdWithVerBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + } else { + done() } - ) + }) - step( - `removeObject(bucketName, objectList, removeOpts)_bucketName:${fdWithVerBucket}_Remove ${objVersionList.length} objects`, - (done) => { - if (isVersioningSupported) { - client.removeObject(fdWithVerBucket, fdObjectName, { forceDelete: true }, () => { - done() - }) - } else { + step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdWithVerBucket}_Remove ${objVersionList.length} objects`, done => { + if (isVersioningSupported) { + client.removeObject(fdWithVerBucket, fdObjectName,{forceDelete:true}, () => { done() - } + }) + } else { + done() } - ) + }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${fdWithVerBucket}, prefix: '', recursive:true_`, - (done) => { - if (isVersioningSupported) { - client - .listObjects(fdWithVerBucket, '', true, { IncludeVersion: true }) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', (data) => { - objVersionList.push(data) - }) - } else { - done() - } + step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdWithVerBucket}, prefix: '', recursive:true_`, done => { + if (isVersioningSupported) { + client.listObjects(fdWithVerBucket, '', true, {IncludeVersion: true}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', data => { + objVersionList.push(data) + }) + } else { + done() } - ) + }) }) }) describe('Force Deletion of prefix with versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdPrefixBucketName = 'minio-js-fd-version-' + uuid.v4() + const fdPrefixBucketName = "minio-js-fd-version-" + uuid.v4() const fdPrefixObjName = 'my-prefix/datafile-100-kB' const fdPrefixObject = dataDir ? fs.readFileSync(dataDir + '/' + fdPrefixObjName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(fdPrefixBucketName, '', done)) after((done) => client.removeBucket(fdPrefixBucketName, done)) + describe('Test for removal of multiple versions', function () { let isVersioningSupported = false const objVersionList = [] - step( - `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdPrefixBucketName},versionConfig:{Status:"Enabled"} `, - (done) => { - client.setBucketVersioning(fdPrefixBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - } - ) + step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${fdPrefixBucketName},versionConfig:{Status:"Enabled"} `, (done) => { + client.setBucketVersioning(fdPrefixBucketName, {Status: "Enabled"}, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + }) - step( - `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, done => { + if (isVersioningSupported) { + client.putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) + .then(() => done()) + .catch(done) + } else { + done() } - ) + + }) // Put two versions of the same object. - step( - `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, - (done) => { - if (isVersioningSupported) { - client - .putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) - .then(() => done()) - .catch(done) - } else { - done() - } + step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, done => { + if (isVersioningSupported) { + client.putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) + .then(() => done()) + .catch(done) + } else { + done() } - ) + }) - step( - `removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucketName}_Remove ${objVersionList.length} objects`, - (done) => { - if (isVersioningSupported) { - client.removeObject(fdPrefixBucketName, 'my-prefix/', { forceDelete: true }, () => { - done() - }) - } else { + step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucketName}_Remove ${objVersionList.length} objects`, done => { + if (isVersioningSupported) { + client.removeObject(fdPrefixBucketName, "my-prefix/",{forceDelete:true}, () => { done() - } + }) + } else { + done() } - ) + }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucketName}, prefix: '', recursive:true_`, - (done) => { - if (isVersioningSupported) { - client - .listObjects(fdPrefixBucketName, '/my-prefix', true, { IncludeVersion: true }) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', (data) => { - objVersionList.push(data) - }) - } else { - done() - } + step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucketName}, prefix: '', recursive:true_`, done => { + if (isVersioningSupported) { + client.listObjects(fdPrefixBucketName, '/my-prefix', true, {IncludeVersion: true}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', data => { + objVersionList.push(data) + }) + } else { + done() } - ) + }) }) }) describe('Force Deletion of objects without versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = 'minio-js-fd-nv-' + uuid.v4() + const versionedBucketName = "minio-js-fd-nv-" + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir - ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) - : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) + describe('Test force removal of an object', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, - (done) => { - client - .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - } - ) + step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { + client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + }) - step( - `removeObject(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove 1 object`, - (done) => { - client.removeObject(versionedBucketName, versioned_100kbObjectName, { forceDelete: true }, () => { - done() - }) - } - ) + step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove 1 object`, done => { + client.removeObject(versionedBucketName, versioned_100kbObjectName,{forceDelete:true}, () => { + done() + }) + }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, - (done) => { - let objVersionList = [] - client - .listObjects(versionedBucketName, '', true, {}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', (data) => { - objVersionList.push(data) - }) - } - ) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { + let objVersionList=[] + client.listObjects(versionedBucketName, '', true, {}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', data => { + objVersionList.push(data) + }) + }) }) }) describe('Force Deletion of prefix', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdPrefixBucket = 'minio-js-fd-nv-' + uuid.v4() + const fdPrefixBucket = "minio-js-fd-nv-" + uuid.v4() const fdObjectName = 'my-prefix/datafile-100-kB' const fdObject = dataDir ? fs.readFileSync(dataDir + '/' + fdObjectName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(fdPrefixBucket, '', done)) after((done) => client.removeBucket(fdPrefixBucket, done)) + describe('Test force removal of a prefix', function () { - step( - `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucket}, objectName:${fdObjectName}, stream:100Kib_`, - (done) => { - client - .putObject(fdPrefixBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - } - ) + step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { + client.putObject(fdPrefixBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + }) - step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucket}_Remove 1 object`, (done) => { - client.removeObject(fdPrefixBucket, '/my-prefix', { forceDelete: true }, () => { + step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucket}_Remove 1 object`, done => { + client.removeObject(fdPrefixBucket, "/my-prefix",{forceDelete:true}, () => { done() }) }) - step( - `listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucket}, prefix: 'my-prefix', recursive:true_`, - (done) => { - let objList = [] - client - .listObjects(fdPrefixBucket, 'my-prefix', true, {}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objList.length)) return done() - return done(new Error(`listObjects lists ${objList.length} objects, expected 0`)) - }) - .on('data', (data) => { - objList.push(data) - }) - } - ) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucket}, prefix: 'my-prefix', recursive:true_`, done => { + let objList=[] + client.listObjects(fdPrefixBucket, 'my-prefix', true, {}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objList.length)) return done() + return done(new Error(`listObjects lists ${objList.length} objects, expected 0`)) + }) + .on('data', data => { + objList.push(data) + }) + }) }) }) + }) diff --git a/src/test/unit/test.js b/src/test/unit/test.js index a8ce59fa..c91d3f17 100644 --- a/src/test/unit/test.js +++ b/src/test/unit/test.js @@ -19,21 +19,17 @@ require('source-map-support').install() import { assert } from 'chai' import Nock from 'nock' import Stream from 'stream' - -import { - calculateEvenSplits, - CopyDestinationOptions, +import * as Minio from '../../../dist/main/minio' +import { isValidEndpoint, + isValidIP, makeDateLong, + makeDateShort,partsRequired, CopySourceOptions, + CopyDestinationOptions, isArray, - isValidEndpoint, - isValidIP, - makeDateLong, - makeDateShort, - partsRequired, + calculateEvenSplits, } from '../../../dist/main/helpers' -import * as Minio from '../../../dist/main/minio' -var Package = require('../../../package') +var Package = require('../../../package.json') describe('Helpers', () => { it('should validate for s3 endpoint', () => { @@ -48,7 +44,7 @@ describe('Helpers', () => { it('should fail for invalid endpoint characters', () => { assert.equal(isValidEndpoint('111.#2.11'), false) }) - + it('should make date short', () => { let date = new Date('2012-12-03T17:25:36.331Z') @@ -60,132 +56,110 @@ describe('Helpers', () => { assert.equal(makeDateLong(date), '20170811T172634Z') }) + // Adopted from minio-go sdk - const oneGB = 1024 * 1024 * 1024 - const fiveGB = 5 * oneGB + const oneGB =1024 * 1024 * 1024 + const fiveGB = (5*oneGB) const OBJ_SIZES = { - gb1: oneGB, - gb5: fiveGB, - gb5p1: fiveGB + 1, - gb10p1: 2 * fiveGB + 1, - gb10p2: 2 * fiveGB + 2, + gb1 : oneGB, + gb5 : fiveGB, + gb5p1 : fiveGB + 1, + gb10p1 : 2 * fiveGB + 1, + gb10p2 : 2 * fiveGB + 2 } const maxMultipartPutObjectSize = 1024 * 1024 * 1024 * 1024 * 5 - it('Parts Required Test cases ', () => { + it('Parts Required Test cases ', () =>{ + const expectedPartsRequiredTestCases = [ - { value: 0, expected: 0 }, - { value: 1, expected: 1 }, - { value: fiveGB, expected: 10 }, - { value: OBJ_SIZES.gb5p1, expected: 10 }, - { value: 2 * fiveGB, expected: 20 }, - { value: OBJ_SIZES.gb10p1, expected: 20 }, - { value: OBJ_SIZES.gb10p2, expected: 20 }, - { value: OBJ_SIZES.gb10p1 + OBJ_SIZES.gb10p2, expected: 40 }, - { value: maxMultipartPutObjectSize, expected: 10000 }, + {value:0, expected:0}, + {value:1, expected:1}, + {value:fiveGB, expected:10}, + {value:OBJ_SIZES.gb5p1, expected:10}, + {value:2 * fiveGB, expected:20}, + {value:OBJ_SIZES.gb10p1, expected:20}, + {value:OBJ_SIZES.gb10p2, expected:20}, + {value:OBJ_SIZES.gb10p1 + OBJ_SIZES.gb10p2, expected:40}, + {value:maxMultipartPutObjectSize, expected:10000} ] - expectedPartsRequiredTestCases.forEach((testCase) => { + expectedPartsRequiredTestCases.forEach((testCase)=>{ const fnResult = partsRequired(testCase.value) - assert.equal(fnResult, testCase.expected) + assert.equal(fnResult,testCase.expected) }) }) - it('Even split of Sizes Test cases ', () => { + it("Even split of Sizes Test cases ", ()=>{ // Adopted from minio-go sdk - const expectedSplitsTestCases = [ - { size: 0, sourceConfig: new CopySourceOptions({ Start: -1 }), expectedStart: null, expectedEnd: null }, - { size: 1, sourceConfig: new CopySourceOptions({ Start: -1 }), expectedStart: [undefined], expectedEnd: [NaN] }, - { size: 1, sourceConfig: new CopySourceOptions({ Start: 0 }), expectedStart: [0], expectedEnd: [0] }, - { - size: OBJ_SIZES.gb1, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [0, 536870912], - expectedEnd: [536870911, 1073741823], - }, - { - size: OBJ_SIZES.gb5, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [ - 0, 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, - ], - expectedEnd: [ - 536870911, 1073741823, 1610612735, 2147483647, 2684354559, 3221225471, 3758096383, 4294967295, 4831838207, - 5368709119, - ], + const expectedSplitsTestCases =[ + {size:0, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:null, expectedEnd:null} + ,{size:1, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:[undefined], expectedEnd:[NaN]} + ,{size:1,sourceConfig:new CopySourceOptions({Start: 0}), expectedStart:[0], expectedEnd:[0]} + ,{size:OBJ_SIZES.gb1, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:[0, 536870912],expectedEnd:[536870911, 1073741823]} + ,{size:OBJ_SIZES.gb5, sourceConfig:new CopySourceOptions({Start: -1}), + expectedStart:[0, 536870912, 1073741824, 1610612736, 2147483648, 2684354560, + 3221225472, 3758096384, 4294967296, 4831838208], + expectedEnd:[536870911, 1073741823, 1610612735, 2147483647, 2684354559, 3221225471, + 3758096383, 4294967295, 4831838207, 5368709119] }, // 2 part splits - { - size: OBJ_SIZES.gb5p1, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [ - 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, - ], - expectedEnd: [ - 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, - 5368709120, - ], + {size:OBJ_SIZES.gb5p1, sourceConfig:new CopySourceOptions({Start: -1}), + expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, + 3221225473, 3758096385, 4294967297, 4831838209], + expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, + 3758096384, 4294967296, 4831838208, 5368709120], }, - { - size: OBJ_SIZES.gb5p1, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [ - 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, - ], - expectedEnd: [ - 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, - 5368709120, - ], + {size:OBJ_SIZES.gb5p1, sourceConfig:new CopySourceOptions({Start: -1}), + expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, + 3221225473, 3758096385, 4294967297, 4831838209], + expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, + 3758096384, 4294967296, 4831838208, 5368709120], }, // 3 part splits - { - size: OBJ_SIZES.gb10p1, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [ - 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, - 5368709121, 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, 8589934593, 9126805505, 9663676417, - 10200547329, - ], - expectedEnd: [ - 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, - 5368709120, 5905580032, 6442450944, 6979321856, 7516192768, 8053063680, 8589934592, 9126805504, 9663676416, - 10200547328, 10737418240, - ], - }, - { - size: OBJ_SIZES.gb10p2, - sourceConfig: new CopySourceOptions({ Start: -1 }), - expectedStart: [ - 0, 536870913, 1073741826, 1610612738, 2147483650, 2684354562, 3221225474, 3758096386, 4294967298, 4831838210, - 5368709122, 5905580034, 6442450946, 6979321858, 7516192770, 8053063682, 8589934594, 9126805506, 9663676418, - 10200547330, - ], - expectedEnd: [ - 536870912, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, - 5368709121, 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, 8589934593, 9126805505, 9663676417, - 10200547329, 10737418241, - ], + {size:OBJ_SIZES.gb10p1,sourceConfig:new CopySourceOptions({Start: -1}), + expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, + 3221225473, 3758096385, 4294967297, 4831838209, 5368709121, + 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, + 8589934593, 9126805505, 9663676417, 10200547329], + expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, + 3221225472, 3758096384, 4294967296, 4831838208, 5368709120, + 5905580032, 6442450944, 6979321856, 7516192768, 8053063680, + 8589934592, 9126805504, 9663676416, 10200547328, 10737418240], }, + {size:OBJ_SIZES.gb10p2,sourceConfig:new CopySourceOptions({Start: -1}), + expectedStart:[0, 536870913, 1073741826, 1610612738, 2147483650, 2684354562, + 3221225474, 3758096386, 4294967298, 4831838210, 5368709122, + 5905580034, 6442450946, 6979321858, 7516192770, 8053063682, + 8589934594, 9126805506, 9663676418, 10200547330], + expectedEnd:[536870912, 1073741825, 1610612737, 2147483649, 2684354561, + 3221225473, 3758096385, 4294967297, 4831838209, 5368709121, + 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, + 8589934593, 9126805505, 9663676417, 10200547329, 10737418241] + } ] - expectedSplitsTestCases.forEach((testCase) => { + + expectedSplitsTestCases.forEach((testCase)=>{ const fnResult = calculateEvenSplits(testCase.size, testCase) - const { startIndex, endIndex } = fnResult || {} + const { + startIndex, + endIndex + } = fnResult ||{} - if (isArray(startIndex) && isArray(endIndex)) { - const isExpectedResult = - startIndex.length === testCase.expectedStart.length && endIndex.length === testCase.expectedEnd.length + if(isArray(startIndex) && isArray(endIndex)) { + const isExpectedResult = (startIndex.length === testCase.expectedStart.length) && (endIndex.length === testCase.expectedEnd.length) assert.equal(isExpectedResult, true) - } else { - // null cases. + } else{ // null cases. assert.equal(startIndex, expectedSplitsTestCases.expectedStart) assert.equal(endIndex, expectedSplitsTestCases.expectedEnd) } }) + }) + }) describe('CopyConditions', () => { @@ -230,7 +204,7 @@ describe('CopyConditions', () => { }) }) -describe('Client', function () { +describe('Client', function() { var nockRequests = [] this.timeout(5000) beforeEach(() => { @@ -238,7 +212,7 @@ describe('Client', function () { nockRequests = [] }) afterEach(() => { - nockRequests.forEach((element) => { + nockRequests.forEach(element => { if (!element.request.isDone()) { element.request.done() } @@ -249,14 +223,14 @@ describe('Client', function () { port: 9000, accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false, + useSSL: false }) describe('new client', () => { it('should work with https', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) assert.equal(client.port, 443) }) @@ -266,7 +240,7 @@ describe('Client', function () { port: 9000, accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false, + useSSL: false }) assert.equal(client.port, 9000) }) @@ -275,7 +249,7 @@ describe('Client', function () { endPoint: 'localhost', accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false, + useSSL: false }) assert.equal(client.port, 80) }) @@ -284,7 +258,7 @@ describe('Client', function () { endPoint: 'localhost', port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) assert.equal(client.port, 9000) }) @@ -293,7 +267,7 @@ describe('Client', function () { new Minio.Client({ endPoint: 'http://localhost:9000', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -304,7 +278,7 @@ describe('Client', function () { new Minio.Client({ endPoint: 'localhost##$@3', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -314,7 +288,7 @@ describe('Client', function () { try { new Minio.Client({ accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -326,7 +300,7 @@ describe('Client', function () { endPoint: 'localhost', port: -1, accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -339,7 +313,7 @@ describe('Client', function () { secure: false, port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -352,7 +326,7 @@ describe('Client', function () { secure: true, port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) } catch (e) { done() @@ -366,16 +340,16 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', port: 9000, - useSSL: false, + useSSL: false }) - client.presignedGetObject('bucket', 'object', 1000, function () {}) + client.presignedGetObject('bucket', 'object', 1000, function() {}) } catch (e) { done() } }) it('should not generate presigned url with wrong expires param', (done) => { try { - client.presignedGetObject('bucket', 'object', '0', function () {}) + client.presignedGetObject('bucket', 'object', '0', function() {}) } catch (e) { done() } @@ -387,16 +361,16 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', port: 9000, - useSSL: false, + useSSL: false }) - client.presignedPutObject('bucket', 'object', 1000, function () {}) + client.presignedPutObject('bucket', 'object', 1000, function() {}) } catch (e) { done() } }) it('should not generate presigned url with wrong expires param', (done) => { try { - client.presignedPutObject('bucket', 'object', '0', function () {}) + client.presignedPutObject('bucket', 'object', '0', function() {}) } catch (e) { done() } @@ -440,40 +414,37 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) - assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version}`, client.userAgent) + assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version}`, + client.userAgent) }) it('should set user agent', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo('test', '3.2.1') - assert.equal( - `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent - ) + assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, + client.userAgent) }) it('should set user agent without comments', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo('test', '3.2.1') - assert.equal( - `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent - ) + assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, + client.userAgent) }) it('should not set user agent without name', (done) => { try { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo(null, '3.2.1') } catch (e) { @@ -485,7 +456,7 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo('', '3.2.1') } catch (e) { @@ -497,7 +468,7 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo('test', null) } catch (e) { @@ -509,7 +480,7 @@ describe('Client', function () { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey', + secretKey: 'secretkey' }) client.setAppInfo('test', '') } catch (e) { @@ -522,35 +493,35 @@ describe('Client', function () { describe('#getObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObject(null, 'hello', function () {}) + client.getObject(null, 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObject('', 'hello', function () {}) + client.getObject('', 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObject(' \n \t ', 'hello', function () {}) + client.getObject(' \n \t ', 'hello', function() {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.getObject('hello', null, function () {}) + client.getObject('hello', null, function() {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.getObject('hello', '', function () {}) + client.getObject('hello', '', function() {}) } catch (e) { done() } @@ -561,7 +532,7 @@ describe('Client', function () { describe('with small objects using single put', () => { it('should fail when data is smaller than specified', (done) => { var s = new Stream.Readable() - s._read = function () {} + s._read = function() {} s.push('hello world') s.push(null) client.putObject('bucket', 'object', s, 12, '', (e) => { @@ -572,7 +543,7 @@ describe('Client', function () { }) it('should fail when data is larger than specified', (done) => { var s = new Stream.Readable() - s._read = function () {} + s._read = function() {} s.push('hello world') s.push(null) client.putObject('bucket', 'object', s, 10, '', (e) => { @@ -598,35 +569,35 @@ describe('Client', function () { }) it('should fail on null bucket', (done) => { try { - client.putObject(null, 'hello', null, 1, '', function () {}) + client.putObject(null, 'hello', null, 1, '', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObject(' \n \t ', 'hello', null, 1, '', function () {}) + client.putObject(' \n \t ', 'hello', null, 1, '', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObject('', 'hello', null, 1, '', function () {}) + client.putObject('', 'hello', null, 1, '', function() {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.putObject('hello', null, null, 1, '', function () {}) + client.putObject('hello', null, null, 1, '', function() {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObject('hello', '', null, 1, '', function () {}) + client.putObject('hello', '', null, 1, '', function() {}) } catch (e) { done() } @@ -637,11 +608,7 @@ describe('Client', function () { describe('#removeAllBucketNotification()', () => { it('should error on invalid arguments', () => { assert.throws(() => { - client.removeAllBucketNotification( - 'ab', - () => {}, - function () {} - ) + client.removeAllBucketNotification('ab', () => {}, function() {}) }, /Invalid bucket name/) }) }) @@ -685,35 +652,35 @@ describe('Client', function () { describe('#statObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.statObject(null, 'hello', function () {}) + client.statObject(null, 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.statObject('', 'hello', function () {}) + client.statObject('', 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.statObject(' \n \t ', 'hello', function () {}) + client.statObject(' \n \t ', 'hello', function() {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.statObject('hello', null, function () {}) + client.statObject('hello', null, function() {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.statObject('hello', '', function () {}) + client.statObject('hello', '', function() {}) } catch (e) { done() } @@ -721,59 +688,60 @@ describe('Client', function () { it('should fail on incompatible argument type (number) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', 1, function () {}) + client.statObject('hello', 'testStatOpts', 1, function() {}) } catch (e) { done() } }) it('should fail on incompatible argument type (null) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', null, function () {}) + client.statObject('hello', 'testStatOpts', null, function() {}) } catch (e) { done() } }) it('should fail on incompatible argument type (sting) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', ' ', function () {}) + client.statObject('hello', 'testStatOpts', ' ', function() {}) } catch (e) { done() } }) + }) describe('#removeObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeObject(null, 'hello', function () {}) + client.removeObject(null, 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObject('', 'hello', function () {}) + client.removeObject('', 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObject(' \n \t ', 'hello', function () {}) + client.removeObject(' \n \t ', 'hello', function() {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.removeObject('hello', null, function () {}) + client.removeObject('hello', null, function() {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.removeObject('hello', '', function () {}) + client.removeObject('hello', '', function() {}) } catch (e) { done() } @@ -781,15 +749,15 @@ describe('Client', function () { // Versioning related options as removeOpts it('should fail on empty (null) removeOpts object', (done) => { try { - client.removeObject('hello', 'testRemoveOpts', null, function () {}) + client.removeObject('hello', 'testRemoveOpts',null, function() {}) } catch (e) { done() } }) - + it('should fail on empty (string) removeOpts', (done) => { try { - client.removeObject('hello', 'testRemoveOpts', '', function () {}) + client.removeObject('hello', 'testRemoveOpts','', function() {}) } catch (e) { done() } @@ -799,35 +767,35 @@ describe('Client', function () { describe('#removeIncompleteUpload(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeIncompleteUpload(null, 'hello', function () {}) + client.removeIncompleteUpload(null, 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeIncompleteUpload('', 'hello', function () {}) + client.removeIncompleteUpload('', 'hello', function() {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeIncompleteUpload(' \n \t ', 'hello', function () {}) + client.removeIncompleteUpload(' \n \t ', 'hello', function() {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.removeIncompleteUpload('hello', null, function () {}) + client.removeIncompleteUpload('hello', null, function() {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.removeIncompleteUpload('hello', '', function () {}) + client.removeIncompleteUpload('hello', '', function() {}) } catch (e) { done() } @@ -835,18 +803,20 @@ describe('Client', function () { }) }) - describe('Bucket Versioning APIs', () => { + describe('Bucket Versioning APIs', ()=>{ describe('getBucketVersioning(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketVersioning(null, function () {}) + client.getBucketVersioning(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketVersioning('', function () {}) + client.getBucketVersioning('', function () { + }) } catch (e) { done() } @@ -856,14 +826,16 @@ describe('Client', function () { describe('setBucketVersioning(bucket, versionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketVersioning(null, {}, function () {}) + client.setBucketVersioning(null, {},function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketVersioning('', {}, function () {}) + client.setBucketVersioning('', {},function () { + }) } catch (e) { done() } @@ -871,7 +843,8 @@ describe('Client', function () { it('should fail on empty versionConfig', (done) => { try { - client.setBucketVersioning('', null, function () {}) + client.setBucketVersioning('', null,function () { + }) } catch (e) { done() } @@ -879,75 +852,88 @@ describe('Client', function () { }) }) + describe('Bucket and Object Tags APIs', () => { describe('Set Bucket Tags ', () => { it('should fail on null bucket', (done) => { try { - client.setBucketTagging(null, {}, function () {}) + client.setBucketTagging(null, {}, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketTagging('', {}, function () {}) + client.setBucketTagging('', {}, function () { + }) } catch (e) { done() } }) it('should fail if tags are more than 50', (done) => { - const _50_plus_key_tags = {} - for (let i = 0; i < 51; i += 1) { - _50_plus_key_tags[i] = i + const _50_plus_key_tags={} + for(let i=0;i<51;i+=1){ + _50_plus_key_tags[i]=i } try { - client.setBucketTagging('', _50_plus_key_tags, function () {}) + client.setBucketTagging('', _50_plus_key_tags, function () { + }) } catch (e) { done() } }) + }) describe('Get Bucket Tags', () => { it('should fail on invalid bucket', (done) => { try { - client.getBucketTagging('nv', null, function () {}) + client.getBucketTagging('nv',null, function () { + }) } catch (e) { done() } }) it('should fail on null bucket', (done) => { try { - client.getBucketTagging(null, function () {}) + client.getBucketTagging(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketTagging('', function () {}) + client.getBucketTagging('', function () { + }) } catch (e) { done() } }) + + }) describe('Remove Bucket Tags', () => { it('should fail on null object', (done) => { try { - client.removeBucketTagging(null, function () {}) + client.removeBucketTagging(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketTagging('', function () {}) + client.removeBucketTagging('', function () { + }) } catch (e) { done() } }) it('should fail on invalid bucket name', (done) => { try { - client.removeBucketTagging('198.51.100.24', function () {}) + client.removeBucketTagging('198.51.100.24', function () { + }) } catch (e) { done() } @@ -955,7 +941,8 @@ describe('Client', function () { it('should fail on invalid bucket name', (done) => { try { - client.removeBucketTagging('xy', function () {}) + client.removeBucketTagging('xy', function () { + }) } catch (e) { done() } @@ -964,78 +951,91 @@ describe('Client', function () { describe('Put Object Tags', () => { it('should fail on null object', (done) => { try { - client.putObjectTagging('my-bucket-name', null, {}, function () {}) + client.putObjectTagging('my-bucket-name',null, {}, function () { + }) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObjectTagging('my-bucket-name', null, {}, function () {}) + client.putObjectTagging('my-bucket-name',null, {}, function () { + }) } catch (e) { done() } }) it('should fail on non object tags', (done) => { try { - client.putObjectTagging('my-bucket-name', null, 'non-obj-tag', function () {}) + client.putObjectTagging('my-bucket-name',null, 'non-obj-tag', function () { + }) } catch (e) { done() } }) it('should fail if tags are more than 50 on an object', (done) => { - const _50_plus_key_tags = {} - for (let i = 0; i < 51; i += 1) { - _50_plus_key_tags[i] = i + const _50_plus_key_tags={} + for(let i=0;i<51;i+=1){ + _50_plus_key_tags[i]=i } try { - client.putObjectTagging('my-bucket-name', null, _50_plus_key_tags, function () {}) + client.putObjectTagging('my-bucket-name',null, _50_plus_key_tags, function () { + }) } catch (e) { done() } }) + }) describe('Get Object Tags', () => { it('should fail on invalid bucket', (done) => { try { - client.getObjectTagging('nv', null, function () {}) + client.getObjectTagging('nv',null, function () { + }) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.getObjectTagging('my-bucket-name', null, function () {}) + client.getObjectTagging('my-bucket-name',null, function () { + }) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.getObjectTagging('my-bucket-name', null, function () {}) + client.getObjectTagging('my-bucket-name',null, function () { + }) } catch (e) { done() } }) + + }) describe('Remove Object Tags', () => { it('should fail on null object', (done) => { try { - client.removeObjectTagging('my-bucket', null, function () {}) + client.removeObjectTagging('my-bucket',null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObjectTagging('my-bucket', '', function () {}) + client.removeObjectTagging('my-bucket', '', function () { + }) } catch (e) { done() } }) it('should fail on invalid bucket name', (done) => { try { - client.removeObjectTagging('198.51.100.24', function () {}) + client.removeObjectTagging('198.51.100.24', function () { + }) } catch (e) { done() } @@ -1043,7 +1043,8 @@ describe('Client', function () { it('should fail on invalid bucket name', (done) => { try { - client.removeObjectTagging('xy', function () {}) + client.removeObjectTagging('xy', function () { + }) } catch (e) { done() } @@ -1051,10 +1052,12 @@ describe('Client', function () { }) }) + describe('setBucketLifecycle(bucket, lifecycleConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketLifecycle(null, null, function () {}) + client.setBucketLifecycle(null, null,function () { + }) } catch (e) { done() } @@ -1062,17 +1065,20 @@ describe('Client', function () { it('should fail on empty bucket', (done) => { try { - client.setBucketLifecycle('', null, function () {}) + client.setBucketLifecycle('', null,function () { + }) } catch (e) { done() } }) + }) describe('getBucketLifecycle(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketLifecycle(null, function () {}) + client.getBucketLifecycle(null, function () { + }) } catch (e) { done() } @@ -1080,16 +1086,19 @@ describe('Client', function () { it('should fail on empty bucket', (done) => { try { - client.getBucketLifecycle('', function () {}) + client.getBucketLifecycle('', function () { + }) } catch (e) { done() } }) + }) describe('removeBucketLifecycle(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketLifecycle(null, null, function () {}) + client.removeBucketLifecycle(null, null,function () { + }) } catch (e) { done() } @@ -1097,25 +1106,29 @@ describe('Client', function () { it('should fail on empty bucket', (done) => { try { - client.removeBucketLifecycle('', null, function () {}) + client.removeBucketLifecycle('', null,function () { + }) } catch (e) { done() } }) + }) - describe('Object Locking APIs', () => { + describe('Object Locking APIs', ()=> { describe('getObjectLockConfig(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectLockConfig(null, function () {}) + client.getObjectLockConfig(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectLockConfig('', function () {}) + client.getObjectLockConfig('', function () { + }) } catch (e) { done() } @@ -1125,50 +1138,48 @@ describe('Client', function () { describe('setObjectLockConfig(bucket, lockConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setObjectLockConfig(null, function () {}) + client.setObjectLockConfig(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setObjectLockConfig('', function () {}) + client.setObjectLockConfig('', function () { + }) } catch (e) { done() } }) it('should fail on passing invalid mode ', (done) => { try { - client.setObjectLockConfig('my-bucket', { mode: 'invalid_mode' }, function () {}) + client.setObjectLockConfig('my-bucket',{mode:"invalid_mode"}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid unit ', (done) => { try { - client.setObjectLockConfig('my-bucket', { mode: 'COMPLIANCE', unit: 'invalid_unit' }, function () {}) + client.setObjectLockConfig('my-bucket',{ mode:"COMPLIANCE",unit:"invalid_unit"}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid validity ', (done) => { try { - client.setObjectLockConfig( - 'my-bucket', - { mode: 'COMPLIANCE', unit: 'invalid_unit', validity: '' }, - function () {} - ) + client.setObjectLockConfig('my-bucket',{mode:"COMPLIANCE",unit:"invalid_unit", validity:''}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid config ', (done) => { try { - client.setObjectLockConfig( - 'my-bucket', - { mode: 'COMPLIANCE', randomProp: true, nonExisting: false }, - function () {} - ) + client.setObjectLockConfig('my-bucket',{mode:"COMPLIANCE", randomProp:true, nonExisting:false,}, function () { + }) } catch (e) { done() } @@ -1176,32 +1187,36 @@ describe('Client', function () { }) }) - describe('Object retention APIs', () => { + describe('Object retention APIs', ()=> { describe('getObjectRetention(bucket, objectName, getRetentionOpts,callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectRetention(null, '', '', function () {}) + client.getObjectRetention(null,'','', function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectRetention('', '', '', function () {}) + client.getObjectRetention('', '','',function () { + }) } catch (e) { done() } }) it('should fail on invalid object name', (done) => { try { - client.getObjectRetention('my-bucket', null, '', function () {}) + client.getObjectRetention('my-bucket', null, '',function () { + }) } catch (e) { done() } }) it('should fail on invalid versionId', (done) => { try { - client.getObjectRetention('my-bucket', 'objectname', { versionId: 123 }, function () {}) + client.getObjectRetention('my-bucket', 'objectname', {versionId:123},function () { + }) } catch (e) { done() } @@ -1211,14 +1226,16 @@ describe('Client', function () { describe('putObjectRetention(bucket, objectName, retentionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.putObjectRetention(null, '', {}, function () {}) + client.putObjectRetention(null,'',{}, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObjectRetention('', '', {}, function () {}) + client.putObjectRetention('','',{}, function () { + }) } catch (e) { done() } @@ -1226,42 +1243,48 @@ describe('Client', function () { it('should fail on null object', (done) => { try { - client.putObjectRetention('my-bucket', null, {}, function () {}) + client.putObjectRetention('my-bucket',null,{}, function () { + }) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObjectRetention('my-bucket', '', {}, function () {}) + client.putObjectRetention('my-bucket', '', {}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid mode ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', { mode: 'invalid_mode' }, function () {}) + client.putObjectRetention('my-bucket', 'my-object', {mode:"invalid_mode"}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid governanceBypass ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', { governanceBypass: 'nonbool' }, function () {}) + client.putObjectRetention('my-bucket', 'my-object', { governanceBypass:"nonbool"}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid (null) retainUntilDate ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', { retainUntilDate: 12345 }, function () {}) + client.putObjectRetention('my-bucket', 'my-object', { retainUntilDate:12345}, function () { + }) } catch (e) { done() } }) it('should fail on passing invalid versionId ', (done) => { try { - client.putObjectRetention('my-bucket', { versionId: 'COMPLIANCE' }, function () {}) + client.putObjectRetention('my-bucket',{ versionId:"COMPLIANCE" }, function () { + }) } catch (e) { done() } @@ -1269,60 +1292,65 @@ describe('Client', function () { }) }) - describe('Bucket Encryption APIs', () => { + + describe('Bucket Encryption APIs', ()=> { + describe('setBucketEncryption(bucket, encryptionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketEncryption(null, function () {}) + client.setBucketEncryption(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketEncryption('', function () {}) + client.setBucketEncryption('', function () { + }) } catch (e) { done() } }) it('should fail on multiple rules', (done) => { try { - client.setBucketEncryption( - 'my-bucket', - { - // Default Rule - Rule: [ - { - ApplyServerSideEncryptionByDefault: { - SSEAlgorithm: 'AES256', - }, - }, - { - ApplyServerSideEncryptionByDefault: { - SSEAlgorithm: 'AES256', - }, - }, - ], - }, - function () {} - ) + client.setBucketEncryption('my-bucket', { + // Default Rule + Rule:[ + { + ApplyServerSideEncryptionByDefault: { + SSEAlgorithm:"AES256" + } + }, + { + ApplyServerSideEncryptionByDefault: { + SSEAlgorithm:"AES256" + } + } + ] + + },function () { + }) } catch (e) { done() } }) + }) describe('getBucketEncryption(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketEncryption(null, function () {}) + client.getBucketEncryption(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketEncryption('', function () {}) + client.getBucketEncryption('', function () { + }) } catch (e) { done() } @@ -1332,32 +1360,37 @@ describe('Client', function () { describe('removeBucketEncryption(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketEncryption(null, function () {}) + client.removeBucketEncryption(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketEncryption('', function () {}) + client.removeBucketEncryption('', function () { + }) } catch (e) { done() } }) }) + }) - describe('Bucket Replication APIs', () => { + describe('Bucket Replication APIs', ()=> { describe('setBucketReplication(bucketName, replicationConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketReplication(null, {}, function () {}) + client.setBucketReplication(null, {}, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketReplication('', {}, function () {}) + client.setBucketReplication('', {}, function () { + }) } catch (e) { done() } @@ -1365,7 +1398,8 @@ describe('Client', function () { it('should fail on empty replicationConfig', (done) => { try { - client.setBucketReplication('my-bucket', {}, function () {}) + client.setBucketReplication('my-bucket', {}, function () { + }) } catch (e) { done() } @@ -1373,7 +1407,8 @@ describe('Client', function () { it('should fail on empty replicationConfig role', (done) => { try { - client.setBucketReplication('my-bucket', { role: '' }, function () {}) + client.setBucketReplication('my-bucket', {role:''}, function () { + }) } catch (e) { done() } @@ -1381,7 +1416,8 @@ describe('Client', function () { it('should fail on invalid value for replicationConfig role', (done) => { try { - client.setBucketReplication('my-bucket', { role: 12 }, function () {}) + client.setBucketReplication('my-bucket', {role:12}, function () { + }) } catch (e) { done() } @@ -1389,31 +1425,36 @@ describe('Client', function () { it('should fail on empty value for replicationConfig rules', (done) => { try { - client.setBucketReplication('my-bucket', { role: 'arn:', rules: [] }, function () {}) + client.setBucketReplication('my-bucket', {role:"arn:",rules:[]}, function () { + }) } catch (e) { done() } }) it('should fail on null value for replicationConfig rules', (done) => { try { - client.setBucketReplication('my-bucket', { role: 'arn:', rules: null }, function () {}) + client.setBucketReplication('my-bucket', {role:"arn:",rules:null}, function () { + }) } catch (e) { done() } }) + }) describe('getBucketReplication(bucketName, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketReplication(null, {}, function () {}) + client.getBucketReplication(null, {}, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketReplication('', {}, function () {}) + client.getBucketReplication('', {},function () { + }) } catch (e) { done() } @@ -1423,14 +1464,16 @@ describe('Client', function () { describe('removeBucketReplication(bucketName, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketReplication(null, {}, function () {}) + client.removeBucketReplication(null, {}, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketReplication('', {}, function () {}) + client.removeBucketReplication('', {},function () { + }) } catch (e) { done() } @@ -1438,18 +1481,21 @@ describe('Client', function () { }) }) - describe('Object Legal Hold APIs', () => { + + describe('Object Legal Hold APIs', ()=> { describe('getObjectLegalHold(bucketName, objectName, getOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectLegalHold(null, function () {}) + client.getObjectLegalHold(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectLegalHold('', function () {}) + client.getObjectLegalHold('', function () { + }) } catch (e) { done() } @@ -1457,14 +1503,16 @@ describe('Client', function () { it('should fail on null objectName', (done) => { try { - client.getObjectLegalHold('my-bucket', null, function () {}) + client.getObjectLegalHold('my-bucket', null, function () { + }) } catch (e) { done() } }) it('should fail on null getOpts', (done) => { try { - client.getObjectLegalHold('my-bucker', 'my-object', null, function () {}) + client.getObjectLegalHold('my-bucker', 'my-object', null, function () { + }) } catch (e) { done() } @@ -1474,14 +1522,16 @@ describe('Client', function () { describe('setObjectLegalHold(bucketName, objectName, setOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.setObjectLegalHold(null, function () {}) + client.setObjectLegalHold(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setObjectLegalHold('', function () {}) + client.setObjectLegalHold('', function () { + }) } catch (e) { done() } @@ -1489,21 +1539,24 @@ describe('Client', function () { it('should fail on null objectName', (done) => { try { - client.setObjectLegalHold('my-bucket', null, function () {}) + client.setObjectLegalHold('my-bucket', null, function () { + }) } catch (e) { done() } }) it('should fail on null setOpts', (done) => { try { - client.setObjectLegalHold('my-bucker', 'my-object', null, function () {}) + client.setObjectLegalHold('my-bucker', 'my-object', null, function () { + }) } catch (e) { done() } }) it('should fail on empty versionId', (done) => { try { - client.setObjectLegalHold('my-bucker', 'my-object', {}, function () {}) + client.setObjectLegalHold('my-bucker', 'my-object', {}, function () { + }) } catch (e) { done() } @@ -1511,11 +1564,12 @@ describe('Client', function () { }) }) - describe('Compose Object APIs', () => { + describe('Compose Object APIs', ()=> { describe('composeObject(destObjConfig, sourceObjectList,cb)', () => { it('should fail on null destination config', (done) => { try { - client.composeObject(null, function () {}) + client.composeObject(null, function () { + }) } catch (e) { done() } @@ -1523,8 +1577,9 @@ describe('Client', function () { it('should fail on no array source config', (done) => { try { - const destOptions = new CopyDestinationOptions({ Bucket: 'test-bucket', Object: 'test-object' }) - client.composeObject(destOptions, 'non-array', function () {}) + const destOptions = new CopyDestinationOptions({Bucket:'test-bucket', Object:'test-object'}) + client.composeObject(destOptions, 'non-array', function () { + }) } catch (e) { done() } @@ -1532,26 +1587,30 @@ describe('Client', function () { it('should fail on null source config', (done) => { try { - const destOptions = new CopyDestinationOptions({ Bucket: 'test-bucket', Object: 'test-object' }) - client.composeObject(destOptions, null, function () {}) + const destOptions = new CopyDestinationOptions({Bucket:'test-bucket', Object:'test-object'}) + client.composeObject(destOptions, null, function () { + }) } catch (e) { done() } }) + }) }) - describe('Select Object Content APIs', () => { + describe('Select Object Content APIs', ()=> { describe('selectObjectContent(bucketName, objectName, selectOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.selectObjectContent(null, function () {}) + client.selectObjectContent(null, function () { + }) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.selectObjectContent('', function () {}) + client.selectObjectContent('', function () { + }) } catch (e) { done() } @@ -1559,550 +1618,546 @@ describe('Client', function () { it('should fail on empty object', (done) => { try { - client.selectObjectContent('my-bucket', '', function () {}) + client.selectObjectContent('my-bucket','', function () { + }) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.selectObjectContent('my-bucket', null, function () {}) + client.selectObjectContent('my-bucket',null, function () { + }) } catch (e) { done() } }) + }) }) + }) -describe('IP Address Validations', () => { + +describe('IP Address Validations', ()=>{ + it('should validate for valid ip', () => { assert.equal(isValidIP('1.1.1.1'), true) }) - + it('Check list of IPV4 Invalid addresses', () => { - const invalidIpv4 = [ - ' 127.0.0.1', - '127.0.0.1 ', - '127.0.0.1 127.0.0.1', - '127.0.0.256', - '127.0.0.1//1', - '127.0.0.1/0x1', - '127.0.0.1/-1', - '127.0.0.1/ab', - '127.0.0.1/', - '127.0.0.256/32', - '127.0.0.1/33', - ] - invalidIpv4.map((ip) => { + const invalidIpv4 = [' 127.0.0.1', '127.0.0.1 ', '127.0.0.1 127.0.0.1', '127.0.0.256', '127.0.0.1//1', '127.0.0.1/0x1', '127.0.0.1/-1', '127.0.0.1/ab', '127.0.0.1/', '127.0.0.256/32', '127.0.0.1/33'] + invalidIpv4.map(ip=>{ assert.equal(isValidIP(ip), false) }) }) it('Check list of IPV4 Valid addresses', () => { - const validIpv4 = ['001.002.003.004', '127.0.0.1', '255.255.255.255', '192.168.1.10'] - validIpv4.map((ip) => { + const validIpv4 =['001.002.003.004', '127.0.0.1', '255.255.255.255','192.168.1.10'] + validIpv4.map(ip=>{ assert.equal(isValidIP(ip), true) }) + }) it('Check list of IPV6 Invalid addresses', () => { - const invalidIpV6 = [ + const invalidIpV6 =[ "':10.0.0.1", - '-1', - '::1 ::1', - '1.2.3.4:1111:2222:3333:4444::5555', - '1.2.3.4:1111:2222:3333::5555', - '1.2.3.4:1111:2222::5555', - '1.2.3.4:1111::5555', - '1.2.3.4::', - '1.2.3.4::5555', - '11112222:3333:4444:5555:6666:1.2.3.4', - '11112222:3333:4444:5555:6666:7777:8888', - '::1//64', - '::1/0001', - '1111:', - '1111:1.2.3.4', - '1111:2222', - '1111:22223333:4444:5555:6666:1.2.3.4', - '1111:22223333:4444:5555:6666:7777:8888', - '1111:2222:', - '1111:2222:1.2.3.4', - '1111:2222:3333', - '1111:2222:33334444:5555:6666:1.2.3.4', - '1111:2222:33334444:5555:6666:7777:8888', - '1111:2222:3333:', - '1111:2222:3333:1.2.3.4', - '1111:2222:3333:4444', - '1111:2222:3333:44445555:6666:1.2.3.4', - '1111:2222:3333:44445555:6666:7777:8888', - '1111:2222:3333:4444:', - '1111:2222:3333:4444:1.2.3.4', - '1111:2222:3333:4444:5555', - '1111:2222:3333:4444:55556666:1.2.3.4', - '1111:2222:3333:4444:55556666:7777:8888', - '1111:2222:3333:4444:5555:', - '1111:2222:3333:4444:5555:1.2.3.4', - '1111:2222:3333:4444:5555:6666', - '1111:2222:3333:4444:5555:66661.2.3.4', - '1111:2222:3333:4444:5555:66667777:8888', - '1111:2222:3333:4444:5555:6666:', - '1111:2222:3333:4444:5555:6666:1.2.3.4.5', - '1111:2222:3333:4444:5555:6666:255.255.255255', - '1111:2222:3333:4444:5555:6666:255.255255.255', - '1111:2222:3333:4444:5555:6666:255255.255.255', - '1111:2222:3333:4444:5555:6666:256.256.256.256', - '1111:2222:3333:4444:5555:6666:7777', - '1111:2222:3333:4444:5555:6666:77778888', - '1111:2222:3333:4444:5555:6666:7777:', - '1111:2222:3333:4444:5555:6666:7777:1.2.3.4', - '1111:2222:3333:4444:5555:6666:7777:::', - '1111:2222:3333:4444:5555:6666::8888:', - '1111:2222:3333:4444:5555:6666:::', - '1111:2222:3333:4444:5555:6666:::8888', - '1111:2222:3333:4444:5555::7777:8888:', - '1111:2222:3333:4444:5555::7777::', - '1111:2222:3333:4444:5555::8888:', - '1111:2222:3333:4444:5555:::', - '1111:2222:3333:4444:5555:::1.2.3.4', - '1111:2222:3333:4444:5555:::7777:8888', - '1111:2222:3333:4444::5555:', - '1111:2222:3333:4444::6666:7777:8888:', - '1111:2222:3333:4444::6666:7777::', - '1111:2222:3333:4444::6666::8888', - '1111:2222:3333:4444::7777:8888:', - '1111:2222:3333:4444::8888:', - '1111:2222:3333:4444:::', - '1111:2222:3333:4444:::6666:1.2.3.4', - '1111:2222:3333:4444:::6666:7777:8888', - '1111:2222:3333::5555:', - '1111:2222:3333::5555:6666:7777:8888:', - '1111:2222:3333::5555:6666:7777::', - '1111:2222:3333::5555:6666::8888', - '1111:2222:3333::5555::1.2.3.4', - '1111:2222:3333::5555::7777:8888', - '1111:2222:3333::6666:7777:8888:', - '1111:2222:3333::7777:8888:', - '1111:2222:3333::8888:', - '1111:2222:3333:::', - '1111:2222:3333:::5555:6666:1.2.3.4', - '1111:2222:3333:::5555:6666:7777:8888', - '1111:2222::4444:5555:6666:7777:8888:', - '1111:2222::4444:5555:6666:7777::', - '1111:2222::4444:5555:6666::8888', - '1111:2222::4444:5555::1.2.3.4', - '1111:2222::4444:5555::7777:8888', - '1111:2222::4444::6666:1.2.3.4', - '1111:2222::4444::6666:7777:8888', - '1111:2222::5555:', - '1111:2222::5555:6666:7777:8888:', - '1111:2222::6666:7777:8888:', - '1111:2222::7777:8888:', - '1111:2222::8888:', - '1111:2222:::', - '1111:2222:::4444:5555:6666:1.2.3.4', - '1111:2222:::4444:5555:6666:7777:8888', - '1111::3333:4444:5555:6666:7777:8888:', - '1111::3333:4444:5555:6666:7777::', - '1111::3333:4444:5555:6666::8888', - '1111::3333:4444:5555::1.2.3.4', - '1111::3333:4444:5555::7777:8888', - '1111::3333:4444::6666:1.2.3.4', - '1111::3333:4444::6666:7777:8888', - '1111::3333::5555:6666:1.2.3.4', - '1111::3333::5555:6666:7777:8888', - '1111::4444:5555:6666:7777:8888:', - '1111::5555:', - '1111::5555:6666:7777:8888:', - '1111::6666:7777:8888:', - '1111::7777:8888:', - '1111::8888:', - '1111:::', - '1111:::3333:4444:5555:6666:1.2.3.4', - '1111:::3333:4444:5555:6666:7777:8888', - '12345::6:7:8', - '124.15.6.89/60', - '1:2:3:4:5:6:7:8:9', - '1:2:3::4:5:6:7:8:9', - '1:2:3::4:5::7:8', - '1::1.2.256.4', - '1::1.2.3.256', - '1::1.2.3.300', - '1::1.2.3.900', - '1::1.2.300.4', - '1::1.2.900.4', - '1::1.256.3.4', - '1::1.300.3.4', - '1::1.900.3.4', - '1::256.2.3.4', - '1::260.2.3.4', - '1::2::3', - '1::300.2.3.4', - '1::300.300.300.300', - '1::3000.30.30.30', - '1::400.2.3.4', - '1::5:1.2.256.4', - '1::5:1.2.3.256', - '1::5:1.2.3.300', - '1::5:1.2.3.900', - '1::5:1.2.300.4', - '1::5:1.2.900.4', - '1::5:1.256.3.4', - '1::5:1.300.3.4', - '1::5:1.900.3.4', - '1::5:256.2.3.4', - '1::5:260.2.3.4', - '1::5:300.2.3.4', - '1::5:300.300.300.300', - '1::5:3000.30.30.30', - '1::5:400.2.3.4', - '1::5:900.2.3.4', - '1::900.2.3.4', - '1:::3:4:5', - '2001:0000:1234: 0000:0000:C1C0:ABCD:0876', - '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0', - '2001:1:1:1:1:1:255Z255X255Y255', - '2001::FFD3::57ab', - '2001:DB8:0:0:8:800:200C:417A:221', - '2001:db8:85a3::8a2e:37023:7334', - '2001:db8:85a3::8a2e:370k:7334', - '3ffe:0b00:0000:0001:0000:0000:000a', - '3ffe:b00::1::a', - ':', - ':1.2.3.4', - ':1111:2222:3333:4444:5555:6666:1.2.3.4', - ':1111:2222:3333:4444:5555:6666:7777:8888', - ':1111:2222:3333:4444:5555:6666:7777::', - ':1111:2222:3333:4444:5555:6666::', - ':1111:2222:3333:4444:5555:6666::8888', - ':1111:2222:3333:4444:5555::', - ':1111:2222:3333:4444:5555::1.2.3.4', - ':1111:2222:3333:4444:5555::7777:8888', - ':1111:2222:3333:4444:5555::8888', - ':1111:2222:3333:4444::', - ':1111:2222:3333:4444::1.2.3.4', - ':1111:2222:3333:4444::5555', - ':1111:2222:3333:4444::6666:1.2.3.4', - ':1111:2222:3333:4444::6666:7777:8888', - ':1111:2222:3333:4444::7777:8888', - ':1111:2222:3333:4444::8888', - ':1111:2222:3333::', - ':1111:2222:3333::1.2.3.4', - ':1111:2222:3333::5555', - ':1111:2222:3333::5555:6666:1.2.3.4', - ':1111:2222:3333::5555:6666:7777:8888', - ':1111:2222:3333::6666:1.2.3.4', - ':1111:2222:3333::6666:7777:8888', - ':1111:2222:3333::7777:8888', - ':1111:2222:3333::8888', - ':1111:2222::', - ':1111:2222::1.2.3.4', - ':1111:2222::4444:5555:6666:1.2.3.4', - ':1111:2222::4444:5555:6666:7777:8888', - ':1111:2222::5555', - ':1111:2222::5555:6666:1.2.3.4', - ':1111:2222::5555:6666:7777:8888', - ':1111:2222::6666:1.2.3.4', - ':1111:2222::6666:7777:8888', - ':1111:2222::7777:8888', - ':1111:2222::8888', - ':1111::', - ':1111::1.2.3.4', - ':1111::3333:4444:5555:6666:1.2.3.4', - ':1111::3333:4444:5555:6666:7777:8888', - ':1111::4444:5555:6666:1.2.3.4', - ':1111::4444:5555:6666:7777:8888', - ':1111::5555', - ':1111::5555:6666:1.2.3.4', - ':1111::5555:6666:7777:8888', - ':1111::6666:1.2.3.4', - ':1111::6666:7777:8888', - ':1111::7777:8888', - ':1111::8888', - ':2222:3333:4444:5555:6666:1.2.3.4', - ':2222:3333:4444:5555:6666:7777:8888', - ':3333:4444:5555:6666:1.2.3.4', - ':3333:4444:5555:6666:7777:8888', - ':4444:5555:6666:1.2.3.4', - ':4444:5555:6666:7777:8888', - ':5555:6666:1.2.3.4', - ':5555:6666:7777:8888', - ':6666:1.2.3.4', - ':6666:7777:8888', - ':7777:8888', - ':8888', - '::-1', - '::.', - '::..', - '::...', - '::...4', - '::..3.', - '::..3.4', - '::.2..', - '::.2.3.', - '::.2.3.4', - '::1...', - '::1.2..', - '::1.2.256.4', - '::1.2.3.', - '::1.2.3.256', - '::1.2.3.300', - '::1.2.3.900', - '::1.2.300.4', - '::1.2.900.4', - '::1.256.3.4', - '::1.300.3.4', - '::1.900.3.4', - '::1111:2222:3333:4444:5555:6666::', - '::2222:3333:4444:5555:6666:7777:8888:', - '::2222:3333:4444:5555:7777:8888::', - '::2222:3333:4444:5555:7777::8888', - '::2222:3333:4444:5555::1.2.3.4', - '::2222:3333:4444:5555::7777:8888', - '::2222:3333:4444::6666:1.2.3.4', - '::2222:3333:4444::6666:7777:8888', - '::2222:3333::5555:6666:1.2.3.4', - '::2222:3333::5555:6666:7777:8888', - '::2222::4444:5555:6666:1.2.3.4', - '::2222::4444:5555:6666:7777:8888', - '::256.2.3.4', - '::260.2.3.4', - '::300.2.3.4', - '::300.300.300.300', - '::3000.30.30.30', - '::3333:4444:5555:6666:7777:8888:', - '::400.2.3.4', - '::4444:5555:6666:7777:8888:', - '::5555:', - '::5555:6666:7777:8888:', - '::6666:7777:8888:', - '::7777:8888:', - '::8888:', - '::900.2.3.4', - ':::', - ':::1.2.3.4', - ':::2222:3333:4444:5555:6666:1.2.3.4', - ':::2222:3333:4444:5555:6666:7777:8888', - ':::3333:4444:5555:6666:7777:8888', - ':::4444:5555:6666:1.2.3.4', - ':::4444:5555:6666:7777:8888', - ':::5555', - ':::5555:6666:1.2.3.4', - ':::5555:6666:7777:8888', - ':::6666:1.2.3.4', - ':::6666:7777:8888', - ':::7777:8888', - ':::8888', - '::ffff:192x168.1.26', - '::ffff:2.3.4', - '::ffff:257.1.2.3', - 'FF01::101::2', - 'FF02:0000:0000:0000:0000:0000:0000:0000:0001', - 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4', - 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX', - 'a::b::c', - 'a::g', - 'a:a:a:a:a:a:a:a:a', - 'a:aaaaa::', - 'a:b', - 'a:b:c:d:e:f:g:0', - 'ffff:', - 'ffff::ffff::ffff', - 'ffgg:ffff:ffff:ffff:ffff:ffff:ffff:ffff', - 'ldkfj', - '::/129', - '1000:://32', - '::/', + "-1", + "::1 ::1", + "1.2.3.4:1111:2222:3333:4444::5555", + "1.2.3.4:1111:2222:3333::5555", + "1.2.3.4:1111:2222::5555", + "1.2.3.4:1111::5555", + "1.2.3.4::", + "1.2.3.4::5555", + "11112222:3333:4444:5555:6666:1.2.3.4", + "11112222:3333:4444:5555:6666:7777:8888", + "::1//64", + "::1/0001", + "1111:", + "1111:1.2.3.4", + "1111:2222", + "1111:22223333:4444:5555:6666:1.2.3.4", + "1111:22223333:4444:5555:6666:7777:8888", + "1111:2222:", + "1111:2222:1.2.3.4", + "1111:2222:3333", + "1111:2222:33334444:5555:6666:1.2.3.4", + "1111:2222:33334444:5555:6666:7777:8888", + "1111:2222:3333:", + "1111:2222:3333:1.2.3.4", + "1111:2222:3333:4444", + "1111:2222:3333:44445555:6666:1.2.3.4", + "1111:2222:3333:44445555:6666:7777:8888", + "1111:2222:3333:4444:", + "1111:2222:3333:4444:1.2.3.4", + "1111:2222:3333:4444:5555", + "1111:2222:3333:4444:55556666:1.2.3.4", + "1111:2222:3333:4444:55556666:7777:8888", + "1111:2222:3333:4444:5555:", + "1111:2222:3333:4444:5555:1.2.3.4", + "1111:2222:3333:4444:5555:6666", + "1111:2222:3333:4444:5555:66661.2.3.4", + "1111:2222:3333:4444:5555:66667777:8888", + "1111:2222:3333:4444:5555:6666:", + "1111:2222:3333:4444:5555:6666:1.2.3.4.5", + "1111:2222:3333:4444:5555:6666:255.255.255255", + "1111:2222:3333:4444:5555:6666:255.255255.255", + "1111:2222:3333:4444:5555:6666:255255.255.255", + "1111:2222:3333:4444:5555:6666:256.256.256.256", + "1111:2222:3333:4444:5555:6666:7777", + "1111:2222:3333:4444:5555:6666:77778888", + "1111:2222:3333:4444:5555:6666:7777:", + "1111:2222:3333:4444:5555:6666:7777:1.2.3.4", + "1111:2222:3333:4444:5555:6666:7777:::", + "1111:2222:3333:4444:5555:6666::8888:", + "1111:2222:3333:4444:5555:6666:::", + "1111:2222:3333:4444:5555:6666:::8888", + "1111:2222:3333:4444:5555::7777:8888:", + "1111:2222:3333:4444:5555::7777::", + "1111:2222:3333:4444:5555::8888:", + "1111:2222:3333:4444:5555:::", + "1111:2222:3333:4444:5555:::1.2.3.4", + "1111:2222:3333:4444:5555:::7777:8888", + "1111:2222:3333:4444::5555:", + "1111:2222:3333:4444::6666:7777:8888:", + "1111:2222:3333:4444::6666:7777::", + "1111:2222:3333:4444::6666::8888", + "1111:2222:3333:4444::7777:8888:", + "1111:2222:3333:4444::8888:", + "1111:2222:3333:4444:::", + "1111:2222:3333:4444:::6666:1.2.3.4", + "1111:2222:3333:4444:::6666:7777:8888", + "1111:2222:3333::5555:", + "1111:2222:3333::5555:6666:7777:8888:", + "1111:2222:3333::5555:6666:7777::", + "1111:2222:3333::5555:6666::8888", + "1111:2222:3333::5555::1.2.3.4", + "1111:2222:3333::5555::7777:8888", + "1111:2222:3333::6666:7777:8888:", + "1111:2222:3333::7777:8888:", + "1111:2222:3333::8888:", + "1111:2222:3333:::", + "1111:2222:3333:::5555:6666:1.2.3.4", + "1111:2222:3333:::5555:6666:7777:8888", + "1111:2222::4444:5555:6666:7777:8888:", + "1111:2222::4444:5555:6666:7777::", + "1111:2222::4444:5555:6666::8888", + "1111:2222::4444:5555::1.2.3.4", + "1111:2222::4444:5555::7777:8888", + "1111:2222::4444::6666:1.2.3.4", + "1111:2222::4444::6666:7777:8888", + "1111:2222::5555:", + "1111:2222::5555:6666:7777:8888:", + "1111:2222::6666:7777:8888:", + "1111:2222::7777:8888:", + "1111:2222::8888:", + "1111:2222:::", + "1111:2222:::4444:5555:6666:1.2.3.4", + "1111:2222:::4444:5555:6666:7777:8888", + "1111::3333:4444:5555:6666:7777:8888:", + "1111::3333:4444:5555:6666:7777::", + "1111::3333:4444:5555:6666::8888", + "1111::3333:4444:5555::1.2.3.4", + "1111::3333:4444:5555::7777:8888", + "1111::3333:4444::6666:1.2.3.4", + "1111::3333:4444::6666:7777:8888", + "1111::3333::5555:6666:1.2.3.4", + "1111::3333::5555:6666:7777:8888", + "1111::4444:5555:6666:7777:8888:", + "1111::5555:", + "1111::5555:6666:7777:8888:", + "1111::6666:7777:8888:", + "1111::7777:8888:", + "1111::8888:", + "1111:::", + "1111:::3333:4444:5555:6666:1.2.3.4", + "1111:::3333:4444:5555:6666:7777:8888", + "12345::6:7:8", + "124.15.6.89/60", + "1:2:3:4:5:6:7:8:9", + "1:2:3::4:5:6:7:8:9", + "1:2:3::4:5::7:8", + "1::1.2.256.4", + "1::1.2.3.256", + "1::1.2.3.300", + "1::1.2.3.900", + "1::1.2.300.4", + "1::1.2.900.4", + "1::1.256.3.4", + "1::1.300.3.4", + "1::1.900.3.4", + "1::256.2.3.4", + "1::260.2.3.4", + "1::2::3", + "1::300.2.3.4", + "1::300.300.300.300", + "1::3000.30.30.30", + "1::400.2.3.4", + "1::5:1.2.256.4", + "1::5:1.2.3.256", + "1::5:1.2.3.300", + "1::5:1.2.3.900", + "1::5:1.2.300.4", + "1::5:1.2.900.4", + "1::5:1.256.3.4", + "1::5:1.300.3.4", + "1::5:1.900.3.4", + "1::5:256.2.3.4", + "1::5:260.2.3.4", + "1::5:300.2.3.4", + "1::5:300.300.300.300", + "1::5:3000.30.30.30", + "1::5:400.2.3.4", + "1::5:900.2.3.4", + "1::900.2.3.4", + "1:::3:4:5", + "2001:0000:1234: 0000:0000:C1C0:ABCD:0876", + "2001:0000:1234:0000:0000:C1C0:ABCD:0876 0", + "2001:1:1:1:1:1:255Z255X255Y255", + "2001::FFD3::57ab", + "2001:DB8:0:0:8:800:200C:417A:221", + "2001:db8:85a3::8a2e:37023:7334", + "2001:db8:85a3::8a2e:370k:7334", + "3ffe:0b00:0000:0001:0000:0000:000a", + "3ffe:b00::1::a", + ":", + ":1.2.3.4", + ":1111:2222:3333:4444:5555:6666:1.2.3.4", + ":1111:2222:3333:4444:5555:6666:7777:8888", + ":1111:2222:3333:4444:5555:6666:7777::", + ":1111:2222:3333:4444:5555:6666::", + ":1111:2222:3333:4444:5555:6666::8888", + ":1111:2222:3333:4444:5555::", + ":1111:2222:3333:4444:5555::1.2.3.4", + ":1111:2222:3333:4444:5555::7777:8888", + ":1111:2222:3333:4444:5555::8888", + ":1111:2222:3333:4444::", + ":1111:2222:3333:4444::1.2.3.4", + ":1111:2222:3333:4444::5555", + ":1111:2222:3333:4444::6666:1.2.3.4", + ":1111:2222:3333:4444::6666:7777:8888", + ":1111:2222:3333:4444::7777:8888", + ":1111:2222:3333:4444::8888", + ":1111:2222:3333::", + ":1111:2222:3333::1.2.3.4", + ":1111:2222:3333::5555", + ":1111:2222:3333::5555:6666:1.2.3.4", + ":1111:2222:3333::5555:6666:7777:8888", + ":1111:2222:3333::6666:1.2.3.4", + ":1111:2222:3333::6666:7777:8888", + ":1111:2222:3333::7777:8888", + ":1111:2222:3333::8888", + ":1111:2222::", + ":1111:2222::1.2.3.4", + ":1111:2222::4444:5555:6666:1.2.3.4", + ":1111:2222::4444:5555:6666:7777:8888", + ":1111:2222::5555", + ":1111:2222::5555:6666:1.2.3.4", + ":1111:2222::5555:6666:7777:8888", + ":1111:2222::6666:1.2.3.4", + ":1111:2222::6666:7777:8888", + ":1111:2222::7777:8888", + ":1111:2222::8888", + ":1111::", + ":1111::1.2.3.4", + ":1111::3333:4444:5555:6666:1.2.3.4", + ":1111::3333:4444:5555:6666:7777:8888", + ":1111::4444:5555:6666:1.2.3.4", + ":1111::4444:5555:6666:7777:8888", + ":1111::5555", + ":1111::5555:6666:1.2.3.4", + ":1111::5555:6666:7777:8888", + ":1111::6666:1.2.3.4", + ":1111::6666:7777:8888", + ":1111::7777:8888", + ":1111::8888", + ":2222:3333:4444:5555:6666:1.2.3.4", + ":2222:3333:4444:5555:6666:7777:8888", + ":3333:4444:5555:6666:1.2.3.4", + ":3333:4444:5555:6666:7777:8888", + ":4444:5555:6666:1.2.3.4", + ":4444:5555:6666:7777:8888", + ":5555:6666:1.2.3.4", + ":5555:6666:7777:8888", + ":6666:1.2.3.4", + ":6666:7777:8888", + ":7777:8888", + ":8888", + "::-1", + "::.", + "::..", + "::...", + "::...4", + "::..3.", + "::..3.4", + "::.2..", + "::.2.3.", + "::.2.3.4", + "::1...", + "::1.2..", + "::1.2.256.4", + "::1.2.3.", + "::1.2.3.256", + "::1.2.3.300", + "::1.2.3.900", + "::1.2.300.4", + "::1.2.900.4", + "::1.256.3.4", + "::1.300.3.4", + "::1.900.3.4", + "::1111:2222:3333:4444:5555:6666::", + "::2222:3333:4444:5555:6666:7777:8888:", + "::2222:3333:4444:5555:7777:8888::", + "::2222:3333:4444:5555:7777::8888", + "::2222:3333:4444:5555::1.2.3.4", + "::2222:3333:4444:5555::7777:8888", + "::2222:3333:4444::6666:1.2.3.4", + "::2222:3333:4444::6666:7777:8888", + "::2222:3333::5555:6666:1.2.3.4", + "::2222:3333::5555:6666:7777:8888", + "::2222::4444:5555:6666:1.2.3.4", + "::2222::4444:5555:6666:7777:8888", + "::256.2.3.4", + "::260.2.3.4", + "::300.2.3.4", + "::300.300.300.300", + "::3000.30.30.30", + "::3333:4444:5555:6666:7777:8888:", + "::400.2.3.4", + "::4444:5555:6666:7777:8888:", + "::5555:", + "::5555:6666:7777:8888:", + "::6666:7777:8888:", + "::7777:8888:", + "::8888:", + "::900.2.3.4", + ":::", + ":::1.2.3.4", + ":::2222:3333:4444:5555:6666:1.2.3.4", + ":::2222:3333:4444:5555:6666:7777:8888", + ":::3333:4444:5555:6666:7777:8888", + ":::4444:5555:6666:1.2.3.4", + ":::4444:5555:6666:7777:8888", + ":::5555", + ":::5555:6666:1.2.3.4", + ":::5555:6666:7777:8888", + ":::6666:1.2.3.4", + ":::6666:7777:8888", + ":::7777:8888", + ":::8888", + "::ffff:192x168.1.26", + "::ffff:2.3.4", + "::ffff:257.1.2.3", + "FF01::101::2", + "FF02:0000:0000:0000:0000:0000:0000:0000:0001", + "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4", + "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX", + "a::b::c", + "a::g", + "a:a:a:a:a:a:a:a:a", + "a:aaaaa::", + "a:b", + "a:b:c:d:e:f:g:0", + "ffff:", + "ffff::ffff::ffff", + "ffgg:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "ldkfj", + "::/129", + "1000:://32", + "::/" ] - invalidIpV6.map((ip) => { - const valid = isValidIP(ip) + invalidIpV6.map(ip=>{ + const valid= isValidIP(ip) assert.equal(valid, false) }) }) it('Check list of IPV6 Valid addresses', () => { - const validIpv6 = [ - '0000:0000:0000:0000:0000:0000:0000:0000', - '0000:0000:0000:0000:0000:0000:0000:0001', - '0:0:0:0:0:0:0:0', - '0:0:0:0:0:0:0:1', - '0:0:0:0:0:0:0::', - '0:0:0:0:0:0:13.1.68.3', - '0:0:0:0:0:0::', - '0:0:0:0:0::', - '0:0:0:0:0:FFFF:129.144.52.38', - '0:0:0:0:1:0:0:0', - '0:0:0:0::', - '0:0:0::', - '0:0::', - '0:1:2:3:4:5:6:7', - '0::', - '0:a:b:c:d:e:f::', - '1080:0:0:0:8:800:200c:417a', - '1080::8:800:200c:417a', - '1111:2222:3333:4444:5555:6666:123.123.123.123', - '1111:2222:3333:4444:5555:6666:7777:8888', - '1111:2222:3333:4444:5555:6666:7777::', - '1111:2222:3333:4444:5555:6666::', - '1111:2222:3333:4444:5555:6666::8888', - '1111:2222:3333:4444:5555::', - '1111:2222:3333:4444:5555::7777:8888', - '1111:2222:3333:4444:5555::8888', - '1111:2222:3333:4444::', - '1111:2222:3333:4444::6666:123.123.123.123', - '1111:2222:3333:4444::6666:7777:8888', - '1111:2222:3333:4444::7777:8888', - '1111:2222:3333:4444::8888', - '1111:2222:3333::', - '1111:2222:3333::5555:6666:123.123.123.123', - '1111:2222:3333::5555:6666:7777:8888', - '1111:2222:3333::6666:123.123.123.123', - '1111:2222:3333::6666:7777:8888', - '1111:2222:3333::7777:8888', - '1111:2222:3333::8888', - '1111:2222::', - '1111:2222::4444:5555:6666:123.123.123.123', - '1111:2222::4444:5555:6666:7777:8888', - '1111:2222::5555:6666:123.123.123.123', - '1111:2222::5555:6666:7777:8888', - '1111:2222::6666:123.123.123.123', - '1111:2222::6666:7777:8888', - '1111:2222::7777:8888', - '1111:2222::8888', - '1111::', - '1111::3333:4444:5555:6666:123.123.123.123', - '1111::3333:4444:5555:6666:7777:8888', - '1111::4444:5555:6666:123.123.123.123', - '1111::4444:5555:6666:7777:8888', - '1111::5555:6666:123.123.123.123', - '1111::5555:6666:7777:8888', - '1111::6666:123.123.123.123', - '1111::6666:7777:8888', - '1111::7777:8888', - '1111::8888', - '1:2:3:4:5:6:1.2.3.4', - '1:2:3:4:5:6:7:8', - '1:2:3:4:5:6::', - '1:2:3:4:5:6::8', - '1:2:3:4:5::', - '1:2:3:4:5::7:8', - '1:2:3:4:5::8', - '1:2:3:4::', - '1:2:3:4::5:1.2.3.4', - '1:2:3:4::7:8', - '1:2:3:4::8', - '1:2:3::', - '1:2:3::5:1.2.3.4', - '1:2:3::7:8', - '1:2:3::8', - '1:2::', - '1:2::5:1.2.3.4', - '1:2::7:8', - '1:2::8', - '1::', - '1::2:3', - '1::2:3:4', - '1::2:3:4:5', - '1::2:3:4:5:6', - '1::2:3:4:5:6:7', - '1::5:1.2.3.4', - '1::5:11.22.33.44', - '1::7:8', - '1::8', - '2001:0000:1234:0000:0000:C1C0:ABCD:0876', - '2001:0000:4136:e378:8000:63bf:3fff:fdd2', - '2001:0db8:0000:0000:0000:0000:1428:57ab', - '2001:0db8:0000:0000:0000::1428:57ab', - '2001:0db8:0:0:0:0:1428:57ab', - '2001:0db8:0:0::1428:57ab', - '2001:0db8:1234:0000:0000:0000:0000:0000', - '2001:0db8:1234::', - '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff', - '2001:0db8:85a3:0000:0000:8a2e:0370:7334', - '2001:0db8::1428:57ab', - '2001::CE49:7601:2CAD:DFFF:7C94:FFFE', - '2001::CE49:7601:E866:EFFF:62C3:FFFE', - '2001:DB8:0:0:8:800:200C:417A', - '2001:DB8::8:800:200C:417A', - '2001:db8:85a3:0:0:8a2e:370:7334', - '2001:db8:85a3::8a2e:370:7334', - '2001:db8::', - '2001:db8::1428:57ab', - '2001:db8:a::123', - '2002::', - '2608::3:5', - '2608:af09:30:0:0:0:0:134', - '2608:af09:30::102a:7b91:c239:baff', - '2::10', - '3ffe:0b00:0000:0000:0001:0000:0000:000a', - '7:6:5:4:3:2:1:0', - '::', - '::0', - '::0:0', - '::0:0:0', - '::0:0:0:0', - '::0:0:0:0:0', - '::0:0:0:0:0:0', - '::0:0:0:0:0:0:0', - '::0:a:b:c:d:e:f', - '::1', - '::123.123.123.123', - '::13.1.68.3', - '::2222:3333:4444:5555:6666:123.123.123.123', - '::2222:3333:4444:5555:6666:7777:8888', - '::2:3', - '::2:3:4', - '::2:3:4:5', - '::2:3:4:5:6', - '::2:3:4:5:6:7', - '::2:3:4:5:6:7:8', - '::3333:4444:5555:6666:7777:8888', - '::4444:5555:6666:123.123.123.123', - '::4444:5555:6666:7777:8888', - '::5555:6666:123.123.123.123', - '::5555:6666:7777:8888', - '::6666:123.123.123.123', - '::6666:7777:8888', - '::7777:8888', - '::8', - '::8888', - '::FFFF:129.144.52.38', - '::ffff:0:0', - '::ffff:0c22:384e', - '::ffff:12.34.56.78', - '::ffff:192.0.2.128', - '::ffff:192.168.1.1', - '::ffff:192.168.1.26', - '::ffff:c000:280', - 'FF01:0:0:0:0:0:0:101', - 'FF01::101', - 'FF02:0000:0000:0000:0000:0000:0000:0001', - 'a:b:c:d:e:f:0::', - 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', - 'fe80:0:0:0:204:61ff:254.157.241.86', - 'fe80:0:0:0:204:61ff:fe9d:f156', - 'fe80::', - 'fe80::1', - 'fe80::204:61ff:254.157.241.86', - 'fe80::204:61ff:fe9d:f156', - 'fe80::217:f2ff:254.7.237.98', - 'fe80::217:f2ff:fe07:ed62', - 'fedc:ba98:7654:3210:fedc:ba98:7654:3210', - 'ff02::1', - 'ffff::', - 'ffff::3:5', - 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', - 'a:0::0:b', - 'a:0:0::0:b', - 'a:0::0:0:b', - 'a::0:0:b', - 'a::0:b', - 'a:0::b', - 'a:0:0::b', + const validIpv6 =[ + "0000:0000:0000:0000:0000:0000:0000:0000", + "0000:0000:0000:0000:0000:0000:0000:0001", + "0:0:0:0:0:0:0:0", + "0:0:0:0:0:0:0:1", + "0:0:0:0:0:0:0::", + "0:0:0:0:0:0:13.1.68.3", + "0:0:0:0:0:0::", + "0:0:0:0:0::", + "0:0:0:0:0:FFFF:129.144.52.38", + "0:0:0:0:1:0:0:0", + "0:0:0:0::", + "0:0:0::", + "0:0::", + "0:1:2:3:4:5:6:7", + "0::", + "0:a:b:c:d:e:f::", + "1080:0:0:0:8:800:200c:417a", + "1080::8:800:200c:417a", + "1111:2222:3333:4444:5555:6666:123.123.123.123", + "1111:2222:3333:4444:5555:6666:7777:8888", + "1111:2222:3333:4444:5555:6666:7777::", + "1111:2222:3333:4444:5555:6666::", + "1111:2222:3333:4444:5555:6666::8888", + "1111:2222:3333:4444:5555::", + "1111:2222:3333:4444:5555::7777:8888", + "1111:2222:3333:4444:5555::8888", + "1111:2222:3333:4444::", + "1111:2222:3333:4444::6666:123.123.123.123", + "1111:2222:3333:4444::6666:7777:8888", + "1111:2222:3333:4444::7777:8888", + "1111:2222:3333:4444::8888", + "1111:2222:3333::", + "1111:2222:3333::5555:6666:123.123.123.123", + "1111:2222:3333::5555:6666:7777:8888", + "1111:2222:3333::6666:123.123.123.123", + "1111:2222:3333::6666:7777:8888", + "1111:2222:3333::7777:8888", + "1111:2222:3333::8888", + "1111:2222::", + "1111:2222::4444:5555:6666:123.123.123.123", + "1111:2222::4444:5555:6666:7777:8888", + "1111:2222::5555:6666:123.123.123.123", + "1111:2222::5555:6666:7777:8888", + "1111:2222::6666:123.123.123.123", + "1111:2222::6666:7777:8888", + "1111:2222::7777:8888", + "1111:2222::8888", + "1111::", + "1111::3333:4444:5555:6666:123.123.123.123", + "1111::3333:4444:5555:6666:7777:8888", + "1111::4444:5555:6666:123.123.123.123", + "1111::4444:5555:6666:7777:8888", + "1111::5555:6666:123.123.123.123", + "1111::5555:6666:7777:8888", + "1111::6666:123.123.123.123", + "1111::6666:7777:8888", + "1111::7777:8888", + "1111::8888", + "1:2:3:4:5:6:1.2.3.4", + "1:2:3:4:5:6:7:8", + "1:2:3:4:5:6::", + "1:2:3:4:5:6::8", + "1:2:3:4:5::", + "1:2:3:4:5::7:8", + "1:2:3:4:5::8", + "1:2:3:4::", + "1:2:3:4::5:1.2.3.4", + "1:2:3:4::7:8", + "1:2:3:4::8", + "1:2:3::", + "1:2:3::5:1.2.3.4", + "1:2:3::7:8", + "1:2:3::8", + "1:2::", + "1:2::5:1.2.3.4", + "1:2::7:8", + "1:2::8", + "1::", + "1::2:3", + "1::2:3:4", + "1::2:3:4:5", + "1::2:3:4:5:6", + "1::2:3:4:5:6:7", + "1::5:1.2.3.4", + "1::5:11.22.33.44", + "1::7:8", + "1::8", + "2001:0000:1234:0000:0000:C1C0:ABCD:0876", + "2001:0000:4136:e378:8000:63bf:3fff:fdd2", + "2001:0db8:0000:0000:0000:0000:1428:57ab", + "2001:0db8:0000:0000:0000::1428:57ab", + "2001:0db8:0:0:0:0:1428:57ab", + "2001:0db8:0:0::1428:57ab", + "2001:0db8:1234:0000:0000:0000:0000:0000", + "2001:0db8:1234::", + "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", + "2001:0db8:85a3:0000:0000:8a2e:0370:7334", + "2001:0db8::1428:57ab", + "2001::CE49:7601:2CAD:DFFF:7C94:FFFE", + "2001::CE49:7601:E866:EFFF:62C3:FFFE", + "2001:DB8:0:0:8:800:200C:417A", + "2001:DB8::8:800:200C:417A", + "2001:db8:85a3:0:0:8a2e:370:7334", + "2001:db8:85a3::8a2e:370:7334", + "2001:db8::", + "2001:db8::1428:57ab", + "2001:db8:a::123", + "2002::", + "2608::3:5", + "2608:af09:30:0:0:0:0:134", + "2608:af09:30::102a:7b91:c239:baff", + "2::10", + "3ffe:0b00:0000:0000:0001:0000:0000:000a", + "7:6:5:4:3:2:1:0", + "::", + "::0", + "::0:0", + "::0:0:0", + "::0:0:0:0", + "::0:0:0:0:0", + "::0:0:0:0:0:0", + "::0:0:0:0:0:0:0", + "::0:a:b:c:d:e:f", + "::1", + "::123.123.123.123", + "::13.1.68.3", + "::2222:3333:4444:5555:6666:123.123.123.123", + "::2222:3333:4444:5555:6666:7777:8888", + "::2:3", + "::2:3:4", + "::2:3:4:5", + "::2:3:4:5:6", + "::2:3:4:5:6:7", + "::2:3:4:5:6:7:8", + "::3333:4444:5555:6666:7777:8888", + "::4444:5555:6666:123.123.123.123", + "::4444:5555:6666:7777:8888", + "::5555:6666:123.123.123.123", + "::5555:6666:7777:8888", + "::6666:123.123.123.123", + "::6666:7777:8888", + "::7777:8888", + "::8", + "::8888", + "::FFFF:129.144.52.38", + "::ffff:0:0", + "::ffff:0c22:384e", + "::ffff:12.34.56.78", + "::ffff:192.0.2.128", + "::ffff:192.168.1.1", + "::ffff:192.168.1.26", + "::ffff:c000:280", + "FF01:0:0:0:0:0:0:101", + "FF01::101", + "FF02:0000:0000:0000:0000:0000:0000:0001", + "a:b:c:d:e:f:0::", + "fe80:0000:0000:0000:0204:61ff:fe9d:f156", + "fe80:0:0:0:204:61ff:254.157.241.86", + "fe80:0:0:0:204:61ff:fe9d:f156", + "fe80::", + "fe80::1", + "fe80::204:61ff:254.157.241.86", + "fe80::204:61ff:fe9d:f156", + "fe80::217:f2ff:254.7.237.98", + "fe80::217:f2ff:fe07:ed62", + "fedc:ba98:7654:3210:fedc:ba98:7654:3210", + "ff02::1", + "ffff::", + "ffff::3:5", + "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", + "a:0::0:b", + "a:0:0::0:b", + "a:0::0:0:b", + "a::0:0:b", + "a::0:b", + "a:0::b", + "a:0:0::b" ] - validIpv6.map((ip) => { - const valid = isValidIP(ip) + validIpv6.map(ip=>{ + const valid= isValidIP(ip) assert.equal(valid, true) + }) }) }) From 8cdbdf7dbd9dc209f93051d88041caf22cf11ef7 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 01:14:29 +0800 Subject: [PATCH 05/23] revert unexpected change --- package.json | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/package.json b/package.json index 91006448..96972639 100644 --- a/package.json +++ b/package.json @@ -2,9 +2,7 @@ "name": "minio", "version": "7.0.34", "description": "S3 Compatible Cloud Storage client", - "source": "src/main/minio.ts", - "main": "./dist/cjs/minio.js", - "module": "dist/esm/index.js", + "main": "./dist/main/minio.js", "scripts": { "compile": "gulp compile", "test": "gulp test", From a8933082478a5bef1c4a635c11b732172f694637 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 01:16:20 +0800 Subject: [PATCH 06/23] revert unexpected change --- package-lock.json | 278 +++++++--------------------------------------- package.json | 6 +- 2 files changed, 39 insertions(+), 245 deletions(-) diff --git a/package-lock.json b/package-lock.json index 327c3572..c529216c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,6 @@ "babelify": "^10.0.0", "browserify": "^16.5.2", "chai": "^4.2.0", - "dotenv": "^16.0.3", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -57,12 +56,9 @@ "mocha-steps": "^1.1.0", "nock": "^13.2.2", "prettier": "^2.8.7", - "rollup-plugin-node-externals": "^5.1.2", "source-map-support": "^0.5.13", "split-file": "^2.2.2", - "superagent": "^8.0.9", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", + "superagent": "^5.1.0", "uuid": "^3.4.0" }, "engines": { @@ -1863,40 +1859,6 @@ "node": ">=6.9.0" } }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -2283,34 +2245,6 @@ } } }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true, - "license": "MIT" - }, "node_modules/@types/estree": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", @@ -2751,16 +2685,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -3056,13 +2980,6 @@ "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", "dev": true }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true, - "license": "MIT" - }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -3265,12 +3182,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "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", @@ -4630,13 +4541,6 @@ "sha.js": "^2.4.8" } }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true, - "license": "MIT" - }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -4934,16 +4838,6 @@ "node": ">=0.8.0" } }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -5002,15 +4896,6 @@ "npm": ">=1.2" } }, - "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", - "dev": true, - "engines": { - "node": ">=12" - } - }, "node_modules/duplexer2": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", @@ -6337,9 +6222,9 @@ "dev": true }, "node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dev": true, "dependencies": { "asynckit": "^0.4.0", @@ -6351,16 +6236,11 @@ } }, "node_modules/formidable": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.2.tgz", - "integrity": "sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==", + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", + "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", + "deprecated": "Please upgrade to latest, formidable@v2 or formidable@v3! Check these notes: https://bit.ly/2ZEqIau", "dev": true, - "dependencies": { - "dezalgo": "^1.0.4", - "hexoid": "^1.0.0", - "once": "^1.4.0", - "qs": "^6.11.0" - }, "funding": { "url": "https://ko-fi.com/tunnckoCore/commissions" } @@ -8299,15 +8179,6 @@ "he": "bin/he" } }, - "node_modules/hexoid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", - "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hmac-drbg": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", @@ -9745,13 +9616,6 @@ "es5-ext": "~0.10.2" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true, - "license": "ISC" - }, "node_modules/make-iterator": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", @@ -11325,7 +11189,6 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.0.4" }, @@ -11916,6 +11779,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "dev": true, + "optional": true, "peer": true, "bin": { "rollup": "dist/bin/rollup" @@ -11927,18 +11791,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup-plugin-node-externals": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/rollup-plugin-node-externals/-/rollup-plugin-node-externals-5.1.2.tgz", - "integrity": "sha512-M32v8yPeVT0dYOYHfd6SNyl0X1xskB15jYFlwUPzIIVpLQ200KVlilbFsoNMUho4SnQuT7Di3s/aLm79bnP48w==", - "dev": true, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.60.0 || ^3.0.0" - } - }, "node_modules/rollup/node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", @@ -12964,24 +12816,26 @@ } }, "node_modules/superagent": { - "version": "8.0.9", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-8.0.9.tgz", - "integrity": "sha512-4C7Bh5pyHTvU33KpZgwrNKh/VQnvgtCSqPRfJAUdmrtSYePVzVg4E4OzsrbkhJj9O7SO6Bnv75K/F8XVZT8YHA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", + "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, "dependencies": { "component-emitter": "^1.3.0", - "cookiejar": "^2.1.4", - "debug": "^4.3.4", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.0", - "formidable": "^2.1.2", + "cookiejar": "^2.1.2", + "debug": "^4.1.1", + "fast-safe-stringify": "^2.0.7", + "form-data": "^3.0.0", + "formidable": "^1.2.2", "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.0", - "semver": "^7.3.8" + "mime": "^2.4.6", + "qs": "^6.9.4", + "readable-stream": "^3.6.0", + "semver": "^7.3.2" }, "engines": { - "node": ">=6.4.0 <13 || >=14" + "node": ">= 7.0.0" } }, "node_modules/superagent/node_modules/lru-cache": { @@ -12997,6 +12851,20 @@ "node": ">=10" } }, + "node_modules/superagent/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/superagent/node_modules/semver": { "version": "7.3.8", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", @@ -13404,60 +13272,6 @@ "xtend": "~4.0.1" } }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/tsconfig-paths": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", @@ -13581,6 +13395,7 @@ "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13922,13 +13737,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true, - "license": "MIT" - }, "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", @@ -14427,16 +14235,6 @@ "node": ">=10" } }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 96972639..53e5c2e5 100644 --- a/package.json +++ b/package.json @@ -80,7 +80,6 @@ "babelify": "^10.0.0", "browserify": "^16.5.2", "chai": "^4.2.0", - "dotenv": "^16.0.3", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", "eslint-plugin-import": "^2.27.5", @@ -97,12 +96,9 @@ "mocha-steps": "^1.1.0", "nock": "^13.2.2", "prettier": "^2.8.7", - "rollup-plugin-node-externals": "^5.1.2", "source-map-support": "^0.5.13", "split-file": "^2.2.2", - "superagent": "^8.0.9", - "ts-node": "^10.9.1", - "typescript": "^5.0.4", + "superagent": "^5.1.0", "uuid": "^3.4.0" }, "keywords": [ From 29d17f3d8b4404e7105f148c9e9c9b12e233f2f1 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 02:55:20 +0800 Subject: [PATCH 07/23] Update package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 53e5c2e5..5bdffe9c 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "semi": false }, "lint-staged": { - "*.{js,cjs,mjs,ts,cts,mjs,json,yaml,yml}": [ + "*.{js,cjs,mjs,ts,cts,mts,json,yaml,yml}": [ "prettier --write" ], "src/**/*.{js,cjs,mjs,ts,cts,mjs}": [ From 557dc1c033aa78dec3ccd3b0b93868f44b772956 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 03:16:03 +0800 Subject: [PATCH 08/23] update rule --- .eslintrc.js | 3 +- package-lock.json | 677 ---------------------------------------------- package.json | 1 - 3 files changed, 1 insertion(+), 680 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 70f60e00..e10e14e3 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -12,7 +12,7 @@ module.exports = { 'prettier', // This should be the last entry. ], parser: '@typescript-eslint/parser', - plugins: ['@typescript-eslint', 'simple-import-sort', 'import'], + plugins: ['@typescript-eslint', 'simple-import-sort'], parserOptions: { sourceType: 'module', ecmaVersion: 8, @@ -34,7 +34,6 @@ module.exports = { 'simple-import-sort/imports': 'error', 'simple-import-sort/exports': 'error', - 'import/extensions': ['error', 'never'], indent: 'off', 'linebreak-style': ['error', 'unix'], semi: ['error', 'never'], diff --git a/package-lock.json b/package-lock.json index c529216c..93f61076 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,6 @@ "chai": "^4.2.0", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", "eslint-plugin-simple-import-sort": "^10.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", @@ -2258,12 +2257,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "node_modules/@types/lodash": { "version": "4.14.192", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz", @@ -3038,19 +3031,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", - "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "is-array-buffer": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-each": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", @@ -3060,25 +3040,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-initial": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", @@ -3146,42 +3107,6 @@ "node": ">=0.10.0" } }, - "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -5007,94 +4932,6 @@ "is-arrayish": "^0.2.1" } }, - "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.5", - "is-array-buffer": "^3.0.2", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es5-ext": { "version": "0.10.62", "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", @@ -5243,102 +5080,6 @@ "eslint": ">=7.0.0" } }, - "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - } - }, - "node_modules/eslint-import-resolver-node/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "dependencies": { - "debug": "^3.2.7" - }, - "engines": { - "node": ">=4" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } - } - }, - "node_modules/eslint-module-utils/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" - } - }, - "node_modules/eslint-plugin-import/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-simple-import-sort": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", @@ -6312,39 +6053,12 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "license": "MIT" }, - "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", "dev": true }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -6408,22 +6122,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -6830,21 +6528,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "dependencies": { - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/globby": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", @@ -7998,15 +7681,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -8029,18 +7703,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", @@ -8463,20 +8125,6 @@ "xtend": "~4.0.1" } }, - "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/interpret": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", @@ -8554,38 +8202,12 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-array-buffer": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", - "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.0", - "is-typed-array": "^1.1.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -8599,22 +8221,6 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", @@ -8668,21 +8274,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -8789,18 +8380,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", @@ -8810,21 +8389,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-path-inside": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", @@ -8860,22 +8424,6 @@ "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-relative": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", @@ -8888,18 +8436,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -8912,36 +8448,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typed-array": { "version": "1.1.10", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", @@ -9001,18 +8507,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -10609,23 +10103,6 @@ "node": ">=0.10.0" } }, - "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -11459,23 +10936,6 @@ "node": ">=0.10.0" } }, - "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", @@ -11883,20 +11343,6 @@ "ret": "~0.1.10" } }, - "node_modules/safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -12698,51 +12144,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", @@ -12756,15 +12157,6 @@ "node": ">=8" } }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", @@ -13272,30 +12664,6 @@ "xtend": "~4.0.1" } }, - "node_modules/tsconfig-paths": { - "version": "3.14.2", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", - "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", - "dev": true, - "dependencies": { - "@types/json5": "^0.0.29", - "json5": "^1.0.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - } - }, - "node_modules/tsconfig-paths/node_modules/json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "dependencies": { - "minimist": "^1.2.0" - }, - "bin": { - "json5": "lib/cli.js" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -13368,20 +12736,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", @@ -13414,21 +12768,6 @@ "umd": "bin/cli.js" } }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -13906,22 +13245,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", diff --git a/package.json b/package.json index 5bdffe9c..a386405f 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,6 @@ "chai": "^4.2.0", "eslint": "^8.37.0", "eslint-config-prettier": "^8.8.0", - "eslint-plugin-import": "^2.27.5", "eslint-plugin-simple-import-sort": "^10.0.0", "gulp": "^4.0.2", "gulp-babel": "^8.0.0", From 1ba9d0c6fbadf3b1115ca2b40766dc7748062491 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 03:41:12 +0800 Subject: [PATCH 09/23] fix lint-staged --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a386405f..e9fd70f5 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "*.{js,cjs,mjs,ts,cts,mts,json,yaml,yml}": [ "prettier --write" ], - "src/**/*.{js,cjs,mjs,ts,cts,mjs}": [ + "src/**/*.{js,cjs,mjs,ts,cts,mts}": [ "eslint --fix" ] }, From f85c21fd73b6b273169b5bddf9b55671bf72db26 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 03:42:42 +0800 Subject: [PATCH 10/23] format code --- .gitignore | 1 + .prettierignore | 1 + src/main/AssumeRoleProvider.js | 88 +- src/main/CredentialProvider.js | 17 +- src/main/Credentials.js | 38 +- src/main/extensions.js | 20 +- src/main/helpers.js | 439 +- src/main/minio.js | 1808 +++++---- src/main/notification.js | 43 +- src/main/object-uploader.js | 64 +- src/main/s3-endpoints.js | 2 +- src/main/signing.js | 44 +- src/main/transformers.js | 120 +- src/main/xml-parsers.js | 420 +- src/test/functional/functional-tests.js | 4948 +++++++++++++---------- src/test/unit/test.js | 1677 ++++---- 16 files changed, 5171 insertions(+), 4559 deletions(-) diff --git a/.gitignore b/.gitignore index a8b71b01..1676463b 100644 --- a/.gitignore +++ b/.gitignore @@ -7,5 +7,6 @@ logs # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules +/examples/ /dist/ yarn.lock diff --git a/.prettierignore b/.prettierignore index 5d446a24..a304e4f9 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,3 @@ /dist/ *.md +/examples/ diff --git a/src/main/AssumeRoleProvider.js b/src/main/AssumeRoleProvider.js index 27f95398..1f394459 100644 --- a/src/main/AssumeRoleProvider.js +++ b/src/main/AssumeRoleProvider.js @@ -1,10 +1,11 @@ import Http from 'http' import Https from 'https' -import {makeDateLong, parseXml, toSha256} from "./helpers" -import {signV4ByServiceName} from "./signing" -import CredentialProvider from "./CredentialProvider" -import Credentials from "./Credentials" -const {URLSearchParams, URL} = require('url') + +import CredentialProvider from './CredentialProvider' +import Credentials from './Credentials' +import { makeDateLong, parseXml, toSha256 } from './helpers' +import { signV4ByServiceName } from './signing' +const { URLSearchParams, URL } = require('url') class AssumeRoleProvider extends CredentialProvider { constructor({ @@ -20,7 +21,7 @@ class AssumeRoleProvider extends CredentialProvider { externalId, token, webIdentityToken, - action = "AssumeRole" + action = 'AssumeRole', }) { super({}) @@ -39,23 +40,21 @@ class AssumeRoleProvider extends CredentialProvider { this.sessionToken = sessionToken /** - * Internal Tracking variables - */ + * Internal Tracking variables + */ this.credentials = null this.expirySeconds = null this.accessExpiresAt = null - } - getRequestConfig() { const url = new URL(this.stsEndpoint) const hostValue = url.hostname const portValue = url.port - const isHttp = url.protocol.includes("http:") + const isHttp = url.protocol.includes('http:') const qryParams = new URLSearchParams() - qryParams.set("Action", this.action) - qryParams.set("Version", "2011-06-15") + qryParams.set('Action', this.action) + qryParams.set('Version', '2011-06-15') const defaultExpiry = 900 let expirySeconds = parseInt(this.durationSeconds) @@ -64,61 +63,60 @@ class AssumeRoleProvider extends CredentialProvider { } this.expirySeconds = expirySeconds // for calculating refresh of credentials. - qryParams.set("DurationSeconds", this.expirySeconds) + qryParams.set('DurationSeconds', this.expirySeconds) if (this.policy) { - qryParams.set("Policy", this.policy) + qryParams.set('Policy', this.policy) } if (this.roleArn) { - qryParams.set("RoleArn", this.roleArn) + qryParams.set('RoleArn', this.roleArn) } if (this.roleSessionName != null) { - qryParams.set("RoleSessionName", this.roleSessionName) + qryParams.set('RoleSessionName', this.roleSessionName) } if (this.token != null) { - qryParams.set("Token", this.token) + qryParams.set('Token', this.token) } if (this.webIdentityToken) { - qryParams.set("WebIdentityToken", this.webIdentityToken) + qryParams.set('WebIdentityToken', this.webIdentityToken) } if (this.externalId) { - qryParams.set("ExternalId", this.externalId) + qryParams.set('ExternalId', this.externalId) } - const urlParams = qryParams.toString() const contentSha256 = toSha256(urlParams) const date = new Date() /** - * Nodejs's Request Configuration. - */ + * Nodejs's Request Configuration. + */ const requestOptions = { hostname: hostValue, port: portValue, - path: "/", + path: '/', protocol: url.protocol, - method: "POST", + method: 'POST', headers: { - "Content-Type": "application/x-www-form-urlencoded", - "content-length": urlParams.length, - "host": hostValue, - "x-amz-date": makeDateLong(date), - 'x-amz-content-sha256': contentSha256 - } + 'Content-Type': 'application/x-www-form-urlencoded', + 'content-length': urlParams.length, + host: hostValue, + 'x-amz-date': makeDateLong(date), + 'x-amz-content-sha256': contentSha256, + }, } - const authorization = signV4ByServiceName(requestOptions, this.accessKey, this.secretKey, this.region, date, "sts") + const authorization = signV4ByServiceName(requestOptions, this.accessKey, this.secretKey, this.region, date, 'sts') requestOptions.headers.authorization = authorization return { requestOptions, requestData: urlParams, - isHttp: isHttp + isHttp: isHttp, } } @@ -133,7 +131,7 @@ class AssumeRoleProvider extends CredentialProvider { const promise = new Promise((resolve, reject) => { const requestObj = Transport.request(requestOptions, (resp) => { let resChunks = [] - resp.on('data', rChunk => { + resp.on('data', (rChunk) => { resChunks.push(rChunk) }) resp.on('end', () => { @@ -152,12 +150,11 @@ class AssumeRoleProvider extends CredentialProvider { requestObj.end() }) return promise - } - parseCredentials(respObj={}) { - if(respObj.ErrorResponse){ - throw new Error("Unable to obtain credentials:", respObj) + parseCredentials(respObj = {}) { + if (respObj.ErrorResponse) { + throw new Error('Unable to obtain credentials:', respObj) } const { AssumeRoleResponse: { @@ -166,27 +163,24 @@ class AssumeRoleProvider extends CredentialProvider { AccessKeyId: accessKey, SecretAccessKey: secretKey, SessionToken: sessionToken, - Expiration: expiresAt - } = {} - } = {} - } = {} + Expiration: expiresAt, + } = {}, + } = {}, + } = {}, } = respObj - this.accessExpiresAt = expiresAt const newCreds = new Credentials({ accessKey, secretKey, - sessionToken + sessionToken, }) this.setCredentials(newCreds) return this.credentials - } - async refreshCredentials() { try { const assumeRoleCredentials = await this.performRequest() @@ -215,4 +209,4 @@ class AssumeRoleProvider extends CredentialProvider { } } -export default AssumeRoleProvider \ No newline at end of file +export default AssumeRoleProvider diff --git a/src/main/CredentialProvider.js b/src/main/CredentialProvider.js index c1b59bec..ae81a89f 100644 --- a/src/main/CredentialProvider.js +++ b/src/main/CredentialProvider.js @@ -1,15 +1,11 @@ -import Credentials from "./Credentials" +import Credentials from './Credentials' class CredentialProvider { - constructor({ - accessKey, - secretKey, - sessionToken - }) { + constructor({ accessKey, secretKey, sessionToken }) { this.credentials = new Credentials({ accessKey, secretKey, - sessionToken + sessionToken, }) } @@ -21,11 +17,10 @@ class CredentialProvider { if (credentials instanceof Credentials) { this.credentials = credentials } else { - throw new Error("Unable to set Credentials . it should be an instance of Credentials class") + throw new Error('Unable to set Credentials . it should be an instance of Credentials class') } } - setAccessKey(accessKey) { this.credentials.setAccessKey(accessKey) } @@ -49,8 +44,6 @@ class CredentialProvider { getSessionToken() { return this.credentials.getSessionToken() } - - } -export default CredentialProvider \ No newline at end of file +export default CredentialProvider diff --git a/src/main/Credentials.js b/src/main/Credentials.js index acd0d247..07992385 100644 --- a/src/main/Credentials.js +++ b/src/main/Credentials.js @@ -1,42 +1,36 @@ -class Credentials{ - constructor({ - accessKey, - secretKey, - sessionToken - }) { +class Credentials { + constructor({ accessKey, secretKey, sessionToken }) { this.accessKey = accessKey this.secretKey = secretKey - this.sessionToken=sessionToken + this.sessionToken = sessionToken } - - setAccessKey(accessKey){ + setAccessKey(accessKey) { this.accessKey = accessKey } - getAccessKey(){ + getAccessKey() { return this.accessKey } - setSecretKey(secretKey){ - this.secretKey=secretKey + setSecretKey(secretKey) { + this.secretKey = secretKey } - getSecretKey(){ + getSecretKey() { return this.secretKey } - setSessionToken (sessionToken){ + setSessionToken(sessionToken) { this.sessionToken = sessionToken } - getSessionToken (){ + getSessionToken() { return this.sessionToken } - - get(){ + + get() { return { - accessKey:this.accessKey, - secretKey:this.secretKey, - sessionToken:this.sessionToken + accessKey: this.accessKey, + secretKey: this.secretKey, + sessionToken: this.sessionToken, } } - } -export default Credentials \ No newline at end of file +export default Credentials diff --git a/src/main/extensions.js b/src/main/extensions.js index 2e923d11..13d1c264 100644 --- a/src/main/extensions.js +++ b/src/main/extensions.js @@ -16,18 +16,12 @@ import Stream from 'stream' -import * as transformers from './transformers' - import * as errors from './errors.js' - -import { isValidPrefix, isValidBucketName, uriEscape, - isBoolean, isNumber, isString, - pipesetup } from './helpers.js' +import { isBoolean, isNumber, isString, isValidBucketName, isValidPrefix, pipesetup, uriEscape } from './helpers.js' +import * as transformers from './transformers' export default class extensions { - - constructor(client) - { + constructor(client) { this.client = client } @@ -72,7 +66,7 @@ export default class extensions { var continuationToken = '' var objects = [] var ended = false - var readStream = Stream.Readable({objectMode: true}) + var readStream = Stream.Readable({ objectMode: true }) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -82,8 +76,8 @@ export default class extensions { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) - .on('error', e => readStream.emit('error', e)) - .on('data', result => { + .on('error', (e) => readStream.emit('error', e)) + .on('data', (result) => { if (result.isTruncated) { continuationToken = result.nextContinuationToken } else { @@ -159,7 +153,7 @@ export default class extensions { } var method = 'GET' var transformer = transformers.getListObjectsV2WithMetadataTransformer() - this.client.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.client.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) diff --git a/src/main/helpers.js b/src/main/helpers.js index 724d1b31..e0df4b86 100644 --- a/src/main/helpers.js +++ b/src/main/helpers.js @@ -14,25 +14,26 @@ * limitations under the License. */ -import stream from 'stream' import mime from 'mime-types' +import stream from 'stream' var Crypto = require('crypto-browserify') -const { XMLParser } = require("fast-xml-parser") -const fxp = new XMLParser() +const { XMLParser } = require('fast-xml-parser') +const fxp = new XMLParser() const ipaddr = require('ipaddr.js') -import { isBrowser } from "browser-or-node" +import { isBrowser } from 'browser-or-node' const fs = require('fs') -const path = require("path") +const path = require('path') import _ from 'lodash' -import * as errors from './errors.js' import querystring from 'query-string' +import * as errors from './errors.js' + // Returns a wrapper function that will promisify a given callback function. // It will preserve 'this'. export function promisify(fn) { - return function() { + return function () { // If the last argument is a function, assume its the callback. let callback = arguments[arguments.length - 1] @@ -66,14 +67,15 @@ export function uriEscape(string) { if (buf.length === 1) { // length 1 indicates that elem is not a unicode character. // Check if it is an unreserved characer. - if ('A' <= elem && elem <= 'Z' || - 'a' <= elem && elem <= 'z' || - '0' <= elem && elem <= '9' || - elem === '_' || - elem === '.' || - elem === '~' || - elem === '-') - { + if ( + ('A' <= elem && elem <= 'Z') || + ('a' <= elem && elem <= 'z') || + ('0' <= elem && elem <= '9') || + elem === '_' || + elem === '.' || + elem === '~' || + elem === '-' + ) { // Unreserved characer should not be encoded. acc = acc + elem return acc @@ -82,7 +84,7 @@ export function uriEscape(string) { // elem needs encoding - i.e elem should be encoded if it's not unreserved // character or if it's a unicode character. for (var i = 0; i < buf.length; i++) { - acc = acc + "%" + buf[i].toString(16).toUpperCase() + acc = acc + '%' + buf[i].toString(16).toUpperCase() } return acc }, '') @@ -92,7 +94,7 @@ export function uriResourceEscape(string) { return uriEscape(string).replace(/%2F/g, '/') } -export function getScope(region, date, serviceName="s3") { +export function getScope(region, date, serviceName = 's3') { return `${makeDateShort(date)}/${region}/${serviceName}/aws4_request` } @@ -113,7 +115,6 @@ export function isVirtualHostStyle(endpoint, protocol, bucket, pathStyle) { return isAmazonEndpoint(endpoint) || !pathStyle } - export function isValidIP(ip) { return ipaddr.isValid(ip) } @@ -218,22 +219,22 @@ export function isValidPrefix(prefix) { // check if typeof arg number export function isNumber(arg) { - return typeof(arg) === 'number' + return typeof arg === 'number' } // check if typeof arg function export function isFunction(arg) { - return typeof(arg) === 'function' + return typeof arg === 'function' } // check if typeof arg string export function isString(arg) { - return typeof(arg) === 'string' + return typeof arg === 'string' } // check if typeof arg object export function isObject(arg) { - return typeof(arg) === 'object' && arg !== null + return typeof arg === 'object' && arg !== null } // check if object is readable stream @@ -243,7 +244,7 @@ export function isReadableStream(arg) { // check if arg is boolean export function isBoolean(arg) { - return typeof(arg) === 'boolean' + return typeof arg === 'boolean' } // check if arg is array @@ -264,11 +265,7 @@ export function makeDateLong(date) { // Gives format like: '2017-08-07T16:28:59.889Z' date = date.toISOString() - return date.slice(0, 4) + - date.slice(5, 7) + - date.slice(8, 13) + - date.slice(14, 16) + - date.slice(17, 19) + 'Z' + return date.slice(0, 4) + date.slice(5, 7) + date.slice(8, 13) + date.slice(14, 16) + date.slice(17, 19) + 'Z' } // Create a Date string with format: @@ -279,9 +276,7 @@ export function makeDateShort(date) { // Gives format like: '2017-08-07T16:28:59.889Z' date = date.toISOString() - return date.slice(0, 4) + - date.slice(5, 7) + - date.slice(8, 10) + return date.slice(0, 4) + date.slice(5, 7) + date.slice(8, 10) } // pipesetup sets up pipe() from left to right os streams array @@ -289,7 +284,7 @@ export function makeDateShort(date) { // will be emitted at the last stream. This makes error handling simple export function pipesetup(...streams) { return streams.reduce((src, dst) => { - src.on('error', err => dst.emit('error', err)) + src.on('error', (err) => dst.emit('error', err)) return src.pipe(dst) }) } @@ -322,8 +317,8 @@ export function insertContentType(metaData, filePath) { export function prependXAMZMeta(metaData) { var newMetadata = Object.assign({}, metaData) for (var key in metaData) { - if(!isAmzHeader(key) && !isSupportedHeader(key) && !isStorageclassHeader(key)) { - newMetadata["X-Amz-Meta-" + key ] = newMetadata[key] + if (!isAmzHeader(key) && !isSupportedHeader(key) && !isStorageclassHeader(key)) { + newMetadata['X-Amz-Meta-' + key] = newMetadata[key] delete newMetadata[key] } } @@ -333,7 +328,12 @@ export function prependXAMZMeta(metaData) { // Checks if it is a valid header according to the AmazonS3 API export function isAmzHeader(key) { var temp = key.toLowerCase() - return temp.startsWith("x-amz-meta-") || temp === "x-amz-acl" || temp.startsWith("x-amz-server-side-encryption-") || temp === "x-amz-server-side-encryption" + return ( + temp.startsWith('x-amz-meta-') || + temp === 'x-amz-acl' || + temp.startsWith('x-amz-server-side-encryption-') || + temp === 'x-amz-server-side-encryption' + ) } // Checks if it is a supported Header export function isSupportedHeader(key) { @@ -343,20 +343,21 @@ export function isSupportedHeader(key) { 'content-encoding', 'content-disposition', 'content-language', - 'x-amz-website-redirect-location'] - return (supported_headers.indexOf(key.toLowerCase()) > -1) + 'x-amz-website-redirect-location', + ] + return supported_headers.indexOf(key.toLowerCase()) > -1 } // Checks if it is a storage header export function isStorageclassHeader(key) { - return key.toLowerCase() === "x-amz-storage-class" + return key.toLowerCase() === 'x-amz-storage-class' } export function extractMetadata(metaData) { var newMetadata = {} for (var key in metaData) { - if(isSupportedHeader(key) || isStorageclassHeader(key) || isAmzHeader(key)) { - if(key.toLowerCase().startsWith("x-amz-meta-")) { - newMetadata[key.slice(11,key.length)] = metaData[key] + if (isSupportedHeader(key) || isStorageclassHeader(key) || isAmzHeader(key)) { + if (key.toLowerCase().startsWith('x-amz-meta-')) { + newMetadata[key.slice(11, key.length)] = metaData[key] } else { newMetadata[key] = metaData[key] } @@ -365,44 +366,42 @@ export function extractMetadata(metaData) { return newMetadata } - -export function getVersionId(headers={}){ - const versionIdValue = headers["x-amz-version-id"] - return versionIdValue || null +export function getVersionId(headers = {}) { + const versionIdValue = headers['x-amz-version-id'] + return versionIdValue || null } -export function getSourceVersionId(headers={}){ - const sourceVersionId = headers["x-amz-copy-source-version-id"] - return sourceVersionId || null +export function getSourceVersionId(headers = {}) { + const sourceVersionId = headers['x-amz-copy-source-version-id'] + return sourceVersionId || null } -export function sanitizeETag(etag='') { - var replaceChars = {'"':'','"':'','"':'','"':'','"':''} - return etag.replace(/^("|"|")|("|"|")$/g, m => replaceChars[m]) - +export function sanitizeETag(etag = '') { + var replaceChars = { '"': '', '"': '', '"': '', '"': '', '"': '' } + return etag.replace(/^("|"|")|("|"|")$/g, (m) => replaceChars[m]) } -export const RETENTION_MODES ={ - GOVERNANCE:"GOVERNANCE", - COMPLIANCE:"COMPLIANCE" +export const RETENTION_MODES = { + GOVERNANCE: 'GOVERNANCE', + COMPLIANCE: 'COMPLIANCE', } -export const RETENTION_VALIDITY_UNITS={ - DAYS:"Days", - YEARS:"Years" +export const RETENTION_VALIDITY_UNITS = { + DAYS: 'Days', + YEARS: 'Years', } -export const LEGAL_HOLD_STATUS={ - ENABLED:"ON", - DISABLED:"OFF" +export const LEGAL_HOLD_STATUS = { + ENABLED: 'ON', + DISABLED: 'OFF', } -const objectToBuffer = (payload) =>{ +const objectToBuffer = (payload) => { const payloadBuf = Buffer.from(Buffer.from(payload)) return payloadBuf } -export const toMd5=(payload)=>{ +export const toMd5 = (payload) => { let payLoadBuf = objectToBuffer(payload) // use string from browser and buffer from nodejs // browser support is tested only against minio server @@ -410,7 +409,7 @@ export const toMd5=(payload)=>{ return Crypto.createHash('md5').update(payLoadBuf).digest().toString('base64') } -export const toSha256=(payload)=>{ +export const toSha256 = (payload) => { return Crypto.createHash('sha256').update(payload).digest('hex') } @@ -424,21 +423,20 @@ export const toArray = (param) => { return param } -export const sanitizeObjectKey=(objectName)=>{ +export const sanitizeObjectKey = (objectName) => { // + symbol characters are not decoded as spaces in JS. so replace them first and decode to get the correct result. - let asStrName = (objectName ? objectName.toString() : "").replace(/\+/g, ' ') + let asStrName = (objectName ? objectName.toString() : '').replace(/\+/g, ' ') const sanitizedName = decodeURIComponent(asStrName) return sanitizedName } - -export const PART_CONSTRAINTS ={ -// absMinPartSize - absolute minimum part size (5 MiB) - ABS_MIN_PART_SIZE:1024 * 1024 * 5, +export const PART_CONSTRAINTS = { + // absMinPartSize - absolute minimum part size (5 MiB) + ABS_MIN_PART_SIZE: 1024 * 1024 * 5, // MIN_PART_SIZE - minimum part size 16MiB per object after which - MIN_PART_SIZE : 1024 * 1024 * 16, + MIN_PART_SIZE: 1024 * 1024 * 16, // MAX_PARTS_COUNT - maximum number of parts for a single multipart session. - MAX_PARTS_COUNT : 10000, + MAX_PARTS_COUNT: 10000, // MAX_PART_SIZE - maximum part size 5GiB for a single multipart upload // operation. MAX_PART_SIZE: 1024 * 1024 * 1024 * 5, @@ -447,23 +445,22 @@ export const PART_CONSTRAINTS ={ MAX_SINGLE_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 5, // MAX_MULTIPART_PUT_OBJECT_SIZE - maximum size 5TiB of object for // Multipart operation. - MAX_MULTIPART_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 1024 * 5 + MAX_MULTIPART_PUT_OBJECT_SIZE: 1024 * 1024 * 1024 * 1024 * 5, } -export const ENCRYPTION_TYPES ={ +export const ENCRYPTION_TYPES = { // SSEC represents server-side-encryption with customer provided keys - SSEC: "SSE-C", + SSEC: 'SSE-C', // KMS represents server-side-encryption with managed keys - KMS: "KMS" - + KMS: 'KMS', } -const GENERIC_SSE_HEADER="X-Amz-Server-Side-Encryption" +const GENERIC_SSE_HEADER = 'X-Amz-Server-Side-Encryption' -const ENCRYPTION_HEADERS ={ +const ENCRYPTION_HEADERS = { // sseGenericHeader is the AWS SSE header used for SSE-S3 and SSE-KMS. - sseGenericHeader : GENERIC_SSE_HEADER, + sseGenericHeader: GENERIC_SSE_HEADER, // sseKmsKeyID is the AWS SSE-KMS key id. - sseKmsKeyID : GENERIC_SSE_HEADER + "-Aws-Kms-Key-Id", + sseKmsKeyID: GENERIC_SSE_HEADER + '-Aws-Kms-Key-Id', } /** @@ -471,18 +468,18 @@ const ENCRYPTION_HEADERS ={ * @param encConfig * @returns an object with key value pairs that can be used in headers. */ -function getEncryptionHeaders (encConfig) { +function getEncryptionHeaders(encConfig) { const encType = encConfig.type const encHeaders = {} - if(!_.isEmpty(encType) ){ - if( encType === ENCRYPTION_TYPES.SSEC) { + if (!_.isEmpty(encType)) { + if (encType === ENCRYPTION_TYPES.SSEC) { return { - [encHeaders[ENCRYPTION_HEADERS.sseGenericHeader]]: "AES256" + [encHeaders[ENCRYPTION_HEADERS.sseGenericHeader]]: 'AES256', } - } else if(encType === ENCRYPTION_TYPES.KMS){ + } else if (encType === ENCRYPTION_TYPES.KMS) { return { - [ENCRYPTION_HEADERS.sseGenericHeader]:encConfig.SSEAlgorithm, - [ENCRYPTION_HEADERS.sseKmsKeyID]:encConfig.KMSMasterKeyID + [ENCRYPTION_HEADERS.sseGenericHeader]: encConfig.SSEAlgorithm, + [ENCRYPTION_HEADERS.sseKmsKeyID]: encConfig.KMSMasterKeyID, } } } @@ -492,86 +489,86 @@ function getEncryptionHeaders (encConfig) { export class CopySourceOptions { /** - * - * @param Bucket __string__ Bucket Name - * @param Object __string__ Object Name - * @param VersionID __string__ Valid versionId - * @param MatchETag __string__ Etag to match - * @param NoMatchETag __string__ Etag to exclude - * @param MatchModifiedSince __string__ Modified Date of the object/part. UTC Date in string format - * @param MatchUnmodifiedSince __string__ Modified Date of the object/part to exclude UTC Date in string format - * @param MatchRange __boolean__ true or false Object range to match - * @param Start - * @param End - * @param Encryption - */ + * + * @param Bucket __string__ Bucket Name + * @param Object __string__ Object Name + * @param VersionID __string__ Valid versionId + * @param MatchETag __string__ Etag to match + * @param NoMatchETag __string__ Etag to exclude + * @param MatchModifiedSince __string__ Modified Date of the object/part. UTC Date in string format + * @param MatchUnmodifiedSince __string__ Modified Date of the object/part to exclude UTC Date in string format + * @param MatchRange __boolean__ true or false Object range to match + * @param Start + * @param End + * @param Encryption + */ constructor({ - Bucket="", - Object="", - VersionID="", - MatchETag="", - NoMatchETag="", - MatchModifiedSince=null, - MatchUnmodifiedSince=null, - MatchRange=false, - Start=0, - End=0, - Encryption= {}, - }={}) { - - this.Bucket=Bucket - this.Object=Object - this.VersionID=VersionID - this.MatchETag=MatchETag - this.NoMatchETag=NoMatchETag - this.MatchModifiedSince=MatchModifiedSince - this.MatchUnmodifiedSince=MatchUnmodifiedSince - this.MatchRange=MatchRange - this.Start=Start - this.End=End - this.Encryption=Encryption - } - - validate(){ + Bucket = '', + Object = '', + VersionID = '', + MatchETag = '', + NoMatchETag = '', + MatchModifiedSince = null, + MatchUnmodifiedSince = null, + MatchRange = false, + Start = 0, + End = 0, + Encryption = {}, + } = {}) { + this.Bucket = Bucket + this.Object = Object + this.VersionID = VersionID + this.MatchETag = MatchETag + this.NoMatchETag = NoMatchETag + this.MatchModifiedSince = MatchModifiedSince + this.MatchUnmodifiedSince = MatchUnmodifiedSince + this.MatchRange = MatchRange + this.Start = Start + this.End = End + this.Encryption = Encryption + } + + validate() { if (!isValidBucketName(this.Bucket)) { throw new errors.InvalidBucketNameError('Invalid Source bucket name: ' + this.Bucket) } if (!isValidObjectName(this.Object)) { throw new errors.InvalidObjectNameError(`Invalid Source object name: ${this.Object}`) } - if (this.MatchRange && (this.Start !==-1 && this.End !==-1) && this.Start > this.End || this.Start < 0) { - throw new errors.InvalidObjectNameError("Source start must be non-negative, and start must be at most end.") - } else if(this.MatchRange&& !isNumber(this.Start) || !isNumber(this.End) ){ - throw new errors.InvalidObjectNameError("MatchRange is specified. But Invalid Start and End values are specified. ") + if ((this.MatchRange && this.Start !== -1 && this.End !== -1 && this.Start > this.End) || this.Start < 0) { + throw new errors.InvalidObjectNameError('Source start must be non-negative, and start must be at most end.') + } else if ((this.MatchRange && !isNumber(this.Start)) || !isNumber(this.End)) { + throw new errors.InvalidObjectNameError( + 'MatchRange is specified. But Invalid Start and End values are specified. ' + ) } return true } - getHeaders (){ - let headerOptions ={} - headerOptions["x-amz-copy-source"]=encodeURI(this.Bucket+"/"+this.Object) + getHeaders() { + let headerOptions = {} + headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object) if (!_.isEmpty(this.VersionID)) { - headerOptions["x-amz-copy-source"]=encodeURI(this.Bucket+"/"+this.Object)+"?versionId="+this.VersionID + headerOptions['x-amz-copy-source'] = encodeURI(this.Bucket + '/' + this.Object) + '?versionId=' + this.VersionID } if (!_.isEmpty(this.MatchETag)) { - headerOptions["x-amz-copy-source-if-match"]=this.MatchETag + headerOptions['x-amz-copy-source-if-match'] = this.MatchETag } if (!_.isEmpty(this.NoMatchETag)) { - headerOptions["x-amz-copy-source-if-none-match"]=this.NoMatchETag + headerOptions['x-amz-copy-source-if-none-match'] = this.NoMatchETag } if (!_.isEmpty(this.MatchModifiedSince)) { - headerOptions["x-amz-copy-source-if-modified-since"]= this.MatchModifiedSince + headerOptions['x-amz-copy-source-if-modified-since'] = this.MatchModifiedSince } if (!_.isEmpty(this.MatchUnmodifiedSince)) { - headerOptions["x-amz-copy-source-if-unmodified-since"]= this.MatchUnmodifiedSince + headerOptions['x-amz-copy-source-if-unmodified-since'] = this.MatchUnmodifiedSince } return headerOptions - } } @@ -585,92 +582,96 @@ export class CopyDestinationOptions { * @param LegalHold __string__ ON | OFF * @param RetainUntilDate __string__ UTC Date String * @param Mode - */ + */ constructor({ - Bucket="", - Object="", - Encryption=null, - UserMetadata=null, - UserTags=null, + Bucket = '', + Object = '', + Encryption = null, + UserMetadata = null, + UserTags = null, LegalHold = null, - RetainUntilDate=null, - Mode=null, // + RetainUntilDate = null, + Mode = null, // }) { - this.Bucket=Bucket - this.Object=Object - this.Encryption=Encryption - this.UserMetadata=UserMetadata - this.UserTags=UserTags + this.Bucket = Bucket + this.Object = Object + this.Encryption = Encryption + this.UserMetadata = UserMetadata + this.UserTags = UserTags this.LegalHold = LegalHold - this.Mode=Mode // retention mode - this.RetainUntilDate=RetainUntilDate + this.Mode = Mode // retention mode + this.RetainUntilDate = RetainUntilDate } - getHeaders (){ - const replaceDirective = "REPLACE" - const headerOptions ={} + getHeaders() { + const replaceDirective = 'REPLACE' + const headerOptions = {} - const userTags= this.UserTags + const userTags = this.UserTags if (!_.isEmpty(userTags)) { - headerOptions["X-Amz-Tagging-Directive"]=replaceDirective - headerOptions["X-Amz-Tagging"]=isObject(userTags)? querystring.stringify(userTags):isString(userTags)?userTags:"" + headerOptions['X-Amz-Tagging-Directive'] = replaceDirective + headerOptions['X-Amz-Tagging'] = isObject(userTags) + ? querystring.stringify(userTags) + : isString(userTags) + ? userTags + : '' } if (!_.isEmpty(this.Mode)) { - headerOptions["X-Amz-Object-Lock-Mode"]=this.Mode // GOVERNANCE or COMPLIANCE + headerOptions['X-Amz-Object-Lock-Mode'] = this.Mode // GOVERNANCE or COMPLIANCE } if (!_.isEmpty(this.RetainUntilDate)) { - headerOptions["X-Amz-Object-Lock-Retain-Until-Date"]=this.RetainUntilDate// needs to be UTC. + headerOptions['X-Amz-Object-Lock-Retain-Until-Date'] = this.RetainUntilDate // needs to be UTC. } - if (!_.isEmpty(this.LegalHold) ){ - headerOptions["X-Amz-Object-Lock-Legal-Hold"]= this.LegalHold// ON or OFF + if (!_.isEmpty(this.LegalHold)) { + headerOptions['X-Amz-Object-Lock-Legal-Hold'] = this.LegalHold // ON or OFF } - if(!_.isEmpty(this.UserMetadata)){ + if (!_.isEmpty(this.UserMetadata)) { const headerKeys = Object.keys(this.UserMetadata) - headerKeys.forEach((key)=>{ - headerOptions[`X-Amz-Meta-${key}`]=this.UserMetadata[key] + headerKeys.forEach((key) => { + headerOptions[`X-Amz-Meta-${key}`] = this.UserMetadata[key] }) - } - if (!_.isEmpty(this.Encryption)){ + if (!_.isEmpty(this.Encryption)) { const encryptionHeaders = getEncryptionHeaders(this.Encryption) - Object.keys(encryptionHeaders).forEach((key)=>{ - headerOptions[key]=encryptionHeaders[key] + Object.keys(encryptionHeaders).forEach((key) => { + headerOptions[key] = encryptionHeaders[key] }) - } return headerOptions } - validate(){ + validate() { if (!isValidBucketName(this.Bucket)) { throw new errors.InvalidBucketNameError('Invalid Destination bucket name: ' + this.Bucket) } if (!isValidObjectName(this.Object)) { throw new errors.InvalidObjectNameError(`Invalid Destination object name: ${this.Object}`) } - if(!_.isEmpty(this.UserMetadata) && !isObject(this.UserMetadata)){ + if (!_.isEmpty(this.UserMetadata) && !isObject(this.UserMetadata)) { throw new errors.InvalidObjectNameError(`Destination UserMetadata should be an object with key value pairs`) } - if(!_.isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)){ - throw new errors.InvalidObjectNameError(`Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]`) + if (!_.isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)) { + throw new errors.InvalidObjectNameError( + `Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]` + ) } - if (!_.isEmpty(this.Encryption) && _.isEmpty(this.Encryption) ){ + if (!_.isEmpty(this.Encryption) && _.isEmpty(this.Encryption)) { throw new errors.InvalidObjectNameError(`Invalid Encryption configuration for destination object `) } return true } } -export const partsRequired= (size) =>{ - let maxPartSize =PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE/ (PART_CONSTRAINTS.MAX_PARTS_COUNT - 1) - let requiredPartSize = size /maxPartSize - if ((size % maxPartSize) >0) { +export const partsRequired = (size) => { + let maxPartSize = PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE / (PART_CONSTRAINTS.MAX_PARTS_COUNT - 1) + let requiredPartSize = size / maxPartSize + if (size % maxPartSize > 0) { requiredPartSize++ } requiredPartSize = Math.trunc(requiredPartSize) @@ -684,7 +685,7 @@ export const partsRequired= (size) =>{ let startIndexParts = [] let endIndexParts = [] -export function calculateEvenSplits(size , objInfo) { +export function calculateEvenSplits(size, objInfo) { if (size === 0) { return null } @@ -693,53 +694,49 @@ export function calculateEvenSplits(size , objInfo) { endIndexParts = new Array(reqParts) let start = objInfo.Start - if (_.isEmpty( objInfo.Start) || start === -1 ){ + if (_.isEmpty(objInfo.Start) || start === -1) { start = 0 } - const divisorValue= Math.trunc(size/reqParts) + const divisorValue = Math.trunc(size / reqParts) - const reminderValue = size%reqParts + const reminderValue = size % reqParts let nextStart = start - for (let i =0; i < reqParts; i++ ){ - let curPartSize= divisorValue - if (i < reminderValue ){ + for (let i = 0; i < reqParts; i++) { + let curPartSize = divisorValue + if (i < reminderValue) { curPartSize++ } - const currentStart =nextStart + const currentStart = nextStart let currentEnd = currentStart + curPartSize - 1 nextStart = currentEnd + 1 - startIndexParts[i]= currentStart - endIndexParts[i]=currentEnd + startIndexParts[i] = currentStart + endIndexParts[i] = currentEnd } - return {startIndex:startIndexParts, endIndex:endIndexParts, objInfo:objInfo} - + return { startIndex: startIndexParts, endIndex: endIndexParts, objInfo: objInfo } } - - export function removeDirAndFiles(dirPath, removeSelf) { - if (removeSelf === undefined) - removeSelf = true - try { var files = fs.readdirSync(dirPath) } - catch(e) { return } + if (removeSelf === undefined) removeSelf = true + try { + var files = fs.readdirSync(dirPath) + } catch (e) { + return + } if (files.length > 0) for (var i = 0; i < files.length; i++) { var filePath = path.join(dirPath, files[i]) - if (fs.statSync(filePath).isFile()) - fs.unlinkSync(filePath) - else - removeDirAndFiles(filePath) + if (fs.statSync(filePath).isFile()) fs.unlinkSync(filePath) + else removeDirAndFiles(filePath) } - if (removeSelf) - fs.rmdirSync(dirPath) + if (removeSelf) fs.rmdirSync(dirPath) } -export const parseXml = (xml) => { +export const parseXml = (xml) => { let result = null result = fxp.parse(xml) if (result.Error) { @@ -752,46 +749,44 @@ export const parseXml = (xml) => { export class SelectResults { constructor({ records, // parsed data as stream - response,// original response stream + response, // original response stream stats, // stats as xml - progress // stats as xml + progress, // stats as xml }) { - - this.records= records + this.records = records this.response = response - this.stats= stats + this.stats = stats this.progress = progress } - setStats(stats){ + setStats(stats) { this.stats = stats } - getStats () { + getStats() { return this.stats } - setProgress(progress){ + setProgress(progress) { this.progress = progress } - getProgress (){ + getProgress() { return this.progress } - setResponse(response){ + setResponse(response) { this.response = response } - getResponse (){ + getResponse() { return this.response } - setRecords(records){ + setRecords(records) { this.records = records } - getRecords(){ + getRecords() { return this.records } - } export const DEFAULT_REGION = 'us-east-1' diff --git a/src/main/minio.js b/src/main/minio.js index c5edfcb8..c4e2cdf1 100644 --- a/src/main/minio.js +++ b/src/main/minio.js @@ -14,58 +14,77 @@ * limitations under the License. */ +import async from 'async' +import BlockStream2 from 'block-stream2' import fs from 'fs' import Http from 'http' import Https from 'https' +import _ from 'lodash' +import mkdirp from 'mkdirp' +import path from 'path' +import querystring from 'query-string' import Stream from 'stream' -import BlockStream2 from 'block-stream2' +import { TextEncoder } from 'web-encoding' import Xml from 'xml' import xml2js from 'xml2js' -import async from 'async' -import querystring from 'query-string' -import mkdirp from 'mkdirp' -import path from 'path' -import _ from 'lodash' -import { TextEncoder } from "web-encoding" +import CredentialProvider from './CredentialProvider' +import * as errors from './errors.js' +import extensions from './extensions' import { - extractMetadata, prependXAMZMeta, isValidPrefix, isValidEndpoint, isValidBucketName, - isValidPort, isValidObjectName, isAmazonEndpoint, getScope, - uriEscape, uriResourceEscape, isBoolean, isFunction, isNumber, - isString, isObject, isArray, isValidDate, pipesetup, - readableStream, isReadableStream, isVirtualHostStyle, - insertContentType, makeDateLong, promisify, getVersionId, sanitizeETag, - toMd5, toSha256, - RETENTION_MODES, RETENTION_VALIDITY_UNITS, - LEGAL_HOLD_STATUS, CopySourceOptions, CopyDestinationOptions, getSourceVersionId, + calculateEvenSplits, + CopyDestinationOptions, + CopySourceOptions, + DEFAULT_REGION, + extractMetadata, + getScope, + getSourceVersionId, + getVersionId, + insertContentType, + isAmazonEndpoint, + isArray, + isBoolean, + isFunction, + isNumber, + isObject, + isReadableStream, + isString, + isValidBucketName, + isValidDate, + isValidEndpoint, + isValidObjectName, + isValidPort, + isValidPrefix, + isVirtualHostStyle, + LEGAL_HOLD_STATUS, + makeDateLong, PART_CONSTRAINTS, partsRequired, - calculateEvenSplits, - DEFAULT_REGION + pipesetup, + prependXAMZMeta, + promisify, + readableStream, + RETENTION_MODES, + RETENTION_VALIDITY_UNITS, + sanitizeETag, + toMd5, + toSha256, + uriEscape, + uriResourceEscape, } from './helpers.js' - -import { signV4, presignSignatureV4, postPresignSignatureV4 } from './signing.js' - +import { NotificationConfig, NotificationPoller } from './notification' import ObjectUploader from './object-uploader' - -import * as transformers from './transformers' - -import * as errors from './errors.js' - import { getS3Endpoint } from './s3-endpoints.js' - -import { NotificationConfig, NotificationPoller } from './notification' - -import extensions from './extensions' -import CredentialProvider from "./CredentialProvider" - -import { parseSelectObjectContentResponse} from "./xml-parsers" +import { postPresignSignatureV4, presignSignatureV4, signV4 } from './signing.js' +import * as transformers from './transformers' +import { parseSelectObjectContentResponse } from './xml-parsers' var Package = require('../../package.json') export class Client { constructor(params) { - if (typeof params.secure !== 'undefined') throw new Error('"secure" option deprecated, "useSSL" should be used instead') + if (typeof params.secure !== 'undefined') + throw new Error('"secure" option deprecated, "useSSL" should be used instead') // Default values if not specified. if (typeof params.useSSL === 'undefined') params.useSSL = true if (!params.port) params.port = 0 @@ -77,7 +96,9 @@ export class Client { throw new errors.InvalidArgumentError(`Invalid port : ${params.port}`) } if (!isBoolean(params.useSSL)) { - throw new errors.InvalidArgumentError(`Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"`) + throw new errors.InvalidArgumentError( + `Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"` + ) } // Validate region only if its set. @@ -111,7 +132,9 @@ export class Client { // if custom transport is set, use it. if (params.transport) { if (!isObject(params.transport)) { - throw new errors.InvalidArgumentError('Invalid transport type : ${params.transport}, expected to be type "object"') + throw new errors.InvalidArgumentError( + 'Invalid transport type : ${params.transport}, expected to be type "object"' + ) } transport = params.transport } @@ -145,7 +168,7 @@ export class Client { if (!this.secretKey) this.secretKey = '' this.anonymous = !this.accessKey || !this.secretKey - if(params.credentialsProvider) { + if (params.credentialsProvider) { this.credentialsProvider = params.credentialsProvider this.checkAndRefreshCreds() } @@ -155,35 +178,35 @@ export class Client { this.region = params.region } - this.partSize = 64*1024*1024 + this.partSize = 64 * 1024 * 1024 if (params.partSize) { this.partSize = params.partSize this.overRidePartSize = true } - if (this.partSize < 5*1024*1024) { + if (this.partSize < 5 * 1024 * 1024) { throw new errors.InvalidArgumentError(`Part size should be greater than 5MB`) } - if (this.partSize > 5*1024*1024*1024) { + if (this.partSize > 5 * 1024 * 1024 * 1024) { throw new errors.InvalidArgumentError(`Part size should be less than 5GB`) } - this.maximumPartSize = 5*1024*1024*1024 - this.maxObjectSize = 5*1024*1024*1024*1024 + this.maximumPartSize = 5 * 1024 * 1024 * 1024 + this.maxObjectSize = 5 * 1024 * 1024 * 1024 * 1024 // SHA256 is enabled only for authenticated http requests. If the request is authenticated // and the connection is https we use x-amz-content-sha256=UNSIGNED-PAYLOAD // header for signature calculation. this.enableSHA256 = !this.anonymous && !params.useSSL - this.s3AccelerateEndpoint = ( params.s3AccelerateEndpoint || null ) + this.s3AccelerateEndpoint = params.s3AccelerateEndpoint || null this.reqOptions = {} } // This is s3 Specific and does not hold validity in any other Object storage. - getAccelerateEndPointIfSet(bucketName, objectName){ - if (!_.isEmpty(this.s3AccelerateEndpoint) && !_.isEmpty(bucketName) && !_.isEmpty(objectName) ) { + getAccelerateEndPointIfSet(bucketName, objectName) { + if (!_.isEmpty(this.s3AccelerateEndpoint) && !_.isEmpty(bucketName) && !_.isEmpty(objectName)) { // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html // Disable transfer acceleration for non-compliant bucket names. - if (bucketName.indexOf(".")!== -1) { + if (bucketName.indexOf('.') !== -1) { throw new Error(`Transfer Acceleration is not supported for non compliant bucket:${bucketName}`) } // If transfer acceleration is requested set new host. @@ -191,13 +214,13 @@ export class Client { // http://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html return this.s3AccelerateEndpoint } - return false + return false } /** * @param endPoint _string_ valid S3 acceleration end point */ - setS3TransferAccelerate(endPoint){ + setS3TransferAccelerate(endPoint) { this.s3AccelerateEndpoint = endPoint } @@ -206,7 +229,26 @@ export class Client { if (!isObject(options)) { throw new TypeError('request options should be of type "object"') } - this.reqOptions = _.pick(options, ['agent', 'ca', 'cert', 'ciphers', 'clientCertEngine', 'crl', 'dhparam', 'ecdhCurve', 'family', 'honorCipherOrder', 'key', 'passphrase', 'pfx', 'rejectUnauthorized', 'secureOptions', 'secureProtocol', 'servername', 'sessionIdContext']) + this.reqOptions = _.pick(options, [ + 'agent', + 'ca', + 'cert', + 'ciphers', + 'clientCertEngine', + 'crl', + 'dhparam', + 'ecdhCurve', + 'family', + 'honorCipherOrder', + 'key', + 'passphrase', + 'pfx', + 'rejectUnauthorized', + 'secureOptions', + 'secureProtocol', + 'servername', + 'sessionIdContext', + ]) } // returns *options* object that can be used with http.request() @@ -219,7 +261,7 @@ export class Client { var headers = opts.headers var query = opts.query - var reqOptions = {method} + var reqOptions = { method } reqOptions.headers = {} // Verify if virtual host supported. @@ -242,9 +284,9 @@ export class Client { // For Amazon S3 endpoint, get endpoint based on region. if (isAmazonEndpoint(reqOptions.host)) { const accelerateEndPoint = this.getAccelerateEndPointIfSet(bucketName, objectName) - if (accelerateEndPoint ) { + if (accelerateEndPoint) { reqOptions.host = `${accelerateEndPoint}` - }else { + } else { reqOptions.host = getS3Endpoint(region) } } @@ -267,14 +309,16 @@ export class Client { if (query) reqOptions.path += `?${query}` reqOptions.headers.host = reqOptions.host - if ((reqOptions.protocol === 'http:' && reqOptions.port !== 80) || - (reqOptions.protocol === 'https:' && reqOptions.port !== 443)) { + if ( + (reqOptions.protocol === 'http:' && reqOptions.port !== 80) || + (reqOptions.protocol === 'https:' && reqOptions.port !== 443) + ) { reqOptions.headers.host = `${reqOptions.host}:${reqOptions.port}` } reqOptions.headers['user-agent'] = this.userAgent if (headers) { // have all header keys in lower case - to make signing easy - _.map(headers, (v, k) => reqOptions.headers[k.toLowerCase()] = v) + _.map(headers, (v, k) => (reqOptions.headers[k.toLowerCase()] = v)) } // Use any request option specified in minioClient.setRequestOptions() @@ -320,13 +364,14 @@ export class Client { return this.partSize } var partSize = this.partSize - for (;;) { // while(true) {...} throws linting error. + for (;;) { + // while(true) {...} throws linting error. // If partSize is big enough to accomodate the object size, then use it. - if ((partSize * 10000) > size) { + if (partSize * 10000 > size) { return partSize } // Try part sizes as 64MB, 80MB, 96MB etc. - partSize += 16*1024*1024 + partSize += 16 * 1024 * 1024 } } @@ -391,7 +436,7 @@ export class Client { // Buffer is of type 'object' throw new TypeError('payload should be of type "string" or "Buffer"') } - statusCodes.forEach(statusCode => { + statusCodes.forEach((statusCode) => { if (!isNumber(statusCode)) { throw new TypeError('statusCode should be of type "number"') } @@ -402,7 +447,7 @@ export class Client { if (!isBoolean(returnResponse)) { throw new TypeError('returnResponse should be of type "boolean"') } - if(!isFunction(cb)) { + if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } if (!options.headers) options.headers = {} @@ -427,7 +472,7 @@ export class Client { if (!isString(sha256sum)) { throw new TypeError('sha256sum should be of type "string"') } - statusCodes.forEach(statusCode => { + statusCodes.forEach((statusCode) => { if (!isNumber(statusCode)) { throw new TypeError('statusCode should be of type "number"') } @@ -438,7 +483,7 @@ export class Client { if (!isBoolean(returnResponse)) { throw new TypeError('returnResponse should be of type "boolean"') } - if(!isFunction(cb)) { + if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } @@ -471,30 +516,29 @@ export class Client { var authorization = signV4(reqOptions, this.accessKey, this.secretKey, region, date) reqOptions.headers.authorization = authorization } - var req = this.transport.request(reqOptions, response => { + var req = this.transport.request(reqOptions, (response) => { if (!statusCodes.includes(response.statusCode)) { // For an incorrect region, S3 server always sends back 400. // But we will do cache invalidation for all errors so that, // in future, if AWS S3 decides to send a different status code or // XML error code we will still work fine. - delete(this.regionMap[options.bucketName]) + delete this.regionMap[options.bucketName] var errorTransformer = transformers.getErrorTransformer(response) - pipesetup(response, errorTransformer) - .on('error', e => { - this.logHTTP(reqOptions, response, e) - cb(e) - }) + pipesetup(response, errorTransformer).on('error', (e) => { + this.logHTTP(reqOptions, response, e) + cb(e) + }) return } this.logHTTP(reqOptions, response) if (returnResponse) return cb(null, response) // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. - response.on('data', ()=>{}) + response.on('data', () => {}) cb(null) }) let pipe = pipesetup(stream, req) - pipe.on('error', e => { + pipe.on('error', (e) => { this.logHTTP(reqOptions, null, e) cb(e) }) @@ -521,7 +565,7 @@ export class Client { var region = DEFAULT_REGION pipesetup(response, transformer) .on('error', cb) - .on('data', data => { + .on('data', (data) => { if (data) region = data }) .on('end', () => { @@ -546,12 +590,12 @@ export class Client { // obtained region. var pathStyle = this.pathStyle && typeof window === 'undefined' - this.makeRequest({method, bucketName, query, pathStyle}, '', [200], DEFAULT_REGION, true, (e, response) => { + this.makeRequest({ method, bucketName, query, pathStyle }, '', [200], DEFAULT_REGION, true, (e, response) => { if (e) { if (e.name === 'AuthorizationHeaderMalformed') { var region = e.Region if (!region) return cb(e) - this.makeRequest({method, bucketName, query}, '', [200], region, true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], region, true, (e, response) => { if (e) return cb(e) extractRegion(response) }) @@ -570,24 +614,24 @@ export class Client { // * `region` _string_ - region valid values are _us-west-1_, _us-west-2_, _eu-west-1_, _eu-central-1_, _ap-southeast-1_, _ap-northeast-1_, _ap-southeast-2_, _sa-east-1_. // * `makeOpts` _object_ - Options to create a bucket. e.g {ObjectLocking:true} (Optional) // * `callback(err)` _function_ - callback function with `err` as the error argument. `err` is null if the bucket is successfully created. - makeBucket(bucketName, region, makeOpts={}, cb) { + makeBucket(bucketName, region, makeOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } // Backward Compatibility - if(isObject(region)){ - cb= makeOpts - makeOpts=region + if (isObject(region)) { + cb = makeOpts + makeOpts = region region = '' } if (isFunction(region)) { cb = region region = '' - makeOpts={} + makeOpts = {} } - if(isFunction(makeOpts)){ - cb=makeOpts - makeOpts={} + if (isFunction(makeOpts)) { + cb = makeOpts + makeOpts = {} } if (!isString(region)) { @@ -615,38 +659,38 @@ export class Client { var createBucketConfiguration = [] createBucketConfiguration.push({ _attr: { - xmlns: 'http://s3.amazonaws.com/doc/2006-03-01/' - } + xmlns: 'http://s3.amazonaws.com/doc/2006-03-01/', + }, }) createBucketConfiguration.push({ - LocationConstraint: region + LocationConstraint: region, }) var payloadObject = { - CreateBucketConfiguration: createBucketConfiguration + CreateBucketConfiguration: createBucketConfiguration, } payload = Xml(payloadObject) } var method = 'PUT' var headers = {} - if(makeOpts.ObjectLocking){ - headers["x-amz-bucket-object-lock-enabled"]=true + if (makeOpts.ObjectLocking) { + headers['x-amz-bucket-object-lock-enabled'] = true } if (!region) region = DEFAULT_REGION - const processWithRetry = (err) =>{ - if (err && (region === "" || region === DEFAULT_REGION)) { - if(err.code === "AuthorizationHeaderMalformed" && err.region !== ""){ + const processWithRetry = (err) => { + if (err && (region === '' || region === DEFAULT_REGION)) { + if (err.code === 'AuthorizationHeaderMalformed' && err.region !== '') { // Retry with region returned as part of error - this.makeRequest({method, bucketName, headers}, payload, [200], err.region, false, cb) + this.makeRequest({ method, bucketName, headers }, payload, [200], err.region, false, cb) } else { return cb && cb(err) } } return cb && cb(err) } - this.makeRequest({method, bucketName, headers}, payload, [200], region, false, processWithRetry) + this.makeRequest({ method, bucketName, headers }, payload, [200], region, false, processWithRetry) } // List of buckets created. @@ -662,13 +706,13 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'GET' - this.makeRequest({method}, '', [200], DEFAULT_REGION, true, (e, response) => { + this.makeRequest({ method }, '', [200], DEFAULT_REGION, true, (e, response) => { if (e) return cb(e) var transformer = transformers.getListBucketTransformer() var buckets pipesetup(response, transformer) - .on('data', result => buckets = result) - .on('error', e => cb(e)) + .on('data', (result) => (buckets = result)) + .on('error', (e) => cb(e)) .on('end', () => cb(null, buckets)) }) } @@ -702,7 +746,7 @@ export class Client { var uploadIdMarker = '' var uploads = [] var ended = false - var readStream = Stream.Readable({objectMode: true}) + var readStream = Stream.Readable({ objectMode: true }) readStream._read = () => { // push one upload info per _read() if (uploads.length) { @@ -710,30 +754,34 @@ export class Client { } if (ended) return readStream.push(null) this.listIncompleteUploadsQuery(bucket, prefix, keyMarker, uploadIdMarker, delimiter) - .on('error', e => readStream.emit('error', e)) - .on('data', result => { - result.prefixes.forEach(prefix => uploads.push(prefix)) - async.eachSeries(result.uploads, (upload, cb) => { - // for each incomplete upload add the sizes of its uploaded parts - this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { - if (err) return cb(err) - upload.size = parts.reduce((acc, item) => acc + item.size, 0) - uploads.push(upload) - cb() - }) - }, err => { - if (err) { - readStream.emit('error', err) - return - } - if (result.isTruncated) { - keyMarker = result.nextKeyMarker - uploadIdMarker = result.nextUploadIdMarker - } else { - ended = true + .on('error', (e) => readStream.emit('error', e)) + .on('data', (result) => { + result.prefixes.forEach((prefix) => uploads.push(prefix)) + async.eachSeries( + result.uploads, + (upload, cb) => { + // for each incomplete upload add the sizes of its uploaded parts + this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { + if (err) return cb(err) + upload.size = parts.reduce((acc, item) => acc + item.size, 0) + uploads.push(upload) + cb() + }) + }, + (err) => { + if (err) { + readStream.emit('error', err) + return + } + if (result.isTruncated) { + keyMarker = result.nextKeyMarker + uploadIdMarker = result.nextUploadIdMarker + } else { + ended = true + } + readStream._read() } - readStream._read() - }) + ) }) } return readStream @@ -752,7 +800,7 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'HEAD' - this.makeRequest({method, bucketName}, '', [200], '', false, err => { + this.makeRequest({ method, bucketName }, '', [200], '', false, (err) => { if (err) { if (err.code == 'NoSuchBucket' || err.code == 'NotFound') return cb(null, false) return cb(err) @@ -774,9 +822,9 @@ export class Client { throw new TypeError('callback should be of type "function"') } var method = 'DELETE' - this.makeRequest({method, bucketName}, '', [204], '', false, (e) => { + this.makeRequest({ method, bucketName }, '', [204], '', false, (e) => { // If the bucket was successfully removed, remove the region map entry. - if (!e) delete(this.regionMap[bucketName]) + if (!e) delete this.regionMap[bucketName] cb(e) }) } @@ -799,17 +847,17 @@ export class Client { } var removeUploadId async.during( - cb => { + (cb) => { this.findUploadId(bucketName, objectName, (e, uploadId) => { if (e) return cb(e) removeUploadId = uploadId cb(null, uploadId) }) }, - cb => { + (cb) => { var method = 'DELETE' var query = `uploadId=${removeUploadId}` - this.makeRequest({method, bucketName, objectName, query}, '', [204], '', false, e => cb(e)) + this.makeRequest({ method, bucketName, objectName, query }, '', [204], '', false, (e) => cb(e)) }, cb ) @@ -823,7 +871,7 @@ export class Client { // * `filePath` _string_: path to which the object data will be written to // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err)` _function_: callback is called with `err` in case of error. - fGetObject(bucketName, objectName, filePath, getOpts={}, cb) { + fGetObject(bucketName, objectName, filePath, getOpts = {}, cb) { // Input validation. if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) @@ -850,43 +898,46 @@ export class Client { var objStat // Rename wrapper. - var rename = err => { + var rename = (err) => { if (err) return cb(err) fs.rename(partFile, filePath, cb) } - async.waterfall([ - cb => this.statObject(bucketName, objectName, getOpts, cb), - (result, cb) => { - objStat = result - // Create any missing top level directories. - mkdirp(path.dirname(filePath), cb) - }, - (ignore, cb) => { - partFile = `${filePath}.${objStat.etag}.part.minio` - fs.stat(partFile, (e, stats) => { - var offset = 0 - if (e) { - partFileStream = fs.createWriteStream(partFile, {flags: 'w'}) - } else { - if (objStat.size === stats.size) return rename() - offset = stats.size - partFileStream = fs.createWriteStream(partFile, {flags: 'a'}) - } - this.getPartialObject(bucketName, objectName, offset, 0, getOpts, cb) - }) - }, - (downloadStream, cb) => { - pipesetup(downloadStream, partFileStream) - .on('error', e => cb(e)) - .on('finish', cb) - }, - cb => fs.stat(partFile, cb), - (stats, cb) => { - if (stats.size === objStat.size) return cb() - cb(new Error('Size mismatch between downloaded file and the object')) - } - ], rename) + async.waterfall( + [ + (cb) => this.statObject(bucketName, objectName, getOpts, cb), + (result, cb) => { + objStat = result + // Create any missing top level directories. + mkdirp(path.dirname(filePath), cb) + }, + (ignore, cb) => { + partFile = `${filePath}.${objStat.etag}.part.minio` + fs.stat(partFile, (e, stats) => { + var offset = 0 + if (e) { + partFileStream = fs.createWriteStream(partFile, { flags: 'w' }) + } else { + if (objStat.size === stats.size) return rename() + offset = stats.size + partFileStream = fs.createWriteStream(partFile, { flags: 'a' }) + } + this.getPartialObject(bucketName, objectName, offset, 0, getOpts, cb) + }) + }, + (downloadStream, cb) => { + pipesetup(downloadStream, partFileStream) + .on('error', (e) => cb(e)) + .on('finish', cb) + }, + (cb) => fs.stat(partFile, cb), + (stats, cb) => { + if (stats.size === objStat.size) return cb() + cb(new Error('Size mismatch between downloaded file and the object')) + }, + ], + rename + ) } // Callback is called with readable stream of the object content. @@ -896,7 +947,7 @@ export class Client { // * `objectName` _string_: name of the object // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err, stream)` _function_: callback is called with `err` in case of error. `stream` is the object content stream - getObject(bucketName, objectName, getOpts={}, cb) { + getObject(bucketName, objectName, getOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -924,7 +975,7 @@ export class Client { // * `length` _number_: length of the object that will be read in the stream (optional, if not specified we read the rest of the file from the offset) // * `getOpts` _object_: Version of the object in the form `{versionId:'my-uuid'}`. Default is `{}`. (optional) // * `callback(err, stream)` _function_: callback is called with `err` in case of error. `stream` is the object content stream - getPartialObject(bucketName, objectName, offset, length, getOpts={}, cb) { + getPartialObject(bucketName, objectName, offset, length, getOpts = {}, cb) { if (isFunction(length)) { cb = length length = 0 @@ -960,7 +1011,7 @@ export class Client { offset = 0 } if (length) { - range += `${(+length + offset) - 1}` + range += `${+length + offset - 1}` } } @@ -976,7 +1027,7 @@ export class Client { var method = 'GET' var query = querystring.stringify(getOpts) - this.makeRequest({method, bucketName, objectName, headers, query}, '', expectedStatusCodes, '', true, cb) + this.makeRequest({ method, bucketName, objectName, headers, query }, '', expectedStatusCodes, '', true, cb) } // Uploads the object using contents from a file @@ -1014,126 +1065,130 @@ export class Client { var size var partSize - async.waterfall([ - cb => fs.stat(filePath, cb), - (stats, cb) => { - size = stats.size - var cbTriggered = false - var origCb = cb - cb = function () { - if (cbTriggered) { - return + async.waterfall( + [ + (cb) => fs.stat(filePath, cb), + (stats, cb) => { + size = stats.size + var cbTriggered = false + var origCb = cb + cb = function () { + if (cbTriggered) { + return + } + cbTriggered = true + return origCb.apply(this, arguments) } - cbTriggered = true - return origCb.apply(this, arguments) - } - if (size > this.maxObjectSize) { - return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)) - } - if (size <= this.partSize) { - // simple PUT request, no multipart - var multipart = false - var uploader = this.getUploader(bucketName, objectName, metaData, multipart) - var hash = transformers.getHashSummer(this.enableSHA256) - var start = 0 - var end = size - 1 - var autoClose = true - if (size === 0) end = 0 - var options = {start, end, autoClose} - pipesetup(fs.createReadStream(filePath, options), hash) - .on('data', data => { - var md5sum = data.md5sum - var sha256sum = data.sha256sum - var stream = fs.createReadStream(filePath, options) - uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { - callback(err, objInfo) - cb(true) - }) - }) - .on('error', e => cb(e)) - return - } - this.findUploadId(bucketName, objectName, cb) - }, - (uploadId, cb) => { - // if there was a previous incomplete upload, fetch all its uploaded parts info - if (uploadId) return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) - // there was no previous upload, initiate a new one - this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])) - }, - (uploadId, etags, cb) => { - partSize = this.calculatePartSize(size) - var multipart = true - var uploader = this.getUploader(bucketName, objectName, metaData, multipart) - - // convert array to object to make things easy - var parts = etags.reduce(function(acc, item) { - if (!acc[item.part]) { - acc[item.part] = item + if (size > this.maxObjectSize) { + return cb(new Error(`${filePath} size : ${stats.size}, max allowed size : 5TB`)) } - return acc - }, {}) - var partsDone = [] - var partNumber = 1 - var uploadedSize = 0 - async.whilst( - cb => { cb(null, uploadedSize < size) }, - cb => { - var cbTriggered = false - var origCb = cb - cb = function () { - if (cbTriggered) { - return - } - cbTriggered = true - return origCb.apply(this, arguments) - } - var part = parts[partNumber] + if (size <= this.partSize) { + // simple PUT request, no multipart + var multipart = false + var uploader = this.getUploader(bucketName, objectName, metaData, multipart) var hash = transformers.getHashSummer(this.enableSHA256) - var length = partSize - if (length > (size - uploadedSize)) { - length = size - uploadedSize - } - var start = uploadedSize - var end = uploadedSize + length - 1 + var start = 0 + var end = size - 1 var autoClose = true - var options = {autoClose, start, end} - // verify md5sum of each part + if (size === 0) end = 0 + var options = { start, end, autoClose } pipesetup(fs.createReadStream(filePath, options), hash) - .on('data', data => { - var md5sumHex = (Buffer.from(data.md5sum, 'base64')).toString('hex') - if (part && (md5sumHex === part.etag)) { - // md5 matches, chunk already uploaded - partsDone.push({part: partNumber, etag: part.etag}) - partNumber++ - uploadedSize += length - return cb() - } - // part is not uploaded yet, or md5 mismatch + .on('data', (data) => { + var md5sum = data.md5sum + var sha256sum = data.sha256sum var stream = fs.createReadStream(filePath, options) - uploader(uploadId, partNumber, stream, length, - data.sha256sum, data.md5sum, (e, objInfo) => { - if (e) return cb(e) - partsDone.push({part: partNumber, etag: objInfo.etag}) - partNumber++ - uploadedSize += length - return cb() - }) + uploader(stream, size, sha256sum, md5sum, (err, objInfo) => { + callback(err, objInfo) + cb(true) + }) }) - .on('error', e => cb(e)) - }, - e => { - if (e) return cb(e) - cb(null, partsDone, uploadId) + .on('error', (e) => cb(e)) + return } - ) - }, - // all parts uploaded, complete the multipart upload - (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb) - ], (err, ...rest) => { - if (err === true) return - callback(err, ...rest) - }) + this.findUploadId(bucketName, objectName, cb) + }, + (uploadId, cb) => { + // if there was a previous incomplete upload, fetch all its uploaded parts info + if (uploadId) return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) + // there was no previous upload, initiate a new one + this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])) + }, + (uploadId, etags, cb) => { + partSize = this.calculatePartSize(size) + var multipart = true + var uploader = this.getUploader(bucketName, objectName, metaData, multipart) + + // convert array to object to make things easy + var parts = etags.reduce(function (acc, item) { + if (!acc[item.part]) { + acc[item.part] = item + } + return acc + }, {}) + var partsDone = [] + var partNumber = 1 + var uploadedSize = 0 + async.whilst( + (cb) => { + cb(null, uploadedSize < size) + }, + (cb) => { + var cbTriggered = false + var origCb = cb + cb = function () { + if (cbTriggered) { + return + } + cbTriggered = true + return origCb.apply(this, arguments) + } + var part = parts[partNumber] + var hash = transformers.getHashSummer(this.enableSHA256) + var length = partSize + if (length > size - uploadedSize) { + length = size - uploadedSize + } + var start = uploadedSize + var end = uploadedSize + length - 1 + var autoClose = true + var options = { autoClose, start, end } + // verify md5sum of each part + pipesetup(fs.createReadStream(filePath, options), hash) + .on('data', (data) => { + var md5sumHex = Buffer.from(data.md5sum, 'base64').toString('hex') + if (part && md5sumHex === part.etag) { + // md5 matches, chunk already uploaded + partsDone.push({ part: partNumber, etag: part.etag }) + partNumber++ + uploadedSize += length + return cb() + } + // part is not uploaded yet, or md5 mismatch + var stream = fs.createReadStream(filePath, options) + uploader(uploadId, partNumber, stream, length, data.sha256sum, data.md5sum, (e, objInfo) => { + if (e) return cb(e) + partsDone.push({ part: partNumber, etag: objInfo.etag }) + partNumber++ + uploadedSize += length + return cb() + }) + }) + .on('error', (e) => cb(e)) + }, + (e) => { + if (e) return cb(e) + cb(null, partsDone, uploadId) + } + ) + }, + // all parts uploaded, complete the multipart upload + (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb), + ], + (err, ...rest) => { + if (err === true) return + callback(err, ...rest) + } + ) } // Uploads the object. @@ -1197,15 +1252,14 @@ export class Client { // Get the part size and forward that to the BlockStream. Default to the // largest block size possible if necessary. - if (!isNumber(size)) - size = this.maxObjectSize + if (!isNumber(size)) size = this.maxObjectSize size = this.calculatePartSize(size) // s3 requires that all non-end chunks be at least `this.partSize`, // so we chunk the stream until we hit either that size or the end before // we flush it to s3. - let chunker = new BlockStream2({size, zeroPadding: false}) + let chunker = new BlockStream2({ size, zeroPadding: false }) // This is a Writable stream that can be written to in order to upload // to the specified bucket and object automatically. @@ -1243,7 +1297,7 @@ export class Client { if (!isString(srcObject)) { throw new TypeError('srcObject should be of type "string"') } - if (srcObject === "") { + if (srcObject === '') { throw new errors.InvalidPrefixError(`Empty source prefix`) } @@ -1255,49 +1309,48 @@ export class Client { headers['x-amz-copy-source'] = uriResourceEscape(srcObject) if (conditions !== null) { - if (conditions.modified !== "") { + if (conditions.modified !== '') { headers['x-amz-copy-source-if-modified-since'] = conditions.modified } - if (conditions.unmodified !== "") { + if (conditions.unmodified !== '') { headers['x-amz-copy-source-if-unmodified-since'] = conditions.unmodified } - if (conditions.matchETag !== "") { + if (conditions.matchETag !== '') { headers['x-amz-copy-source-if-match'] = conditions.matchETag } - if (conditions.matchEtagExcept !== "") { + if (conditions.matchEtagExcept !== '') { headers['x-amz-copy-source-if-none-match'] = conditions.matchETagExcept } } var method = 'PUT' - this.makeRequest({method, bucketName, objectName, headers}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) - .on('error', e => cb(e)) - .on('data', data => cb(null, data)) + .on('error', (e) => cb(e)) + .on('data', (data) => cb(null, data)) }) } /** - * Internal Method to perform copy of an object. - * @param sourceConfig __object__ instance of CopySourceOptions @link ./helpers/CopySourceOptions - * @param destConfig __object__ instance of CopyDestinationOptions @link ./helpers/CopyDestinationOptions - * @param cb __function__ called with null if there is an error - * @returns Promise if no callack is passed. - */ - copyObjectV2(sourceConfig, destConfig, cb){ - - if(!(sourceConfig instanceof CopySourceOptions )){ + * Internal Method to perform copy of an object. + * @param sourceConfig __object__ instance of CopySourceOptions @link ./helpers/CopySourceOptions + * @param destConfig __object__ instance of CopyDestinationOptions @link ./helpers/CopyDestinationOptions + * @param cb __function__ called with null if there is an error + * @returns Promise if no callack is passed. + */ + copyObjectV2(sourceConfig, destConfig, cb) { + if (!(sourceConfig instanceof CopySourceOptions)) { throw new errors.InvalidArgumentError('sourceConfig should of type CopySourceOptions ') } - if(!(destConfig instanceof CopyDestinationOptions )){ + if (!(destConfig instanceof CopyDestinationOptions)) { throw new errors.InvalidArgumentError('destConfig should of type CopyDestinationOptions ') } - if(!destConfig.validate()){ + if (!destConfig.validate()) { return false } - if(!destConfig.validate()){ + if (!destConfig.validate()) { return false } if (!isFunction(cb)) { @@ -1306,16 +1359,16 @@ export class Client { const headers = Object.assign({}, sourceConfig.getHeaders(), destConfig.getHeaders()) - const bucketName = destConfig.Bucket - const objectName= destConfig.Object + const bucketName = destConfig.Bucket + const objectName = destConfig.Object const method = 'PUT' - this.makeRequest({method, bucketName, objectName, headers}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { if (e) return cb(e) const transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) - .on('error', e => cb(e)) - .on('data', data => { + .on('error', (e) => cb(e)) + .on('data', (data) => { const resHeaders = response.headers const copyObjResponse = { @@ -1323,13 +1376,13 @@ export class Client { Key: destConfig.Object, LastModified: data.LastModified, MetaData: extractMetadata(resHeaders), - VersionId:getVersionId(resHeaders), - SourceVersionId:getSourceVersionId(resHeaders), - Etag:sanitizeETag(resHeaders.etag), - Size: +resHeaders['content-length'] + VersionId: getVersionId(resHeaders), + SourceVersionId: getSourceVersionId(resHeaders), + Etag: sanitizeETag(resHeaders.etag), + Size: +resHeaders['content-length'], } - return cb(null, copyObjResponse) + return cb(null, copyObjResponse) }) }) } @@ -1343,7 +1396,7 @@ export class Client { } // list a batch of objects - listObjectsQuery(bucketName, prefix, marker, listQueryOpts={}) { + listObjectsQuery(bucketName, prefix, marker, listQueryOpts = {}) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1353,11 +1406,7 @@ export class Client { if (!isString(marker)) { throw new TypeError('marker should be of type "string"') } - let{ - Delimiter, - MaxKeys, - IncludeVersion, - } = listQueryOpts + let { Delimiter, MaxKeys, IncludeVersion } = listQueryOpts if (!isObject(listQueryOpts)) { throw new TypeError('listQueryOpts should be of type "object"') @@ -1404,7 +1453,7 @@ export class Client { var method = 'GET' var transformer = transformers.getListObjectsTransformer() - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -1429,7 +1478,7 @@ export class Client { // * `obj.lastModified` _Date_: modified time stamp // * `obj.isDeleteMarker` _boolean_: true if it is a delete marker // * `obj.versionId` _string_: versionId of the object - listObjects(bucketName, prefix, recursive, listOpts={}) { + listObjects(bucketName, prefix, recursive, listOpts = {}) { if (prefix === undefined) prefix = '' if (recursive === undefined) recursive = false if (!isValidBucketName(bucketName)) { @@ -1448,14 +1497,14 @@ export class Client { throw new TypeError('listOpts should be of type "object"') } var marker = '' - const listQueryOpts={ - Delimiter:recursive ? '' : '/', // if recursive is false set delimiter to '/' + const listQueryOpts = { + Delimiter: recursive ? '' : '/', // if recursive is false set delimiter to '/' MaxKeys: 1000, - IncludeVersion:listOpts.IncludeVersion, + IncludeVersion: listOpts.IncludeVersion, } var objects = [] var ended = false - var readStream = Stream.Readable({objectMode: true}) + var readStream = Stream.Readable({ objectMode: true }) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -1465,8 +1514,8 @@ export class Client { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsQuery(bucketName, prefix, marker, listQueryOpts) - .on('error', e => readStream.emit('error', e)) - .on('data', result => { + .on('error', (e) => readStream.emit('error', e)) + .on('data', (result) => { if (result.isTruncated) { marker = result.nextMarker || result.versionIdMarker } else { @@ -1541,7 +1590,7 @@ export class Client { } var method = 'GET' var transformer = transformers.getListObjectsV2Transformer() - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -1587,7 +1636,7 @@ export class Client { var continuationToken = '' var objects = [] var ended = false - var readStream = Stream.Readable({objectMode: true}) + var readStream = Stream.Readable({ objectMode: true }) readStream._read = () => { // push one object per _read() if (objects.length) { @@ -1597,8 +1646,8 @@ export class Client { if (ended) return readStream.push(null) // if there are no objects to push do query for the next batch of objects this.listObjectsV2Query(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) - .on('error', e => readStream.emit('error', e)) - .on('data', result => { + .on('error', (e) => readStream.emit('error', e)) + .on('data', (result) => { if (result.isTruncated) { continuationToken = result.nextContinuationToken } else { @@ -1623,7 +1672,7 @@ export class Client { // * `stat.metaData` _string_: MetaData of the object // * `stat.lastModified` _Date_: modified time stamp // * `stat.versionId` _string_: version id of the object if available - statObject(bucketName, objectName, statOpts={}, cb) { + statObject(bucketName, objectName, statOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1633,10 +1682,10 @@ export class Client { // backward compatibility if (isFunction(statOpts)) { cb = statOpts - statOpts={} + statOpts = {} } - if(!isObject(statOpts)){ + if (!isObject(statOpts)) { throw new errors.InvalidArgumentError('statOpts should be of type "object"') } if (!isFunction(cb)) { @@ -1645,19 +1694,19 @@ export class Client { var query = querystring.stringify(statOpts) var method = 'HEAD' - this.makeRequest({method, bucketName, objectName, query},'' , [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. - response.on('data', ()=>{}) + response.on('data', () => {}) const result = { size: +response.headers['content-length'], metaData: extractMetadata(response.headers), lastModified: new Date(response.headers['last-modified']), - versionId:getVersionId(response.headers), - etag:sanitizeETag(response.headers.etag) + versionId: getVersionId(response.headers), + etag: sanitizeETag(response.headers.etag), } cb(null, result) @@ -1671,7 +1720,7 @@ export class Client { // * `objectName` _string_: name of the object // * `removeOpts` _object_: Version of the object in the form `{versionId:'my-uuid', governanceBypass:true|false, forceDelete:true|false}`. Default is `{}`. (optional) // * `callback(err)` _function_: callback function is called with non `null` value in case of error - removeObject(bucketName, objectName, removeOpts={} , cb) { + removeObject(bucketName, objectName, removeOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1681,10 +1730,10 @@ export class Client { // backward compatibility if (isFunction(removeOpts)) { cb = removeOpts - removeOpts={} + removeOpts = {} } - if(!isObject(removeOpts)){ + if (!isObject(removeOpts)) { throw new errors.InvalidArgumentError('removeOpts should be of type "object"') } if (!isFunction(cb)) { @@ -1693,22 +1742,22 @@ export class Client { const method = 'DELETE' const queryParams = {} - if(removeOpts.versionId){ - queryParams.versionId=`${removeOpts.versionId}` + if (removeOpts.versionId) { + queryParams.versionId = `${removeOpts.versionId}` } const headers = {} - if(removeOpts.governanceBypass){ - headers["X-Amz-Bypass-Governance-Retention"]=true + if (removeOpts.governanceBypass) { + headers['X-Amz-Bypass-Governance-Retention'] = true } - if(removeOpts.forceDelete){ - headers["x-minio-force-delete"]=true + if (removeOpts.forceDelete) { + headers['x-minio-force-delete'] = true } - const query = querystring.stringify( queryParams ) + const query = querystring.stringify(queryParams) - let requestOptions = {method, bucketName, objectName, headers} - if(query){ - requestOptions['query']=query + let requestOptions = { method, bucketName, objectName, headers } + if (query) { + requestOptions['query'] = query } this.makeRequest(requestOptions, '', [200, 204], '', false, cb) @@ -1737,14 +1786,17 @@ export class Client { const query = 'delete' const method = 'POST' - let result = objectsList.reduce((result, entry) => { - result.list.push(entry) - if (result.list.length === maxEntries) { - result.listOfList.push(result.list) - result.list = [] - } - return result - }, {listOfList: [], list:[]}) + let result = objectsList.reduce( + (result, entry) => { + result.list.push(entry) + if (result.list.length === maxEntries) { + result.listOfList.push(result.list) + result.list = [] + } + return result + }, + { listOfList: [], list: [] } + ) if (result.list.length > 0) { result.listOfList.push(result.list) @@ -1752,38 +1804,41 @@ export class Client { const encoder = new TextEncoder() - async.eachSeries(result.listOfList, (list) => { - var objects=[] - list.forEach(function(value){ - if (isObject(value)) { - objects.push({"Key": value.name, "VersionId": value.versionId}) - } else { - objects.push({"Key": value}) - } - }) - let deleteObjects = {"Delete": {"Quiet": true, "Object": objects}} - const builder = new xml2js.Builder({ headless: true }) - let payload = builder.buildObject(deleteObjects) - payload = encoder.encode(payload) - const headers = {} - - headers['Content-MD5'] = toMd5(payload) - - this.makeRequest({ method, bucketName, query, headers}, payload, [200], '', true, (e, response) => { - if (e) return cb(e) - let removeObjectsResult - pipesetup(response, transformers.removeObjectsTransformer()) - .on('data', data => { - removeObjectsResult = data - }) - .on('error', cb) - .on('end', () => { - cb(null, removeObjectsResult) - }) - }) - }, cb) - } + async.eachSeries( + result.listOfList, + (list) => { + var objects = [] + list.forEach(function (value) { + if (isObject(value)) { + objects.push({ Key: value.name, VersionId: value.versionId }) + } else { + objects.push({ Key: value }) + } + }) + let deleteObjects = { Delete: { Quiet: true, Object: objects } } + const builder = new xml2js.Builder({ headless: true }) + let payload = builder.buildObject(deleteObjects) + payload = encoder.encode(payload) + const headers = {} + + headers['Content-MD5'] = toMd5(payload) + this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', true, (e, response) => { + if (e) return cb(e) + let removeObjectsResult + pipesetup(response, transformers.removeObjectsTransformer()) + .on('data', (data) => { + removeObjectsResult = data + }) + .on('error', cb) + .on('end', () => { + cb(null, removeObjectsResult) + }) + }) + }, + cb + ) + } // Get the policy on a bucket or an object prefix. // @@ -1801,12 +1856,12 @@ export class Client { let method = 'GET' let query = 'policy' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let policy = Buffer.from('') pipesetup(response, transformers.getConcater()) - .on('data', data => policy = data) + .on('data', (data) => (policy = data)) .on('error', cb) .on('end', () => { cb(null, policy.toString()) @@ -1839,7 +1894,7 @@ export class Client { method = 'PUT' } - this.makeRequest({method, bucketName, query}, policy, [204], '', false, cb) + this.makeRequest({ method, bucketName, query }, policy, [204], '', false, cb) } // Generate a generic presigned URL which can be @@ -1889,16 +1944,19 @@ export class Client { // This statement is added to ensure that we send error through // callback on presign failure. var url - var reqOptions = this.getRequestOptions({method, - region, - bucketName, - objectName, - query}) + var reqOptions = this.getRequestOptions({ method, region, bucketName, objectName, query }) this.checkAndRefreshCreds() try { - url = presignSignatureV4(reqOptions, this.accessKey, this.secretKey, - this.sessionToken, region, requestDate, expires) + url = presignSignatureV4( + reqOptions, + this.accessKey, + this.secretKey, + this.sessionToken, + region, + requestDate, + expires + ) } catch (pe) { return cb(pe) } @@ -1928,10 +1986,16 @@ export class Client { requestDate = new Date() } - var validRespHeaders = ['response-content-type', 'response-content-language', 'response-expires', 'response-cache-control', - 'response-content-disposition', 'response-content-encoding'] - validRespHeaders.forEach(header => { - if (respHeaders !== undefined && respHeaders[header] !== undefined && !isString(respHeaders[header])) { + var validRespHeaders = [ + 'response-content-type', + 'response-content-language', + 'response-expires', + 'response-cache-control', + 'response-content-disposition', + 'response-content-encoding', + ] + validRespHeaders.forEach((header) => { + if (respHeaders !== undefined && respHeaders[header] !== undefined && !isString(respHeaders[header])) { throw new TypeError(`response header ${header} should be of type "string"`) } }) @@ -1993,8 +2057,8 @@ export class Client { postPolicy.policy.conditions.push(['eq', '$x-amz-algorithm', 'AWS4-HMAC-SHA256']) postPolicy.formData['x-amz-algorithm'] = 'AWS4-HMAC-SHA256' - postPolicy.policy.conditions.push(["eq", "$x-amz-credential", this.accessKey + "/" + getScope(region, date)]) - postPolicy.formData['x-amz-credential'] = this.accessKey + "/" + getScope(region, date) + postPolicy.policy.conditions.push(['eq', '$x-amz-credential', this.accessKey + '/' + getScope(region, date)]) + postPolicy.formData['x-amz-credential'] = this.accessKey + '/' + getScope(region, date) if (this.sessionToken) { postPolicy.policy.conditions.push(['eq', '$x-amz-security-token', this.sessionToken]) @@ -2012,9 +2076,9 @@ export class Client { opts.region = region opts.bucketName = postPolicy.formData.bucket var reqOptions = this.getRequestOptions(opts) - var portStr = (this.port == 80 || this.port === 443) ? '' : `:${this.port.toString()}` + var portStr = this.port == 80 || this.port === 443 ? '' : `:${this.port.toString()}` var urlStr = `${reqOptions.protocol}//${reqOptions.host}${portStr}${reqOptions.path}` - cb(null, {postURL: urlStr,formData: postPolicy.formData}) + cb(null, { postURL: urlStr, formData: postPolicy.formData }) }) } @@ -2034,12 +2098,12 @@ export class Client { var method = 'POST' let headers = Object.assign({}, metaData) var query = 'uploads' - this.makeRequest({method, bucketName, objectName, query, headers}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query, headers }, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getInitiateMultipartTransformer() pipesetup(response, transformer) - .on('error', e => cb(e)) - .on('data', uploadId => cb(null, uploadId)) + .on('error', (e) => cb(e)) + .on('data', (uploadId) => cb(null, uploadId)) }) } @@ -2071,32 +2135,35 @@ export class Client { var parts = [] - etags.forEach(element => { + etags.forEach((element) => { parts.push({ - Part: [{ - PartNumber: element.part - }, { - ETag: element.etag - }] + Part: [ + { + PartNumber: element.part, + }, + { + ETag: element.etag, + }, + ], }) }) - var payloadObject = {CompleteMultipartUpload: parts} + var payloadObject = { CompleteMultipartUpload: parts } var payload = Xml(payloadObject) - this.makeRequest({method, bucketName, objectName, query}, payload, [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getCompleteMultipartTransformer() pipesetup(response, transformer) - .on('error', e => cb(e)) - .on('data', result => { + .on('error', (e) => cb(e)) + .on('data', (result) => { if (result.errCode) { // Multipart Complete API returns an error XML after a 200 http status cb(new errors.S3Error(result.errMessage)) } else { const completeMultipartResult = { etag: result.etag, - versionId:getVersionId(response.headers) + versionId: getVersionId(response.headers), } cb(null, completeMultipartResult) } @@ -2163,12 +2230,12 @@ export class Client { query += `uploadId=${uriEscape(uploadId)}` var method = 'GET' - this.makeRequest({method, bucketName, objectName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getListPartsTransformer() pipesetup(response, transformer) - .on('error', e => cb(e)) - .on('data', data => cb(null, data)) + .on('error', (e) => cb(e)) + .on('data', (data) => cb(null, data)) }) } @@ -2211,7 +2278,7 @@ export class Client { } var method = 'GET' var transformer = transformers.getListMultipartTransformer() - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return transformer.emit('error', e) pipesetup(response, transformer) }) @@ -2232,12 +2299,11 @@ export class Client { var latestUpload var listNext = (keyMarker, uploadIdMarker) => { this.listIncompleteUploadsQuery(bucketName, objectName, keyMarker, uploadIdMarker, '') - .on('error', e => cb(e)) - .on('data', result => { - result.uploads.forEach(upload => { + .on('error', (e) => cb(e)) + .on('data', (result) => { + result.uploads.forEach((upload) => { if (upload.key === objectName) { - if (!latestUpload || - (upload.initiated.getTime() > latestUpload.initiated.getTime())) { + if (!latestUpload || upload.initiated.getTime() > latestUpload.initiated.getTime()) { latestUpload = upload return } @@ -2312,24 +2378,31 @@ export class Client { } var upload = (query, stream, length, sha256sum, md5sum, cb) => { var method = 'PUT' - let headers = {'Content-Length': length} + let headers = { 'Content-Length': length } if (!multipart) { headers = Object.assign({}, metaData, headers) } if (!this.enableSHA256) headers['Content-MD5'] = md5sum - this.makeRequestStream({method, bucketName, objectName, query, headers}, - stream, sha256sum, [200], '', true, (e, response) => { - if (e) return cb(e) - const result = { - etag: sanitizeETag(response.headers.etag), - versionId:getVersionId(response.headers) - } - // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) - response.on('data', () => {}) - cb(null, result) - }) + this.makeRequestStream( + { method, bucketName, objectName, query, headers }, + stream, + sha256sum, + [200], + '', + true, + (e, response) => { + if (e) return cb(e) + const result = { + etag: sanitizeETag(response.headers.etag), + versionId: getVersionId(response.headers), + } + // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) + response.on('data', () => {}) + cb(null, result) + } + ) } if (multipart) { return multipartUploader @@ -2350,9 +2423,13 @@ export class Client { } var method = 'PUT' var query = 'notification' - var builder = new xml2js.Builder({rootName:'NotificationConfiguration', renderOpts:{'pretty':false}, headless:true}) + var builder = new xml2js.Builder({ + rootName: 'NotificationConfiguration', + renderOpts: { pretty: false }, + headless: true, + }) var payload = builder.buildObject(config) - this.makeRequest({method, bucketName, query}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, query }, payload, [200], '', false, cb) } removeAllBucketNotification(bucketName, cb) { @@ -2370,13 +2447,13 @@ export class Client { } var method = 'GET' var query = 'notification' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) var transformer = transformers.getBucketNotificationTransformer() var bucketNotification pipesetup(response, transformer) - .on('data', result => bucketNotification = result) - .on('error', e => cb(e)) + .on('data', (result) => (bucketNotification = result)) + .on('error', (e) => cb(e)) .on('end', () => cb(null, bucketNotification)) }) } @@ -2401,7 +2478,7 @@ export class Client { return listener } - getBucketVersioning(bucketName,cb) { + getBucketVersioning(bucketName, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2409,14 +2486,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } var method = 'GET' - var query = "versioning" + var query = 'versioning' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let versionConfig = Buffer.from('') pipesetup(response, transformers.bucketVersioningTransformer()) - .on('data', data => { + .on('data', (data) => { versionConfig = data }) .on('error', cb) @@ -2426,11 +2503,11 @@ export class Client { }) } - setBucketVersioning(bucketName,versionConfig, cb) { + setBucketVersioning(bucketName, versionConfig, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if(!Object.keys(versionConfig).length){ + if (!Object.keys(versionConfig).length) { throw new errors.InvalidArgumentError('versionConfig should be of type "object"') } if (!isFunction(cb)) { @@ -2438,57 +2515,59 @@ export class Client { } var method = 'PUT' - var query = "versioning" - var builder = new xml2js.Builder({rootName:'VersioningConfiguration', renderOpts:{'pretty':false}, headless:true}) + var query = 'versioning' + var builder = new xml2js.Builder({ + rootName: 'VersioningConfiguration', + renderOpts: { pretty: false }, + headless: true, + }) var payload = builder.buildObject(versionConfig) - this.makeRequest({method, bucketName, query}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, query }, payload, [200], '', false, cb) } /** To set Tags on a bucket or object based on the params - * __Arguments__ - * taggingParams _object_ Which contains the following properties - * bucketName _string_, - * objectName _string_ (Optional), - * tags _object_ of the form {'':'','':''} - * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, - * cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. - */ - setTagging(taggingParams){ - - const { bucketName, objectName, tags, putOpts={}, cb} = taggingParams + * __Arguments__ + * taggingParams _object_ Which contains the following properties + * bucketName _string_, + * objectName _string_ (Optional), + * tags _object_ of the form {'':'','':''} + * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, + * cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. + */ + setTagging(taggingParams) { + const { bucketName, objectName, tags, putOpts = {}, cb } = taggingParams const method = 'PUT' - let query ="tagging" + let query = 'tagging' - if(putOpts && putOpts.versionId){ - query =`${query}&versionId=${putOpts.versionId}` + if (putOpts && putOpts.versionId) { + query = `${query}&versionId=${putOpts.versionId}` } - const tagsList=[] + const tagsList = [] for (const [key, value] of Object.entries(tags)) { - tagsList.push( { Key: key, Value: value} ) + tagsList.push({ Key: key, Value: value }) } const taggingConfig = { Tagging: { TagSet: { - Tag: tagsList - } - } + Tag: tagsList, + }, + }, } const encoder = new TextEncoder() - const headers ={} - const builder = new xml2js.Builder({ headless:true,renderOpts:{'pretty':false},}) + const headers = {} + const builder = new xml2js.Builder({ headless: true, renderOpts: { pretty: false } }) let payload = builder.buildObject(taggingConfig) payload = encoder.encode(payload) headers['Content-MD5'] = toMd5(payload) const requestOptions = { method, bucketName, query, headers } - if(objectName){ - requestOptions['objectName']=objectName + if (objectName) { + requestOptions['objectName'] = objectName } headers['Content-MD5'] = toMd5(payload) this.makeRequest(requestOptions, payload, [200], '', false, cb) - } /** Set Tags on a Bucket @@ -2497,21 +2576,21 @@ export class Client { * tags _object_ of the form {'':'','':''} * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setBucketTagging(bucketName,tags,cb){ + setBucketTagging(bucketName, tags, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if(!isObject(tags)){ + if (!isObject(tags)) { throw new errors.InvalidArgumentError('tags should be of type "object"') } - if(Object.keys(tags).length > 10){ + if (Object.keys(tags).length > 10) { throw new errors.InvalidArgumentError('maximum tags allowed is 10"') } if (!isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } - return this.setTagging({bucketName, tags, cb}) + return this.setTagging({ bucketName, tags, cb }) } /** Set Tags on an Object @@ -2522,7 +2601,7 @@ export class Client { * putOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setObjectTagging(bucketName, objectName, tags, putOpts={}, cb){ + setObjectTagging(bucketName, objectName, tags, putOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2530,22 +2609,22 @@ export class Client { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if(isFunction(putOpts)){ - cb=putOpts - putOpts={} + if (isFunction(putOpts)) { + cb = putOpts + putOpts = {} } - if(!isObject(tags)){ + if (!isObject(tags)) { throw new errors.InvalidArgumentError('tags should be of type "object"') } - if(Object.keys(tags).length > 10){ + if (Object.keys(tags).length > 10) { throw new errors.InvalidArgumentError('Maximum tags allowed is 10"') } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - return this.setTagging({bucketName, objectName, tags, putOpts, cb}) + return this.setTagging({ bucketName, objectName, tags, putOpts, cb }) } /** Remove Tags on an Bucket/Object based on params @@ -2555,12 +2634,12 @@ export class Client { * removeOpts _object_ (Optional) e.g {versionId:"my-object-version-id"}, * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeTagging({bucketName, objectName, removeOpts, cb}){ + removeTagging({ bucketName, objectName, removeOpts, cb }) { const method = 'DELETE' - let query ="tagging" + let query = 'tagging' if (removeOpts && Object.keys(removeOpts).length && removeOpts.versionId) { - query =`${query}&versionId=${removeOpts.versionId}` + query = `${query}&versionId=${removeOpts.versionId}` } const requestOptions = { method, bucketName, objectName, query } @@ -2575,14 +2654,14 @@ export class Client { * bucketName _string_ * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeBucketTagging(bucketName, cb){ + removeBucketTagging(bucketName, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - return this.removeTagging({bucketName, cb}) + return this.removeTagging({ bucketName, cb }) } /** Remove tags associated with an object @@ -2592,19 +2671,18 @@ export class Client { * removeOpts _object_ (Optional) e.g. {VersionID:"my-object-version-id"} * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeObjectTagging(bucketName, objectName, removeOpts, cb){ - + removeObjectTagging(bucketName, objectName, removeOpts, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isValidObjectName(objectName)) { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if(isFunction(removeOpts)){ - cb=removeOpts - removeOpts={} + if (isFunction(removeOpts)) { + cb = removeOpts + removeOpts = {} } - if(removeOpts && Object.keys(removeOpts).length && !isObject(removeOpts)){ + if (removeOpts && Object.keys(removeOpts).length && !isObject(removeOpts)) { throw new errors.InvalidArgumentError('removeOpts should be of type "object"') } @@ -2612,7 +2690,7 @@ export class Client { throw new TypeError('callback should be of type "function"') } - return this.removeTagging({bucketName, objectName, removeOpts, cb}) + return this.removeTagging({ bucketName, objectName, removeOpts, cb }) } /** Get Tags associated with a Bucket @@ -2620,9 +2698,9 @@ export class Client { * bucketName _string_ * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - getBucketTagging(bucketName, cb){ + getBucketTagging(bucketName, cb) { const method = 'GET' - const query ="tagging" + const query = 'tagging' const requestOptions = { method, bucketName, query } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2630,8 +2708,8 @@ export class Client { if (e) return cb(e) let tagsList pipesetup(response, transformer) - .on('data', result => tagsList = result) - .on('error', e => cb(e)) + .on('data', (result) => (tagsList = result)) + .on('error', (e) => cb(e)) .on('end', () => cb(null, tagsList)) }) } @@ -2642,33 +2720,33 @@ export class Client { * getOpts _object_ (Optional) e.g {versionId:"my-object-version-id"} * `cb(error, tags)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - getObjectTagging(bucketName, objectName, getOpts={}, cb=()=>false){ + getObjectTagging(bucketName, objectName, getOpts = {}, cb = () => false) { const method = 'GET' - let query ="tagging" + let query = 'tagging' - if(!isValidBucketName(bucketName)) { + if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if(!isValidObjectName(objectName)) { + if (!isValidObjectName(objectName)) { throw new errors.InvalidBucketNameError('Invalid object name: ' + objectName) } - if(isFunction(getOpts)){ - cb=getOpts - getOpts={} + if (isFunction(getOpts)) { + cb = getOpts + getOpts = {} } - if(!isObject(getOpts)){ + if (!isObject(getOpts)) { throw new errors.InvalidArgumentError('getOpts should be of type "object"') } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - if(getOpts && getOpts.versionId){ - query =`${query}&versionId=${getOpts.versionId}` + if (getOpts && getOpts.versionId) { + query = `${query}&versionId=${getOpts.versionId}` } const requestOptions = { method, bucketName, query } - if(objectName){ - requestOptions['objectName']=objectName + if (objectName) { + requestOptions['objectName'] = objectName } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2676,11 +2754,10 @@ export class Client { if (e) return cb(e) let tagsList pipesetup(response, transformer) - .on('data', result => tagsList = result) - .on('error', e => cb(e)) + .on('data', (result) => (tagsList = result)) + .on('error', (e) => cb(e)) .on('end', () => cb(null, tagsList)) }) - } /** Put lifecycle configuration on a bucket. @@ -2689,13 +2766,17 @@ export class Client { * policyConfig _object_ a valid policy configuration object. * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - applyBucketLifecycle(bucketName, policyConfig, cb){ + applyBucketLifecycle(bucketName, policyConfig, cb) { const method = 'PUT' - const query="lifecycle" + const query = 'lifecycle' const encoder = new TextEncoder() - const headers ={} - const builder = new xml2js.Builder({ rootName:'LifecycleConfiguration', headless:true, renderOpts:{'pretty':false},}) + const headers = {} + const builder = new xml2js.Builder({ + rootName: 'LifecycleConfiguration', + headless: true, + renderOpts: { pretty: false }, + }) let payload = builder.buildObject(policyConfig) payload = encoder.encode(payload) const requestOptions = { method, bucketName, query, headers } @@ -2708,13 +2789,13 @@ export class Client { * bucketName _string_ * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - removeBucketLifecycle(bucketName, cb){ + removeBucketLifecycle(bucketName, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'DELETE' - const query="lifecycle" - this.makeRequest({method, bucketName, query}, '', [204], '', false, cb) + const query = 'lifecycle' + this.makeRequest({ method, bucketName, query }, '', [204], '', false, cb) } /** Set/Override lifecycle configuration on a bucket. if the configuration is empty, it removes the configuration. @@ -2722,13 +2803,13 @@ export class Client { * lifeCycleConfig _object_ one of the following values: (null or '') to remove the lifecycle configuration. or a valid lifecycle configuration * `cb(error)` _function_ - callback function with `err` as the error argument. `err` is null if the operation is successful. */ - setBucketLifecycle(bucketName, lifeCycleConfig=null, cb){ + setBucketLifecycle(bucketName, lifeCycleConfig = null, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if(_.isEmpty(lifeCycleConfig)){ + if (_.isEmpty(lifeCycleConfig)) { this.removeBucketLifecycle(bucketName, cb) - }else { + } else { this.applyBucketLifecycle(bucketName, lifeCycleConfig, cb) } } @@ -2737,12 +2818,12 @@ export class Client { * bucketName _string_ * `cb(config)` _function_ - callback function with lifecycle configuration as the error argument. */ - getBucketLifecycle(bucketName, cb){ + getBucketLifecycle(bucketName, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'GET' - const query ="lifecycle" + const query = 'lifecycle' const requestOptions = { method, bucketName, query } this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { @@ -2750,15 +2831,13 @@ export class Client { if (e) return cb(e) let lifecycleConfig pipesetup(response, transformer) - .on('data', result => lifecycleConfig = result) - .on('error', e => cb(e)) + .on('data', (result) => (lifecycleConfig = result)) + .on('error', (e) => cb(e)) .on('end', () => cb(null, lifecycleConfig)) }) - } - setObjectLockConfig(bucketName, lockConfigOpts={}, cb) { - + setObjectLockConfig(bucketName, lockConfigOpts = {}, cb) { const retentionModes = [RETENTION_MODES.COMPLIANCE, RETENTION_MODES.GOVERNANCE] const validUnits = [RETENTION_VALIDITY_UNITS.DAYS, RETENTION_VALIDITY_UNITS.YEARS] @@ -2769,27 +2848,29 @@ export class Client { if (lockConfigOpts.mode && !retentionModes.includes(lockConfigOpts.mode)) { throw new TypeError(`lockConfigOpts.mode should be one of ${retentionModes}`) } - if (lockConfigOpts.unit && !validUnits.includes(lockConfigOpts.unit)){ + if (lockConfigOpts.unit && !validUnits.includes(lockConfigOpts.unit)) { throw new TypeError(`lockConfigOpts.unit should be one of ${validUnits}`) } - if (lockConfigOpts.validity && !isNumber(lockConfigOpts.validity)){ + if (lockConfigOpts.validity && !isNumber(lockConfigOpts.validity)) { throw new TypeError(`lockConfigOpts.validity should be a number`) } const method = 'PUT' - const query = "object-lock" + const query = 'object-lock' - let config={ - ObjectLockEnabled:"Enabled" + let config = { + ObjectLockEnabled: 'Enabled', } const configKeys = Object.keys(lockConfigOpts) // Check if keys are present and all keys are present. - if(configKeys.length > 0){ - if(_.difference(configKeys, ['unit','mode','validity']).length !== 0){ - throw new TypeError(`lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.`) + if (configKeys.length > 0) { + if (_.difference(configKeys, ['unit', 'mode', 'validity']).length !== 0) { + throw new TypeError( + `lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.` + ) } else { - config.Rule={ - DefaultRetention:{} + config.Rule = { + DefaultRetention: {}, } if (lockConfigOpts.mode) { config.Rule.DefaultRetention.Mode = lockConfigOpts.mode @@ -2802,13 +2883,17 @@ export class Client { } } - const builder = new xml2js.Builder({rootName:'ObjectLockConfiguration', renderOpts:{'pretty':false}, headless:true}) + const builder = new xml2js.Builder({ + rootName: 'ObjectLockConfiguration', + renderOpts: { pretty: false }, + headless: true, + }) const payload = builder.buildObject(config) const headers = {} - headers['Content-MD5'] =toMd5(payload) + headers['Content-MD5'] = toMd5(payload) - this.makeRequest({method, bucketName, query, headers}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) } getObjectLockConfig(bucketName, cb) { @@ -2819,14 +2904,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = "object-lock" + const query = 'object-lock' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let objectLockConfig = Buffer.from('') pipesetup(response, transformers.objectLockTransformer()) - .on('data', data => { + .on('data', (data) => { objectLockConfig = data }) .on('error', cb) @@ -2836,7 +2921,7 @@ export class Client { }) } - putObjectRetention(bucketName, objectName, retentionOpts={}, cb) { + putObjectRetention(bucketName, objectName, retentionOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -2847,16 +2932,19 @@ export class Client { throw new errors.InvalidArgumentError('retentionOpts should be of type "object"') } else { if (retentionOpts.governanceBypass && !isBoolean(retentionOpts.governanceBypass)) { - throw new errors.InvalidArgumentError('Invalid value for governanceBypass',retentionOpts.governanceBypass) + throw new errors.InvalidArgumentError('Invalid value for governanceBypass', retentionOpts.governanceBypass) } - if (retentionOpts.mode && ![RETENTION_MODES.COMPLIANCE,RETENTION_MODES.GOVERNANCE].includes((retentionOpts.mode))) { + if ( + retentionOpts.mode && + ![RETENTION_MODES.COMPLIANCE, RETENTION_MODES.GOVERNANCE].includes(retentionOpts.mode) + ) { throw new errors.InvalidArgumentError('Invalid object retention mode ', retentionOpts.mode) } if (retentionOpts.retainUntilDate && !isString(retentionOpts.retainUntilDate)) { - throw new errors.InvalidArgumentError('Invalid value for retainUntilDate',retentionOpts.retainUntilDate) + throw new errors.InvalidArgumentError('Invalid value for retainUntilDate', retentionOpts.retainUntilDate) } if (retentionOpts.versionId && !isString(retentionOpts.versionId)) { - throw new errors.InvalidArgumentError('Invalid value for versionId',retentionOpts.versionId) + throw new errors.InvalidArgumentError('Invalid value for versionId', retentionOpts.versionId) } } if (!isFunction(cb)) { @@ -2864,59 +2952,59 @@ export class Client { } const method = 'PUT' - let query = "retention" + let query = 'retention' const headers = {} - if(retentionOpts.governanceBypass){ - headers["X-Amz-Bypass-Governance-Retention"]=true + if (retentionOpts.governanceBypass) { + headers['X-Amz-Bypass-Governance-Retention'] = true } - const builder = new xml2js.Builder({rootName:'Retention', renderOpts:{'pretty':false}, headless:true}) - const params ={} + const builder = new xml2js.Builder({ rootName: 'Retention', renderOpts: { pretty: false }, headless: true }) + const params = {} - if(retentionOpts.mode){ - params.Mode =retentionOpts.mode + if (retentionOpts.mode) { + params.Mode = retentionOpts.mode } - if(retentionOpts.retainUntilDate){ - params.RetainUntilDate =retentionOpts.retainUntilDate + if (retentionOpts.retainUntilDate) { + params.RetainUntilDate = retentionOpts.retainUntilDate } - if(retentionOpts.versionId){ + if (retentionOpts.versionId) { query += `&versionId=${retentionOpts.versionId}` } let payload = builder.buildObject(params) headers['Content-MD5'] = toMd5(payload) - this.makeRequest({method, bucketName, objectName, query, headers}, payload, [200, 204], '', false, cb) + this.makeRequest({ method, bucketName, objectName, query, headers }, payload, [200, 204], '', false, cb) } - getObjectRetention(bucketName ,objectName, getOpts, cb) { + getObjectRetention(bucketName, objectName, getOpts, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } if (!isValidObjectName(objectName)) { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if(!isObject(getOpts)){ + if (!isObject(getOpts)) { throw new errors.InvalidArgumentError('callback should be of type "object"') - }else if(getOpts.versionId && !isString(getOpts.versionId)){ + } else if (getOpts.versionId && !isString(getOpts.versionId)) { throw new errors.InvalidArgumentError('VersionID should be of type "string"') } if (cb && !isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - let query = "retention" - if(getOpts.versionId){ + let query = 'retention' + if (getOpts.versionId) { query += `&versionId=${getOpts.versionId}` } - this.makeRequest({method, bucketName,objectName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let retentionConfig = Buffer.from('') pipesetup(response, transformers.objectRetentionTransformer()) - .on('data', data => { + .on('data', (data) => { retentionConfig = data }) .on('error', cb) @@ -2926,47 +3014,50 @@ export class Client { }) } - setBucketEncryption(bucketName, encryptionConfig, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } - if(isFunction(encryptionConfig)){ - cb= encryptionConfig + if (isFunction(encryptionConfig)) { + cb = encryptionConfig encryptionConfig = null } - if(!_.isEmpty(encryptionConfig) && encryptionConfig.Rule.length >1){ + if (!_.isEmpty(encryptionConfig) && encryptionConfig.Rule.length > 1) { throw new errors.InvalidArgumentError('Invalid Rule length. Only one rule is allowed.: ' + encryptionConfig.Rule) } if (cb && !isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - let encryptionObj =encryptionConfig - if(_.isEmpty(encryptionConfig)) { - encryptionObj={ - // Default MinIO Server Supported Rule - Rule:[ + let encryptionObj = encryptionConfig + if (_.isEmpty(encryptionConfig)) { + encryptionObj = { + // Default MinIO Server Supported Rule + Rule: [ { ApplyServerSideEncryptionByDefault: { - SSEAlgorithm:"AES256" - } - } - ] - - }} + SSEAlgorithm: 'AES256', + }, + }, + ], + } + } let method = 'PUT' - let query = "encryption" - let builder = new xml2js.Builder({rootName:'ServerSideEncryptionConfiguration', renderOpts:{'pretty':false}, headless:true}) + let query = 'encryption' + let builder = new xml2js.Builder({ + rootName: 'ServerSideEncryptionConfiguration', + renderOpts: { pretty: false }, + headless: true, + }) let payload = builder.buildObject(encryptionObj) const headers = {} - headers['Content-MD5'] =toMd5(payload) + headers['Content-MD5'] = toMd5(payload) - this.makeRequest({method, bucketName, query,headers}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) } getBucketEncryption(bucketName, cb) { @@ -2977,14 +3068,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = "encryption" + const query = 'encryption' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let bucketEncConfig = Buffer.from('') pipesetup(response, transformers.bucketEncryptionTransformer()) - .on('data', data => { + .on('data', (data) => { bucketEncConfig = data }) .on('error', cb) @@ -3001,13 +3092,12 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'DELETE' - const query = "encryption" + const query = 'encryption' - this.makeRequest({method, bucketName, query}, '', [204], '', false, cb) + this.makeRequest({ method, bucketName, query }, '', [204], '', false, cb) } - - setBucketReplication(bucketName, replicationConfig={}, cb) { + setBucketReplication(bucketName, replicationConfig = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3016,7 +3106,7 @@ export class Client { } else { if (_.isEmpty(replicationConfig.role)) { throw new errors.InvalidArgumentError('Role cannot be empty') - }else if (replicationConfig.role && !isString(replicationConfig.role)) { + } else if (replicationConfig.role && !isString(replicationConfig.role)) { throw new errors.InvalidArgumentError('Invalid value for role', replicationConfig.role) } if (_.isEmpty(replicationConfig.rules)) { @@ -3028,23 +3118,23 @@ export class Client { } const method = 'PUT' - let query = "replication" + let query = 'replication' const headers = {} const replicationParamsConfig = { ReplicationConfiguration: { Role: replicationConfig.role, - Rule: replicationConfig.rules - } + Rule: replicationConfig.rules, + }, } - const builder = new xml2js.Builder({ renderOpts:{'pretty':false},headless: true }) + const builder = new xml2js.Builder({ renderOpts: { pretty: false }, headless: true }) let payload = builder.buildObject(replicationParamsConfig) - headers['Content-MD5'] =toMd5(payload) + headers['Content-MD5'] = toMd5(payload) - this.makeRequest({method, bucketName, query, headers}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', false, cb) } getBucketReplication(bucketName, cb) { @@ -3055,14 +3145,14 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - const query = "replication" + const query = 'replication' - this.makeRequest({method, bucketName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let replicationConfig = Buffer.from('') pipesetup(response, transformers.replicationConfigTransformer()) - .on('data', data => { + .on('data', (data) => { replicationConfig = data }) .on('error', cb) @@ -3072,17 +3162,16 @@ export class Client { }) } - removeBucketReplication(bucketName, cb){ + removeBucketReplication(bucketName, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } const method = 'DELETE' - const query="replication" - this.makeRequest({method, bucketName, query}, '', [200, 204], '', false, cb) + const query = 'replication' + this.makeRequest({ method, bucketName, query }, '', [200, 204], '', false, cb) } - - getObjectLegalHold(bucketName, objectName, getOpts={}, cb){ + getObjectLegalHold(bucketName, objectName, getOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3090,35 +3179,34 @@ export class Client { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if(isFunction(getOpts)){ - cb= getOpts + if (isFunction(getOpts)) { + cb = getOpts getOpts = {} } - if (!isObject(getOpts)) { + if (!isObject(getOpts)) { throw new TypeError('getOpts should be of type "Object"') - } else if(Object.keys(getOpts).length> 0 && getOpts.versionId && !isString((getOpts.versionId))){ - throw new TypeError('versionId should be of type string.:',getOpts.versionId ) + } else if (Object.keys(getOpts).length > 0 && getOpts.versionId && !isString(getOpts.versionId)) { + throw new TypeError('versionId should be of type string.:', getOpts.versionId) } - if (!isFunction(cb)) { throw new errors.InvalidArgumentError('callback should be of type "function"') } const method = 'GET' - let query = "legal-hold" + let query = 'legal-hold' - if (getOpts.versionId){ - query +=`&versionId=${getOpts.versionId}` + if (getOpts.versionId) { + query += `&versionId=${getOpts.versionId}` } - this.makeRequest({method, bucketName, objectName, query}, '', [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { if (e) return cb(e) let legalHoldConfig = Buffer.from('') pipesetup(response, transformers.objectLegalHoldTransformer()) - .on('data', data => { + .on('data', (data) => { legalHoldConfig = data }) .on('error', cb) @@ -3126,10 +3214,9 @@ export class Client { cb(null, legalHoldConfig) }) }) - } - setObjectLegalHold(bucketName, objectName, setOpts={}, cb){ + setObjectLegalHold(bucketName, objectName, setOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -3138,22 +3225,21 @@ export class Client { } const defaultOpts = { - status:LEGAL_HOLD_STATUS.ENABLED + status: LEGAL_HOLD_STATUS.ENABLED, } - if(isFunction(setOpts)){ - cb= setOpts - setOpts =defaultOpts + if (isFunction(setOpts)) { + cb = setOpts + setOpts = defaultOpts } if (!isObject(setOpts)) { throw new TypeError('setOpts should be of type "Object"') - }else { - - if(![LEGAL_HOLD_STATUS.ENABLED, LEGAL_HOLD_STATUS.DISABLED].includes((setOpts.status))){ - throw new TypeError('Invalid status: '+setOpts.status ) + } else { + if (![LEGAL_HOLD_STATUS.ENABLED, LEGAL_HOLD_STATUS.DISABLED].includes(setOpts.status)) { + throw new TypeError('Invalid status: ' + setOpts.status) } - if(setOpts.versionId && !setOpts.versionId.length){ - throw new TypeError('versionId should be of type string.:'+ setOpts.versionId ) + if (setOpts.versionId && !setOpts.versionId.length) { + throw new TypeError('versionId should be of type string.:' + setOpts.versionId) } } @@ -3161,315 +3247,307 @@ export class Client { throw new errors.InvalidArgumentError('callback should be of type "function"') } - if( _.isEmpty(setOpts)){ - setOpts={ - defaultOpts + if (_.isEmpty(setOpts)) { + setOpts = { + defaultOpts, } } const method = 'PUT' - let query = "legal-hold" + let query = 'legal-hold' - if (setOpts.versionId){ - query +=`&versionId=${setOpts.versionId}` + if (setOpts.versionId) { + query += `&versionId=${setOpts.versionId}` } - let config={ - Status: setOpts.status + let config = { + Status: setOpts.status, } - const builder = new xml2js.Builder({rootName:'LegalHold', renderOpts:{'pretty':false}, headless:true}) + const builder = new xml2js.Builder({ rootName: 'LegalHold', renderOpts: { pretty: false }, headless: true }) const payload = builder.buildObject(config) const headers = {} headers['Content-MD5'] = toMd5(payload) - this.makeRequest({method, bucketName, objectName, query, headers}, payload, [200], '', false, cb) + this.makeRequest({ method, bucketName, objectName, query, headers }, payload, [200], '', false, cb) } - async setCredentialsProvider(credentialsProvider){ - if(!(credentialsProvider instanceof CredentialProvider)){ - throw new Error("Unable to get credentials. Expected instance of CredentialProvider") + async setCredentialsProvider(credentialsProvider) { + if (!(credentialsProvider instanceof CredentialProvider)) { + throw new Error('Unable to get credentials. Expected instance of CredentialProvider') } this.credentialsProvider = credentialsProvider await this.checkAndRefreshCreds() } - async checkAndRefreshCreds(){ - if(this.credentialsProvider ) { - return await this.fetchCredentials() + async checkAndRefreshCreds() { + if (this.credentialsProvider) { + return await this.fetchCredentials() } } - async fetchCredentials(){ - if(this.credentialsProvider ){ + async fetchCredentials() { + if (this.credentialsProvider) { const credentialsConf = await this.credentialsProvider.getCredentials() - if(credentialsConf) { + if (credentialsConf) { this.accessKey = credentialsConf.getAccessKey() this.secretKey = credentialsConf.getSecretKey() this.sessionToken = credentialsConf.getSessionToken() - }else{ - throw new Error("Unable to get credentials. Expected instance of BaseCredentialsProvider") + } else { + throw new Error('Unable to get credentials. Expected instance of BaseCredentialsProvider') } - }else{ - throw new Error("Unable to get credentials. Expected instance of BaseCredentialsProvider") + } else { + throw new Error('Unable to get credentials. Expected instance of BaseCredentialsProvider') } } /** - * Internal Method to abort a multipart upload request in case of any errors. - * @param bucketName __string__ Bucket Name - * @param objectName __string__ Object Name - * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. - * @param cb __function__ callback function - */ - abortMultipartUpload(bucketName, objectName, uploadId, cb){ + * Internal Method to abort a multipart upload request in case of any errors. + * @param bucketName __string__ Bucket Name + * @param objectName __string__ Object Name + * @param uploadId __string__ id of a multipart upload to cancel during compose object sequence. + * @param cb __function__ callback function + */ + abortMultipartUpload(bucketName, objectName, uploadId, cb) { const method = 'DELETE' - let query =`uploadId=${uploadId}` + let query = `uploadId=${uploadId}` - const requestOptions = { method, bucketName, objectName:objectName, query } + const requestOptions = { method, bucketName, objectName: objectName, query } this.makeRequest(requestOptions, '', [204], '', false, cb) } /** - * Internal method to upload a part during compose object. - * @param partConfig __object__ contains the following. - * bucketName __string__ - * objectName __string__ - * uploadID __string__ - * partNumber __number__ - * headers __object__ - * @param cb called with null incase of error. - */ - uploadPartCopy (partConfig , cb) { - const { - bucketName, objectName, uploadID, partNumber , headers - } = partConfig + * Internal method to upload a part during compose object. + * @param partConfig __object__ contains the following. + * bucketName __string__ + * objectName __string__ + * uploadID __string__ + * partNumber __number__ + * headers __object__ + * @param cb called with null incase of error. + */ + uploadPartCopy(partConfig, cb) { + const { bucketName, objectName, uploadID, partNumber, headers } = partConfig const method = 'PUT' - let query =`uploadId=${uploadID}&partNumber=${partNumber}` - const requestOptions = { method, bucketName, objectName:objectName, query, headers } - return this.makeRequest(requestOptions, '', [200], '', true,(e, response) => { + let query = `uploadId=${uploadID}&partNumber=${partNumber}` + const requestOptions = { method, bucketName, objectName: objectName, query, headers } + return this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { let partCopyResult = Buffer.from('') if (e) return cb(e) pipesetup(response, transformers.uploadPartTransformer()) - .on('data', data => { + .on('data', (data) => { partCopyResult = data }) .on('error', cb) .on('end', () => { let uploadPartCopyRes = { - etag:sanitizeETag(partCopyResult.ETag), - key:objectName, - part:partNumber + etag: sanitizeETag(partCopyResult.ETag), + key: objectName, + part: partNumber, } cb(null, uploadPartCopyRes) }) - } - ) + }) } - composeObject (destObjConfig={}, sourceObjList=[], cb){ + composeObject(destObjConfig = {}, sourceObjList = [], cb) { const me = this // many async flows. so store the ref. const sourceFilesLength = sourceObjList.length - if(!(isArray(sourceObjList ))){ + if (!isArray(sourceObjList)) { throw new errors.InvalidArgumentError('sourceConfig should an array of CopySourceOptions ') } - if(!(destObjConfig instanceof CopyDestinationOptions )){ + if (!(destObjConfig instanceof CopyDestinationOptions)) { throw new errors.InvalidArgumentError('destConfig should of type CopyDestinationOptions ') } if (sourceFilesLength < 1 || sourceFilesLength > PART_CONSTRAINTS.MAX_PARTS_COUNT) { - throw new errors.InvalidArgumentError(`"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.`) + throw new errors.InvalidArgumentError( + `"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.` + ) } if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - for(let i=0;i{ + const getStatOptions = (srcConfig) => { let statOpts = {} - if(!_.isEmpty(srcConfig.VersionID)) { - statOpts= { - versionId: srcConfig.VersionID + if (!_.isEmpty(srcConfig.VersionID)) { + statOpts = { + versionId: srcConfig.VersionID, } } return statOpts } - const srcObjectSizes=[] - let totalSize=0 - let totalParts=0 - - const sourceObjStats = sourceObjList.map( (srcItem) => me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)) ) + const srcObjectSizes = [] + let totalSize = 0 + let totalParts = 0 - return Promise.all(sourceObjStats).then(srcObjectInfos =>{ + const sourceObjStats = sourceObjList.map((srcItem) => + me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)) + ) - const validatedStats = srcObjectInfos.map( (resItemStat, index)=>{ + return Promise.all(sourceObjStats) + .then((srcObjectInfos) => { + const validatedStats = srcObjectInfos.map((resItemStat, index) => { + const srcConfig = sourceObjList[index] + + let srcCopySize = resItemStat.size + // Check if a segment is specified, and if so, is the + // segment within object bounds? + if (srcConfig.MatchRange) { + // Since range is specified, + // 0 <= src.srcStart <= src.srcEnd + // so only invalid case to check is: + const srcStart = srcConfig.Start + const srcEnd = srcConfig.End + if (srcEnd >= srcCopySize || srcStart < 0) { + throw new errors.InvalidArgumentError( + `CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})` + ) + } + srcCopySize = srcEnd - srcStart + 1 + } - const srcConfig = sourceObjList[index] + // Only the last source may be less than `absMinPartSize` + if (srcCopySize < PART_CONSTRAINTS.ABS_MIN_PART_SIZE && index < sourceFilesLength - 1) { + throw new errors.InvalidArgumentError( + `CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.` + ) + } - let srcCopySize =resItemStat.size - // Check if a segment is specified, and if so, is the - // segment within object bounds? - if (srcConfig.MatchRange) { - // Since range is specified, - // 0 <= src.srcStart <= src.srcEnd - // so only invalid case to check is: - const srcStart = srcConfig.Start - const srcEnd = srcConfig.End - if (srcEnd >= srcCopySize || srcStart < 0 ){ - throw new errors.InvalidArgumentError(`CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})`) + // Is data to copy too large? + totalSize += srcCopySize + if (totalSize > PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE) { + throw new errors.InvalidArgumentError(`Cannot compose an object of size ${totalSize} (> 5TiB)`) } - srcCopySize = srcEnd - srcStart + 1 - } - // Only the last source may be less than `absMinPartSize` - if (srcCopySize < PART_CONSTRAINTS.ABS_MIN_PART_SIZE && index < sourceFilesLength-1) { - throw new errors.InvalidArgumentError(`CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.`) - } + // record source size + srcObjectSizes[index] = srcCopySize - // Is data to copy too large? - totalSize += srcCopySize - if (totalSize > PART_CONSTRAINTS.MAX_MULTIPART_PUT_OBJECT_SIZE) { - throw new errors.InvalidArgumentError(`Cannot compose an object of size ${totalSize} (> 5TiB)`) - } + // calculate parts needed for current source + totalParts += partsRequired(srcCopySize) + // Do we need more parts than we are allowed? + if (totalParts > PART_CONSTRAINTS.MAX_PARTS_COUNT) { + throw new errors.InvalidArgumentError( + `Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts` + ) + } - // record source size - srcObjectSizes[index] = srcCopySize + return resItemStat + }) - // calculate parts needed for current source - totalParts += partsRequired(srcCopySize) - // Do we need more parts than we are allowed? - if (totalParts > PART_CONSTRAINTS.MAX_PARTS_COUNT ){ - throw new errors.InvalidArgumentError(`Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts`) + if ((totalParts === 1 && totalSize <= PART_CONSTRAINTS.MAX_PART_SIZE) || totalSize === 0) { + return this.copyObject(sourceObjList[0], destObjConfig, cb) // use copyObjectV2 } - return resItemStat + // preserve etag to avoid modification of object while copying. + for (let i = 0; i < sourceFilesLength; i++) { + sourceObjList[i].MatchETag = validatedStats[i].etag + } - }) + const splitPartSizeList = validatedStats.map((resItemStat, idx) => { + const calSize = calculateEvenSplits(srcObjectSizes[idx], sourceObjList[idx]) + return calSize + }) - if ((totalParts === 1 && totalSize <= PART_CONSTRAINTS.MAX_PART_SIZE) || (totalSize === 0)) { - return this.copyObject( sourceObjList[0], destObjConfig, cb) // use copyObjectV2 - } + function getUploadPartConfigList(uploadId) { + const uploadPartConfigList = [] - // preserve etag to avoid modification of object while copying. - for(let i=0;i { + const { startIndex: startIdx, endIndex: endIdx, objInfo: objConfig } = splitSize - const splitPartSizeList = validatedStats.map((resItemStat, idx)=>{ - const calSize = calculateEvenSplits(srcObjectSizes[idx], sourceObjList[idx]) - return calSize + let partIndex = splitIndex + 1 // part index starts from 1. + const totalUploads = Array.from(startIdx) - }) + const headers = sourceObjList[splitIndex].getHeaders() - function getUploadPartConfigList (uploadId) { - const uploadPartConfigList = [] + totalUploads.forEach((splitStart, upldCtrIdx) => { + let splitEnd = endIdx[upldCtrIdx] - splitPartSizeList.forEach((splitSize, splitIndex) => { + const sourceObj = `${objConfig.Bucket}/${objConfig.Object}` + headers['x-amz-copy-source'] = `${sourceObj}` + headers['x-amz-copy-source-range'] = `bytes=${splitStart}-${splitEnd}` - const { - startIndex: startIdx, - endIndex: endIdx, - objInfo: objConfig, - } = splitSize - - let partIndex = splitIndex + 1 // part index starts from 1. - const totalUploads = Array.from(startIdx) + const uploadPartConfig = { + bucketName: destObjConfig.Bucket, + objectName: destObjConfig.Object, + uploadID: uploadId, + partNumber: partIndex, + headers: headers, + sourceObj: sourceObj, + } - const headers = sourceObjList[splitIndex].getHeaders() + uploadPartConfigList.push(uploadPartConfig) + }) + }) - totalUploads.forEach((splitStart, upldCtrIdx) => { - let splitEnd = endIdx[upldCtrIdx] + return uploadPartConfigList + } - const sourceObj = `${objConfig.Bucket}/${objConfig.Object}` - headers['x-amz-copy-source'] = `${sourceObj}` - headers["x-amz-copy-source-range"] = `bytes=${splitStart}-${splitEnd}` + const performUploadParts = (uploadId) => { + const uploadList = getUploadPartConfigList(uploadId) - const uploadPartConfig = { - bucketName: destObjConfig.Bucket, - objectName: destObjConfig.Object, - uploadID: uploadId, - partNumber: partIndex, - headers: headers, - sourceObj: sourceObj + async.map(uploadList, me.uploadPartCopy.bind(me), (err, res) => { + if (err) { + return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb) } - - uploadPartConfigList.push(uploadPartConfig) + const partsDone = res.map((partCopy) => ({ etag: partCopy.etag, part: partCopy.part })) + return me.completeMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, partsDone, cb) }) + } - }) - - return uploadPartConfigList - } - - const performUploadParts = (uploadId) =>{ - - const uploadList = getUploadPartConfigList(uploadId) + const newUploadHeaders = destObjConfig.getHeaders() - async.map(uploadList, me.uploadPartCopy.bind(me), (err, res)=>{ - if(err){ - return this.abortMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, cb) + me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId) => { + if (err) { + return cb(err, null) } - const partsDone = res.map((partCopy)=>({etag:partCopy.etag, part:partCopy.part})) - return me.completeMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, uploadId, partsDone, cb) + performUploadParts(uploadId) }) - - } - - const newUploadHeaders = destObjConfig.getHeaders() - - me.initiateNewMultipartUpload(destObjConfig.Bucket, destObjConfig.Object, newUploadHeaders, (err, uploadId)=>{ - if(err){ - return cb(err, null) - } - performUploadParts(uploadId) }) - - }) - .catch((error)=>{ + .catch((error) => { cb(error, null) }) - } - selectObjectContent(bucketName, objectName, selectOpts={}, cb) { + selectObjectContent(bucketName, objectName, selectOpts = {}, cb) { if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`) } if (!isValidObjectName(objectName)) { throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } - if(!_.isEmpty(selectOpts)){ - + if (!_.isEmpty(selectOpts)) { if (!isString(selectOpts.expression)) { throw new TypeError('sqlExpression should be of type "string"') } - if(!_.isEmpty(selectOpts.inputSerialization)) { + if (!_.isEmpty(selectOpts.inputSerialization)) { if (!isObject(selectOpts.inputSerialization)) { throw new TypeError('inputSerialization should be of type "object"') } - }else{ + } else { throw new TypeError('inputSerialization is required') } - if(!_.isEmpty(selectOpts.outputSerialization)) { + if (!_.isEmpty(selectOpts.outputSerialization)) { if (!isObject(selectOpts.outputSerialization)) { throw new TypeError('outputSerialization should be of type "object"') } - }else{ + } else { throw new TypeError('outputSerialization is required') } - - }else{ + } else { throw new TypeError('valid select configuration is required') } @@ -3479,48 +3557,45 @@ export class Client { const method = 'POST' let query = `select` - query += "&select-type=2" + query += '&select-type=2' const config = [ { - "Expression": selectOpts.expression + Expression: selectOpts.expression, }, { - "ExpressionType":selectOpts.expressionType || "SQL" + ExpressionType: selectOpts.expressionType || 'SQL', }, { - "InputSerialization": [selectOpts.inputSerialization] + InputSerialization: [selectOpts.inputSerialization], }, { - "OutputSerialization": [selectOpts.outputSerialization] - } + OutputSerialization: [selectOpts.outputSerialization], + }, ] // Optional - if(selectOpts.requestProgress){ - config.push( - {"RequestProgress":selectOpts.requestProgress} - ) + if (selectOpts.requestProgress) { + config.push({ RequestProgress: selectOpts.requestProgress }) } // Optional - if(selectOpts.scanRange){ - config.push( - {"ScanRange": selectOpts.scanRange} - - ) + if (selectOpts.scanRange) { + config.push({ ScanRange: selectOpts.scanRange }) } - - const builder = new xml2js.Builder({rootName:'SelectObjectContentRequest', renderOpts:{'pretty':false}, headless:true}) + const builder = new xml2js.Builder({ + rootName: 'SelectObjectContentRequest', + renderOpts: { pretty: false }, + headless: true, + }) const payload = builder.buildObject(config) - - this.makeRequest({method, bucketName, objectName, query}, payload, [200], '', true, (e, response) => { + this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { if (e) return cb(e) let selectResult pipesetup(response, transformers.selectObjectContentTransformer()) - .on('data', data => { + .on('data', (data) => { selectResult = parseSelectObjectContentResponse(data) }) .on('error', cb) @@ -3531,8 +3606,7 @@ export class Client { } get extensions() { - if(!this.clientExtensions) - { + if (!this.clientExtensions) { this.clientExtensions = new extensions(this) } return this.clientExtensions @@ -3566,49 +3640,47 @@ Client.prototype.getBucketPolicy = promisify(Client.prototype.getBucketPolicy) Client.prototype.setBucketPolicy = promisify(Client.prototype.setBucketPolicy) Client.prototype.removeIncompleteUpload = promisify(Client.prototype.removeIncompleteUpload) Client.prototype.getBucketVersioning = promisify(Client.prototype.getBucketVersioning) -Client.prototype.setBucketVersioning=promisify(Client.prototype.setBucketVersioning) -Client.prototype.setBucketTagging=promisify(Client.prototype.setBucketTagging) -Client.prototype.removeBucketTagging=promisify(Client.prototype.removeBucketTagging) -Client.prototype.getBucketTagging=promisify(Client.prototype.getBucketTagging) -Client.prototype.setObjectTagging=promisify(Client.prototype.setObjectTagging) -Client.prototype.removeObjectTagging=promisify(Client.prototype.removeObjectTagging) -Client.prototype.getObjectTagging=promisify(Client.prototype.getObjectTagging) -Client.prototype.setBucketLifecycle=promisify(Client.prototype.setBucketLifecycle) -Client.prototype.getBucketLifecycle=promisify(Client.prototype.getBucketLifecycle) -Client.prototype.removeBucketLifecycle=promisify(Client.prototype.removeBucketLifecycle) -Client.prototype.setObjectLockConfig=promisify(Client.prototype.setObjectLockConfig) -Client.prototype.getObjectLockConfig=promisify(Client.prototype.getObjectLockConfig) -Client.prototype.putObjectRetention =promisify(Client.prototype.putObjectRetention) -Client.prototype.getObjectRetention =promisify(Client.prototype.getObjectRetention) +Client.prototype.setBucketVersioning = promisify(Client.prototype.setBucketVersioning) +Client.prototype.setBucketTagging = promisify(Client.prototype.setBucketTagging) +Client.prototype.removeBucketTagging = promisify(Client.prototype.removeBucketTagging) +Client.prototype.getBucketTagging = promisify(Client.prototype.getBucketTagging) +Client.prototype.setObjectTagging = promisify(Client.prototype.setObjectTagging) +Client.prototype.removeObjectTagging = promisify(Client.prototype.removeObjectTagging) +Client.prototype.getObjectTagging = promisify(Client.prototype.getObjectTagging) +Client.prototype.setBucketLifecycle = promisify(Client.prototype.setBucketLifecycle) +Client.prototype.getBucketLifecycle = promisify(Client.prototype.getBucketLifecycle) +Client.prototype.removeBucketLifecycle = promisify(Client.prototype.removeBucketLifecycle) +Client.prototype.setObjectLockConfig = promisify(Client.prototype.setObjectLockConfig) +Client.prototype.getObjectLockConfig = promisify(Client.prototype.getObjectLockConfig) +Client.prototype.putObjectRetention = promisify(Client.prototype.putObjectRetention) +Client.prototype.getObjectRetention = promisify(Client.prototype.getObjectRetention) Client.prototype.setBucketEncryption = promisify(Client.prototype.setBucketEncryption) Client.prototype.getBucketEncryption = promisify(Client.prototype.getBucketEncryption) Client.prototype.removeBucketEncryption = promisify(Client.prototype.removeBucketEncryption) -Client.prototype.setBucketReplication =promisify(Client.prototype.setBucketReplication) -Client.prototype.getBucketReplication =promisify(Client.prototype.getBucketReplication) -Client.prototype.removeBucketReplication=promisify(Client.prototype.removeBucketReplication) -Client.prototype.setObjectLegalHold=promisify(Client.prototype.setObjectLegalHold) -Client.prototype.getObjectLegalHold=promisify(Client.prototype.getObjectLegalHold) +Client.prototype.setBucketReplication = promisify(Client.prototype.setBucketReplication) +Client.prototype.getBucketReplication = promisify(Client.prototype.getBucketReplication) +Client.prototype.removeBucketReplication = promisify(Client.prototype.removeBucketReplication) +Client.prototype.setObjectLegalHold = promisify(Client.prototype.setObjectLegalHold) +Client.prototype.getObjectLegalHold = promisify(Client.prototype.getObjectLegalHold) Client.prototype.composeObject = promisify(Client.prototype.composeObject) -Client.prototype.selectObjectContent=promisify(Client.prototype.selectObjectContent) +Client.prototype.selectObjectContent = promisify(Client.prototype.selectObjectContent) export class CopyConditions { constructor() { - this.modified = "" - this.unmodified = "" - this.matchETag = "" - this.matchETagExcept = "" + this.modified = '' + this.unmodified = '' + this.matchETag = '' + this.matchETagExcept = '' } setModified(date) { - if (!(date instanceof Date)) - throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) throw new TypeError('date must be of type Date') this.modified = date.toUTCString() } setUnmodified(date) { - if (!(date instanceof Date)) - throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) throw new TypeError('date must be of type Date') this.unmodified = date.toUTCString() } @@ -3626,7 +3698,7 @@ export class CopyConditions { export class PostPolicy { constructor() { this.policy = { - conditions: [] + conditions: [], } this.formData = {} } @@ -3720,5 +3792,5 @@ export class PostPolicy { } } -export * from './notification' export * from './helpers' +export * from './notification' diff --git a/src/main/notification.js b/src/main/notification.js index 4a0537d8..95e6ff3e 100644 --- a/src/main/notification.js +++ b/src/main/notification.js @@ -15,8 +15,9 @@ */ import { EventEmitter } from 'events' + +import { DEFAULT_REGION, pipesetup, uriEscape } from './helpers' import * as transformers from './transformers' -import {DEFAULT_REGION, pipesetup, uriEscape} from './helpers' // Notification config - array of target configs. // Target configs can be @@ -45,17 +46,17 @@ class TargetConfig { setId(id) { this.Id = id } - addEvent(newevent){ + addEvent(newevent) { if (!this.Event) this.Event = [] this.Event.push(newevent) } addFilterSuffix(suffix) { - if (!this.Filter) this.Filter = {S3Key : {FilterRule:[]}} - this.Filter.S3Key.FilterRule.push({Name:"suffix", Value:suffix}) + if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } + this.Filter.S3Key.FilterRule.push({ Name: 'suffix', Value: suffix }) } addFilterPrefix(prefix) { - if (!this.Filter) this.Filter = {S3Key : {FilterRule:[]}} - this.Filter.S3Key.FilterRule.push({Name:"prefix", Value:prefix}) + if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } + this.Filter.S3Key.FilterRule.push({ Name: 'prefix', Value: prefix }) } } @@ -84,19 +85,18 @@ export class CloudFunctionConfig extends TargetConfig { } export const buildARN = (partition, service, region, accountId, resource) => { - return "arn:" + partition + ":" + service + ":" + region + ":" + accountId + ":" + resource + return 'arn:' + partition + ':' + service + ':' + region + ':' + accountId + ':' + resource } - -export const ObjectCreatedAll = "s3:ObjectCreated:*" -export const ObjectCreatedPut = "s3:ObjectCreated:Put" -export const ObjectCreatedPost = "s3:ObjectCreated:Post" -export const ObjectCreatedCopy = "s3:ObjectCreated:Copy" -export const ObjectCreatedCompleteMultipartUpload = "s3:ObjectCreated:CompleteMultipartUpload" -export const ObjectRemovedAll = "s3:ObjectRemoved:*" -export const ObjectRemovedDelete = "s3:ObjectRemoved:Delete" -export const ObjectRemovedDeleteMarkerCreated = "s3:ObjectRemoved:DeleteMarkerCreated" -export const ObjectReducedRedundancyLostObject = "s3:ReducedRedundancyLostObject" +export const ObjectCreatedAll = 's3:ObjectCreated:*' +export const ObjectCreatedPut = 's3:ObjectCreated:Put' +export const ObjectCreatedPost = 's3:ObjectCreated:Post' +export const ObjectCreatedCopy = 's3:ObjectCreated:Copy' +export const ObjectCreatedCompleteMultipartUpload = 's3:ObjectCreated:CompleteMultipartUpload' +export const ObjectRemovedAll = 's3:ObjectRemoved:*' +export const ObjectRemovedDelete = 's3:ObjectRemoved:Delete' +export const ObjectRemovedDeleteMarkerCreated = 's3:ObjectRemoved:DeleteMarkerCreated' +export const ObjectReducedRedundancyLostObject = 's3:ReducedRedundancyLostObject' // Poll for notifications, used in #listenBucketNotification. // Listening constitutes repeatedly requesting s3 whether or not any @@ -143,7 +143,7 @@ export class NotificationPoller extends EventEmitter { queries.push(`suffix=${suffix}`) } if (this.events) { - this.events.forEach(s3event => queries.push('events='+uriEscape(s3event))) + this.events.forEach((s3event) => queries.push('events=' + uriEscape(s3event))) } queries.sort() @@ -157,7 +157,7 @@ export class NotificationPoller extends EventEmitter { let transformer = transformers.getNotificationTransformer() pipesetup(response, transformer) - .on('data', result => { + .on('data', (result) => { // Data is flushed periodically (every 5 seconds), so we should // handle it after flushing from the JSON parser. let records = result.Records @@ -165,14 +165,14 @@ export class NotificationPoller extends EventEmitter { if (!records) records = [] // Iterate over the notifications and emit them individually. - records.forEach(record => { + records.forEach((record) => { this.emit('notification', record) }) // If we're done, stop. if (this.ending) response.destroy() }) - .on('error', e => this.emit('error', e)) + .on('error', (e) => this.emit('error', e)) .on('end', () => { // Do it again, if we haven't cancelled yet. process.nextTick(() => { @@ -181,5 +181,4 @@ export class NotificationPoller extends EventEmitter { }) }) } - } diff --git a/src/main/object-uploader.js b/src/main/object-uploader.js index 9412d034..6a731204 100644 --- a/src/main/object-uploader.js +++ b/src/main/object-uploader.js @@ -14,10 +14,11 @@ * limitations under the License. */ -import { Transform } from 'stream' import Crypto from 'crypto' import * as querystring from 'query-string' -import { getVersionId, sanitizeETag } from "./helpers" +import { Transform } from 'stream' + +import { getVersionId, sanitizeETag } from './helpers' // We extend Transform because Writable does not implement ._flush(). export default class ObjectUploader extends Transform { @@ -52,7 +53,7 @@ export default class ObjectUploader extends Transform { this.id = null // Handle errors. - this.on('error', err => { + this.on('error', (err) => { callback(err) }) } @@ -60,7 +61,7 @@ export default class ObjectUploader extends Transform { _transform(chunk, encoding, callback) { this.emptyStream = false let method = 'PUT' - let headers = {'Content-Length': chunk.length} + let headers = { 'Content-Length': chunk.length } let md5digest = '' // Calculate and set Content-MD5 header if SHA256 is not set. @@ -80,14 +81,14 @@ export default class ObjectUploader extends Transform { headers: Object.assign({}, this.metaData, headers), query: '', bucketName: this.bucketName, - objectName: this.objectName + objectName: this.objectName, } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { if (err) return callback(err) let result = { etag: sanitizeETag(response.headers.etag), - versionId :getVersionId(response.headers) + versionId: getVersionId(response.headers), } // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) response.on('data', () => {}) @@ -141,7 +142,7 @@ export default class ObjectUploader extends Transform { if (!etags) etags = [] // oldParts will become an object, allowing oldParts[partNumber].etag - this.oldParts = etags.reduce(function(prev, item) { + this.oldParts = etags.reduce(function (prev, item) { if (!prev[item.part]) { prev[item.part] = item } @@ -164,13 +165,13 @@ export default class ObjectUploader extends Transform { let oldPart = this.oldParts[partNumber] // Calulcate the md5 hash, if it has not already been calculated. - if(!md5digest) { + if (!md5digest) { md5digest = Crypto.createHash('md5').update(chunk).digest() } if (oldPart && md5digest.toString('hex') === oldPart.etag) { // The md5 matches, the chunk has already been uploaded. - this.etags.push({part: partNumber, etag: oldPart.etag}) + this.etags.push({ part: partNumber, etag: oldPart.etag }) callback() return @@ -180,13 +181,15 @@ export default class ObjectUploader extends Transform { // Write the chunk with an uploader. let query = querystring.stringify({ partNumber: partNumber, - uploadId: this.id + uploadId: this.id, }) let options = { - method, query, headers, + method, + query, + headers, bucketName: this.bucketName, - objectName: this.objectName + objectName: this.objectName, } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { @@ -194,10 +197,9 @@ export default class ObjectUploader extends Transform { // In order to aggregate the parts together, we need to collect the etags. let etag = response.headers.etag - if (etag) - etag = etag.replace(/^"/, '').replace(/"$/, '') + if (etag) etag = etag.replace(/^"/, '').replace(/"$/, '') - this.etags.push({part: partNumber, etag}) + this.etags.push({ part: partNumber, etag }) // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) response.on('data', () => {}) @@ -210,12 +212,13 @@ export default class ObjectUploader extends Transform { _flush(callback) { if (this.emptyStream) { let method = 'PUT' - let headers = Object.assign({}, this.metaData, {'Content-Length': 0}) + let headers = Object.assign({}, this.metaData, { 'Content-Length': 0 }) let options = { - method, headers, + method, + headers, query: '', bucketName: this.bucketName, - objectName: this.objectName + objectName: this.objectName, } this.client.makeRequest(options, '', [200], '', true, (err, response) => { @@ -223,7 +226,7 @@ export default class ObjectUploader extends Transform { let result = { etag: sanitizeETag(response.headers.etag), - versionId: getVersionId(response.headers) + versionId: getVersionId(response.headers), } // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) @@ -247,17 +250,16 @@ export default class ObjectUploader extends Transform { // This is called when all of the chunks uploaded successfully, thus // completing the multipart upload. - this.client.completeMultipartUpload(this.bucketName, this.objectName, this.id, - this.etags, (err, etag) => { - if (err) return callback(err) - - // Call our callback on the next tick to allow the streams infrastructure - // to finish what its doing before we continue. - process.nextTick(() => { - this.callback(null, etag) - }) - - callback() - }) + this.client.completeMultipartUpload(this.bucketName, this.objectName, this.id, this.etags, (err, etag) => { + if (err) return callback(err) + + // Call our callback on the next tick to allow the streams infrastructure + // to finish what its doing before we continue. + process.nextTick(() => { + this.callback(null, etag) + }) + + callback() + }) } } diff --git a/src/main/s3-endpoints.js b/src/main/s3-endpoints.js index ee5e773a..d367a880 100644 --- a/src/main/s3-endpoints.js +++ b/src/main/s3-endpoints.js @@ -32,7 +32,7 @@ let awsS3Endpoint = { 'ap-southeast-2': 's3-ap-southeast-2.amazonaws.com', 'ap-northeast-1': 's3-ap-northeast-1.amazonaws.com', 'cn-north-1': 's3.cn-north-1.amazonaws.com.cn', - 'ap-east-1': 's3.ap-east-1.amazonaws.com' + 'ap-east-1': 's3.ap-east-1.amazonaws.com', // Add new endpoints here. } diff --git a/src/main/signing.js b/src/main/signing.js index ded424bc..3a736617 100644 --- a/src/main/signing.js +++ b/src/main/signing.js @@ -16,9 +16,9 @@ import Crypto from 'crypto' import _ from 'lodash' -import { uriEscape, getScope, isString, isObject, isArray, isNumber, - makeDateShort, makeDateLong } from './helpers.js' + import * as errors from './errors.js' +import { getScope, isArray, isNumber, isObject, isString, makeDateLong, makeDateShort, uriEscape } from './helpers.js' const signV4Algorithm = 'AWS4-HMAC-SHA256' @@ -50,7 +50,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload } const headersArray = signedHeaders.reduce((acc, i) => { // Trim spaces from the value (required by V4 spec) - const val = `${headers[i]}`.replace(/ +/g, " ") + const val = `${headers[i]}`.replace(/ +/g, ' ') acc.push(`${i.toLowerCase()}:${val}`) return acc }, []) @@ -63,7 +63,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload requestQuery = requestQuery .split('&') .sort() - .map(element => element.indexOf('=') === -1 ? element + '=' : element) + .map((element) => (element.indexOf('=') === -1 ? element + '=' : element)) .join('&') } @@ -78,7 +78,7 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload } // generate a credential string -function getCredential(accessKey, region, requestDate,serviceName="s3") { +function getCredential(accessKey, region, requestDate, serviceName = 's3') { if (!isString(accessKey)) { throw new TypeError('accessKey should be of type "string"') } @@ -88,7 +88,7 @@ function getCredential(accessKey, region, requestDate,serviceName="s3") { if (!isObject(requestDate)) { throw new TypeError('requestDate should be of type "object"') } - return `${accessKey}/${getScope(region, requestDate,serviceName)}` + return `${accessKey}/${getScope(region, requestDate, serviceName)}` } // Returns signed headers array - alphabetically sorted @@ -125,12 +125,12 @@ function getSignedHeaders(headers) { const ignoredHeaders = ['authorization', 'content-length', 'content-type', 'user-agent'] return _.map(headers, (v, header) => header) - .filter(header => ignoredHeaders.indexOf(header) === -1) + .filter((header) => ignoredHeaders.indexOf(header) === -1) .sort() } // returns the key used for calculating signature -function getSigningKey(date, region, secretKey,serviceName="s3") { +function getSigningKey(date, region, secretKey, serviceName = 's3') { if (!isObject(date)) { throw new TypeError('date should be of type "object"') } @@ -141,14 +141,16 @@ function getSigningKey(date, region, secretKey,serviceName="s3") { throw new TypeError('secretKey should be of type "string"') } const dateLine = makeDateShort(date) - let hmac1 = Crypto.createHmac('sha256', 'AWS4' + secretKey).update(dateLine).digest(), + let hmac1 = Crypto.createHmac('sha256', 'AWS4' + secretKey) + .update(dateLine) + .digest(), hmac2 = Crypto.createHmac('sha256', hmac1).update(region).digest(), hmac3 = Crypto.createHmac('sha256', hmac2).update(serviceName).digest() return Crypto.createHmac('sha256', hmac3).update('aws4_request').digest() } // returns the string that needs to be signed -function getStringToSign(canonicalRequest, requestDate, region,serviceName="s3") { +function getStringToSign(canonicalRequest, requestDate, region, serviceName = 's3') { if (!isString(canonicalRequest)) { throw new TypeError('canonicalRequest should be of type "string"') } @@ -188,7 +190,7 @@ export function postPresignSignatureV4(region, date, secretKey, policyBase64) { } // Returns the authorization header -export function signV4(request, accessKey, secretKey, region, requestDate, serviceName="s3") { +export function signV4(request, accessKey, secretKey, region, requestDate, serviceName = 's3') { if (!isObject(request)) { throw new TypeError('request should be of type "object"') } @@ -212,19 +214,20 @@ export function signV4(request, accessKey, secretKey, region, requestDate, servi const sha256sum = request.headers['x-amz-content-sha256'] const signedHeaders = getSignedHeaders(request.headers) - const canonicalRequest = getCanonicalRequest(request.method, request.path, request.headers, - signedHeaders, sha256sum) - const serviceIdentifier = serviceName || "s3" - const stringToSign = getStringToSign(canonicalRequest, requestDate, region,serviceIdentifier) - const signingKey = getSigningKey(requestDate, region, secretKey,serviceIdentifier) + const canonicalRequest = getCanonicalRequest(request.method, request.path, request.headers, signedHeaders, sha256sum) + const serviceIdentifier = serviceName || 's3' + const stringToSign = getStringToSign(canonicalRequest, requestDate, region, serviceIdentifier) + const signingKey = getSigningKey(requestDate, region, secretKey, serviceIdentifier) const credential = getCredential(accessKey, region, requestDate, serviceIdentifier) const signature = Crypto.createHmac('sha256', signingKey).update(stringToSign).digest('hex').toLowerCase() - return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${signedHeaders.join(';').toLowerCase()}, Signature=${signature}` + return `${signV4Algorithm} Credential=${credential}, SignedHeaders=${signedHeaders + .join(';') + .toLowerCase()}, Signature=${signature}` } -export function signV4ByServiceName( request, accessKey, secretKey, region, requestDate, serviceName="s3") { - return signV4(request, accessKey, secretKey, region,requestDate, serviceName) +export function signV4ByServiceName(request, accessKey, secretKey, region, requestDate, serviceName = 's3') { + return signV4(request, accessKey, secretKey, region, requestDate, serviceName) } // returns a presigned URL string export function presignSignatureV4(request, accessKey, secretKey, sessionToken, region, requestDate, expires) { @@ -283,8 +286,7 @@ export function presignSignatureV4(request, accessKey, secretKey, sessionToken, const path = resource + '?' + query - const canonicalRequest = getCanonicalRequest(request.method, path, - request.headers, signedHeaders, hashedPayload) + const canonicalRequest = getCanonicalRequest(request.method, path, request.headers, signedHeaders, hashedPayload) const stringToSign = getStringToSign(canonicalRequest, requestDate, region) const signingKey = getSigningKey(requestDate, region, secretKey) diff --git a/src/main/transformers.js b/src/main/transformers.js index 5b06b462..d6caaf6e 100644 --- a/src/main/transformers.js +++ b/src/main/transformers.js @@ -14,14 +14,14 @@ * limitations under the License. */ -import * as xmlParsers from './xml-parsers.js' -import * as _ from 'lodash' -import Through2 from 'through2' import Crypto from 'crypto' import JSONParser from 'json-stream' +import * as _ from 'lodash' +import Through2 from 'through2' -import { isFunction } from './helpers.js' import * as errors from './errors.js' +import { isFunction } from './helpers.js' +import * as xmlParsers from './xml-parsers.js' // getConcater returns a stream that concatenates the input and emits // the concatenated output when 'end' has reached. If an optional @@ -39,26 +39,29 @@ export function getConcater(parser, emitError) { objectMode = true } - return Through2({objectMode}, - function (chunk, enc, cb) { - bufs.push(chunk) - cb() - }, function (cb) { - if (emitError) { - cb(parser(Buffer.concat(bufs).toString())) - // cb(e) would mean we have to emit 'end' by explicitly calling this.push(null) - this.push(null) - return - } - if (bufs.length) { - if (parser) { - this.push(parser(Buffer.concat(bufs).toString())) - } else { - this.push(Buffer.concat(bufs)) - } - } - cb() - }) + return Through2( + { objectMode }, + function (chunk, enc, cb) { + bufs.push(chunk) + cb() + }, + function (cb) { + if (emitError) { + cb(parser(Buffer.concat(bufs).toString())) + // cb(e) would mean we have to emit 'end' by explicitly calling this.push(null) + this.push(null) + return + } + if (bufs.length) { + if (parser) { + this.push(parser(Buffer.concat(bufs).toString())) + } else { + this.push(Buffer.concat(bufs)) + } + } + cb() + } + ) } // Generates an Error object depending on http statusCode and XML body @@ -98,7 +101,7 @@ export function getErrorTransformer(response) { // in HEAD bucket and ListObjects response. headerInfo.amzBucketRegion = response.headersSent ? response.getHeader('x-amz-bucket-region') : null - return getConcater(xmlString => { + return getConcater((xmlString) => { let getError = () => { // Message should be instantiated for each S3Errors. var e = new errors.S3Error(message) @@ -127,27 +130,29 @@ export function getHashSummer(enableSHA256) { var md5 = Crypto.createHash('md5') var sha256 = Crypto.createHash('sha256') - return Through2.obj(function(chunk, enc, cb) { - - if (enableSHA256) { - sha256.update(chunk) - } else { - md5.update(chunk) + return Through2.obj( + function (chunk, enc, cb) { + if (enableSHA256) { + sha256.update(chunk) + } else { + md5.update(chunk) + } + cb() + }, + function (cb) { + var md5sum = '' + var sha256sum = '' + if (enableSHA256) { + sha256sum = sha256.digest('hex') + } else { + md5sum = md5.digest('base64') + } + var hashData = { md5sum, sha256sum } + this.push(hashData) + this.push(null) + cb() } - cb() - }, function(cb) { - var md5sum = '' - var sha256sum = '' - if (enableSHA256) { - sha256sum = sha256.digest('hex') - } else { - md5sum = md5.digest('base64') - } - var hashData = {md5sum, sha256sum} - this.push(hashData) - this.push(null) - cb() - }) + ) } // Following functions return a stream object that parses XML @@ -214,45 +219,44 @@ export function getNotificationTransformer() { return new JSONParser() } -export function bucketVersioningTransformer(){ +export function bucketVersioningTransformer() { return getConcater(xmlParsers.parseBucketVersioningConfig) } export function getTagsTransformer() { - return getConcater( xmlParsers.parseTagging) + return getConcater(xmlParsers.parseTagging) } -export function lifecycleTransformer(){ +export function lifecycleTransformer() { return getConcater(xmlParsers.parseLifecycleConfig) } - -export function objectLockTransformer(){ +export function objectLockTransformer() { return getConcater(xmlParsers.parseObjectLockConfig) } -export function objectRetentionTransformer(){ +export function objectRetentionTransformer() { return getConcater(xmlParsers.parseObjectRetentionConfig) } -export function bucketEncryptionTransformer(){ +export function bucketEncryptionTransformer() { return getConcater(xmlParsers.parseBucketEncryptionConfig) } -export function replicationConfigTransformer(){ +export function replicationConfigTransformer() { return getConcater(xmlParsers.parseReplicationConfig) } -export function objectLegalHoldTransformer(){ +export function objectLegalHoldTransformer() { return getConcater(xmlParsers.parseObjectLegalHoldConfig) } -export function uploadPartTransformer(){ +export function uploadPartTransformer() { return getConcater(xmlParsers.uploadPartParser) } -export function selectObjectContentTransformer(){ - return getConcater() +export function selectObjectContentTransformer() { + return getConcater() } export function removeObjectsTransformer() { return getConcater(xmlParsers.removeObjectsParser) -} \ No newline at end of file +} diff --git a/src/main/xml-parsers.js b/src/main/xml-parsers.js index f05b8f82..12575c52 100644 --- a/src/main/xml-parsers.js +++ b/src/main/xml-parsers.js @@ -13,22 +13,22 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -const { XMLParser } = require("fast-xml-parser") -const fxp = new XMLParser() +const { XMLParser } = require('fast-xml-parser') +const fxp = new XMLParser() import _ from 'lodash' + import * as errors from './errors.js' import { isObject, - sanitizeETag, - toArray, - sanitizeObjectKey, - RETENTION_VALIDITY_UNITS, parseXml, readableStream, - SelectResults -} from "./helpers" -var crc32 = require("buffer-crc32") - + RETENTION_VALIDITY_UNITS, + sanitizeETag, + sanitizeObjectKey, + SelectResults, + toArray, +} from './helpers' +var crc32 = require('buffer-crc32') // Parse XML and return information as Javascript types @@ -37,7 +37,7 @@ export function parseError(xml, headerInfo) { var xmlErr = {} var xmlObj = fxp.parse(xml) if (xmlObj.Error) { - xmlErr = xmlObj.Error + xmlErr = xmlObj.Error } var e = new errors.S3Error() @@ -54,8 +54,8 @@ export function parseError(xml, headerInfo) { // parse XML response for copy object export function parseCopyObject(xml) { var result = { - etag: "", - lastModified: "" + etag: '', + lastModified: '', } var xmlobj = parseXml(xml) @@ -63,9 +63,13 @@ export function parseCopyObject(xml) { throw new errors.InvalidXMLError('Missing tag: "CopyObjectResult"') } xmlobj = xmlobj.CopyObjectResult - if (xmlobj.ETag) result.etag = xmlobj.ETag.replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') + if (xmlobj.ETag) + result.etag = xmlobj.ETag.replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') if (xmlobj.LastModified) result.lastModified = new Date(xmlobj.LastModified) return result @@ -76,7 +80,7 @@ export function parseListMultipart(xml) { var result = { uploads: [], prefixes: [], - isTruncated: false + isTruncated: false, } var xmlobj = parseXml(xml) @@ -86,24 +90,24 @@ export function parseListMultipart(xml) { } xmlobj = xmlobj.ListMultipartUploadsResult if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextKeyMarker) result.nextKeyMarker = xmlobj.NextKeyMarker + if (xmlobj.NextKeyMarker) result.nextKeyMarker = xmlobj.NextKeyMarker if (xmlobj.NextUploadIdMarker) result.nextUploadIdMarker = xmlobj.nextUploadIdMarker if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach(prefix => { - result.prefixes.push({prefix: sanitizeObjectKey(toArray(prefix.Prefix)[0])}) + toArray(xmlobj.CommonPrefixes).forEach((prefix) => { + result.prefixes.push({ prefix: sanitizeObjectKey(toArray(prefix.Prefix)[0]) }) }) } if (xmlobj.Upload) { - toArray(xmlobj.Upload).forEach(upload => { + toArray(xmlobj.Upload).forEach((upload) => { var key = upload.Key var uploadId = upload.UploadId - var initiator = {id: upload.Initiator.ID, displayName: upload.Initiator.DisplayName} - var owner = {id: upload.Owner.ID, displayName: upload.Owner.DisplayName} + var initiator = { id: upload.Initiator.ID, displayName: upload.Initiator.DisplayName } + var owner = { id: upload.Owner.ID, displayName: upload.Owner.DisplayName } var storageClass = upload.StorageClass var initiated = new Date(upload.Initiated) - result.uploads.push({key, uploadId, initiator, owner, storageClass, initiated}) + result.uploads.push({ key, uploadId, initiator, owner, storageClass, initiated }) }) } return result @@ -121,10 +125,10 @@ export function parseListBucket(xml) { if (xmlobj.Buckets) { if (xmlobj.Buckets.Bucket) { - toArray(xmlobj.Buckets.Bucket).forEach(bucket => { + toArray(xmlobj.Buckets.Bucket).forEach((bucket) => { var name = bucket.Name var creationDate = new Date(bucket.CreationDate) - result.push({name, creationDate}) + result.push({ name, creationDate }) }) } } @@ -134,32 +138,32 @@ export function parseListBucket(xml) { // parse XML response for bucket notification export function parseBucketNotification(xml) { var result = { - TopicConfiguration : [], - QueueConfiguration : [], - CloudFunctionConfiguration : [], + TopicConfiguration: [], + QueueConfiguration: [], + CloudFunctionConfiguration: [], } // Parse the events list - var genEvents = function(events) { + var genEvents = function (events) { var result = [] if (events) { - toArray(events).forEach(s3event => { + toArray(events).forEach((s3event) => { result.push(s3event) }) } return result } // Parse all filter rules - var genFilterRules = function(filters) { + var genFilterRules = function (filters) { var result = [] if (filters) { filters = toArray(filters) if (filters[0].S3Key) { filters[0].S3Key = toArray(filters[0].S3Key) if (filters[0].S3Key[0].FilterRule) { - toArray(filters[0].S3Key[0].FilterRule).forEach(rule => { + toArray(filters[0].S3Key[0].FilterRule).forEach((rule) => { var Name = toArray(rule.Name)[0] var Value = toArray(rule.Value)[0] - result.push({Name, Value}) + result.push({ Name, Value }) }) } } @@ -172,32 +176,32 @@ export function parseBucketNotification(xml) { // Parse all topic configurations in the xml if (xmlobj.TopicConfiguration) { - toArray(xmlobj.TopicConfiguration).forEach(config => { + toArray(xmlobj.TopicConfiguration).forEach((config) => { var Id = toArray(config.Id)[0] var Topic = toArray(config.Topic)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.TopicConfiguration.push({ Id, Topic, Event, Filter}) + result.TopicConfiguration.push({ Id, Topic, Event, Filter }) }) } // Parse all topic configurations in the xml if (xmlobj.QueueConfiguration) { - toArray(xmlobj.QueueConfiguration).forEach(config => { + toArray(xmlobj.QueueConfiguration).forEach((config) => { var Id = toArray(config.Id)[0] var Queue = toArray(config.Queue)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.QueueConfiguration.push({ Id, Queue, Event, Filter}) + result.QueueConfiguration.push({ Id, Queue, Event, Filter }) }) } // Parse all QueueConfiguration arrays if (xmlobj.CloudFunctionConfiguration) { - toArray(xmlobj.CloudFunctionConfiguration).forEach(config => { + toArray(xmlobj.CloudFunctionConfiguration).forEach((config) => { var Id = toArray(config.Id)[0] var CloudFunction = toArray(config.CloudFunction)[0] var Event = genEvents(config.Event) var Filter = genFilterRules(config.Filter) - result.CloudFunctionConfiguration.push({ Id, CloudFunction, Event, Filter}) + result.CloudFunctionConfiguration.push({ Id, CloudFunction, Event, Filter }) }) } @@ -216,7 +220,7 @@ export function parseListParts(xml) { var result = { isTruncated: false, parts: [], - marker: undefined + marker: undefined, } if (!xmlobj.ListPartsResult) { throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"') @@ -225,13 +229,16 @@ export function parseListParts(xml) { if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated if (xmlobj.NextPartNumberMarker) result.marker = +toArray(xmlobj.NextPartNumberMarker)[0] if (xmlobj.Part) { - toArray(xmlobj.Part).forEach(p => { - var part = + toArray(p.PartNumber)[0] + toArray(xmlobj.Part).forEach((p) => { + var part = +toArray(p.PartNumber)[0] var lastModified = new Date(p.LastModified) - var etag = p.ETag.replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') - result.parts.push({part, lastModified, etag}) + var etag = p.ETag.replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') + result.parts.push({ part, lastModified, etag }) }) } return result @@ -257,32 +264,27 @@ export function parseCompleteMultipart(xml) { var location = toArray(xmlobj.Location)[0] var bucket = toArray(xmlobj.Bucket)[0] var key = xmlobj.Key - var etag = xmlobj.ETag.replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') - .replace(/^"/g, '').replace(/"$/g, '') + var etag = xmlobj.ETag.replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') + .replace(/^"/g, '') + .replace(/"$/g, '') - return {location, bucket, key, etag} + return { location, bucket, key, etag } } // Complete Multipart can return XML Error after a 200 OK response if (xmlobj.Code && xmlobj.Message) { var errCode = toArray(xmlobj.Code)[0] var errMessage = toArray(xmlobj.Message)[0] - return {errCode, errMessage} + return { errCode, errMessage } } } -const formatObjInfo = (content, opts={}) => { - - let { - Key, - LastModified, - ETag, - Size, - VersionId, - IsLatest - } = content - - if(!isObject(opts)){ +const formatObjInfo = (content, opts = {}) => { + let { Key, LastModified, ETag, Size, VersionId, IsLatest } = content + + if (!isObject(opts)) { opts = {} } @@ -294,10 +296,10 @@ const formatObjInfo = (content, opts={}) => { name, lastModified, etag, - size:Size, - versionId:VersionId, - isLatest:IsLatest, - isDeleteMarker:opts.IsDeleteMarker ? opts.IsDeleteMarker: false + size: Size, + versionId: VersionId, + isLatest: IsLatest, + isDeleteMarker: opts.IsDeleteMarker ? opts.IsDeleteMarker : false, } } @@ -305,56 +307,56 @@ const formatObjInfo = (content, opts={}) => { export function parseListObjects(xml) { var result = { objects: [], - isTruncated: false + isTruncated: false, } let isTruncated = false let nextMarker, nextVersionKeyMarker const xmlobj = parseXml(xml) - const parseCommonPrefixesEntity = responseEntity => { - if(responseEntity){ + const parseCommonPrefixesEntity = (responseEntity) => { + if (responseEntity) { toArray(responseEntity).forEach((commonPrefix) => { - result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0}) + result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) }) } } const listBucketResult = xmlobj.ListBucketResult - const listVersionsResult=xmlobj.ListVersionsResult + const listVersionsResult = xmlobj.ListVersionsResult - if(listBucketResult){ - if ( listBucketResult.IsTruncated) { + if (listBucketResult) { + if (listBucketResult.IsTruncated) { isTruncated = listBucketResult.IsTruncated } if (listBucketResult.Contents) { - toArray(listBucketResult.Contents).forEach(content => { + toArray(listBucketResult.Contents).forEach((content) => { const name = sanitizeObjectKey(toArray(content.Key)[0]) const lastModified = new Date(toArray(content.LastModified)[0]) const etag = sanitizeETag(toArray(content.ETag)[0]) const size = content.Size - result.objects.push({name, lastModified, etag, size}) + result.objects.push({ name, lastModified, etag, size }) }) } - - if( listBucketResult.NextMarker){ + + if (listBucketResult.NextMarker) { nextMarker = listBucketResult.NextMarker } parseCommonPrefixesEntity(listBucketResult.CommonPrefixes) } - - if(listVersionsResult){ - if(listVersionsResult.IsTruncated){ + + if (listVersionsResult) { + if (listVersionsResult.IsTruncated) { isTruncated = listVersionsResult.IsTruncated } if (listVersionsResult.Version) { - toArray(listVersionsResult.Version).forEach(content => { + toArray(listVersionsResult.Version).forEach((content) => { result.objects.push(formatObjInfo(content)) }) } if (listVersionsResult.DeleteMarker) { - toArray(listVersionsResult.DeleteMarker).forEach(content => { - result.objects.push(formatObjInfo(content, {IsDeleteMarker:true})) + toArray(listVersionsResult.DeleteMarker).forEach((content) => { + result.objects.push(formatObjInfo(content, { IsDeleteMarker: true })) }) } @@ -367,7 +369,7 @@ export function parseListObjects(xml) { parseCommonPrefixesEntity(listVersionsResult.CommonPrefixes) } - result.isTruncated= isTruncated + result.isTruncated = isTruncated if (isTruncated) { result.nextMarker = nextVersionKeyMarker || nextMarker } @@ -378,7 +380,7 @@ export function parseListObjects(xml) { export function parseListObjectsV2(xml) { var result = { objects: [], - isTruncated: false + isTruncated: false, } var xmlobj = parseXml(xml) if (!xmlobj.ListBucketResult) { @@ -388,17 +390,17 @@ export function parseListObjectsV2(xml) { if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken if (xmlobj.Contents) { - toArray(xmlobj.Contents).forEach(content => { + toArray(xmlobj.Contents).forEach((content) => { var name = sanitizeObjectKey(toArray(content.Key)[0]) var lastModified = new Date(content.LastModified) var etag = sanitizeETag(content.ETag) var size = content.Size - result.objects.push({name, lastModified, etag, size}) + result.objects.push({ name, lastModified, etag, size }) }) } if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach(commonPrefix => { - result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size:0}) + toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => { + result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) }) } return result @@ -408,7 +410,7 @@ export function parseListObjectsV2(xml) { export function parseListObjectsV2WithMetadata(xml) { var result = { objects: [], - isTruncated: false + isTruncated: false, } var xmlobj = parseXml(xml) if (!xmlobj.ListBucketResult) { @@ -419,7 +421,7 @@ export function parseListObjectsV2WithMetadata(xml) { if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken if (xmlobj.Contents) { - toArray(xmlobj.Contents).forEach(content => { + toArray(xmlobj.Contents).forEach((content) => { var name = sanitizeObjectKey(content.Key) var lastModified = new Date(content.LastModified) var etag = sanitizeETag(content.ETag) @@ -430,57 +432,60 @@ export function parseListObjectsV2WithMetadata(xml) { } else { metadata = null } - result.objects.push({name, lastModified, etag, size, metadata}) + result.objects.push({ name, lastModified, etag, size, metadata }) }) } if (xmlobj.CommonPrefixes) { - toArray(xmlobj.CommonPrefixes).forEach(commonPrefix => { - result.objects.push({prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size:0}) + toArray(xmlobj.CommonPrefixes).forEach((commonPrefix) => { + result.objects.push({ prefix: sanitizeObjectKey(toArray(commonPrefix.Prefix)[0]), size: 0 }) }) } return result } -export function parseBucketVersioningConfig(xml){ +export function parseBucketVersioningConfig(xml) { var xmlObj = parseXml(xml) return xmlObj.VersioningConfiguration } -export function parseTagging(xml){ +export function parseTagging(xml) { const xmlObj = parseXml(xml) - let result =[] - if(xmlObj.Tagging && xmlObj.Tagging.TagSet&& xmlObj.Tagging.TagSet.Tag){ + let result = [] + if (xmlObj.Tagging && xmlObj.Tagging.TagSet && xmlObj.Tagging.TagSet.Tag) { const tagResult = xmlObj.Tagging.TagSet.Tag // if it is a single tag convert into an array so that the return value is always an array. - if(isObject(tagResult)){ + if (isObject(tagResult)) { result.push(tagResult) - }else{ + } else { result = tagResult } } return result } -export function parseLifecycleConfig(xml){ +export function parseLifecycleConfig(xml) { const xmlObj = parseXml(xml) return xmlObj.LifecycleConfiguration } - -export function parseObjectLockConfig(xml){ +export function parseObjectLockConfig(xml) { const xmlObj = parseXml(xml) - let lockConfigResult={} - if(xmlObj.ObjectLockConfiguration) { + let lockConfigResult = {} + if (xmlObj.ObjectLockConfiguration) { lockConfigResult = { - objectLockEnabled: xmlObj.ObjectLockConfiguration.ObjectLockEnabled + objectLockEnabled: xmlObj.ObjectLockConfiguration.ObjectLockEnabled, } let retentionResp - if(xmlObj.ObjectLockConfiguration && xmlObj.ObjectLockConfiguration.Rule && xmlObj.ObjectLockConfiguration.Rule.DefaultRetention){ + if ( + xmlObj.ObjectLockConfiguration && + xmlObj.ObjectLockConfiguration.Rule && + xmlObj.ObjectLockConfiguration.Rule.DefaultRetention + ) { retentionResp = xmlObj.ObjectLockConfiguration.Rule.DefaultRetention || {} - lockConfigResult.mode= retentionResp.Mode + lockConfigResult.mode = retentionResp.Mode } - if(retentionResp) { + if (retentionResp) { const isUnitYears = retentionResp.Years if (isUnitYears) { lockConfigResult.validity = isUnitYears @@ -494,104 +499,102 @@ export function parseObjectLockConfig(xml){ } } - -export function parseObjectRetentionConfig(xml){ +export function parseObjectRetentionConfig(xml) { const xmlObj = parseXml(xml) const retentionConfig = xmlObj.Retention return { - mode:retentionConfig.Mode, - retainUntilDate:retentionConfig.RetainUntilDate + mode: retentionConfig.Mode, + retainUntilDate: retentionConfig.RetainUntilDate, } } -export function parseBucketEncryptionConfig(xml){ +export function parseBucketEncryptionConfig(xml) { let encConfig = parseXml(xml) return encConfig } -export function parseReplicationConfig(xml){ +export function parseReplicationConfig(xml) { const xmlObj = parseXml(xml) const replicationConfig = { ReplicationConfiguration: { role: xmlObj.ReplicationConfiguration.Role, - rules: toArray(xmlObj.ReplicationConfiguration.Rule) - } + rules: toArray(xmlObj.ReplicationConfiguration.Rule), + }, } return replicationConfig } -export function parseObjectLegalHoldConfig(xml){ +export function parseObjectLegalHoldConfig(xml) { const xmlObj = parseXml(xml) return xmlObj.LegalHold } -export function uploadPartParser (xml){ +export function uploadPartParser(xml) { const xmlObj = parseXml(xml) const respEl = xmlObj.CopyPartResult return respEl } -export function removeObjectsParser(xml){ +export function removeObjectsParser(xml) { const xmlObj = parseXml(xml) - if(xmlObj.DeleteResult && xmlObj.DeleteResult.Error){ + if (xmlObj.DeleteResult && xmlObj.DeleteResult.Error) { // return errors as array always. as the response is object in case of single object passed in removeObjects return toArray(xmlObj.DeleteResult.Error) } return [] } -export function parseSelectObjectContentResponse(res){ - +export function parseSelectObjectContentResponse(res) { // extractHeaderType extracts the first half of the header message, the header type. function extractHeaderType(stream) { - const headerNameLen = Buffer.from(stream.read(1)).readUInt8() + const headerNameLen = Buffer.from(stream.read(1)).readUInt8() const headerNameWithSeparator = Buffer.from(stream.read(headerNameLen)).toString() - const splitBySeparator = (headerNameWithSeparator|| "").split(":") - const headerName = splitBySeparator.length >= 1 ? splitBySeparator[1] : "" + const splitBySeparator = (headerNameWithSeparator || '').split(':') + const headerName = splitBySeparator.length >= 1 ? splitBySeparator[1] : '' return headerName } - function extractHeaderValue(stream){ - const bodyLen= Buffer.from(stream.read(2)).readUInt16BE() - const bodyName= Buffer.from(stream.read(bodyLen)).toString() + function extractHeaderValue(stream) { + const bodyLen = Buffer.from(stream.read(2)).readUInt16BE() + const bodyName = Buffer.from(stream.read(bodyLen)).toString() return bodyName } - - const selectResults = new SelectResults({})// will be returned + const selectResults = new SelectResults({}) // will be returned const responseStream = readableStream(res) // convert byte array to a readable responseStream - while( responseStream._readableState.length ) { // Top level responseStream read tracker. + while (responseStream._readableState.length) { + // Top level responseStream read tracker. let msgCrcAccumulator // accumulate from start of the message till the message crc start. const totalByteLengthBuffer = Buffer.from(responseStream.read(4)) msgCrcAccumulator = crc32(totalByteLengthBuffer) const headerBytesBuffer = Buffer.from(responseStream.read(4)) - msgCrcAccumulator = crc32(headerBytesBuffer,msgCrcAccumulator) + msgCrcAccumulator = crc32(headerBytesBuffer, msgCrcAccumulator) const calculatedPreludeCrc = msgCrcAccumulator.readInt32BE() // use it to check if any CRC mismatch in header itself. - const preludeCrcBuffer = Buffer.from(responseStream.read(4))// read 4 bytes i.e 4+4 =8 + 4 = 12 ( prelude + prelude crc) - msgCrcAccumulator = crc32(preludeCrcBuffer,msgCrcAccumulator) + const preludeCrcBuffer = Buffer.from(responseStream.read(4)) // read 4 bytes i.e 4+4 =8 + 4 = 12 ( prelude + prelude crc) + msgCrcAccumulator = crc32(preludeCrcBuffer, msgCrcAccumulator) - const totalMsgLength=totalByteLengthBuffer.readInt32BE() - const headerLength=headerBytesBuffer.readInt32BE() + const totalMsgLength = totalByteLengthBuffer.readInt32BE() + const headerLength = headerBytesBuffer.readInt32BE() const preludeCrcByteValue = preludeCrcBuffer.readInt32BE() - if(preludeCrcByteValue !== calculatedPreludeCrc){ + if (preludeCrcByteValue !== calculatedPreludeCrc) { // Handle Header CRC mismatch Error - throw new Error(`Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}`) + throw new Error( + `Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}` + ) } const headers = {} if (headerLength > 0) { const headerBytes = Buffer.from(responseStream.read(headerLength)) - msgCrcAccumulator = crc32(headerBytes,msgCrcAccumulator) + msgCrcAccumulator = crc32(headerBytes, msgCrcAccumulator) const headerReaderStream = readableStream(headerBytes) - while ( - headerReaderStream._readableState.length - ) { + while (headerReaderStream._readableState.length) { let headerTypeName = extractHeaderType(headerReaderStream) headerReaderStream.read(1) // just read and ignore it. headers[headerTypeName] = extractHeaderValue(headerReaderStream) @@ -600,80 +603,83 @@ export function parseSelectObjectContentResponse(res){ let payloadStream const payLoadLength = totalMsgLength - headerLength - 16 - if(payLoadLength > 0) { + if (payLoadLength > 0) { const payLoadBuffer = Buffer.from(responseStream.read(payLoadLength)) msgCrcAccumulator = crc32(payLoadBuffer, msgCrcAccumulator) // read the checksum early and detect any mismatch so we can avoid unnecessary further processing. const messageCrcByteValue = Buffer.from(responseStream.read(4)).readInt32BE() const calculatedCrc = msgCrcAccumulator.readInt32BE() // Handle message CRC Error - if(messageCrcByteValue !== calculatedCrc){ - throw new Error(`Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}`) + if (messageCrcByteValue !== calculatedCrc) { + throw new Error( + `Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}` + ) } payloadStream = readableStream(payLoadBuffer) } - const messageType = headers["message-type"] + const messageType = headers['message-type'] switch (messageType) { - case "error": { - const errorMessage = headers["error-code"] + ":\"" + headers["error-message"] + "\"" - throw new Error(errorMessage) - } - case "event": { - const contentType = headers["content-type"] - const eventType = headers["event-type"] - - switch (eventType) { - case "End": { - selectResults.setResponse(res) - return selectResults - } - - case "Records": { - const readData = payloadStream.read(payLoadLength) - selectResults.setRecords(readData) - break - } - - case "Progress": { - switch (contentType) { - case "text/xml": { - const progressData = payloadStream.read(payLoadLength) - selectResults.setProgress(progressData.toString()) - break - } - default: { - const errorMessage = `Unexpected content-type ${contentType} sent for event-type Progress` - throw new Error(errorMessage) - } - } + case 'error': { + const errorMessage = headers['error-code'] + ':"' + headers['error-message'] + '"' + throw new Error(errorMessage) } - break - case "Stats": { - switch (contentType) { - case "text/xml": { - const statsData = payloadStream.read(payLoadLength) - selectResults.setStats(statsData.toString()) - break - } - default: { - const errorMessage = `Unexpected content-type ${contentType} sent for event-type Stats` - throw new Error(errorMessage) - } - } - } - break - default: { - // Continuation message: Not sure if it is supported. did not find a reference or any message in response. - // It does not have a payload. - const warningMessage = `Un implemented event detected ${messageType}.` - // eslint-disable-next-line no-console - console.warn(warningMessage) - } - } // eventType End - } // Event End + case 'event': { + const contentType = headers['content-type'] + const eventType = headers['event-type'] + + switch (eventType) { + case 'End': { + selectResults.setResponse(res) + return selectResults + } + + case 'Records': { + const readData = payloadStream.read(payLoadLength) + selectResults.setRecords(readData) + break + } + + case 'Progress': + { + switch (contentType) { + case 'text/xml': { + const progressData = payloadStream.read(payLoadLength) + selectResults.setProgress(progressData.toString()) + break + } + default: { + const errorMessage = `Unexpected content-type ${contentType} sent for event-type Progress` + throw new Error(errorMessage) + } + } + } + break + case 'Stats': + { + switch (contentType) { + case 'text/xml': { + const statsData = payloadStream.read(payLoadLength) + selectResults.setStats(statsData.toString()) + break + } + default: { + const errorMessage = `Unexpected content-type ${contentType} sent for event-type Stats` + throw new Error(errorMessage) + } + } + } + break + default: { + // Continuation message: Not sure if it is supported. did not find a reference or any message in response. + // It does not have a payload. + const warningMessage = `Un implemented event detected ${messageType}.` + // eslint-disable-next-line no-console + console.warn(warningMessage) + } + } // eventType End + } // Event End } // messageType End } // Top Level Stream End - -} \ No newline at end of file +} diff --git a/src/test/functional/functional-tests.js b/src/test/functional/functional-tests.js index 2a938ef0..655e99a5 100644 --- a/src/test/functional/functional-tests.js +++ b/src/test/functional/functional-tests.js @@ -26,20 +26,20 @@ const url = require('url') const chai = require('chai') const assert = chai.assert const superagent = require('superagent') -const uuid = require("uuid") +const uuid = require('uuid') const splitFile = require('split-file') -const step = require("mocha-steps").step +const step = require('mocha-steps').step let helpers try { - helpers = require("../../../dist/main/helpers") + helpers = require('../../../dist/main/helpers') } catch (err) { helpers = require('minio/dist/main/helpers') } let AssumeRoleProvider try { - AssumeRoleProvider = require("../../../dist/main/AssumeRoleProvider") + AssumeRoleProvider = require('../../../dist/main/AssumeRoleProvider') } catch (err) { AssumeRoleProvider = require('minio/dist/main/AssumeRoleProvider') } @@ -52,29 +52,23 @@ try { minio = require('minio') } -const { - getVersionId, isArray, - CopyDestinationOptions, - CopySourceOptions, - removeDirAndFiles, - DEFAULT_REGION -} = helpers +const { getVersionId, isArray, CopyDestinationOptions, CopySourceOptions, removeDirAndFiles, DEFAULT_REGION } = helpers require('source-map-support').install() -const isWindowsPlatform = process.platform === "win32" +const isWindowsPlatform = process.platform === 'win32' describe('functional tests', function () { this.timeout(30 * 60 * 1000) var clientConfigParams = {} - var region_conf_env=process.env['MINIO_REGION'] + var region_conf_env = process.env['MINIO_REGION'] if (process.env['SERVER_ENDPOINT']) { - var res = process.env['SERVER_ENDPOINT'].split(":") + var res = process.env['SERVER_ENDPOINT'].split(':') clientConfigParams.endPoint = res[0] clientConfigParams.port = parseInt(res[1]) - var access_Key_env= process.env['ACCESS_KEY'] - var secret_key_env=process.env['SECRET_KEY'] + var access_Key_env = process.env['ACCESS_KEY'] + var secret_key_env = process.env['SECRET_KEY'] // If the user provides ENABLE_HTTPS, 1 = secure, anything else = unsecure. // Otherwise default useSSL as true. @@ -94,8 +88,7 @@ describe('functional tests', function () { console.error(`Error: SECRET_KEY Environment variable is not set`) process.exit(1) } - clientConfigParams.useSSL = (enable_https_env == '1') - + clientConfigParams.useSSL = enable_https_env == '1' } else { // If credentials aren't given, default to play.min.io. clientConfigParams.endPoint = 'play.min.io' @@ -111,7 +104,6 @@ describe('functional tests', function () { // if not set, putObject with stream data and undefined length will use about 500Mb chunkSize (5Tb/10000). clientConfigParams.partSize = 64 * 1024 * 1024 - // dataDir is falsy if we need to generate data on the fly. Otherwise, it will be // a directory with files to read from, i.e. /mint/data. var dataDir = process.env['MINT_DATA_DIR'] @@ -121,7 +113,6 @@ describe('functional tests', function () { usEastConfig.region = server_region var clientUsEastRegion = new minio.Client(usEastConfig) - var traceStream // FUNCTIONAL_TEST_TRACE env variable contains the path to which trace // will be logged. Set it to /dev/stdout log to the stdout. @@ -131,13 +122,13 @@ describe('functional tests', function () { if (trace_func_test_file_path === 'process.stdout') { traceStream = process.stdout } else { - traceStream = fs.createWriteStream(trace_func_test_file_path, {flags: 'a'}) + traceStream = fs.createWriteStream(trace_func_test_file_path, { flags: 'a' }) } traceStream.write('====================================\n') client.traceOn(traceStream) } - var bucketName = "minio-js-test-" + uuid.v4() + var bucketName = 'minio-js-test-' + uuid.v4() var objectName = uuid.v4() var _1byteObjectName = 'datafile-1-b' @@ -162,13 +153,13 @@ describe('functional tests', function () { var _5mbmd5 = crypto.createHash('md5').update(_5mb).digest('hex') // create new http agent to check requests release sockets - var httpAgent = (clientConfigParams.useSSL ? https : http).Agent({keepAlive: true}) - client.setRequestOptions({agent: httpAgent}) + var httpAgent = (clientConfigParams.useSSL ? https : http).Agent({ keepAlive: true }) + client.setRequestOptions({ agent: httpAgent }) var metaData = { 'Content-Type': 'text/html', 'Content-Language': 'en', 'X-Amz-Meta-Testing': 1234, - 'randomstuff': 5678 + randomstuff: 5678, } var tmpDir = os.tmpdir() @@ -181,8 +172,8 @@ describe('functional tests', function () { return s } - before(done => client.makeBucket(bucketName, server_region, done)) - after(done => client.removeBucket(bucketName, done)) + before((done) => client.makeBucket(bucketName, server_region, done)) + after((done) => client.removeBucket(bucketName, done)) if (traceStream) { after(() => { @@ -195,25 +186,26 @@ describe('functional tests', function () { describe('makeBucket with period and region', () => { if (clientConfigParams.endPoint === 's3.amazonaws.com') { - step('makeBucket(bucketName, region, cb)_region:eu-central-1_', done => client.makeBucket(`${bucketName}.sec.period`, - 'eu-central-1', done)) - step('removeBucket(bucketName, cb)__', done => client.removeBucket(`${bucketName}.sec.period`, done)) + step('makeBucket(bucketName, region, cb)_region:eu-central-1_', (done) => + client.makeBucket(`${bucketName}.sec.period`, 'eu-central-1', done) + ) + step('removeBucket(bucketName, cb)__', (done) => client.removeBucket(`${bucketName}.sec.period`, done)) } }) describe('listBuckets', () => { - step('listBuckets(cb)__', done => { + step('listBuckets(cb)__', (done) => { client.listBuckets((e, buckets) => { if (e) return done(e) - if (_.find(buckets, {name: bucketName})) return done() + if (_.find(buckets, { name: bucketName })) return done() done(new Error('bucket not found')) }) }) - step('listBuckets()__', done => { - client.listBuckets() - .then(buckets => { - if (!_.find(buckets, {name: bucketName})) - return done(new Error('bucket not found')) + step('listBuckets()__', (done) => { + client + .listBuckets() + .then((buckets) => { + if (!_.find(buckets, { name: bucketName })) return done(new Error('bucket not found')) }) .then(() => done()) .catch(done) @@ -222,7 +214,7 @@ describe('functional tests', function () { describe('makeBucket with region', () => { let isDifferentServerRegion = false - step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-2_`, done => { + step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-2_`, (done) => { try { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-2', assert.fail) } catch (e) { @@ -230,20 +222,20 @@ describe('functional tests', function () { done() } }) - step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-1_`, done => { - if(!isDifferentServerRegion) { + step(`makeBucket(bucketName, region, cb)_bucketName:${bucketName}-region, region:us-east-1_`, (done) => { + if (!isDifferentServerRegion) { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-1', done) } done() }) - step(`removeBucket(bucketName, cb)_bucketName:${bucketName}-region_`, done => { - if(!isDifferentServerRegion) { + step(`removeBucket(bucketName, cb)_bucketName:${bucketName}-region_`, (done) => { + if (!isDifferentServerRegion) { clientUsEastRegion.removeBucket(`${bucketName}-region`, done) } done() }) - step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region, region:us-east-1_`, done => { - if(!isDifferentServerRegion) { + step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region, region:us-east-1_`, (done) => { + if (!isDifferentServerRegion) { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-1', (e) => { if (e) { // Some object storage servers like Azure, might not delete a bucket rightaway @@ -256,9 +248,10 @@ describe('functional tests', function () { } done() }) - step(`removeBucket(bucketName)_bucketName:${bucketName}-region_`, done => { - if(!isDifferentServerRegion) { - clientUsEastRegion.removeBucket(`${bucketName}-region`) + step(`removeBucket(bucketName)_bucketName:${bucketName}-region_`, (done) => { + if (!isDifferentServerRegion) { + clientUsEastRegion + .removeBucket(`${bucketName}-region`) .then(() => done()) .catch(done) } @@ -267,70 +260,84 @@ describe('functional tests', function () { }) describe('bucketExists', () => { - step(`bucketExists(bucketName, cb)_bucketName:${bucketName}_`, done => client.bucketExists(bucketName, done)) - step(`bucketExists(bucketName, cb)_bucketName:${bucketName}random_`, done => { + step(`bucketExists(bucketName, cb)_bucketName:${bucketName}_`, (done) => client.bucketExists(bucketName, done)) + step(`bucketExists(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { client.bucketExists(bucketName + 'random', (e, exists) => { if (e === null && !exists) return done() done(new Error()) }) }) - step(`bucketExists(bucketName)_bucketName:${bucketName}_`, done => { - client.bucketExists(bucketName) + step(`bucketExists(bucketName)_bucketName:${bucketName}_`, (done) => { + client + .bucketExists(bucketName) .then(() => done()) .catch(done) }) }) - describe('removeBucket', () => { - step(`removeBucket(bucketName, cb)_bucketName:${bucketName}random_`, done => { + step(`removeBucket(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { client.removeBucket(bucketName + 'random', (e) => { if (e.code === 'NoSuchBucket') return done() done(new Error()) }) }) - step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region-1, region:us-east-1_`, done => { - client.makeBucket(`${bucketName}-region-1`, '') + step(`makeBucket(bucketName, region)_bucketName:${bucketName}-region-1, region:us-east-1_`, (done) => { + client + .makeBucket(`${bucketName}-region-1`, '') .then(() => client.removeBucket(`${bucketName}-region-1`)) .then(() => done()) .catch(done) }) }) describe('tests for putObject getObject removeObject with multipath', function () { - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}, stream:100Kib_`, done => { - client.putObject(bucketName, _MultiPath100kbObjectBufferName, _100kb) - .then(() => done()) - .catch(done) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}, stream:100Kib_`, + (done) => { + client + .putObject(bucketName, _MultiPath100kbObjectBufferName, _100kb) + .then(() => done()) + .catch(done) + } + ) - step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, done => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _MultiPath100kbObjectBufferName, (e, stream) => { - if (e) return done(e) - stream.on('data', data => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() - done(new Error('content mismatch')) + step( + `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, + (done) => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _MultiPath100kbObjectBufferName, (e, stream) => { + if (e) return done(e) + stream.on('data', (data) => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === _100kbmd5) return done() + done(new Error('content mismatch')) + }) }) - }) - }) - - step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, done => { - client.removeObject(bucketName, _MultiPath100kbObjectBufferName) - .then(() => done()) - .catch(done) - }) + } + ) + step( + `removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_MultiPath100kbObjectBufferName}_`, + (done) => { + client + .removeObject(bucketName, _MultiPath100kbObjectBufferName) + .then(() => done()) + .catch(done) + } + ) }) describe('tests for putObject copyObject getObject getPartialObject statObject removeObject', function () { var tmpFileUpload = `${tmpDir}/${_100kbObjectName}` - step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUpload}_`, done => { - fs.writeFileSync(tmpFileUpload, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUpload, done) - }) + step( + `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUpload}_`, + (done) => { + fs.writeFileSync(tmpFileUpload, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUpload, done) + } + ) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is not provided and there is no file extension, @@ -343,12 +350,15 @@ describe('functional tests', function () { }) var tmpFileUploadWithExt = `${tmpDir}/${_100kbObjectName}.txt` - step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}, metaData:${metaData}_`, done => { - fs.writeFileSync(tmpFileUploadWithExt, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, metaData, done) - }) + step( + `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}, metaData:${metaData}_`, + (done) => { + fs.writeFileSync(tmpFileUploadWithExt, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, metaData, done) + } + ) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is provided, even though we have an extension, @@ -362,128 +372,169 @@ describe('functional tests', function () { }) }) - step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}_`, done => { - fs.writeFileSync(tmpFileUploadWithExt, _100kb) - client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, done) - }) + step( + `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, filePath: ${tmpFileUploadWithExt}_`, + (done) => { + fs.writeFileSync(tmpFileUploadWithExt, _100kb) + client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, done) + } + ) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) // As metadata is not provided but we have a file extension, // we need to infer `content-type` from the file extension - if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') return done(new Error('content-type mismatch')) + if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') + return done(new Error('content-type mismatch')) done() }) }) - step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}, metaData:${metaData}_`, done => { - var stream = readableStream(_100kb) - client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, metaData, done) - }) - - step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}_`, done => { - var stream = readableStream(_100kb) - client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, done) - }) - - step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _100kbObjectName, (e, stream) => { - if (e) return done(e) - stream.on('data', data => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() - done(new Error('content mismatch')) - }) - }) - }) - - step(`putObject(bucketName, objectName, stream, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_`, done => { - client.putObject(bucketName, _100kbObjectBufferName, _100kb, '', done) - }) - - step(`getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, done => { - var hash = crypto.createHash('md5') - client.getObject(bucketName, _100kbObjectBufferName, (e, stream) => { - if (e) return done(e) - stream.on('data', data => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() - done(new Error('content mismatch')) - }) - }) - }) - - step(`putObject(bucketName, objectName, stream, metaData)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_, metaData:{}`, done => { - client.putObject(bucketName, _100kbObjectBufferName, _100kb, {}) - .then(() => done()) - .catch(done) - }) + step( + `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}, metaData:${metaData}_`, + (done) => { + var stream = readableStream(_100kb) + client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, metaData, done) + } + ) - step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:0, length=1024_`, done => { - client.getPartialObject(bucketName, _100kbObjectBufferName, 0, 1024) - .then(stream => { - stream.on('data', function() {}) - stream.on('end', done) - }) - .catch(done) - }) + step( + `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream:100kb, size:${_100kb.length}_`, + (done) => { + var stream = readableStream(_100kb) + client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, done) + } + ) - step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024, length=1024_`, done => { - var expectedHash = crypto.createHash('md5').update(_100kb.slice(1024, 2048)).digest('hex') - var hash = crypto.createHash('md5') - client.getPartialObject(bucketName, _100kbObjectBufferName, 1024, 1024) - .then(stream => { - stream.on('data', data => hash.update(data)) + step( + `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, + (done) => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _100kbObjectName, (e, stream) => { + if (e) return done(e) + stream.on('data', (data) => hash.update(data)) + stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() + if (hash.digest('hex') === _100kbmd5) return done() done(new Error('content mismatch')) }) }) - .catch(done) - }) + } + ) - step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024`, done => { - var hash = crypto.createHash('md5') - client.getPartialObject(bucketName, _100kbObjectBufferName, 1024) - .then(stream => { - stream.on('data', data => hash.update(data)) + step( + `putObject(bucketName, objectName, stream, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_`, + (done) => { + client.putObject(bucketName, _100kbObjectBufferName, _100kb, '', done) + } + ) + + step( + `getObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, + (done) => { + var hash = crypto.createHash('md5') + client.getObject(bucketName, _100kbObjectBufferName, (e, stream) => { + if (e) return done(e) + stream.on('data', (data) => hash.update(data)) + stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === _100kb1kboffsetmd5) return done() + if (hash.digest('hex') === _100kbmd5) return done() done(new Error('content mismatch')) }) }) - .catch(done) - }) - - step(`getObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, done => { - client.getObject(bucketName, _100kbObjectBufferName) - .then(stream => { - stream.on('data', function() {}) - stream.on('end', done) - }) - .catch(done) - }) + } + ) - step(`putObject(bucketName, objectName, stream, metadata, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { - var stream = readableStream(_65mb) - client.putObject(bucketName, _65mbObjectName, stream, metaData, () => { - setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() - done(new Error('http request did not release network socket')) - }, 100) - }) + step( + `putObject(bucketName, objectName, stream, metaData)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_, metaData:{}`, + (done) => { + client + .putObject(bucketName, _100kbObjectBufferName, _100kb, {}) + .then(() => done()) + .catch(done) + } + ) + + step( + `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:0, length=1024_`, + (done) => { + client + .getPartialObject(bucketName, _100kbObjectBufferName, 0, 1024) + .then((stream) => { + stream.on('data', function () {}) + stream.on('end', done) + }) + .catch(done) + } + ) + + step( + `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024, length=1024_`, + (done) => { + var expectedHash = crypto.createHash('md5').update(_100kb.slice(1024, 2048)).digest('hex') + var hash = crypto.createHash('md5') + client + .getPartialObject(bucketName, _100kbObjectBufferName, 1024, 1024) + .then((stream) => { + stream.on('data', (data) => hash.update(data)) + stream.on('end', () => { + if (hash.digest('hex') === expectedHash) return done() + done(new Error('content mismatch')) + }) + }) + .catch(done) + } + ) + + step( + `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, offset:1024`, + (done) => { + var hash = crypto.createHash('md5') + client + .getPartialObject(bucketName, _100kbObjectBufferName, 1024) + .then((stream) => { + stream.on('data', (data) => hash.update(data)) + stream.on('end', () => { + if (hash.digest('hex') === _100kb1kboffsetmd5) return done() + done(new Error('content mismatch')) + }) + }) + .catch(done) + } + ) + + step( + `getObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}_`, + (done) => { + client + .getObject(bucketName, _100kbObjectBufferName) + .then((stream) => { + stream.on('data', function () {}) + stream.on('end', done) + }) + .catch(done) + } + ) - }) + step( + `putObject(bucketName, objectName, stream, metadata, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, + (done) => { + var stream = readableStream(_65mb) + client.putObject(bucketName, _65mbObjectName, stream, metaData, () => { + setTimeout(() => { + if (Object.values(httpAgent.sockets).length === 0) return done() + done(new Error('http request did not release network socket')) + }, 100) + }) + } + ) - step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { + step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { var hash = crypto.createHash('md5') client.getObject(bucketName, _65mbObjectName, (e, stream) => { if (e) return done(e) - stream.on('data', data => hash.update(data)) + stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { if (hash.digest('hex') === _65mbmd5) return done() @@ -492,89 +543,116 @@ describe('functional tests', function () { }) }) - step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName} non-existent object`, done => { + step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName} non-existent object`, (done) => { client.getObject(bucketName, 'an-object-that-does-not-exist', (e, stream) => { - if (stream) return done(new Error("on errors the stream object should not exist")) - if (!e) return done(new Error("expected an error object")) - if (e.code !== 'NoSuchKey') return done(new Error("expected NoSuchKey error")) + if (stream) return done(new Error('on errors the stream object should not exist')) + if (!e) return done(new Error('expected an error object')) + if (e.code !== 'NoSuchKey') return done(new Error('expected NoSuchKey error')) done() }) }) - step(`getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, offset:0, length:100*1024_`, done => { - var hash = crypto.createHash('md5') - var expectedHash = crypto.createHash('md5').update(_65mb.slice(0, 100 * 1024)).digest('hex') - client.getPartialObject(bucketName, _65mbObjectName, 0, 100 * 1024, (e, stream) => { - if (e) return done(e) - stream.on('data', data => hash.update(data)) - stream.on('error', done) - stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() - done(new Error('content mismatch')) + step( + `getPartialObject(bucketName, objectName, offset, length, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, offset:0, length:100*1024_`, + (done) => { + var hash = crypto.createHash('md5') + var expectedHash = crypto + .createHash('md5') + .update(_65mb.slice(0, 100 * 1024)) + .digest('hex') + client.getPartialObject(bucketName, _65mbObjectName, 0, 100 * 1024, (e, stream) => { + if (e) return done(e) + stream.on('data', (data) => hash.update(data)) + stream.on('error', done) + stream.on('end', () => { + if (hash.digest('hex') === expectedHash) return done() + done(new Error('content mismatch')) + }) }) - }) - }) + } + ) - step(`copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, done => { - client.copyObject(bucketName, _65mbObjectNameCopy, "/" + bucketName + "/" + _65mbObjectName, (e) => { - if (e) return done(e) - done() - }) - }) + step( + `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, + (done) => { + client.copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName, (e) => { + if (e) return done(e) + done() + }) + } + ) - step(`copyObject(bucketName, objectName, srcObject)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, done => { - client.copyObject(bucketName, _65mbObjectNameCopy, "/" + bucketName + "/" + _65mbObjectName) - .then(() => done()) - .catch(done) - }) + step( + `copyObject(bucketName, objectName, srcObject)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, + (done) => { + client + .copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName) + .then(() => done()) + .catch(done) + } + ) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { client.statObject(bucketName, _65mbObjectName, (e, stat) => { if (e) return done(e) if (stat.size !== _65mb.length) return done(new Error('size mismatch')) - if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) return done(new Error('metadata "randomstuff" mismatch')) - if (`${metaData["X-Amz-Meta-Testing"]}` !== stat.metaData["testing"]) return done(new Error('metadata "testing" mismatch')) - if (`${metaData["Content-Type"]}` !== stat.metaData["content-type"]) return done(new Error('metadata "content-type" mismatch')) - if (`${metaData["Content-Language"]}` !== stat.metaData["content-language"]) return done(new Error('metadata "content-language" mismatch')) + if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) + return done(new Error('metadata "randomstuff" mismatch')) + if (`${metaData['X-Amz-Meta-Testing']}` !== stat.metaData['testing']) + return done(new Error('metadata "testing" mismatch')) + if (`${metaData['Content-Type']}` !== stat.metaData['content-type']) + return done(new Error('metadata "content-type" mismatch')) + if (`${metaData['Content-Language']}` !== stat.metaData['content-language']) + return done(new Error('metadata "content-language" mismatch')) done() }) }) - step(`statObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { - client.statObject(bucketName, _65mbObjectName) - .then(stat => { - if (stat.size !== _65mb.length) - return done(new Error('size mismatch')) + step(`statObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { + client + .statObject(bucketName, _65mbObjectName) + .then((stat) => { + if (stat.size !== _65mb.length) return done(new Error('size mismatch')) }) .then(() => done()) .catch(done) }) - step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { - client.removeObject(bucketName, _100kbObjectName) + step(`removeObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { + client + .removeObject(bucketName, _100kbObjectName) .then(function () { - async.map([_100kbObjectBufferName, _65mbObjectName, _65mbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) + async.map( + [_100kbObjectBufferName, _65mbObjectName, _65mbObjectNameCopy], + (objectName, cb) => client.removeObject(bucketName, objectName, cb), + done + ) }) .catch(done) }) - }) describe('tests for copyObject statObject', function () { var etag var modifiedDate - step(`putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream: 100kb, metaData:${metaData}_`, done => { - client.putObject(bucketName, _100kbObjectName, _100kb, metaData, done) - }) + step( + `putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream: 100kb, metaData:${metaData}_`, + (done) => { + client.putObject(bucketName, _100kbObjectName, _100kb, metaData, done) + } + ) - step(`copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}_`, done => { - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, (e) => { - if (e) return done(e) - done() - }) - }) + step( + `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}_`, + (done) => { + client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, (e) => { + if (e) return done(e) + done() + }) + } + ) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, done => { + step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { if (e) return done(e) if (stat.size !== _100kb.length) return done(new Error('size mismatch')) @@ -587,123 +665,162 @@ describe('functional tests', function () { }) }) - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptIncorrectEtag_`, done => { - var conds = new minio.CopyConditions() - conds.setMatchETagExcept('TestEtag') - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() - }) - }) - - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptCorrectEtag_`, done => { - var conds = new minio.CopyConditions() - conds.setMatchETagExcept(etag) - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) - .then(() => { - done(new Error("CopyObject should have failed.")) + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptIncorrectEtag_`, + (done) => { + var conds = new minio.CopyConditions() + conds.setMatchETagExcept('TestEtag') + client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() }) - .catch(() => done()) - }) - - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchCorrectEtag_`, done => { - var conds = new minio.CopyConditions() - conds.setMatchETag(etag) - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() - }) - }) - - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchIncorrectEtag_`, done => { - var conds = new minio.CopyConditions() - conds.setMatchETag('TestETag') - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) - .then(() => { - done(new Error("CopyObject should have failed.")) + } + ) + + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:ExceptCorrectEtag_`, + (done) => { + var conds = new minio.CopyConditions() + conds.setMatchETagExcept(etag) + client + .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) + .then(() => { + done(new Error('CopyObject should have failed.')) + }) + .catch(() => done()) + } + ) + + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchCorrectEtag_`, + (done) => { + var conds = new minio.CopyConditions() + conds.setMatchETag(etag) + client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() }) - .catch(() => done()) - }) - - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since ${modifiedDate}`, done => { - var conds = new minio.CopyConditions() - conds.setUnmodified(new Date(modifiedDate)) - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds, (e) => { - if (e) return done(e) - done() - }) - }) - - step(`copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since 2010-03-26T12:00:00Z_`, done => { - var conds = new minio.CopyConditions() - conds.setUnmodified(new Date("2010-03-26T12:00:00Z")) - client.copyObject(bucketName, _100kbObjectNameCopy, "/" + bucketName + "/" + _100kbObjectName, conds) - .then(() => { - done(new Error("CopyObject should have failed.")) + } + ) + + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:MatchIncorrectEtag_`, + (done) => { + var conds = new minio.CopyConditions() + conds.setMatchETag('TestETag') + client + .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) + .then(() => { + done(new Error('CopyObject should have failed.')) + }) + .catch(() => done()) + } + ) + + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since ${modifiedDate}`, + (done) => { + var conds = new minio.CopyConditions() + conds.setUnmodified(new Date(modifiedDate)) + client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { + if (e) return done(e) + done() }) - .catch(() => done()) - }) - - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, done => { - client.statObject(bucketName, _100kbObjectNameCopy, (e, stat) => { - if (e) return done(e) - if (stat.size !== _100kb.length) return done(new Error('size mismatch')) - done() - }) - }) - - step(`removeObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, done => { - async.map([_100kbObjectName, _100kbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) - }) + } + ) + + step( + `copyObject(bucketName, objectName, srcObject, conditions, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}, conditions:Unmodified since 2010-03-26T12:00:00Z_`, + (done) => { + var conds = new minio.CopyConditions() + conds.setUnmodified(new Date('2010-03-26T12:00:00Z')) + client + .copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds) + .then(() => { + done(new Error('CopyObject should have failed.')) + }) + .catch(() => done()) + } + ) + step( + `statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, + (done) => { + client.statObject(bucketName, _100kbObjectNameCopy, (e, stat) => { + if (e) return done(e) + if (stat.size !== _100kb.length) return done(new Error('size mismatch')) + done() + }) + } + ) + + step( + `removeObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, + (done) => { + async.map( + [_100kbObjectName, _100kbObjectNameCopy], + (objectName, cb) => client.removeObject(bucketName, objectName, cb), + done + ) + } + ) }) describe('listIncompleteUploads removeIncompleteUpload', () => { - step(`initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, metaData:${metaData}`, done => { - client.initiateNewMultipartUpload(bucketName, _65mbObjectName, metaData, done) - }) - step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix:${_65mbObjectName}, recursive: true_`, function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - this.skip() + step( + `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, metaData:${metaData}`, + (done) => { + client.initiateNewMultipartUpload(bucketName, _65mbObjectName, metaData, done) } + ) + step( + `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix:${_65mbObjectName}, recursive: true_`, + function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + this.skip() + } - var found = false - client.listIncompleteUploads(bucketName, _65mbObjectName, true) - .on('error', e => done(e)) - .on('data', data => { - if (data.key === _65mbObjectName) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) - }) - }) - step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive: true_`, function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - this.skip() + var found = false + client + .listIncompleteUploads(bucketName, _65mbObjectName, true) + .on('error', (e) => done(e)) + .on('data', (data) => { + if (data.key === _65mbObjectName) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) + }) } + ) + step( + `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive: true_`, + function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + // See: https://github.com/minio/minio/commit/75c43bfb6c4a2ace + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + this.skip() + } - var found = false - client.listIncompleteUploads(bucketName, "", true) - .on('error', e => done(e)) - .on('data', data => { - if (data.key === _65mbObjectName) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) - }) - }) - step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${bucketName}, prefix:${_65mbObjectName}_`, done => { - client.removeIncompleteUpload(bucketName, _65mbObjectName) - .then(done) - .catch(done) + var found = false + client + .listIncompleteUploads(bucketName, '', true) + .on('error', (e) => done(e)) + .on('data', (data) => { + if (data.key === _65mbObjectName) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) + }) + } + ) + step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${bucketName}, prefix:${_65mbObjectName}_`, (done) => { + client.removeIncompleteUpload(bucketName, _65mbObjectName).then(done).catch(done) }) }) @@ -711,96 +828,132 @@ describe('functional tests', function () { var tmpFileUpload = `${tmpDir}/${_65mbObjectName}` var tmpFileDownload = `${tmpDir}/${_65mbObjectName}.download` - step(`fPutObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, done => { - fs.writeFileSync(tmpFileUpload, _65mb) - client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, () => { - setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() - done(new Error('http request did not release network socket')) - }, 100) - }) - }) - - step(`fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}, metaData: ${metaData}_`, done => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done)) - step(`fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, done => { - client.fGetObject(bucketName, _65mbObjectName, tmpFileDownload) - .then(() => { - var md5sum = crypto.createHash('md5').update(fs.readFileSync(tmpFileDownload)).digest('hex') - if (md5sum === _65mbmd5) return done() - return done(new Error('md5sum mismatch')) + step( + `fPutObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, + (done) => { + fs.writeFileSync(tmpFileUpload, _65mb) + client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, () => { + setTimeout(() => { + if (Object.values(httpAgent.sockets).length === 0) return done() + done(new Error('http request did not release network socket')) + }, 100) }) - .catch(done) - }) - - step(`removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, done => { - fs.unlinkSync(tmpFileDownload) - client.removeObject(bucketName, _65mbObjectName) - .then(() => done()) - .catch(done) - }) + } + ) + + step( + `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}, metaData: ${metaData}_`, + (done) => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done) + ) + step( + `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, + (done) => { + client + .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) + .then(() => { + var md5sum = crypto.createHash('md5').update(fs.readFileSync(tmpFileDownload)).digest('hex') + if (md5sum === _65mbmd5) return done() + return done(new Error('md5sum mismatch')) + }) + .catch(done) + } + ) + + step( + `removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, + (done) => { + fs.unlinkSync(tmpFileDownload) + client + .removeObject(bucketName, _65mbObjectName) + .then(() => done()) + .catch(done) + } + ) - step(`fPutObject(bucketName, objectName, filePath, metaData)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, done => { - client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload) - .then(() => done()) - .catch(done) - }) + step( + `fPutObject(bucketName, objectName, filePath, metaData)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}_`, + (done) => { + client + .fPutObject(bucketName, _65mbObjectName, tmpFileUpload) + .then(() => done()) + .catch(done) + } + ) - step(`fGetObject(bucketName, objectName, filePath)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, done => { - client.fGetObject(bucketName, _65mbObjectName, tmpFileDownload) - .then(() => done()) - .catch(done) - }) - - step(`removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { - fs.unlinkSync(tmpFileUpload) - fs.unlinkSync(tmpFileDownload) - client.removeObject(bucketName, _65mbObjectName, done) - }) + step( + `fGetObject(bucketName, objectName, filePath)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, + (done) => { + client + .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) + .then(() => done()) + .catch(done) + } + ) + + step( + `removeObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, + (done) => { + fs.unlinkSync(tmpFileUpload) + fs.unlinkSync(tmpFileDownload) + client.removeObject(bucketName, _65mbObjectName, done) + } + ) }) describe('fGetObject-resume', () => { var localFile = `${tmpDir}/${_5mbObjectName}` var etag = '' - step(`putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_5mbObjectName}, stream:5mb_`, done => { - var stream = readableStream(_5mb) - client.putObject(bucketName, _5mbObjectName, stream, _5mb.length, {}) - .then((resp) => { - etag = resp - done() - }) - .catch(done) - }) - step(`fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}, filePath:${localFile}`, done => { - var bufPart = Buffer.alloc(_100kb.length) - _5mb.copy(bufPart, 0, 0, _100kb.length) - var tmpFile = `${tmpDir}/${_5mbObjectName}.${etag}.part.minio` - // create a partial file - fs.writeFileSync(tmpFile, bufPart) - client.fGetObject(bucketName, _5mbObjectName, localFile) - .then(() => { - var md5sum = crypto.createHash('md5').update(fs.readFileSync(localFile)).digest('hex') - if (md5sum === _5mbmd5) return done() - return done(new Error('md5sum mismatch')) - }) - .catch(done) - }) - step(`removeObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}_`, done => { - fs.unlinkSync(localFile) - client.removeObject(bucketName, _5mbObjectName, done) - }) + step( + `putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_5mbObjectName}, stream:5mb_`, + (done) => { + var stream = readableStream(_5mb) + client + .putObject(bucketName, _5mbObjectName, stream, _5mb.length, {}) + .then((resp) => { + etag = resp + done() + }) + .catch(done) + } + ) + step( + `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}, filePath:${localFile}`, + (done) => { + var bufPart = Buffer.alloc(_100kb.length) + _5mb.copy(bufPart, 0, 0, _100kb.length) + var tmpFile = `${tmpDir}/${_5mbObjectName}.${etag}.part.minio` + // create a partial file + fs.writeFileSync(tmpFile, bufPart) + client + .fGetObject(bucketName, _5mbObjectName, localFile) + .then(() => { + var md5sum = crypto.createHash('md5').update(fs.readFileSync(localFile)).digest('hex') + if (md5sum === _5mbmd5) return done() + return done(new Error('md5sum mismatch')) + }) + .catch(done) + } + ) + step( + `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}_`, + (done) => { + fs.unlinkSync(localFile) + client.removeObject(bucketName, _5mbObjectName, done) + } + ) }) describe('bucket policy', () => { let policy = `{"Version":"2012-10-17","Statement":[{"Action":["s3:GetBucketLocation","s3:ListBucket"],"Effect":"Allow","Principal":{"AWS":["*"]},"Resource":["arn:aws:s3:::${bucketName}"],"Sid":""},{"Action":["s3:GetObject"],"Effect":"Allow","Principal":{"AWS":["*"]},"Resource":["arn:aws:s3:::${bucketName}/*"],"Sid":""}]}` - step(`setBucketPolicy(bucketName, bucketPolicy, cb)_bucketName:${bucketName}, bucketPolicy:${policy}_`, done => { - client.setBucketPolicy(bucketName, policy, err => { + step(`setBucketPolicy(bucketName, bucketPolicy, cb)_bucketName:${bucketName}, bucketPolicy:${policy}_`, (done) => { + client.setBucketPolicy(bucketName, policy, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`getBucketPolicy(bucketName, cb)_bucketName:${bucketName}_`, done => { + step(`getBucketPolicy(bucketName, cb)_bucketName:${bucketName}_`, (done) => { client.getBucketPolicy(bucketName, (err, response) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -813,7 +966,6 @@ describe('functional tests', function () { }) describe('Test Remove Objects Response in case of Errors', () => { - // Since functional tests are run with root credentials, it is not implemented. // Test steps // ============= @@ -828,7 +980,6 @@ describe('functional tests', function () { // verify the response // response.Error is an array // -[]- empty array indicates success for all objects - // Note: the response code is 200. so the consumer should inspect the response // Sample Response format: /** @@ -848,250 +999,284 @@ describe('functional tests', function () { * VersionId: 'test-v-is' * } */ - /* let readOnlyPolicy ='{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:GetBucketLocation","s3:GetObject"],"Resource":["arn:aws:s3:::*"]}]}' let readWritePolicy ='{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":["s3:*"],"Resource":["arn:aws:s3:::*"]}]}' */ - }) - describe('presigned operations', () => { - step(`presignedPutObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires: 1000_`, done => { - client.presignedPutObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'PUT' - options.headers = { - 'content-length': _1byte.length - } - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', e => done(e)) - response.on('end', () => done()) - response.on('data', () => {}) - }) - request.on('error', e => done(e)) - request.write(_1byte) - request.end() - }) - }) - - step(`presignedPutObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:-123_`, done => { - // negative values should trigger an error - client.presignedPutObject(bucketName, _1byteObjectName, -123) - .then(() => { - done(new Error('negative values should trigger an error')) + step( + `presignedPutObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires: 1000_`, + (done) => { + client.presignedPutObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'PUT' + options.headers = { + 'content-length': _1byte.length, + } + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', (e) => done(e)) + response.on('end', () => done()) + response.on('data', () => {}) + }) + request.on('error', (e) => done(e)) + request.write(_1byte) + request.end() }) - .catch(() => done()) - }) - - step(`presignedPutObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, done => { - // Putting the same object should not cause any error - client.presignedPutObject(bucketName, _1byteObjectName) - .then(() => done()) - .catch(done) - }) + } + ) + + step( + `presignedPutObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:-123_`, + (done) => { + // negative values should trigger an error + client + .presignedPutObject(bucketName, _1byteObjectName, -123) + .then(() => { + done(new Error('negative values should trigger an error')) + }) + .catch(() => done()) + } + ) + + step( + `presignedPutObject(bucketName, objectName)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, + (done) => { + // Putting the same object should not cause any error + client + .presignedPutObject(bucketName, _1byteObjectName) + .then(() => done()) + .catch(done) + } + ) - step(`presignedGetObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { - client.presignedGetObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', e => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } + step( + `presignedGetObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, + (done) => { + client.presignedGetObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', (e) => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } + }) }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) + } + ) - step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { - client.presignedUrl('GET', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', e => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } + step( + `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, + (done) => { + client.presignedUrl('GET', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', (e) => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } + }) }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) - - step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, done => { - var requestDate = new Date() - requestDate.setHours(0, 0, 0, 0) - client.presignedUrl('GET', bucketName, _1byteObjectName, 86400, requestDate, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', e => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } + } + ) + + step( + `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, + (done) => { + var requestDate = new Date() + requestDate.setHours(0, 0, 0, 0) + client.presignedUrl('GET', bucketName, _1byteObjectName, 86400, requestDate, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', (e) => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } + }) }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) + } + ) - step(`presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, done => { - client.presignedGetObject(bucketName, _1byteObjectName, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', e => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') - } + step( + `presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, + (done) => { + client.presignedGetObject(bucketName, _1byteObjectName, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', (e) => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } + }) }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) - - step(`presignedGetObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:this.does.not.exist, expires:2938_`, done => { - client.presignedGetObject(bucketName, 'this.does.not.exist', 2938) - .then(assert.fail) - .catch(() => done()) - }) - - step(`presignedGetObject(bucketName, objectName, expires, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { - var respHeaders = { - 'response-content-type': 'text/html', - 'response-content-language': 'en', - 'response-expires': 'Sun, 07 Jun 2020 16:07:58 GMT', - 'response-cache-control': 'No-cache', - 'response-content-disposition': 'attachment; filename=testing.txt', - 'response-content-encoding': 'gzip' } - client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) - if (respHeaders['response-content-type'] !== response.headers['content-type']) { - return done(new Error(`content-type header mismatch`)) - } - if (respHeaders['response-content-language'] !== response.headers['content-language']) { - return done(new Error(`content-language header mismatch`)) - } - if (respHeaders['response-expires'] !== response.headers['expires']) { - return done(new Error(`expires header mismatch`)) - } - if (respHeaders['response-cache-control'] !== response.headers['cache-control']) { - return done(new Error(`cache-control header mismatch`)) - } - if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { - return done(new Error(`content-disposition header mismatch`)) - } - if (respHeaders['response-content-encoding'] !== response.headers['content-encoding']) { - return done(new Error(`content-encoding header mismatch`)) - } - response.on('data', () => {}) - done() - }) - request.on('error', e => done(e)) - request.end() - }) - }) - - step(`presignedGetObject(bucketName, objectName, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, contentDisposition special chars`, done => { - var respHeaders = { - 'response-content-disposition': 'attachment; filename="abc|"@#$%&/(<>)/=?!{[\']}+*-_:,;def.png"; filename*=UTF-8\'\'t&21st&20ng.png', + ) + + step( + `presignedGetObject(bucketName, objectName, expires)_bucketName:${bucketName}, objectName:this.does.not.exist, expires:2938_`, + (done) => { + client + .presignedGetObject(bucketName, 'this.does.not.exist', 2938) + .then(assert.fail) + .catch(() => done()) } - client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) - if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { - return done(new Error(`content-disposition header mismatch`)) - } - response.on('data', () => {}) - done() + ) + + step( + `presignedGetObject(bucketName, objectName, expires, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, + (done) => { + var respHeaders = { + 'response-content-type': 'text/html', + 'response-content-language': 'en', + 'response-expires': 'Sun, 07 Jun 2020 16:07:58 GMT', + 'response-cache-control': 'No-cache', + 'response-content-disposition': 'attachment; filename=testing.txt', + 'response-content-encoding': 'gzip', + } + client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (respHeaders['response-content-type'] !== response.headers['content-type']) { + return done(new Error(`content-type header mismatch`)) + } + if (respHeaders['response-content-language'] !== response.headers['content-language']) { + return done(new Error(`content-language header mismatch`)) + } + if (respHeaders['response-expires'] !== response.headers['expires']) { + return done(new Error(`expires header mismatch`)) + } + if (respHeaders['response-cache-control'] !== response.headers['cache-control']) { + return done(new Error(`cache-control header mismatch`)) + } + if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { + return done(new Error(`content-disposition header mismatch`)) + } + if (respHeaders['response-content-encoding'] !== response.headers['content-encoding']) { + return done(new Error(`content-encoding header mismatch`)) + } + response.on('data', () => {}) + done() + }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) - - step(`presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, done => { - var requestDate = new Date() - requestDate.setHours(0, 0, 0, 0) - client.presignedGetObject(bucketName, _1byteObjectName, 86400, {}, requestDate, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - var error = null - response.on('error', e => done(e)) - response.on('end', () => done(error)) - response.on('data', (data) => { - if (data.toString() !== _1byte.toString()) { - error = new Error('content mismatch') + } + ) + + step( + `presignedGetObject(bucketName, objectName, respHeaders, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, contentDisposition special chars`, + (done) => { + var respHeaders = { + 'response-content-disposition': + 'attachment; filename="abc|"@#$%&/(<>)/=?!{[\']}+*-_:,;def.png"; filename*=UTF-8\'\'t&21st&20ng.png', + } + client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { + return done(new Error(`content-disposition header mismatch`)) } + response.on('data', () => {}) + done() }) + request.on('error', (e) => done(e)) + request.end() }) - request.on('error', e => done(e)) - request.end() - }) - }) + } + ) + + step( + `presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:86400, requestDate:StartOfDay_`, + (done) => { + var requestDate = new Date() + requestDate.setHours(0, 0, 0, 0) + client.presignedGetObject(bucketName, _1byteObjectName, 86400, {}, requestDate, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + var error = null + response.on('error', (e) => done(e)) + response.on('end', () => done(error)) + response.on('data', (data) => { + if (data.toString() !== _1byte.toString()) { + error = new Error('content mismatch') + } + }) + }) + request.on('error', (e) => done(e)) + request.end() + }) + } + ) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:expiresin10days_', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:expiresin10days_', (done) => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) - var expires = new Date + var expires = new Date() expires.setSeconds(24 * 60 * 60 * 10) policy.setExpires(expires) @@ -1104,11 +1289,11 @@ describe('functional tests', function () { if (e) return done(e) done() }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentType', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentType', (done) => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) @@ -1119,15 +1304,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function(e) { + req.end(function (e) { if (e) return done(e) done() }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentTypeStartsWith', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentTypeStartsWith', (done) => { var policy = client.newPostPolicy() policy.setKey(_1byteObjectName) policy.setBucket(bucketName) @@ -1138,15 +1323,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function(e) { + req.end(function (e) { if (e) return done(e) done() }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_inline', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_inline', (done) => { var policy = client.newPostPolicy() var objectName = 'test-content-disposition' + uuid.v4() policy.setKey(objectName) @@ -1158,15 +1343,15 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function(e) { + req.end(function (e) { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_attachment', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setContentDisposition_attachment', (done) => { var policy = client.newPostPolicy() var objectName = 'test-content-disposition' + uuid.v4() policy.setKey(objectName) @@ -1182,18 +1367,18 @@ describe('functional tests', function () { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy, cb)_postPolicy:setUserMetaData_', done => { + step('presignedPostPolicy(postPolicy, cb)_postPolicy:setUserMetaData_', (done) => { var policy = client.newPostPolicy() var objectName = 'test-metadata' + uuid.v4() policy.setKey(objectName) policy.setBucket(bucketName) policy.setUserMetaData({ key: 'my-value', - anotherKey: 'another-value' + anotherKey: 'another-value', }) client.presignedPostPolicy(policy, (e, data) => { @@ -1201,69 +1386,74 @@ describe('functional tests', function () { var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') - req.end(function(e) { + req.end(function (e) { if (e) return done(e) client.removeObject(bucketName, objectName, done) }) - req.on('error', e => done(e)) + req.on('error', (e) => done(e)) }) }) - step('presignedPostPolicy(postPolicy)_postPolicy: null_', done => { - client.presignedPostPolicy(null) + step('presignedPostPolicy(postPolicy)_postPolicy: null_', (done) => { + client + .presignedPostPolicy(null) .then(() => { done(new Error('null policy should fail')) }) .catch(() => done()) }) - step(`presignedUrl(httpMethod, bucketName, objectName, expires, reqParams, cb)_httpMethod:GET, bucketName:${bucketName}, expires:1000_`, done => { - client.presignedUrl('GET', bucketName, '', 1000, {'prefix': 'data', 'max-keys': 1000}, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'GET' - options.headers = { - } - var str = '' - if (options.protocol === 'https:') transport = https - var callback = function (response) { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', e => done(e)) - response.on('end', function () { - if (!str.match(`${_1byteObjectName}`)) { - return done(new Error('Listed object does not match the object in the bucket!')) - } - done() - }) - response.on('data', function (chunk) { - str += chunk - }) - } - var request = transport.request(options, callback) - request.end() - }) - }) + step( + `presignedUrl(httpMethod, bucketName, objectName, expires, reqParams, cb)_httpMethod:GET, bucketName:${bucketName}, expires:1000_`, + (done) => { + client.presignedUrl('GET', bucketName, '', 1000, { prefix: 'data', 'max-keys': 1000 }, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'GET' + options.headers = {} + var str = '' + if (options.protocol === 'https:') transport = https + var callback = function (response) { + if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', (e) => done(e)) + response.on('end', function () { + if (!str.match(`${_1byteObjectName}`)) { + return done(new Error('Listed object does not match the object in the bucket!')) + } + done() + }) + response.on('data', function (chunk) { + str += chunk + }) + } + var request = transport.request(options, callback) + request.end() + }) + } + ) - step(`presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:DELETE, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, done => { - client.presignedUrl('DELETE', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) - var transport = http - var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - options.method = 'DELETE' - options.headers = { - } - if (options.protocol === 'https:') transport = https - var request = transport.request(options, (response) => { - if (response.statusCode !== 204) return done(new Error(`error on put : ${response.statusCode}`)) - response.on('error', e => done(e)) - response.on('end', () => done()) - response.on('data', () => {}) - }) - request.on('error', e => done(e)) - request.end() - }) - }) + step( + `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:DELETE, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, + (done) => { + client.presignedUrl('DELETE', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { + if (e) return done(e) + var transport = http + var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + options.method = 'DELETE' + options.headers = {} + if (options.protocol === 'https:') transport = https + var request = transport.request(options, (response) => { + if (response.statusCode !== 204) return done(new Error(`error on put : ${response.statusCode}`)) + response.on('error', (e) => done(e)) + response.on('end', () => done()) + response.on('data', () => {}) + }) + request.on('error', (e) => done(e)) + request.end() + }) + } + ) }) describe('listObjects', function () { @@ -1273,35 +1463,41 @@ describe('functional tests', function () { var listArray = [] var listPrefixArray = [] - step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { - _.times(listObjectsNum, i => objArray.push(`${listObjectPrefix}.${i}`)) - objArray = objArray.sort() - async.mapLimit( - objArray, - 20, - (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, {}, cb), - done - ) - }) - - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix: miniojsprefix, recursive:true_`, done => { - client.listObjects(bucketName, listObjectPrefix, true) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listPrefixArray)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', data => { - listPrefixArray.push(data.name) - }) - }) + step( + `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, + (done) => { + _.times(listObjectsNum, (i) => objArray.push(`${listObjectPrefix}.${i}`)) + objArray = objArray.sort() + async.mapLimit( + objArray, + 20, + (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, {}, cb), + done + ) + } + ) - step('listObjects(bucketName, prefix, recursive)_recursive:true_', done => { - try { - client.listObjects("", "", true) + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix: miniojsprefix, recursive:true_`, + (done) => { + client + .listObjects(bucketName, listObjectPrefix, true) + .on('error', done) .on('end', () => { - return done(new Error(`listObjects should throw exception when empty bucketname is passed`)) + if (_.isEqual(objArray, listPrefixArray)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) }) + .on('data', (data) => { + listPrefixArray.push(data.name) + }) + } + ) + + step('listObjects(bucketName, prefix, recursive)_recursive:true_', (done) => { + try { + client.listObjects('', '', true).on('end', () => { + return done(new Error(`listObjects should throw exception when empty bucketname is passed`)) + }) } catch (e) { if (e.name === 'InvalidBucketNameError') { done() @@ -1311,53 +1507,60 @@ describe('functional tests', function () { } }) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { - listArray = [] - client.listObjects(bucketName, '', false) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() - return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', data => { - listArray.push(data.name) - }) - }) - - step(`listObjectsV2(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, done => { + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { listArray = [] - client.listObjectsV2(bucketName, '', true, '') + client + .listObjects(bucketName, '', false) .on('error', done) .on('end', () => { if (_.isEqual(objArray, listArray)) return done() return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) }) - .on('data', data => { + .on('data', (data) => { listArray.push(data.name) }) }) - step(`listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, done => { - listArray = [] - client.extensions.listObjectsV2WithMetadata(bucketName, '', true, '') - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() - return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', data => { - listArray.push(data.name) - }) - }) + step( + `listObjectsV2(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, + (done) => { + listArray = [] + client + .listObjectsV2(bucketName, '', true, '') + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray, listArray)) return done() + return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', (data) => { + listArray.push(data.name) + }) + } + ) + + step( + `listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter)_bucketName:${bucketName}, recursive:true_`, + (done) => { + listArray = [] + client.extensions + .listObjectsV2WithMetadata(bucketName, '', true, '') + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray, listArray)) return done() + return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', (data) => { + listArray.push(data.name) + }) + } + ) - step(`removeObject(bucketName, objectName, callback)_bucketName:${bucketName}_Remove ${listObjectsNum} objects`, done => { - async.mapLimit( - listArray, - 20, - (objectName, cb) => client.removeObject(bucketName, objectName, cb), - done - ) - }) + step( + `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}_Remove ${listObjectsNum} objects`, + (done) => { + async.mapLimit(listArray, 20, (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) + } + ) }) describe('removeObjects', function () { @@ -1366,19 +1569,23 @@ describe('functional tests', function () { var objArray = [] var objectsList = [] - step(`putObject(bucketName, objectName, stream, size, contentType, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { - _.times(listObjectsNum, i => objArray.push(`${listObjectPrefix}.${i}`)) - objArray = objArray.sort() - async.mapLimit( - objArray, - 20, - (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, '', cb), - done - ) - }) + step( + `putObject(bucketName, objectName, stream, size, contentType, callback)_bucketName:${bucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, + (done) => { + _.times(listObjectsNum, (i) => objArray.push(`${listObjectPrefix}.${i}`)) + objArray = objArray.sort() + async.mapLimit( + objArray, + 20, + (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, '', cb), + done + ) + } + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { - client.listObjects(bucketName, listObjectPrefix, false) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { + client + .listObjects(bucketName, listObjectPrefix, false) .on('error', done) .on('end', () => { try { @@ -1388,20 +1595,21 @@ describe('functional tests', function () { } }) } catch (e) { - if (e.name === "InvalidArgumentError") { + if (e.name === 'InvalidArgumentError') { done() } } }) - .on('data', data => { + .on('data', (data) => { objectsList.push(data.name) }) }) objectsList = [] - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, done => { - client.listObjects(bucketName, listObjectPrefix, false) + step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { + client + .listObjects(bucketName, listObjectPrefix, false) .on('error', done) .on('end', () => { client.removeObjects(bucketName, objectsList, function (e) { @@ -1411,27 +1619,27 @@ describe('functional tests', function () { done() }) }) - .on('data', data => { + .on('data', (data) => { objectsList.push(data.name) }) }) // Non latin characters - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:fileΊ, stream:1b`, done => { - client.putObject(bucketName, 'fileΊ', _1byte) + step(`putObject(bucketName, objectName, stream)_bucketName:${bucketName}, objectName:fileΊ, stream:1b`, (done) => { + client + .putObject(bucketName, 'fileΊ', _1byte) .then(() => done()) .catch(done) }) - step(`removeObjects with non latin characters`, done => { - client.removeObjects(bucketName, ['fileΊ']) + step(`removeObjects with non latin characters`, (done) => { + client + .removeObjects(bucketName, ['fileΊ']) .then(() => done()) .catch(done) }) - }) - describe('bucket notifications', () => { describe('#listenBucketNotification', () => { before(function () { @@ -1443,109 +1651,120 @@ describe('functional tests', function () { } }) - step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, prefix:photos/, suffix:.jpg, events:bad_`, done => { - let poller = client.listenBucketNotification(bucketName, 'photos/', '.jpg', ['bad']) - poller.on('error', error => { - if (error.code !== 'NotImplemented') { - assert.match(error.message, /A specified event is not supported for notifications./) - assert.equal(error.code, 'InvalidArgument') - } - done() - }) - }) - step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events: s3:ObjectCreated:*_`, done => { - let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectCreated:*']) - let records = 0 - let pollerError = null - poller.on('notification', record => { - records++ - - assert.equal(record.eventName, 's3:ObjectCreated:Put') - assert.equal(record.s3.bucket.name, bucketName) - assert.equal(record.s3.object.key, objectName) - }) - poller.on('error', error => { - pollerError = error - }) - setTimeout(() => { // Give it some time for the notification to be setup. - if (pollerError) { - if (pollerError.code !== 'NotImplemented') { - done(pollerError) - } else { - done() + step( + `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, prefix:photos/, suffix:.jpg, events:bad_`, + (done) => { + let poller = client.listenBucketNotification(bucketName, 'photos/', '.jpg', ['bad']) + poller.on('error', (error) => { + if (error.code !== 'NotImplemented') { + assert.match(error.message, /A specified event is not supported for notifications./) + assert.equal(error.code, 'InvalidArgument') } - return - } - client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) - setTimeout(() => { // Give it some time to get the notification. - poller.stop() - client.removeObject(bucketName, objectName, err => { - if (err) return done(err) - if (!records) return done(new Error('notification not received')) - done() - }) - }, 10 * 1000) + done() }) - }, 10 * 1000) - }) + } + ) + step( + `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events: s3:ObjectCreated:*_`, + (done) => { + let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectCreated:*']) + let records = 0 + let pollerError = null + poller.on('notification', (record) => { + records++ + + assert.equal(record.eventName, 's3:ObjectCreated:Put') + assert.equal(record.s3.bucket.name, bucketName) + assert.equal(record.s3.object.key, objectName) + }) + poller.on('error', (error) => { + pollerError = error + }) + setTimeout(() => { + // Give it some time for the notification to be setup. + if (pollerError) { + if (pollerError.code !== 'NotImplemented') { + done(pollerError) + } else { + done() + } + return + } + client.putObject(bucketName, objectName, 'stringdata', (err) => { + if (err) return done(err) + setTimeout(() => { + // Give it some time to get the notification. + poller.stop() + client.removeObject(bucketName, objectName, (err) => { + if (err) return done(err) + if (!records) return done(new Error('notification not received')) + done() + }) + }, 10 * 1000) + }) + }, 10 * 1000) + } + ) // This test is very similar to that above, except it does not include // Minio.ObjectCreatedAll in the config. Thus, no events should be emitted. - step(`listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events:s3:ObjectRemoved:*`, done => { - let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectRemoved:*']) - poller.on('notification', assert.fail) - poller.on('error', error => { - if (error.code !== 'NotImplemented') { - done(error) - } - }) + step( + `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events:s3:ObjectRemoved:*`, + (done) => { + let poller = client.listenBucketNotification(bucketName, '', '', ['s3:ObjectRemoved:*']) + poller.on('notification', assert.fail) + poller.on('error', (error) => { + if (error.code !== 'NotImplemented') { + done(error) + } + }) - client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) - // It polls every five seconds, so wait for two-ish polls, then end. - setTimeout(() => { - poller.stop() - poller.removeAllListeners('notification') - // clean up object now - client.removeObject(bucketName, objectName, done) - }, 11 * 1000) - }) - }) + client.putObject(bucketName, objectName, 'stringdata', (err) => { + if (err) return done(err) + // It polls every five seconds, so wait for two-ish polls, then end. + setTimeout(() => { + poller.stop() + poller.removeAllListeners('notification') + // clean up object now + client.removeObject(bucketName, objectName, done) + }, 11 * 1000) + }) + } + ) }) }) describe('Bucket Versioning API', () => { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = "minio-js-test-version-" + uuid.v4() + const versionedBucketName = 'minio-js-test-version-' + uuid.v4() before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) describe('Versioning Steps test', function () { - step("Check if versioning is enabled on a bucket", done => { + step('Check if versioning is enabled on a bucket', (done) => { client.getBucketVersioning(versionedBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step("Enable versioning on a bucket", done => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + step('Enable versioning on a bucket', (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step("Suspend versioning on a bucket", done => { - client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { + step('Suspend versioning on a bucket', (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step("Check if versioning is Suspended on a bucket", done => { + step('Check if versioning is Suspended on a bucket', (done) => { client.getBucketVersioning(versionedBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -1553,14 +1772,15 @@ describe('functional tests', function () { }) }) }) - }) describe('Versioning tests on a buckets', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = "minio-js-test-version-" + uuid.v4() + const versionedBucketName = 'minio-js-test-version-' + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir + ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) + : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) @@ -1568,145 +1788,199 @@ describe('functional tests', function () { describe('Versioning Steps test', function () { let versionId - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) - - step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { - client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - }) + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, + (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + } + ) - step(`statObject(bucketName, objectName, statOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { - client.statObject(versionedBucketName, versioned_100kbObjectName, {}, (e, res) => { - versionId = res.versionId - done() - }) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, + (done) => { + client + .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + } + ) - step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { - client.removeObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, () => { - done() - }) - }) + step( + `statObject(bucketName, objectName, statOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, + (done) => { + client.statObject(versionedBucketName, versioned_100kbObjectName, {}, (e, res) => { + versionId = res.versionId + done() + }) + } + ) - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { - client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) + step( + `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, + (done) => { + client.removeObject(versionedBucketName, versioned_100kbObjectName, { versionId: versionId }, () => { + done() + }) + } + ) + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, + (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + } + ) }) }) describe('Versioning tests on a buckets: getObject, fGetObject, getPartialObject, putObject, removeObject with versionId support', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = "minio-js-test-version-" + uuid.v4() + const versionedBucketName = 'minio-js-test-version-' + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir + ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) + : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) describe('Versioning Test for getObject, getPartialObject, putObject, removeObject with versionId support', function () { let versionId = null - step(`Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${versionedBucketName},{Status:"Enabled"}`, (done) => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) - - step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { - client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then((res = {}) => { - if (res.versionId) { - versionId = res.versionId // In gateway mode versionId will not be returned. - } + step( + `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${versionedBucketName},{Status:"Enabled"}`, + (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) done() }) - .catch(done) - }) + } + ) - step(`getObject(bucketName, objectName, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { - if (versionId) { - client.getObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, function (e, dataStream) { - const objVersion = getVersionId(dataStream.headers) - if (objVersion) { + step( + `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, + (done) => { + client + .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then((res = {}) => { + if (res.versionId) { + versionId = res.versionId // In gateway mode versionId will not be returned. + } done() - } else { - done(new Error('versionId not found in getObject response')) - } - }) - } else { - done() + }) + .catch(done) } - }) + ) + step( + `getObject(bucketName, objectName, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, + (done) => { + if (versionId) { + client.getObject( + versionedBucketName, + versioned_100kbObjectName, + { versionId: versionId }, + function (e, dataStream) { + const objVersion = getVersionId(dataStream.headers) + if (objVersion) { + done() + } else { + done(new Error('versionId not found in getObject response')) + } + } + ) + } else { + done() + } + } + ) - step(`fGetObject(bucketName, objectName, filePath, getOpts={})_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { - if (versionId) { - var tmpFileDownload = `${tmpDir}/${versioned_100kbObjectName}.download` - client.fGetObject(versionedBucketName, versioned_100kbObjectName, tmpFileDownload, {versionId: versionId}, function () { + step( + `fGetObject(bucketName, objectName, filePath, getOpts={})_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, + (done) => { + if (versionId) { + var tmpFileDownload = `${tmpDir}/${versioned_100kbObjectName}.download` + client.fGetObject( + versionedBucketName, + versioned_100kbObjectName, + tmpFileDownload, + { versionId: versionId }, + function () { + done() + } + ) + } else { done() - }) - } else { - done() + } } - }) + ) + step( + `getPartialObject(bucketName, objectName, offset, length, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, + (done) => { + if (versionId) { + client.getPartialObject( + versionedBucketName, + versioned_100kbObjectName, + 10, + 30, + { versionId: versionId }, + function (e, dataStream) { + const objVersion = getVersionId(dataStream.headers) + if (objVersion) { + done() + } else { + done(new Error('versionId not found in getPartialObject response')) + } + } + ) + } else { + done() + } + } + ) - step(`getPartialObject(bucketName, objectName, offset, length, getOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}`, done => { - if (versionId) { - client.getPartialObject(versionedBucketName, versioned_100kbObjectName, 10, 30, {versionId: versionId}, function (e, dataStream) { - const objVersion = getVersionId(dataStream.headers) - if (objVersion) { + step( + `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName},removeOpts:{versionId:${versionId}`, + (done) => { + if (versionId) { + client.removeObject(versionedBucketName, versioned_100kbObjectName, { versionId: versionId }, () => { done() - } else { - done(new Error('versionId not found in getPartialObject response')) - } - }) - } else { - done() + }) + } else { + // In gateway mode, use regular delete to remove an object so that the bucket can be cleaned up. + client.removeObject(versionedBucketName, versioned_100kbObjectName, () => { + done() + }) + } } - }) + ) - step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName},removeOpts:{versionId:${versionId}`, done => { - if (versionId) { - client.removeObject(versionedBucketName, versioned_100kbObjectName, {versionId: versionId}, () => { - done() - }) - } else { - // In gateway mode, use regular delete to remove an object so that the bucket can be cleaned up. - client.removeObject(versionedBucketName, versioned_100kbObjectName, () => { + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, + (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) done() }) } - }) - - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { - client.setBucketVersioning(versionedBucketName, {Status: "Suspended"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) - + ) }) }) describe('Versioning Supported listObjects', function () { - const versionedBucketName = "minio-js-test-version-list" + uuid.v4() - const prefixName = "Prefix1" - const versionedObjectName = "datafile-100-kB" + const versionedBucketName = 'minio-js-test-version-list' + uuid.v4() + const prefixName = 'Prefix1' + const versionedObjectName = 'datafile-100-kB' const objVersionIdCounter = [1, 2, 3, 4, 5] // This should track adding 5 versions of the same object. let listObjectsNum = objVersionIdCounter.length let objArray = [] @@ -1715,154 +1989,94 @@ describe('functional tests', function () { const objNameWithPrefix = `${prefixName}/${versionedObjectName}` - before((done) => client.makeBucket(versionedBucketName, '', () => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - - })) - after((done) => client.removeBucket(versionedBucketName, done)) - - - step(`putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${versionedBucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, done => { - if (isVersioningSupported) { - let count = 1 - objVersionIdCounter.forEach(() => { - client.putObject(versionedBucketName, objNameWithPrefix, readableStream(_1byte), _1byte.length, {}, (e, data) => { - objArray.push(data) - if (count === objVersionIdCounter.length) { - done() - } - count += 1 - }) - }) - } else { - done() - } - }) - - step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { - if (isVersioningSupported) { - client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', data => { - listPrefixArray.push(data) - }) - } else { - done() - } - }) - - step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: ${prefixName}, recursive:true_`, done => { - if (isVersioningSupported) { - listPrefixArray = [] - client.listObjects(versionedBucketName, prefixName, true, {IncludeVersion: true}) - .on('error', done) - .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() - return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) - }) - .on('data', data => { - listPrefixArray.push(data) - }) - } else { - done() - } - }) - - - step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}_Remove ${listObjectsNum} objects`, done => { - if (isVersioningSupported) { - let count = 1 - listPrefixArray.forEach((item) => { - client.removeObject(versionedBucketName, item.name, {versionId: item.versionId}, () => { - if (count === listPrefixArray.length) { - done() - } - count += 1 - }) - }) - } else { - done() - } - }) - }) - - describe('Versioning tests on a bucket for Deletion of Multiple versions', function () { - // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = "minio-js-test-version-" + uuid.v4() - const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) - - before((done) => client.makeBucket(versionedBucketName, '', done)) - after((done) => client.removeBucket(versionedBucketName, done)) - - - describe('Test for removal of multiple versions', function () { - let isVersioningSupported = false - const objVersionList = [] - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { + before((done) => + client.makeBucket(versionedBucketName, '', () => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) isVersioningSupported = true done() }) }) + ) + after((done) => client.removeBucket(versionedBucketName, done)) - step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { + step( + `putObject(bucketName, objectName, stream, size, metaData, callback)_bucketName:${versionedBucketName}, stream:1b, size:1_Create ${listObjectsNum} objects`, + (done) => { if (isVersioningSupported) { - client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) + let count = 1 + objVersionIdCounter.forEach(() => { + client.putObject( + versionedBucketName, + objNameWithPrefix, + readableStream(_1byte), + _1byte.length, + {}, + (e, data) => { + objArray.push(data) + if (count === objVersionIdCounter.length) { + done() + } + count += 1 + } + ) + }) } else { done() } + } + ) - }) - // Put two versions of the same object. - step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { - // Put two versions of the same object. + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, + (done) => { if (isVersioningSupported) { - client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) + client + .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) + .on('error', done) + .on('end', () => { + if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) + }) + .on('data', (data) => { + listPrefixArray.push(data) + }) } else { done() } - }) + } + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: ${prefixName}, recursive:true_`, + (done) => { if (isVersioningSupported) { - client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) + listPrefixArray = [] + client + .listObjects(versionedBucketName, prefixName, true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(2, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected ${2}`)) + if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) }) - .on('data', data => { - // Pass list object response as is to remove objects - objVersionList.push(data) + .on('data', (data) => { + listPrefixArray.push(data) }) } else { done() } - }) + } + ) - step(`removeObjects(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove ${objVersionList.length} objects`, done => { + step( + `removeObject(bucketName, objectName, removeOpts)_bucketName:${versionedBucketName}_Remove ${listObjectsNum} objects`, + (done) => { if (isVersioningSupported) { let count = 1 - objVersionList.forEach(() => { - // remove multiple versions of the object. - client.removeObjects(versionedBucketName, objVersionList, () => { - if (count === objVersionList.length) { + listPrefixArray.forEach((item) => { + client.removeObject(versionedBucketName, item.name, { versionId: item.versionId }, () => { + if (count === listPrefixArray.length) { done() } count += 1 @@ -1871,75 +2085,171 @@ describe('functional tests', function () { } else { done() } - }) - - }) + } + ) }) - describe('Bucket Tags API', () => { + describe('Versioning tests on a bucket for Deletion of Multiple versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const tagsBucketName = "minio-js-test-tags-" + uuid.v4() - before((done) => client.makeBucket(tagsBucketName, '', done)) - after((done) => client.removeBucket(tagsBucketName, done)) + const versionedBucketName = 'minio-js-test-version-' + uuid.v4() + const versioned_100kbObjectName = 'datafile-100-kB' + const versioned_100kb_Object = dataDir + ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) + : Buffer.alloc(100 * 1024, 0) - describe('set, get and remove Tags on a bucket', function () { - step(`Set tags on a bucket_bucketName:${tagsBucketName}`, done => { - client.setBucketTagging(tagsBucketName, {'test-tag-key': 'test-tag-value'}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) - }) - step(`Get tags on a bucket_bucketName:${tagsBucketName}`, done => { - client.getBucketTagging(tagsBucketName, (err, tagList) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - if (isArray(tagList)) { + before((done) => client.makeBucket(versionedBucketName, '', done)) + after((done) => client.removeBucket(versionedBucketName, done)) + + describe('Test for removal of multiple versions', function () { + let isVersioningSupported = false + const objVersionList = [] + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, + (done) => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + } + ) + + step( + `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + } else { done() } - }) - }) + } + ) + // Put two versions of the same object. + step( + `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, + (done) => { + // Put two versions of the same object. + if (isVersioningSupported) { + client + .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) - step(`remove Tags on a bucket_bucketName:${tagsBucketName}`, done => { - client.removeBucketTagging(tagsBucketName, (err) => { + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, + (done) => { + if (isVersioningSupported) { + client + .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) + .on('error', done) + .on('end', () => { + if (_.isEqual(2, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected ${2}`)) + }) + .on('data', (data) => { + // Pass list object response as is to remove objects + objVersionList.push(data) + }) + } else { + done() + } + } + ) + + step( + `removeObjects(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove ${objVersionList.length} objects`, + (done) => { + if (isVersioningSupported) { + let count = 1 + objVersionList.forEach(() => { + // remove multiple versions of the object. + client.removeObjects(versionedBucketName, objVersionList, () => { + if (count === objVersionList.length) { + done() + } + count += 1 + }) + }) + } else { + done() + } + } + ) + }) + }) + + describe('Bucket Tags API', () => { + // Isolate the bucket/object for easy debugging and tracking. + const tagsBucketName = 'minio-js-test-tags-' + uuid.v4() + before((done) => client.makeBucket(tagsBucketName, '', done)) + after((done) => client.removeBucket(tagsBucketName, done)) + + describe('set, get and remove Tags on a bucket', function () { + step(`Set tags on a bucket_bucketName:${tagsBucketName}`, (done) => { + client.setBucketTagging(tagsBucketName, { 'test-tag-key': 'test-tag-value' }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) + step(`Get tags on a bucket_bucketName:${tagsBucketName}`, (done) => { + client.getBucketTagging(tagsBucketName, (err, tagList) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + if (isArray(tagList)) { + done() + } + }) + }) + step(`remove Tags on a bucket_bucketName:${tagsBucketName}`, (done) => { + client.removeBucketTagging(tagsBucketName, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + }) + }) }) - }) describe('Object Tags API', () => { // Isolate the bucket/object for easy debugging and tracking. - const tagsBucketName = "minio-js-test-tags-" + uuid.v4() + const tagsBucketName = 'minio-js-test-tags-' + uuid.v4() before((done) => client.makeBucket(tagsBucketName, '', done)) after((done) => client.removeBucket(tagsBucketName, done)) - const tagObjName = 'datafile-100-kB' const tagObject = Buffer.alloc(100 * 1024, 0) - describe('set, get and remove Tags on an object', function () { + step( + `putObject(bucketName, objectName, stream)_bucketName:${tagsBucketName}, objectName:${tagObjName}, stream:100Kib_`, + (done) => { + client + .putObject(tagsBucketName, tagObjName, tagObject) + .then(() => done()) + .catch(done) + } + ) - step(`putObject(bucketName, objectName, stream)_bucketName:${tagsBucketName}, objectName:${tagObjName}, stream:100Kib_`, done => { - client.putObject(tagsBucketName, tagObjName, tagObject) - .then(() => done()) - .catch(done) - }) - - step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { - client.setObjectTagging(tagsBucketName, tagObjName, {'test-tag-key-obj': 'test-tag-value-obj'}, (err) => { + step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { + client.setObjectTagging(tagsBucketName, tagObjName, { 'test-tag-key-obj': 'test-tag-value-obj' }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { + step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.getObjectTagging(tagsBucketName, tagObjName, (err, tagList) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -1949,87 +2259,97 @@ describe('functional tests', function () { }) }) - step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { + step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.removeObjectTagging(tagsBucketName, tagObjName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - step(`removeObject object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, done => { + step(`removeObject object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.removeObject(tagsBucketName, tagObjName, () => { done() }) }) }) - }) describe('Object Tags API with Versioning support', () => { // Isolate the bucket/object for easy debugging and tracking. - const tagsVersionedBucketName = "minio-js-test-tags-version-" + uuid.v4() + const tagsVersionedBucketName = 'minio-js-test-tags-version-' + uuid.v4() before((done) => client.makeBucket(tagsVersionedBucketName, '', done)) after((done) => client.removeBucket(tagsVersionedBucketName, done)) - const tagObjName = 'datafile-100-kB' const tagObject = Buffer.alloc(100 * 1024, 0) let isVersioningSupported = false let versionId = null describe('set, get and remove Tags on a versioned object', function () { + step( + `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${tagsVersionedBucketName},{Status:"Enabled"}`, + (done) => { + client.setBucketVersioning(tagsVersionedBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + } + ) - step(`Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${tagsVersionedBucketName},{Status:"Enabled"}`, (done) => { - client.setBucketVersioning(tagsVersionedBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - }) - - step(`putObject(bucketName, objectName, stream)_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName}, stream:100Kib_`, done => { - if (isVersioningSupported) { - client.putObject(tagsVersionedBucketName, tagObjName, tagObject) - .then((res = {}) => { - if (res.versionId) { - versionId = res.versionId // In gateway mode versionId will not be returned. - } - done() - }) - .catch(done) - } else { - done() + step( + `putObject(bucketName, objectName, stream)_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(tagsVersionedBucketName, tagObjName, tagObject) + .then((res = {}) => { + if (res.versionId) { + versionId = res.versionId // In gateway mode versionId will not be returned. + } + done() + }) + .catch(done) + } else { + done() + } } - }) + ) - step(`Set tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { + step(`Set tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { - client.setObjectTagging(tagsVersionedBucketName, tagObjName, {'test-tag-key-obj': 'test-tag-value-obj'}, {versionId: versionId}, (err) => { - if (err) return done(err) - done() - }) + client.setObjectTagging( + tagsVersionedBucketName, + tagObjName, + { 'test-tag-key-obj': 'test-tag-value-obj' }, + { versionId: versionId }, + (err) => { + if (err) return done(err) + done() + } + ) } else { done() } }) - step(`Get tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { + step(`Get tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { - client.getObjectTagging(tagsVersionedBucketName, tagObjName, {versionId: versionId}, (err, tagList) => { + client.getObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err, tagList) => { if (err) return done(err) if (isArray(tagList)) { done() } - })}else{ + }) + } else { done() } }) - step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { - + step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { - client.removeObjectTagging(tagsVersionedBucketName, tagObjName, {versionId: versionId}, (err) => { + client.removeObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() @@ -2038,9 +2358,9 @@ describe('functional tests', function () { done() } }) - step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, done => { + step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { - client.removeObject(tagsVersionedBucketName, tagObjName, {versionId: versionId}, () => { + client.removeObject(tagsVersionedBucketName, tagObjName, { versionId: versionId }, () => { done() }) } else { @@ -2048,27 +2368,29 @@ describe('functional tests', function () { } }) }) - }) describe('Bucket Lifecycle API', () => { - const bucketName = "minio-js-test-lifecycle-" + uuid.v4() + const bucketName = 'minio-js-test-lifecycle-' + uuid.v4() before((done) => client.makeBucket(bucketName, '', done)) after((done) => client.removeBucket(bucketName, done)) describe('Set, Get Lifecycle config Tests', function () { - step(`Set lifecycle config on a bucket:_bucketName:${bucketName}`, done => { + step(`Set lifecycle config on a bucket:_bucketName:${bucketName}`, (done) => { const lifecycleConfig = { - Rule: [{ - "ID": "Transition and Expiration Rule", - "Status": "Enabled", - "Filter": { - "Prefix": "", + Rule: [ + { + ID: 'Transition and Expiration Rule', + Status: 'Enabled', + Filter: { + Prefix: '', + }, + Expiration: { + Days: '3650', + }, }, - "Expiration": { - "Days": "3650" - } - }]} + ], + } client.setBucketLifecycle(bucketName, lifecycleConfig, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -2076,7 +2398,7 @@ describe('functional tests', function () { }) }) - step("Set lifecycle config of a bucket", done => { + step('Set lifecycle config of a bucket', (done) => { client.getBucketLifecycle(bucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) @@ -2084,18 +2406,16 @@ describe('functional tests', function () { }) }) - step("Remove lifecycle config of a bucket", done => { + step('Remove lifecycle config of a bucket', (done) => { client.removeBucketLifecycle(bucketName, (err) => { if (err && err.code === 'NotImplemented') return done() if (err) return done(err) done() }) }) - }) }) - describe('Versioning Supported preSignedUrl Get, Put Tests', function () { /** * Test Steps @@ -2107,7 +2427,7 @@ describe('functional tests', function () { * 6. Cleanup bucket. */ - const versionedBucketName = "minio-js-test-ver-presign-" + uuid.v4() + const versionedBucketName = 'minio-js-test-ver-presign-' + uuid.v4() const versionedPresignObjName = 'datafile-1-b' const _100_byte = Buffer.alloc(100 * 1024, 0) const _200_byte = Buffer.alloc(200 * 1024, 0) @@ -2115,167 +2435,186 @@ describe('functional tests', function () { const objectsList = [] const expectedVersionsCount = 2 - - before((done) => client.makeBucket(versionedBucketName, '', () => { - client.setBucketVersioning(versionedBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() + before((done) => + client.makeBucket(versionedBucketName, '', () => { + client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) }) - - })) + ) after((done) => client.removeBucket(versionedBucketName, done)) - step(`presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:1`, done => { - - if (isVersioningSupported) { - client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { - if (e) { - done(e) - } - let mobileClientReqWithProtocol = http - var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - upldRequestOptions.method = 'PUT' - upldRequestOptions.headers = { - 'content-length': _100_byte.length - } - if (upldRequestOptions.protocol === 'https:') { - mobileClientReqWithProtocol = https - } - const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) - response.on('error', (err) => { - done(err) - }) - response.on('end', () => { - done() + step( + `presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:1`, + (done) => { + if (isVersioningSupported) { + client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { + if (e) { + done(e) + } + let mobileClientReqWithProtocol = http + var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + upldRequestOptions.method = 'PUT' + upldRequestOptions.headers = { + 'content-length': _100_byte.length, + } + if (upldRequestOptions.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { + if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + response.on('error', (err) => { + done(err) + }) + response.on('end', () => { + done() + }) + response.on('data', () => { + // just drain + }) }) - response.on('data', () => { - // just drain + + uploadRequest.on('error', (er) => { + done(er) }) - }) - uploadRequest.on('error', (er) => { - done(er) + uploadRequest.write(_100_byte) + uploadRequest.end() }) - - uploadRequest.write(_100_byte) - uploadRequest.end() - }) - } else { - done() + } else { + done() + } } + ) - }) - - step(`presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:2`, done => { - if (isVersioningSupported) { - client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { - if (e) { - done(e) - } - let mobileClientReqWithProtocol = http - var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - upldRequestOptions.method = 'PUT' - upldRequestOptions.headers = { - 'content-length': _200_byte.length - } - if (upldRequestOptions.protocol === 'https:') { - mobileClientReqWithProtocol = https - } - const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) - response.on('error', (err) => { - done(err) - }) - response.on('end', () => { - done() + step( + `presignedPutObject(bucketName, objectName, expires=1000, cb)_bucketName:${versionedBucketName} ${versionedPresignObjName} _version:2`, + (done) => { + if (isVersioningSupported) { + client.presignedPutObject(versionedBucketName, versionedPresignObjName, 1000, (e, presignedUrl) => { + if (e) { + done(e) + } + let mobileClientReqWithProtocol = http + var upldRequestOptions = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + upldRequestOptions.method = 'PUT' + upldRequestOptions.headers = { + 'content-length': _200_byte.length, + } + if (upldRequestOptions.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { + if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + response.on('error', (err) => { + done(err) + }) + response.on('end', () => { + done() + }) + response.on('data', () => { + // just drain + }) }) - response.on('data', () => { - // just drain + + uploadRequest.on('error', (er) => { + done(er) }) - }) - uploadRequest.on('error', (er) => { - done(er) + uploadRequest.write(_200_byte) + uploadRequest.end() }) - - uploadRequest.write(_200_byte) - uploadRequest.end() - }) - } else { - done() + } else { + done() + } } - }) + ) - step(`listObjects(bucketName, '', true, {IncludeVersion: true}, cb)_bucketName:${versionedBucketName} _prefix:""`, done => { - if (isVersioningSupported) { - const objectsStream = client.listObjects(versionedBucketName, '', true, {IncludeVersion: true}) - objectsStream.on('data', function (obj) { - objectsList.push({versionId: obj.versionId, name: obj.name}) - }) - - objectsStream.on('error', function () { - return done() - }) - objectsStream.on('end', function () { - const objectListCount = objectsList.length - if (objectListCount === expectedVersionsCount) { - done() - } else { - return done(new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`)) - } - }) - } else { - done() - } - }) + step( + `listObjects(bucketName, '', true, {IncludeVersion: true}, cb)_bucketName:${versionedBucketName} _prefix:""`, + (done) => { + if (isVersioningSupported) { + const objectsStream = client.listObjects(versionedBucketName, '', true, { IncludeVersion: true }) + objectsStream.on('data', function (obj) { + objectsList.push({ versionId: obj.versionId, name: obj.name }) + }) - step(`presignedGetObject(bucketName, objectName, 1000, respHeaders, requestDate, cb)_bucketName:${versionedBucketName} _objectName:${versionedPresignObjName} _version:(2/2)`, done => { - if (isVersioningSupported) { - client.presignedGetObject(versionedBucketName, objectsList[1].name, 1000, {versionId: objectsList[1].versionId}, new Date(), (e, presignedUrl) => { - if (e) { + objectsStream.on('error', function () { return done() - } - let mobileClientReqWithProtocol = http - const getReqOpts = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) - getReqOpts.method = 'GET' - const _100kbmd5 = crypto.createHash('md5').update(_100_byte).digest('hex') - - const hash = crypto.createHash('md5') - if (getReqOpts.protocol === 'https:') { - mobileClientReqWithProtocol = https - } - const request = mobileClientReqWithProtocol.request(getReqOpts, (response) => { - // if delete marker. method not allowed. - if (response.statusCode !== 200) return new Error(`error on get : ${response.statusCode}`) - response.on('error', () => { - return done() - }) - response.on('end', () => { - const hashValue = hash.digest('hex') - if (hashValue === _100kbmd5) { - done() - } else { - return done(new Error("Unable to retrieve version of an object using presignedGetObject")) - } - }) - response.on('data', (data) => { - hash.update(data) - }) }) - request.on('error', () => { - return done() + objectsStream.on('end', function () { + const objectListCount = objectsList.length + if (objectListCount === expectedVersionsCount) { + done() + } else { + return done( + new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`) + ) + } }) - request.end() - }) - } else { - done() + } else { + done() + } } - }) + ) + + step( + `presignedGetObject(bucketName, objectName, 1000, respHeaders, requestDate, cb)_bucketName:${versionedBucketName} _objectName:${versionedPresignObjName} _version:(2/2)`, + (done) => { + if (isVersioningSupported) { + client.presignedGetObject( + versionedBucketName, + objectsList[1].name, + 1000, + { versionId: objectsList[1].versionId }, + new Date(), + (e, presignedUrl) => { + if (e) { + return done() + } + let mobileClientReqWithProtocol = http + const getReqOpts = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) + getReqOpts.method = 'GET' + const _100kbmd5 = crypto.createHash('md5').update(_100_byte).digest('hex') + + const hash = crypto.createHash('md5') + if (getReqOpts.protocol === 'https:') { + mobileClientReqWithProtocol = https + } + const request = mobileClientReqWithProtocol.request(getReqOpts, (response) => { + // if delete marker. method not allowed. + if (response.statusCode !== 200) return new Error(`error on get : ${response.statusCode}`) + response.on('error', () => { + return done() + }) + response.on('end', () => { + const hashValue = hash.digest('hex') + if (hashValue === _100kbmd5) { + done() + } else { + return done(new Error('Unable to retrieve version of an object using presignedGetObject')) + } + }) + response.on('data', (data) => { + hash.update(data) + }) + }) + request.on('error', () => { + return done() + }) + request.end() + } + ) + } else { + done() + } + } + ) - step(`removeObjects(bucketName, objectsList)_bucketName:${versionedBucketName}`, done => { + step(`removeObjects(bucketName, objectsList)_bucketName:${versionedBucketName}`, (done) => { if (isVersioningSupported) { client.removeObjects(versionedBucketName, objectsList, function (e) { if (e) { @@ -2294,10 +2633,10 @@ describe('functional tests', function () { // Gateway mode does not support this header. describe('Object Lock support makeBucket API Tests', function () { - const lockEnabledBucketName = "minio-js-test-lock-mb-" + uuid.v4() + const lockEnabledBucketName = 'minio-js-test-lock-mb-' + uuid.v4() let isFeatureSupported = false - step(`Check if bucket with object lock can be created:_bucketName:${lockEnabledBucketName}`, done => { - client.makeBucket(lockEnabledBucketName, {ObjectLocking: true}, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${lockEnabledBucketName}`, (done) => { + client.makeBucket(lockEnabledBucketName, { ObjectLocking: true }, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -2305,7 +2644,7 @@ describe('functional tests', function () { }) }) - step(`Get lock config on a bucket:_bucketName:${lockEnabledBucketName}`, done => { + step(`Get lock config on a bucket:_bucketName:${lockEnabledBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockEnabledBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2317,7 +2656,7 @@ describe('functional tests', function () { } }) - step(`Check if bucket can be deleted:_bucketName:${lockEnabledBucketName}`, done => { + step(`Check if bucket can be deleted:_bucketName:${lockEnabledBucketName}`, (done) => { client.removeBucket(lockEnabledBucketName, (err) => { if (isFeatureSupported) { if (err && err.code === 'NotImplemented') return done() @@ -2328,32 +2667,35 @@ describe('functional tests', function () { } }) }) - }) describe('Object Lock support Set/Get API Tests', function () { - const lockConfigBucketName = "minio-js-test-lock-conf-" + uuid.v4() + const lockConfigBucketName = 'minio-js-test-lock-conf-' + uuid.v4() let isFeatureSupported = false - step(`Check if bucket with object lock can be created:_bucketName:${lockConfigBucketName}`, done => { - client.makeBucket(lockConfigBucketName, {ObjectLocking: true}, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${lockConfigBucketName}`, (done) => { + client.makeBucket(lockConfigBucketName, { ObjectLocking: true }, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) done() }) }) - step(`Update or replace lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { + step(`Update or replace lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { - client.setObjectLockConfig(lockConfigBucketName, {mode:"GOVERNANCE",unit:'Years', validity:2 }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - done() - }) + client.setObjectLockConfig( + lockConfigBucketName, + { mode: 'GOVERNANCE', unit: 'Years', validity: 2 }, + (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + done() + } + ) } else { done() } }) - step(`Get lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { + step(`Get lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2365,7 +2707,7 @@ describe('functional tests', function () { } }) - step(`Set lock config on a bucket:_bucketName:${lockConfigBucketName}`, done => { + step(`Set lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.setObjectLockConfig(lockConfigBucketName, {}, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2376,7 +2718,7 @@ describe('functional tests', function () { done() } }) - step(`Get and verify lock config on a bucket after reset/update:_bucketName:${lockConfigBucketName}`, done => { + step(`Get and verify lock config on a bucket after reset/update:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { if (err && err.code === 'NotImplemented') return done() @@ -2388,7 +2730,7 @@ describe('functional tests', function () { } }) - step(`Check if bucket can be deleted:_bucketName:${lockConfigBucketName}`, done => { + step(`Check if bucket can be deleted:_bucketName:${lockConfigBucketName}`, (done) => { client.removeBucket(lockConfigBucketName, (err) => { if (isFeatureSupported) { if (err && err.code === 'NotImplemented') return done() @@ -2399,9 +2741,7 @@ describe('functional tests', function () { } }) }) - }) - }) describe('Object retention API Tests', () => { @@ -2409,13 +2749,13 @@ describe('functional tests', function () { // Gateway mode does not support this header. describe('Object retention get/set API Test', function () { - const objRetentionBucket = "minio-js-test-retention-" + uuid.v4() - const retentionObjName = "RetentionObject" + const objRetentionBucket = 'minio-js-test-retention-' + uuid.v4() + const retentionObjName = 'RetentionObject' let isFeatureSupported = false let versionId = null - step(`Check if bucket with object lock can be created:_bucketName:${objRetentionBucket}`, done => { - client.makeBucket(objRetentionBucket, {ObjectLocking: true}, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${objRetentionBucket}`, (done) => { + client.makeBucket(objRetentionBucket, { ObjectLocking: true }, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -2423,73 +2763,92 @@ describe('functional tests', function () { }) }) - step(`putObject(bucketName, objectName, stream)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}, stream:100Kib_`, done => { - // Put two versions of the same object. - if (isFeatureSupported) { - client.putObject(objRetentionBucket, retentionObjName, readableStream(_1byte), _1byte.length, {}) - .then(() => done()) - .catch(done) - } else { - done() + step( + `putObject(bucketName, objectName, stream)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}, stream:100Kib_`, + (done) => { + // Put two versions of the same object. + if (isFeatureSupported) { + client + .putObject(objRetentionBucket, retentionObjName, readableStream(_1byte), _1byte.length, {}) + .then(() => done()) + .catch(done) + } else { + done() + } } - }) + ) - step(`statObject(bucketName, objectName, statOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { - if (isFeatureSupported) { - client.statObject(objRetentionBucket, retentionObjName, {}, (e, res) => { - versionId = res.versionId + step( + `statObject(bucketName, objectName, statOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, + (done) => { + if (isFeatureSupported) { + client.statObject(objRetentionBucket, retentionObjName, {}, (e, res) => { + versionId = res.versionId + done() + }) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`putObjectRetention(bucketName, objectName, putOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { - // Put two versions of the same object. - if (isFeatureSupported) { - let expirationDate = new Date() - // set expiry to start of next day. - expirationDate.setDate(expirationDate.getDate() + 1) - expirationDate.setUTCHours(0, 0, 0, 0) // Should be start of the day.(midnight) + step( + `putObjectRetention(bucketName, objectName, putOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, + (done) => { + // Put two versions of the same object. + if (isFeatureSupported) { + let expirationDate = new Date() + // set expiry to start of next day. + expirationDate.setDate(expirationDate.getDate() + 1) + expirationDate.setUTCHours(0, 0, 0, 0) // Should be start of the day.(midnight) + + client + .putObjectRetention(objRetentionBucket, retentionObjName, { + governanceBypass: true, + mode: 'GOVERNANCE', + retainUntilDate: expirationDate.toISOString(), + versionId: versionId, + }) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) - client.putObjectRetention(objRetentionBucket, retentionObjName, { - governanceBypass: true, - mode: "GOVERNANCE", - retainUntilDate: expirationDate.toISOString(), - versionId: versionId - }) - .then(() => done()) - .catch(done) - } else { - done() - } - }) - - step(`getObjectRetention(bucketName, objectName, getOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { - if (isFeatureSupported) { - client.getObjectRetention(objRetentionBucket, retentionObjName, {versionId: versionId}, () => { + step( + `getObjectRetention(bucketName, objectName, getOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, + (done) => { + if (isFeatureSupported) { + client.getObjectRetention(objRetentionBucket, retentionObjName, { versionId: versionId }, () => { + done() + }) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, done => { - if (isFeatureSupported) { - client.removeObject(objRetentionBucket, retentionObjName, {versionId:versionId, governanceBypass:true}, () => { + step( + `removeObject(bucketName, objectName, removeOpts)_bucketName:${objRetentionBucket}, objectName:${retentionObjName}`, + (done) => { + if (isFeatureSupported) { + client.removeObject( + objRetentionBucket, + retentionObjName, + { versionId: versionId, governanceBypass: true }, + () => { + done() + } + ) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`removeBucket(bucketName, )_bucketName:${objRetentionBucket}`, done => { + step(`removeBucket(bucketName, )_bucketName:${objRetentionBucket}`, (done) => { if (isFeatureSupported) { client.removeBucket(objRetentionBucket, () => { done() @@ -2497,40 +2856,39 @@ describe('functional tests', function () { } else { done() } - }) - }) }) describe('Bucket Encryption Related APIs', () => { // Isolate the bucket/object for easy debugging and tracking. // this is not supported in gateway mode. - const encBucketName = "minio-js-test-bucket-enc-" + uuid.v4() + const encBucketName = 'minio-js-test-bucket-enc-' + uuid.v4() before((done) => client.makeBucket(encBucketName, '', done)) after((done) => client.removeBucket(encBucketName, done)) - const encObjName = 'datafile-100-kB' const encObjFileContent = Buffer.alloc(100 * 1024, 0) let isEncryptionSupported = false - step(`Set Encryption on a bucket:_bucketName:${encBucketName}`, done => { + step(`Set Encryption on a bucket:_bucketName:${encBucketName}`, (done) => { // setBucketEncryption succeeds in NAS mode. const buckEncPromise = client.setBucketEncryption(encBucketName) - buckEncPromise.then(() => { - done() - }) + buckEncPromise + .then(() => { + done() + }) .catch(() => { done() }) }) - step(`Get encryption of a bucket:_bucketName:${encBucketName}`, done => { + step(`Get encryption of a bucket:_bucketName:${encBucketName}`, (done) => { const getBucEncObj = client.getBucketEncryption(encBucketName) - getBucEncObj.then(() => { - done() - }) + getBucEncObj + .then(() => { + done() + }) .catch((err) => { if (err && err.code === 'NotImplemented') { isEncryptionSupported = false @@ -2544,54 +2902,67 @@ describe('functional tests', function () { }) }) - step(`Put an object to check for default encryption bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { - if (isEncryptionSupported) { - const putObjPromise = client.putObject(encBucketName, encObjName, encObjFileContent) - putObjPromise.then(() => { + step( + `Put an object to check for default encryption bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, + (done) => { + if (isEncryptionSupported) { + const putObjPromise = client.putObject(encBucketName, encObjName, encObjFileContent) + putObjPromise + .then(() => { + done() + }) + .catch(() => { + done() + }) + } else { done() - }) - .catch(() => { - done() - }) - } else { - done() + } } - }) - - step(`Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { - if (isEncryptionSupported) { - const statObjPromise = client.statObject(encBucketName, encObjName) - statObjPromise.then(() => { + ) + + step( + `Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, + (done) => { + if (isEncryptionSupported) { + const statObjPromise = client.statObject(encBucketName, encObjName) + statObjPromise + .then(() => { + done() + }) + .catch(() => { + done() + }) + } else { done() - }) - .catch(() => { - done() - }) - } else { - done() + } } - }) - - step(`Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}`, done => { - if (isEncryptionSupported) { - const getBuckEnc = client.getBucketEncryption(encBucketName) - getBuckEnc.then(() => { + ) + + step( + `Stat of an object to check for default encryption applied on a bucket:_bucketName:${encBucketName}`, + (done) => { + if (isEncryptionSupported) { + const getBuckEnc = client.getBucketEncryption(encBucketName) + getBuckEnc + .then(() => { + done() + }) + .catch(() => { + done() + }) + } else { done() - }) - .catch(() => { - done() - }) - } else { - done() + } } - }) + ) - step(`Remove object on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, done => { + step(`Remove object on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, (done) => { if (isEncryptionSupported) { const removeObj = client.removeObject(encBucketName, encObjName) - removeObj.then(() => { - done() - }) + removeObj + .then(() => { + done() + }) .catch(() => { done() }) @@ -2600,12 +2971,13 @@ describe('functional tests', function () { } }) - step(`Remove encryption on a bucket:_bucketName:${encBucketName}`, done => { + step(`Remove encryption on a bucket:_bucketName:${encBucketName}`, (done) => { if (isEncryptionSupported) { const removeObj = client.removeBucketEncryption(encBucketName) - removeObj.then(() => { - done() - }) + removeObj + .then(() => { + done() + }) .catch(() => { done() }) @@ -2613,12 +2985,13 @@ describe('functional tests', function () { done() } }) - step(`Get encryption on a bucket:_bucketName:${encBucketName}`, done => { + step(`Get encryption on a bucket:_bucketName:${encBucketName}`, (done) => { if (isEncryptionSupported) { const getBuckEnc = client.getBucketEncryption(encBucketName) - getBuckEnc.then(() => { - done() - }) + getBuckEnc + .then(() => { + done() + }) .catch(() => { done() }) @@ -2626,7 +2999,6 @@ describe('functional tests', function () { done() } }) - }) describe('Bucket Replication API Tests', () => { @@ -2641,13 +3013,12 @@ describe('functional tests', function () { // Gateway mode does not support this header. let versionId = null describe('Object Legal hold get/set API Test', function () { - const objLegalHoldBucketName = "minio-js-test-legalhold-" + uuid.v4() - const objLegalHoldObjName = "LegalHoldObject" + const objLegalHoldBucketName = 'minio-js-test-legalhold-' + uuid.v4() + const objLegalHoldObjName = 'LegalHoldObject' let isFeatureSupported = false - - step(`Check if bucket with object lock can be created:_bucketName:${objLegalHoldBucketName}`, done => { - client.makeBucket(objLegalHoldBucketName, {ObjectLocking: true}, (err) => { + step(`Check if bucket with object lock can be created:_bucketName:${objLegalHoldBucketName}`, (done) => { + client.makeBucket(objLegalHoldBucketName, { ObjectLocking: true }, (err) => { if (err && err.code === 'NotImplemented') return done() isFeatureSupported = true if (err) return done(err) @@ -2655,92 +3026,128 @@ describe('functional tests', function () { }) }) - step(`putObject(bucketName, objectName, stream)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}, stream:100Kib_`, done => { - if (isFeatureSupported) { - client.putObject(objLegalHoldBucketName, objLegalHoldObjName, readableStream(_1byte), _1byte.length, {}) - .then(() => done()) - .catch(done) - } else { - done() + step( + `putObject(bucketName, objectName, stream)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}, stream:100Kib_`, + (done) => { + if (isFeatureSupported) { + client + .putObject(objLegalHoldBucketName, objLegalHoldObjName, readableStream(_1byte), _1byte.length, {}) + .then(() => done()) + .catch(done) + } else { + done() + } } - }) + ) - step(`statObject(bucketName, objectName, statOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.statObject(objLegalHoldBucketName, objLegalHoldObjName, {}, (e, res) => { - versionId = res.versionId + step( + `statObject(bucketName, objectName, statOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.statObject(objLegalHoldBucketName, objLegalHoldObjName, {}, (e, res) => { + versionId = res.versionId + done() + }) + } else { done() - }) - } else { - done() + } } - }) + ) - step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { + step( + `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { + done() + }) + } else { done() - }) - } else { - done() + } } - }) + ) - step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {status:"ON", versionId:versionId}, () => { + step( + `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.setObjectLegalHold( + objLegalHoldBucketName, + objLegalHoldObjName, + { status: 'ON', versionId: versionId }, + () => { + done() + } + ) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { + step( + `getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, () => { + done() + }) + } else { done() - }) - } else { - done() + } } - }) + ) - step(`setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.setObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {status:"OFF", versionId:versionId}, () => { + step( + `setObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.setObjectLegalHold( + objLegalHoldBucketName, + objLegalHoldObjName, + { status: 'OFF', versionId: versionId }, + () => { + done() + } + ) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, {versionId: versionId}, () => { + step( + `getObjectLegalHold(bucketName, objectName, setOpts={})_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.getObjectLegalHold(objLegalHoldBucketName, objLegalHoldObjName, { versionId: versionId }, () => { + done() + }) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`removeObject(bucketName, objectName, removeOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, done => { - if (isFeatureSupported) { - client.removeObject(objLegalHoldBucketName, objLegalHoldObjName, {versionId:versionId, governanceBypass:true}, () => { + step( + `removeObject(bucketName, objectName, removeOpts)_bucketName:${objLegalHoldBucketName}, objectName:${objLegalHoldObjName}`, + (done) => { + if (isFeatureSupported) { + client.removeObject( + objLegalHoldBucketName, + objLegalHoldObjName, + { versionId: versionId, governanceBypass: true }, + () => { + done() + } + ) + } else { done() - }) - } else { - done() + } } + ) - }) - - step(`removeBucket(bucketName, )_bucketName:${objLegalHoldBucketName}`, done => { + step(`removeBucket(bucketName, )_bucketName:${objLegalHoldBucketName}`, (done) => { if (isFeatureSupported) { client.removeBucket(objLegalHoldBucketName, () => { done() @@ -2748,14 +3155,13 @@ describe('functional tests', function () { } else { done() } - }) - - })}) + }) + }) describe('Object Name special characters test without Prefix', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = "minio-js-test-obj-spwpre-" + uuid.v4() + const bucketNameForSpCharObjects = 'minio-js-test-obj-spwpre-' + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) @@ -2770,98 +3176,119 @@ describe('functional tests', function () { const objectContents = Buffer.alloc(100 * 1024, 0) describe('Without Prefix Test', function () { + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}, stream:100Kib_`, + (done) => { + client + .putObject(bucketNameForSpCharObjects, objectNameSpecialChars, objectContents) + .then(() => { + done() + }) + .catch(done) + } + ) - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}, stream:100Kib_`, done => { - client.putObject(bucketNameForSpCharObjects, objectNameSpecialChars, objectContents) - .then(() => { - done() + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, + (done) => { + const listStream = client.listObjects(bucketNameForSpCharObjects, '', true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj }) - .catch(done) - }) - - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { - const listStream = client.listObjects(bucketNameForSpCharObjects, "", true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, "", true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) + step( + `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, + (done) => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, '', true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } + }) - listStream.on('error', function (e) { - done(e) - }) - }) - step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, done => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, "", true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) - } - }) - - listStream.on('error', function (e) { - done(e) - }) - }) - - step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { - client.getObject(bucketNameForSpCharObjects, objectNameSpecialChars) - .then(stream => { - stream.on('data', function() {}) - stream.on('end', done) + listStream.on('error', function (e) { + done(e) + }) + } + ) + step( + `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, + (done) => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, '', true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameSpecialChars) { + done() + } else { + return done(new Error(`Expected object Name: ${objectNameSpecialChars}: received:${listedObject.name}`)) + } }) - .catch(done) - }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { - client.statObject(bucketNameForSpCharObjects, objectNameSpecialChars, (e) => { - if (e) return done(e) - done() - }) - }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, done => { - client.removeObject(bucketNameForSpCharObjects, objectNameSpecialChars) - .then(() => done()) - .catch(done) - }) - }) + step( + `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, + (done) => { + client + .getObject(bucketNameForSpCharObjects, objectNameSpecialChars) + .then((stream) => { + stream.on('data', function () {}) + stream.on('end', done) + }) + .catch(done) + } + ) + step( + `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, + (done) => { + client.statObject(bucketNameForSpCharObjects, objectNameSpecialChars, (e) => { + if (e) return done(e) + done() + }) + } + ) + step( + `removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, + (done) => { + client + .removeObject(bucketNameForSpCharObjects, objectNameSpecialChars) + .then(() => done()) + .catch(done) + } + ) + }) }) describe('Object Name special characters test with a Prefix', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = "minio-js-test-obj-spnpre-" + uuid.v4() + const bucketNameForSpCharObjects = 'minio-js-test-obj-spnpre-' + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) @@ -2870,114 +3297,139 @@ describe('functional tests', function () { if (isWindowsPlatform) { objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 u0040 amȡȹɆple&0a!-_.'()&$@=;+,.pdf" } - const prefix = "test" + const prefix = 'test' const objectNameWithPrefixForSpecialChars = `${prefix}/${objectNameSpecialChars}` const objectContents = Buffer.alloc(100 * 1024, 0) - describe('With Prefix Test', function () { + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}, stream:100Kib`, + (done) => { + client + .putObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, objectContents) + .then(() => { + done() + }) + .catch(done) + } + ) - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}, stream:100Kib`, done => { - client.putObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, objectContents) - .then(() => { - done() + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, + (done) => { + const listStream = client.listObjects(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj }) - .catch(done) - }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { + done() + } else { + return done( + new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + ) + } + }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { - const listStream = client.listObjects(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj + step( + `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, + (done) => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { + done() + } else { + return done( + new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + ) + } + }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - }) + step( + `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, + (done) => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, prefix, true) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.name === objectNameWithPrefixForSpecialChars) { + done() + } else { + return done( + new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + ) + } + }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { - done() - } else { - return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - }) + step( + `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName_:${objectNameWithPrefixForSpecialChars}`, + (done) => { + client + .getObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) + .then((stream) => { + stream.on('data', function () {}) + stream.on('end', done) + }) + .catch(done) + } + ) - step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:${prefix}, recursive:true`, done => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, prefix, true) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.name === objectNameWithPrefixForSpecialChars) { + step( + `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, + (done) => { + client.statObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, (e) => { + if (e) return done(e) done() - } else { - return done(new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - }) - - step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName_:${objectNameWithPrefixForSpecialChars}`, done => { - client.getObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) - .then(stream => { - stream.on('data', function() {}) - stream.on('end', done) }) - .catch(done) - }) - - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, done => { - client.statObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, (e) => { - if (e) return done(e) - done() - }) - }) + } + ) - step(`removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, done => { - client.removeObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) - .then(() => done()) - .catch(done) - }) + step( + `removeObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, + (done) => { + client + .removeObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) + .then(() => done()) + .catch(done) + } + ) }) - }) describe('Assume Role Tests', () => { // Run only in local environment. - const bucketName = "minio-js-test-assume-role" + uuid.v4() + const bucketName = 'minio-js-test-assume-role' + uuid.v4() before((done) => client.makeBucket(bucketName, '', done)) after((done) => client.removeBucket(bucketName, done)) - const objName = 'datafile-100-kB' const objContent = Buffer.alloc(100 * 1024, 0) - const canRunAssumeRoleTest = clientConfigParams.endPoint.includes("localhost") - const stsEndPoint = "http://localhost:9000" + const canRunAssumeRoleTest = clientConfigParams.endPoint.includes('localhost') + const stsEndPoint = 'http://localhost:9000' try { if (canRunAssumeRoleTest) { @@ -2988,162 +3440,208 @@ describe('functional tests', function () { secretKey: client.secretKey, }) - const aRoleConf = Object.assign({}, clientConfigParams, {credentialsProvider: assumeRoleProvider}) + const aRoleConf = Object.assign({}, clientConfigParams, { credentialsProvider: assumeRoleProvider }) const assumeRoleClient = new minio.Client(aRoleConf) - assumeRoleClient.region= server_region + assumeRoleClient.region = server_region describe('Put an Object', function () { - step(`Put an object with assume role credentials: bucket:_bucketName:${bucketName}, _objectName:${objName}`, done => { - const putObjPromise = assumeRoleClient.putObject(bucketName, objName, objContent) - putObjPromise.then(() => { - done() - }) - .catch(done) - }) + step( + `Put an object with assume role credentials: bucket:_bucketName:${bucketName}, _objectName:${objName}`, + (done) => { + const putObjPromise = assumeRoleClient.putObject(bucketName, objName, objContent) + putObjPromise + .then(() => { + done() + }) + .catch(done) + } + ) - step(`Remove an Object with assume role credentials:${bucketName}, _objectName:${objName}`, done => { + step(`Remove an Object with assume role credentials:${bucketName}, _objectName:${objName}`, (done) => { const removeObjPromise = assumeRoleClient.removeObject(bucketName, objName) - removeObjPromise.then(() => { - done() - }) + removeObjPromise + .then(() => { + done() + }) .catch(done) }) - }) } } catch (err) { // eslint-disable-next-line no-console - console.error("Error in Assume Role API.", err) + console.error('Error in Assume Role API.', err) } - }) describe('Put Object Response test with multipart on an Un versioned bucket:', () => { - - const bucketToTestMultipart = "minio-js-test-put-multiuv-" + uuid.v4() + const bucketToTestMultipart = 'minio-js-test-put-multiuv-' + uuid.v4() before((done) => client.makeBucket(bucketToTestMultipart, '', done)) after((done) => client.removeBucket(bucketToTestMultipart, done)) // Non multipart Test - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, done => { - const stream = readableStream(_100kb) - client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { - if (e) done(e) - if (res.versionId === null && res.etag) { - done() - } - else{ - done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) - } - }) - }) - step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, done => { - client.removeObject(bucketToTestMultipart, _100kbObjectName) - .then(() => done()) - .catch(done) - }) - - - // Multipart Test - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, done => { - const stream = readableStream(_65mb) - client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { - if (e) done(e) - if (res.versionId === null && res.etag) { - done() - } - else{ - done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) - } - }) - }) - step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, done => { - client.removeObject(bucketToTestMultipart, _65mbObjectName) - .then(() => done()) - .catch(done) - }) - }) - - describe('Put Object Response test with multipart on Versioned bucket:', () => { - - const bucketToTestMultipart = "minio-js-test-put-multiv-" + uuid.v4() - let isVersioningSupported = false - let versionedObjectRes = null - let versionedMultiPartObjectRes = null - - before((done) => client.makeBucket(bucketToTestMultipart, '', () => { - client.setBucketVersioning(bucketToTestMultipart, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - - })) - after((done) => client.removeBucket(bucketToTestMultipart, done)) - - - - // Non multipart Test - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, done => { - - if (isVersioningSupported) { + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, + (done) => { const stream = readableStream(_100kb) client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { if (e) done(e) - if (res.versionId && res.etag) { - versionedObjectRes = res + if (res.versionId === null && res.etag) { done() } else { - done(new Error(`Incorrect response format, expected: {versionId:'some-version-hash', etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) + done( + new Error( + `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( + res + )}` + ) + ) } }) - } else { - done() } - - }) - step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, done => { - if (isVersioningSupported) { - client.removeObject(bucketToTestMultipart, _100kbObjectName, {versionId: versionedObjectRes.versionId}) + ) + step( + `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, + (done) => { + client + .removeObject(bucketToTestMultipart, _100kbObjectName) .then(() => done()) .catch(done) - } else { - done() } - }) - + ) // Multipart Test - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, done => { - if (isVersioningSupported) { + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, + (done) => { const stream = readableStream(_65mb) client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { if (e) done(e) - if (res.versionId && res.etag) { - versionedMultiPartObjectRes = res + if (res.versionId === null && res.etag) { done() } else { - done(new Error(`Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify(res)}`)) + done( + new Error( + `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( + res + )}` + ) + ) } }) - } else { - done() } - }) - step(`removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, done => { - if (isVersioningSupported) { - client.removeObject(bucketToTestMultipart, _65mbObjectName, {versionId: versionedMultiPartObjectRes.versionId}) + ) + step( + `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, + (done) => { + client + .removeObject(bucketToTestMultipart, _65mbObjectName) .then(() => done()) .catch(done) - } else { - done() } - }) + ) + }) + + describe('Put Object Response test with multipart on Versioned bucket:', () => { + const bucketToTestMultipart = 'minio-js-test-put-multiv-' + uuid.v4() + let isVersioningSupported = false + let versionedObjectRes = null + let versionedMultiPartObjectRes = null + + before((done) => + client.makeBucket(bucketToTestMultipart, '', () => { + client.setBucketVersioning(bucketToTestMultipart, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) + }) + ) + after((done) => client.removeBucket(bucketToTestMultipart, done)) + + // Non multipart Test + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}, stream:100KB`, + (done) => { + if (isVersioningSupported) { + const stream = readableStream(_100kb) + client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { + if (e) done(e) + if (res.versionId && res.etag) { + versionedObjectRes = res + done() + } else { + done( + new Error( + `Incorrect response format, expected: {versionId:'some-version-hash', etag:"some-etag-hash"} received:${JSON.stringify( + res + )}` + ) + ) + } + }) + } else { + done() + } + } + ) + step( + `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, + (done) => { + if (isVersioningSupported) { + client + .removeObject(bucketToTestMultipart, _100kbObjectName, { versionId: versionedObjectRes.versionId }) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) + + // Multipart Test + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}, stream:65MB`, + (done) => { + if (isVersioningSupported) { + const stream = readableStream(_65mb) + client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { + if (e) done(e) + if (res.versionId && res.etag) { + versionedMultiPartObjectRes = res + done() + } else { + done( + new Error( + `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( + res + )}` + ) + ) + } + }) + } else { + done() + } + } + ) + step( + `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, + (done) => { + if (isVersioningSupported) { + client + .removeObject(bucketToTestMultipart, _65mbObjectName, { versionId: versionedMultiPartObjectRes.versionId }) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) }) - describe("Compose Object API Tests", () => { + describe('Compose Object API Tests', () => { /** * Steps: * 1. Generate a 100MB file in temp dir @@ -3156,7 +3654,7 @@ describe('functional tests', function () { */ var _100mbFileToBeSplitAndComposed = Buffer.alloc(100 * 1024 * 1024, 0) - let composeObjectTestBucket = "minio-js-test-compose-obj-" + uuid.v4() + let composeObjectTestBucket = 'minio-js-test-compose-obj-' + uuid.v4() before((done) => client.makeBucket(composeObjectTestBucket, '', done)) after((done) => client.removeBucket(composeObjectTestBucket, done)) @@ -3166,11 +3664,12 @@ describe('functional tests', function () { let partFilesNamesWithPath = [] let partObjNameList = [] let isSplitSuccess = false - step(`Create a local file of 100 MB and split `, done => { + step(`Create a local file of 100 MB and split `, (done) => { try { fs.writeFileSync(fileToSplit, _100mbFileToBeSplitAndComposed) // 100 MB split into 26 MB part size. - splitFile.splitFileBySize(fileToSplit, (26 * 1024 * 1024)) + splitFile + .splitFileBySize(fileToSplit, 26 * 1024 * 1024) .then((names) => { partFilesNamesWithPath = names isSplitSuccess = true @@ -3185,322 +3684,382 @@ describe('functional tests', function () { }) step(`Upload parts to Bucket_bucketName:${composeObjectTestBucket}, _objectName:${partObjNameList}`, (done) => { - if (isSplitSuccess) { - const fileSysToBucket = partFilesNamesWithPath.map((partFileName) => { - const partObjName = partFileName.substr((tmpSubDir + "/").length) + const partObjName = partFileName.substr((tmpSubDir + '/').length) partObjNameList.push(partObjName) return client.fPutObject(composeObjectTestBucket, partObjName, partFileName, {}) }) - Promise.all(fileSysToBucket).then(() => { - done() - }).catch(done) - + Promise.all(fileSysToBucket) + .then(() => { + done() + }) + .catch(done) } else { done() } }) - step(`composeObject(destObjConfig, sourceObjList, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, (done) => { + step( + `composeObject(destObjConfig, sourceObjList, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, + (done) => { + if (isSplitSuccess) { + const sourcePartObjList = partObjNameList.map((partObjName) => { + return new CopySourceOptions({ + Bucket: composeObjectTestBucket, + Object: partObjName, + }) + }) - if (isSplitSuccess) { - const sourcePartObjList = partObjNameList.map((partObjName) => { - return new CopySourceOptions({ + const destObjConfig = new CopyDestinationOptions({ Bucket: composeObjectTestBucket, - Object: partObjName + Object: composedObjName, }) - }) - - const destObjConfig = new CopyDestinationOptions({ - Bucket: composeObjectTestBucket, - Object: composedObjName - }) - client.composeObject(destObjConfig, sourcePartObjList).then((e) => { - if (e) return done(e) + client.composeObject(destObjConfig, sourcePartObjList).then((e) => { + if (e) return done(e) + done() + }) + } else { done() - }) - } else { - done() + } } - }) - - step(`statObject(bucketName, objectName, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, done => { - if (isSplitSuccess) { - client.statObject(composeObjectTestBucket, composedObjName, (e) => { - if (e) return done(e) + ) + + step( + `statObject(bucketName, objectName, cb)::_bucketName:${composeObjectTestBucket}, _objectName:${composedObjName}`, + (done) => { + if (isSplitSuccess) { + client.statObject(composeObjectTestBucket, composedObjName, (e) => { + if (e) return done(e) + done() + }) + } else { done() - }) - - } else { - done() + } } - }) - - step(`Remove Object Parts from Bucket::_bucketName:${composeObjectTestBucket}, _objectNames:${partObjNameList}`, (done) => { - if (isSplitSuccess) { - const sourcePartObjList = partObjNameList.map((partObjName) => { - return client.removeObject(composeObjectTestBucket, partObjName) - }) + ) + + step( + `Remove Object Parts from Bucket::_bucketName:${composeObjectTestBucket}, _objectNames:${partObjNameList}`, + (done) => { + if (isSplitSuccess) { + const sourcePartObjList = partObjNameList.map((partObjName) => { + return client.removeObject(composeObjectTestBucket, partObjName) + }) - Promise.all(sourcePartObjList).then(() => { + Promise.all(sourcePartObjList) + .then(() => { + done() + }) + .catch(done) + } else { done() - }).catch(done) - - } else { - done() + } } - }) - - step(`Remove Composed target Object::_bucketName:${composeObjectTestBucket}, objectName:${composedObjName}`, (done) => { - if (isSplitSuccess) { - client.removeObject(composeObjectTestBucket, composedObjName).then(() => { + ) + + step( + `Remove Composed target Object::_bucketName:${composeObjectTestBucket}, objectName:${composedObjName}`, + (done) => { + if (isSplitSuccess) { + client + .removeObject(composeObjectTestBucket, composedObjName) + .then(() => { + done() + }) + .catch(done) + } else { done() - }).catch(done) - } else { - done() + } } - }) + ) - step("Clean up temp directory part files", (done) => { + step('Clean up temp directory part files', (done) => { if (isSplitSuccess) { removeDirAndFiles(tmpSubDir) } done() }) - }) describe('Special Characters test on a prefix and an object', () => { // Isolate the bucket/object for easy debugging and tracking. - const bucketNameForSpCharObjects = "minio-js-test-obj-sppre" + uuid.v4() + const bucketNameForSpCharObjects = 'minio-js-test-obj-sppre' + uuid.v4() before((done) => client.makeBucket(bucketNameForSpCharObjects, '', done)) after((done) => client.removeBucket(bucketNameForSpCharObjects, done)) - const specialCharPrefix = "SpecialMenÚäÃļÃŧexPrefix/" + const specialCharPrefix = 'SpecialMenÚäÃļÃŧexPrefix/' let objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 \u0040 amȡȹɆple&0a!-_.*'()&$@=;:+,?<>.pdf" if (isWindowsPlatform) { objectNameSpecialChars = "äÃļÃŧex ŽŠÂĩÄÆÐÕÃĻÅ’Æ•ÆŠĮ… 01000000 0x40 u0040 amȡȹɆple&0a!-_.'()&$@=;+,.pdf" } - const objectNameWithPrefix = `${specialCharPrefix}${objectNameSpecialChars}` const objectContents = Buffer.alloc(100 * 1024, 0) - step(`putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}, stream:100Kib`, done => { - client.putObject(bucketNameForSpCharObjects, objectNameWithPrefix, objectContents) - .then(() => { - done() - }) - .catch(done) - }) - - - step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { - const listStream = client.listObjects(bucketNameForSpCharObjects, "", false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected Prefix Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } - }) - listStream.on('error', function (e) { - done(e) - }) - }) - - step(`listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { - const listStream = client.listObjectsV2(bucketNameForSpCharObjects, "", false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - // verify that the prefix special characters are handled - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}, stream:100Kib`, + (done) => { + client + .putObject(bucketNameForSpCharObjects, objectNameWithPrefix, objectContents) + .then(() => { + done() + }) + .catch(done) + } + ) - listStream.on('error', function (e) { - done(e) - }) - }) + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, + (done) => { + const listStream = client.listObjects(bucketNameForSpCharObjects, '', false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.prefix === specialCharPrefix) { + done() + } else { + return done(new Error(`Expected Prefix Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } + }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, done => { - const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, "", false) - let listedObject = null - listStream.on('data', function (obj) { - listedObject = obj - }) - listStream.on('end', () => { - if (listedObject.prefix === specialCharPrefix) { - done() - } else { - return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) - } - }) + step( + `listObjectsV2(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, + (done) => { + const listStream = client.listObjectsV2(bucketNameForSpCharObjects, '', false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + // verify that the prefix special characters are handled + if (listedObject.prefix === specialCharPrefix) { + done() + } else { + return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } + }) - listStream.on('error', function (e) { - done(e) - }) - }) + listStream.on('error', function (e) { + done(e) + }) + } + ) - step(`getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, done => { - client.getObject(bucketNameForSpCharObjects, objectNameWithPrefix) - .then(stream => { - stream.on('data', function() {}) - stream.on('end', done) + step( + `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", false`, + (done) => { + const listStream = client.extensions.listObjectsV2WithMetadata(bucketNameForSpCharObjects, '', false) + let listedObject = null + listStream.on('data', function (obj) { + listedObject = obj + }) + listStream.on('end', () => { + if (listedObject.prefix === specialCharPrefix) { + done() + } else { + return done(new Error(`Expected object Name: ${specialCharPrefix}: received:${listedObject.prefix}`)) + } }) - .catch(done) - }) - step(`statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, done => { - client.statObject(bucketNameForSpCharObjects, objectNameWithPrefix, (e) => { - if (e) return done(e) - done() - }) - }) - step(`removeObject(bucketName, objectName)_bucketName:${objectNameWithPrefix}, _objectName:${objectNameWithPrefix}`, done => { - client.removeObject(bucketNameForSpCharObjects, objectNameWithPrefix) - .then(() => done()) - .catch(done) - }) + listStream.on('error', function (e) { + done(e) + }) + } + ) + + step( + `getObject(bucketName, objectName)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, + (done) => { + client + .getObject(bucketNameForSpCharObjects, objectNameWithPrefix) + .then((stream) => { + stream.on('data', function () {}) + stream.on('end', done) + }) + .catch(done) + } + ) + step( + `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, + (done) => { + client.statObject(bucketNameForSpCharObjects, objectNameWithPrefix, (e) => { + if (e) return done(e) + done() + }) + } + ) + step( + `removeObject(bucketName, objectName)_bucketName:${objectNameWithPrefix}, _objectName:${objectNameWithPrefix}`, + (done) => { + client + .removeObject(bucketNameForSpCharObjects, objectNameWithPrefix) + .then(() => done()) + .catch(done) + } + ) }) describe('Test listIncompleteUploads (Multipart listing) with special characters', () => { - const specialCharPrefix = "SpecialMenÚäÃļÃŧexPrefix/" - const objectNameSpecialChars = "äÃļÃŧex.pdf" + const specialCharPrefix = 'SpecialMenÚäÃļÃŧexPrefix/' + const objectNameSpecialChars = 'äÃļÃŧex.pdf' const spObjWithPrefix = `${specialCharPrefix}${objectNameSpecialChars}` - const spBucketName = "minio-js-test-lin-sppre" + uuid.v4() + const spBucketName = 'minio-js-test-lin-sppre' + uuid.v4() before((done) => client.makeBucket(spBucketName, '', done)) after((done) => client.removeBucket(spBucketName, done)) - step(`initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${spBucketName}, objectName:${spObjWithPrefix}, metaData:${metaData}`, done => { - client.initiateNewMultipartUpload(spBucketName, spObjWithPrefix, metaData, done) - }) - - step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}, recursive: true_`, function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - done() - return + step( + `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${spBucketName}, objectName:${spObjWithPrefix}, metaData:${metaData}`, + (done) => { + client.initiateNewMultipartUpload(spBucketName, spObjWithPrefix, metaData, done) } + ) - var found = false - client.listIncompleteUploads(spBucketName, spObjWithPrefix, true) - .on('error', e => done(e)) - .on('data', data => { - if (data.key === spObjWithPrefix) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) - }) - }) + step( + `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}, recursive: true_`, + function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + done() + return + } - step(`listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, recursive: true_`, function (done) { - // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. - let hostSkipList = ['s3.amazonaws.com'] - if (!hostSkipList.includes(client.host)) { - done() - return + var found = false + client + .listIncompleteUploads(spBucketName, spObjWithPrefix, true) + .on('error', (e) => done(e)) + .on('data', (data) => { + if (data.key === spObjWithPrefix) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) + }) } + ) - var found = false - client.listIncompleteUploads(spBucketName, "", false) - .on('error', e => done(e)) - .on('data', data => { - // check the prefix - if (data.prefix === specialCharPrefix) found = true - }) - .on('end', () => { - if (found) return done() - done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) - }) - }) - step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}_`, done => { - client.removeIncompleteUpload(spBucketName, spObjWithPrefix) - .then(done) - .catch(done) - }) + step( + `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${spBucketName}, recursive: true_`, + function (done) { + // MinIO's ListIncompleteUploads returns an empty list, so skip this on non-AWS. + let hostSkipList = ['s3.amazonaws.com'] + if (!hostSkipList.includes(client.host)) { + done() + return + } + + var found = false + client + .listIncompleteUploads(spBucketName, '', false) + .on('error', (e) => done(e)) + .on('data', (data) => { + // check the prefix + if (data.prefix === specialCharPrefix) found = true + }) + .on('end', () => { + if (found) return done() + done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) + }) + } + ) + step( + `removeIncompleteUploads(bucketName, prefix)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}_`, + (done) => { + client.removeIncompleteUpload(spBucketName, spObjWithPrefix).then(done).catch(done) + } + ) }) describe('Select Object content API Test', function () { - const selObjContentBucket = "minio-js-test-sel-object-" + uuid.v4() - const selObject = "SelectObjectContent" + const selObjContentBucket = 'minio-js-test-sel-object-' + uuid.v4() + const selObject = 'SelectObjectContent' // Isolate the bucket/object for easy debugging and tracking. before((done) => client.makeBucket(selObjContentBucket, '', done)) after((done) => client.removeBucket(selObjContentBucket, done)) - step(`putObject(bucketName, objectName, stream)_bucketName:${selObjContentBucket}, objectName:${selObject}, stream:csv`, done => { - // Save a CSV file so that we can query later to test the results. - client.putObject(selObjContentBucket, selObject, "Name,PhoneNumber,City,Occupation\n" + - "Sam,(949) 123-45567,Irvine,Solutions Architect\n" + - "Vinod,(949) 123-4556,Los Angeles,Solutions Architect\n" + - "Jeff,(949) 123-45567,Seattle,AWS Evangelist\n" + - "Jane,(949) 123-45567,Chicago,Developer\n" + - "Sean,(949) 123-45567,Chicago,Developer\n" + - "Mary,(949) 123-45567,Chicago,Developer\n" + - "Kate,(949) 123-45567,Chicago,Developer", {}) - .then(() => { - done() - }) - .catch(done) - - }) - - step(`selectObjectContent(bucketName, objectName, selectOpts)_bucketName:${selObjContentBucket}, objectName:${selObject}`, done => { - - const selectOpts = { - expression: "SELECT * FROM s3object s where s.\"Name\" = 'Jane'", - expressionType: "SQL", - inputSerialization : {'CSV': {"FileHeaderInfo": "Use", - RecordDelimiter: "\n", - FieldDelimiter: ",", - }, - 'CompressionType': 'NONE'}, - outputSerialization : {'CSV': {RecordDelimiter: "\n", - FieldDelimiter: ",",}}, - requestProgress: {Enabled: true} + step( + `putObject(bucketName, objectName, stream)_bucketName:${selObjContentBucket}, objectName:${selObject}, stream:csv`, + (done) => { + // Save a CSV file so that we can query later to test the results. + client + .putObject( + selObjContentBucket, + selObject, + 'Name,PhoneNumber,City,Occupation\n' + + 'Sam,(949) 123-45567,Irvine,Solutions Architect\n' + + 'Vinod,(949) 123-4556,Los Angeles,Solutions Architect\n' + + 'Jeff,(949) 123-45567,Seattle,AWS Evangelist\n' + + 'Jane,(949) 123-45567,Chicago,Developer\n' + + 'Sean,(949) 123-45567,Chicago,Developer\n' + + 'Mary,(949) 123-45567,Chicago,Developer\n' + + 'Kate,(949) 123-45567,Chicago,Developer', + {} + ) + .then(() => { + done() + }) + .catch(done) } + ) + + step( + `selectObjectContent(bucketName, objectName, selectOpts)_bucketName:${selObjContentBucket}, objectName:${selObject}`, + (done) => { + const selectOpts = { + expression: 'SELECT * FROM s3object s where s."Name" = \'Jane\'', + expressionType: 'SQL', + inputSerialization: { + CSV: { FileHeaderInfo: 'Use', RecordDelimiter: '\n', FieldDelimiter: ',' }, + CompressionType: 'NONE', + }, + outputSerialization: { CSV: { RecordDelimiter: '\n', FieldDelimiter: ',' } }, + requestProgress: { Enabled: true }, + } - client.selectObjectContent(selObjContentBucket, selObject, selectOpts) - .then((result) => { - // verify the select query result string. - if (result.getRecords().toString() === "Jane,(949) 123-45567,Chicago,Developer\n") { // \n for csv line ending. - done() - } - else{ - return done(new Error(`Expected Result did not match received:${result.getRecords().toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"`)) - } - }) - .catch(done) - }) + client + .selectObjectContent(selObjContentBucket, selObject, selectOpts) + .then((result) => { + // verify the select query result string. + if (result.getRecords().toString() === 'Jane,(949) 123-45567,Chicago,Developer\n') { + // \n for csv line ending. + done() + } else { + return done( + new Error( + `Expected Result did not match received:${result + .getRecords() + .toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"` + ) + ) + } + }) + .catch(done) + } + ) step(`Remove Object post select of content:_bucketName:${selObjContentBucket},objectName:${selObject}`, (done) => { - client.removeObject(selObjContentBucket, selObject) + client + .removeObject(selObjContentBucket, selObject) .then(() => done()) .catch(done) }) }) - describe('Force Deletion of objects with versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdWithVerBucket = "minio-js-fd-version-" + uuid.v4() + const fdWithVerBucket = 'minio-js-fd-version-' + uuid.v4() const fdObjectName = 'datafile-100-kB' const fdObject = dataDir ? fs.readFileSync(dataDir + '/' + fdObjectName) : Buffer.alloc(100 * 1024, 0) @@ -3510,209 +4069,260 @@ describe('functional tests', function () { describe('Test for force removal of multiple versions', function () { let isVersioningSupported = false const objVersionList = [] - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${fdWithVerBucket},versionConfig:{Status:"Enabled"} `, (done) => { - client.setBucketVersioning(fdWithVerBucket, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - }) - - step(`putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { - if (isVersioningSupported) { - client.putObject(fdWithVerBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - } else { - done() + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdWithVerBucket},versionConfig:{Status:"Enabled"} `, + (done) => { + client.setBucketVersioning(fdWithVerBucket, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) } + ) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(fdWithVerBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) // Put two versions of the same object. - step(`putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { - if (isVersioningSupported) { - client.putObject(fdWithVerBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - } else { - done() + step( + `putObject(bucketName, objectName, stream)_bucketName:${fdWithVerBucket}, objectName:${fdObjectName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(fdWithVerBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + } else { + done() + } } - }) + ) - step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdWithVerBucket}_Remove ${objVersionList.length} objects`, done => { - if (isVersioningSupported) { - client.removeObject(fdWithVerBucket, fdObjectName,{forceDelete:true}, () => { + step( + `removeObject(bucketName, objectList, removeOpts)_bucketName:${fdWithVerBucket}_Remove ${objVersionList.length} objects`, + (done) => { + if (isVersioningSupported) { + client.removeObject(fdWithVerBucket, fdObjectName, { forceDelete: true }, () => { + done() + }) + } else { done() - }) - } else { - done() + } } - }) + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdWithVerBucket}, prefix: '', recursive:true_`, done => { - if (isVersioningSupported) { - client.listObjects(fdWithVerBucket, '', true, {IncludeVersion: true}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', data => { - objVersionList.push(data) - }) - } else { - done() + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${fdWithVerBucket}, prefix: '', recursive:true_`, + (done) => { + if (isVersioningSupported) { + client + .listObjects(fdWithVerBucket, '', true, { IncludeVersion: true }) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', (data) => { + objVersionList.push(data) + }) + } else { + done() + } } - }) + ) }) }) describe('Force Deletion of prefix with versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdPrefixBucketName = "minio-js-fd-version-" + uuid.v4() + const fdPrefixBucketName = 'minio-js-fd-version-' + uuid.v4() const fdPrefixObjName = 'my-prefix/datafile-100-kB' const fdPrefixObject = dataDir ? fs.readFileSync(dataDir + '/' + fdPrefixObjName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(fdPrefixBucketName, '', done)) after((done) => client.removeBucket(fdPrefixBucketName, done)) - describe('Test for removal of multiple versions', function () { let isVersioningSupported = false const objVersionList = [] - step(`setBucketVersioning(bucketName, versionConfig):_bucketName:${fdPrefixBucketName},versionConfig:{Status:"Enabled"} `, (done) => { - client.setBucketVersioning(fdPrefixBucketName, {Status: "Enabled"}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) - isVersioningSupported = true - done() - }) - }) - - step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, done => { - if (isVersioningSupported) { - client.putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) - .then(() => done()) - .catch(done) - } else { - done() + step( + `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdPrefixBucketName},versionConfig:{Status:"Enabled"} `, + (done) => { + client.setBucketVersioning(fdPrefixBucketName, { Status: 'Enabled' }, (err) => { + if (err && err.code === 'NotImplemented') return done() + if (err) return done(err) + isVersioningSupported = true + done() + }) } + ) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) + .then(() => done()) + .catch(done) + } else { + done() + } + } + ) // Put two versions of the same object. - step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, done => { - if (isVersioningSupported) { - client.putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) - .then(() => done()) - .catch(done) - } else { - done() + step( + `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucketName}, objectName:${fdPrefixObjName}, stream:100Kib_`, + (done) => { + if (isVersioningSupported) { + client + .putObject(fdPrefixBucketName, fdPrefixObjName, fdPrefixObject) + .then(() => done()) + .catch(done) + } else { + done() + } } - }) + ) - step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucketName}_Remove ${objVersionList.length} objects`, done => { - if (isVersioningSupported) { - client.removeObject(fdPrefixBucketName, "my-prefix/",{forceDelete:true}, () => { + step( + `removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucketName}_Remove ${objVersionList.length} objects`, + (done) => { + if (isVersioningSupported) { + client.removeObject(fdPrefixBucketName, 'my-prefix/', { forceDelete: true }, () => { + done() + }) + } else { done() - }) - } else { - done() + } } - }) + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucketName}, prefix: '', recursive:true_`, done => { - if (isVersioningSupported) { - client.listObjects(fdPrefixBucketName, '/my-prefix', true, {IncludeVersion: true}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', data => { - objVersionList.push(data) - }) - } else { - done() + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucketName}, prefix: '', recursive:true_`, + (done) => { + if (isVersioningSupported) { + client + .listObjects(fdPrefixBucketName, '/my-prefix', true, { IncludeVersion: true }) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', (data) => { + objVersionList.push(data) + }) + } else { + done() + } } - }) + ) }) }) describe('Force Deletion of objects without versions', function () { // Isolate the bucket/object for easy debugging and tracking. - const versionedBucketName = "minio-js-fd-nv-" + uuid.v4() + const versionedBucketName = 'minio-js-fd-nv-' + uuid.v4() const versioned_100kbObjectName = 'datafile-100-kB' - const versioned_100kb_Object = dataDir ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) : Buffer.alloc(100 * 1024, 0) + const versioned_100kb_Object = dataDir + ? fs.readFileSync(dataDir + '/' + versioned_100kbObjectName) + : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(versionedBucketName, '', done)) after((done) => client.removeBucket(versionedBucketName, done)) - describe('Test force removal of an object', function () { - step(`putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, done => { - client.putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) - .then(() => done()) - .catch(done) - }) - - step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove 1 object`, done => { - client.removeObject(versionedBucketName, versioned_100kbObjectName,{forceDelete:true}, () => { - done() - }) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${versionedBucketName}, objectName:${versioned_100kbObjectName}, stream:100Kib_`, + (done) => { + client + .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) + .then(() => done()) + .catch(done) + } + ) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, done => { - let objVersionList=[] - client.listObjects(versionedBucketName, '', true, {}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() - return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) - }) - .on('data', data => { - objVersionList.push(data) + step( + `removeObject(bucketName, objectList, removeOpts)_bucketName:${versionedBucketName}_Remove 1 object`, + (done) => { + client.removeObject(versionedBucketName, versioned_100kbObjectName, { forceDelete: true }, () => { + done() }) - }) + } + ) + + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${versionedBucketName}, prefix: '', recursive:true_`, + (done) => { + let objVersionList = [] + client + .listObjects(versionedBucketName, '', true, {}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objVersionList.length)) return done() + return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) + }) + .on('data', (data) => { + objVersionList.push(data) + }) + } + ) }) }) describe('Force Deletion of prefix', function () { // Isolate the bucket/object for easy debugging and tracking. - const fdPrefixBucket = "minio-js-fd-nv-" + uuid.v4() + const fdPrefixBucket = 'minio-js-fd-nv-' + uuid.v4() const fdObjectName = 'my-prefix/datafile-100-kB' const fdObject = dataDir ? fs.readFileSync(dataDir + '/' + fdObjectName) : Buffer.alloc(100 * 1024, 0) before((done) => client.makeBucket(fdPrefixBucket, '', done)) after((done) => client.removeBucket(fdPrefixBucket, done)) - describe('Test force removal of a prefix', function () { - step(`putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucket}, objectName:${fdObjectName}, stream:100Kib_`, done => { - client.putObject(fdPrefixBucket, fdObjectName, fdObject) - .then(() => done()) - .catch(done) - }) + step( + `putObject(bucketName, objectName, stream)_bucketName:${fdPrefixBucket}, objectName:${fdObjectName}, stream:100Kib_`, + (done) => { + client + .putObject(fdPrefixBucket, fdObjectName, fdObject) + .then(() => done()) + .catch(done) + } + ) - step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucket}_Remove 1 object`, done => { - client.removeObject(fdPrefixBucket, "/my-prefix",{forceDelete:true}, () => { + step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucket}_Remove 1 object`, (done) => { + client.removeObject(fdPrefixBucket, '/my-prefix', { forceDelete: true }, () => { done() }) }) - step(`listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucket}, prefix: 'my-prefix', recursive:true_`, done => { - let objList=[] - client.listObjects(fdPrefixBucket, 'my-prefix', true, {}) - .on('error', done) - .on('end', () => { - if (_.isEqual(0, objList.length)) return done() - return done(new Error(`listObjects lists ${objList.length} objects, expected 0`)) - }) - .on('data', data => { - objList.push(data) - }) - }) + step( + `listObjects(bucketName, prefix, recursive)_bucketName:${fdPrefixBucket}, prefix: 'my-prefix', recursive:true_`, + (done) => { + let objList = [] + client + .listObjects(fdPrefixBucket, 'my-prefix', true, {}) + .on('error', done) + .on('end', () => { + if (_.isEqual(0, objList.length)) return done() + return done(new Error(`listObjects lists ${objList.length} objects, expected 0`)) + }) + .on('data', (data) => { + objList.push(data) + }) + } + ) }) }) - }) diff --git a/src/test/unit/test.js b/src/test/unit/test.js index c91d3f17..3aeb4379 100644 --- a/src/test/unit/test.js +++ b/src/test/unit/test.js @@ -19,15 +19,19 @@ require('source-map-support').install() import { assert } from 'chai' import Nock from 'nock' import Stream from 'stream' -import * as Minio from '../../../dist/main/minio' -import { isValidEndpoint, - isValidIP, makeDateLong, - makeDateShort,partsRequired, - CopySourceOptions, + +import { + calculateEvenSplits, CopyDestinationOptions, + CopySourceOptions, isArray, - calculateEvenSplits, + isValidEndpoint, + isValidIP, + makeDateLong, + makeDateShort, + partsRequired, } from '../../../dist/main/helpers' +import * as Minio from '../../../dist/main/minio' var Package = require('../../../package.json') @@ -44,7 +48,7 @@ describe('Helpers', () => { it('should fail for invalid endpoint characters', () => { assert.equal(isValidEndpoint('111.#2.11'), false) }) - + it('should make date short', () => { let date = new Date('2012-12-03T17:25:36.331Z') @@ -56,110 +60,132 @@ describe('Helpers', () => { assert.equal(makeDateLong(date), '20170811T172634Z') }) - // Adopted from minio-go sdk - const oneGB =1024 * 1024 * 1024 - const fiveGB = (5*oneGB) + const oneGB = 1024 * 1024 * 1024 + const fiveGB = 5 * oneGB const OBJ_SIZES = { - gb1 : oneGB, - gb5 : fiveGB, - gb5p1 : fiveGB + 1, - gb10p1 : 2 * fiveGB + 1, - gb10p2 : 2 * fiveGB + 2 + gb1: oneGB, + gb5: fiveGB, + gb5p1: fiveGB + 1, + gb10p1: 2 * fiveGB + 1, + gb10p2: 2 * fiveGB + 2, } const maxMultipartPutObjectSize = 1024 * 1024 * 1024 * 1024 * 5 - it('Parts Required Test cases ', () =>{ - + it('Parts Required Test cases ', () => { const expectedPartsRequiredTestCases = [ - {value:0, expected:0}, - {value:1, expected:1}, - {value:fiveGB, expected:10}, - {value:OBJ_SIZES.gb5p1, expected:10}, - {value:2 * fiveGB, expected:20}, - {value:OBJ_SIZES.gb10p1, expected:20}, - {value:OBJ_SIZES.gb10p2, expected:20}, - {value:OBJ_SIZES.gb10p1 + OBJ_SIZES.gb10p2, expected:40}, - {value:maxMultipartPutObjectSize, expected:10000} + { value: 0, expected: 0 }, + { value: 1, expected: 1 }, + { value: fiveGB, expected: 10 }, + { value: OBJ_SIZES.gb5p1, expected: 10 }, + { value: 2 * fiveGB, expected: 20 }, + { value: OBJ_SIZES.gb10p1, expected: 20 }, + { value: OBJ_SIZES.gb10p2, expected: 20 }, + { value: OBJ_SIZES.gb10p1 + OBJ_SIZES.gb10p2, expected: 40 }, + { value: maxMultipartPutObjectSize, expected: 10000 }, ] - expectedPartsRequiredTestCases.forEach((testCase)=>{ + expectedPartsRequiredTestCases.forEach((testCase) => { const fnResult = partsRequired(testCase.value) - assert.equal(fnResult,testCase.expected) + assert.equal(fnResult, testCase.expected) }) }) - it("Even split of Sizes Test cases ", ()=>{ + it('Even split of Sizes Test cases ', () => { // Adopted from minio-go sdk - const expectedSplitsTestCases =[ - {size:0, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:null, expectedEnd:null} - ,{size:1, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:[undefined], expectedEnd:[NaN]} - ,{size:1,sourceConfig:new CopySourceOptions({Start: 0}), expectedStart:[0], expectedEnd:[0]} - ,{size:OBJ_SIZES.gb1, sourceConfig:new CopySourceOptions({Start: -1}), expectedStart:[0, 536870912],expectedEnd:[536870911, 1073741823]} - ,{size:OBJ_SIZES.gb5, sourceConfig:new CopySourceOptions({Start: -1}), - expectedStart:[0, 536870912, 1073741824, 1610612736, 2147483648, 2684354560, - 3221225472, 3758096384, 4294967296, 4831838208], - expectedEnd:[536870911, 1073741823, 1610612735, 2147483647, 2684354559, 3221225471, - 3758096383, 4294967295, 4831838207, 5368709119] + const expectedSplitsTestCases = [ + { size: 0, sourceConfig: new CopySourceOptions({ Start: -1 }), expectedStart: null, expectedEnd: null }, + { size: 1, sourceConfig: new CopySourceOptions({ Start: -1 }), expectedStart: [undefined], expectedEnd: [NaN] }, + { size: 1, sourceConfig: new CopySourceOptions({ Start: 0 }), expectedStart: [0], expectedEnd: [0] }, + { + size: OBJ_SIZES.gb1, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [0, 536870912], + expectedEnd: [536870911, 1073741823], + }, + { + size: OBJ_SIZES.gb5, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [ + 0, 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, + ], + expectedEnd: [ + 536870911, 1073741823, 1610612735, 2147483647, 2684354559, 3221225471, 3758096383, 4294967295, 4831838207, + 5368709119, + ], }, // 2 part splits - {size:OBJ_SIZES.gb5p1, sourceConfig:new CopySourceOptions({Start: -1}), - expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, - 3221225473, 3758096385, 4294967297, 4831838209], - expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, - 3758096384, 4294967296, 4831838208, 5368709120], + { + size: OBJ_SIZES.gb5p1, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [ + 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, + ], + expectedEnd: [ + 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, + 5368709120, + ], }, - {size:OBJ_SIZES.gb5p1, sourceConfig:new CopySourceOptions({Start: -1}), - expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, - 3221225473, 3758096385, 4294967297, 4831838209], - expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, - 3758096384, 4294967296, 4831838208, 5368709120], + { + size: OBJ_SIZES.gb5p1, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [ + 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, + ], + expectedEnd: [ + 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, + 5368709120, + ], }, // 3 part splits - {size:OBJ_SIZES.gb10p1,sourceConfig:new CopySourceOptions({Start: -1}), - expectedStart:[0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, - 3221225473, 3758096385, 4294967297, 4831838209, 5368709121, - 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, - 8589934593, 9126805505, 9663676417, 10200547329], - expectedEnd:[536870912, 1073741824, 1610612736, 2147483648, 2684354560, - 3221225472, 3758096384, 4294967296, 4831838208, 5368709120, - 5905580032, 6442450944, 6979321856, 7516192768, 8053063680, - 8589934592, 9126805504, 9663676416, 10200547328, 10737418240], + { + size: OBJ_SIZES.gb10p1, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [ + 0, 536870913, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, + 5368709121, 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, 8589934593, 9126805505, 9663676417, + 10200547329, + ], + expectedEnd: [ + 536870912, 1073741824, 1610612736, 2147483648, 2684354560, 3221225472, 3758096384, 4294967296, 4831838208, + 5368709120, 5905580032, 6442450944, 6979321856, 7516192768, 8053063680, 8589934592, 9126805504, 9663676416, + 10200547328, 10737418240, + ], + }, + { + size: OBJ_SIZES.gb10p2, + sourceConfig: new CopySourceOptions({ Start: -1 }), + expectedStart: [ + 0, 536870913, 1073741826, 1610612738, 2147483650, 2684354562, 3221225474, 3758096386, 4294967298, 4831838210, + 5368709122, 5905580034, 6442450946, 6979321858, 7516192770, 8053063682, 8589934594, 9126805506, 9663676418, + 10200547330, + ], + expectedEnd: [ + 536870912, 1073741825, 1610612737, 2147483649, 2684354561, 3221225473, 3758096385, 4294967297, 4831838209, + 5368709121, 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, 8589934593, 9126805505, 9663676417, + 10200547329, 10737418241, + ], }, - {size:OBJ_SIZES.gb10p2,sourceConfig:new CopySourceOptions({Start: -1}), - expectedStart:[0, 536870913, 1073741826, 1610612738, 2147483650, 2684354562, - 3221225474, 3758096386, 4294967298, 4831838210, 5368709122, - 5905580034, 6442450946, 6979321858, 7516192770, 8053063682, - 8589934594, 9126805506, 9663676418, 10200547330], - expectedEnd:[536870912, 1073741825, 1610612737, 2147483649, 2684354561, - 3221225473, 3758096385, 4294967297, 4831838209, 5368709121, - 5905580033, 6442450945, 6979321857, 7516192769, 8053063681, - 8589934593, 9126805505, 9663676417, 10200547329, 10737418241] - } ] - - expectedSplitsTestCases.forEach((testCase)=>{ + expectedSplitsTestCases.forEach((testCase) => { const fnResult = calculateEvenSplits(testCase.size, testCase) - const { - startIndex, - endIndex - } = fnResult ||{} + const { startIndex, endIndex } = fnResult || {} - if(isArray(startIndex) && isArray(endIndex)) { - const isExpectedResult = (startIndex.length === testCase.expectedStart.length) && (endIndex.length === testCase.expectedEnd.length) + if (isArray(startIndex) && isArray(endIndex)) { + const isExpectedResult = + startIndex.length === testCase.expectedStart.length && endIndex.length === testCase.expectedEnd.length assert.equal(isExpectedResult, true) - } else{ // null cases. + } else { + // null cases. assert.equal(startIndex, expectedSplitsTestCases.expectedStart) assert.equal(endIndex, expectedSplitsTestCases.expectedEnd) } }) - }) - }) describe('CopyConditions', () => { @@ -204,7 +230,7 @@ describe('CopyConditions', () => { }) }) -describe('Client', function() { +describe('Client', function () { var nockRequests = [] this.timeout(5000) beforeEach(() => { @@ -212,7 +238,7 @@ describe('Client', function() { nockRequests = [] }) afterEach(() => { - nockRequests.forEach(element => { + nockRequests.forEach((element) => { if (!element.request.isDone()) { element.request.done() } @@ -223,14 +249,14 @@ describe('Client', function() { port: 9000, accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false + useSSL: false, }) describe('new client', () => { it('should work with https', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) assert.equal(client.port, 443) }) @@ -240,7 +266,7 @@ describe('Client', function() { port: 9000, accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false + useSSL: false, }) assert.equal(client.port, 9000) }) @@ -249,7 +275,7 @@ describe('Client', function() { endPoint: 'localhost', accessKey: 'accesskey', secretKey: 'secretkey', - useSSL: false + useSSL: false, }) assert.equal(client.port, 80) }) @@ -258,7 +284,7 @@ describe('Client', function() { endPoint: 'localhost', port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) assert.equal(client.port, 9000) }) @@ -267,7 +293,7 @@ describe('Client', function() { new Minio.Client({ endPoint: 'http://localhost:9000', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -278,7 +304,7 @@ describe('Client', function() { new Minio.Client({ endPoint: 'localhost##$@3', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -288,7 +314,7 @@ describe('Client', function() { try { new Minio.Client({ accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -300,7 +326,7 @@ describe('Client', function() { endPoint: 'localhost', port: -1, accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -313,7 +339,7 @@ describe('Client', function() { secure: false, port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -326,7 +352,7 @@ describe('Client', function() { secure: true, port: 9000, accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) } catch (e) { done() @@ -340,16 +366,16 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', port: 9000, - useSSL: false + useSSL: false, }) - client.presignedGetObject('bucket', 'object', 1000, function() {}) + client.presignedGetObject('bucket', 'object', 1000, function () {}) } catch (e) { done() } }) it('should not generate presigned url with wrong expires param', (done) => { try { - client.presignedGetObject('bucket', 'object', '0', function() {}) + client.presignedGetObject('bucket', 'object', '0', function () {}) } catch (e) { done() } @@ -361,16 +387,16 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', port: 9000, - useSSL: false + useSSL: false, }) - client.presignedPutObject('bucket', 'object', 1000, function() {}) + client.presignedPutObject('bucket', 'object', 1000, function () {}) } catch (e) { done() } }) it('should not generate presigned url with wrong expires param', (done) => { try { - client.presignedPutObject('bucket', 'object', '0', function() {}) + client.presignedPutObject('bucket', 'object', '0', function () {}) } catch (e) { done() } @@ -414,37 +440,40 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) - assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version}`, - client.userAgent) + assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version}`, client.userAgent) }) it('should set user agent', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo('test', '3.2.1') - assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent) + assert.equal( + `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, + client.userAgent + ) }) it('should set user agent without comments', () => { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo('test', '3.2.1') - assert.equal(`MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent) + assert.equal( + `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, + client.userAgent + ) }) it('should not set user agent without name', (done) => { try { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo(null, '3.2.1') } catch (e) { @@ -456,7 +485,7 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo('', '3.2.1') } catch (e) { @@ -468,7 +497,7 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo('test', null) } catch (e) { @@ -480,7 +509,7 @@ describe('Client', function() { var client = new Minio.Client({ endPoint: 'localhost', accessKey: 'accesskey', - secretKey: 'secretkey' + secretKey: 'secretkey', }) client.setAppInfo('test', '') } catch (e) { @@ -493,35 +522,35 @@ describe('Client', function() { describe('#getObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObject(null, 'hello', function() {}) + client.getObject(null, 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObject('', 'hello', function() {}) + client.getObject('', 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObject(' \n \t ', 'hello', function() {}) + client.getObject(' \n \t ', 'hello', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.getObject('hello', null, function() {}) + client.getObject('hello', null, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.getObject('hello', '', function() {}) + client.getObject('hello', '', function () {}) } catch (e) { done() } @@ -532,7 +561,7 @@ describe('Client', function() { describe('with small objects using single put', () => { it('should fail when data is smaller than specified', (done) => { var s = new Stream.Readable() - s._read = function() {} + s._read = function () {} s.push('hello world') s.push(null) client.putObject('bucket', 'object', s, 12, '', (e) => { @@ -543,7 +572,7 @@ describe('Client', function() { }) it('should fail when data is larger than specified', (done) => { var s = new Stream.Readable() - s._read = function() {} + s._read = function () {} s.push('hello world') s.push(null) client.putObject('bucket', 'object', s, 10, '', (e) => { @@ -569,35 +598,35 @@ describe('Client', function() { }) it('should fail on null bucket', (done) => { try { - client.putObject(null, 'hello', null, 1, '', function() {}) + client.putObject(null, 'hello', null, 1, '', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObject(' \n \t ', 'hello', null, 1, '', function() {}) + client.putObject(' \n \t ', 'hello', null, 1, '', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObject('', 'hello', null, 1, '', function() {}) + client.putObject('', 'hello', null, 1, '', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.putObject('hello', null, null, 1, '', function() {}) + client.putObject('hello', null, null, 1, '', function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObject('hello', '', null, 1, '', function() {}) + client.putObject('hello', '', null, 1, '', function () {}) } catch (e) { done() } @@ -608,7 +637,11 @@ describe('Client', function() { describe('#removeAllBucketNotification()', () => { it('should error on invalid arguments', () => { assert.throws(() => { - client.removeAllBucketNotification('ab', () => {}, function() {}) + client.removeAllBucketNotification( + 'ab', + () => {}, + function () {} + ) }, /Invalid bucket name/) }) }) @@ -652,35 +685,35 @@ describe('Client', function() { describe('#statObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.statObject(null, 'hello', function() {}) + client.statObject(null, 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.statObject('', 'hello', function() {}) + client.statObject('', 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.statObject(' \n \t ', 'hello', function() {}) + client.statObject(' \n \t ', 'hello', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.statObject('hello', null, function() {}) + client.statObject('hello', null, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.statObject('hello', '', function() {}) + client.statObject('hello', '', function () {}) } catch (e) { done() } @@ -688,60 +721,59 @@ describe('Client', function() { it('should fail on incompatible argument type (number) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', 1, function() {}) + client.statObject('hello', 'testStatOpts', 1, function () {}) } catch (e) { done() } }) it('should fail on incompatible argument type (null) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', null, function() {}) + client.statObject('hello', 'testStatOpts', null, function () {}) } catch (e) { done() } }) it('should fail on incompatible argument type (sting) for statOpts object', (done) => { try { - client.statObject('hello', 'testStatOpts', ' ', function() {}) + client.statObject('hello', 'testStatOpts', ' ', function () {}) } catch (e) { done() } }) - }) describe('#removeObject(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeObject(null, 'hello', function() {}) + client.removeObject(null, 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObject('', 'hello', function() {}) + client.removeObject('', 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObject(' \n \t ', 'hello', function() {}) + client.removeObject(' \n \t ', 'hello', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.removeObject('hello', null, function() {}) + client.removeObject('hello', null, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.removeObject('hello', '', function() {}) + client.removeObject('hello', '', function () {}) } catch (e) { done() } @@ -749,15 +781,15 @@ describe('Client', function() { // Versioning related options as removeOpts it('should fail on empty (null) removeOpts object', (done) => { try { - client.removeObject('hello', 'testRemoveOpts',null, function() {}) + client.removeObject('hello', 'testRemoveOpts', null, function () {}) } catch (e) { done() } }) - + it('should fail on empty (string) removeOpts', (done) => { try { - client.removeObject('hello', 'testRemoveOpts','', function() {}) + client.removeObject('hello', 'testRemoveOpts', '', function () {}) } catch (e) { done() } @@ -767,35 +799,35 @@ describe('Client', function() { describe('#removeIncompleteUpload(bucket, object, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeIncompleteUpload(null, 'hello', function() {}) + client.removeIncompleteUpload(null, 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeIncompleteUpload('', 'hello', function() {}) + client.removeIncompleteUpload('', 'hello', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeIncompleteUpload(' \n \t ', 'hello', function() {}) + client.removeIncompleteUpload(' \n \t ', 'hello', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.removeIncompleteUpload('hello', null, function() {}) + client.removeIncompleteUpload('hello', null, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.removeIncompleteUpload('hello', '', function() {}) + client.removeIncompleteUpload('hello', '', function () {}) } catch (e) { done() } @@ -803,20 +835,18 @@ describe('Client', function() { }) }) - describe('Bucket Versioning APIs', ()=>{ + describe('Bucket Versioning APIs', () => { describe('getBucketVersioning(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketVersioning(null, function () { - }) + client.getBucketVersioning(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketVersioning('', function () { - }) + client.getBucketVersioning('', function () {}) } catch (e) { done() } @@ -826,16 +856,14 @@ describe('Client', function() { describe('setBucketVersioning(bucket, versionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketVersioning(null, {},function () { - }) + client.setBucketVersioning(null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketVersioning('', {},function () { - }) + client.setBucketVersioning('', {}, function () {}) } catch (e) { done() } @@ -843,8 +871,7 @@ describe('Client', function() { it('should fail on empty versionConfig', (done) => { try { - client.setBucketVersioning('', null,function () { - }) + client.setBucketVersioning('', null, function () {}) } catch (e) { done() } @@ -852,88 +879,75 @@ describe('Client', function() { }) }) - describe('Bucket and Object Tags APIs', () => { describe('Set Bucket Tags ', () => { it('should fail on null bucket', (done) => { try { - client.setBucketTagging(null, {}, function () { - }) + client.setBucketTagging(null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketTagging('', {}, function () { - }) + client.setBucketTagging('', {}, function () {}) } catch (e) { done() } }) it('should fail if tags are more than 50', (done) => { - const _50_plus_key_tags={} - for(let i=0;i<51;i+=1){ - _50_plus_key_tags[i]=i + const _50_plus_key_tags = {} + for (let i = 0; i < 51; i += 1) { + _50_plus_key_tags[i] = i } try { - client.setBucketTagging('', _50_plus_key_tags, function () { - }) + client.setBucketTagging('', _50_plus_key_tags, function () {}) } catch (e) { done() } }) - }) describe('Get Bucket Tags', () => { it('should fail on invalid bucket', (done) => { try { - client.getBucketTagging('nv',null, function () { - }) + client.getBucketTagging('nv', null, function () {}) } catch (e) { done() } }) it('should fail on null bucket', (done) => { try { - client.getBucketTagging(null, function () { - }) + client.getBucketTagging(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketTagging('', function () { - }) + client.getBucketTagging('', function () {}) } catch (e) { done() } }) - - }) describe('Remove Bucket Tags', () => { it('should fail on null object', (done) => { try { - client.removeBucketTagging(null, function () { - }) + client.removeBucketTagging(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketTagging('', function () { - }) + client.removeBucketTagging('', function () {}) } catch (e) { done() } }) it('should fail on invalid bucket name', (done) => { try { - client.removeBucketTagging('198.51.100.24', function () { - }) + client.removeBucketTagging('198.51.100.24', function () {}) } catch (e) { done() } @@ -941,8 +955,7 @@ describe('Client', function() { it('should fail on invalid bucket name', (done) => { try { - client.removeBucketTagging('xy', function () { - }) + client.removeBucketTagging('xy', function () {}) } catch (e) { done() } @@ -951,91 +964,78 @@ describe('Client', function() { describe('Put Object Tags', () => { it('should fail on null object', (done) => { try { - client.putObjectTagging('my-bucket-name',null, {}, function () { - }) + client.putObjectTagging('my-bucket-name', null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObjectTagging('my-bucket-name',null, {}, function () { - }) + client.putObjectTagging('my-bucket-name', null, {}, function () {}) } catch (e) { done() } }) it('should fail on non object tags', (done) => { try { - client.putObjectTagging('my-bucket-name',null, 'non-obj-tag', function () { - }) + client.putObjectTagging('my-bucket-name', null, 'non-obj-tag', function () {}) } catch (e) { done() } }) it('should fail if tags are more than 50 on an object', (done) => { - const _50_plus_key_tags={} - for(let i=0;i<51;i+=1){ - _50_plus_key_tags[i]=i + const _50_plus_key_tags = {} + for (let i = 0; i < 51; i += 1) { + _50_plus_key_tags[i] = i } try { - client.putObjectTagging('my-bucket-name',null, _50_plus_key_tags, function () { - }) + client.putObjectTagging('my-bucket-name', null, _50_plus_key_tags, function () {}) } catch (e) { done() } }) - }) describe('Get Object Tags', () => { it('should fail on invalid bucket', (done) => { try { - client.getObjectTagging('nv',null, function () { - }) + client.getObjectTagging('nv', null, function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.getObjectTagging('my-bucket-name',null, function () { - }) + client.getObjectTagging('my-bucket-name', null, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.getObjectTagging('my-bucket-name',null, function () { - }) + client.getObjectTagging('my-bucket-name', null, function () {}) } catch (e) { done() } }) - - }) describe('Remove Object Tags', () => { it('should fail on null object', (done) => { try { - client.removeObjectTagging('my-bucket',null, function () { - }) + client.removeObjectTagging('my-bucket', null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeObjectTagging('my-bucket', '', function () { - }) + client.removeObjectTagging('my-bucket', '', function () {}) } catch (e) { done() } }) it('should fail on invalid bucket name', (done) => { try { - client.removeObjectTagging('198.51.100.24', function () { - }) + client.removeObjectTagging('198.51.100.24', function () {}) } catch (e) { done() } @@ -1043,8 +1043,7 @@ describe('Client', function() { it('should fail on invalid bucket name', (done) => { try { - client.removeObjectTagging('xy', function () { - }) + client.removeObjectTagging('xy', function () {}) } catch (e) { done() } @@ -1052,12 +1051,10 @@ describe('Client', function() { }) }) - describe('setBucketLifecycle(bucket, lifecycleConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketLifecycle(null, null,function () { - }) + client.setBucketLifecycle(null, null, function () {}) } catch (e) { done() } @@ -1065,20 +1062,17 @@ describe('Client', function() { it('should fail on empty bucket', (done) => { try { - client.setBucketLifecycle('', null,function () { - }) + client.setBucketLifecycle('', null, function () {}) } catch (e) { done() } }) - }) describe('getBucketLifecycle(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketLifecycle(null, function () { - }) + client.getBucketLifecycle(null, function () {}) } catch (e) { done() } @@ -1086,19 +1080,16 @@ describe('Client', function() { it('should fail on empty bucket', (done) => { try { - client.getBucketLifecycle('', function () { - }) + client.getBucketLifecycle('', function () {}) } catch (e) { done() } }) - }) describe('removeBucketLifecycle(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketLifecycle(null, null,function () { - }) + client.removeBucketLifecycle(null, null, function () {}) } catch (e) { done() } @@ -1106,29 +1097,25 @@ describe('Client', function() { it('should fail on empty bucket', (done) => { try { - client.removeBucketLifecycle('', null,function () { - }) + client.removeBucketLifecycle('', null, function () {}) } catch (e) { done() } }) - }) - describe('Object Locking APIs', ()=> { + describe('Object Locking APIs', () => { describe('getObjectLockConfig(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectLockConfig(null, function () { - }) + client.getObjectLockConfig(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectLockConfig('', function () { - }) + client.getObjectLockConfig('', function () {}) } catch (e) { done() } @@ -1138,48 +1125,50 @@ describe('Client', function() { describe('setObjectLockConfig(bucket, lockConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setObjectLockConfig(null, function () { - }) + client.setObjectLockConfig(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setObjectLockConfig('', function () { - }) + client.setObjectLockConfig('', function () {}) } catch (e) { done() } }) it('should fail on passing invalid mode ', (done) => { try { - client.setObjectLockConfig('my-bucket',{mode:"invalid_mode"}, function () { - }) + client.setObjectLockConfig('my-bucket', { mode: 'invalid_mode' }, function () {}) } catch (e) { done() } }) it('should fail on passing invalid unit ', (done) => { try { - client.setObjectLockConfig('my-bucket',{ mode:"COMPLIANCE",unit:"invalid_unit"}, function () { - }) + client.setObjectLockConfig('my-bucket', { mode: 'COMPLIANCE', unit: 'invalid_unit' }, function () {}) } catch (e) { done() } }) it('should fail on passing invalid validity ', (done) => { try { - client.setObjectLockConfig('my-bucket',{mode:"COMPLIANCE",unit:"invalid_unit", validity:''}, function () { - }) + client.setObjectLockConfig( + 'my-bucket', + { mode: 'COMPLIANCE', unit: 'invalid_unit', validity: '' }, + function () {} + ) } catch (e) { done() } }) it('should fail on passing invalid config ', (done) => { try { - client.setObjectLockConfig('my-bucket',{mode:"COMPLIANCE", randomProp:true, nonExisting:false,}, function () { - }) + client.setObjectLockConfig( + 'my-bucket', + { mode: 'COMPLIANCE', randomProp: true, nonExisting: false }, + function () {} + ) } catch (e) { done() } @@ -1187,36 +1176,32 @@ describe('Client', function() { }) }) - describe('Object retention APIs', ()=> { + describe('Object retention APIs', () => { describe('getObjectRetention(bucket, objectName, getRetentionOpts,callback)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectRetention(null,'','', function () { - }) + client.getObjectRetention(null, '', '', function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectRetention('', '','',function () { - }) + client.getObjectRetention('', '', '', function () {}) } catch (e) { done() } }) it('should fail on invalid object name', (done) => { try { - client.getObjectRetention('my-bucket', null, '',function () { - }) + client.getObjectRetention('my-bucket', null, '', function () {}) } catch (e) { done() } }) it('should fail on invalid versionId', (done) => { try { - client.getObjectRetention('my-bucket', 'objectname', {versionId:123},function () { - }) + client.getObjectRetention('my-bucket', 'objectname', { versionId: 123 }, function () {}) } catch (e) { done() } @@ -1226,16 +1211,14 @@ describe('Client', function() { describe('putObjectRetention(bucket, objectName, retentionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.putObjectRetention(null,'',{}, function () { - }) + client.putObjectRetention(null, '', {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.putObjectRetention('','',{}, function () { - }) + client.putObjectRetention('', '', {}, function () {}) } catch (e) { done() } @@ -1243,48 +1226,42 @@ describe('Client', function() { it('should fail on null object', (done) => { try { - client.putObjectRetention('my-bucket',null,{}, function () { - }) + client.putObjectRetention('my-bucket', null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty object', (done) => { try { - client.putObjectRetention('my-bucket', '', {}, function () { - }) + client.putObjectRetention('my-bucket', '', {}, function () {}) } catch (e) { done() } }) it('should fail on passing invalid mode ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', {mode:"invalid_mode"}, function () { - }) + client.putObjectRetention('my-bucket', 'my-object', { mode: 'invalid_mode' }, function () {}) } catch (e) { done() } }) it('should fail on passing invalid governanceBypass ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', { governanceBypass:"nonbool"}, function () { - }) + client.putObjectRetention('my-bucket', 'my-object', { governanceBypass: 'nonbool' }, function () {}) } catch (e) { done() } }) it('should fail on passing invalid (null) retainUntilDate ', (done) => { try { - client.putObjectRetention('my-bucket', 'my-object', { retainUntilDate:12345}, function () { - }) + client.putObjectRetention('my-bucket', 'my-object', { retainUntilDate: 12345 }, function () {}) } catch (e) { done() } }) it('should fail on passing invalid versionId ', (done) => { try { - client.putObjectRetention('my-bucket',{ versionId:"COMPLIANCE" }, function () { - }) + client.putObjectRetention('my-bucket', { versionId: 'COMPLIANCE' }, function () {}) } catch (e) { done() } @@ -1292,65 +1269,60 @@ describe('Client', function() { }) }) - - describe('Bucket Encryption APIs', ()=> { - + describe('Bucket Encryption APIs', () => { describe('setBucketEncryption(bucket, encryptionConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketEncryption(null, function () { - }) + client.setBucketEncryption(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketEncryption('', function () { - }) + client.setBucketEncryption('', function () {}) } catch (e) { done() } }) it('should fail on multiple rules', (done) => { try { - client.setBucketEncryption('my-bucket', { - // Default Rule - Rule:[ - { - ApplyServerSideEncryptionByDefault: { - SSEAlgorithm:"AES256" - } - }, - { - ApplyServerSideEncryptionByDefault: { - SSEAlgorithm:"AES256" - } - } - ] - - },function () { - }) + client.setBucketEncryption( + 'my-bucket', + { + // Default Rule + Rule: [ + { + ApplyServerSideEncryptionByDefault: { + SSEAlgorithm: 'AES256', + }, + }, + { + ApplyServerSideEncryptionByDefault: { + SSEAlgorithm: 'AES256', + }, + }, + ], + }, + function () {} + ) } catch (e) { done() } }) - }) describe('getBucketEncryption(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketEncryption(null, function () { - }) + client.getBucketEncryption(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketEncryption('', function () { - }) + client.getBucketEncryption('', function () {}) } catch (e) { done() } @@ -1360,37 +1332,32 @@ describe('Client', function() { describe('removeBucketEncryption(bucket, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketEncryption(null, function () { - }) + client.removeBucketEncryption(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketEncryption('', function () { - }) + client.removeBucketEncryption('', function () {}) } catch (e) { done() } }) }) - }) - describe('Bucket Replication APIs', ()=> { + describe('Bucket Replication APIs', () => { describe('setBucketReplication(bucketName, replicationConfig, callback)', () => { it('should fail on null bucket', (done) => { try { - client.setBucketReplication(null, {}, function () { - }) + client.setBucketReplication(null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setBucketReplication('', {}, function () { - }) + client.setBucketReplication('', {}, function () {}) } catch (e) { done() } @@ -1398,8 +1365,7 @@ describe('Client', function() { it('should fail on empty replicationConfig', (done) => { try { - client.setBucketReplication('my-bucket', {}, function () { - }) + client.setBucketReplication('my-bucket', {}, function () {}) } catch (e) { done() } @@ -1407,8 +1373,7 @@ describe('Client', function() { it('should fail on empty replicationConfig role', (done) => { try { - client.setBucketReplication('my-bucket', {role:''}, function () { - }) + client.setBucketReplication('my-bucket', { role: '' }, function () {}) } catch (e) { done() } @@ -1416,8 +1381,7 @@ describe('Client', function() { it('should fail on invalid value for replicationConfig role', (done) => { try { - client.setBucketReplication('my-bucket', {role:12}, function () { - }) + client.setBucketReplication('my-bucket', { role: 12 }, function () {}) } catch (e) { done() } @@ -1425,36 +1389,31 @@ describe('Client', function() { it('should fail on empty value for replicationConfig rules', (done) => { try { - client.setBucketReplication('my-bucket', {role:"arn:",rules:[]}, function () { - }) + client.setBucketReplication('my-bucket', { role: 'arn:', rules: [] }, function () {}) } catch (e) { done() } }) it('should fail on null value for replicationConfig rules', (done) => { try { - client.setBucketReplication('my-bucket', {role:"arn:",rules:null}, function () { - }) + client.setBucketReplication('my-bucket', { role: 'arn:', rules: null }, function () {}) } catch (e) { done() } }) - }) describe('getBucketReplication(bucketName, callback)', () => { it('should fail on null bucket', (done) => { try { - client.getBucketReplication(null, {}, function () { - }) + client.getBucketReplication(null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getBucketReplication('', {},function () { - }) + client.getBucketReplication('', {}, function () {}) } catch (e) { done() } @@ -1464,16 +1423,14 @@ describe('Client', function() { describe('removeBucketReplication(bucketName, callback)', () => { it('should fail on null bucket', (done) => { try { - client.removeBucketReplication(null, {}, function () { - }) + client.removeBucketReplication(null, {}, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.removeBucketReplication('', {},function () { - }) + client.removeBucketReplication('', {}, function () {}) } catch (e) { done() } @@ -1481,21 +1438,18 @@ describe('Client', function() { }) }) - - describe('Object Legal Hold APIs', ()=> { + describe('Object Legal Hold APIs', () => { describe('getObjectLegalHold(bucketName, objectName, getOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.getObjectLegalHold(null, function () { - }) + client.getObjectLegalHold(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.getObjectLegalHold('', function () { - }) + client.getObjectLegalHold('', function () {}) } catch (e) { done() } @@ -1503,16 +1457,14 @@ describe('Client', function() { it('should fail on null objectName', (done) => { try { - client.getObjectLegalHold('my-bucket', null, function () { - }) + client.getObjectLegalHold('my-bucket', null, function () {}) } catch (e) { done() } }) it('should fail on null getOpts', (done) => { try { - client.getObjectLegalHold('my-bucker', 'my-object', null, function () { - }) + client.getObjectLegalHold('my-bucker', 'my-object', null, function () {}) } catch (e) { done() } @@ -1522,16 +1474,14 @@ describe('Client', function() { describe('setObjectLegalHold(bucketName, objectName, setOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.setObjectLegalHold(null, function () { - }) + client.setObjectLegalHold(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.setObjectLegalHold('', function () { - }) + client.setObjectLegalHold('', function () {}) } catch (e) { done() } @@ -1539,24 +1489,21 @@ describe('Client', function() { it('should fail on null objectName', (done) => { try { - client.setObjectLegalHold('my-bucket', null, function () { - }) + client.setObjectLegalHold('my-bucket', null, function () {}) } catch (e) { done() } }) it('should fail on null setOpts', (done) => { try { - client.setObjectLegalHold('my-bucker', 'my-object', null, function () { - }) + client.setObjectLegalHold('my-bucker', 'my-object', null, function () {}) } catch (e) { done() } }) it('should fail on empty versionId', (done) => { try { - client.setObjectLegalHold('my-bucker', 'my-object', {}, function () { - }) + client.setObjectLegalHold('my-bucker', 'my-object', {}, function () {}) } catch (e) { done() } @@ -1564,12 +1511,11 @@ describe('Client', function() { }) }) - describe('Compose Object APIs', ()=> { + describe('Compose Object APIs', () => { describe('composeObject(destObjConfig, sourceObjectList,cb)', () => { it('should fail on null destination config', (done) => { try { - client.composeObject(null, function () { - }) + client.composeObject(null, function () {}) } catch (e) { done() } @@ -1577,9 +1523,8 @@ describe('Client', function() { it('should fail on no array source config', (done) => { try { - const destOptions = new CopyDestinationOptions({Bucket:'test-bucket', Object:'test-object'}) - client.composeObject(destOptions, 'non-array', function () { - }) + const destOptions = new CopyDestinationOptions({ Bucket: 'test-bucket', Object: 'test-object' }) + client.composeObject(destOptions, 'non-array', function () {}) } catch (e) { done() } @@ -1587,30 +1532,26 @@ describe('Client', function() { it('should fail on null source config', (done) => { try { - const destOptions = new CopyDestinationOptions({Bucket:'test-bucket', Object:'test-object'}) - client.composeObject(destOptions, null, function () { - }) + const destOptions = new CopyDestinationOptions({ Bucket: 'test-bucket', Object: 'test-object' }) + client.composeObject(destOptions, null, function () {}) } catch (e) { done() } }) - }) }) - describe('Select Object Content APIs', ()=> { + describe('Select Object Content APIs', () => { describe('selectObjectContent(bucketName, objectName, selectOpts={}, cb)', () => { it('should fail on null bucket', (done) => { try { - client.selectObjectContent(null, function () { - }) + client.selectObjectContent(null, function () {}) } catch (e) { done() } }) it('should fail on empty bucket', (done) => { try { - client.selectObjectContent('', function () { - }) + client.selectObjectContent('', function () {}) } catch (e) { done() } @@ -1618,546 +1559,550 @@ describe('Client', function() { it('should fail on empty object', (done) => { try { - client.selectObjectContent('my-bucket','', function () { - }) + client.selectObjectContent('my-bucket', '', function () {}) } catch (e) { done() } }) it('should fail on null object', (done) => { try { - client.selectObjectContent('my-bucket',null, function () { - }) + client.selectObjectContent('my-bucket', null, function () {}) } catch (e) { done() } }) - }) }) - }) - -describe('IP Address Validations', ()=>{ - +describe('IP Address Validations', () => { it('should validate for valid ip', () => { assert.equal(isValidIP('1.1.1.1'), true) }) - + it('Check list of IPV4 Invalid addresses', () => { - const invalidIpv4 = [' 127.0.0.1', '127.0.0.1 ', '127.0.0.1 127.0.0.1', '127.0.0.256', '127.0.0.1//1', '127.0.0.1/0x1', '127.0.0.1/-1', '127.0.0.1/ab', '127.0.0.1/', '127.0.0.256/32', '127.0.0.1/33'] - invalidIpv4.map(ip=>{ + const invalidIpv4 = [ + ' 127.0.0.1', + '127.0.0.1 ', + '127.0.0.1 127.0.0.1', + '127.0.0.256', + '127.0.0.1//1', + '127.0.0.1/0x1', + '127.0.0.1/-1', + '127.0.0.1/ab', + '127.0.0.1/', + '127.0.0.256/32', + '127.0.0.1/33', + ] + invalidIpv4.map((ip) => { assert.equal(isValidIP(ip), false) }) }) it('Check list of IPV4 Valid addresses', () => { - const validIpv4 =['001.002.003.004', '127.0.0.1', '255.255.255.255','192.168.1.10'] - validIpv4.map(ip=>{ + const validIpv4 = ['001.002.003.004', '127.0.0.1', '255.255.255.255', '192.168.1.10'] + validIpv4.map((ip) => { assert.equal(isValidIP(ip), true) }) - }) it('Check list of IPV6 Invalid addresses', () => { - const invalidIpV6 =[ + const invalidIpV6 = [ "':10.0.0.1", - "-1", - "::1 ::1", - "1.2.3.4:1111:2222:3333:4444::5555", - "1.2.3.4:1111:2222:3333::5555", - "1.2.3.4:1111:2222::5555", - "1.2.3.4:1111::5555", - "1.2.3.4::", - "1.2.3.4::5555", - "11112222:3333:4444:5555:6666:1.2.3.4", - "11112222:3333:4444:5555:6666:7777:8888", - "::1//64", - "::1/0001", - "1111:", - "1111:1.2.3.4", - "1111:2222", - "1111:22223333:4444:5555:6666:1.2.3.4", - "1111:22223333:4444:5555:6666:7777:8888", - "1111:2222:", - "1111:2222:1.2.3.4", - "1111:2222:3333", - "1111:2222:33334444:5555:6666:1.2.3.4", - "1111:2222:33334444:5555:6666:7777:8888", - "1111:2222:3333:", - "1111:2222:3333:1.2.3.4", - "1111:2222:3333:4444", - "1111:2222:3333:44445555:6666:1.2.3.4", - "1111:2222:3333:44445555:6666:7777:8888", - "1111:2222:3333:4444:", - "1111:2222:3333:4444:1.2.3.4", - "1111:2222:3333:4444:5555", - "1111:2222:3333:4444:55556666:1.2.3.4", - "1111:2222:3333:4444:55556666:7777:8888", - "1111:2222:3333:4444:5555:", - "1111:2222:3333:4444:5555:1.2.3.4", - "1111:2222:3333:4444:5555:6666", - "1111:2222:3333:4444:5555:66661.2.3.4", - "1111:2222:3333:4444:5555:66667777:8888", - "1111:2222:3333:4444:5555:6666:", - "1111:2222:3333:4444:5555:6666:1.2.3.4.5", - "1111:2222:3333:4444:5555:6666:255.255.255255", - "1111:2222:3333:4444:5555:6666:255.255255.255", - "1111:2222:3333:4444:5555:6666:255255.255.255", - "1111:2222:3333:4444:5555:6666:256.256.256.256", - "1111:2222:3333:4444:5555:6666:7777", - "1111:2222:3333:4444:5555:6666:77778888", - "1111:2222:3333:4444:5555:6666:7777:", - "1111:2222:3333:4444:5555:6666:7777:1.2.3.4", - "1111:2222:3333:4444:5555:6666:7777:::", - "1111:2222:3333:4444:5555:6666::8888:", - "1111:2222:3333:4444:5555:6666:::", - "1111:2222:3333:4444:5555:6666:::8888", - "1111:2222:3333:4444:5555::7777:8888:", - "1111:2222:3333:4444:5555::7777::", - "1111:2222:3333:4444:5555::8888:", - "1111:2222:3333:4444:5555:::", - "1111:2222:3333:4444:5555:::1.2.3.4", - "1111:2222:3333:4444:5555:::7777:8888", - "1111:2222:3333:4444::5555:", - "1111:2222:3333:4444::6666:7777:8888:", - "1111:2222:3333:4444::6666:7777::", - "1111:2222:3333:4444::6666::8888", - "1111:2222:3333:4444::7777:8888:", - "1111:2222:3333:4444::8888:", - "1111:2222:3333:4444:::", - "1111:2222:3333:4444:::6666:1.2.3.4", - "1111:2222:3333:4444:::6666:7777:8888", - "1111:2222:3333::5555:", - "1111:2222:3333::5555:6666:7777:8888:", - "1111:2222:3333::5555:6666:7777::", - "1111:2222:3333::5555:6666::8888", - "1111:2222:3333::5555::1.2.3.4", - "1111:2222:3333::5555::7777:8888", - "1111:2222:3333::6666:7777:8888:", - "1111:2222:3333::7777:8888:", - "1111:2222:3333::8888:", - "1111:2222:3333:::", - "1111:2222:3333:::5555:6666:1.2.3.4", - "1111:2222:3333:::5555:6666:7777:8888", - "1111:2222::4444:5555:6666:7777:8888:", - "1111:2222::4444:5555:6666:7777::", - "1111:2222::4444:5555:6666::8888", - "1111:2222::4444:5555::1.2.3.4", - "1111:2222::4444:5555::7777:8888", - "1111:2222::4444::6666:1.2.3.4", - "1111:2222::4444::6666:7777:8888", - "1111:2222::5555:", - "1111:2222::5555:6666:7777:8888:", - "1111:2222::6666:7777:8888:", - "1111:2222::7777:8888:", - "1111:2222::8888:", - "1111:2222:::", - "1111:2222:::4444:5555:6666:1.2.3.4", - "1111:2222:::4444:5555:6666:7777:8888", - "1111::3333:4444:5555:6666:7777:8888:", - "1111::3333:4444:5555:6666:7777::", - "1111::3333:4444:5555:6666::8888", - "1111::3333:4444:5555::1.2.3.4", - "1111::3333:4444:5555::7777:8888", - "1111::3333:4444::6666:1.2.3.4", - "1111::3333:4444::6666:7777:8888", - "1111::3333::5555:6666:1.2.3.4", - "1111::3333::5555:6666:7777:8888", - "1111::4444:5555:6666:7777:8888:", - "1111::5555:", - "1111::5555:6666:7777:8888:", - "1111::6666:7777:8888:", - "1111::7777:8888:", - "1111::8888:", - "1111:::", - "1111:::3333:4444:5555:6666:1.2.3.4", - "1111:::3333:4444:5555:6666:7777:8888", - "12345::6:7:8", - "124.15.6.89/60", - "1:2:3:4:5:6:7:8:9", - "1:2:3::4:5:6:7:8:9", - "1:2:3::4:5::7:8", - "1::1.2.256.4", - "1::1.2.3.256", - "1::1.2.3.300", - "1::1.2.3.900", - "1::1.2.300.4", - "1::1.2.900.4", - "1::1.256.3.4", - "1::1.300.3.4", - "1::1.900.3.4", - "1::256.2.3.4", - "1::260.2.3.4", - "1::2::3", - "1::300.2.3.4", - "1::300.300.300.300", - "1::3000.30.30.30", - "1::400.2.3.4", - "1::5:1.2.256.4", - "1::5:1.2.3.256", - "1::5:1.2.3.300", - "1::5:1.2.3.900", - "1::5:1.2.300.4", - "1::5:1.2.900.4", - "1::5:1.256.3.4", - "1::5:1.300.3.4", - "1::5:1.900.3.4", - "1::5:256.2.3.4", - "1::5:260.2.3.4", - "1::5:300.2.3.4", - "1::5:300.300.300.300", - "1::5:3000.30.30.30", - "1::5:400.2.3.4", - "1::5:900.2.3.4", - "1::900.2.3.4", - "1:::3:4:5", - "2001:0000:1234: 0000:0000:C1C0:ABCD:0876", - "2001:0000:1234:0000:0000:C1C0:ABCD:0876 0", - "2001:1:1:1:1:1:255Z255X255Y255", - "2001::FFD3::57ab", - "2001:DB8:0:0:8:800:200C:417A:221", - "2001:db8:85a3::8a2e:37023:7334", - "2001:db8:85a3::8a2e:370k:7334", - "3ffe:0b00:0000:0001:0000:0000:000a", - "3ffe:b00::1::a", - ":", - ":1.2.3.4", - ":1111:2222:3333:4444:5555:6666:1.2.3.4", - ":1111:2222:3333:4444:5555:6666:7777:8888", - ":1111:2222:3333:4444:5555:6666:7777::", - ":1111:2222:3333:4444:5555:6666::", - ":1111:2222:3333:4444:5555:6666::8888", - ":1111:2222:3333:4444:5555::", - ":1111:2222:3333:4444:5555::1.2.3.4", - ":1111:2222:3333:4444:5555::7777:8888", - ":1111:2222:3333:4444:5555::8888", - ":1111:2222:3333:4444::", - ":1111:2222:3333:4444::1.2.3.4", - ":1111:2222:3333:4444::5555", - ":1111:2222:3333:4444::6666:1.2.3.4", - ":1111:2222:3333:4444::6666:7777:8888", - ":1111:2222:3333:4444::7777:8888", - ":1111:2222:3333:4444::8888", - ":1111:2222:3333::", - ":1111:2222:3333::1.2.3.4", - ":1111:2222:3333::5555", - ":1111:2222:3333::5555:6666:1.2.3.4", - ":1111:2222:3333::5555:6666:7777:8888", - ":1111:2222:3333::6666:1.2.3.4", - ":1111:2222:3333::6666:7777:8888", - ":1111:2222:3333::7777:8888", - ":1111:2222:3333::8888", - ":1111:2222::", - ":1111:2222::1.2.3.4", - ":1111:2222::4444:5555:6666:1.2.3.4", - ":1111:2222::4444:5555:6666:7777:8888", - ":1111:2222::5555", - ":1111:2222::5555:6666:1.2.3.4", - ":1111:2222::5555:6666:7777:8888", - ":1111:2222::6666:1.2.3.4", - ":1111:2222::6666:7777:8888", - ":1111:2222::7777:8888", - ":1111:2222::8888", - ":1111::", - ":1111::1.2.3.4", - ":1111::3333:4444:5555:6666:1.2.3.4", - ":1111::3333:4444:5555:6666:7777:8888", - ":1111::4444:5555:6666:1.2.3.4", - ":1111::4444:5555:6666:7777:8888", - ":1111::5555", - ":1111::5555:6666:1.2.3.4", - ":1111::5555:6666:7777:8888", - ":1111::6666:1.2.3.4", - ":1111::6666:7777:8888", - ":1111::7777:8888", - ":1111::8888", - ":2222:3333:4444:5555:6666:1.2.3.4", - ":2222:3333:4444:5555:6666:7777:8888", - ":3333:4444:5555:6666:1.2.3.4", - ":3333:4444:5555:6666:7777:8888", - ":4444:5555:6666:1.2.3.4", - ":4444:5555:6666:7777:8888", - ":5555:6666:1.2.3.4", - ":5555:6666:7777:8888", - ":6666:1.2.3.4", - ":6666:7777:8888", - ":7777:8888", - ":8888", - "::-1", - "::.", - "::..", - "::...", - "::...4", - "::..3.", - "::..3.4", - "::.2..", - "::.2.3.", - "::.2.3.4", - "::1...", - "::1.2..", - "::1.2.256.4", - "::1.2.3.", - "::1.2.3.256", - "::1.2.3.300", - "::1.2.3.900", - "::1.2.300.4", - "::1.2.900.4", - "::1.256.3.4", - "::1.300.3.4", - "::1.900.3.4", - "::1111:2222:3333:4444:5555:6666::", - "::2222:3333:4444:5555:6666:7777:8888:", - "::2222:3333:4444:5555:7777:8888::", - "::2222:3333:4444:5555:7777::8888", - "::2222:3333:4444:5555::1.2.3.4", - "::2222:3333:4444:5555::7777:8888", - "::2222:3333:4444::6666:1.2.3.4", - "::2222:3333:4444::6666:7777:8888", - "::2222:3333::5555:6666:1.2.3.4", - "::2222:3333::5555:6666:7777:8888", - "::2222::4444:5555:6666:1.2.3.4", - "::2222::4444:5555:6666:7777:8888", - "::256.2.3.4", - "::260.2.3.4", - "::300.2.3.4", - "::300.300.300.300", - "::3000.30.30.30", - "::3333:4444:5555:6666:7777:8888:", - "::400.2.3.4", - "::4444:5555:6666:7777:8888:", - "::5555:", - "::5555:6666:7777:8888:", - "::6666:7777:8888:", - "::7777:8888:", - "::8888:", - "::900.2.3.4", - ":::", - ":::1.2.3.4", - ":::2222:3333:4444:5555:6666:1.2.3.4", - ":::2222:3333:4444:5555:6666:7777:8888", - ":::3333:4444:5555:6666:7777:8888", - ":::4444:5555:6666:1.2.3.4", - ":::4444:5555:6666:7777:8888", - ":::5555", - ":::5555:6666:1.2.3.4", - ":::5555:6666:7777:8888", - ":::6666:1.2.3.4", - ":::6666:7777:8888", - ":::7777:8888", - ":::8888", - "::ffff:192x168.1.26", - "::ffff:2.3.4", - "::ffff:257.1.2.3", - "FF01::101::2", - "FF02:0000:0000:0000:0000:0000:0000:0000:0001", - "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4", - "XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX", - "a::b::c", - "a::g", - "a:a:a:a:a:a:a:a:a", - "a:aaaaa::", - "a:b", - "a:b:c:d:e:f:g:0", - "ffff:", - "ffff::ffff::ffff", - "ffgg:ffff:ffff:ffff:ffff:ffff:ffff:ffff", - "ldkfj", - "::/129", - "1000:://32", - "::/" + '-1', + '::1 ::1', + '1.2.3.4:1111:2222:3333:4444::5555', + '1.2.3.4:1111:2222:3333::5555', + '1.2.3.4:1111:2222::5555', + '1.2.3.4:1111::5555', + '1.2.3.4::', + '1.2.3.4::5555', + '11112222:3333:4444:5555:6666:1.2.3.4', + '11112222:3333:4444:5555:6666:7777:8888', + '::1//64', + '::1/0001', + '1111:', + '1111:1.2.3.4', + '1111:2222', + '1111:22223333:4444:5555:6666:1.2.3.4', + '1111:22223333:4444:5555:6666:7777:8888', + '1111:2222:', + '1111:2222:1.2.3.4', + '1111:2222:3333', + '1111:2222:33334444:5555:6666:1.2.3.4', + '1111:2222:33334444:5555:6666:7777:8888', + '1111:2222:3333:', + '1111:2222:3333:1.2.3.4', + '1111:2222:3333:4444', + '1111:2222:3333:44445555:6666:1.2.3.4', + '1111:2222:3333:44445555:6666:7777:8888', + '1111:2222:3333:4444:', + '1111:2222:3333:4444:1.2.3.4', + '1111:2222:3333:4444:5555', + '1111:2222:3333:4444:55556666:1.2.3.4', + '1111:2222:3333:4444:55556666:7777:8888', + '1111:2222:3333:4444:5555:', + '1111:2222:3333:4444:5555:1.2.3.4', + '1111:2222:3333:4444:5555:6666', + '1111:2222:3333:4444:5555:66661.2.3.4', + '1111:2222:3333:4444:5555:66667777:8888', + '1111:2222:3333:4444:5555:6666:', + '1111:2222:3333:4444:5555:6666:1.2.3.4.5', + '1111:2222:3333:4444:5555:6666:255.255.255255', + '1111:2222:3333:4444:5555:6666:255.255255.255', + '1111:2222:3333:4444:5555:6666:255255.255.255', + '1111:2222:3333:4444:5555:6666:256.256.256.256', + '1111:2222:3333:4444:5555:6666:7777', + '1111:2222:3333:4444:5555:6666:77778888', + '1111:2222:3333:4444:5555:6666:7777:', + '1111:2222:3333:4444:5555:6666:7777:1.2.3.4', + '1111:2222:3333:4444:5555:6666:7777:::', + '1111:2222:3333:4444:5555:6666::8888:', + '1111:2222:3333:4444:5555:6666:::', + '1111:2222:3333:4444:5555:6666:::8888', + '1111:2222:3333:4444:5555::7777:8888:', + '1111:2222:3333:4444:5555::7777::', + '1111:2222:3333:4444:5555::8888:', + '1111:2222:3333:4444:5555:::', + '1111:2222:3333:4444:5555:::1.2.3.4', + '1111:2222:3333:4444:5555:::7777:8888', + '1111:2222:3333:4444::5555:', + '1111:2222:3333:4444::6666:7777:8888:', + '1111:2222:3333:4444::6666:7777::', + '1111:2222:3333:4444::6666::8888', + '1111:2222:3333:4444::7777:8888:', + '1111:2222:3333:4444::8888:', + '1111:2222:3333:4444:::', + '1111:2222:3333:4444:::6666:1.2.3.4', + '1111:2222:3333:4444:::6666:7777:8888', + '1111:2222:3333::5555:', + '1111:2222:3333::5555:6666:7777:8888:', + '1111:2222:3333::5555:6666:7777::', + '1111:2222:3333::5555:6666::8888', + '1111:2222:3333::5555::1.2.3.4', + '1111:2222:3333::5555::7777:8888', + '1111:2222:3333::6666:7777:8888:', + '1111:2222:3333::7777:8888:', + '1111:2222:3333::8888:', + '1111:2222:3333:::', + '1111:2222:3333:::5555:6666:1.2.3.4', + '1111:2222:3333:::5555:6666:7777:8888', + '1111:2222::4444:5555:6666:7777:8888:', + '1111:2222::4444:5555:6666:7777::', + '1111:2222::4444:5555:6666::8888', + '1111:2222::4444:5555::1.2.3.4', + '1111:2222::4444:5555::7777:8888', + '1111:2222::4444::6666:1.2.3.4', + '1111:2222::4444::6666:7777:8888', + '1111:2222::5555:', + '1111:2222::5555:6666:7777:8888:', + '1111:2222::6666:7777:8888:', + '1111:2222::7777:8888:', + '1111:2222::8888:', + '1111:2222:::', + '1111:2222:::4444:5555:6666:1.2.3.4', + '1111:2222:::4444:5555:6666:7777:8888', + '1111::3333:4444:5555:6666:7777:8888:', + '1111::3333:4444:5555:6666:7777::', + '1111::3333:4444:5555:6666::8888', + '1111::3333:4444:5555::1.2.3.4', + '1111::3333:4444:5555::7777:8888', + '1111::3333:4444::6666:1.2.3.4', + '1111::3333:4444::6666:7777:8888', + '1111::3333::5555:6666:1.2.3.4', + '1111::3333::5555:6666:7777:8888', + '1111::4444:5555:6666:7777:8888:', + '1111::5555:', + '1111::5555:6666:7777:8888:', + '1111::6666:7777:8888:', + '1111::7777:8888:', + '1111::8888:', + '1111:::', + '1111:::3333:4444:5555:6666:1.2.3.4', + '1111:::3333:4444:5555:6666:7777:8888', + '12345::6:7:8', + '124.15.6.89/60', + '1:2:3:4:5:6:7:8:9', + '1:2:3::4:5:6:7:8:9', + '1:2:3::4:5::7:8', + '1::1.2.256.4', + '1::1.2.3.256', + '1::1.2.3.300', + '1::1.2.3.900', + '1::1.2.300.4', + '1::1.2.900.4', + '1::1.256.3.4', + '1::1.300.3.4', + '1::1.900.3.4', + '1::256.2.3.4', + '1::260.2.3.4', + '1::2::3', + '1::300.2.3.4', + '1::300.300.300.300', + '1::3000.30.30.30', + '1::400.2.3.4', + '1::5:1.2.256.4', + '1::5:1.2.3.256', + '1::5:1.2.3.300', + '1::5:1.2.3.900', + '1::5:1.2.300.4', + '1::5:1.2.900.4', + '1::5:1.256.3.4', + '1::5:1.300.3.4', + '1::5:1.900.3.4', + '1::5:256.2.3.4', + '1::5:260.2.3.4', + '1::5:300.2.3.4', + '1::5:300.300.300.300', + '1::5:3000.30.30.30', + '1::5:400.2.3.4', + '1::5:900.2.3.4', + '1::900.2.3.4', + '1:::3:4:5', + '2001:0000:1234: 0000:0000:C1C0:ABCD:0876', + '2001:0000:1234:0000:0000:C1C0:ABCD:0876 0', + '2001:1:1:1:1:1:255Z255X255Y255', + '2001::FFD3::57ab', + '2001:DB8:0:0:8:800:200C:417A:221', + '2001:db8:85a3::8a2e:37023:7334', + '2001:db8:85a3::8a2e:370k:7334', + '3ffe:0b00:0000:0001:0000:0000:000a', + '3ffe:b00::1::a', + ':', + ':1.2.3.4', + ':1111:2222:3333:4444:5555:6666:1.2.3.4', + ':1111:2222:3333:4444:5555:6666:7777:8888', + ':1111:2222:3333:4444:5555:6666:7777::', + ':1111:2222:3333:4444:5555:6666::', + ':1111:2222:3333:4444:5555:6666::8888', + ':1111:2222:3333:4444:5555::', + ':1111:2222:3333:4444:5555::1.2.3.4', + ':1111:2222:3333:4444:5555::7777:8888', + ':1111:2222:3333:4444:5555::8888', + ':1111:2222:3333:4444::', + ':1111:2222:3333:4444::1.2.3.4', + ':1111:2222:3333:4444::5555', + ':1111:2222:3333:4444::6666:1.2.3.4', + ':1111:2222:3333:4444::6666:7777:8888', + ':1111:2222:3333:4444::7777:8888', + ':1111:2222:3333:4444::8888', + ':1111:2222:3333::', + ':1111:2222:3333::1.2.3.4', + ':1111:2222:3333::5555', + ':1111:2222:3333::5555:6666:1.2.3.4', + ':1111:2222:3333::5555:6666:7777:8888', + ':1111:2222:3333::6666:1.2.3.4', + ':1111:2222:3333::6666:7777:8888', + ':1111:2222:3333::7777:8888', + ':1111:2222:3333::8888', + ':1111:2222::', + ':1111:2222::1.2.3.4', + ':1111:2222::4444:5555:6666:1.2.3.4', + ':1111:2222::4444:5555:6666:7777:8888', + ':1111:2222::5555', + ':1111:2222::5555:6666:1.2.3.4', + ':1111:2222::5555:6666:7777:8888', + ':1111:2222::6666:1.2.3.4', + ':1111:2222::6666:7777:8888', + ':1111:2222::7777:8888', + ':1111:2222::8888', + ':1111::', + ':1111::1.2.3.4', + ':1111::3333:4444:5555:6666:1.2.3.4', + ':1111::3333:4444:5555:6666:7777:8888', + ':1111::4444:5555:6666:1.2.3.4', + ':1111::4444:5555:6666:7777:8888', + ':1111::5555', + ':1111::5555:6666:1.2.3.4', + ':1111::5555:6666:7777:8888', + ':1111::6666:1.2.3.4', + ':1111::6666:7777:8888', + ':1111::7777:8888', + ':1111::8888', + ':2222:3333:4444:5555:6666:1.2.3.4', + ':2222:3333:4444:5555:6666:7777:8888', + ':3333:4444:5555:6666:1.2.3.4', + ':3333:4444:5555:6666:7777:8888', + ':4444:5555:6666:1.2.3.4', + ':4444:5555:6666:7777:8888', + ':5555:6666:1.2.3.4', + ':5555:6666:7777:8888', + ':6666:1.2.3.4', + ':6666:7777:8888', + ':7777:8888', + ':8888', + '::-1', + '::.', + '::..', + '::...', + '::...4', + '::..3.', + '::..3.4', + '::.2..', + '::.2.3.', + '::.2.3.4', + '::1...', + '::1.2..', + '::1.2.256.4', + '::1.2.3.', + '::1.2.3.256', + '::1.2.3.300', + '::1.2.3.900', + '::1.2.300.4', + '::1.2.900.4', + '::1.256.3.4', + '::1.300.3.4', + '::1.900.3.4', + '::1111:2222:3333:4444:5555:6666::', + '::2222:3333:4444:5555:6666:7777:8888:', + '::2222:3333:4444:5555:7777:8888::', + '::2222:3333:4444:5555:7777::8888', + '::2222:3333:4444:5555::1.2.3.4', + '::2222:3333:4444:5555::7777:8888', + '::2222:3333:4444::6666:1.2.3.4', + '::2222:3333:4444::6666:7777:8888', + '::2222:3333::5555:6666:1.2.3.4', + '::2222:3333::5555:6666:7777:8888', + '::2222::4444:5555:6666:1.2.3.4', + '::2222::4444:5555:6666:7777:8888', + '::256.2.3.4', + '::260.2.3.4', + '::300.2.3.4', + '::300.300.300.300', + '::3000.30.30.30', + '::3333:4444:5555:6666:7777:8888:', + '::400.2.3.4', + '::4444:5555:6666:7777:8888:', + '::5555:', + '::5555:6666:7777:8888:', + '::6666:7777:8888:', + '::7777:8888:', + '::8888:', + '::900.2.3.4', + ':::', + ':::1.2.3.4', + ':::2222:3333:4444:5555:6666:1.2.3.4', + ':::2222:3333:4444:5555:6666:7777:8888', + ':::3333:4444:5555:6666:7777:8888', + ':::4444:5555:6666:1.2.3.4', + ':::4444:5555:6666:7777:8888', + ':::5555', + ':::5555:6666:1.2.3.4', + ':::5555:6666:7777:8888', + ':::6666:1.2.3.4', + ':::6666:7777:8888', + ':::7777:8888', + ':::8888', + '::ffff:192x168.1.26', + '::ffff:2.3.4', + '::ffff:257.1.2.3', + 'FF01::101::2', + 'FF02:0000:0000:0000:0000:0000:0000:0000:0001', + 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:1.2.3.4', + 'XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX', + 'a::b::c', + 'a::g', + 'a:a:a:a:a:a:a:a:a', + 'a:aaaaa::', + 'a:b', + 'a:b:c:d:e:f:g:0', + 'ffff:', + 'ffff::ffff::ffff', + 'ffgg:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + 'ldkfj', + '::/129', + '1000:://32', + '::/', ] - invalidIpV6.map(ip=>{ - const valid= isValidIP(ip) + invalidIpV6.map((ip) => { + const valid = isValidIP(ip) assert.equal(valid, false) }) }) it('Check list of IPV6 Valid addresses', () => { - const validIpv6 =[ - "0000:0000:0000:0000:0000:0000:0000:0000", - "0000:0000:0000:0000:0000:0000:0000:0001", - "0:0:0:0:0:0:0:0", - "0:0:0:0:0:0:0:1", - "0:0:0:0:0:0:0::", - "0:0:0:0:0:0:13.1.68.3", - "0:0:0:0:0:0::", - "0:0:0:0:0::", - "0:0:0:0:0:FFFF:129.144.52.38", - "0:0:0:0:1:0:0:0", - "0:0:0:0::", - "0:0:0::", - "0:0::", - "0:1:2:3:4:5:6:7", - "0::", - "0:a:b:c:d:e:f::", - "1080:0:0:0:8:800:200c:417a", - "1080::8:800:200c:417a", - "1111:2222:3333:4444:5555:6666:123.123.123.123", - "1111:2222:3333:4444:5555:6666:7777:8888", - "1111:2222:3333:4444:5555:6666:7777::", - "1111:2222:3333:4444:5555:6666::", - "1111:2222:3333:4444:5555:6666::8888", - "1111:2222:3333:4444:5555::", - "1111:2222:3333:4444:5555::7777:8888", - "1111:2222:3333:4444:5555::8888", - "1111:2222:3333:4444::", - "1111:2222:3333:4444::6666:123.123.123.123", - "1111:2222:3333:4444::6666:7777:8888", - "1111:2222:3333:4444::7777:8888", - "1111:2222:3333:4444::8888", - "1111:2222:3333::", - "1111:2222:3333::5555:6666:123.123.123.123", - "1111:2222:3333::5555:6666:7777:8888", - "1111:2222:3333::6666:123.123.123.123", - "1111:2222:3333::6666:7777:8888", - "1111:2222:3333::7777:8888", - "1111:2222:3333::8888", - "1111:2222::", - "1111:2222::4444:5555:6666:123.123.123.123", - "1111:2222::4444:5555:6666:7777:8888", - "1111:2222::5555:6666:123.123.123.123", - "1111:2222::5555:6666:7777:8888", - "1111:2222::6666:123.123.123.123", - "1111:2222::6666:7777:8888", - "1111:2222::7777:8888", - "1111:2222::8888", - "1111::", - "1111::3333:4444:5555:6666:123.123.123.123", - "1111::3333:4444:5555:6666:7777:8888", - "1111::4444:5555:6666:123.123.123.123", - "1111::4444:5555:6666:7777:8888", - "1111::5555:6666:123.123.123.123", - "1111::5555:6666:7777:8888", - "1111::6666:123.123.123.123", - "1111::6666:7777:8888", - "1111::7777:8888", - "1111::8888", - "1:2:3:4:5:6:1.2.3.4", - "1:2:3:4:5:6:7:8", - "1:2:3:4:5:6::", - "1:2:3:4:5:6::8", - "1:2:3:4:5::", - "1:2:3:4:5::7:8", - "1:2:3:4:5::8", - "1:2:3:4::", - "1:2:3:4::5:1.2.3.4", - "1:2:3:4::7:8", - "1:2:3:4::8", - "1:2:3::", - "1:2:3::5:1.2.3.4", - "1:2:3::7:8", - "1:2:3::8", - "1:2::", - "1:2::5:1.2.3.4", - "1:2::7:8", - "1:2::8", - "1::", - "1::2:3", - "1::2:3:4", - "1::2:3:4:5", - "1::2:3:4:5:6", - "1::2:3:4:5:6:7", - "1::5:1.2.3.4", - "1::5:11.22.33.44", - "1::7:8", - "1::8", - "2001:0000:1234:0000:0000:C1C0:ABCD:0876", - "2001:0000:4136:e378:8000:63bf:3fff:fdd2", - "2001:0db8:0000:0000:0000:0000:1428:57ab", - "2001:0db8:0000:0000:0000::1428:57ab", - "2001:0db8:0:0:0:0:1428:57ab", - "2001:0db8:0:0::1428:57ab", - "2001:0db8:1234:0000:0000:0000:0000:0000", - "2001:0db8:1234::", - "2001:0db8:1234:ffff:ffff:ffff:ffff:ffff", - "2001:0db8:85a3:0000:0000:8a2e:0370:7334", - "2001:0db8::1428:57ab", - "2001::CE49:7601:2CAD:DFFF:7C94:FFFE", - "2001::CE49:7601:E866:EFFF:62C3:FFFE", - "2001:DB8:0:0:8:800:200C:417A", - "2001:DB8::8:800:200C:417A", - "2001:db8:85a3:0:0:8a2e:370:7334", - "2001:db8:85a3::8a2e:370:7334", - "2001:db8::", - "2001:db8::1428:57ab", - "2001:db8:a::123", - "2002::", - "2608::3:5", - "2608:af09:30:0:0:0:0:134", - "2608:af09:30::102a:7b91:c239:baff", - "2::10", - "3ffe:0b00:0000:0000:0001:0000:0000:000a", - "7:6:5:4:3:2:1:0", - "::", - "::0", - "::0:0", - "::0:0:0", - "::0:0:0:0", - "::0:0:0:0:0", - "::0:0:0:0:0:0", - "::0:0:0:0:0:0:0", - "::0:a:b:c:d:e:f", - "::1", - "::123.123.123.123", - "::13.1.68.3", - "::2222:3333:4444:5555:6666:123.123.123.123", - "::2222:3333:4444:5555:6666:7777:8888", - "::2:3", - "::2:3:4", - "::2:3:4:5", - "::2:3:4:5:6", - "::2:3:4:5:6:7", - "::2:3:4:5:6:7:8", - "::3333:4444:5555:6666:7777:8888", - "::4444:5555:6666:123.123.123.123", - "::4444:5555:6666:7777:8888", - "::5555:6666:123.123.123.123", - "::5555:6666:7777:8888", - "::6666:123.123.123.123", - "::6666:7777:8888", - "::7777:8888", - "::8", - "::8888", - "::FFFF:129.144.52.38", - "::ffff:0:0", - "::ffff:0c22:384e", - "::ffff:12.34.56.78", - "::ffff:192.0.2.128", - "::ffff:192.168.1.1", - "::ffff:192.168.1.26", - "::ffff:c000:280", - "FF01:0:0:0:0:0:0:101", - "FF01::101", - "FF02:0000:0000:0000:0000:0000:0000:0001", - "a:b:c:d:e:f:0::", - "fe80:0000:0000:0000:0204:61ff:fe9d:f156", - "fe80:0:0:0:204:61ff:254.157.241.86", - "fe80:0:0:0:204:61ff:fe9d:f156", - "fe80::", - "fe80::1", - "fe80::204:61ff:254.157.241.86", - "fe80::204:61ff:fe9d:f156", - "fe80::217:f2ff:254.7.237.98", - "fe80::217:f2ff:fe07:ed62", - "fedc:ba98:7654:3210:fedc:ba98:7654:3210", - "ff02::1", - "ffff::", - "ffff::3:5", - "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", - "a:0::0:b", - "a:0:0::0:b", - "a:0::0:0:b", - "a::0:0:b", - "a::0:b", - "a:0::b", - "a:0:0::b" + const validIpv6 = [ + '0000:0000:0000:0000:0000:0000:0000:0000', + '0000:0000:0000:0000:0000:0000:0000:0001', + '0:0:0:0:0:0:0:0', + '0:0:0:0:0:0:0:1', + '0:0:0:0:0:0:0::', + '0:0:0:0:0:0:13.1.68.3', + '0:0:0:0:0:0::', + '0:0:0:0:0::', + '0:0:0:0:0:FFFF:129.144.52.38', + '0:0:0:0:1:0:0:0', + '0:0:0:0::', + '0:0:0::', + '0:0::', + '0:1:2:3:4:5:6:7', + '0::', + '0:a:b:c:d:e:f::', + '1080:0:0:0:8:800:200c:417a', + '1080::8:800:200c:417a', + '1111:2222:3333:4444:5555:6666:123.123.123.123', + '1111:2222:3333:4444:5555:6666:7777:8888', + '1111:2222:3333:4444:5555:6666:7777::', + '1111:2222:3333:4444:5555:6666::', + '1111:2222:3333:4444:5555:6666::8888', + '1111:2222:3333:4444:5555::', + '1111:2222:3333:4444:5555::7777:8888', + '1111:2222:3333:4444:5555::8888', + '1111:2222:3333:4444::', + '1111:2222:3333:4444::6666:123.123.123.123', + '1111:2222:3333:4444::6666:7777:8888', + '1111:2222:3333:4444::7777:8888', + '1111:2222:3333:4444::8888', + '1111:2222:3333::', + '1111:2222:3333::5555:6666:123.123.123.123', + '1111:2222:3333::5555:6666:7777:8888', + '1111:2222:3333::6666:123.123.123.123', + '1111:2222:3333::6666:7777:8888', + '1111:2222:3333::7777:8888', + '1111:2222:3333::8888', + '1111:2222::', + '1111:2222::4444:5555:6666:123.123.123.123', + '1111:2222::4444:5555:6666:7777:8888', + '1111:2222::5555:6666:123.123.123.123', + '1111:2222::5555:6666:7777:8888', + '1111:2222::6666:123.123.123.123', + '1111:2222::6666:7777:8888', + '1111:2222::7777:8888', + '1111:2222::8888', + '1111::', + '1111::3333:4444:5555:6666:123.123.123.123', + '1111::3333:4444:5555:6666:7777:8888', + '1111::4444:5555:6666:123.123.123.123', + '1111::4444:5555:6666:7777:8888', + '1111::5555:6666:123.123.123.123', + '1111::5555:6666:7777:8888', + '1111::6666:123.123.123.123', + '1111::6666:7777:8888', + '1111::7777:8888', + '1111::8888', + '1:2:3:4:5:6:1.2.3.4', + '1:2:3:4:5:6:7:8', + '1:2:3:4:5:6::', + '1:2:3:4:5:6::8', + '1:2:3:4:5::', + '1:2:3:4:5::7:8', + '1:2:3:4:5::8', + '1:2:3:4::', + '1:2:3:4::5:1.2.3.4', + '1:2:3:4::7:8', + '1:2:3:4::8', + '1:2:3::', + '1:2:3::5:1.2.3.4', + '1:2:3::7:8', + '1:2:3::8', + '1:2::', + '1:2::5:1.2.3.4', + '1:2::7:8', + '1:2::8', + '1::', + '1::2:3', + '1::2:3:4', + '1::2:3:4:5', + '1::2:3:4:5:6', + '1::2:3:4:5:6:7', + '1::5:1.2.3.4', + '1::5:11.22.33.44', + '1::7:8', + '1::8', + '2001:0000:1234:0000:0000:C1C0:ABCD:0876', + '2001:0000:4136:e378:8000:63bf:3fff:fdd2', + '2001:0db8:0000:0000:0000:0000:1428:57ab', + '2001:0db8:0000:0000:0000::1428:57ab', + '2001:0db8:0:0:0:0:1428:57ab', + '2001:0db8:0:0::1428:57ab', + '2001:0db8:1234:0000:0000:0000:0000:0000', + '2001:0db8:1234::', + '2001:0db8:1234:ffff:ffff:ffff:ffff:ffff', + '2001:0db8:85a3:0000:0000:8a2e:0370:7334', + '2001:0db8::1428:57ab', + '2001::CE49:7601:2CAD:DFFF:7C94:FFFE', + '2001::CE49:7601:E866:EFFF:62C3:FFFE', + '2001:DB8:0:0:8:800:200C:417A', + '2001:DB8::8:800:200C:417A', + '2001:db8:85a3:0:0:8a2e:370:7334', + '2001:db8:85a3::8a2e:370:7334', + '2001:db8::', + '2001:db8::1428:57ab', + '2001:db8:a::123', + '2002::', + '2608::3:5', + '2608:af09:30:0:0:0:0:134', + '2608:af09:30::102a:7b91:c239:baff', + '2::10', + '3ffe:0b00:0000:0000:0001:0000:0000:000a', + '7:6:5:4:3:2:1:0', + '::', + '::0', + '::0:0', + '::0:0:0', + '::0:0:0:0', + '::0:0:0:0:0', + '::0:0:0:0:0:0', + '::0:0:0:0:0:0:0', + '::0:a:b:c:d:e:f', + '::1', + '::123.123.123.123', + '::13.1.68.3', + '::2222:3333:4444:5555:6666:123.123.123.123', + '::2222:3333:4444:5555:6666:7777:8888', + '::2:3', + '::2:3:4', + '::2:3:4:5', + '::2:3:4:5:6', + '::2:3:4:5:6:7', + '::2:3:4:5:6:7:8', + '::3333:4444:5555:6666:7777:8888', + '::4444:5555:6666:123.123.123.123', + '::4444:5555:6666:7777:8888', + '::5555:6666:123.123.123.123', + '::5555:6666:7777:8888', + '::6666:123.123.123.123', + '::6666:7777:8888', + '::7777:8888', + '::8', + '::8888', + '::FFFF:129.144.52.38', + '::ffff:0:0', + '::ffff:0c22:384e', + '::ffff:12.34.56.78', + '::ffff:192.0.2.128', + '::ffff:192.168.1.1', + '::ffff:192.168.1.26', + '::ffff:c000:280', + 'FF01:0:0:0:0:0:0:101', + 'FF01::101', + 'FF02:0000:0000:0000:0000:0000:0000:0001', + 'a:b:c:d:e:f:0::', + 'fe80:0000:0000:0000:0204:61ff:fe9d:f156', + 'fe80:0:0:0:204:61ff:254.157.241.86', + 'fe80:0:0:0:204:61ff:fe9d:f156', + 'fe80::', + 'fe80::1', + 'fe80::204:61ff:254.157.241.86', + 'fe80::204:61ff:fe9d:f156', + 'fe80::217:f2ff:254.7.237.98', + 'fe80::217:f2ff:fe07:ed62', + 'fedc:ba98:7654:3210:fedc:ba98:7654:3210', + 'ff02::1', + 'ffff::', + 'ffff::3:5', + 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff', + 'a:0::0:b', + 'a:0:0::0:b', + 'a:0::0:0:b', + 'a::0:0:b', + 'a::0:b', + 'a:0::b', + 'a:0:0::b', ] - validIpv6.map(ip=>{ - const valid= isValidIP(ip) + validIpv6.map((ip) => { + const valid = isValidIP(ip) assert.equal(valid, true) - }) }) }) From c060a44ee457a05183767e187a4056ace685751c Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 03:45:22 +0800 Subject: [PATCH 11/23] wrong ignore file --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1676463b..a8b71b01 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,5 @@ logs # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git node_modules -/examples/ /dist/ yarn.lock From 5b91c390efc10f3db5e34dc3e984d38eadf1894d Mon Sep 17 00:00:00 2001 From: Trim21 Date: Mon, 10 Apr 2023 23:33:50 +0800 Subject: [PATCH 12/23] add curly --- .eslintrc.js | 1 + package.json | 3 +- src/main/extensions.js | 20 +- src/main/helpers.js | 62 +- src/main/minio.js | 315 +++++++--- src/main/notification.js | 32 +- src/main/object-uploader.js | 36 +- src/main/signing.js | 4 +- src/main/xml-parsers.js | 47 +- src/test/functional/functional-tests.js | 799 ++++++++++++++++++------ 10 files changed, 987 insertions(+), 332 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index e10e14e3..505edb7f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -21,6 +21,7 @@ module.exports = { 'no-console': ['error'], // "no-var": ["error"], 'comma-dangle': 0, + curly: ['error'], 'prefer-const': 0, // "quotes": ["error", "double"], 'comma-spacing': 0, // ["error", { before: false, after: true }], diff --git a/package.json b/package.json index e9fd70f5..e612bc74 100644 --- a/package.json +++ b/package.json @@ -27,7 +27,8 @@ "prettier --write" ], "src/**/*.{js,cjs,mjs,ts,cts,mts}": [ - "eslint --fix" + "eslint --fix", + "prettier --write" ] }, "repository": { diff --git a/src/main/extensions.js b/src/main/extensions.js index 13d1c264..8ba596fa 100644 --- a/src/main/extensions.js +++ b/src/main/extensions.js @@ -43,9 +43,15 @@ export default class extensions { // * `obj.metadata` _object_: metadata of the object listObjectsV2WithMetadata(bucketName, prefix, recursive, startAfter) { - if (prefix === undefined) prefix = '' - if (recursive === undefined) recursive = false - if (startAfter === undefined) startAfter = '' + if (prefix === undefined) { + prefix = '' + } + if (recursive === undefined) { + recursive = false + } + if (startAfter === undefined) { + startAfter = '' + } if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -73,7 +79,9 @@ export default class extensions { readStream.push(objects.shift()) return } - if (ended) return readStream.push(null) + if (ended) { + return readStream.push(null) + } // if there are no objects to push do query for the next batch of objects this.listObjectsV2WithMetadataQuery(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) .on('error', (e) => readStream.emit('error', e)) @@ -154,7 +162,9 @@ export default class extensions { var method = 'GET' var transformer = transformers.getListObjectsV2WithMetadataTransformer() this.client.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return transformer.emit('error', e) + if (e) { + return transformer.emit('error', e) + } pipesetup(response, transformer) }) return transformer diff --git a/src/main/helpers.js b/src/main/helpers.js index e0df4b86..e13366d1 100644 --- a/src/main/helpers.js +++ b/src/main/helpers.js @@ -38,7 +38,9 @@ export function promisify(fn) { let callback = arguments[arguments.length - 1] // If the callback is given, don't promisify, just pass straight in. - if (typeof callback === 'function') return fn.apply(this, arguments) + if (typeof callback === 'function') { + return fn.apply(this, arguments) + } // Otherwise, create a new set of arguments, and wrap // it in a promise. @@ -47,7 +49,9 @@ export function promisify(fn) { return new Promise((resolve, reject) => { // Add the callback function. args.push((err, value) => { - if (err) return reject(err) + if (err) { + return reject(err) + } resolve(value) }) @@ -126,7 +130,9 @@ export function isValidEndpoint(endpoint) { // isValidDomain - true if input host is a valid domain. export function isValidDomain(host) { - if (!isString(host)) return false + if (!isString(host)) { + return false + } // See RFC 1035, RFC 3696. if (host.length === 0 || host.length > 255) { return false @@ -168,11 +174,17 @@ export function probeContentType(path) { // isValidPort - is input port valid. export function isValidPort(port) { // verify if port is a number. - if (!isNumber(port)) return false + if (!isNumber(port)) { + return false + } // port cannot be negative. - if (port < 0) return false + if (port < 0) { + return false + } // port '0' is valid and special case return true. - if (port === 0) return true + if (port === 0) { + return true + } var min_port = 1 var max_port = 65535 // Verify if port is in range. @@ -180,7 +192,9 @@ export function isValidPort(port) { } export function isValidBucketName(bucket) { - if (!isString(bucket)) return false + if (!isString(bucket)) { + return false + } // bucket length should be less than and no more than 63 // characters long. @@ -205,15 +219,23 @@ export function isValidBucketName(bucket) { // check if objectName is a valid object name export function isValidObjectName(objectName) { - if (!isValidPrefix(objectName)) return false - if (objectName.length === 0) return false + if (!isValidPrefix(objectName)) { + return false + } + if (objectName.length === 0) { + return false + } return true } // check if prefix is valid export function isValidPrefix(prefix) { - if (!isString(prefix)) return false - if (prefix.length > 1024) return false + if (!isString(prefix)) { + return false + } + if (prefix.length > 1024) { + return false + } return true } @@ -721,19 +743,27 @@ export function calculateEvenSplits(size, objInfo) { } export function removeDirAndFiles(dirPath, removeSelf) { - if (removeSelf === undefined) removeSelf = true + if (removeSelf === undefined) { + removeSelf = true + } try { var files = fs.readdirSync(dirPath) } catch (e) { return } - if (files.length > 0) + if (files.length > 0) { for (var i = 0; i < files.length; i++) { var filePath = path.join(dirPath, files[i]) - if (fs.statSync(filePath).isFile()) fs.unlinkSync(filePath) - else removeDirAndFiles(filePath) + if (fs.statSync(filePath).isFile()) { + fs.unlinkSync(filePath) + } else { + removeDirAndFiles(filePath) + } } - if (removeSelf) fs.rmdirSync(dirPath) + } + if (removeSelf) { + fs.rmdirSync(dirPath) + } } export const parseXml = (xml) => { diff --git a/src/main/minio.js b/src/main/minio.js index c4e2cdf1..a259bbab 100644 --- a/src/main/minio.js +++ b/src/main/minio.js @@ -83,11 +83,16 @@ var Package = require('../../package.json') export class Client { constructor(params) { - if (typeof params.secure !== 'undefined') + if (typeof params.secure !== 'undefined') { throw new Error('"secure" option deprecated, "useSSL" should be used instead') + } // Default values if not specified. - if (typeof params.useSSL === 'undefined') params.useSSL = true - if (!params.port) params.port = 0 + if (typeof params.useSSL === 'undefined') { + params.useSSL = true + } + if (!params.port) { + params.port = 0 + } // Validate input params. if (!isValidEndpoint(params.endPoint)) { throw new errors.InvalidEndpointError(`Invalid endPoint : ${params.endPoint}`) @@ -164,8 +169,12 @@ export class Client { this.pathStyle = params.pathStyle } - if (!this.accessKey) this.accessKey = '' - if (!this.secretKey) this.secretKey = '' + if (!this.accessKey) { + this.accessKey = '' + } + if (!this.secretKey) { + this.secretKey = '' + } this.anonymous = !this.accessKey || !this.secretKey if (params.credentialsProvider) { @@ -270,7 +279,9 @@ export class Client { virtualHostStyle = isVirtualHostStyle(this.host, this.protocol, bucketName, this.pathStyle) } - if (this.port) reqOptions.port = this.port + if (this.port) { + reqOptions.port = this.port + } reqOptions.protocol = this.protocol if (objectName) { @@ -297,17 +308,27 @@ export class Client { // // var host = 'bucketName.example.com' // - if (bucketName) reqOptions.host = `${bucketName}.${reqOptions.host}` - if (objectName) reqOptions.path = `/${objectName}` + if (bucketName) { + reqOptions.host = `${bucketName}.${reqOptions.host}` + } + if (objectName) { + reqOptions.path = `/${objectName}` + } } else { // For all S3 compatible storage services we will fallback to // path style requests, where `bucketName` is part of the URI // path. - if (bucketName) reqOptions.path = `/${bucketName}` - if (objectName) reqOptions.path = `/${bucketName}/${objectName}` + if (bucketName) { + reqOptions.path = `/${bucketName}` + } + if (objectName) { + reqOptions.path = `/${bucketName}/${objectName}` + } } - if (query) reqOptions.path += `?${query}` + if (query) { + reqOptions.path += `?${query}` + } reqOptions.headers.host = reqOptions.host if ( (reqOptions.protocol === 'http:' && reqOptions.port !== 80) || @@ -378,7 +399,9 @@ export class Client { // log the request, response, error logHTTP(reqOptions, response, err) { // if no logstreamer available return. - if (!this.logStream) return + if (!this.logStream) { + return + } if (!isObject(reqOptions)) { throw new TypeError('reqOptions should be of type "object"') } @@ -413,7 +436,9 @@ export class Client { // Enable tracing traceOn(stream) { - if (!stream) stream = process.stdout + if (!stream) { + stream = process.stdout + } this.logStream = stream } @@ -450,12 +475,16 @@ export class Client { if (!isFunction(cb)) { throw new TypeError('callback should be of type "function"') } - if (!options.headers) options.headers = {} + if (!options.headers) { + options.headers = {} + } if (options.method === 'POST' || options.method === 'PUT' || options.method === 'DELETE') { options.headers['content-length'] = payload.length } var sha256sum = '' - if (this.enableSHA256) sha256sum = toSha256(payload) + if (this.enableSHA256) { + sha256sum = toSha256(payload) + } var stream = readableStream(payload) this.makeRequestStream(options, stream, sha256sum, statusCodes, region, returnResponse, cb) } @@ -497,12 +526,16 @@ export class Client { } var _makeRequest = (e, region) => { - if (e) return cb(e) + if (e) { + return cb(e) + } options.region = region var reqOptions = this.getRequestOptions(options) if (!this.anonymous) { // For non-anonymous https requests sha256sum is 'UNSIGNED-PAYLOAD' for signature calculation. - if (!this.enableSHA256) sha256sum = 'UNSIGNED-PAYLOAD' + if (!this.enableSHA256) { + sha256sum = 'UNSIGNED-PAYLOAD' + } let date = new Date() @@ -531,7 +564,9 @@ export class Client { return } this.logHTTP(reqOptions, response) - if (returnResponse) return cb(null, response) + if (returnResponse) { + return cb(null, response) + } // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. response.on('data', () => {}) @@ -543,7 +578,9 @@ export class Client { cb(e) }) } - if (region) return _makeRequest(null, region) + if (region) { + return _makeRequest(null, region) + } this.getBucketRegion(options.bucketName, _makeRequest) } @@ -557,16 +594,22 @@ export class Client { } // Region is set with constructor, return the region right here. - if (this.region) return cb(null, this.region) + if (this.region) { + return cb(null, this.region) + } - if (this.regionMap[bucketName]) return cb(null, this.regionMap[bucketName]) + if (this.regionMap[bucketName]) { + return cb(null, this.regionMap[bucketName]) + } var extractRegion = (response) => { var transformer = transformers.getBucketRegionTransformer() var region = DEFAULT_REGION pipesetup(response, transformer) .on('error', cb) .on('data', (data) => { - if (data) region = data + if (data) { + region = data + } }) .on('end', () => { this.regionMap[bucketName] = region @@ -594,9 +637,13 @@ export class Client { if (e) { if (e.name === 'AuthorizationHeaderMalformed') { var region = e.Region - if (!region) return cb(e) + if (!region) { + return cb(e) + } this.makeRequest({ method, bucketName, query }, '', [200], region, true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } extractRegion(response) }) return @@ -677,7 +724,9 @@ export class Client { headers['x-amz-bucket-object-lock-enabled'] = true } - if (!region) region = DEFAULT_REGION + if (!region) { + region = DEFAULT_REGION + } const processWithRetry = (err) => { if (err && (region === '' || region === DEFAULT_REGION)) { @@ -707,7 +756,9 @@ export class Client { } var method = 'GET' this.makeRequest({ method }, '', [200], DEFAULT_REGION, true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getListBucketTransformer() var buckets pipesetup(response, transformer) @@ -730,8 +781,12 @@ export class Client { // * `object.uploadId` _string_: upload ID of the object // * `object.size` _Integer_: size of the partially uploaded object listIncompleteUploads(bucket, prefix, recursive) { - if (prefix === undefined) prefix = '' - if (recursive === undefined) recursive = false + if (prefix === undefined) { + prefix = '' + } + if (recursive === undefined) { + recursive = false + } if (!isValidBucketName(bucket)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucket) } @@ -752,7 +807,9 @@ export class Client { if (uploads.length) { return readStream.push(uploads.shift()) } - if (ended) return readStream.push(null) + if (ended) { + return readStream.push(null) + } this.listIncompleteUploadsQuery(bucket, prefix, keyMarker, uploadIdMarker, delimiter) .on('error', (e) => readStream.emit('error', e)) .on('data', (result) => { @@ -762,7 +819,9 @@ export class Client { (upload, cb) => { // for each incomplete upload add the sizes of its uploaded parts this.listParts(bucket, upload.key, upload.uploadId, (err, parts) => { - if (err) return cb(err) + if (err) { + return cb(err) + } upload.size = parts.reduce((acc, item) => acc + item.size, 0) uploads.push(upload) cb() @@ -802,7 +861,9 @@ export class Client { var method = 'HEAD' this.makeRequest({ method, bucketName }, '', [200], '', false, (err) => { if (err) { - if (err.code == 'NoSuchBucket' || err.code == 'NotFound') return cb(null, false) + if (err.code == 'NoSuchBucket' || err.code == 'NotFound') { + return cb(null, false) + } return cb(err) } cb(null, true) @@ -824,7 +885,9 @@ export class Client { var method = 'DELETE' this.makeRequest({ method, bucketName }, '', [204], '', false, (e) => { // If the bucket was successfully removed, remove the region map entry. - if (!e) delete this.regionMap[bucketName] + if (!e) { + delete this.regionMap[bucketName] + } cb(e) }) } @@ -849,7 +912,9 @@ export class Client { async.during( (cb) => { this.findUploadId(bucketName, objectName, (e, uploadId) => { - if (e) return cb(e) + if (e) { + return cb(e) + } removeUploadId = uploadId cb(null, uploadId) }) @@ -899,7 +964,9 @@ export class Client { // Rename wrapper. var rename = (err) => { - if (err) return cb(err) + if (err) { + return cb(err) + } fs.rename(partFile, filePath, cb) } @@ -918,7 +985,9 @@ export class Client { if (e) { partFileStream = fs.createWriteStream(partFile, { flags: 'w' }) } else { - if (objStat.size === stats.size) return rename() + if (objStat.size === stats.size) { + return rename() + } offset = stats.size partFileStream = fs.createWriteStream(partFile, { flags: 'a' }) } @@ -932,7 +1001,9 @@ export class Client { }, (cb) => fs.stat(partFile, cb), (stats, cb) => { - if (stats.size === objStat.size) return cb() + if (stats.size === objStat.size) { + return cb() + } cb(new Error('Size mismatch between downloaded file and the object')) }, ], @@ -1090,7 +1161,9 @@ export class Client { var start = 0 var end = size - 1 var autoClose = true - if (size === 0) end = 0 + if (size === 0) { + end = 0 + } var options = { start, end, autoClose } pipesetup(fs.createReadStream(filePath, options), hash) .on('data', (data) => { @@ -1109,7 +1182,9 @@ export class Client { }, (uploadId, cb) => { // if there was a previous incomplete upload, fetch all its uploaded parts info - if (uploadId) return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) + if (uploadId) { + return this.listParts(bucketName, objectName, uploadId, (e, etags) => cb(e, uploadId, etags)) + } // there was no previous upload, initiate a new one this.initiateNewMultipartUpload(bucketName, objectName, metaData, (e, uploadId) => cb(e, uploadId, [])) }, @@ -1166,7 +1241,9 @@ export class Client { // part is not uploaded yet, or md5 mismatch var stream = fs.createReadStream(filePath, options) uploader(uploadId, partNumber, stream, length, data.sha256sum, data.md5sum, (e, objInfo) => { - if (e) return cb(e) + if (e) { + return cb(e) + } partsDone.push({ part: partNumber, etag: objInfo.etag }) partNumber++ uploadedSize += length @@ -1176,7 +1253,9 @@ export class Client { .on('error', (e) => cb(e)) }, (e) => { - if (e) return cb(e) + if (e) { + return cb(e) + } cb(null, partsDone, uploadId) } ) @@ -1185,7 +1264,9 @@ export class Client { (etags, uploadId, cb) => this.completeMultipartUpload(bucketName, objectName, uploadId, etags, cb), ], (err, ...rest) => { - if (err === true) return + if (err === true) { + return + } callback(err, ...rest) } ) @@ -1252,7 +1333,9 @@ export class Client { // Get the part size and forward that to the BlockStream. Default to the // largest block size possible if necessary. - if (!isNumber(size)) size = this.maxObjectSize + if (!isNumber(size)) { + size = this.maxObjectSize + } size = this.calculatePartSize(size) @@ -1325,7 +1408,9 @@ export class Client { var method = 'PUT' this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) .on('error', (e) => cb(e)) @@ -1364,7 +1449,9 @@ export class Client { const method = 'PUT' this.makeRequest({ method, bucketName, objectName, headers }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } const transformer = transformers.getCopyObjectTransformer() pipesetup(response, transformer) .on('error', (e) => cb(e)) @@ -1454,7 +1541,9 @@ export class Client { var method = 'GET' var transformer = transformers.getListObjectsTransformer() this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return transformer.emit('error', e) + if (e) { + return transformer.emit('error', e) + } pipesetup(response, transformer) }) return transformer @@ -1479,8 +1568,12 @@ export class Client { // * `obj.isDeleteMarker` _boolean_: true if it is a delete marker // * `obj.versionId` _string_: versionId of the object listObjects(bucketName, prefix, recursive, listOpts = {}) { - if (prefix === undefined) prefix = '' - if (recursive === undefined) recursive = false + if (prefix === undefined) { + prefix = '' + } + if (recursive === undefined) { + recursive = false + } if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1511,7 +1604,9 @@ export class Client { readStream.push(objects.shift()) return } - if (ended) return readStream.push(null) + if (ended) { + return readStream.push(null) + } // if there are no objects to push do query for the next batch of objects this.listObjectsQuery(bucketName, prefix, marker, listQueryOpts) .on('error', (e) => readStream.emit('error', e)) @@ -1591,7 +1686,9 @@ export class Client { var method = 'GET' var transformer = transformers.getListObjectsV2Transformer() this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return transformer.emit('error', e) + if (e) { + return transformer.emit('error', e) + } pipesetup(response, transformer) }) return transformer @@ -1613,9 +1710,15 @@ export class Client { // * `obj.etag` _string_: etag of the object // * `obj.lastModified` _Date_: modified time stamp listObjectsV2(bucketName, prefix, recursive, startAfter) { - if (prefix === undefined) prefix = '' - if (recursive === undefined) recursive = false - if (startAfter === undefined) startAfter = '' + if (prefix === undefined) { + prefix = '' + } + if (recursive === undefined) { + recursive = false + } + if (startAfter === undefined) { + startAfter = '' + } if (!isValidBucketName(bucketName)) { throw new errors.InvalidBucketNameError('Invalid bucket name: ' + bucketName) } @@ -1643,7 +1746,9 @@ export class Client { readStream.push(objects.shift()) return } - if (ended) return readStream.push(null) + if (ended) { + return readStream.push(null) + } // if there are no objects to push do query for the next batch of objects this.listObjectsV2Query(bucketName, prefix, continuationToken, delimiter, 1000, startAfter) .on('error', (e) => readStream.emit('error', e)) @@ -1695,7 +1800,9 @@ export class Client { var query = querystring.stringify(statOpts) var method = 'HEAD' this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } // We drain the socket so that the connection gets closed. Note that this // is not expensive as the socket will not have any data. @@ -1824,7 +1931,9 @@ export class Client { headers['Content-MD5'] = toMd5(payload) this.makeRequest({ method, bucketName, query, headers }, payload, [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let removeObjectsResult pipesetup(response, transformers.removeObjectsTransformer()) .on('data', (data) => { @@ -1857,7 +1966,9 @@ export class Client { let method = 'GET' let query = 'policy' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let policy = Buffer.from('') pipesetup(response, transformers.getConcater()) @@ -1940,7 +2051,9 @@ export class Client { } var query = querystring.stringify(reqParams) this.getBucketRegion(bucketName, (e, region) => { - if (e) return cb(e) + if (e) { + return cb(e) + } // This statement is added to ensure that we send error through // callback on presign failure. var url @@ -2037,7 +2150,9 @@ export class Client { throw new TypeError('cb should be of type "function"') } this.getBucketRegion(postPolicy.formData.bucket, (e, region) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var date = new Date() var dateStr = makeDateLong(date) @@ -2099,7 +2214,9 @@ export class Client { let headers = Object.assign({}, metaData) var query = 'uploads' this.makeRequest({ method, bucketName, objectName, query, headers }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getInitiateMultipartTransformer() pipesetup(response, transformer) .on('error', (e) => cb(e)) @@ -2152,7 +2269,9 @@ export class Client { var payload = Xml(payloadObject) this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getCompleteMultipartTransformer() pipesetup(response, transformer) .on('error', (e) => cb(e)) @@ -2231,7 +2350,9 @@ export class Client { var method = 'GET' this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getListPartsTransformer() pipesetup(response, transformer) .on('error', (e) => cb(e)) @@ -2279,7 +2400,9 @@ export class Client { var method = 'GET' var transformer = transformers.getListMultipartTransformer() this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return transformer.emit('error', e) + if (e) { + return transformer.emit('error', e) + } pipesetup(response, transformer) }) return transformer @@ -2313,7 +2436,9 @@ export class Client { listNext(result.nextKeyMarker, result.nextUploadIdMarker) return } - if (latestUpload) return cb(null, latestUpload.uploadId) + if (latestUpload) { + return cb(null, latestUpload.uploadId) + } cb(null, undefined) }) } @@ -2384,7 +2509,9 @@ export class Client { headers = Object.assign({}, metaData, headers) } - if (!this.enableSHA256) headers['Content-MD5'] = md5sum + if (!this.enableSHA256) { + headers['Content-MD5'] = md5sum + } this.makeRequestStream( { method, bucketName, objectName, query, headers }, stream, @@ -2393,7 +2520,9 @@ export class Client { '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } const result = { etag: sanitizeETag(response.headers.etag), versionId: getVersionId(response.headers), @@ -2448,7 +2577,9 @@ export class Client { var method = 'GET' var query = 'notification' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } var transformer = transformers.getBucketNotificationTransformer() var bucketNotification pipesetup(response, transformer) @@ -2489,7 +2620,9 @@ export class Client { var query = 'versioning' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let versionConfig = Buffer.from('') pipesetup(response, transformers.bucketVersioningTransformer()) @@ -2705,7 +2838,9 @@ export class Client { this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { var transformer = transformers.getTagsTransformer() - if (e) return cb(e) + if (e) { + return cb(e) + } let tagsList pipesetup(response, transformer) .on('data', (result) => (tagsList = result)) @@ -2751,7 +2886,9 @@ export class Client { this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { const transformer = transformers.getTagsTransformer() - if (e) return cb(e) + if (e) { + return cb(e) + } let tagsList pipesetup(response, transformer) .on('data', (result) => (tagsList = result)) @@ -2828,7 +2965,9 @@ export class Client { this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { const transformer = transformers.lifecycleTransformer() - if (e) return cb(e) + if (e) { + return cb(e) + } let lifecycleConfig pipesetup(response, transformer) .on('data', (result) => (lifecycleConfig = result)) @@ -2907,7 +3046,9 @@ export class Client { const query = 'object-lock' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let objectLockConfig = Buffer.from('') pipesetup(response, transformers.objectLockTransformer()) @@ -3000,7 +3141,9 @@ export class Client { } this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let retentionConfig = Buffer.from('') pipesetup(response, transformers.objectRetentionTransformer()) @@ -3071,7 +3214,9 @@ export class Client { const query = 'encryption' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let bucketEncConfig = Buffer.from('') pipesetup(response, transformers.bucketEncryptionTransformer()) @@ -3148,7 +3293,9 @@ export class Client { const query = 'replication' this.makeRequest({ method, bucketName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let replicationConfig = Buffer.from('') pipesetup(response, transformers.replicationConfigTransformer()) @@ -3202,7 +3349,9 @@ export class Client { } this.makeRequest({ method, bucketName, objectName, query }, '', [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let legalHoldConfig = Buffer.from('') pipesetup(response, transformers.objectLegalHoldTransformer()) @@ -3333,7 +3482,9 @@ export class Client { const requestOptions = { method, bucketName, objectName: objectName, query, headers } return this.makeRequest(requestOptions, '', [200], '', true, (e, response) => { let partCopyResult = Buffer.from('') - if (e) return cb(e) + if (e) { + return cb(e) + } pipesetup(response, transformers.uploadPartTransformer()) .on('data', (data) => { partCopyResult = data @@ -3591,7 +3742,9 @@ export class Client { const payload = builder.buildObject(config) this.makeRequest({ method, bucketName, objectName, query }, payload, [200], '', true, (e, response) => { - if (e) return cb(e) + if (e) { + return cb(e) + } let selectResult pipesetup(response, transformers.selectObjectContentTransformer()) @@ -3674,13 +3827,17 @@ export class CopyConditions { } setModified(date) { - if (!(date instanceof Date)) throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) { + throw new TypeError('date must be of type Date') + } this.modified = date.toUTCString() } setUnmodified(date) { - if (!(date instanceof Date)) throw new TypeError('date must be of type Date') + if (!(date instanceof Date)) { + throw new TypeError('date must be of type Date') + } this.unmodified = date.toUTCString() } diff --git a/src/main/notification.js b/src/main/notification.js index 95e6ff3e..03765be6 100644 --- a/src/main/notification.js +++ b/src/main/notification.js @@ -36,7 +36,9 @@ export class NotificationConfig { if (target instanceof CloudFunctionConfig) { instance = 'CloudFunctionConfiguration' } - if (!this[instance]) this[instance] = [] + if (!this[instance]) { + this[instance] = [] + } this[instance].push(target) } } @@ -47,15 +49,21 @@ class TargetConfig { this.Id = id } addEvent(newevent) { - if (!this.Event) this.Event = [] + if (!this.Event) { + this.Event = [] + } this.Event.push(newevent) } addFilterSuffix(suffix) { - if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } + if (!this.Filter) { + this.Filter = { S3Key: { FilterRule: [] } } + } this.Filter.S3Key.FilterRule.push({ Name: 'suffix', Value: suffix }) } addFilterPrefix(prefix) { - if (!this.Filter) this.Filter = { S3Key: { FilterRule: [] } } + if (!this.Filter) { + this.Filter = { S3Key: { FilterRule: [] } } + } this.Filter.S3Key.FilterRule.push({ Name: 'prefix', Value: prefix }) } } @@ -130,7 +138,9 @@ export class NotificationPoller extends EventEmitter { checkForChanges() { // Don't continue if we're looping again but are cancelled. - if (this.ending) return + if (this.ending) { + return + } let method = 'GET' var queries = [] @@ -153,7 +163,9 @@ export class NotificationPoller extends EventEmitter { } const region = this.client.region || DEFAULT_REGION this.client.makeRequest({ method, bucketName: this.bucketName, query }, '', [200], region, true, (e, response) => { - if (e) return this.emit('error', e) + if (e) { + return this.emit('error', e) + } let transformer = transformers.getNotificationTransformer() pipesetup(response, transformer) @@ -162,7 +174,9 @@ export class NotificationPoller extends EventEmitter { // handle it after flushing from the JSON parser. let records = result.Records // If null (= no records), change to an empty array. - if (!records) records = [] + if (!records) { + records = [] + } // Iterate over the notifications and emit them individually. records.forEach((record) => { @@ -170,7 +184,9 @@ export class NotificationPoller extends EventEmitter { }) // If we're done, stop. - if (this.ending) response.destroy() + if (this.ending) { + response.destroy() + } }) .on('error', (e) => this.emit('error', e)) .on('end', () => { diff --git a/src/main/object-uploader.js b/src/main/object-uploader.js index 6a731204..6b0d26bf 100644 --- a/src/main/object-uploader.js +++ b/src/main/object-uploader.js @@ -85,7 +85,9 @@ export default class ObjectUploader extends Transform { } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { - if (err) return callback(err) + if (err) { + return callback(err) + } let result = { etag: sanitizeETag(response.headers.etag), versionId: getVersionId(response.headers), @@ -116,12 +118,16 @@ export default class ObjectUploader extends Transform { // Check for an incomplete previous upload. this.client.findUploadId(this.bucketName, this.objectName, (err, id) => { - if (err) return this.emit('error', err) + if (err) { + return this.emit('error', err) + } // If no upload ID exists, initiate a new one. if (!id) { this.client.initiateNewMultipartUpload(this.bucketName, this.objectName, this.metaData, (err, id) => { - if (err) return callback(err) + if (err) { + return callback(err) + } this.id = id @@ -136,10 +142,14 @@ export default class ObjectUploader extends Transform { // Retrieve the pre-uploaded parts, if we need to resume the upload. this.client.listParts(this.bucketName, this.objectName, id, (err, etags) => { - if (err) return this.emit('error', err) + if (err) { + return this.emit('error', err) + } // It is possible for no parts to be already uploaded. - if (!etags) etags = [] + if (!etags) { + etags = [] + } // oldParts will become an object, allowing oldParts[partNumber].etag this.oldParts = etags.reduce(function (prev, item) { @@ -193,11 +203,15 @@ export default class ObjectUploader extends Transform { } this.client.makeRequest(options, chunk, [200], '', true, (err, response) => { - if (err) return callback(err) + if (err) { + return callback(err) + } // In order to aggregate the parts together, we need to collect the etags. let etag = response.headers.etag - if (etag) etag = etag.replace(/^"/, '').replace(/"$/, '') + if (etag) { + etag = etag.replace(/^"/, '').replace(/"$/, '') + } this.etags.push({ part: partNumber, etag }) @@ -222,7 +236,9 @@ export default class ObjectUploader extends Transform { } this.client.makeRequest(options, '', [200], '', true, (err, response) => { - if (err) return callback(err) + if (err) { + return callback(err) + } let result = { etag: sanitizeETag(response.headers.etag), @@ -251,7 +267,9 @@ export default class ObjectUploader extends Transform { // This is called when all of the chunks uploaded successfully, thus // completing the multipart upload. this.client.completeMultipartUpload(this.bucketName, this.objectName, this.id, this.etags, (err, etag) => { - if (err) return callback(err) + if (err) { + return callback(err) + } // Call our callback on the next tick to allow the streams infrastructure // to finish what its doing before we continue. diff --git a/src/main/signing.js b/src/main/signing.js index 3a736617..07cc0c92 100644 --- a/src/main/signing.js +++ b/src/main/signing.js @@ -57,7 +57,9 @@ function getCanonicalRequest(method, path, headers, signedHeaders, hashedPayload const requestResource = path.split('?')[0] let requestQuery = path.split('?')[1] - if (!requestQuery) requestQuery = '' + if (!requestQuery) { + requestQuery = '' + } if (requestQuery) { requestQuery = requestQuery diff --git a/src/main/xml-parsers.js b/src/main/xml-parsers.js index 12575c52..6fbbed4e 100644 --- a/src/main/xml-parsers.js +++ b/src/main/xml-parsers.js @@ -63,14 +63,17 @@ export function parseCopyObject(xml) { throw new errors.InvalidXMLError('Missing tag: "CopyObjectResult"') } xmlobj = xmlobj.CopyObjectResult - if (xmlobj.ETag) + if (xmlobj.ETag) { result.etag = xmlobj.ETag.replace(/^"/g, '') .replace(/"$/g, '') .replace(/^"/g, '') .replace(/"$/g, '') .replace(/^"/g, '') .replace(/"$/g, '') - if (xmlobj.LastModified) result.lastModified = new Date(xmlobj.LastModified) + } + if (xmlobj.LastModified) { + result.lastModified = new Date(xmlobj.LastModified) + } return result } @@ -89,9 +92,15 @@ export function parseListMultipart(xml) { throw new errors.InvalidXMLError('Missing tag: "ListMultipartUploadsResult"') } xmlobj = xmlobj.ListMultipartUploadsResult - if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextKeyMarker) result.nextKeyMarker = xmlobj.NextKeyMarker - if (xmlobj.NextUploadIdMarker) result.nextUploadIdMarker = xmlobj.nextUploadIdMarker + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated + } + if (xmlobj.NextKeyMarker) { + result.nextKeyMarker = xmlobj.NextKeyMarker + } + if (xmlobj.NextUploadIdMarker) { + result.nextUploadIdMarker = xmlobj.nextUploadIdMarker + } if (xmlobj.CommonPrefixes) { toArray(xmlobj.CommonPrefixes).forEach((prefix) => { @@ -226,8 +235,12 @@ export function parseListParts(xml) { throw new errors.InvalidXMLError('Missing tag: "ListPartsResult"') } xmlobj = xmlobj.ListPartsResult - if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextPartNumberMarker) result.marker = +toArray(xmlobj.NextPartNumberMarker)[0] + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated + } + if (xmlobj.NextPartNumberMarker) { + result.marker = +toArray(xmlobj.NextPartNumberMarker)[0] + } if (xmlobj.Part) { toArray(xmlobj.Part).forEach((p) => { var part = +toArray(p.PartNumber)[0] @@ -253,7 +266,9 @@ export function parseInitiateMultipart(xml) { } xmlobj = xmlobj.InitiateMultipartUploadResult - if (xmlobj.UploadId) return xmlobj.UploadId + if (xmlobj.UploadId) { + return xmlobj.UploadId + } throw new errors.InvalidXMLError('Missing tag: "UploadId"') } @@ -387,8 +402,12 @@ export function parseListObjectsV2(xml) { throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"') } xmlobj = xmlobj.ListBucketResult - if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated + } + if (xmlobj.NextContinuationToken) { + result.nextContinuationToken = xmlobj.NextContinuationToken + } if (xmlobj.Contents) { toArray(xmlobj.Contents).forEach((content) => { var name = sanitizeObjectKey(toArray(content.Key)[0]) @@ -417,8 +436,12 @@ export function parseListObjectsV2WithMetadata(xml) { throw new errors.InvalidXMLError('Missing tag: "ListBucketResult"') } xmlobj = xmlobj.ListBucketResult - if (xmlobj.IsTruncated) result.isTruncated = xmlobj.IsTruncated - if (xmlobj.NextContinuationToken) result.nextContinuationToken = xmlobj.NextContinuationToken + if (xmlobj.IsTruncated) { + result.isTruncated = xmlobj.IsTruncated + } + if (xmlobj.NextContinuationToken) { + result.nextContinuationToken = xmlobj.NextContinuationToken + } if (xmlobj.Contents) { toArray(xmlobj.Contents).forEach((content) => { diff --git a/src/test/functional/functional-tests.js b/src/test/functional/functional-tests.js index 655e99a5..9b2986ed 100644 --- a/src/test/functional/functional-tests.js +++ b/src/test/functional/functional-tests.js @@ -196,8 +196,12 @@ describe('functional tests', function () { describe('listBuckets', () => { step('listBuckets(cb)__', (done) => { client.listBuckets((e, buckets) => { - if (e) return done(e) - if (_.find(buckets, { name: bucketName })) return done() + if (e) { + return done(e) + } + if (_.find(buckets, { name: bucketName })) { + return done() + } done(new Error('bucket not found')) }) }) @@ -205,7 +209,9 @@ describe('functional tests', function () { client .listBuckets() .then((buckets) => { - if (!_.find(buckets, { name: bucketName })) return done(new Error('bucket not found')) + if (!_.find(buckets, { name: bucketName })) { + return done(new Error('bucket not found')) + } }) .then(() => done()) .catch(done) @@ -243,7 +249,9 @@ describe('functional tests', function () { setTimeout(() => { clientUsEastRegion.makeBucket(`${bucketName}-region`, 'us-east-1', done) }, 40 * 1000) - } else done() + } else { + done() + } }) } done() @@ -263,7 +271,9 @@ describe('functional tests', function () { step(`bucketExists(bucketName, cb)_bucketName:${bucketName}_`, (done) => client.bucketExists(bucketName, done)) step(`bucketExists(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { client.bucketExists(bucketName + 'random', (e, exists) => { - if (e === null && !exists) return done() + if (e === null && !exists) { + return done() + } done(new Error()) }) }) @@ -278,7 +288,9 @@ describe('functional tests', function () { describe('removeBucket', () => { step(`removeBucket(bucketName, cb)_bucketName:${bucketName}random_`, (done) => { client.removeBucket(bucketName + 'random', (e) => { - if (e.code === 'NoSuchBucket') return done() + if (e.code === 'NoSuchBucket') { + return done() + } done(new Error()) }) }) @@ -306,11 +318,15 @@ describe('functional tests', function () { (done) => { var hash = crypto.createHash('md5') client.getObject(bucketName, _MultiPath100kbObjectBufferName, (e, stream) => { - if (e) return done(e) + if (e) { + return done(e) + } stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() + if (hash.digest('hex') === _100kbmd5) { + return done() + } done(new Error('content mismatch')) }) }) @@ -339,7 +355,9 @@ describe('functional tests', function () { step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { - if (e) return done(e) + if (e) { + return done(e) + } // As metadata is not provided and there is no file extension, // we default to 'application/octet-stream' as per `probeContentType` function if (stat.metaData && stat.metaData['content-type'] !== 'application/octet-stream') { @@ -360,7 +378,9 @@ describe('functional tests', function () { step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { - if (e) return done(e) + if (e) { + return done(e) + } // As metadata is provided, even though we have an extension, // the `content-type` should be equal what was declared on the metadata if (stat.metaData && stat.metaData['content-type'] !== 'text/html') { @@ -382,11 +402,14 @@ describe('functional tests', function () { step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { - if (e) return done(e) + if (e) { + return done(e) + } // As metadata is not provided but we have a file extension, // we need to infer `content-type` from the file extension - if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') + if (stat.metaData && stat.metaData['content-type'] !== 'text/plain') { return done(new Error('content-type mismatch')) + } done() }) }) @@ -412,11 +435,15 @@ describe('functional tests', function () { (done) => { var hash = crypto.createHash('md5') client.getObject(bucketName, _100kbObjectName, (e, stream) => { - if (e) return done(e) + if (e) { + return done(e) + } stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() + if (hash.digest('hex') === _100kbmd5) { + return done() + } done(new Error('content mismatch')) }) }) @@ -435,11 +462,15 @@ describe('functional tests', function () { (done) => { var hash = crypto.createHash('md5') client.getObject(bucketName, _100kbObjectBufferName, (e, stream) => { - if (e) return done(e) + if (e) { + return done(e) + } stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === _100kbmd5) return done() + if (hash.digest('hex') === _100kbmd5) { + return done() + } done(new Error('content mismatch')) }) }) @@ -479,7 +510,9 @@ describe('functional tests', function () { .then((stream) => { stream.on('data', (data) => hash.update(data)) stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() + if (hash.digest('hex') === expectedHash) { + return done() + } done(new Error('content mismatch')) }) }) @@ -496,7 +529,9 @@ describe('functional tests', function () { .then((stream) => { stream.on('data', (data) => hash.update(data)) stream.on('end', () => { - if (hash.digest('hex') === _100kb1kboffsetmd5) return done() + if (hash.digest('hex') === _100kb1kboffsetmd5) { + return done() + } done(new Error('content mismatch')) }) }) @@ -523,7 +558,9 @@ describe('functional tests', function () { var stream = readableStream(_65mb) client.putObject(bucketName, _65mbObjectName, stream, metaData, () => { setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() + if (Object.values(httpAgent.sockets).length === 0) { + return done() + } done(new Error('http request did not release network socket')) }, 100) }) @@ -533,11 +570,15 @@ describe('functional tests', function () { step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { var hash = crypto.createHash('md5') client.getObject(bucketName, _65mbObjectName, (e, stream) => { - if (e) return done(e) + if (e) { + return done(e) + } stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === _65mbmd5) return done() + if (hash.digest('hex') === _65mbmd5) { + return done() + } done(new Error('content mismatch')) }) }) @@ -545,9 +586,15 @@ describe('functional tests', function () { step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName} non-existent object`, (done) => { client.getObject(bucketName, 'an-object-that-does-not-exist', (e, stream) => { - if (stream) return done(new Error('on errors the stream object should not exist')) - if (!e) return done(new Error('expected an error object')) - if (e.code !== 'NoSuchKey') return done(new Error('expected NoSuchKey error')) + if (stream) { + return done(new Error('on errors the stream object should not exist')) + } + if (!e) { + return done(new Error('expected an error object')) + } + if (e.code !== 'NoSuchKey') { + return done(new Error('expected NoSuchKey error')) + } done() }) }) @@ -561,11 +608,15 @@ describe('functional tests', function () { .update(_65mb.slice(0, 100 * 1024)) .digest('hex') client.getPartialObject(bucketName, _65mbObjectName, 0, 100 * 1024, (e, stream) => { - if (e) return done(e) + if (e) { + return done(e) + } stream.on('data', (data) => hash.update(data)) stream.on('error', done) stream.on('end', () => { - if (hash.digest('hex') === expectedHash) return done() + if (hash.digest('hex') === expectedHash) { + return done() + } done(new Error('content mismatch')) }) }) @@ -576,7 +627,9 @@ describe('functional tests', function () { `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_65mbObjectNameCopy}, srcObject:/${bucketName}/${_65mbObjectName}_`, (done) => { client.copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -594,16 +647,24 @@ describe('functional tests', function () { step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { client.statObject(bucketName, _65mbObjectName, (e, stat) => { - if (e) return done(e) - if (stat.size !== _65mb.length) return done(new Error('size mismatch')) - if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) + if (e) { + return done(e) + } + if (stat.size !== _65mb.length) { + return done(new Error('size mismatch')) + } + if (`${metaData.randomstuff}` !== stat.metaData.randomstuff) { return done(new Error('metadata "randomstuff" mismatch')) - if (`${metaData['X-Amz-Meta-Testing']}` !== stat.metaData['testing']) + } + if (`${metaData['X-Amz-Meta-Testing']}` !== stat.metaData['testing']) { return done(new Error('metadata "testing" mismatch')) - if (`${metaData['Content-Type']}` !== stat.metaData['content-type']) + } + if (`${metaData['Content-Type']}` !== stat.metaData['content-type']) { return done(new Error('metadata "content-type" mismatch')) - if (`${metaData['Content-Language']}` !== stat.metaData['content-language']) + } + if (`${metaData['Content-Language']}` !== stat.metaData['content-language']) { return done(new Error('metadata "content-language" mismatch')) + } done() }) }) @@ -612,7 +673,9 @@ describe('functional tests', function () { client .statObject(bucketName, _65mbObjectName) .then((stat) => { - if (stat.size !== _65mb.length) return done(new Error('size mismatch')) + if (stat.size !== _65mb.length) { + return done(new Error('size mismatch')) + } }) .then(() => done()) .catch(done) @@ -646,7 +709,9 @@ describe('functional tests', function () { `copyObject(bucketName, objectName, srcObject, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}, srcObject:/${bucketName}/${_100kbObjectName}_`, (done) => { client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -654,8 +719,12 @@ describe('functional tests', function () { step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { client.statObject(bucketName, _100kbObjectName, (e, stat) => { - if (e) return done(e) - if (stat.size !== _100kb.length) return done(new Error('size mismatch')) + if (e) { + return done(e) + } + if (stat.size !== _100kb.length) { + return done(new Error('size mismatch')) + } assert.equal(stat.metaData['content-type'], metaData['Content-Type']) assert.equal(stat.metaData['Testing'], metaData['Testing']) assert.equal(stat.metaData['randomstuff'], metaData['randomstuff']) @@ -671,7 +740,9 @@ describe('functional tests', function () { var conds = new minio.CopyConditions() conds.setMatchETagExcept('TestEtag') client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -697,7 +768,9 @@ describe('functional tests', function () { var conds = new minio.CopyConditions() conds.setMatchETag(etag) client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -723,7 +796,9 @@ describe('functional tests', function () { var conds = new minio.CopyConditions() conds.setUnmodified(new Date(modifiedDate)) client.copyObject(bucketName, _100kbObjectNameCopy, '/' + bucketName + '/' + _100kbObjectName, conds, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -747,8 +822,12 @@ describe('functional tests', function () { `statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectNameCopy}_`, (done) => { client.statObject(bucketName, _100kbObjectNameCopy, (e, stat) => { - if (e) return done(e) - if (stat.size !== _100kb.length) return done(new Error('size mismatch')) + if (e) { + return done(e) + } + if (stat.size !== _100kb.length) { + return done(new Error('size mismatch')) + } done() }) } @@ -788,10 +867,14 @@ describe('functional tests', function () { .listIncompleteUploads(bucketName, _65mbObjectName, true) .on('error', (e) => done(e)) .on('data', (data) => { - if (data.key === _65mbObjectName) found = true + if (data.key === _65mbObjectName) { + found = true + } }) .on('end', () => { - if (found) return done() + if (found) { + return done() + } done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) }) } @@ -811,10 +894,14 @@ describe('functional tests', function () { .listIncompleteUploads(bucketName, '', true) .on('error', (e) => done(e)) .on('data', (data) => { - if (data.key === _65mbObjectName) found = true + if (data.key === _65mbObjectName) { + found = true + } }) .on('end', () => { - if (found) return done() + if (found) { + return done() + } done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) }) } @@ -834,7 +921,9 @@ describe('functional tests', function () { fs.writeFileSync(tmpFileUpload, _65mb) client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, () => { setTimeout(() => { - if (Object.values(httpAgent.sockets).length === 0) return done() + if (Object.values(httpAgent.sockets).length === 0) { + return done() + } done(new Error('http request did not release network socket')) }, 100) }) @@ -852,7 +941,9 @@ describe('functional tests', function () { .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) .then(() => { var md5sum = crypto.createHash('md5').update(fs.readFileSync(tmpFileDownload)).digest('hex') - if (md5sum === _65mbmd5) return done() + if (md5sum === _65mbmd5) { + return done() + } return done(new Error('md5sum mismatch')) }) .catch(done) @@ -927,7 +1018,9 @@ describe('functional tests', function () { .fGetObject(bucketName, _5mbObjectName, localFile) .then(() => { var md5sum = crypto.createHash('md5').update(fs.readFileSync(localFile)).digest('hex') - if (md5sum === _5mbmd5) return done() + if (md5sum === _5mbmd5) { + return done() + } return done(new Error('md5sum mismatch')) }) .catch(done) @@ -947,16 +1040,24 @@ describe('functional tests', function () { step(`setBucketPolicy(bucketName, bucketPolicy, cb)_bucketName:${bucketName}, bucketPolicy:${policy}_`, (done) => { client.setBucketPolicy(bucketName, policy, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step(`getBucketPolicy(bucketName, cb)_bucketName:${bucketName}_`, (done) => { client.getBucketPolicy(bucketName, (err, response) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } if (!response) { return done(new Error(`policy is empty`)) } @@ -1010,16 +1111,22 @@ describe('functional tests', function () { `presignedPutObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires: 1000_`, (done) => { client.presignedPutObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'PUT' options.headers = { 'content-length': _1byte.length, } - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } response.on('error', (e) => done(e)) response.on('end', () => done()) response.on('data', () => {}) @@ -1059,13 +1166,19 @@ describe('functional tests', function () { `presignedGetObject(bucketName, objectName, expires, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, (done) => { client.presignedGetObject(bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } var error = null response.on('error', (e) => done(e)) response.on('end', () => done(error)) @@ -1085,13 +1198,19 @@ describe('functional tests', function () { `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:GET, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, (done) => { client.presignedUrl('GET', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } var error = null response.on('error', (e) => done(e)) response.on('end', () => done(error)) @@ -1113,13 +1232,19 @@ describe('functional tests', function () { var requestDate = new Date() requestDate.setHours(0, 0, 0, 0) client.presignedUrl('GET', bucketName, _1byteObjectName, 86400, requestDate, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } var error = null response.on('error', (e) => done(e)) response.on('end', () => done(error)) @@ -1139,13 +1264,19 @@ describe('functional tests', function () { `presignedGetObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_1byteObjectName}_`, (done) => { client.presignedGetObject(bucketName, _1byteObjectName, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } var error = null response.on('error', (e) => done(e)) response.on('end', () => done(error)) @@ -1183,13 +1314,19 @@ describe('functional tests', function () { 'response-content-encoding': 'gzip', } client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on get : ${response.statusCode}`)) + } if (respHeaders['response-content-type'] !== response.headers['content-type']) { return done(new Error(`content-type header mismatch`)) } @@ -1225,13 +1362,19 @@ describe('functional tests', function () { 'attachment; filename="abc|"@#$%&/(<>)/=?!{[\']}+*-_:,;def.png"; filename*=UTF-8\'\'t&21st&20ng.png', } client.presignedGetObject(bucketName, _1byteObjectName, 1000, respHeaders, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on get : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on get : ${response.statusCode}`)) + } if (respHeaders['response-content-disposition'] !== response.headers['content-disposition']) { return done(new Error(`content-disposition header mismatch`)) } @@ -1250,13 +1393,19 @@ describe('functional tests', function () { var requestDate = new Date() requestDate.setHours(0, 0, 0, 0) client.presignedGetObject(bucketName, _1byteObjectName, 86400, {}, requestDate, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } var error = null response.on('error', (e) => done(e)) response.on('end', () => done(error)) @@ -1281,12 +1430,16 @@ describe('functional tests', function () { policy.setExpires(expires) client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } done() }) req.on('error', (e) => done(e)) @@ -1300,12 +1453,16 @@ describe('functional tests', function () { policy.setContentType('text/plain') client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } done() }) req.on('error', (e) => done(e)) @@ -1319,12 +1476,16 @@ describe('functional tests', function () { policy.setContentTypeStartsWith('text/') client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } done() }) req.on('error', (e) => done(e)) @@ -1339,12 +1500,16 @@ describe('functional tests', function () { policy.setContentDisposition('inline') client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } client.removeObject(bucketName, objectName, done) }) req.on('error', (e) => done(e)) @@ -1359,12 +1524,16 @@ describe('functional tests', function () { policy.setContentDisposition('attachment; filename= My* Docume! nt.json') client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } client.removeObject(bucketName, objectName, done) }) req.on('error', (e) => done(e)) @@ -1382,12 +1551,16 @@ describe('functional tests', function () { }) client.presignedPostPolicy(policy, (e, data) => { - if (e) return done(e) + if (e) { + return done(e) + } var req = superagent.post(data.postURL) _.each(data.formData, (value, key) => req.field(key, value)) req.attach('file', Buffer.from([_1byte]), 'test') req.end(function (e) { - if (e) return done(e) + if (e) { + return done(e) + } client.removeObject(bucketName, objectName, done) }) req.on('error', (e) => done(e)) @@ -1407,15 +1580,21 @@ describe('functional tests', function () { `presignedUrl(httpMethod, bucketName, objectName, expires, reqParams, cb)_httpMethod:GET, bucketName:${bucketName}, expires:1000_`, (done) => { client.presignedUrl('GET', bucketName, '', 1000, { prefix: 'data', 'max-keys': 1000 }, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'GET' options.headers = {} var str = '' - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var callback = function (response) { - if (response.statusCode !== 200) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 200) { + return done(new Error(`error on put : ${response.statusCode}`)) + } response.on('error', (e) => done(e)) response.on('end', function () { if (!str.match(`${_1byteObjectName}`)) { @@ -1437,14 +1616,20 @@ describe('functional tests', function () { `presignedUrl(httpMethod, bucketName, objectName, expires, cb)_httpMethod:DELETE, bucketName:${bucketName}, objectName:${_1byteObjectName}, expires:1000_`, (done) => { client.presignedUrl('DELETE', bucketName, _1byteObjectName, 1000, (e, presignedUrl) => { - if (e) return done(e) + if (e) { + return done(e) + } var transport = http var options = _.pick(url.parse(presignedUrl), ['hostname', 'port', 'path', 'protocol']) options.method = 'DELETE' options.headers = {} - if (options.protocol === 'https:') transport = https + if (options.protocol === 'https:') { + transport = https + } var request = transport.request(options, (response) => { - if (response.statusCode !== 204) return done(new Error(`error on put : ${response.statusCode}`)) + if (response.statusCode !== 204) { + return done(new Error(`error on put : ${response.statusCode}`)) + } response.on('error', (e) => done(e)) response.on('end', () => done()) response.on('data', () => {}) @@ -1484,7 +1669,9 @@ describe('functional tests', function () { .listObjects(bucketName, listObjectPrefix, true) .on('error', done) .on('end', () => { - if (_.isEqual(objArray, listPrefixArray)) return done() + if (_.isEqual(objArray, listPrefixArray)) { + return done() + } return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -1513,7 +1700,9 @@ describe('functional tests', function () { .listObjects(bucketName, '', false) .on('error', done) .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() + if (_.isEqual(objArray, listArray)) { + return done() + } return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -1529,7 +1718,9 @@ describe('functional tests', function () { .listObjectsV2(bucketName, '', true, '') .on('error', done) .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() + if (_.isEqual(objArray, listArray)) { + return done() + } return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -1546,7 +1737,9 @@ describe('functional tests', function () { .listObjectsV2WithMetadata(bucketName, '', true, '') .on('error', done) .on('end', () => { - if (_.isEqual(objArray, listArray)) return done() + if (_.isEqual(objArray, listArray)) { + return done() + } return done(new Error(`listObjects lists ${listArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -1691,13 +1884,19 @@ describe('functional tests', function () { return } client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) + if (err) { + return done(err) + } setTimeout(() => { // Give it some time to get the notification. poller.stop() client.removeObject(bucketName, objectName, (err) => { - if (err) return done(err) - if (!records) return done(new Error('notification not received')) + if (err) { + return done(err) + } + if (!records) { + return done(new Error('notification not received')) + } done() }) }, 10 * 1000) @@ -1720,7 +1919,9 @@ describe('functional tests', function () { }) client.putObject(bucketName, objectName, 'stringdata', (err) => { - if (err) return done(err) + if (err) { + return done(err) + } // It polls every five seconds, so wait for two-ish polls, then end. setTimeout(() => { poller.stop() @@ -1743,31 +1944,47 @@ describe('functional tests', function () { describe('Versioning Steps test', function () { step('Check if versioning is enabled on a bucket', (done) => { client.getBucketVersioning(versionedBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step('Enable versioning on a bucket', (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step('Suspend versioning on a bucket', (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step('Check if versioning is Suspended on a bucket', (done) => { client.getBucketVersioning(versionedBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) @@ -1792,8 +2009,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } @@ -1832,8 +2053,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } @@ -1858,8 +2083,12 @@ describe('functional tests', function () { `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${versionedBucketName},{Status:"Enabled"}`, (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } @@ -1968,8 +2197,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Suspended"}`, (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Suspended' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } @@ -1992,8 +2225,12 @@ describe('functional tests', function () { before((done) => client.makeBucket(versionedBucketName, '', () => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -2036,7 +2273,9 @@ describe('functional tests', function () { .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + if (_.isEqual(objArray.length, listPrefixArray.length)) { + return done() + } return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -2057,7 +2296,9 @@ describe('functional tests', function () { .listObjects(versionedBucketName, prefixName, true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(objArray.length, listPrefixArray.length)) return done() + if (_.isEqual(objArray.length, listPrefixArray.length)) { + return done() + } return done(new Error(`listObjects lists ${listPrefixArray.length} objects, expected ${listObjectsNum}`)) }) .on('data', (data) => { @@ -2107,8 +2348,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${versionedBucketName},versionConfig:{Status:"Enabled"} `, (done) => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -2152,7 +2397,9 @@ describe('functional tests', function () { .listObjects(versionedBucketName, '', true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(2, objVersionList.length)) return done() + if (_.isEqual(2, objVersionList.length)) { + return done() + } return done(new Error(`listObjects lists ${objVersionList.length} objects, expected ${2}`)) }) .on('data', (data) => { @@ -2196,15 +2443,23 @@ describe('functional tests', function () { describe('set, get and remove Tags on a bucket', function () { step(`Set tags on a bucket_bucketName:${tagsBucketName}`, (done) => { client.setBucketTagging(tagsBucketName, { 'test-tag-key': 'test-tag-value' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step(`Get tags on a bucket_bucketName:${tagsBucketName}`, (done) => { client.getBucketTagging(tagsBucketName, (err, tagList) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } if (isArray(tagList)) { done() } @@ -2213,8 +2468,12 @@ describe('functional tests', function () { step(`remove Tags on a bucket_bucketName:${tagsBucketName}`, (done) => { client.removeBucketTagging(tagsBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) @@ -2243,16 +2502,24 @@ describe('functional tests', function () { step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.setObjectTagging(tagsBucketName, tagObjName, { 'test-tag-key-obj': 'test-tag-value-obj' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step(`getObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.getObjectTagging(tagsBucketName, tagObjName, (err, tagList) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } if (isArray(tagList)) { done() } @@ -2261,8 +2528,12 @@ describe('functional tests', function () { step(`removeObjectTagging on an object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { client.removeObjectTagging(tagsBucketName, tagObjName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) @@ -2290,8 +2561,12 @@ describe('functional tests', function () { `Enable Versioning on Bucket: setBucketVersioning(bucketName,versioningConfig)_bucketName:${tagsVersionedBucketName},{Status:"Enabled"}`, (done) => { client.setBucketVersioning(tagsVersionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -2325,7 +2600,9 @@ describe('functional tests', function () { { 'test-tag-key-obj': 'test-tag-value-obj' }, { versionId: versionId }, (err) => { - if (err) return done(err) + if (err) { + return done(err) + } done() } ) @@ -2337,7 +2614,9 @@ describe('functional tests', function () { step(`Get tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { client.getObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err, tagList) => { - if (err) return done(err) + if (err) { + return done(err) + } if (isArray(tagList)) { done() } @@ -2350,8 +2629,12 @@ describe('functional tests', function () { step(`remove Tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { if (isVersioningSupported) { client.removeObjectTagging(tagsVersionedBucketName, tagObjName, { versionId: versionId }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } else { @@ -2392,24 +2675,36 @@ describe('functional tests', function () { ], } client.setBucketLifecycle(bucketName, lifecycleConfig, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step('Set lifecycle config of a bucket', (done) => { client.getBucketLifecycle(bucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) step('Remove lifecycle config of a bucket', (done) => { client.removeBucketLifecycle(bucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) }) @@ -2438,8 +2733,12 @@ describe('functional tests', function () { before((done) => client.makeBucket(versionedBucketName, '', () => { client.setBucketVersioning(versionedBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -2465,7 +2764,9 @@ describe('functional tests', function () { mobileClientReqWithProtocol = https } const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + if (response.statusCode !== 200) { + return new Error(`error on put : ${response.statusCode}`) + } response.on('error', (err) => { done(err) }) @@ -2508,7 +2809,9 @@ describe('functional tests', function () { mobileClientReqWithProtocol = https } const uploadRequest = mobileClientReqWithProtocol.request(upldRequestOptions, (response) => { - if (response.statusCode !== 200) return new Error(`error on put : ${response.statusCode}`) + if (response.statusCode !== 200) { + return new Error(`error on put : ${response.statusCode}`) + } response.on('error', (err) => { done(err) }) @@ -2586,7 +2889,9 @@ describe('functional tests', function () { } const request = mobileClientReqWithProtocol.request(getReqOpts, (response) => { // if delete marker. method not allowed. - if (response.statusCode !== 200) return new Error(`error on get : ${response.statusCode}`) + if (response.statusCode !== 200) { + return new Error(`error on get : ${response.statusCode}`) + } response.on('error', () => { return done() }) @@ -2637,9 +2942,13 @@ describe('functional tests', function () { let isFeatureSupported = false step(`Check if bucket with object lock can be created:_bucketName:${lockEnabledBucketName}`, (done) => { client.makeBucket(lockEnabledBucketName, { ObjectLocking: true }, (err) => { - if (err && err.code === 'NotImplemented') return done() + if (err && err.code === 'NotImplemented') { + return done() + } isFeatureSupported = true - if (err) return done(err) + if (err) { + return done(err) + } done() }) }) @@ -2647,8 +2956,12 @@ describe('functional tests', function () { step(`Get lock config on a bucket:_bucketName:${lockEnabledBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockEnabledBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } else { @@ -2659,8 +2972,12 @@ describe('functional tests', function () { step(`Check if bucket can be deleted:_bucketName:${lockEnabledBucketName}`, (done) => { client.removeBucket(lockEnabledBucketName, (err) => { if (isFeatureSupported) { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() } else { done() @@ -2674,9 +2991,13 @@ describe('functional tests', function () { let isFeatureSupported = false step(`Check if bucket with object lock can be created:_bucketName:${lockConfigBucketName}`, (done) => { client.makeBucket(lockConfigBucketName, { ObjectLocking: true }, (err) => { - if (err && err.code === 'NotImplemented') return done() + if (err && err.code === 'NotImplemented') { + return done() + } isFeatureSupported = true - if (err) return done(err) + if (err) { + return done(err) + } done() }) }) @@ -2686,8 +3007,12 @@ describe('functional tests', function () { lockConfigBucketName, { mode: 'GOVERNANCE', unit: 'Years', validity: 2 }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() } ) @@ -2698,8 +3023,12 @@ describe('functional tests', function () { step(`Get lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } else { @@ -2710,8 +3039,12 @@ describe('functional tests', function () { step(`Set lock config on a bucket:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.setObjectLockConfig(lockConfigBucketName, {}, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } else { @@ -2721,8 +3054,12 @@ describe('functional tests', function () { step(`Get and verify lock config on a bucket after reset/update:_bucketName:${lockConfigBucketName}`, (done) => { if (isFeatureSupported) { client.getObjectLockConfig(lockConfigBucketName, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() }) } else { @@ -2733,8 +3070,12 @@ describe('functional tests', function () { step(`Check if bucket can be deleted:_bucketName:${lockConfigBucketName}`, (done) => { client.removeBucket(lockConfigBucketName, (err) => { if (isFeatureSupported) { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } done() } else { done() @@ -2756,9 +3097,13 @@ describe('functional tests', function () { step(`Check if bucket with object lock can be created:_bucketName:${objRetentionBucket}`, (done) => { client.makeBucket(objRetentionBucket, { ObjectLocking: true }, (err) => { - if (err && err.code === 'NotImplemented') return done() + if (err && err.code === 'NotImplemented') { + return done() + } isFeatureSupported = true - if (err) return done(err) + if (err) { + return done(err) + } done() }) }) @@ -2897,7 +3242,9 @@ describe('functional tests', function () { if (err && err.code === 'ServerSideEncryptionConfigurationNotFoundError') { return done() } - if (err) return done(err) + if (err) { + return done(err) + } done() }) }) @@ -3019,9 +3366,13 @@ describe('functional tests', function () { step(`Check if bucket with object lock can be created:_bucketName:${objLegalHoldBucketName}`, (done) => { client.makeBucket(objLegalHoldBucketName, { ObjectLocking: true }, (err) => { - if (err && err.code === 'NotImplemented') return done() + if (err && err.code === 'NotImplemented') { + return done() + } isFeatureSupported = true - if (err) return done(err) + if (err) { + return done(err) + } done() }) }) @@ -3269,7 +3620,9 @@ describe('functional tests', function () { `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameSpecialChars}`, (done) => { client.statObject(bucketNameForSpCharObjects, objectNameSpecialChars, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -3401,7 +3754,9 @@ describe('functional tests', function () { `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefixForSpecialChars}`, (done) => { client.statObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -3486,7 +3841,9 @@ describe('functional tests', function () { (done) => { const stream = readableStream(_100kb) client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { - if (e) done(e) + if (e) { + done(e) + } if (res.versionId === null && res.etag) { done() } else { @@ -3517,7 +3874,9 @@ describe('functional tests', function () { (done) => { const stream = readableStream(_65mb) client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { - if (e) done(e) + if (e) { + done(e) + } if (res.versionId === null && res.etag) { done() } else { @@ -3552,8 +3911,12 @@ describe('functional tests', function () { before((done) => client.makeBucket(bucketToTestMultipart, '', () => { client.setBucketVersioning(bucketToTestMultipart, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -3568,7 +3931,9 @@ describe('functional tests', function () { if (isVersioningSupported) { const stream = readableStream(_100kb) client.putObject(bucketToTestMultipart, _100kbObjectName, stream, metaData, (e, res) => { - if (e) done(e) + if (e) { + done(e) + } if (res.versionId && res.etag) { versionedObjectRes = res done() @@ -3608,7 +3973,9 @@ describe('functional tests', function () { if (isVersioningSupported) { const stream = readableStream(_65mb) client.putObject(bucketToTestMultipart, _65mbObjectName, stream, metaData, (e, res) => { - if (e) done(e) + if (e) { + done(e) + } if (res.versionId && res.etag) { versionedMultiPartObjectRes = res done() @@ -3718,7 +4085,9 @@ describe('functional tests', function () { }) client.composeObject(destObjConfig, sourcePartObjList).then((e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } else { @@ -3732,7 +4101,9 @@ describe('functional tests', function () { (done) => { if (isSplitSuccess) { client.statObject(composeObjectTestBucket, composedObjName, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } else { @@ -3896,7 +4267,9 @@ describe('functional tests', function () { `statObject(bucketName, objectName, cb)_bucketName:${bucketNameForSpCharObjects}, _objectName:${objectNameWithPrefix}`, (done) => { client.statObject(bucketNameForSpCharObjects, objectNameWithPrefix, (e) => { - if (e) return done(e) + if (e) { + return done(e) + } done() }) } @@ -3942,10 +4315,14 @@ describe('functional tests', function () { .listIncompleteUploads(spBucketName, spObjWithPrefix, true) .on('error', (e) => done(e)) .on('data', (data) => { - if (data.key === spObjWithPrefix) found = true + if (data.key === spObjWithPrefix) { + found = true + } }) .on('end', () => { - if (found) return done() + if (found) { + return done() + } done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) }) } @@ -3967,10 +4344,14 @@ describe('functional tests', function () { .on('error', (e) => done(e)) .on('data', (data) => { // check the prefix - if (data.prefix === specialCharPrefix) found = true + if (data.prefix === specialCharPrefix) { + found = true + } }) .on('end', () => { - if (found) return done() + if (found) { + return done() + } done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) }) } @@ -4073,8 +4454,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdWithVerBucket},versionConfig:{Status:"Enabled"} `, (done) => { client.setBucketVersioning(fdWithVerBucket, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -4130,7 +4515,9 @@ describe('functional tests', function () { .listObjects(fdWithVerBucket, '', true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() + if (_.isEqual(0, objVersionList.length)) { + return done() + } return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) }) .on('data', (data) => { @@ -4160,8 +4547,12 @@ describe('functional tests', function () { `setBucketVersioning(bucketName, versionConfig):_bucketName:${fdPrefixBucketName},versionConfig:{Status:"Enabled"} `, (done) => { client.setBucketVersioning(fdPrefixBucketName, { Status: 'Enabled' }, (err) => { - if (err && err.code === 'NotImplemented') return done() - if (err) return done(err) + if (err && err.code === 'NotImplemented') { + return done() + } + if (err) { + return done(err) + } isVersioningSupported = true done() }) @@ -4217,7 +4608,9 @@ describe('functional tests', function () { .listObjects(fdPrefixBucketName, '/my-prefix', true, { IncludeVersion: true }) .on('error', done) .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() + if (_.isEqual(0, objVersionList.length)) { + return done() + } return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) }) .on('data', (data) => { @@ -4270,7 +4663,9 @@ describe('functional tests', function () { .listObjects(versionedBucketName, '', true, {}) .on('error', done) .on('end', () => { - if (_.isEqual(0, objVersionList.length)) return done() + if (_.isEqual(0, objVersionList.length)) { + return done() + } return done(new Error(`listObjects lists ${objVersionList.length} objects, expected 0`)) }) .on('data', (data) => { @@ -4315,7 +4710,9 @@ describe('functional tests', function () { .listObjects(fdPrefixBucket, 'my-prefix', true, {}) .on('error', done) .on('end', () => { - if (_.isEqual(0, objList.length)) return done() + if (_.isEqual(0, objList.length)) { + return done() + } return done(new Error(`listObjects lists ${objList.length} objects, expected 0`)) }) .on('data', (data) => { From 887fd8f92750229584a6cc2b7c2c8e79f3bf5ebd Mon Sep 17 00:00:00 2001 From: Trim21 Date: Wed, 12 Apr 2023 17:13:49 +0800 Subject: [PATCH 13/23] exclude ci files from prettier --- .github/workflows/codeql-analysis.yml | 58 +++++++++++++-------------- .prettierignore | 1 + 2 files changed, 30 insertions(+), 29 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 17ec3212..6dfb4844 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -9,14 +9,14 @@ # the `language` matrix defined below to confirm you have the correct set of # supported CodeQL languages. # -name: 'CodeQL' +name: "CodeQL" on: push: - branches: [master, release] + branches: [ master, release ] pull_request: # The branches below must be a subset of the branches above - branches: [master] + branches: [ master ] schedule: - cron: '37 2 * * 4' @@ -32,39 +32,39 @@ jobs: strategy: fail-fast: false matrix: - language: ['javascript'] + language: [ 'javascript' ] # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] # Learn more about CodeQL language support at https://git.io/codeql-language-support steps: - - name: Checkout repository - uses: actions/checkout@v2 + - name: Checkout repository + uses: actions/checkout@v2 - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v1 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v1 + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 - # ℹī¸ Command-line programs to run using the OS shell. - # 📚 https://git.io/JvXDl + # ℹī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl - # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language + # ✏ī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language - #- run: | - # make bootstrap - # make release + #- run: | + # make bootstrap + # make release - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.prettierignore b/.prettierignore index a304e4f9..cfbd061a 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,3 +1,4 @@ /dist/ *.md /examples/ +/.github/workflows/ From 94e19e0f8a3872387ccf62ecb7958bdfc654e173 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Wed, 12 Apr 2023 17:17:52 +0800 Subject: [PATCH 14/23] ci: split lint/build ci --- .github/workflows/lint.yml | 39 ++++++++++++++++++++++++++++ .github/workflows/nodejs-windows.yml | 14 ++++++---- .github/workflows/nodejs.yml | 31 +++------------------- package.json | 2 +- 4 files changed, 52 insertions(+), 34 deletions(-) create mode 100644 .github/workflows/lint.yml diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml new file mode 100644 index 00000000..39dcae1d --- /dev/null +++ b/.github/workflows/lint.yml @@ -0,0 +1,39 @@ +name: CI - Lint/Build + +on: + push: + branches-ignore: + - dependabot/** + pull_request: + branches: + - master + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + cache: 'npm' + + - run: npm ci + + - run: npm run format-check + - run: npm run lint + + build: + name: Build on node lts + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '18.x' + cache: 'npm' + + - run: npm ci + + - run: npm run compile + - run: npm run browserify diff --git a/.github/workflows/nodejs-windows.yml b/.github/workflows/nodejs-windows.yml index ab525e04..c3aabf85 100644 --- a/.github/workflows/nodejs-windows.yml +++ b/.github/workflows/nodejs-windows.yml @@ -1,6 +1,9 @@ name: CI- Windows on: + push: + branches-ignore: + - dependabot/** pull_request: branches: - master @@ -15,11 +18,15 @@ jobs: node_version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] os: [windows-latest] steps: - - uses: actions/checkout@v1 + - uses: actions/checkout@v3 - name: Use Node.js ${{ matrix.node_version }} - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: node-version: ${{ matrix.node_version }} + cache: 'npm' + + - run: npm i + - name: Start MinIO Server -> Run Unit and Functional Tests ( install, lint, browserify, test) env: CI: true @@ -35,7 +42,4 @@ jobs: run: | Invoke-WebRequest -Uri https://dl.minio.io/server/minio/release/windows-amd64/minio.exe -OutFile $HOME/minio.exe Start-Process -NoNewWindow -FilePath "$HOME/minio.exe" -ArgumentList "-C", "$env:temp/minio-config", "server", "$env:temp/data{1...4}" - npm install - npm run lint - npm run browserify npm run test diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 80c1a2df..50d14a03 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -2,38 +2,13 @@ name: CI - Linux on: push: + branches-ignore: + - dependabot/** pull_request: branches: - master -jobs: - style: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: '18.x' - cache: 'npm' - - - run: npm ci - - - run: npm run format-check - - run: npm run lint - - build: - name: Build on node lts - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 - with: - node-version: '18.x' - cache: 'npm' - - - run: npm ci - - - run: npm run browserify +jobs: test: name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} diff --git a/package.json b/package.json index d0f24c2e..2b60da39 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "semi": false }, "lint-staged": { - "*.{js,cjs,mjs,ts,cts,mts,json,yaml,yml}": [ + "*.{js,cjs,mjs,ts,cts,mts,json}": [ "prettier --write" ], "src/**/*.{js,cjs,mjs,ts,cts,mts}": [ From 6490d6c4e95b94073ac926860b676dbb35bdc573 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Wed, 12 Apr 2023 17:18:22 +0800 Subject: [PATCH 15/23] ci step name --- .github/workflows/nodejs-windows.yml | 2 +- .github/workflows/nodejs.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/nodejs-windows.yml b/.github/workflows/nodejs-windows.yml index c3aabf85..81283693 100644 --- a/.github/workflows/nodejs-windows.yml +++ b/.github/workflows/nodejs-windows.yml @@ -27,7 +27,7 @@ jobs: - run: npm i - - name: Start MinIO Server -> Run Unit and Functional Tests ( install, lint, browserify, test) + - name: Start MinIO Server -> Run Unit and Functional Tests env: CI: true MINIO_CI_CD: true diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index 50d14a03..f85c289a 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -27,7 +27,7 @@ jobs: - run: npm i - - name: Start Server -> Run Unit and Functional Tests (test) + - name: Start Server -> Run Unit and Functional Tests env: CI: true MINIO_CI_CD: true From 69763bfbc9da571f12a5b6254aaa103a0d83ae4d Mon Sep 17 00:00:00 2001 From: Trim21 Date: Wed, 12 Apr 2023 20:35:09 +0800 Subject: [PATCH 16/23] set ci in windows in parallel 3 --- .github/workflows/nodejs-windows.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/nodejs-windows.yml b/.github/workflows/nodejs-windows.yml index 81283693..660fc006 100644 --- a/.github/workflows/nodejs-windows.yml +++ b/.github/workflows/nodejs-windows.yml @@ -13,7 +13,7 @@ jobs: name: Test on node ${{ matrix.node_version }} and ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: - max-parallel: 1 + max-parallel: 3 matrix: node_version: [12.x, 14.x, 16.x, 17.x, 18.x, 19.x] os: [windows-latest] From 4ca489c7b098216d870a7e58c5e5f839989d8027 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Wed, 12 Apr 2023 21:27:33 +0800 Subject: [PATCH 17/23] add 'no-template-curly-in-string' --- .eslintrc.js | 1 + src/main/minio.js | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 505edb7f..ccb93512 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -23,6 +23,7 @@ module.exports = { 'comma-dangle': 0, curly: ['error'], 'prefer-const': 0, + 'no-template-curly-in-string': 'error', // "quotes": ["error", "double"], 'comma-spacing': 0, // ["error", { before: false, after: true }], 'semi-spacing': 0, // ["warn", { before: false, after: true }], diff --git a/src/main/minio.js b/src/main/minio.js index a259bbab..04a9237a 100644 --- a/src/main/minio.js +++ b/src/main/minio.js @@ -138,7 +138,7 @@ export class Client { if (params.transport) { if (!isObject(params.transport)) { throw new errors.InvalidArgumentError( - 'Invalid transport type : ${params.transport}, expected to be type "object"' + `Invalid transport type : ${params.transport}, expected to be type "object"` ) } transport = params.transport @@ -2123,10 +2123,10 @@ export class Client { // * `expiry` _number_: expiry in seconds (optional, default 7 days) presignedPutObject(bucketName, objectName, expires, cb) { if (!isValidBucketName(bucketName)) { - throw new errors.InvalidBucketNameError('Invalid bucket name: ${bucketName}') + throw new errors.InvalidBucketNameError(`Invalid bucket name: ${bucketName}`) } if (!isValidObjectName(objectName)) { - throw new errors.InvalidObjectNameError('Invalid object name: ${objectName}') + throw new errors.InvalidObjectNameError(`Invalid object name: ${objectName}`) } return this.presignedUrl('PUT', bucketName, objectName, expires, cb) } From 152da408b1d0440cd0d60064ff2cda3920902bc9 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Fri, 14 Apr 2023 06:57:30 +0800 Subject: [PATCH 18/23] format examples --- .eslintrc.js | 2 +- .prettierignore | 1 - examples/bucket-exists.js | 11 +- examples/compose-object-test-example.js | 113 +++++++++---------- examples/compose-object.js | 65 ++++++----- examples/copy-object.js | 29 +++-- examples/fget-object.js | 22 ++-- examples/fput-object.js | 16 +-- examples/get-bucket-encryption.js | 7 +- examples/get-bucket-lifecycle.js | 9 +- examples/get-bucket-notification.js | 12 +- examples/get-bucket-policy.js | 6 +- examples/get-bucket-replication.js | 4 +- examples/get-bucket-tagging.js | 10 +- examples/get-bucket-versioning.js | 9 +- examples/get-object-legal-hold.js | 20 ++-- examples/get-object-lock-config.js | 7 +- examples/get-object-retention.js | 22 ++-- examples/get-object-tagging.js | 14 +-- examples/get-object.html | 14 +-- examples/get-object.js | 43 +++---- examples/get-partialobject.js | 21 ++-- examples/list-buckets.js | 4 +- examples/list-incomplete-uploads.js | 14 +-- examples/list-objects-v2-with-metadata.js | 28 +++-- examples/list-objects-v2.js | 12 +- examples/list-objects.js | 27 ++--- examples/make-bucket.js | 10 +- examples/minio/listen-bucket-notification.js | 15 ++- examples/presigned-getobject-request-date.js | 25 ++-- examples/presigned-getobject.js | 8 +- examples/presigned-postpolicy.js | 18 +-- examples/presigned-putobject.js | 8 +- examples/put-object-retention.js | 26 +++-- examples/put-object.js | 26 ++--- examples/remove-all-bucket-notification.js | 12 +- examples/remove-bucket-encryption.js | 9 +- examples/remove-bucket-lifecycle.js | 6 +- examples/remove-bucket-replication.js | 6 +- examples/remove-bucket-tagging.js | 9 +- examples/remove-bucket.js | 10 +- examples/remove-incomplete-upload.js | 11 +- examples/remove-object-tagging.js | 13 +-- examples/remove-object.js | 32 +++--- examples/remove-objects.js | 27 ++--- examples/reset-object-lock-config.js | 6 +- examples/select-object-content.js | 24 ++-- examples/set-accelerate-end-point.js | 10 +- examples/set-bucket-encryption.js | 42 ++++--- examples/set-bucket-lifecycle.js | 60 +++++----- examples/set-bucket-notification.js | 14 +-- examples/set-bucket-policy.js | 6 +- examples/set-bucket-replication.js | 39 +++---- examples/set-bucket-tagging.js | 11 +- examples/set-bucket-versioning.js | 11 +- examples/set-object-legal-hold.js | 19 ++-- examples/set-object-lock-config.js | 10 +- examples/set-object-tagging.js | 15 ++- examples/stat-object.js | 7 +- 59 files changed, 539 insertions(+), 548 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index ccb93512..8f068162 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -4,7 +4,7 @@ module.exports = { mocha: true, es6: true, }, - ignorePatterns: ['src/test/*.*'], + ignorePatterns: ['src/test/*.*', 'examples/**/*'], overrides: [], extends: [ 'eslint:recommended', diff --git a/.prettierignore b/.prettierignore index cfbd061a..001f7907 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,4 +1,3 @@ /dist/ *.md -/examples/ /.github/workflows/ diff --git a/examples/bucket-exists.js b/examples/bucket-exists.js index e9f8c39d..09393eeb 100644 --- a/examples/bucket-exists.js +++ b/examples/bucket-exists.js @@ -14,23 +14,22 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. - +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.bucketExists('my-bucketname', function(err, exists) { +s3Client.bucketExists('my-bucketname', function (err, exists) { if (err) { return console.log(err) } if (exists) { - console.log("Bucket exists.") + console.log('Bucket exists.') } }) diff --git a/examples/compose-object-test-example.js b/examples/compose-object-test-example.js index cc439b6f..7d1d2de6 100644 --- a/examples/compose-object-test-example.js +++ b/examples/compose-object-test-example.js @@ -17,28 +17,25 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. const os = require('os') -const splitFile = require("split-file") +const splitFile = require('split-file') const fs = require('fs') -var Minio = require("../dist/main/minio") -var Helpers = require("../dist/main/helpers") - +var Minio = require('minio') +var Helpers = require('../dist/main/helpers') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) const oneMB = 1024 * 1024 - // Create a bucket prior to running: mc mb local/source-bucket function sampleRunComposeObject() { var tmpDir = os.tmpdir() - - const bucketName = "source-bucket" + const bucketName = 'source-bucket' // generate 100 MB buffer and write to a file. var local100mbFileToBeSplitAndComposed = Buffer.alloc(100 * oneMB, 0) @@ -47,94 +44,94 @@ function sampleRunComposeObject() { var fileToSplit = `${tmpSubDir}/${composedObjName}` let partObjNameList = [] - fs.mkdir(tmpSubDir, { recursive: true }, function(err) { + fs.mkdir(tmpSubDir, { recursive: true }, function (err) { if (err) { console.log(err) } else { - console.log("New Temp directory successfully created.") + console.log('New Temp directory successfully created.') } }) - try { fs.writeFileSync(fileToSplit, local100mbFileToBeSplitAndComposed) - console.log("Written 100 MB File ") + console.log('Written 100 MB File ') // 100 MB split into 26 MB part size. ( just to test unequal parts ). But change as required. - splitFile.splitFileBySize(fileToSplit, (26 * oneMB)) + splitFile + .splitFileBySize(fileToSplit, 26 * oneMB) .then((names) => { - console.log("Split and write 100 MB File(s) ", names) + console.log('Split and write 100 MB File(s) ', names) const putPartRequests = names.map((partFileName) => { - const partObjName = partFileName.slice((tmpSubDir + "/").length) + const partObjName = partFileName.slice((tmpSubDir + '/').length) partObjNameList.push(partObjName) return s3Client.fPutObject(bucketName, partObjName, partFileName, {}) }) - Promise.all(putPartRequests).then(() => { - console.log("Uploaded part Files: ", names) - const sourcePartObjList = partObjNameList.map((partObjName) => { - return new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: partObjName + Promise.all(putPartRequests) + .then(() => { + console.log('Uploaded part Files: ', names) + const sourcePartObjList = partObjNameList.map((partObjName) => { + return new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: partObjName, + }) }) - }) - const destObjConfig = new Helpers.CopyDestinationOptions({ - Bucket: bucketName, - Object: composedObjName - }) + const destObjConfig = new Helpers.CopyDestinationOptions({ + Bucket: bucketName, + Object: composedObjName, + }) - s3Client.composeObject(destObjConfig, sourcePartObjList).then(() => { - console.log("Composed to a single file: ", composedObjName) + s3Client + .composeObject(destObjConfig, sourcePartObjList) + .then(() => { + console.log('Composed to a single file: ', composedObjName) - /** Begin Clean up ***/ - // To verify that the parts are uploaded properly, comment the below code blocks and verify - const sourcePartObjList = partObjNameList.map((partObjName) => { - return s3Client.removeObject(bucketName, partObjName) - }) + /** Begin Clean up ***/ + // To verify that the parts are uploaded properly, comment the below code blocks and verify + const sourcePartObjList = partObjNameList.map((partObjName) => { + return s3Client.removeObject(bucketName, partObjName) + }) - Promise.all(sourcePartObjList).then(() => { - console.log("Removed source parts: ") + Promise.all(sourcePartObjList) + .then(() => { + console.log('Removed source parts: ') - // Uncomment to remove the composed object itself. commented for verification. - /* + // Uncomment to remove the composed object itself. commented for verification. + /* s3Client.removeObject(bucketName, composedObjName).then(()=>{ console.log("Clean up: Removed the composed Object ") }).catch(()=>{ console.log("Error removing composed object", er) }) */ + }) + .catch((er) => { + console.log('Error removing parts used in composing', er) + }) - }).catch(er => { - console.log("Error removing parts used in composing", er) - }) - - /** End Clean up **/ - - // Clean up generated parts locally - Helpers.removeDirAndFiles(tmpSubDir) - console.log("Clean up temp parts directory : ") + /** End Clean up **/ - }).catch((e) => { - console.log("Error Composing parts into an object", e) + // Clean up generated parts locally + Helpers.removeDirAndFiles(tmpSubDir) + console.log('Clean up temp parts directory : ') + }) + .catch((e) => { + console.log('Error Composing parts into an object', e) + }) + }) + .catch((e) => { + console.log('Error Uploading parts ', e) }) - - }).catch(e => { - console.log("Error Uploading parts ", e) - }) - - }) .catch((e) => { // this is a client error not related to compose object - console.log("Error Splitting files into parts ", e) + console.log('Error Splitting files into parts ', e) }) } catch (err) { // this is a client error not related to compose object - console.log("Error Creating local files ", err) + console.log('Error Creating local files ', err) } - - } sampleRunComposeObject() diff --git a/examples/compose-object.js b/examples/compose-object.js index 0704df73..dda91807 100644 --- a/examples/compose-object.js +++ b/examples/compose-object.js @@ -17,39 +17,42 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. -var Minio = require("../dist/main/minio") -var Helpers = require("../dist/main/helpers") - +var Minio = require('minio') +var Helpers = require('../dist/main/helpers') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -const bucketName = "source-bucket" +const bucketName = 'source-bucket' -const sourceList = [new Helpers.CopySourceOptions( { - Bucket: bucketName, - Object: "parta", - // other options if any. -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partb", - // other options if any. - // VersionID:"" -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partc", - -}),new Helpers.CopySourceOptions({ - Bucket: bucketName, - Object: "partd", -})] +const sourceList = [ + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: 'parta', + // other options if any. + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: 'partb', + // other options if any. + // VersionID:"" + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: 'partc', + }), + new Helpers.CopySourceOptions({ + Bucket: bucketName, + Object: 'partd', + }), +] const destOption = new Helpers.CopyDestinationOptions({ - Bucket: bucketName, - Object: "100MB.zip", + Bucket: bucketName, + Object: '100MB.zip', /** Other possible options */ /* Encryption:{ type:Helpers.ENCRYPTION_TYPES.KMS, @@ -65,11 +68,11 @@ const destOption = new Helpers.CopyDestinationOptions({ */ }) - -const composePromise = s3Client.composeObject(destOption,sourceList) -composePromise.then((result) => { - console.log("ComposeObject Success..." , result) -}) - .catch((e)=>{ - console.log("composeObject Promise Error",e) +const composePromise = s3Client.composeObject(destOption, sourceList) +composePromise + .then((result) => { + console.log('ComposeObject Success...', result) + }) + .catch((e) => { + console.log('composeObject Promise Error', e) }) diff --git a/examples/copy-object.js b/examples/copy-object.js index 4972d5e1..1a4e76bb 100644 --- a/examples/copy-object.js +++ b/examples/copy-object.js @@ -14,26 +14,31 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname, my-objectname, - // my-src-bucketname and my-src-objectname are dummy values, please replace - // them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname, my-objectname, +// my-src-bucketname and my-src-objectname are dummy values, please replace +// them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' -}) + secretKey: 'YOUR-SECRETACCESSKEY', +}) var conds = new Minio.CopyConditions() conds.setMatchETag('bd891862ea3e22c93ed53a098218791d') -s3Client.copyObject('my-bucketname', 'my-objectname', '/my-src-bucketname/my-src-objectname', conds, function(e, data) { - if (e) { - return console.log(e) +s3Client.copyObject( + 'my-bucketname', + 'my-objectname', + '/my-src-bucketname/my-src-objectname', + conds, + function (e, data) { + if (e) { + return console.log(e) + } + console.log('Successfully copied the object:') + console.log('etag = ' + data.etag + ', lastModified = ' + data.lastModified) } - console.log("Successfully copied the object:") - console.log("etag = " + data.etag + ", lastModified = " + data.lastModified) -}) - +) diff --git a/examples/fget-object.js b/examples/fget-object.js index 77e71b36..b9cd4d70 100644 --- a/examples/fget-object.js +++ b/examples/fget-object.js @@ -22,21 +22,27 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Get a full object. -s3Client.fGetObject('my-bucketname', 'my-objectname', '/tmp/objfile', function(e) { +s3Client.fGetObject('my-bucketname', 'my-objectname', '/tmp/objfile', function (e) { if (e) { return console.log(e) } console.log('done') }) -//To get a specific version of an object -s3Client.fGetObject('my-bucketname', 'my-objectname', '/tmp/objfile', {versionId:"03fd1247-90d9-4b71-a27e-209d484a234b"}, function(e) { - if (e) { - return console.log(e) +//To get a specific version of an object +s3Client.fGetObject( + 'my-bucketname', + 'my-objectname', + '/tmp/objfile', + { versionId: '03fd1247-90d9-4b71-a27e-209d484a234b' }, + function (e) { + if (e) { + return console.log(e) + } + console.log('success') } - console.log('success') -}) +) diff --git a/examples/fput-object.js b/examples/fput-object.js index a4f50597..bf1d52ff 100644 --- a/examples/fput-object.js +++ b/examples/fput-object.js @@ -14,8 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname - // and my-objectname are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname +// and my-objectname are dummy values, please replace them with original values. var Minio = require('minio') var Fs = require('fs') @@ -23,30 +23,30 @@ var Fs = require('fs') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) var metaData = { 'Content-Type': 'application/octet-stream', 'X-Amz-Meta-Testing': 1234, - 'example': 5678 + example: 5678, } // Put a file in bucket my-bucketname. var file = 'my-testfile' -s3Client.fPutObject('my-bucketname', 'my-objectname', file, metaData, function(e) { +s3Client.fPutObject('my-bucketname', 'my-objectname', file, metaData, function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) // Put a file in bucket my-bucketname with content-type detected automatically. // In this case it is `text/plain`. var file = 'my-testfile.txt' -s3Client.fPutObject('my-bucketname', 'my-objectname', file, function(e) { +s3Client.fPutObject('my-bucketname', 'my-objectname', file, function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) diff --git a/examples/get-bucket-encryption.js b/examples/get-bucket-encryption.js index d3db82c7..cce93891 100644 --- a/examples/get-bucket-encryption.js +++ b/examples/get-bucket-encryption.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.getBucketEncryption("my-bucket", function (error, enConfig){ +s3Client.getBucketEncryption('my-bucket', function (error, enConfig) { if (error) { return console.log(error) } console.log(enConfig) -}) \ No newline at end of file +}) diff --git a/examples/get-bucket-lifecycle.js b/examples/get-bucket-lifecycle.js index 6dd16413..cbb891ca 100644 --- a/examples/get-bucket-lifecycle.js +++ b/examples/get-bucket-lifecycle.js @@ -22,14 +22,13 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -s3Client.getBucketLifecycle('my-bucketname', function (err,res){ +s3Client.getBucketLifecycle('my-bucketname', function (err, res) { if (err) { return console.log(err) } console.log(res) - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/get-bucket-notification.js b/examples/get-bucket-notification.js index dc36001d..205c1d1c 100644 --- a/examples/get-bucket-notification.js +++ b/examples/get-bucket-notification.js @@ -14,23 +14,21 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. - +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.getBucketNotification('my-bucketname', function(e, bucketNotification) { +s3Client.getBucketNotification('my-bucketname', function (e, bucketNotification) { if (e) { return console.log(e) } console.log(bucketNotification) - console.log("True") + console.log('True') }) - diff --git a/examples/get-bucket-policy.js b/examples/get-bucket-policy.js index 6e2a8027..2f0c3412 100644 --- a/examples/get-bucket-policy.js +++ b/examples/get-bucket-policy.js @@ -22,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Retrieves the bucket policy and logs it to the console. s3Client.getBucketPolicy('testbucket', (err, policy) => { - if (err) throw err + if (err) throw err - console.log(`Bucket policy: ${policy}`) + console.log(`Bucket policy: ${policy}`) }) diff --git a/examples/get-bucket-replication.js b/examples/get-bucket-replication.js index 3e37a595..59fe65fe 100644 --- a/examples/get-bucket-replication.js +++ b/examples/get-bucket-replication.js @@ -22,10 +22,10 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.getBucketReplication('bucketname', function (err, replicationConfig){ +s3Client.getBucketReplication('bucketname', function (err, replicationConfig) { if (err) { return console.log(err) } diff --git a/examples/get-bucket-tagging.js b/examples/get-bucket-tagging.js index bb03e273..3b367a1b 100644 --- a/examples/get-bucket-tagging.js +++ b/examples/get-bucket-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,13 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -s3Client.getBucketTagging('bucketname', function (err, tagsList){ +s3Client.getBucketTagging('bucketname', function (err, tagsList) { if (err) { return console.log(err) } - console.log("Success", tagsList) -}) \ No newline at end of file + console.log('Success', tagsList) +}) diff --git a/examples/get-bucket-versioning.js b/examples/get-bucket-versioning.js index 41240ede..ad92d46d 100644 --- a/examples/get-bucket-versioning.js +++ b/examples/get-bucket-versioning.js @@ -22,14 +22,13 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -s3Client.getBucketVersioning('my-bucketname', function (err,res){ +s3Client.getBucketVersioning('my-bucketname', function (err, res) { if (err) { return console.log(err) } console.log(res) - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/get-object-legal-hold.js b/examples/get-object-legal-hold.js index 1e42a14b..5644f926 100644 --- a/examples/get-object-legal-hold.js +++ b/examples/get-object-legal-hold.js @@ -22,11 +22,11 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) //Get Legalhold config -s3Client.getObjectLegalHold('bucketName', 'objectName', {}, function(err, res) { +s3Client.getObjectLegalHold('bucketName', 'objectName', {}, function (err, res) { if (err) { return console.log('Unable to get legal hold config for the object', err.message) // Print only the message. } @@ -34,7 +34,7 @@ s3Client.getObjectLegalHold('bucketName', 'objectName', {}, function(err, res) { }) //With versionId -s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId:'my-obj-version-uuid' }, function(err, res) { +s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId: 'my-obj-version-uuid' }, function (err, res) { if (err) { return console.log('Unable to get legal hold config for the object', err.message) // Print only the message. } @@ -42,13 +42,15 @@ s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId:'my-obj-vers }) //Promise based version: -const objectLegalHoldPromise = s3Client.getObjectLegalHold('bucketName', 'objectName', { versionId:'my-obj-version-uuid' }) -objectLegalHoldPromise.then((data) => { - console.log("Success...", data) +const objectLegalHoldPromise = s3Client.getObjectLegalHold('bucketName', 'objectName', { + versionId: 'my-obj-version-uuid', }) - .catch((e)=>{ +objectLegalHoldPromise + .then((data) => { + console.log('Success...', data) + }) + .catch((e) => { // Print only the error message. if called on an object without object lock config. // e.g: "The specified object does not have a ObjectLock configuration" - console.log(e.message) - + console.log(e.message) }) diff --git a/examples/get-object-lock-config.js b/examples/get-object-lock-config.js index 7c18cd26..42e044b9 100644 --- a/examples/get-object-lock-config.js +++ b/examples/get-object-lock-config.js @@ -22,13 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -s3Client.getObjectLockConfig('my-bucketname', function (err,lockConfig){ +s3Client.getObjectLockConfig('my-bucketname', function (err, lockConfig) { if (err) { return console.log(err) } console.log(lockConfig) -}) \ No newline at end of file +}) diff --git a/examples/get-object-retention.js b/examples/get-object-retention.js index dc9909b3..81a96a53 100644 --- a/examples/get-object-retention.js +++ b/examples/get-object-retention.js @@ -22,19 +22,19 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - const bucketName = 'my-bucket' -const objectName ="my-object" +const objectName = 'my-object' -const versionId ="my-versionId" +const versionId = 'my-versionId' -const objRetPromise = s3Client.getObjectRetention(bucketName, objectName, {versionId:versionId} ) -objRetPromise.then((data) => { - console.log("Success", data) -}) - .catch((e)=>{ - console.log(" Error",e) - }) \ No newline at end of file +const objRetPromise = s3Client.getObjectRetention(bucketName, objectName, { versionId: versionId }) +objRetPromise + .then((data) => { + console.log('Success', data) + }) + .catch((e) => { + console.log(' Error', e) + }) diff --git a/examples/get-object-tagging.js b/examples/get-object-tagging.js index bc52ce74..3dbd5655 100644 --- a/examples/get-object-tagging.js +++ b/examples/get-object-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,22 +22,21 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -s3Client.getObjectTagging('bucketname', "objectName", function (err, tagsList){ +s3Client.getObjectTagging('bucketname', 'objectName', function (err, tagsList) { if (err) { return console.log(err) } - console.log("Success",tagsList) + console.log('Success', tagsList) }) //Get tags on a version of an object. -s3Client.getObjectTagging('bucketname', "objectName", { versionId: "" }, function (err, tagsList){ +s3Client.getObjectTagging('bucketname', 'objectName', { versionId: '' }, function (err, tagsList) { if (err) { return console.log(err) } - console.log("Success",tagsList) -}) \ No newline at end of file + console.log('Success', tagsList) +}) diff --git a/examples/get-object.html b/examples/get-object.html index 9740a7c6..c809f947 100644 --- a/examples/get-object.html +++ b/examples/get-object.html @@ -1,4 +1,4 @@ - + @@ -6,22 +6,22 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) var size = 0 // Get a full object. - s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { + s3Client.getObject('my-bucketname', 'my-objectname', function (e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function(chunk) { + dataStream.on('data', function (chunk) { size += chunk.length }) - dataStream.on('end', function() { - console.log("End. Total size = " + size) + dataStream.on('end', function () { + console.log('End. Total size = ' + size) }) - dataStream.on('error', function(e) { + dataStream.on('error', function (e) { console.log(e) }) }) diff --git a/examples/get-object.js b/examples/get-object.js index 7945148f..aba5a2f6 100644 --- a/examples/get-object.js +++ b/examples/get-object.js @@ -22,39 +22,44 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) var size = 0 // Get a full object. -s3Client.getObject('my-bucketname', 'my-objectname', function(e, dataStream) { +s3Client.getObject('my-bucketname', 'my-objectname', function (e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function(chunk) { + dataStream.on('data', function (chunk) { size += chunk.length }) - dataStream.on('end', function() { - console.log("End. Total size = " + size) + dataStream.on('end', function () { + console.log('End. Total size = ' + size) }) - dataStream.on('error', function(e) { + dataStream.on('error', function (e) { console.log(e) }) }) //Get a specific version of an object var versionedObjSize = 0 -s3Client.getObject('my-versioned-bucket', 'my-versioned-object', {versionId:"my-versionId"}, function(err, dataStream) { - if (err) { - return console.log(err) +s3Client.getObject( + 'my-versioned-bucket', + 'my-versioned-object', + { versionId: 'my-versionId' }, + function (err, dataStream) { + if (err) { + return console.log(err) + } + dataStream.on('data', function (chunk) { + versionedObjSize += chunk.length + }) + dataStream.on('end', function () { + console.log('End. Total size = ' + versionedObjSize) + }) + dataStream.on('error', function (err) { + console.log(err) + }) } - dataStream.on('data', function(chunk) { - versionedObjSize += chunk.length - }) - dataStream.on('end', function() { - console.log('End. Total size = ' + versionedObjSize) - }) - dataStream.on('error', function(err) { - console.log(err) - }) -}) +) diff --git a/examples/get-partialobject.js b/examples/get-partialobject.js index 8b7d46ab..b06ea314 100644 --- a/examples/get-partialobject.js +++ b/examples/get-partialobject.js @@ -17,45 +17,44 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. - var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Download the object my-objectname at an offset 1024, for a total of 4096 bytes. var size = 0 -s3Client.getPartialObject('my-bucketname', 'my-objectname', 1024, 4096, function(e, dataStream) { +s3Client.getPartialObject('my-bucketname', 'my-objectname', 1024, 4096, function (e, dataStream) { if (e) { return console.log(e) } - dataStream.on('data', function(chunk) { + dataStream.on('data', function (chunk) { size += chunk.length }) - dataStream.on('end', function() { - console.log("End. Total size = " + size) + dataStream.on('end', function () { + console.log('End. Total size = ' + size) }) - dataStream.on('error', function(e) { + dataStream.on('error', function (e) { console.log(e) }) }) var versionedObjSize = 0 // reads 30 bytes from the offset 10. -s3Client.getPartialObject('mybucket', 'photo.jpg', 10, 30, {versionId:"my-versionId"},function(err, dataStream) { +s3Client.getPartialObject('mybucket', 'photo.jpg', 10, 30, { versionId: 'my-versionId' }, function (err, dataStream) { if (err) { return console.log(err) } - dataStream.on('data', function(chunk) { + dataStream.on('data', function (chunk) { versionedObjSize += chunk.length }) - dataStream.on('end', function() { + dataStream.on('end', function () { console.log('End. Total size = ' + versionedObjSize) }) - dataStream.on('error', function(err) { + dataStream.on('error', function (err) { console.log(err) }) }) diff --git a/examples/list-buckets.js b/examples/list-buckets.js index 1d2b80c1..bf57ee01 100644 --- a/examples/list-buckets.js +++ b/examples/list-buckets.js @@ -22,10 +22,10 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.listBuckets(function(e, buckets) { +s3Client.listBuckets(function (e, buckets) { if (e) return console.log(e) console.log('buckets :', buckets) }) diff --git a/examples/list-incomplete-uploads.js b/examples/list-incomplete-uploads.js index f90e7a92..6b4763e4 100644 --- a/examples/list-incomplete-uploads.js +++ b/examples/list-incomplete-uploads.js @@ -14,22 +14,22 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-prefixname - // are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-prefixname +// are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + endPoint: 's3.amazonaws.com', + accessKey: 'YOUR-ACCESSKEYID', + secretKey: 'YOUR-SECRETACCESSKEY', }) // List all object paths in bucket my-bucketname that begins with my-prefixname. var incompleteObjectsStream = s3Client.listIncompleteUploads('my-bucketname', 'my-prefixname', true) -incompleteObjectsStream.on('data', function(obj) { +incompleteObjectsStream.on('data', function (obj) { console.log(obj) }) -incompleteObjectsStream.on('error', function(e) { +incompleteObjectsStream.on('error', function (e) { console.log(e) }) diff --git a/examples/list-objects-v2-with-metadata.js b/examples/list-objects-v2-with-metadata.js index b208dfa0..6b8733cb 100644 --- a/examples/list-objects-v2-with-metadata.js +++ b/examples/list-objects-v2-with-metadata.js @@ -14,23 +14,21 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. - - var Minio = require('minio') +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. - var s3Client = new Minio.Client({ - endPoint: 's3.amazonaws.com', - accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' - }) - // List all object paths in bucket my-bucketname. - var objectsStream = s3Client.extensions.listObjectsV2WithMetadata('my-bucketname', '', true,''); - objectsStream.on('data', function(obj) { +var Minio = require('minio') + +var s3Client = new Minio.Client({ + endPoint: 's3.amazonaws.com', + accessKey: 'YOUR-ACCESSKEYID', + secretKey: 'YOUR-SECRETACCESSKEY', +}) +// List all object paths in bucket my-bucketname. +var objectsStream = s3Client.extensions.listObjectsV2WithMetadata('my-bucketname', '', true, '') +objectsStream.on('data', function (obj) { console.log(obj) }) -objectsStream.on('error', function(e) { +objectsStream.on('error', function (e) { console.log(e) }) - - diff --git a/examples/list-objects-v2.js b/examples/list-objects-v2.js index a7347b78..4e368e04 100644 --- a/examples/list-objects-v2.js +++ b/examples/list-objects-v2.js @@ -14,21 +14,21 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // List all object paths in bucket my-bucketname. -var objectsStream = s3Client.listObjectsV2('my-bucketname', '', true,'') -objectsStream.on('data', function(obj) { +var objectsStream = s3Client.listObjectsV2('my-bucketname', '', true, '') +objectsStream.on('data', function (obj) { console.log(obj) }) -objectsStream.on('error', function(e) { +objectsStream.on('error', function (e) { console.log(e) }) diff --git a/examples/list-objects.js b/examples/list-objects.js index 57c17e1b..3d9cac6a 100644 --- a/examples/list-objects.js +++ b/examples/list-objects.js @@ -22,45 +22,42 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // List all object paths in bucket my-bucketname. var objectsStream = s3Client.listObjects('my-bucketname', '', true) -objectsStream.on('data', function(obj) { +objectsStream.on('data', function (obj) { console.log(obj) }) -objectsStream.on('error', function(e) { +objectsStream.on('error', function (e) { console.log(e) }) - // List all object versions in bucket my-bucketname. -var objectsStreamWithVersions = s3Client.listObjects('my-bucketname', '', true, {IncludeVersion:true}) -objectsStreamWithVersions.on('data', function(obj) { +var objectsStreamWithVersions = s3Client.listObjects('my-bucketname', '', true, { IncludeVersion: true }) +objectsStreamWithVersions.on('data', function (obj) { console.log(obj) }) -objectsStreamWithVersions.on('error', function(e) { +objectsStreamWithVersions.on('error', function (e) { console.log(e) }) - // Example to list only the prefixes of a bucket. //Non versioned bucket with Prefix listing. function listPrefixesOfABucket(buckName) { - var objectsStream=s3Client.listObjects(buckName, '', false , {}) + var objectsStream = s3Client.listObjects(buckName, '', false, {}) var counter = 0 objectsStream.on('data', function (obj) { - if(obj.prefix) { + if (obj.prefix) { counter += 1 } }) - objectsStream.on('end',()=>{ - console.log("Non Versioned Prefix Count:", counter) + objectsStream.on('end', () => { + console.log('Non Versioned Prefix Count:', counter) }) objectsStream.on('error', function (e) { - console.log("::Error:",e) + console.log('::Error:', e) }) - } -listPrefixesOfABucket('your-bucket') \ No newline at end of file +listPrefixesOfABucket('your-bucket') diff --git a/examples/make-bucket.js b/examples/make-bucket.js index a610b250..c91a6114 100644 --- a/examples/make-bucket.js +++ b/examples/make-bucket.js @@ -22,18 +22,18 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Create a bucket name my-bucketname. -s3Client.makeBucket('my-bucketname', 'us-west-1', function(e) { +s3Client.makeBucket('my-bucketname', 'us-west-1', function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) // Create a bucket with object locking enabled. -s3Client.makeBucket('mybucket', 'us-east-1', { ObjectLocking:true }, function(err) { +s3Client.makeBucket('mybucket', 'us-east-1', { ObjectLocking: true }, function (err) { if (err) return console.log('Error creating bucket with lock .', err) console.log('Bucket created successfully in "us-east-1" and enabled object lock') -}) \ No newline at end of file +}) diff --git a/examples/minio/listen-bucket-notification.js b/examples/minio/listen-bucket-notification.js index 7d09bba8..df53bdbf 100644 --- a/examples/minio/listen-bucket-notification.js +++ b/examples/minio/listen-bucket-notification.js @@ -22,7 +22,7 @@ const Minio = require('../') var s3Client = new Minio.Client({ endPoint: '...', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Start listening for notifications on the bucket, using our arn. @@ -46,16 +46,15 @@ let poller = s3Client.listenBucketNotification('bucket1', 'photos/', '.jpg', ['s // ownerIdentity: [Object], // arn: 'arn:aws:s3:::bucket1' }, // object: { key: 'photos%2Fobject.jpg', size: 10, sequencer: '...' } } } -poller.on('notification', record => { - console.log('New object: %s/%s (size: %d)', record.s3.bucket.name, - record.s3.object.key, record.s3.object.size) +poller.on('notification', (record) => { + console.log('New object: %s/%s (size: %d)', record.s3.bucket.name, record.s3.object.key, record.s3.object.size) - // Now that we've received our notification, we can cancel the listener. - // We could leave it open if we wanted to continue to receive notifications. - poller.stop() + // Now that we've received our notification, we can cancel the listener. + // We could leave it open if we wanted to continue to receive notifications. + poller.stop() }) // Create an object - this should trigger a notification. s3Client.putObject('bucket1', 'file.jpg', 'stringdata', (err, etag) => { - if (err) throw err + if (err) throw err }) diff --git a/examples/presigned-getobject-request-date.js b/examples/presigned-getobject-request-date.js index 82dd818c..dea7c00e 100644 --- a/examples/presigned-getobject-request-date.js +++ b/examples/presigned-getobject-request-date.js @@ -15,7 +15,7 @@ */ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname -// are dummy values, please replace them with original values. +// are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,21 +23,28 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true // Default is true. + useSSL: true, // Default is true. }) // Presigned get object URL for my-objectname at my-bucketname, it expires in 7 days by default. var requestDate = new Date() -requestDate.setHours(0,0,0,0) +requestDate.setHours(0, 0, 0, 0) -requestDate.setHours(0,0,0,0) -s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {}, requestDate, function(e, presignedUrl) { +requestDate.setHours(0, 0, 0, 0) +s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {}, requestDate, function (e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) // Versioning support -s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, {versionId:"10fa9946-3f64-4137-a58f-888065c0732e"},requestDate, function(e, presignedUrl) { - if (e) return console.log(e) - console.log(presignedUrl) -}) \ No newline at end of file +s3Client.presignedGetObject( + 'my-bucketname', + 'my-objectname', + 1000, + { versionId: '10fa9946-3f64-4137-a58f-888065c0732e' }, + requestDate, + function (e, presignedUrl) { + if (e) return console.log(e) + console.log(presignedUrl) + } +) diff --git a/examples/presigned-getobject.js b/examples/presigned-getobject.js index 4eca964e..e9b33841 100644 --- a/examples/presigned-getobject.js +++ b/examples/presigned-getobject.js @@ -14,8 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname - // are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname +// are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,11 +23,11 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true // Default is true. + useSSL: true, // Default is true. }) // Presigned get object URL for my-objectname at my-bucketname, it expires in 7 days by default. -var presignedUrl = s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) { +var presignedUrl = s3Client.presignedGetObject('my-bucketname', 'my-objectname', 1000, function (e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) diff --git a/examples/presigned-postpolicy.js b/examples/presigned-postpolicy.js index 7e56df4b..21c85b67 100644 --- a/examples/presigned-postpolicy.js +++ b/examples/presigned-postpolicy.js @@ -14,8 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-objectname and my-bucketname - // are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-objectname and my-bucketname +// are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,31 +23,31 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true // Default is true. + useSSL: true, // Default is true. }) // Construct a new postPolicy. var policy = s3Client.newPostPolicy() // Set the object name my-objectname. -policy.setKey("my-objectname") +policy.setKey('my-objectname') // Set the bucket to my-bucketname. -policy.setBucket("my-bucketname") +policy.setBucket('my-bucketname') -var expires = new Date +var expires = new Date() expires.setSeconds(24 * 60 * 60 * 10) //10 days policy.setExpires(expires) -policy.setContentLengthRange(1024, 1024*1024) // Min upload length is 1KB Max upload size is 1MB +policy.setContentLengthRange(1024, 1024 * 1024) // Min upload length is 1KB Max upload size is 1MB policy.setContentType('text/plain') policy.setContentDisposition('attachment; filename=text.txt') policy.setUserMetaData({ - key: 'value' + key: 'value', }) -s3Client.presignedPostPolicy(policy, function(e, data) { +s3Client.presignedPostPolicy(policy, function (e, data) { if (e) return console.log(e) var curl = [] curl.push(`curl ${data.postURL}`) diff --git a/examples/presigned-putobject.js b/examples/presigned-putobject.js index 9e6a7794..4b85884e 100644 --- a/examples/presigned-putobject.js +++ b/examples/presigned-putobject.js @@ -14,8 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname - // are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname +// are dummy values, please replace them with original values. var Minio = require('minio') @@ -23,10 +23,10 @@ var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', secretKey: 'YOUR-SECRETACCESSKEY', - useSSL: true // Default is true. + useSSL: true, // Default is true. }) -var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function(e, presignedUrl) { +var presignedUrl = s3Client.presignedPutObject('my-bucketname', 'my-objectname', 1000, function (e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) }) diff --git a/examples/put-object-retention.js b/examples/put-object-retention.js index f8d47350..55f6d920 100644 --- a/examples/put-object-retention.js +++ b/examples/put-object-retention.js @@ -22,22 +22,26 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - const bucketName = 'my-bucket' -const objectName ="my-object" +const objectName = 'my-object' const expirationDate = new Date() expirationDate.setDate(expirationDate.getDate() + 1) -expirationDate.setUTCHours(0,0,0,0)//Should be start of the day.(midnight) -const versionId ="my-versionId" +expirationDate.setUTCHours(0, 0, 0, 0) //Should be start of the day.(midnight) +const versionId = 'my-versionId' -const objRetPromise = s3Client.putObjectRetention(bucketName, objectName, { mode:"GOVERNANCE", retainUntilDate:expirationDate.toISOString(), versionId:versionId} ) -objRetPromise.then(() => { - console.log("Success") +const objRetPromise = s3Client.putObjectRetention(bucketName, objectName, { + mode: 'GOVERNANCE', + retainUntilDate: expirationDate.toISOString(), + versionId: versionId, }) - .catch((e)=>{ - console.log(" Error",e) - }) \ No newline at end of file +objRetPromise + .then(() => { + console.log('Success') + }) + .catch((e) => { + console.log(' Error', e) + }) diff --git a/examples/put-object.js b/examples/put-object.js index bfbc516b..fb19a4f6 100644 --- a/examples/put-object.js +++ b/examples/put-object.js @@ -14,8 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname - // and my-objectname are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-testfile, my-bucketname +// and my-objectname are dummy values, please replace them with original values. var Minio = require('minio') var Fs = require('fs') @@ -23,47 +23,47 @@ var Fs = require('fs') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Upload a stream var file = 'my-testfile.ogg' var fileStream = Fs.createReadStream(file) -var fileStat = Fs.stat(file, function(e, stat) { +var fileStat = Fs.stat(file, function (e, stat) { if (e) { return console.log(e) } - s3Client.putObject('my-bucketname', 'my-objectname.ogg', fileStream, stat.size, 'audio/ogg', function(e) { + s3Client.putObject('my-bucketname', 'my-objectname.ogg', fileStream, stat.size, 'audio/ogg', function (e) { if (e) { return console.log(e) } - console.log("Successfully uploaded the stream") + console.log('Successfully uploaded the stream') }) }) // Upload a buffer var buf = new Buffer(10) buf.fill('a') -s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function(e) { +s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function (e) { if (e) { return console.log(e) } - console.log("Successfully uploaded the buffer") + console.log('Successfully uploaded the buffer') }) // Upload a string -var str = "random string to be uploaded" -s3Client.putObject('my-bucketname', 'my-objectname3', str, 'text/plain', function(e) { +var str = 'random string to be uploaded' +s3Client.putObject('my-bucketname', 'my-objectname3', str, 'text/plain', function (e) { if (e) { return console.log(e) } - console.log("Successfully uploaded the string") + console.log('Successfully uploaded the string') }) // Upload a Buffer without content-type (default: 'application/octet-stream') -s3Client.putObject('my-bucketname', 'my-objectname4', buf, function(e) { +s3Client.putObject('my-bucketname', 'my-objectname4', buf, function (e) { if (e) { return console.log(e) } - console.log("Successfully uploaded the Buffer") + console.log('Successfully uploaded the Buffer') }) diff --git a/examples/remove-all-bucket-notification.js b/examples/remove-all-bucket-notification.js index 01438f8a..c099576b 100644 --- a/examples/remove-all-bucket-notification.js +++ b/examples/remove-all-bucket-notification.js @@ -14,22 +14,20 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. - +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.removeAllBucketNotification('my-bucketname', function(e) { +s3Client.removeAllBucketNotification('my-bucketname', function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) - diff --git a/examples/remove-bucket-encryption.js b/examples/remove-bucket-encryption.js index 71902152..18b39efe 100644 --- a/examples/remove-bucket-encryption.js +++ b/examples/remove-bucket-encryption.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.removeBucketEncryption("my-bucket", function (error){ +s3Client.removeBucketEncryption('my-bucket', function (error) { if (error) { return console.log(error) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/remove-bucket-lifecycle.js b/examples/remove-bucket-lifecycle.js index 0935496b..f2e0a9b1 100644 --- a/examples/remove-bucket-lifecycle.js +++ b/examples/remove-bucket-lifecycle.js @@ -22,14 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - s3Client.removeBucketLifecycle('bucketname', function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) - diff --git a/examples/remove-bucket-replication.js b/examples/remove-bucket-replication.js index c22baf90..bab8511e 100644 --- a/examples/remove-bucket-replication.js +++ b/examples/remove-bucket-replication.js @@ -22,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.removeBucketReplication('bucketname', function (err){ +s3Client.removeBucketReplication('bucketname', function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) diff --git a/examples/remove-bucket-tagging.js b/examples/remove-bucket-tagging.js index ca7a16e9..0a0c5199 100644 --- a/examples/remove-bucket-tagging.js +++ b/examples/remove-bucket-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,12 +22,12 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.removeBucketTagging('bucketname', function (err){ +s3Client.removeBucketTagging('bucketname', function (err) { if (err) { return console.log(err) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/remove-bucket.js b/examples/remove-bucket.js index 8f3a0672..2a74b422 100644 --- a/examples/remove-bucket.js +++ b/examples/remove-bucket.js @@ -14,22 +14,22 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname - // are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname +// are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Remove a bucket name my-bucketname. // This operation will only work if your bucket is empty. -s3Client.removeBucket('my-bucketname', function(e) { +s3Client.removeBucket('my-bucketname', function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) diff --git a/examples/remove-incomplete-upload.js b/examples/remove-incomplete-upload.js index df09b822..3f9787e3 100644 --- a/examples/remove-incomplete-upload.js +++ b/examples/remove-incomplete-upload.js @@ -14,21 +14,20 @@ * limitations under the License. */ - - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and - // my-objectname are dummy values, please replace them with original values. +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and +// my-objectname are dummy values, please replace them with original values. var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Remove a partially uploaded object name my-objectname. -s3Client.removeIncompleteUpload('my-bucketname', 'my-objectname', function(e) { +s3Client.removeIncompleteUpload('my-bucketname', 'my-objectname', function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) diff --git a/examples/remove-object-tagging.js b/examples/remove-object-tagging.js index 9d8cfdec..6e8ba856 100644 --- a/examples/remove-object-tagging.js +++ b/examples/remove-object-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,20 +22,20 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -s3Client.removeObjectTagging('bucketname', "object-name", function (err){ +s3Client.removeObjectTagging('bucketname', 'object-name', function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) //remove tags on a version of an object -s3Client.removeObjectTagging('bucketname', 'object-name', { versionId: "my-object-version-id" }, function (err){ +s3Client.removeObjectTagging('bucketname', 'object-name', { versionId: 'my-object-version-id' }, function (err) { if (err) { return console.log(err) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/remove-object.js b/examples/remove-object.js index c868e8db..0604567b 100644 --- a/examples/remove-object.js +++ b/examples/remove-object.js @@ -14,7 +14,6 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and // my-objectname are dummy values, please replace them with original values. @@ -23,36 +22,41 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Remove an object name my-objectname. -s3Client.removeObject('my-bucketname', 'my-objectname', function(e) { +s3Client.removeObject('my-bucketname', 'my-objectname', function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) // Remove an object with name 'my-objectname' and a versionId. -s3Client.removeObject('my-bucketname', 'my-objectname', {versionId:"my-versionId"}, function(e) { +s3Client.removeObject('my-bucketname', 'my-objectname', { versionId: 'my-versionId' }, function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) // Remove an object with name 'my-objectname' and a versionId with object renetion override with governanceBypass:true. -s3Client.removeObject('my-bucketname', 'my-objectname', {versionId:"my-versionId", governanceBypass:true}, function(e) { - if (e) { - return console.log(e) +s3Client.removeObject( + 'my-bucketname', + 'my-objectname', + { versionId: 'my-versionId', governanceBypass: true }, + function (e) { + if (e) { + return console.log(e) + } + console.log('Success') } - console.log("Success") -}) +) // force delete object/prefix -s3Client.removeObject('force-del-test', 'test/', {forceDelete:true}, function(e) { +s3Client.removeObject('force-del-test', 'test/', { forceDelete: true }, function (e) { if (e) { return console.log(e) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/remove-objects.js b/examples/remove-objects.js index e45dd575..859ab48c 100644 --- a/examples/remove-objects.js +++ b/examples/remove-objects.js @@ -17,7 +17,6 @@ // Note: YOUR-ACCESSKEYID and YOUR-SECRETACCESSKEY are dummy values, please // replace them with original values. - var Minio = require('minio') var s3Client = new Minio.Client({ @@ -25,7 +24,7 @@ var s3Client = new Minio.Client({ port: 9000, useSSL: false, accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) const objectsList = [] @@ -33,11 +32,9 @@ const bucketName = 'my-bucket' const prefix = 'my-prefix' const recursive = false - - -function removeObjects (bucketName, prefix, recursive, includeVersion) { -// List all object paths in bucket - var objectsStream = s3Client.listObjects(bucketName, prefix, recursive, {IncludeVersion: includeVersion}) +function removeObjects(bucketName, prefix, recursive, includeVersion) { + // List all object paths in bucket + var objectsStream = s3Client.listObjects(bucketName, prefix, recursive, { IncludeVersion: includeVersion }) objectsStream.on('data', function (obj) { if (includeVersion) { @@ -56,7 +53,7 @@ function removeObjects (bucketName, prefix, recursive, includeVersion) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) }) } @@ -64,21 +61,19 @@ function removeObjects (bucketName, prefix, recursive, includeVersion) { removeObjects(bucketName, prefix, recursive, true) // Versioned objects of a bucket to be deleted. removeObjects(bucketName, prefix, recursive, false) // Normal objects of a bucket to be deleted. - // Delete Multiple objects and respective versions. function removeObjectsMultipleVersions() { - const deleteList = [ - {versionId: '03ed08e1-34ff-4465-91ed-ba50c1e80f39', name: 'prefix-1/out.json.gz'}, - {versionId: "35517ae1-18cb-4a21-9551-867f53a10cfe", name:"dir1/dir2/test.pdf"}, - {versionId: "3053f564-9aea-4a59-88f0-7f25d6320a2c", name:"dir1/dir2/test.pdf"} + { versionId: '03ed08e1-34ff-4465-91ed-ba50c1e80f39', name: 'prefix-1/out.json.gz' }, + { versionId: '35517ae1-18cb-4a21-9551-867f53a10cfe', name: 'dir1/dir2/test.pdf' }, + { versionId: '3053f564-9aea-4a59-88f0-7f25d6320a2c', name: 'dir1/dir2/test.pdf' }, ] - s3Client.removeObjects("my-bucket", deleteList, function (e) { + s3Client.removeObjects('my-bucket', deleteList, function (e) { if (e) { return console.log(e) } - console.log("Successfully deleted..") + console.log('Successfully deleted..') }) } -removeObjectsMultipleVersions() \ No newline at end of file +removeObjectsMultipleVersions() diff --git a/examples/reset-object-lock-config.js b/examples/reset-object-lock-config.js index b820a9a0..2780b6b7 100644 --- a/examples/reset-object-lock-config.js +++ b/examples/reset-object-lock-config.js @@ -22,13 +22,13 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) //Example to reset/remove object lock config. -s3Client.setObjectLockConfig('my-bucketname', {}, function (err){ +s3Client.setObjectLockConfig('my-bucketname', {}, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) diff --git a/examples/select-object-content.js b/examples/select-object-content.js index 25530542..62b237c2 100644 --- a/examples/select-object-content.js +++ b/examples/select-object-content.js @@ -14,38 +14,34 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. -var Minio = require("../dist/main/minio") +var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Reference: https://aws.amazon.com/blogs/storage/querying-data-without-servers-or-databases-using-amazon-s3-select/ const selectRequestConfig = { // expression:"SELECT * FROM s3object s where s.\"Name\" = 'Jane'", - expression:"SELECT * FROM s3object s", - expressionType:"SQL", - inputSerialization : {'CSV': {"FileHeaderInfo": "Use", - RecordDelimiter: "\n", - FieldDelimiter: ",", + expression: 'SELECT * FROM s3object s', + expressionType: 'SQL', + inputSerialization: { + CSV: { FileHeaderInfo: 'Use', RecordDelimiter: '\n', FieldDelimiter: ',' }, + CompressionType: 'NONE', }, - 'CompressionType': 'NONE'}, - outputSerialization : {'CSV': {RecordDelimiter: "\n", - FieldDelimiter: ",",}}, - requestProgress:{Enabled:true}, + outputSerialization: { CSV: { RecordDelimiter: '\n', FieldDelimiter: ',' } }, + requestProgress: { Enabled: true }, // scanRange:{ start:50, end:100 } } -s3Client.selectObjectContent('my-bucketname', 'my-objectname', selectRequestConfig, function(e, stat) { +s3Client.selectObjectContent('my-bucketname', 'my-objectname', selectRequestConfig, function (e, stat) { if (e) { return console.log(e) } console.log(stat) }) - diff --git a/examples/set-accelerate-end-point.js b/examples/set-accelerate-end-point.js index 2d41d83e..5f50921e 100644 --- a/examples/set-accelerate-end-point.js +++ b/examples/set-accelerate-end-point.js @@ -14,7 +14,6 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. @@ -23,19 +22,18 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Enable S3 transfer accelerate endpoint. -s3Client.SetS3TransferAccelerate("s3-accelerate.amazonaws.com") +s3Client.SetS3TransferAccelerate('s3-accelerate.amazonaws.com') // Upload a buffer var buf = new Buffer(10) buf.fill('a') -s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function(e) { +s3Client.putObject('my-bucketname', 'my-objectname2', buf, 'application/octet-stream', function (e) { if (e) { return console.log(e.message) } - console.log("Success") + console.log('Success') }) - diff --git a/examples/set-bucket-encryption.js b/examples/set-bucket-encryption.js index 94e5c22b..7163c52a 100644 --- a/examples/set-bucket-encryption.js +++ b/examples/set-bucket-encryption.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,18 +22,17 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) //Apply default encryption. -s3Client.setBucketEncryption("my-bucket", function (error){ +s3Client.setBucketEncryption('my-bucket', function (error) { if (error) { return console.log(error) } - console.log("Success") + console.log('Success') }) - //Set Encryption Rule. Only one rule is allowed. /** @@ -43,24 +41,22 @@ s3Client.setBucketEncryption("my-bucket", function (error){ */ var encryptionConfig = { - Rule:[ + Rule: [ { ApplyServerSideEncryptionByDefault: { - SSEAlgorithm:"AES256" - } - } - ] - + SSEAlgorithm: 'AES256', + }, + }, + ], } -s3Client.setBucketEncryption("my-bucket", encryptionConfig, function (error){ +s3Client.setBucketEncryption('my-bucket', encryptionConfig, function (error) { if (error) { return console.log(error) } - console.log("Success") + console.log('Success') }) - /** * KMS ID based SSE Encryption * Sample Configuration: @@ -90,19 +86,19 @@ s3Client.setBucketEncryption("my-bucket", encryptionConfig, function (error){ */ const kmsIdEncryptionConfig = { - Rule:[ + Rule: [ { ApplyServerSideEncryptionByDefault: { - KMSMasterKeyID:'my-minio-key', //as per env value - SSEAlgorithm:"aws:kms" // this is important - } - } - ] + KMSMasterKeyID: 'my-minio-key', //as per env value + SSEAlgorithm: 'aws:kms', // this is important + }, + }, + ], } -s3Client.setBucketEncryption("my-bucket", kmsIdEncryptionConfig, function (error){ +s3Client.setBucketEncryption('my-bucket', kmsIdEncryptionConfig, function (error) { if (error) { return console.log(error) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/set-bucket-lifecycle.js b/examples/set-bucket-lifecycle.js index a7af5788..547e9cac 100644 --- a/examples/set-bucket-lifecycle.js +++ b/examples/set-bucket-lifecycle.js @@ -22,54 +22,54 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -const lifecycleConfig= { - Rule: [{ - "ID": "Expiration Days Rule", - "Status": "Enabled", - "Filter": { - "Prefix":"", +const lifecycleConfig = { + Rule: [ + { + ID: 'Expiration Days Rule', + Status: 'Enabled', + Filter: { + Prefix: '', + }, + Expiration: { + Days: '3650', + }, }, - "Expiration": { - "Days": "3650" - } - } - ] + ], } -s3Client.setBucketLifecycle('bucketname',lifecycleConfig, function (err) { +s3Client.setBucketLifecycle('bucketname', lifecycleConfig, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) //Example to demonstrate Expiration Date const expirationDate = new Date() expirationDate.setDate(expirationDate.getDate() + 1) // Expire next day. -expirationDate.setUTCHours(0,0,0,0)//Should be start of the day.(midnight) +expirationDate.setUTCHours(0, 0, 0, 0) //Should be start of the day.(midnight) -const lifecycleConfigWithExpirationDate= { - Rule: [{ - "ID": "Expiration Date Rule", - "Status": "Enabled", - "Filter": { - "Prefix":"", +const lifecycleConfigWithExpirationDate = { + Rule: [ + { + ID: 'Expiration Date Rule', + Status: 'Enabled', + Filter: { + Prefix: '', + }, + Expiration: { + Date: expirationDate.toISOString(), + }, }, - "Expiration": { - Date:expirationDate.toISOString() - } - } - ] + ], } -s3Client.setBucketLifecycle('bucketname',lifecycleConfigWithExpirationDate, function (err) { +s3Client.setBucketLifecycle('bucketname', lifecycleConfigWithExpirationDate, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) - diff --git a/examples/set-bucket-notification.js b/examples/set-bucket-notification.js index bd81ec05..a11e9f7c 100644 --- a/examples/set-bucket-notification.js +++ b/examples/set-bucket-notification.js @@ -14,9 +14,8 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are - // dummy values, please replace them with original values. - +// Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY and my-bucketname are +// dummy values, please replace them with original values. var Minio = require('minio') @@ -25,11 +24,11 @@ var s3Client = new Minio.Client({ port: 9000, useSSL: false, accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) var config = new Minio.NotificationConfig() -var arn = Minio.buildARN('minio', 'sqs', '','1', 'webhook') +var arn = Minio.buildARN('minio', 'sqs', '', '1', 'webhook') var queue = new Minio.QueueConfig(arn) queue.addFilterSuffix('.jpg') @@ -38,10 +37,9 @@ queue.addEvent(Minio.ObjectCreatedAll) config.add(queue) -s3Client.setBucketNotification('my-bucketname', config, function(e) { +s3Client.setBucketNotification('my-bucketname', config, function (e) { if (e) { return console.log(e) } - console.log("Success") + console.log('Success') }) - diff --git a/examples/set-bucket-policy.js b/examples/set-bucket-policy.js index ae97c92a..ea44fcef 100644 --- a/examples/set-bucket-policy.js +++ b/examples/set-bucket-policy.js @@ -22,7 +22,7 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Bucket policy - GET requests on "testbucket" bucket will not need authentication. @@ -66,7 +66,7 @@ var policy = ` ` s3Client.setBucketPolicy('testbucket', policy, (err) => { - if (err) throw err + if (err) throw err - console.log('Set bucket policy') + console.log('Set bucket policy') }) diff --git a/examples/set-bucket-replication.js b/examples/set-bucket-replication.js index 5268d7a9..582863c3 100644 --- a/examples/set-bucket-replication.js +++ b/examples/set-bucket-replication.js @@ -22,33 +22,34 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) - -const arnFromMcCli = "arn:minio:replication::1277fcbe7df0bab76ab0c64cf7c45a0d27e01917ee5f11e913f3478417833660:destination" +const arnFromMcCli = + 'arn:minio:replication::1277fcbe7df0bab76ab0c64cf7c45a0d27e01917ee5f11e913f3478417833660:destination' var replicationConfig = { - role:arnFromMcCli, - rules:[{ - "DeleteMarkerReplication": { - "Status": "Disabled" - }, - "DeleteReplication": { - "Status": [ - ] - }, - "Destination": { - "Bucket": "arn:aws:s3:::destination" + role: arnFromMcCli, + rules: [ + { + DeleteMarkerReplication: { + Status: 'Disabled', + }, + DeleteReplication: { + Status: [], + }, + Destination: { + Bucket: 'arn:aws:s3:::destination', + }, + Priority: '1', + Status: 'Enabled', }, - "Priority": "1", - "Status": "Enabled" - }] + ], } -s3Client.setBucketReplication('bucketname',replicationConfig, function (err){ +s3Client.setBucketReplication('bucketname', replicationConfig, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) diff --git a/examples/set-bucket-tagging.js b/examples/set-bucket-tagging.js index 6acbfcc1..ee5dfd4b 100644 --- a/examples/set-bucket-tagging.js +++ b/examples/set-bucket-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,14 +22,14 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -var tagsMap = {"tagkey":"tagvalue"} +var tagsMap = { tagkey: 'tagvalue' } -s3Client.setBucketTagging('bucketname', tagsMap, function (err){ +s3Client.setBucketTagging('bucketname', tagsMap, function (err) { if (err) { return console.log(err) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/set-bucket-versioning.js b/examples/set-bucket-versioning.js index 90fee452..4175ef52 100644 --- a/examples/set-bucket-versioning.js +++ b/examples/set-bucket-versioning.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,14 +22,14 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -var versioningStateConfig = {Status:"Enabled"} +var versioningStateConfig = { Status: 'Enabled' } -s3Client.setBucketVersioning("my-bucket", versioningStateConfig, function (error){ +s3Client.setBucketVersioning('my-bucket', versioningStateConfig, function (error) { if (error) { return console.log(error) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/set-object-legal-hold.js b/examples/set-object-legal-hold.js index 0320639c..df22f9aa 100644 --- a/examples/set-object-legal-hold.js +++ b/examples/set-object-legal-hold.js @@ -22,11 +22,11 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) //Set legal hold config of an object. -s3Client.setObjectLegalHold('bucketName', 'objectName', {status:"ON"}, function(err, res) { +s3Client.setObjectLegalHold('bucketName', 'objectName', { status: 'ON' }, function (err, res) { if (err) { return console.log('Unable to set legal hold config for the object', err) } @@ -34,9 +34,14 @@ s3Client.setObjectLegalHold('bucketName', 'objectName', {status:"ON"}, function( }) //Set legal hold config of an object with versionId. -s3Client.setObjectLegalHold('bucketName', 'objectName', { status:"ON", versionId:'my-obj-version-uuid' }, function(err, res) { - if (err) { - return console.log('Unable to set legal hold config for the object version', err) +s3Client.setObjectLegalHold( + 'bucketName', + 'objectName', + { status: 'ON', versionId: 'my-obj-version-uuid' }, + function (err, res) { + if (err) { + return console.log('Unable to set legal hold config for the object version', err) + } + console.log('Success') } - console.log('Success') -}) \ No newline at end of file +) diff --git a/examples/set-object-lock-config.js b/examples/set-object-lock-config.js index 4d90bb86..3b5faae3 100644 --- a/examples/set-object-lock-config.js +++ b/examples/set-object-lock-config.js @@ -22,21 +22,21 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) //Set Object lock on a bucket -s3Client.setObjectLockConfig('my-bucketname', {mode:"COMPLIANCE",unit:'Days', validity:10 }, function (err){ +s3Client.setObjectLockConfig('my-bucketname', { mode: 'COMPLIANCE', unit: 'Days', validity: 10 }, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) //To reset/remove object lock config. -s3Client.setObjectLockConfig('my-bucketname', {}, function (err){ +s3Client.setObjectLockConfig('my-bucketname', {}, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) diff --git a/examples/set-object-tagging.js b/examples/set-object-tagging.js index 8a1e11d4..4d51079c 100644 --- a/examples/set-object-tagging.js +++ b/examples/set-object-tagging.js @@ -1,4 +1,3 @@ - /* * MinIO Javascript Library for Amazon S3 Compatible Cloud Storage, (C) 2021 MinIO, Inc. * @@ -23,22 +22,22 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) -var tagsMap = {"tagkey":"tagvalue"} +var tagsMap = { tagkey: 'tagvalue' } -s3Client.setObjectTagging('bucketname', "object-name", tagsMap, function (err){ +s3Client.setObjectTagging('bucketname', 'object-name', tagsMap, function (err) { if (err) { return console.log(err) } - console.log("Success") + console.log('Success') }) //Put tags on a version of an object -s3Client.setObjectTagging('bucketname', "object-name", tagsMap, { versionId: "my-version-id" }, function (err){ +s3Client.setObjectTagging('bucketname', 'object-name', tagsMap, { versionId: 'my-version-id' }, function (err) { if (err) { return console.log(err) } - console.log("Success") -}) \ No newline at end of file + console.log('Success') +}) diff --git a/examples/stat-object.js b/examples/stat-object.js index 3c46543d..e20f6988 100644 --- a/examples/stat-object.js +++ b/examples/stat-object.js @@ -14,7 +14,6 @@ * limitations under the License. */ - // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. @@ -23,10 +22,10 @@ var Minio = require('minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', accessKey: 'YOUR-ACCESSKEYID', - secretKey: 'YOUR-SECRETACCESSKEY' + secretKey: 'YOUR-SECRETACCESSKEY', }) // Get stat information for my-objectname. -s3Client.statObject('my-bucketname', 'my-objectname', function(e, stat) { +s3Client.statObject('my-bucketname', 'my-objectname', function (e, stat) { if (e) { return console.log(e) } @@ -35,7 +34,7 @@ s3Client.statObject('my-bucketname', 'my-objectname', function(e, stat) { // Get stat information for a specific version of 'my-objectname' //Bucket must be versioning enabled. -s3Client.statObject('my-bucketname', 'my-objectname', {versionId:"my-uuid"},function(e, stat) { +s3Client.statObject('my-bucketname', 'my-objectname', { versionId: 'my-uuid' }, function (e, stat) { if (e) { return console.log(e) } From e1c7e3ffb2f7304e45229efafceeba32feac633f Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sat, 15 Apr 2023 05:28:50 +0800 Subject: [PATCH 19/23] add trailingComma: all --- examples/copy-object.js | 2 +- examples/fget-object.js | 2 +- examples/get-object.js | 2 +- examples/presigned-getobject-request-date.js | 2 +- examples/remove-object.js | 2 +- examples/set-object-legal-hold.js | 2 +- gulpfile.js | 6 +- package.json | 1 + src/main/helpers.js | 4 +- src/main/minio.js | 34 +- src/main/transformers.js | 4 +- src/main/xml-parsers.js | 4 +- src/test/functional/functional-tests.js | 410 ++++++++++--------- src/test/unit/test.js | 12 +- 14 files changed, 247 insertions(+), 240 deletions(-) diff --git a/examples/copy-object.js b/examples/copy-object.js index 1a4e76bb..1618d033 100644 --- a/examples/copy-object.js +++ b/examples/copy-object.js @@ -40,5 +40,5 @@ s3Client.copyObject( } console.log('Successfully copied the object:') console.log('etag = ' + data.etag + ', lastModified = ' + data.lastModified) - } + }, ) diff --git a/examples/fget-object.js b/examples/fget-object.js index b9cd4d70..71c0fc4c 100644 --- a/examples/fget-object.js +++ b/examples/fget-object.js @@ -44,5 +44,5 @@ s3Client.fGetObject( return console.log(e) } console.log('success') - } + }, ) diff --git a/examples/get-object.js b/examples/get-object.js index aba5a2f6..ced47cd9 100644 --- a/examples/get-object.js +++ b/examples/get-object.js @@ -61,5 +61,5 @@ s3Client.getObject( dataStream.on('error', function (err) { console.log(err) }) - } + }, ) diff --git a/examples/presigned-getobject-request-date.js b/examples/presigned-getobject-request-date.js index dea7c00e..ae82b89e 100644 --- a/examples/presigned-getobject-request-date.js +++ b/examples/presigned-getobject-request-date.js @@ -46,5 +46,5 @@ s3Client.presignedGetObject( function (e, presignedUrl) { if (e) return console.log(e) console.log(presignedUrl) - } + }, ) diff --git a/examples/remove-object.js b/examples/remove-object.js index 0604567b..33e9d4d6 100644 --- a/examples/remove-object.js +++ b/examples/remove-object.js @@ -50,7 +50,7 @@ s3Client.removeObject( return console.log(e) } console.log('Success') - } + }, ) // force delete object/prefix diff --git a/examples/set-object-legal-hold.js b/examples/set-object-legal-hold.js index df22f9aa..0b0f2c6a 100644 --- a/examples/set-object-legal-hold.js +++ b/examples/set-object-legal-hold.js @@ -43,5 +43,5 @@ s3Client.setObjectLegalHold( return console.log('Unable to set legal hold config for the object version', err) } console.log('Success') - } + }, ) diff --git a/gulpfile.js b/gulpfile.js index 142187ec..d293aa82 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -38,7 +38,7 @@ const compileJS = (src, dest) => { }, ], ], - }) + }), ) .pipe(sourcemaps.write('.')) .pipe(gulp.dest(dest)) @@ -71,7 +71,7 @@ exports.test = gulp.series(testCompile, () => { exit: true, reporter: 'spec', ui: 'bdd', - }) + }), ) }) @@ -102,7 +102,7 @@ exports.functionalTest = gulp.series(testCompile, () => { exit: true, reporter: 'spec', ui: 'bdd', - }) + }), ) }) diff --git a/package.json b/package.json index 2b60da39..a267dd73 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "printWidth": 120, "singleQuote": true, "endOfLine": "lf", + "trailingComma": "all", "semi": false }, "lint-staged": { diff --git a/src/main/helpers.js b/src/main/helpers.js index e13366d1..1da1197f 100644 --- a/src/main/helpers.js +++ b/src/main/helpers.js @@ -561,7 +561,7 @@ export class CopySourceOptions { throw new errors.InvalidObjectNameError('Source start must be non-negative, and start must be at most end.') } else if ((this.MatchRange && !isNumber(this.Start)) || !isNumber(this.End)) { throw new errors.InvalidObjectNameError( - 'MatchRange is specified. But Invalid Start and End values are specified. ' + 'MatchRange is specified. But Invalid Start and End values are specified. ', ) } @@ -679,7 +679,7 @@ export class CopyDestinationOptions { if (!_.isEmpty(this.Mode) && ![RETENTION_MODES.GOVERNANCE, RETENTION_MODES.COMPLIANCE].includes(this.Mode)) { throw new errors.InvalidObjectNameError( - `Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]` + `Invalid Mode specified for destination object it should be one of [GOVERNANCE,COMPLIANCE]`, ) } diff --git a/src/main/minio.js b/src/main/minio.js index 04a9237a..7d11ec57 100644 --- a/src/main/minio.js +++ b/src/main/minio.js @@ -102,7 +102,7 @@ export class Client { } if (!isBoolean(params.useSSL)) { throw new errors.InvalidArgumentError( - `Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"` + `Invalid useSSL flag type : ${params.useSSL}, expected to be of type "boolean"`, ) } @@ -138,7 +138,7 @@ export class Client { if (params.transport) { if (!isObject(params.transport)) { throw new errors.InvalidArgumentError( - `Invalid transport type : ${params.transport}, expected to be type "object"` + `Invalid transport type : ${params.transport}, expected to be type "object"`, ) } transport = params.transport @@ -839,7 +839,7 @@ export class Client { ended = true } readStream._read() - } + }, ) }) } @@ -924,7 +924,7 @@ export class Client { var query = `uploadId=${removeUploadId}` this.makeRequest({ method, bucketName, objectName, query }, '', [204], '', false, (e) => cb(e)) }, - cb + cb, ) } @@ -1007,7 +1007,7 @@ export class Client { cb(new Error('Size mismatch between downloaded file and the object')) }, ], - rename + rename, ) } @@ -1257,7 +1257,7 @@ export class Client { return cb(e) } cb(null, partsDone, uploadId) - } + }, ) }, // all parts uploaded, complete the multipart upload @@ -1268,7 +1268,7 @@ export class Client { return } callback(err, ...rest) - } + }, ) } @@ -1902,7 +1902,7 @@ export class Client { } return result }, - { listOfList: [], list: [] } + { listOfList: [], list: [] }, ) if (result.list.length > 0) { @@ -1945,7 +1945,7 @@ export class Client { }) }) }, - cb + cb, ) } @@ -2068,7 +2068,7 @@ export class Client { this.sessionToken, region, requestDate, - expires + expires, ) } catch (pe) { return cb(pe) @@ -2530,7 +2530,7 @@ export class Client { // Ignore the 'data' event so that the stream closes. (nodejs stream requirement) response.on('data', () => {}) cb(null, result) - } + }, ) } if (multipart) { @@ -3005,7 +3005,7 @@ export class Client { if (configKeys.length > 0) { if (_.difference(configKeys, ['unit', 'mode', 'validity']).length !== 0) { throw new TypeError( - `lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.` + `lockConfigOpts.mode,lockConfigOpts.unit,lockConfigOpts.validity all the properties should be specified.`, ) } else { config.Rule = { @@ -3515,7 +3515,7 @@ export class Client { if (sourceFilesLength < 1 || sourceFilesLength > PART_CONSTRAINTS.MAX_PARTS_COUNT) { throw new errors.InvalidArgumentError( - `"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.` + `"There must be as least one and up to ${PART_CONSTRAINTS.MAX_PARTS_COUNT} source objects.`, ) } @@ -3547,7 +3547,7 @@ export class Client { let totalParts = 0 const sourceObjStats = sourceObjList.map((srcItem) => - me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)) + me.statObject(srcItem.Bucket, srcItem.Object, getStatOptions(srcItem)), ) return Promise.all(sourceObjStats) @@ -3566,7 +3566,7 @@ export class Client { const srcEnd = srcConfig.End if (srcEnd >= srcCopySize || srcStart < 0) { throw new errors.InvalidArgumentError( - `CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})` + `CopySrcOptions ${index} has invalid segment-to-copy [${srcStart}, ${srcEnd}] (size is ${srcCopySize})`, ) } srcCopySize = srcEnd - srcStart + 1 @@ -3575,7 +3575,7 @@ export class Client { // Only the last source may be less than `absMinPartSize` if (srcCopySize < PART_CONSTRAINTS.ABS_MIN_PART_SIZE && index < sourceFilesLength - 1) { throw new errors.InvalidArgumentError( - `CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.` + `CopySrcOptions ${index} is too small (${srcCopySize}) and it is not the last part.`, ) } @@ -3593,7 +3593,7 @@ export class Client { // Do we need more parts than we are allowed? if (totalParts > PART_CONSTRAINTS.MAX_PARTS_COUNT) { throw new errors.InvalidArgumentError( - `Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts` + `Your proposed compose object requires more than ${PART_CONSTRAINTS.MAX_PARTS_COUNT} parts`, ) } diff --git a/src/main/transformers.js b/src/main/transformers.js index d6caaf6e..b8645796 100644 --- a/src/main/transformers.js +++ b/src/main/transformers.js @@ -60,7 +60,7 @@ export function getConcater(parser, emitError) { } } cb() - } + }, ) } @@ -151,7 +151,7 @@ export function getHashSummer(enableSHA256) { this.push(hashData) this.push(null) cb() - } + }, ) } diff --git a/src/main/xml-parsers.js b/src/main/xml-parsers.js index 6fbbed4e..4ec2d53f 100644 --- a/src/main/xml-parsers.js +++ b/src/main/xml-parsers.js @@ -608,7 +608,7 @@ export function parseSelectObjectContentResponse(res) { if (preludeCrcByteValue !== calculatedPreludeCrc) { // Handle Header CRC mismatch Error throw new Error( - `Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}` + `Header Checksum Mismatch, Prelude CRC of ${preludeCrcByteValue} does not equal expected CRC of ${calculatedPreludeCrc}`, ) } @@ -635,7 +635,7 @@ export function parseSelectObjectContentResponse(res) { // Handle message CRC Error if (messageCrcByteValue !== calculatedCrc) { throw new Error( - `Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}` + `Message Checksum Mismatch, Message CRC of ${messageCrcByteValue} does not equal expected CRC of ${calculatedCrc}`, ) } payloadStream = readableStream(payLoadBuffer) diff --git a/src/test/functional/functional-tests.js b/src/test/functional/functional-tests.js index 9b2986ed..3d2ec950 100644 --- a/src/test/functional/functional-tests.js +++ b/src/test/functional/functional-tests.js @@ -187,7 +187,7 @@ describe('functional tests', function () { describe('makeBucket with period and region', () => { if (clientConfigParams.endPoint === 's3.amazonaws.com') { step('makeBucket(bucketName, region, cb)_region:eu-central-1_', (done) => - client.makeBucket(`${bucketName}.sec.period`, 'eu-central-1', done) + client.makeBucket(`${bucketName}.sec.period`, 'eu-central-1', done), ) step('removeBucket(bucketName, cb)__', (done) => client.removeBucket(`${bucketName}.sec.period`, done)) } @@ -310,7 +310,7 @@ describe('functional tests', function () { .putObject(bucketName, _MultiPath100kbObjectBufferName, _100kb) .then(() => done()) .catch(done) - } + }, ) step( @@ -330,7 +330,7 @@ describe('functional tests', function () { done(new Error('content mismatch')) }) }) - } + }, ) step( @@ -340,7 +340,7 @@ describe('functional tests', function () { .removeObject(bucketName, _MultiPath100kbObjectBufferName) .then(() => done()) .catch(done) - } + }, ) }) describe('tests for putObject copyObject getObject getPartialObject statObject removeObject', function () { @@ -350,7 +350,7 @@ describe('functional tests', function () { (done) => { fs.writeFileSync(tmpFileUpload, _100kb) client.fPutObject(bucketName, _100kbObjectName, tmpFileUpload, done) - } + }, ) step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { @@ -373,7 +373,7 @@ describe('functional tests', function () { (done) => { fs.writeFileSync(tmpFileUploadWithExt, _100kb) client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, metaData, done) - } + }, ) step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { @@ -397,7 +397,7 @@ describe('functional tests', function () { (done) => { fs.writeFileSync(tmpFileUploadWithExt, _100kb) client.fPutObject(bucketName, _100kbObjectName, tmpFileUploadWithExt, done) - } + }, ) step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { @@ -419,7 +419,7 @@ describe('functional tests', function () { (done) => { var stream = readableStream(_100kb) client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, metaData, done) - } + }, ) step( @@ -427,7 +427,7 @@ describe('functional tests', function () { (done) => { var stream = readableStream(_100kb) client.putObject(bucketName, _100kbObjectName, stream, _100kb.length, done) - } + }, ) step( @@ -447,14 +447,14 @@ describe('functional tests', function () { done(new Error('content mismatch')) }) }) - } + }, ) step( `putObject(bucketName, objectName, stream, callback)_bucketName:${bucketName}, objectName:${_100kbObjectBufferName}, stream:100kb_`, (done) => { client.putObject(bucketName, _100kbObjectBufferName, _100kb, '', done) - } + }, ) step( @@ -474,7 +474,7 @@ describe('functional tests', function () { done(new Error('content mismatch')) }) }) - } + }, ) step( @@ -484,7 +484,7 @@ describe('functional tests', function () { .putObject(bucketName, _100kbObjectBufferName, _100kb, {}) .then(() => done()) .catch(done) - } + }, ) step( @@ -497,7 +497,7 @@ describe('functional tests', function () { stream.on('end', done) }) .catch(done) - } + }, ) step( @@ -517,7 +517,7 @@ describe('functional tests', function () { }) }) .catch(done) - } + }, ) step( @@ -536,7 +536,7 @@ describe('functional tests', function () { }) }) .catch(done) - } + }, ) step( @@ -549,7 +549,7 @@ describe('functional tests', function () { stream.on('end', done) }) .catch(done) - } + }, ) step( @@ -564,7 +564,7 @@ describe('functional tests', function () { done(new Error('http request did not release network socket')) }, 100) }) - } + }, ) step(`getObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { @@ -620,7 +620,7 @@ describe('functional tests', function () { done(new Error('content mismatch')) }) }) - } + }, ) step( @@ -632,7 +632,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -642,7 +642,7 @@ describe('functional tests', function () { .copyObject(bucketName, _65mbObjectNameCopy, '/' + bucketName + '/' + _65mbObjectName) .then(() => done()) .catch(done) - } + }, ) step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}_`, (done) => { @@ -688,7 +688,7 @@ describe('functional tests', function () { async.map( [_100kbObjectBufferName, _65mbObjectName, _65mbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), - done + done, ) }) .catch(done) @@ -702,7 +702,7 @@ describe('functional tests', function () { `putObject(bucketName, objectName, stream, metaData, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}, stream: 100kb, metaData:${metaData}_`, (done) => { client.putObject(bucketName, _100kbObjectName, _100kb, metaData, done) - } + }, ) step( @@ -714,7 +714,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step(`statObject(bucketName, objectName, cb)_bucketName:${bucketName}, objectName:${_100kbObjectName}_`, (done) => { @@ -745,7 +745,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -759,7 +759,7 @@ describe('functional tests', function () { done(new Error('CopyObject should have failed.')) }) .catch(() => done()) - } + }, ) step( @@ -773,7 +773,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -787,7 +787,7 @@ describe('functional tests', function () { done(new Error('CopyObject should have failed.')) }) .catch(() => done()) - } + }, ) step( @@ -801,7 +801,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -815,7 +815,7 @@ describe('functional tests', function () { done(new Error('CopyObject should have failed.')) }) .catch(() => done()) - } + }, ) step( @@ -830,7 +830,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -839,9 +839,9 @@ describe('functional tests', function () { async.map( [_100kbObjectName, _100kbObjectNameCopy], (objectName, cb) => client.removeObject(bucketName, objectName, cb), - done + done, ) - } + }, ) }) @@ -850,7 +850,7 @@ describe('functional tests', function () { `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${bucketName}, objectName:${_65mbObjectName}, metaData:${metaData}`, (done) => { client.initiateNewMultipartUpload(bucketName, _65mbObjectName, metaData, done) - } + }, ) step( `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, prefix:${_65mbObjectName}, recursive: true_`, @@ -877,7 +877,7 @@ describe('functional tests', function () { } done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) }) - } + }, ) step( `listIncompleteUploads(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive: true_`, @@ -904,7 +904,7 @@ describe('functional tests', function () { } done(new Error(`${_65mbObjectName} not found during listIncompleteUploads`)) }) - } + }, ) step(`removeIncompleteUploads(bucketName, prefix)_bucketName:${bucketName}, prefix:${_65mbObjectName}_`, (done) => { client.removeIncompleteUpload(bucketName, _65mbObjectName).then(done).catch(done) @@ -927,12 +927,12 @@ describe('functional tests', function () { done(new Error('http request did not release network socket')) }, 100) }) - } + }, ) step( `fPutObject(bucketName, objectName, filePath, metaData, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileUpload}, metaData: ${metaData}_`, - (done) => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done) + (done) => client.fPutObject(bucketName, _65mbObjectName, tmpFileUpload, metaData, done), ) step( `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_65mbObjectName}, filePath:${tmpFileDownload}_`, @@ -947,7 +947,7 @@ describe('functional tests', function () { return done(new Error('md5sum mismatch')) }) .catch(done) - } + }, ) step( @@ -958,7 +958,7 @@ describe('functional tests', function () { .removeObject(bucketName, _65mbObjectName) .then(() => done()) .catch(done) - } + }, ) step( @@ -968,7 +968,7 @@ describe('functional tests', function () { .fPutObject(bucketName, _65mbObjectName, tmpFileUpload) .then(() => done()) .catch(done) - } + }, ) step( @@ -978,7 +978,7 @@ describe('functional tests', function () { .fGetObject(bucketName, _65mbObjectName, tmpFileDownload) .then(() => done()) .catch(done) - } + }, ) step( @@ -987,7 +987,7 @@ describe('functional tests', function () { fs.unlinkSync(tmpFileUpload) fs.unlinkSync(tmpFileDownload) client.removeObject(bucketName, _65mbObjectName, done) - } + }, ) }) describe('fGetObject-resume', () => { @@ -1004,7 +1004,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step( `fGetObject(bucketName, objectName, filePath, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}, filePath:${localFile}`, @@ -1024,14 +1024,14 @@ describe('functional tests', function () { return done(new Error('md5sum mismatch')) }) .catch(done) - } + }, ) step( `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}, objectName:${_5mbObjectName}_`, (done) => { fs.unlinkSync(localFile) client.removeObject(bucketName, _5mbObjectName, done) - } + }, ) }) @@ -1135,7 +1135,7 @@ describe('functional tests', function () { request.write(_1byte) request.end() }) - } + }, ) step( @@ -1148,7 +1148,7 @@ describe('functional tests', function () { done(new Error('negative values should trigger an error')) }) .catch(() => done()) - } + }, ) step( @@ -1159,7 +1159,7 @@ describe('functional tests', function () { .presignedPutObject(bucketName, _1byteObjectName) .then(() => done()) .catch(done) - } + }, ) step( @@ -1191,7 +1191,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1223,7 +1223,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1257,7 +1257,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1289,7 +1289,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1299,7 +1299,7 @@ describe('functional tests', function () { .presignedGetObject(bucketName, 'this.does.not.exist', 2938) .then(assert.fail) .catch(() => done()) - } + }, ) step( @@ -1351,7 +1351,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1384,7 +1384,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step( @@ -1418,7 +1418,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) step('presignedPostPolicy(postPolicy, cb)_postPolicy:expiresin10days_', (done) => { @@ -1609,7 +1609,7 @@ describe('functional tests', function () { var request = transport.request(options, callback) request.end() }) - } + }, ) step( @@ -1637,7 +1637,7 @@ describe('functional tests', function () { request.on('error', (e) => done(e)) request.end() }) - } + }, ) }) @@ -1657,9 +1657,9 @@ describe('functional tests', function () { objArray, 20, (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, {}, cb), - done + done, ) - } + }, ) step( @@ -1677,7 +1677,7 @@ describe('functional tests', function () { .on('data', (data) => { listPrefixArray.push(data.name) }) - } + }, ) step('listObjects(bucketName, prefix, recursive)_recursive:true_', (done) => { @@ -1726,7 +1726,7 @@ describe('functional tests', function () { .on('data', (data) => { listArray.push(data.name) }) - } + }, ) step( @@ -1745,14 +1745,14 @@ describe('functional tests', function () { .on('data', (data) => { listArray.push(data.name) }) - } + }, ) step( `removeObject(bucketName, objectName, callback)_bucketName:${bucketName}_Remove ${listObjectsNum} objects`, (done) => { async.mapLimit(listArray, 20, (objectName, cb) => client.removeObject(bucketName, objectName, cb), done) - } + }, ) }) @@ -1771,9 +1771,9 @@ describe('functional tests', function () { objArray, 20, (objectName, cb) => client.putObject(bucketName, objectName, readableStream(_1byte), _1byte.length, '', cb), - done + done, ) - } + }, ) step(`listObjects(bucketName, prefix, recursive)_bucketName:${bucketName}, recursive:false_`, (done) => { @@ -1855,7 +1855,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( `listenBucketNotification(bucketName, prefix, suffix, events)_bucketName:${bucketName}, events: s3:ObjectCreated:*_`, @@ -1902,7 +1902,7 @@ describe('functional tests', function () { }, 10 * 1000) }) }, 10 * 1000) - } + }, ) // This test is very similar to that above, except it does not include @@ -1930,7 +1930,7 @@ describe('functional tests', function () { client.removeObject(bucketName, objectName, done) }, 11 * 1000) }) - } + }, ) }) }) @@ -2017,7 +2017,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -2027,7 +2027,7 @@ describe('functional tests', function () { .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) .then(() => done()) .catch(done) - } + }, ) step( @@ -2037,7 +2037,7 @@ describe('functional tests', function () { versionId = res.versionId done() }) - } + }, ) step( @@ -2046,7 +2046,7 @@ describe('functional tests', function () { client.removeObject(versionedBucketName, versioned_100kbObjectName, { versionId: versionId }, () => { done() }) - } + }, ) step( @@ -2061,7 +2061,7 @@ describe('functional tests', function () { } done() }) - } + }, ) }) }) @@ -2091,7 +2091,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -2106,7 +2106,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step( @@ -2124,12 +2124,12 @@ describe('functional tests', function () { } else { done(new Error('versionId not found in getObject response')) } - } + }, ) } else { done() } - } + }, ) step( @@ -2144,12 +2144,12 @@ describe('functional tests', function () { { versionId: versionId }, function () { done() - } + }, ) } else { done() } - } + }, ) step( @@ -2169,12 +2169,12 @@ describe('functional tests', function () { } else { done(new Error('versionId not found in getPartialObject response')) } - } + }, ) } else { done() } - } + }, ) step( @@ -2190,7 +2190,7 @@ describe('functional tests', function () { done() }) } - } + }, ) step( @@ -2205,7 +2205,7 @@ describe('functional tests', function () { } done() }) - } + }, ) }) }) @@ -2234,7 +2234,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - }) + }), ) after((done) => client.removeBucket(versionedBucketName, done)) @@ -2256,13 +2256,13 @@ describe('functional tests', function () { done() } count += 1 - } + }, ) }) } else { done() } - } + }, ) step( @@ -2284,7 +2284,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2307,7 +2307,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2326,7 +2326,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) }) @@ -2357,7 +2357,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - } + }, ) step( @@ -2371,7 +2371,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) // Put two versions of the same object. step( @@ -2386,7 +2386,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2409,7 +2409,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2429,7 +2429,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) }) }) @@ -2497,7 +2497,7 @@ describe('functional tests', function () { .putObject(tagsBucketName, tagObjName, tagObject) .then(() => done()) .catch(done) - } + }, ) step(`putObjectTagging object_bucketName:${tagsBucketName}, objectName:${tagObjName},`, (done) => { @@ -2570,7 +2570,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - } + }, ) step( @@ -2589,7 +2589,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step(`Set tags on an object_bucketName:${tagsVersionedBucketName}, objectName:${tagObjName},`, (done) => { @@ -2604,7 +2604,7 @@ describe('functional tests', function () { return done(err) } done() - } + }, ) } else { done() @@ -2742,7 +2742,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - }) + }), ) after((done) => client.removeBucket(versionedBucketName, done)) @@ -2788,7 +2788,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2833,7 +2833,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -2854,14 +2854,14 @@ describe('functional tests', function () { done() } else { return done( - new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`) + new Error(`Version count does not match for versioned presigned url test. ${expectedVersionsCount}`), ) } }) } else { done() } - } + }, ) step( @@ -2911,12 +2911,12 @@ describe('functional tests', function () { return done() }) request.end() - } + }, ) } else { done() } - } + }, ) step(`removeObjects(bucketName, objectsList)_bucketName:${versionedBucketName}`, (done) => { @@ -3014,7 +3014,7 @@ describe('functional tests', function () { return done(err) } done() - } + }, ) } else { done() @@ -3120,7 +3120,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3134,7 +3134,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3159,7 +3159,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3172,7 +3172,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3185,12 +3185,12 @@ describe('functional tests', function () { { versionId: versionId, governanceBypass: true }, () => { done() - } + }, ) } else { done() } - } + }, ) step(`removeBucket(bucketName, )_bucketName:${objRetentionBucket}`, (done) => { @@ -3264,7 +3264,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3282,7 +3282,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3300,7 +3300,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step(`Remove object on a bucket:_bucketName:${encBucketName}, _objectName:${encObjName}`, (done) => { @@ -3388,7 +3388,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3402,7 +3402,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3415,7 +3415,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3428,12 +3428,12 @@ describe('functional tests', function () { { status: 'ON', versionId: versionId }, () => { done() - } + }, ) } else { done() } - } + }, ) step( @@ -3446,7 +3446,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3459,12 +3459,12 @@ describe('functional tests', function () { { status: 'OFF', versionId: versionId }, () => { done() - } + }, ) } else { done() } - } + }, ) step( @@ -3477,7 +3477,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -3490,12 +3490,12 @@ describe('functional tests', function () { { versionId: versionId, governanceBypass: true }, () => { done() - } + }, ) } else { done() } - } + }, ) step(`removeBucket(bucketName, )_bucketName:${objLegalHoldBucketName}`, (done) => { @@ -3536,7 +3536,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step( @@ -3557,7 +3557,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -3579,7 +3579,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( `extensions.listObjectsV2WithMetadata(bucketName, prefix, recursive)_bucketName:${bucketNameForSpCharObjects}, prefix:"", true`, @@ -3600,7 +3600,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -3613,7 +3613,7 @@ describe('functional tests', function () { stream.on('end', done) }) .catch(done) - } + }, ) step( @@ -3625,7 +3625,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -3635,7 +3635,7 @@ describe('functional tests', function () { .removeObject(bucketNameForSpCharObjects, objectNameSpecialChars) .then(() => done()) .catch(done) - } + }, ) }) }) @@ -3665,7 +3665,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step( @@ -3681,14 +3681,16 @@ describe('functional tests', function () { done() } else { return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + new Error( + `Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`, + ), ) } }) listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -3704,14 +3706,16 @@ describe('functional tests', function () { done() } else { return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + new Error( + `Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`, + ), ) } }) listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -3727,14 +3731,16 @@ describe('functional tests', function () { done() } else { return done( - new Error(`Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`) + new Error( + `Expected object Name: ${objectNameWithPrefixForSpecialChars}: received:${listedObject.name}`, + ), ) } }) listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -3747,7 +3753,7 @@ describe('functional tests', function () { stream.on('end', done) }) .catch(done) - } + }, ) step( @@ -3759,7 +3765,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( @@ -3769,7 +3775,7 @@ describe('functional tests', function () { .removeObject(bucketNameForSpCharObjects, objectNameWithPrefixForSpecialChars) .then(() => done()) .catch(done) - } + }, ) }) }) @@ -3810,7 +3816,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step(`Remove an Object with assume role credentials:${bucketName}, _objectName:${objName}`, (done) => { @@ -3850,13 +3856,13 @@ describe('functional tests', function () { done( new Error( `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) + res, + )}`, + ), ) } }) - } + }, ) step( `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, @@ -3865,7 +3871,7 @@ describe('functional tests', function () { .removeObject(bucketToTestMultipart, _100kbObjectName) .then(() => done()) .catch(done) - } + }, ) // Multipart Test @@ -3883,13 +3889,13 @@ describe('functional tests', function () { done( new Error( `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) + res, + )}`, + ), ) } }) - } + }, ) step( `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, @@ -3898,7 +3904,7 @@ describe('functional tests', function () { .removeObject(bucketToTestMultipart, _65mbObjectName) .then(() => done()) .catch(done) - } + }, ) }) @@ -3920,7 +3926,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - }) + }), ) after((done) => client.removeBucket(bucketToTestMultipart, done)) @@ -3941,16 +3947,16 @@ describe('functional tests', function () { done( new Error( `Incorrect response format, expected: {versionId:'some-version-hash', etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) + res, + )}`, + ), ) } }) } else { done() } - } + }, ) step( `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_100kbObjectName}`, @@ -3963,7 +3969,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) // Multipart Test @@ -3983,16 +3989,16 @@ describe('functional tests', function () { done( new Error( `Incorrect response format, expected: {versionId:null, etag:"some-etag-hash"} received:${JSON.stringify( - res - )}` - ) + res, + )}`, + ), ) } }) } else { done() } - } + }, ) step( `removeObject(bucketName, objectName, stream)_bucketName:${bucketToTestMultipart}, _objectName:${_65mbObjectName}`, @@ -4005,7 +4011,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) }) describe('Compose Object API Tests', () => { @@ -4093,7 +4099,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4109,7 +4115,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4128,7 +4134,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4144,7 +4150,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step('Clean up temp directory part files', (done) => { @@ -4181,7 +4187,7 @@ describe('functional tests', function () { done() }) .catch(done) - } + }, ) step( @@ -4202,7 +4208,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -4225,7 +4231,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -4247,7 +4253,7 @@ describe('functional tests', function () { listStream.on('error', function (e) { done(e) }) - } + }, ) step( @@ -4260,7 +4266,7 @@ describe('functional tests', function () { stream.on('end', done) }) .catch(done) - } + }, ) step( @@ -4272,7 +4278,7 @@ describe('functional tests', function () { } done() }) - } + }, ) step( `removeObject(bucketName, objectName)_bucketName:${objectNameWithPrefix}, _objectName:${objectNameWithPrefix}`, @@ -4281,7 +4287,7 @@ describe('functional tests', function () { .removeObject(bucketNameForSpCharObjects, objectNameWithPrefix) .then(() => done()) .catch(done) - } + }, ) }) describe('Test listIncompleteUploads (Multipart listing) with special characters', () => { @@ -4297,7 +4303,7 @@ describe('functional tests', function () { `initiateNewMultipartUpload(bucketName, objectName, metaData, cb)_bucketName:${spBucketName}, objectName:${spObjWithPrefix}, metaData:${metaData}`, (done) => { client.initiateNewMultipartUpload(spBucketName, spObjWithPrefix, metaData, done) - } + }, ) step( @@ -4325,7 +4331,7 @@ describe('functional tests', function () { } done(new Error(`${spObjWithPrefix} not found during listIncompleteUploads`)) }) - } + }, ) step( @@ -4354,13 +4360,13 @@ describe('functional tests', function () { } done(new Error(`${specialCharPrefix} not found during listIncompleteUploads`)) }) - } + }, ) step( `removeIncompleteUploads(bucketName, prefix)_bucketName:${spBucketName}, prefix:${spObjWithPrefix}_`, (done) => { client.removeIncompleteUpload(spBucketName, spObjWithPrefix).then(done).catch(done) - } + }, ) }) describe('Select Object content API Test', function () { @@ -4386,13 +4392,13 @@ describe('functional tests', function () { 'Sean,(949) 123-45567,Chicago,Developer\n' + 'Mary,(949) 123-45567,Chicago,Developer\n' + 'Kate,(949) 123-45567,Chicago,Developer', - {} + {}, ) .then(() => { done() }) .catch(done) - } + }, ) step( @@ -4421,13 +4427,13 @@ describe('functional tests', function () { new Error( `Expected Result did not match received:${result .getRecords() - .toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"` - ) + .toString()} expected:"Jane,(949) 123-45567,Chicago,Developer\n"`, + ), ) } }) .catch(done) - } + }, ) step(`Remove Object post select of content:_bucketName:${selObjContentBucket},objectName:${selObject}`, (done) => { @@ -4463,7 +4469,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - } + }, ) step( @@ -4477,7 +4483,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) // Put two versions of the same object. step( @@ -4491,7 +4497,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4504,7 +4510,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4526,7 +4532,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) }) }) @@ -4556,7 +4562,7 @@ describe('functional tests', function () { isVersioningSupported = true done() }) - } + }, ) step( @@ -4570,7 +4576,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) // Put two versions of the same object. step( @@ -4584,7 +4590,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4597,7 +4603,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) step( @@ -4619,7 +4625,7 @@ describe('functional tests', function () { } else { done() } - } + }, ) }) }) @@ -4643,7 +4649,7 @@ describe('functional tests', function () { .putObject(versionedBucketName, versioned_100kbObjectName, versioned_100kb_Object) .then(() => done()) .catch(done) - } + }, ) step( @@ -4652,7 +4658,7 @@ describe('functional tests', function () { client.removeObject(versionedBucketName, versioned_100kbObjectName, { forceDelete: true }, () => { done() }) - } + }, ) step( @@ -4671,7 +4677,7 @@ describe('functional tests', function () { .on('data', (data) => { objVersionList.push(data) }) - } + }, ) }) }) @@ -4693,7 +4699,7 @@ describe('functional tests', function () { .putObject(fdPrefixBucket, fdObjectName, fdObject) .then(() => done()) .catch(done) - } + }, ) step(`removeObject(bucketName, objectList, removeOpts)_bucketName:${fdPrefixBucket}_Remove 1 object`, (done) => { @@ -4718,7 +4724,7 @@ describe('functional tests', function () { .on('data', (data) => { objList.push(data) }) - } + }, ) }) }) diff --git a/src/test/unit/test.js b/src/test/unit/test.js index 3aeb4379..4c713607 100644 --- a/src/test/unit/test.js +++ b/src/test/unit/test.js @@ -453,7 +453,7 @@ describe('Client', function () { client.setAppInfo('test', '3.2.1') assert.equal( `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent + client.userAgent, ) }) it('should set user agent without comments', () => { @@ -465,7 +465,7 @@ describe('Client', function () { client.setAppInfo('test', '3.2.1') assert.equal( `MinIO (${process.platform}; ${process.arch}) minio-js/${Package.version} test/3.2.1`, - client.userAgent + client.userAgent, ) }) it('should not set user agent without name', (done) => { @@ -640,7 +640,7 @@ describe('Client', function () { client.removeAllBucketNotification( 'ab', () => {}, - function () {} + function () {}, ) }, /Invalid bucket name/) }) @@ -1156,7 +1156,7 @@ describe('Client', function () { client.setObjectLockConfig( 'my-bucket', { mode: 'COMPLIANCE', unit: 'invalid_unit', validity: '' }, - function () {} + function () {}, ) } catch (e) { done() @@ -1167,7 +1167,7 @@ describe('Client', function () { client.setObjectLockConfig( 'my-bucket', { mode: 'COMPLIANCE', randomProp: true, nonExisting: false }, - function () {} + function () {}, ) } catch (e) { done() @@ -1304,7 +1304,7 @@ describe('Client', function () { }, ], }, - function () {} + function () {}, ) } catch (e) { done() From 79da51852da9f88ada72a91d5a30af1b6375f16d Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 27 Apr 2023 06:00:46 +0800 Subject: [PATCH 20/23] ignore yarn v2 config --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 610262cd..1db8b977 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ node_modules /dist/ yarn.lock .yarn/ +.yarnrc.yml From f5da54205600861b8991ea6dbb48d5797cf0e16c Mon Sep 17 00:00:00 2001 From: Trim21 Date: Thu, 27 Apr 2023 07:23:45 +0800 Subject: [PATCH 21/23] remove unexpected rollup plugin --- examples/compose-object-test-example.js | 2 +- examples/compose-object.js | 2 +- examples/select-object-content.js | 2 +- package-lock.json | 139 ------------------------ package.json | 3 - 5 files changed, 3 insertions(+), 145 deletions(-) diff --git a/examples/compose-object-test-example.js b/examples/compose-object-test-example.js index 7d1d2de6..98ce9159 100644 --- a/examples/compose-object-test-example.js +++ b/examples/compose-object-test-example.js @@ -20,7 +20,7 @@ const os = require('os') const splitFile = require('split-file') const fs = require('fs') -var Minio = require('minio') +var Minio = require('../dist/main/minio') var Helpers = require('../dist/main/helpers') var s3Client = new Minio.Client({ diff --git a/examples/compose-object.js b/examples/compose-object.js index dda91807..5e35597e 100644 --- a/examples/compose-object.js +++ b/examples/compose-object.js @@ -17,7 +17,7 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname and my-objectname // are dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require('../dist/main/minio') var Helpers = require('../dist/main/helpers') var s3Client = new Minio.Client({ diff --git a/examples/select-object-content.js b/examples/select-object-content.js index 62b237c2..1b6421cb 100644 --- a/examples/select-object-content.js +++ b/examples/select-object-content.js @@ -17,7 +17,7 @@ // Note: YOUR-ACCESSKEYID, YOUR-SECRETACCESSKEY, my-bucketname // and my-objectname are dummy values, please replace them with original values. -var Minio = require('minio') +var Minio = require('../dist/main/minio') var s3Client = new Minio.Client({ endPoint: 's3.amazonaws.com', diff --git a/package-lock.json b/package-lock.json index ce1249f0..948ed23e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -30,9 +30,6 @@ "devDependencies": { "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.10", - "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-replace": "^5.0.2", - "@rollup/plugin-typescript": "^11.1.0", "@types/lodash": "^4.14.192", "@types/node": "^18.15.11", "@typescript-eslint/eslint-plugin": "^5.57.1", @@ -2137,119 +2134,6 @@ "node": ">= 8" } }, - "node_modules/@rollup/plugin-babel": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-6.0.3.tgz", - "integrity": "sha512-fKImZKppa1A/gX73eg4JGo+8kQr/q1HBQaCGKECZ0v4YBBv3lFqi14+7xyApECzvkLTHCifx+7ntcrvtBIRcpg==", - "dev": true, - "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@rollup/pluginutils": "^5.0.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0", - "@types/babel__core": "^7.1.9", - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "@types/babel__core": { - "optional": true - }, - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-5.0.2.tgz", - "integrity": "sha512-M9YXNekv/C/iHHK+cvORzfRYfPbq0RDD8r0G+bMiTXjNGKulPnCT9O3Ss46WfhI6ZOCgApOP7xAdmCQJ+U2LAA==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "magic-string": "^0.27.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-replace/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@rollup/plugin-typescript": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-11.1.0.tgz", - "integrity": "sha512-86flrfE+bSHB69znnTV6kVjkncs2LBMhcTCyxWgRxLyfXfQrxg4UwlAqENnjrrxnSNS/XKCDJCl8EkdFJVHOxw==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "resolve": "^1.22.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^2.14.0||^3.0.0", - "tslib": "*", - "typescript": ">=3.7.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - }, - "tslib": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", - "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", @@ -5152,12 +5036,6 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -11074,23 +10952,6 @@ "inherits": "^2.0.1" } }, - "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", - "dev": true, - "optional": true, - "peer": true, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=10.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", diff --git a/package.json b/package.json index a267dd73..bc8daf77 100644 --- a/package.json +++ b/package.json @@ -72,9 +72,6 @@ "devDependencies": { "@babel/core": "^7.12.10", "@babel/preset-env": "^7.12.10", - "@rollup/plugin-babel": "^6.0.3", - "@rollup/plugin-replace": "^5.0.2", - "@rollup/plugin-typescript": "^11.1.0", "@types/lodash": "^4.14.192", "@types/node": "^18.15.11", "@typescript-eslint/eslint-plugin": "^5.57.1", From 5b2d0cd92e03464bf3abb79cfef63dabd1468139 Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sun, 30 Apr 2023 09:35:42 +0800 Subject: [PATCH 22/23] use latest npm --- package-lock.json | 18695 +++++--------------------------------------- 1 file changed, 1903 insertions(+), 16792 deletions(-) diff --git a/package-lock.json b/package-lock.json index f0eb1a29..e98da5ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "minio", "version": "7.1.1", - "lockfileVersion": 2, + "lockfileVersion": 3, "requires": true, "packages": { "": { @@ -9288,162 +9288,6 @@ "node": ">= 0.10" } }, - "node_modules/npm": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz", - "integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==", - "bundleDependencies": [ - "@isaacs/string-locale-compare", - "@npmcli/arborist", - "@npmcli/ci-detect", - "@npmcli/config", - "@npmcli/map-workspaces", - "@npmcli/package-json", - "@npmcli/run-script", - "abbrev", - "ansicolors", - "ansistyles", - "archy", - "cacache", - "chalk", - "chownr", - "cli-columns", - "cli-table3", - "columnify", - "fastest-levenshtein", - "glob", - "graceful-fs", - "hosted-git-info", - "ini", - "init-package-json", - "is-cidr", - "json-parse-even-better-errors", - "libnpmaccess", - "libnpmdiff", - "libnpmexec", - "libnpmfund", - "libnpmhook", - "libnpmorg", - "libnpmpack", - "libnpmpublish", - "libnpmsearch", - "libnpmteam", - "libnpmversion", - "make-fetch-happen", - "minipass", - "minipass-pipeline", - "mkdirp", - "mkdirp-infer-owner", - "ms", - "node-gyp", - "nopt", - "npm-audit-report", - "npm-install-checks", - "npm-package-arg", - "npm-pick-manifest", - "npm-profile", - "npm-registry-fetch", - "npm-user-validate", - "npmlog", - "opener", - "pacote", - "parse-conflict-json", - "qrcode-terminal", - "read", - "read-package-json", - "read-package-json-fast", - "readdir-scoped-modules", - "rimraf", - "semver", - "ssri", - "tar", - "text-table", - "tiny-relative-date", - "treeverse", - "validate-npm-package-name", - "which", - "write-file-atomic" - ], - "dependencies": { - "@isaacs/string-locale-compare": "*", - "@npmcli/arborist": "*", - "@npmcli/ci-detect": "*", - "@npmcli/config": "*", - "@npmcli/map-workspaces": "*", - "@npmcli/package-json": "*", - "@npmcli/run-script": "*", - "abbrev": "*", - "ansicolors": "*", - "ansistyles": "*", - "archy": "*", - "cacache": "*", - "chalk": "*", - "chownr": "*", - "cli-columns": "*", - "cli-table3": "*", - "columnify": "*", - "fastest-levenshtein": "*", - "glob": "*", - "graceful-fs": "*", - "hosted-git-info": "*", - "ini": "*", - "init-package-json": "*", - "is-cidr": "*", - "json-parse-even-better-errors": "*", - "libnpmaccess": "*", - "libnpmdiff": "*", - "libnpmexec": "*", - "libnpmfund": "*", - "libnpmhook": "*", - "libnpmorg": "*", - "libnpmpack": "*", - "libnpmpublish": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpmversion": "*", - "make-fetch-happen": "*", - "minipass": "*", - "minipass-pipeline": "*", - "mkdirp": "*", - "mkdirp-infer-owner": "*", - "ms": "*", - "node-gyp": "*", - "nopt": "*", - "npm-audit-report": "*", - "npm-install-checks": "*", - "npm-package-arg": "*", - "npm-pick-manifest": "*", - "npm-profile": "*", - "npm-registry-fetch": "*", - "npm-user-validate": "*", - "npmlog": "*", - "opener": "*", - "pacote": "*", - "parse-conflict-json": "*", - "qrcode-terminal": "*", - "read": "*", - "read-package-json": "*", - "read-package-json-fast": "*", - "readdir-scoped-modules": "*", - "rimraf": "*", - "semver": "*", - "ssri": "*", - "tar": "*", - "text-table": "*", - "tiny-relative-date": "*", - "treeverse": "*", - "validate-npm-package-name": "*", - "which": "*", - "write-file-atomic": "*" - }, - "bin": { - "npm": "bin/npm-cli.js", - "npx": "bin/npx-cli.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -9471,15671 +9315,240 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/npm/node_modules/@gar/promisify": { - "version": "1.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/@isaacs/string-locale-compare": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/arborist": { - "version": "2.9.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@isaacs/string-locale-compare": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - }, - "bin": { - "arborist": "bin/index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/ci-detect": { - "version": "1.3.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/config": { - "version": "2.3.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ini": "^2.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "semver": "^7.3.4", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/disparity-colors": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "ansi-styles": "^4.3.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/fs": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "node_modules/npm/node_modules/@npmcli/git": { - "version": "2.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "node_modules/npm/node_modules/@npmcli/installed-package-contents": { - "version": "1.0.7", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "installed-package-contents": "index.js" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/@npmcli/map-workspaces": { - "version": "1.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/metavuln-calculator": { - "version": "1.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "node_modules/npm/node_modules/@npmcli/move-file": { - "version": "1.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/@npmcli/name-from-folder": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/node-gyp": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/@npmcli/package-json": { + "node_modules/number-is-nan": { "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "node_modules/npm/node_modules/@npmcli/promise-spawn": { - "version": "1.3.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "infer-owner": "^1.0.4" - } - }, - "node_modules/npm/node_modules/@npmcli/run-script": { - "version": "1.8.6", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "node_modules/npm/node_modules/@tootallnate/once": { - "version": "1.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/abbrev": { - "version": "1.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/agent-base": { - "version": "6.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/npm/node_modules/agentkeepalive": { - "version": "4.1.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/npm/node_modules/aggregate-error": { - "version": "3.1.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/ajv": { - "version": "6.12.6", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/npm/node_modules/ansi-regex": { - "version": "2.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", + "dev": true, "engines": { "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ansi-styles": { - "version": "4.3.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/ansicolors": { - "version": "0.3.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ansistyles": { - "version": "0.1.3", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aproba": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/archy": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/are-we-there-yet": { - "version": "1.1.6", - "extraneous": true, - "inBundle": true, - "license": "ISC", + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/asap": { - "version": "2.0.6", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/asn1": { - "version": "0.2.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": "~2.1.0" - } - }, - "node_modules/npm/node_modules/assert-plus": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/asynckit": { - "version": "0.4.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/aws-sign2": { - "version": "0.7.0", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/aws4": { - "version": "1.11.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/balanced-match": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/bcrypt-pbkdf": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "tweetnacl": "^0.14.3" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/bin-links": { - "version": "2.2.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, "dependencies": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" + "is-descriptor": "^0.1.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/binary-extensions": { - "version": "2.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/brace-expansion": { - "version": "1.1.11", - "extraneous": true, - "inBundle": true, - "license": "MIT", + "node_modules/object-copy/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/npm/node_modules/builtins": { - "version": "1.0.3", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/cacache": { - "version": "15.3.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" + "kind-of": "^3.0.2" }, "engines": { - "node": ">= 10" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/caseless": { - "version": "0.12.0", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0" - }, - "node_modules/npm/node_modules/chalk": { - "version": "4.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", + "node_modules/object-copy/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" + "kind-of": "^3.0.2" }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/npm/node_modules/chownr": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", "engines": { - "node": ">=10" + "node": ">=0.10.0" } }, - "node_modules/npm/node_modules/cidr-regex": { - "version": "3.1.1", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause", + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, "dependencies": { - "ip-regex": "^4.1.0" + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" }, "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/clean-stack": { - "version": "2.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/cli-columns": { - "version": "3.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - }, - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/cli-table3": { - "version": "0.6.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "colors": "^1.1.2" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/ansi-regex": { - "version": "5.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/string-width": { - "version": "4.2.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/cli-table3/node_modules/strip-ansi": { - "version": "6.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/clone": { - "version": "1.0.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/cmd-shim": { - "version": "4.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mkdirp-infer-owner": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/code-point-at": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/color-convert": { - "version": "2.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/npm/node_modules/color-name": { - "version": "1.1.4", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/color-support": { - "version": "1.1.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "bin": { - "color-support": "bin.js" - } - }, - "node_modules/npm/node_modules/colors": { - "version": "1.4.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/npm/node_modules/columnify": { - "version": "1.5.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "node_modules/npm/node_modules/combined-stream": { - "version": "1.0.8", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/npm/node_modules/common-ancestor-path": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/concat-map": { - "version": "0.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/console-control-strings": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/core-util-is": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/dashdash": { - "version": "1.14.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/npm/node_modules/debug": { - "version": "4.3.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/npm/node_modules/debug/node_modules/ms": { - "version": "2.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/debuglog": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/defaults": { - "version": "1.0.3", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "clone": "^1.0.2" - } - }, - "node_modules/npm/node_modules/delayed-stream": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/npm/node_modules/delegates": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/depd": { - "version": "1.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/dezalgo": { - "version": "1.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/diff": { - "version": "5.0.0", - "extraneous": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/npm/node_modules/ecc-jsbn": { - "version": "0.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "node_modules/npm/node_modules/emoji-regex": { - "version": "8.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/encoding": { - "version": "0.1.13", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/npm/node_modules/env-paths": { - "version": "2.2.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/err-code": { - "version": "2.0.3", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extend": { - "version": "3.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/extsprintf": { - "version": "1.3.0", - "engines": [ - "node >=0.6.0" - ], - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-deep-equal": { - "version": "3.1.3", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/fastest-levenshtein": { - "version": "1.0.12", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/forever-agent": { - "version": "0.6.1", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/fs-minipass": { - "version": "2.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/fs.realpath": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/function-bind": { - "version": "1.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/gauge": { - "version": "3.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/getpass": { - "version": "0.1.7", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0" - } - }, - "node_modules/npm/node_modules/glob": { - "version": "7.2.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/graceful-fs": { - "version": "4.2.8", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/har-schema": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/har-validator": { - "version": "5.1.5", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/has": { - "version": "1.0.3", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/npm/node_modules/has-flag": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/has-unicode": { - "version": "2.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/hosted-git-info": { - "version": "4.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/http-cache-semantics": { - "version": "4.1.0", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/http-proxy-agent": { - "version": "4.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/http-signature": { - "version": "1.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - }, - "engines": { - "node": ">=0.8", - "npm": ">=1.3.7" - } - }, - "node_modules/npm/node_modules/https-proxy-agent": { - "version": "5.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/humanize-ms": { - "version": "1.2.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ms": "^2.0.0" - } - }, - "node_modules/npm/node_modules/iconv-lite": { - "version": "0.6.3", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ignore-walk": { - "version": "3.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minimatch": "^3.0.4" - } - }, - "node_modules/npm/node_modules/imurmurhash": { - "version": "0.1.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/npm/node_modules/indent-string": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/infer-owner": { - "version": "1.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/inflight": { - "version": "1.0.6", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/inherits": { - "version": "2.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/ini": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/init-package-json": { - "version": "2.0.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ip": { - "version": "1.1.5", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/ip-regex": { - "version": "4.3.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/is-cidr": { - "version": "4.0.2", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "cidr-regex": "^3.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/is-core-module": { - "version": "2.7.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/npm/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/is-lambda": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/is-typedarray": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/isexe": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/isstream": { - "version": "0.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsbn": { - "version": "0.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-schema": { - "version": "0.2.3", - "extraneous": true, - "inBundle": true - }, - "node_modules/npm/node_modules/json-schema-traverse": { - "version": "0.4.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/json-stringify-nice": { - "version": "1.1.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/json-stringify-safe": { - "version": "5.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/jsonparse": { - "version": "1.3.1", - "engines": [ - "node >= 0.2.0" - ], - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/jsprim": { - "version": "1.4.1", - "engines": [ - "node >=0.6.0" - ], - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "node_modules/npm/node_modules/just-diff": { - "version": "3.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/just-diff-apply": { - "version": "3.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/libnpmaccess": { - "version": "4.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmdiff": { - "version": "2.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/disparity-colors": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^3.0.4", - "npm-package-arg": "^8.1.4", - "pacote": "^11.3.4", - "tar": "^6.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmexec": { - "version": "2.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.3.0", - "@npmcli/ci-detect": "^1.3.0", - "@npmcli/run-script": "^1.8.4", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^8.1.2", - "pacote": "^11.3.1", - "proc-log": "^1.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmfund": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/arborist": "^2.5.0" - } - }, - "node_modules/npm/node_modules/libnpmhook": { - "version": "6.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmorg": { - "version": "2.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpack": { - "version": "2.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/run-script": "^1.8.3", - "npm-package-arg": "^8.1.0", - "pacote": "^11.2.6" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmpublish": { - "version": "4.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmsearch": { - "version": "3.1.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmteam": { - "version": "2.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/libnpmversion": { - "version": "1.2.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.0.7", - "@npmcli/run-script": "^1.8.4", - "json-parse-even-better-errors": "^2.3.1", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" - } - }, - "node_modules/npm/node_modules/lru-cache": { - "version": "6.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/make-fetch-happen": { - "version": "9.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/mime-db": { - "version": "1.49.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/mime-types": { - "version": "2.1.32", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.49.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/minimatch": { - "version": "3.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/minipass": { - "version": "3.1.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-collect": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-fetch": { - "version": "1.4.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - }, - "engines": { - "node": ">=8" - }, - "optionalDependencies": { - "encoding": "^0.1.12" - } - }, - "node_modules/npm/node_modules/minipass-flush": { - "version": "1.0.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/minipass-json-stream": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "node_modules/npm/node_modules/minipass-pipeline": { - "version": "1.2.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minipass-sized": { - "version": "1.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/minizlib": { - "version": "2.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/mkdirp": { - "version": "1.0.4", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/mkdirp-infer-owner": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/ms": { - "version": "2.1.3", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/mute-stream": { - "version": "0.0.8", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/negotiator": { - "version": "0.6.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/npm/node_modules/node-gyp": { - "version": "7.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "bin": { - "node-gyp": "bin/node-gyp.js" - }, - "engines": { - "node": ">= 10.12.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/aproba": { - "version": "1.2.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/node-gyp/node_modules/gauge": { - "version": "2.7.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/is-fullwidth-code-point": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "number-is-nan": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/npmlog": { - "version": "4.1.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "node_modules/npm/node_modules/node-gyp/node_modules/string-width": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/nopt": { - "version": "5.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/normalize-package-data": { - "version": "3.0.3", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-audit-report": { - "version": "2.1.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chalk": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-bundled": { - "version": "1.1.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "node_modules/npm/node_modules/npm-install-checks": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "semver": "^7.1.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-normalize-package-bin": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/npm-package-arg": { - "version": "8.1.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-packlist": { - "version": "2.2.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - }, - "bin": { - "npm-packlist": "bin/index.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-pick-manifest": { - "version": "6.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "node_modules/npm/node_modules/npm-profile": { - "version": "5.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "npm-registry-fetch": "^11.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-registry-fetch": { - "version": "11.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/npm-user-validate": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause" - }, - "node_modules/npm/node_modules/npmlog": { - "version": "5.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - } - }, - "node_modules/npm/node_modules/npmlog/node_modules/are-we-there-yet": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/number-is-nan": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/oauth-sign": { - "version": "0.9.0", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/object-assign": { - "version": "4.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/once": { - "version": "1.4.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/npm/node_modules/opener": { - "version": "1.5.2", - "extraneous": true, - "inBundle": true, - "license": "(WTFPL OR MIT)", - "bin": { - "opener": "bin/opener-bin.js" - } - }, - "node_modules/npm/node_modules/p-map": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/npm/node_modules/pacote": { - "version": "11.3.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - }, - "bin": { - "pacote": "lib/bin.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/parse-conflict-json": { - "version": "1.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "node_modules/npm/node_modules/path-is-absolute": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/performance-now": { - "version": "2.1.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/proc-log": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-all-reject-late": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-call-limit": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/promise-inflight": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/promise-retry": { - "version": "2.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/promzard": { - "version": "0.3.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "read": "1" - } - }, - "node_modules/npm/node_modules/psl": { - "version": "1.8.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/punycode": { - "version": "2.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/npm/node_modules/qrcode-terminal": { - "version": "0.12.0", - "extraneous": true, - "inBundle": true, - "bin": { - "qrcode-terminal": "bin/qrcode-terminal.js" - } - }, - "node_modules/npm/node_modules/qs": { - "version": "6.5.2", - "extraneous": true, - "inBundle": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/npm/node_modules/read": { - "version": "1.0.7", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "mute-stream": "~0.0.4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/read-cmd-shim": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/read-package-json": { - "version": "4.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/read-package-json-fast": { - "version": "2.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/readable-stream": { - "version": "3.6.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/readdir-scoped-modules": { - "version": "1.1.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "node_modules/npm/node_modules/request": { - "version": "2.88.2", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/npm/node_modules/request/node_modules/form-data": { - "version": "2.3.3", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/npm/node_modules/request/node_modules/tough-cookie": { - "version": "2.5.0", - "extraneous": true, - "inBundle": true, - "license": "BSD-3-Clause", - "dependencies": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/npm/node_modules/retry": { - "version": "0.12.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/npm/node_modules/rimraf": { - "version": "3.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/npm/node_modules/safe-buffer": { - "version": "5.2.1", - "extraneous": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/safer-buffer": { - "version": "2.1.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/semver": { - "version": "7.3.5", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/npm/node_modules/set-blocking": { - "version": "2.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/signal-exit": { - "version": "3.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/smart-buffer": { - "version": "4.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">= 6.0.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks": { - "version": "2.6.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - }, - "engines": { - "node": ">= 10.13.0", - "npm": ">= 3.0.0" - } - }, - "node_modules/npm/node_modules/socks-proxy-agent": { - "version": "6.1.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/spdx-correct": { - "version": "3.1.1", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-exceptions": { - "version": "2.3.0", - "extraneous": true, - "inBundle": true, - "license": "CC-BY-3.0" - }, - "node_modules/npm/node_modules/spdx-expression-parse": { - "version": "3.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/npm/node_modules/spdx-license-ids": { - "version": "3.0.10", - "extraneous": true, - "inBundle": true, - "license": "CC0-1.0" - }, - "node_modules/npm/node_modules/sshpk": { - "version": "1.16.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/ssri": { - "version": "8.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "minipass": "^3.1.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/string_decoder": { - "version": "1.3.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/npm/node_modules/string-width": { - "version": "2.1.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/ansi-regex": { - "version": "3.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/string-width/node_modules/strip-ansi": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/npm/node_modules/stringify-package": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/strip-ansi": { - "version": "3.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm/node_modules/supports-color": { - "version": "7.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/npm/node_modules/tar": { - "version": "6.1.11", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - }, - "engines": { - "node": ">= 10" - } - }, - "node_modules/npm/node_modules/text-table": { - "version": "0.2.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/tiny-relative-date": { - "version": "1.3.0", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/treeverse": { - "version": "1.0.4", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/tunnel-agent": { - "version": "0.6.0", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - }, - "engines": { - "node": "*" - } - }, - "node_modules/npm/node_modules/tweetnacl": { - "version": "0.14.5", - "extraneous": true, - "inBundle": true, - "license": "Unlicense" - }, - "node_modules/npm/node_modules/typedarray-to-buffer": { - "version": "3.1.5", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "is-typedarray": "^1.0.0" - } - }, - "node_modules/npm/node_modules/unique-filename": { - "version": "1.1.1", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "unique-slug": "^2.0.0" - } - }, - "node_modules/npm/node_modules/unique-slug": { - "version": "2.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4" - } - }, - "node_modules/npm/node_modules/uri-js": { - "version": "4.4.1", - "extraneous": true, - "inBundle": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/npm/node_modules/util-deprecate": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "MIT" - }, - "node_modules/npm/node_modules/uuid": { - "version": "3.4.0", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/npm/node_modules/validate-npm-package-license": { - "version": "3.0.4", - "extraneous": true, - "inBundle": true, - "license": "Apache-2.0", - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/npm/node_modules/validate-npm-package-name": { - "version": "3.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "builtins": "^1.0.3" - } - }, - "node_modules/npm/node_modules/verror": { - "version": "1.10.0", - "engines": [ - "node >=0.6.0" - ], - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "node_modules/npm/node_modules/walk-up-path": { - "version": "1.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/wcwidth": { - "version": "1.0.1", - "extraneous": true, - "inBundle": true, - "license": "MIT", - "dependencies": { - "defaults": "^1.0.3" - } - }, - "node_modules/npm/node_modules/which": { - "version": "2.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/npm/node_modules/wide-align": { - "version": "1.1.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/npm/node_modules/wrappy": { - "version": "1.0.2", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/npm/node_modules/write-file-atomic": { - "version": "3.0.3", - "extraneous": true, - "inBundle": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "node_modules/npm/node_modules/yallist": { - "version": "4.0.0", - "extraneous": true, - "inBundle": true, - "license": "ISC" - }, - "node_modules/number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", - "dev": true, - "dependencies": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-copy/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", - "dev": true, - "dependencies": { - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", - "dev": true, - "dependencies": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object.reduce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", - "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", - "dev": true, - "dependencies": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/onetime": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", - "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", - "dev": true, - "dependencies": { - "mimic-fn": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/optionator/node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/ordered-read-streams": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", - "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.1" - } - }, - "node_modules/os-browserify": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", - "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", - "dev": true - }, - "node_modules/os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", - "dev": true, - "dependencies": { - "lcid": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", - "dev": true, - "dependencies": { - "aggregate-error": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pako": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", - "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", - "dev": true - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parents": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", - "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", - "dev": true, - "dependencies": { - "path-platform": "~0.11.15" - } - }, - "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==", - "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/parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", - "dev": true, - "dependencies": { - "error-ex": "^1.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/parse-node-version": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", - "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", - "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", - "dev": true - }, - "node_modules/path-dirname": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", - "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", - "dev": true - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "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==", - "dev": true - }, - "node_modules/path-platform": { - "version": "0.11.15", - "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", - "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", - "dev": true, - "dependencies": { - "path-root-regex": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/pbkdf2": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", - "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "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/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pidtree": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", - "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true, - "bin": { - "pidtree": "bin/pidtree.js" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/plugin-error": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", - "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", - "dev": true, - "dependencies": { - "ansi-colors": "^1.0.1", - "arr-diff": "^4.0.0", - "arr-union": "^3.1.0", - "extend-shallow": "^3.0.2" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true, - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "dev": true - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/propagate": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", - "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/public-encrypt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", - "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "dependencies": { - "bn.js": "^4.1.0", - "browserify-rsa": "^4.0.0", - "create-hash": "^1.1.0", - "parse-asn1": "^5.0.0", - "randombytes": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "node_modules/public-encrypt/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==" - }, - "node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", - "dev": true - }, - "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", - "dev": true, - "dependencies": { - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true, - "engines": { - "node": ">=0.4.x" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/randomfill": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", - "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "dependencies": { - "randombytes": "^2.0.5", - "safe-buffer": "^5.1.0" - } - }, - "node_modules/read-only-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", - "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", - "dev": true, - "dependencies": { - "readable-stream": "^2.0.2" - } - }, - "node_modules/read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", - "dev": true, - "dependencies": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", - "dev": true, - "dependencies": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "dependencies": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg-up/node_modules/path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "dependencies": { - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/read-pkg/node_modules/path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/readable-stream/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/readable-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", - "dev": true, - "dependencies": { - "resolve": "^1.1.6" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regenerate": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true - }, - "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", - "dev": true, - "dependencies": { - "regenerate": "^1.4.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", - "dev": true - }, - "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.8.4" - } - }, - "node_modules/regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/regexpp": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", - "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true, - "engines": { - "node": ">=6.5.0" - } - }, - "node_modules/regexpu-core": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", - "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", - "dev": true, - "dependencies": { - "@babel/regjsgen": "^0.8.0", - "regenerate": "^1.4.2", - "regenerate-unicode-properties": "^10.1.0", - "regjsparser": "^0.9.1", - "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/regjsparser": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", - "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", - "dev": true, - "dependencies": { - "jsesc": "~0.5.0" - }, - "bin": { - "regjsparser": "bin/parser" - } - }, - "node_modules/regjsparser/node_modules/jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, - "bin": { - "jsesc": "bin/jsesc" - } - }, - "node_modules/remove-bom-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", - "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5", - "is-utf8": "^0.2.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/remove-bom-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", - "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", - "dev": true, - "dependencies": { - "remove-bom-buffer": "^3.0.0", - "safe-buffer": "^5.1.0", - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/remove-bom-stream/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", - "dev": true - }, - "node_modules/repeat-element": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", - "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/replace-ext": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", - "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/replace-homedir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", - "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1", - "is-absolute": "^1.0.0", - "remove-trailing-separator": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", - "dev": true - }, - "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", - "dev": true, - "dependencies": { - "is-core-module": "^2.11.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", - "dev": true, - "dependencies": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/resolve-options": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", - "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", - "dev": true, - "dependencies": { - "value-or-function": "^3.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", - "deprecated": "https://github.com/lydell/resolve-url#deprecated", - "dev": true - }, - "node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", - "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/restore-cursor/node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/restore-cursor/node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true, - "engines": { - "node": ">=0.12" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rfdc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", - "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", - "dev": true - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "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==", - "dependencies": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1" - } - }, - "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/rxjs": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", - "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", - "dev": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/rxjs/node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", - "dev": true, - "dependencies": { - "ret": "~0.1.10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "node_modules/sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" - }, - "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-greatest-satisfied-range": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", - "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", - "dev": true, - "dependencies": { - "sver-compat": "^1.5.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", - "dev": true - }, - "node_modules/set-value": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", - "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", - "dev": true, - "dependencies": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/set-value/node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "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==", - "dependencies": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - }, - "bin": { - "sha.js": "bin.js" - } - }, - "node_modules/shasum": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", - "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", - "dev": true, - "dependencies": { - "json-stable-stringify": "~0.0.0", - "sha.js": "~2.4.4" - } - }, - "node_modules/shasum-object": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", - "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", - "dev": true, - "dependencies": { - "fast-safe-stringify": "^2.0.7" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/shell-quote": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", - "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/simple-concat": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "dependencies": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "dependencies": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-node/node_modules/define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "dependencies": { - "is-descriptor": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "dependencies": { - "kind-of": "^3.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon-util/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/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/snapdragon/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "dependencies": { - "is-extendable": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/snapdragon/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/snapdragon/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-resolve": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", - "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", - "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", - "dev": true, - "dependencies": { - "atob": "^2.1.2", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/source-map-url": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", - "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", - "deprecated": "See https://github.com/lydell/source-map-url#deprecated", - "dev": true - }, - "node_modules/sparkles": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", - "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/spdx-correct": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", - "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", - "dev": true - }, - "node_modules/split-file": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/split-file/-/split-file-2.3.0.tgz", - "integrity": "sha512-dc/0SDKvjtSjUI999vkclWQAk5xhD86pKEWWL2ULR6WrHI9/euIEMG/JSUbwbNW8IC+gYLJqynSGHwlOVmSwGA==", - "dev": true, - "dependencies": { - "bluebird": "^3.7.2" - }, - "bin": { - "split-file": "split-file-cli.js" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "engines": { - "node": ">=6" - } - }, - "node_modules/split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "dependencies": { - "extend-shallow": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", - "dev": true, - "dependencies": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "dependencies": { - "is-descriptor": "^0.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/static-extend/node_modules/is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "dependencies": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stream-browserify": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", - "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", - "dev": true, - "dependencies": { - "inherits": "~2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-combiner2": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", - "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", - "dev": true, - "dependencies": { - "duplexer2": "~0.1.0", - "readable-stream": "^2.0.2" - } - }, - "node_modules/stream-exhaust": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", - "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", - "dev": true - }, - "node_modules/stream-http": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", - "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", - "dev": true, - "dependencies": { - "builtin-status-codes": "^3.0.0", - "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "xtend": "^4.0.2" - } - }, - "node_modules/stream-http/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/stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", - "dev": true - }, - "node_modules/stream-splicer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", - "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.2" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true, - "engines": { - "node": ">=0.6.19" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "dev": true, - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", - "dev": true, - "dependencies": { - "is-utf8": "^0.2.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-bom-string": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", - "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-final-newline": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", - "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", - "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" - }, - "node_modules/subarg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", - "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", - "dev": true, - "dependencies": { - "minimist": "^1.1.0" - } - }, - "node_modules/superagent": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", - "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", - "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", - "dev": true, - "dependencies": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - }, - "engines": { - "node": ">= 7.0.0" - } - }, - "node_modules/superagent/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/superagent/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/superagent/node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/superagent/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sver-compat": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", - "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", - "dev": true, - "dependencies": { - "es6-iterator": "^2.0.1", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/syntax-error": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", - "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", - "dev": true, - "dependencies": { - "acorn-node": "^1.2.0" - } - }, - "node_modules/table": { - "version": "5.4.6", - "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", - "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", - "dev": true, - "dependencies": { - "ajv": "^6.10.2", - "lodash": "^4.17.14", - "slice-ansi": "^2.1.0", - "string-width": "^3.0.0" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/table/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/table/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/table/node_modules/emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "node_modules/table/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/table/node_modules/slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "dependencies": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/table/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/ternary-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-3.0.0.tgz", - "integrity": "sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==", - "dev": true, - "dependencies": { - "duplexify": "^4.1.1", - "fork-stream": "^0.0.4", - "merge-stream": "^2.0.0", - "through2": "^3.0.1" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", - "dev": true - }, - "node_modules/through2": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", - "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "dependencies": { - "inherits": "^2.0.4", - "readable-stream": "2 || 3" - } - }, - "node_modules/through2-filter": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", - "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", - "dev": true, - "dependencies": { - "through2": "~2.0.0", - "xtend": "~4.0.0" - } - }, - "node_modules/through2-filter/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/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==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/time-stamp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", - "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/timers-browserify": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", - "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", - "dev": true, - "dependencies": { - "process": "~0.11.0" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dev": true, - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, - "node_modules/tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "dependencies": { - "os-tmpdir": "~1.0.2" - }, - "engines": { - "node": ">=0.6.0" - } - }, - "node_modules/to-absolute-glob": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", - "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", - "dev": true, - "dependencies": { - "is-absolute": "^1.0.0", - "is-negated-glob": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", - "dev": true, - "dependencies": { - "kind-of": "^3.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-object-path/node_modules/kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "dependencies": { - "is-buffer": "^1.1.5" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "dependencies": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/to-regex-range/node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/to-through": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", - "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", - "dev": true, - "dependencies": { - "through2": "^2.0.3" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/to-through/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tty-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", - "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", - "dev": true - }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "dev": true - }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, - "node_modules/umd": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", - "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true, - "bin": { - "umd": "bin/cli.js" - } - }, - "node_modules/unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/undeclared-identifiers": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", - "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", - "dev": true, - "dependencies": { - "acorn-node": "^1.3.0", - "dash-ast": "^1.0.0", - "get-assigned-identifiers": "^1.2.0", - "simple-concat": "^1.0.0", - "xtend": "^4.0.1" - }, - "bin": { - "undeclared-identifiers": "bin.js" - } - }, - "node_modules/undertaker": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", - "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", - "dev": true, - "dependencies": { - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "bach": "^1.0.0", - "collection-map": "^1.0.0", - "es6-weak-map": "^2.0.1", - "fast-levenshtein": "^1.0.0", - "last-run": "^1.1.0", - "object.defaults": "^1.0.0", - "object.reduce": "^1.0.0", - "undertaker-registry": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/undertaker-registry": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", - "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/unicode-canonical-property-names-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", - "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", - "dev": true, - "dependencies": { - "unicode-canonical-property-names-ecmascript": "^2.0.0", - "unicode-property-aliases-ecmascript": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", - "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/unicode-property-aliases-ecmascript": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", - "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/union-value": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", - "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", - "dev": true, - "dependencies": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^2.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/union-value/node_modules/is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unique-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", - "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", - "dev": true, - "dependencies": { - "json-stable-stringify-without-jsonify": "^1.0.1", - "through2-filter": "^3.0.0" - } - }, - "node_modules/unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", - "dev": true, - "dependencies": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "dependencies": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "dependencies": { - "isarray": "1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/unset-value/node_modules/has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/upath": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", - "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true, - "engines": { - "node": ">=4", - "yarn": "*" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/uri-js/node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", - "deprecated": "Please see https://github.com/lydell/urix#deprecated", - "dev": true - }, - "node_modules/url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", - "dev": true, - "dependencies": { - "punycode": "1.3.2", - "querystring": "0.2.0" - } - }, - "node_modules/url/node_modules/punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - }, - "node_modules/use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" - }, - "node_modules/uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", - "dev": true, - "bin": { - "uuid": "bin/uuid" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8flags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", - "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", - "dev": true, - "dependencies": { - "homedir-polyfill": "^1.0.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "node_modules/value-or-function": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", - "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", - "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", - "dev": true, - "dependencies": { - "clone": "^2.1.1", - "clone-buffer": "^1.0.0", - "clone-stats": "^1.0.0", - "cloneable-readable": "^1.0.0", - "remove-trailing-separator": "^1.0.1", - "replace-ext": "^1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", - "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", - "dev": true, - "dependencies": { - "fs-mkdirp-stream": "^1.0.0", - "glob-stream": "^6.1.0", - "graceful-fs": "^4.0.0", - "is-valid-glob": "^1.0.0", - "lazystream": "^1.0.0", - "lead": "^1.0.0", - "object.assign": "^4.0.4", - "pumpify": "^1.3.5", - "readable-stream": "^2.3.3", - "remove-bom-buffer": "^3.0.0", - "remove-bom-stream": "^1.2.0", - "resolve-options": "^1.1.0", - "through2": "^2.0.0", - "to-through": "^2.0.0", - "value-or-function": "^3.0.0", - "vinyl": "^2.0.0", - "vinyl-sourcemap": "^1.1.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-fs/node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/vinyl-sourcemap": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", - "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", - "dev": true, - "dependencies": { - "append-buffer": "^1.0.2", - "convert-source-map": "^1.5.0", - "graceful-fs": "^4.1.6", - "normalize-path": "^2.1.1", - "now-and-later": "^2.0.0", - "remove-bom-buffer": "^3.0.0", - "vinyl": "^2.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vinyl-sourcemap/node_modules/normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "dependencies": { - "remove-trailing-separator": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vinyl-sourcemaps-apply": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", - "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", - "dev": true, - "dependencies": { - "source-map": "^0.5.1" - } - }, - "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/vm-browserify": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", - "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", - "dev": true - }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", - "dev": true - }, - "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/wide-align": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", - "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", - "dev": true, - "dependencies": { - "string-width": "^1.0.2 || 2" - } - }, - "node_modules/wide-align/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/wide-align/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", - "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", - "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", - "dev": true, - "dependencies": { - "mkdirp": "^0.5.1" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/xml": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", - "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" - }, - "node_modules/xml2js": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", - "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true, - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, - "node_modules/yaml": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", - "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", - "dev": true, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/yargs/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, - "dependencies": { - "@ampproject/remapping": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", - "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", - "dev": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", - "dev": true, - "requires": { - "@babel/highlight": "^7.18.6" - } - }, - "@babel/compat-data": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", - "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", - "dev": true - }, - "@babel/core": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.4.tgz", - "integrity": "sha512-qt/YV149Jman/6AfmlxJ04LMIu8bMoyl3RB91yTFrxQmgbrSvQMy7cI8Q62FHx1t8wJ8B5fu0UDoLwHAhUo1QA==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helpers": "^7.21.0", - "@babel/parser": "^7.21.4", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.4", - "@babel/types": "^7.21.4", - "convert-source-map": "^1.7.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" - } - }, - "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", - "dev": true, - "requires": { - "@babel/types": "^7.21.4", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" - } - }, - "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", - "dev": true, - "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", - "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" - } - }, - "@babel/helper-create-class-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.4.tgz", - "integrity": "sha512-46QrX2CQlaFRF4TkwfTt6nJD7IHq8539cCL7SDpqWSDeJKY1xylKKY5F/33mJhLZ3mFvKv2gGrVS6NkyF6qs+Q==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6" - } - }, - "@babel/helper-create-regexp-features-plugin": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.4.tgz", - "integrity": "sha512-M00OuhU+0GyZ5iBBN9czjugzWrEq2vDpf/zCYHxxf93ul/Q5rv+a5h+/+0WnI1AebHNVtl5bFV0qsJoH23DbfA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.3.1" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" - } - }, - "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", - "dev": true - }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.0.tgz", - "integrity": "sha512-Muu8cdZwNN6mRRNG6lAYErJ5X3bRevgYR2O8wN0yn7jJSnGDu6eG59RfT29JHxGUovyfrh6Pj0XzmR7drNVL3Q==", - "dev": true, - "requires": { - "@babel/types": "^7.21.0" - } - }, - "@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", - "dev": true, - "requires": { - "@babel/types": "^7.21.4" - } - }, - "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", - "dev": true - }, - "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" - } - }, - "@babel/helper-replace-supers": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.20.7.tgz", - "integrity": "sha512-vujDMtB6LVfNW13jhlCrp48QNslK6JXi7lQG736HVbHz/mbf4Dc7tIRh1Xf5C0rF7BP8iiSxGMCmY6Ci1ven3A==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-member-expression-to-functions": "^7.20.7", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", - "dev": true, - "requires": { - "@babel/types": "^7.20.2" - } - }, - "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", - "dev": true, - "requires": { - "@babel/types": "^7.20.0" - } - }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, - "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", - "dev": true - }, - "@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true - }, - "@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", - "dev": true - }, - "@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", - "dev": true, - "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" - } - }, - "@babel/helpers": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.0.tgz", - "integrity": "sha512-XXve0CBtOW0pd7MRzzmoyuSj0e3SEzj8pgyFxnTT1NJZL38BD1MK7yYrm8yefRPIDvNNe14xR4FdbHwpInD4rA==", - "dev": true, - "requires": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.0", - "@babel/types": "^7.21.0" - } - }, - "@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", - "dev": true - }, - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" - } - }, - "@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", - "dev": true, - "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" - } - }, - "@babel/plugin-proposal-class-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", - "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, - "@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.20.5", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-transform-parameters": "^7.20.7" - } - }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } - }, - "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.12.13" - } - }, - "@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-dynamic-import": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", - "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-export-namespace-from": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", - "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.3" - } - }, - "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.19.0" - } - }, - "@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.10.4" - } - }, - "@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.8.0" - } - }, - "@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.14.5" - } - }, - "@babel/plugin-transform-arrow-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.20.7.tgz", - "integrity": "sha512-3poA5E7dzDomxj9WXWwuD6A5F3kc7VXwIJO+E+J8qtDtS+pXPAhrgEyh+9GBwBgPq1Z+bB+/JD60lp5jsN7JPQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", - "dev": true, - "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" - } - }, - "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/plugin-transform-computed-properties": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.20.7.tgz", - "integrity": "sha512-Lz7MvBK6DTjElHAmfu6bfANzKcxpyNPeYBGEafyA6E5HtRpjpZwU+u7Qrgz/2OR0z+5TvKYbPdphfSaAcZBrYQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/template": "^7.20.7" - } - }, - "@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", - "dev": true, - "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-for-of": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.0.tgz", - "integrity": "sha512-LlUYlydgDkKpIY7mcBWvyPPmMcOphEyYA27Ef4xpbh1IiDNLr0kZsos2nf92vz3IccvJI25QUwp86Eo5s6HmBQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", - "dev": true, - "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" - } - }, - "@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", - "dev": true, - "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" - } - }, - "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", - "dev": true, - "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" - } - }, - "@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2" - } - }, - "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-regenerator": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz", - "integrity": "sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "regenerator-transform": "^0.15.1" - } - }, - "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" - } - }, - "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, - "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", - "dev": true, - "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, - "@babel/preset-env": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.4.tgz", - "integrity": "sha512-2W57zHs2yDLm6GD5ZpvNn71lZ0B/iypSdIeq25OurDKji6AdzV07qp4s3n1/x5BqtiGaTrPN3nerlSCaC5qNTw==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.21.4", - "@babel/helper-compilation-targets": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-dynamic-import": "^7.8.3", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.20.7", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.20.7", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.0", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.20.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.4", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" - } - }, - "@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", - "@babel/types": "^7.4.4", - "esutils": "^2.0.2" - } - }, - "@babel/regjsgen": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", - "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", - "dev": true - }, - "@babel/runtime": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.0.tgz", - "integrity": "sha512-xwII0//EObnq89Ji5AKYQaRYiW/nZ3llSv29d49IuxPhKbtJoLP+9QUUZ4nVragQVtaVGeZrpB+ZtG/Pdy/POw==", - "dev": true, - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, - "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" - } - }, - "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", - "debug": "^4.1.0", - "globals": "^11.1.0" - }, - "dependencies": { - "globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true - } - } - }, - "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", - "dev": true, - "requires": { - "@babel/helper-string-parser": "^7.19.4", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" - } - }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.0.tgz", - "integrity": "sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.1", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", - "dev": true - }, - "@gulp-sourcemaps/identity-map": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/identity-map/-/identity-map-1.0.2.tgz", - "integrity": "sha512-ciiioYMLdo16ShmfHBXJBOFm3xPC4AuwO4xeRpFeHz7WK9PYsWCmigagG2XyzZpubK4a3qNKoUBDhbzHfa50LQ==", - "dev": true, - "requires": { - "acorn": "^5.0.3", - "css": "^2.2.1", - "normalize-path": "^2.1.1", - "source-map": "^0.6.0", - "through2": "^2.0.3" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "@gulp-sourcemaps/map-sources": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@gulp-sourcemaps/map-sources/-/map-sources-1.0.0.tgz", - "integrity": "sha512-o/EatdaGt8+x2qpb0vFLC/2Gug/xYPRXb6a+ET1wGYKozKN3krDWC/zZFZAtrzxJHuDL12mwdfEFKcKMNvc55A==", - "dev": true, - "requires": { - "normalize-path": "^2.0.1", - "through2": "^2.0.3" - }, - "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true - }, - "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - }, - "dependencies": { - "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - } - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "@types/lodash": { - "version": "4.14.192", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.192.tgz", - "integrity": "sha512-km+Vyn3BYm5ytMO13k9KTp27O75rbQ0NFw+U//g+PX7VZyjCioXaRFisqSIJRECljcTv73G3i6BpglNGHgUQ5A==", - "dev": true - }, - "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", - "dev": true - }, - "@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.1.tgz", - "integrity": "sha512-1MeobQkQ9tztuleT3v72XmY0XuKXVXusAhryoLuU5YZ+mXoYKZP9SQ7Flulh1NX4DTjpGTc2b/eMu4u7M7dhnQ==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/type-utils": "5.57.1", - "@typescript-eslint/utils": "5.57.1", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/parser": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.57.1.tgz", - "integrity": "sha512-hlA0BLeVSA/wBPKdPGxoVr9Pp6GutGoY380FEhbVi0Ph4WNe8kLvqIRx76RSQt1lynZKfrXKs0/XeEk4zZycuA==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.57.1.tgz", - "integrity": "sha512-N/RrBwEUKMIYxSKl0oDK5sFVHd6VI7p9K5MyUlVYAY6dyNb/wHUqndkTd3XhpGlXgnQsBkRZuu4f9kAHghvgPw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.57.1.tgz", - "integrity": "sha512-/RIPQyx60Pt6ga86hKXesXkJ2WOS4UemFrmmq/7eOyiYjYv/MUSHPlkhU6k9T9W1ytnTJueqASW+wOmW4KrViw==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.57.1", - "@typescript-eslint/utils": "5.57.1", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - } - }, - "@typescript-eslint/types": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.57.1.tgz", - "integrity": "sha512-bSs4LOgyV3bJ08F5RDqO2KXqg3WAdwHCu06zOqcQ6vqbTJizyBhuh1o1ImC69X4bV2g1OJxbH71PJqiO7Y1RuA==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.1.tgz", - "integrity": "sha512-A2MZqD8gNT0qHKbk2wRspg7cHbCDCk2tcqt6ScCFLr5Ru8cn+TCfM786DjPhqwseiS+PrYwcXht5ztpEQ6TFTw==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/visitor-keys": "5.57.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/utils": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.57.1.tgz", - "integrity": "sha512-kN6vzzf9NkEtawECqze6v99LtmDiUJCVpvieTFA1uL7/jDghiJGubGZ5csicYHU1Xoqb3oH/R5cN5df6W41Nfg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.57.1", - "@typescript-eslint/types": "5.57.1", - "@typescript-eslint/typescript-estree": "5.57.1", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "dependencies": { - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.57.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.1.tgz", - "integrity": "sha512-RjQrAniDU0CEk5r7iphkm731zKlFiUjvcBS2yHAg8WWqFMCaCrD0rKEVOMUyMMcbGPZ0bPp56srkGWrgfZqLRA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.57.1", - "eslint-visitor-keys": "^3.3.0" - } - }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, - "@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "optional": true - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-node": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", - "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", - "dev": true, - "requires": { - "acorn": "^7.0.0", - "acorn-walk": "^7.0.0", - "xtend": "^4.0.2" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "acorn-walk": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", - "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", - "dev": true - } - } - }, - "aggregate-error": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", - "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", - "dev": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-colors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", - "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", - "dev": true, - "requires": { - "ansi-wrap": "^0.1.0" - } - }, - "ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "requires": { - "type-fest": "^0.21.3" - }, - "dependencies": { - "type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true - } - } - }, - "ansi-gray": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", - "integrity": "sha512-HrgGIZUl8h2EHuZaU9hTR/cU5nhKxpVE1V6kdGsQ8e4zirElJ5fvtfc8N7Q1oq1aatO275i8pUFUCpNWCAnVWw==", - "dev": true, - "requires": { - "ansi-wrap": "0.1.0" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansi-wrap": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", - "integrity": "sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==", - "dev": true - }, - "anymatch": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", - "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", - "dev": true, - "requires": { - "micromatch": "^3.1.4", - "normalize-path": "^2.1.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "append-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/append-buffer/-/append-buffer-1.0.2.tgz", - "integrity": "sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==", - "dev": true, - "requires": { - "buffer-equal": "^1.0.0" - } - }, - "archy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", - "dev": true - }, - "arr-filter": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/arr-filter/-/arr-filter-1.1.2.tgz", - "integrity": "sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/arr-map/-/arr-map-2.0.2.tgz", - "integrity": "sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==", - "dev": true, - "requires": { - "make-iterator": "^1.0.0" - } - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==", - "dev": true - }, - "array-initial": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-initial/-/array-initial-1.1.0.tgz", - "integrity": "sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==", - "dev": true, - "requires": { - "array-slice": "^1.0.0", - "is-number": "^4.0.0" - } - }, - "array-last": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/array-last/-/array-last-1.3.0.tgz", - "integrity": "sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==", - "dev": true, - "requires": { - "is-number": "^4.0.0" - } - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-sort": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-1.0.0.tgz", - "integrity": "sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==", - "dev": true, - "requires": { - "default-compare": "^1.0.0", - "get-value": "^2.0.6", - "kind-of": "^5.0.2" - } - }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", - "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==", - "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==" - } - } - }, - "assert": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", - "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", - "dev": true, - "requires": { - "object-assign": "^4.1.1", - "util": "0.10.3" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==", - "dev": true - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha512-5KiHfsmkqacuKjkRkdV7SsfDJ2EGiPsK92s2MhNSY0craxjTdKTtqKsJaCWp4LW33ZZ0OPUv1WO/TFvNQRiQxQ==", - "dev": true, - "requires": { - "inherits": "2.0.1" - } - } - } - }, - "assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true - }, - "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" - }, - "async-done": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/async-done/-/async-done-1.3.2.tgz", - "integrity": "sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.2", - "process-nextick-args": "^2.0.0", - "stream-exhaust": "^1.0.1" - } - }, - "async-each": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.6.tgz", - "integrity": "sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==", - "dev": true - }, - "async-settle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/async-settle/-/async-settle-1.0.0.tgz", - "integrity": "sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==", - "dev": true, - "requires": { - "async-done": "^1.2.2" - } - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==" - }, - "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" - } - }, - "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" - } - }, - "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", - "dev": true, - "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" - } - }, - "babelify": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/babelify/-/babelify-10.0.0.tgz", - "integrity": "sha512-X40FaxyH7t3X+JFAKvb1H9wooWKLRCi8pg3m8poqtdZaIng+bjzp9RvKQCvRjF9isHiPkXspbbXT/zwXLtwgwg==", - "dev": true, - "requires": {} - }, - "bach": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bach/-/bach-1.2.0.tgz", - "integrity": "sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==", - "dev": true, - "requires": { - "arr-filter": "^1.1.1", - "arr-flatten": "^1.0.1", - "arr-map": "^2.0.0", - "array-each": "^1.0.0", - "array-initial": "^1.0.0", - "array-last": "^1.1.1", - "async-done": "^1.2.2", - "async-settle": "^1.0.0", - "now-and-later": "^2.0.0" - } - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } - } - }, - "base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true - }, - "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true - }, - "block-stream2": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-2.1.0.tgz", - "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", - "requires": { - "readable-stream": "^3.4.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==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", - "dev": true - }, - "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==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==" - }, - "browser-or-node": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-1.3.0.tgz", - "integrity": "sha512-0F2z/VSnLbmEeBcUrSuDH5l0HxTXdQQzLjkmBR4cYfvg1zJrKSlmIZFqyFR8oX0NrwPhy3c3HQ6i3OxMbew4Tg==" - }, - "browser-pack": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz", - "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==", - "dev": true, - "requires": { - "combine-source-map": "~0.8.0", - "defined": "^1.0.0", - "JSONStream": "^1.0.3", - "safe-buffer": "^5.1.1", - "through2": "^2.0.0", - "umd": "^3.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "browser-resolve": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-2.0.0.tgz", - "integrity": "sha512-7sWsQlYL2rGLy2IWm8WL8DCTJvYLc/qlOnsakDac87SOoCd16WLsaAMdCiAqsTNHIe+SXfaqyxyo6THoWqs8WQ==", - "dev": true, - "requires": { - "resolve": "^1.17.0" - } - }, - "browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "browserify": { - "version": "16.5.2", - "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.5.2.tgz", - "integrity": "sha512-TkOR1cQGdmXU9zW4YukWzWVSJwrxmNdADFbqbE3HFgQWe5wqZmOawqZ7J/8MPCwk/W8yY7Y0h+7mOtcZxLP23g==", - "dev": true, - "requires": { - "assert": "^1.4.0", - "browser-pack": "^6.0.1", - "browser-resolve": "^2.0.0", - "browserify-zlib": "~0.2.0", - "buffer": "~5.2.1", - "cached-path-relative": "^1.0.0", - "concat-stream": "^1.6.0", - "console-browserify": "^1.1.0", - "constants-browserify": "~1.0.0", - "crypto-browserify": "^3.0.0", - "defined": "^1.0.0", - "deps-sort": "^2.0.0", - "domain-browser": "^1.2.0", - "duplexer2": "~0.1.2", - "events": "^2.0.0", - "glob": "^7.1.0", - "has": "^1.0.0", - "htmlescape": "^1.1.0", - "https-browserify": "^1.0.0", - "inherits": "~2.0.1", - "insert-module-globals": "^7.0.0", - "JSONStream": "^1.0.3", - "labeled-stream-splicer": "^2.0.0", - "mkdirp-classic": "^0.5.2", - "module-deps": "^6.2.3", - "os-browserify": "~0.3.0", - "parents": "^1.0.1", - "path-browserify": "~0.0.0", - "process": "~0.11.0", - "punycode": "^1.3.2", - "querystring-es3": "~0.2.0", - "read-only-stream": "^2.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.1.4", - "shasum": "^1.0.0", - "shell-quote": "^1.6.1", - "stream-browserify": "^2.0.0", - "stream-http": "^3.0.0", - "string_decoder": "^1.1.1", - "subarg": "^1.0.0", - "syntax-error": "^1.1.1", - "through2": "^2.0.0", - "timers-browserify": "^1.0.1", - "tty-browserify": "0.0.1", - "url": "~0.11.0", - "util": "~0.10.1", - "vm-browserify": "^1.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "util": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz", - "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - } - } - }, - "browserify-aes": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", - "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", - "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", - "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", - "requires": { - "browserify-aes": "^1.0.4", - "browserify-des": "^1.0.0", - "evp_bytestokey": "^1.0.0" - } - }, - "browserify-des": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", - "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", - "requires": { - "cipher-base": "^1.0.1", - "des.js": "^1.0.0", - "inherits": "^2.0.1", - "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==", - "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==", - "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.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "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", - "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", - "dev": true, - "requires": { - "pako": "~1.0.5" - } - }, - "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" - }, - "buffer-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-1.0.1.tgz", - "integrity": "sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==", - "dev": true - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "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==" - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "cached-path-relative": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.1.0.tgz", - "integrity": "sha512-WF0LihfemtesFcJgO7xfOoOcnWzY/QHR4qeDqV44jPU3HTI54+LnfXK3SA27AVVGCdZFgjjFFaqUA9Jx7dMJZA==", - "dev": true - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true - }, - "caniuse-lite": { - "version": "1.0.30001476", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001476.tgz", - "integrity": "sha512-JmpktFppVSvyUN4gsLS0bShY2L9ZUslHLE72vgemBkS43JD2fOvKTKs+GtRwuxrtRGnwJFW0ye7kWRRlLJS9vQ==", - "dev": true - }, - "chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "requires": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "dependencies": { - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "requires": { - "has-flag": "^4.0.0" - } - } - } - }, - "chardet": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", - "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", - "dev": true - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true - }, - "chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - } - } - }, - "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==", - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - } - } - }, - "clean-stack": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", - "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", - "dev": true - }, - "cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", - "dev": true, - "requires": { - "restore-cursor": "^3.1.0" - } - }, - "cli-truncate": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", - "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", - "dev": true, - "requires": { - "slice-ansi": "^5.0.0", - "string-width": "^5.0.0" - } - }, - "cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", - "dev": true - }, - "cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "requires": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "dev": true - }, - "clone-buffer": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", - "integrity": "sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==", - "dev": true - }, - "clone-stats": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", - "integrity": "sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==", - "dev": true - }, - "cloneable-readable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.3.tgz", - "integrity": "sha512-2EF8zTQOxYq70Y4XKtorQupqF0m49MBz2/yf5Bj+MHjvpG3Hy7sImifnqD6UA+TKYxeSV+u6qqQPawN5UvnpKQ==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "process-nextick-args": "^2.0.0", - "readable-stream": "^2.3.5" - } - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==", - "dev": true - }, - "collection-map": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-map/-/collection-map-1.0.0.tgz", - "integrity": "sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==", - "dev": true, - "requires": { - "arr-map": "^2.0.2", - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", - "dev": true - }, - "colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "combine-source-map": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz", - "integrity": "sha512-UlxQ9Vw0b/Bt/KYwCFqdEwsQ1eL8d1gibiFb7lxQJFdvTgc2hIZi6ugsg+kyhzhPV+QEpUiEIwInIAIrgoEkrg==", - "dev": true, - "requires": { - "convert-source-map": "~1.1.0", - "inline-source-map": "~0.6.0", - "lodash.memoize": "~3.0.3", - "source-map": "~0.5.3" - }, - "dependencies": { - "convert-source-map": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz", - "integrity": "sha512-Y8L5rp6jo+g9VEPgvqNfEopjTR4OTYct8lXlS8iVQdmnjDvbdbzYe9rjtFCB9egC86JoNCU61WRY+ScjkZpnIg==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.0.tgz", - "integrity": "sha512-zS5PnTI22FIRM6ylNW8G4Ap0IEOyk62fhLSD0+uHRT9McRCLGpkVNvao4bjimpK/GShynyQkFFxHhwMcETmduA==", - "dev": true - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", - "dev": true - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "console-browserify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", - "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", - "dev": true - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==", - "dev": true - }, - "convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "dev": true - }, - "cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", - "dev": true - }, - "copy-props": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/copy-props/-/copy-props-2.0.5.tgz", - "integrity": "sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==", - "dev": true, - "requires": { - "each-props": "^1.3.2", - "is-plain-object": "^5.0.0" - } - }, - "core-js-compat": { - "version": "3.30.0", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.0.tgz", - "integrity": "sha512-P5A2h/9mRYZFIAP+5Ab8ns6083IyVpSclU74UNvbGVQ8VM7n3n3/g2yF3AkKQ9NXz2O+ioxLbEWKnDtgsFamhg==", - "dev": true, - "requires": { - "browserslist": "^4.21.5" - } - }, - "core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true - }, - "create-ecdh": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", - "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", - "requires": { - "bn.js": "^4.1.0", - "elliptic": "^6.5.3" - }, - "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==" - } - } - }, - "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==", - "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==", - "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", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" - } - }, - "css": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/css/-/css-2.2.4.tgz", - "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "source-map": "^0.6.1", - "source-map-resolve": "^0.5.2", - "urix": "^0.1.0" - } - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dev": true, - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dargs": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", - "integrity": "sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg==", - "dev": true - }, - "dash-ast": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", - "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==", - "dev": true - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "debug-fabulous": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/debug-fabulous/-/debug-fabulous-1.1.0.tgz", - "integrity": "sha512-GZqvGIgKNlUnHUPQhepnUZFIMoi3dgZKQBzKDeL2g7oJF9SNAji/AAu36dusFUas0O+pae74lNeoIPHqXWDkLg==", - "dev": true, - "requires": { - "debug": "3.X", - "memoizee": "0.4.X", - "object-assign": "4.X" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true - }, - "decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" - }, - "deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "requires": { - "type-detect": "^4.0.0" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "default-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz", - "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==", - "dev": true, - "requires": { - "kind-of": "^5.0.2" - } - }, - "default-resolution": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/default-resolution/-/default-resolution-2.0.0.tgz", - "integrity": "sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==", - "dev": true - }, - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - } - }, - "defined": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.1.tgz", - "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==", - "dev": true - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true - }, - "deps-sort": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.1.tgz", - "integrity": "sha512-1orqXQr5po+3KI6kQb9A4jnXT1PBwggGl2d7Sq2xsnOeI9GPcE/tGcF9UiSZtZBM7MukY4cAh7MemS6tZYipfw==", - "dev": true, - "requires": { - "JSONStream": "^1.0.3", - "shasum-object": "^1.0.0", - "subarg": "^1.0.0", - "through2": "^2.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "des.js": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", - "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", - "requires": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", - "dev": true - }, - "detect-newline": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", - "integrity": "sha512-CwffZFvlJffUg9zZA0uqrjQayUTC8ob94pnr5sFwaVv3IOmkfUHcWH+jXaQK3askE51Cqe8/9Ql/0uXNwqZ8Zg==", - "dev": true - }, - "detective": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.1.tgz", - "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", - "dev": true, - "requires": { - "acorn-node": "^1.8.2", - "defined": "^1.0.0", - "minimist": "^1.2.6" - } - }, - "diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", - "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", - "requires": { - "bn.js": "^4.1.0", - "miller-rabin": "^4.0.0", - "randombytes": "^2.0.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==" - } - } - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "domain-browser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", - "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", - "dev": true - }, - "duplexer2": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz", - "integrity": "sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==", - "dev": true, - "requires": { - "readable-stream": "^2.0.2" - } - }, - "duplexify": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", - "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", - "dev": true, - "requires": { - "end-of-stream": "^1.4.1", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1", - "stream-shift": "^1.0.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" - } - } - } - }, - "each-props": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/each-props/-/each-props-1.3.2.tgz", - "integrity": "sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.1", - "object.defaults": "^1.1.0" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.4.356", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.356.tgz", - "integrity": "sha512-nEftV1dRX3omlxAj42FwqRZT0i4xd2dIg39sog/CnCJeCcL1TRd2Uh0i9Oebgv8Ou0vzTPw++xc+Z20jzS2B6A==", - "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==", - "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==" - } - } - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "dev": true, - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-error": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", - "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dev": true, - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", - "@humanwhocodes/config-array": "^0.11.8", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - } - } - }, - "eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", - "dev": true, - "requires": {} - }, - "eslint-plugin-simple-import-sort": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-simple-import-sort/-/eslint-plugin-simple-import-sort-10.0.0.tgz", - "integrity": "sha512-AeTvO9UCMSNzIHRkg8S6c3RPy5YEwKWSQPx3DYghLedo2ZQxowPFLGDN1AZ2evfg6r6mjBSZSLxLFsWSu3acsw==", - "dev": true, - "requires": {} - }, - "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "eslint-utils": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", - "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^1.1.0" - }, - "dependencies": { - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - } - } - }, - "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", - "dev": true - }, - "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "dev": true, - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "events": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz", - "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg==", - "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==", - "requires": { - "md5.js": "^1.3.4", - "safe-buffer": "^5.1.1" - } - }, - "execa": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-7.1.1.tgz", - "integrity": "sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.1", - "human-signals": "^4.3.0", - "is-stream": "^3.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^5.1.0", - "onetime": "^6.0.0", - "signal-exit": "^3.0.7", - "strip-final-newline": "^3.0.0" - } - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "ext": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", - "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", - "dev": true, - "requires": { - "type": "^2.7.2" - }, - "dependencies": { - "type": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", - "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==", - "dev": true - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "external-editor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", - "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", - "dev": true, - "requires": { - "chardet": "^0.7.0", - "iconv-lite": "^0.4.24", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } - } - }, - "fancy-log": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.3.tgz", - "integrity": "sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==", - "dev": true, - "requires": { - "ansi-gray": "^0.1.1", - "color-support": "^1.1.3", - "parse-node-version": "^1.0.0", - "time-stamp": "^1.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-1.1.4.tgz", - "integrity": "sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==", - "dev": true - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true - }, - "fast-xml-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.0.tgz", - "integrity": "sha512-+zVQv4aVTO+o8oRUyRL7PjgeVo1J6oP8Cw2+a8UTZQcj5V0yUK5T63gTN0ldgiHDPghUjKc4OpT6SwMTwnOQug==", - "requires": { - "strnum": "^1.0.5" - } - }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } - }, - "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - }, - "dependencies": { - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - } - } - }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==" - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "findup-sync": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", - "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^4.0.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "fined": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.2.0.tgz", - "integrity": "sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - } - }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fork-stream": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", - "integrity": "sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==", - "dev": true - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "dev": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==", - "dev": true - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-mkdirp-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-mkdirp-stream/-/fs-mkdirp-stream-1.0.0.tgz", - "integrity": "sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "through2": "^2.0.3" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true - }, - "get-assigned-identifiers": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz", - "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==", - "dev": true - }, - "get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - }, - "glob-stream": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", - "integrity": "sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "glob": "^7.1.1", - "glob-parent": "^3.1.0", - "is-negated-glob": "^1.0.0", - "ordered-read-streams": "^1.0.0", - "pumpify": "^1.3.5", - "readable-stream": "^2.1.5", - "remove-trailing-separator": "^1.0.1", - "to-absolute-glob": "^2.0.0", - "unique-stream": "^2.0.2" - }, - "dependencies": { - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - } - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "glob-watcher": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-5.0.5.tgz", - "integrity": "sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-done": "^1.2.0", - "chokidar": "^2.0.0", - "is-negated-glob": "^1.0.0", - "just-debounce": "^1.0.0", - "normalize-path": "^3.0.0", - "object.defaults": "^1.1.0" - }, - "dependencies": { - "binary-extensions": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", - "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", - "dev": true - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - } - }, - "chokidar": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", - "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", - "dev": true, - "requires": { - "anymatch": "^2.0.0", - "async-each": "^1.0.1", - "braces": "^2.3.2", - "fsevents": "^1.2.7", - "glob-parent": "^3.1.0", - "inherits": "^2.0.3", - "is-binary-path": "^1.0.0", - "is-glob": "^4.0.0", - "normalize-path": "^3.0.0", - "path-is-absolute": "^1.0.0", - "readdirp": "^2.2.1", - "upath": "^1.1.1" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - } - }, - "glob-parent": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", - "integrity": "sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==", - "dev": true, - "requires": { - "is-glob": "^3.1.0", - "path-dirname": "^1.0.0" - }, - "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - } - } - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==", - "dev": true, - "requires": { - "binary-extensions": "^1.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - }, - "dependencies": { - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "readdirp": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", - "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11", - "micromatch": "^3.1.10", - "readable-stream": "^2.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - }, - "dependencies": { - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, - "glogg": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.2.tgz", - "integrity": "sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==", - "dev": true, - "requires": { - "sparkles": "^1.0.0" - } - }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, - "graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "growl": { - "version": "1.10.5", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", - "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", - "dev": true - }, - "gulp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/gulp/-/gulp-4.0.2.tgz", - "integrity": "sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==", - "dev": true, - "requires": { - "glob-watcher": "^5.0.3", - "gulp-cli": "^2.2.0", - "undertaker": "^1.2.1", - "vinyl-fs": "^3.0.0" - } - }, - "gulp-babel": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gulp-babel/-/gulp-babel-8.0.0.tgz", - "integrity": "sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==", - "dev": true, - "requires": { - "plugin-error": "^1.0.1", - "replace-ext": "^1.0.0", - "through2": "^2.0.0", - "vinyl-sourcemaps-apply": "^0.2.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulp-cli": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/gulp-cli/-/gulp-cli-2.3.0.tgz", - "integrity": "sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==", - "dev": true, - "requires": { - "ansi-colors": "^1.0.1", - "archy": "^1.0.0", - "array-sort": "^1.0.0", - "color-support": "^1.1.3", - "concat-stream": "^1.6.0", - "copy-props": "^2.0.1", - "fancy-log": "^1.3.2", - "gulplog": "^1.0.0", - "interpret": "^1.4.0", - "isobject": "^3.0.1", - "liftoff": "^3.1.0", - "matchdep": "^2.0.0", - "mute-stdout": "^1.0.0", - "pretty-hrtime": "^1.0.0", - "replace-homedir": "^1.0.0", - "semver-greatest-satisfied-range": "^1.1.0", - "v8flags": "^3.2.0", - "yargs": "^7.1.0" - }, - "dependencies": { - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", - "dev": true - }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - } - }, - "y18n": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz", - "integrity": "sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==", - "dev": true - }, - "yargs": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-7.1.2.tgz", - "integrity": "sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "cliui": "^3.2.0", - "decamelize": "^1.1.1", - "get-caller-file": "^1.0.1", - "os-locale": "^1.4.0", - "read-pkg-up": "^1.0.1", - "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", - "set-blocking": "^2.0.0", - "string-width": "^1.0.2", - "which-module": "^1.0.0", - "y18n": "^3.2.1", - "yargs-parser": "^5.0.1" - } - }, - "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - } - } - } - }, - "gulp-eslint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/gulp-eslint/-/gulp-eslint-6.0.0.tgz", - "integrity": "sha512-dCVPSh1sA+UVhn7JSQt7KEb4An2sQNbOdB3PA8UCfxsoPlAKjJHxYHGXdXC7eb+V1FAnilSFFqslPrq037l1ig==", - "dev": true, - "requires": { - "eslint": "^6.0.0", - "fancy-log": "^1.3.2", - "plugin-error": "^1.0.1" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true - }, - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true - }, - "eslint": { - "version": "6.8.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", - "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "ajv": "^6.10.0", - "chalk": "^2.1.0", - "cross-spawn": "^6.0.5", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "eslint-scope": "^5.0.0", - "eslint-utils": "^1.4.3", - "eslint-visitor-keys": "^1.1.0", - "espree": "^6.1.2", - "esquery": "^1.0.1", - "esutils": "^2.0.2", - "file-entry-cache": "^5.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.0.0", - "globals": "^12.1.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "inquirer": "^7.0.0", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.14", - "minimatch": "^3.0.4", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.3", - "progress": "^2.0.0", - "regexpp": "^2.0.1", - "semver": "^6.1.2", - "strip-ansi": "^5.2.0", - "strip-json-comments": "^3.0.1", - "table": "^5.2.3", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true - }, - "espree": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", - "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", - "dev": true, - "requires": { - "acorn": "^7.1.1", - "acorn-jsx": "^5.2.0", - "eslint-visitor-keys": "^1.1.0" - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "file-entry-cache": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", - "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", - "dev": true, - "requires": { - "flat-cache": "^2.0.1" - } - }, - "flat-cache": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", - "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", - "dev": true, - "requires": { - "flatted": "^2.0.0", - "rimraf": "2.6.3", - "write": "1.0.3" - } - }, - "flatted": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", - "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", - "dev": true - }, - "globals": { - "version": "12.4.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", - "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", - "dev": true, - "requires": { - "type-fest": "^0.8.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true - }, - "js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, - "gulp-if": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-3.0.0.tgz", - "integrity": "sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==", - "dev": true, - "requires": { - "gulp-match": "^1.1.0", - "ternary-stream": "^3.0.0", - "through2": "^3.0.1" - } - }, - "gulp-match": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.1.0.tgz", - "integrity": "sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==", - "dev": true, - "requires": { - "minimatch": "^3.0.3" - } - }, - "gulp-mocha": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/gulp-mocha/-/gulp-mocha-8.0.0.tgz", - "integrity": "sha512-FdbBydfzszaES/gXfwD6RFq1yJTj4Z6328R1yqsmhf+t7hW2aj9ZD9Hz8boQShjZ9J8/w6tQBM5mePb8K2pbqA==", - "dev": true, - "requires": { - "dargs": "^7.0.0", - "execa": "^5.0.0", - "mocha": "^8.3.0", - "plugin-error": "^1.0.1", - "supports-color": "^8.1.1", - "through2": "^4.0.2" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", - "dev": true, - "requires": { - "anymatch": "~3.1.1", - "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" - } - }, - "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "js-yaml": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.0.0.tgz", - "integrity": "sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "log-symbols": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.0.0.tgz", - "integrity": "sha512-FN8JBzLx6CzeMrB0tg6pqlGU1wCrXW+ZXGH481kfsBqer0hToTIiHdjH4Mq8xJUbvATujKCvaREGWpGUionraA==", - "dev": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "mocha": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-8.4.0.tgz", - "integrity": "sha512-hJaO0mwDXmZS4ghXsvPVriOhsxQ7ofcpQdm8dE+jISUOKopitvnXFQmpRR7jd2K6VBG6E26gU3IAbXXGIbu4sQ==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.1", - "debug": "4.3.1", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.1.6", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.0.0", - "log-symbols": "4.0.0", - "minimatch": "3.0.4", - "ms": "2.1.3", - "nanoid": "3.1.20", - "serialize-javascript": "5.0.1", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "wide-align": "1.1.3", - "workerpool": "6.1.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "nanoid": { - "version": "3.1.20", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.20.tgz", - "integrity": "sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==", - "dev": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "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" - } - }, - "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - }, - "serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "dev": true, - "requires": { - "readable-stream": "3" - } - }, - "workerpool": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.1.0.tgz", - "integrity": "sha512-toV7q9rWNYha963Pl/qyeZ6wG+3nnsyvolaNUS8+R5Wtw6qJPTxIlOP1ZSvcGhEJw+l3HMMmtiNo9Gl61G4GVg==", - "dev": true - } - } - }, - "gulp-sourcemaps": { - "version": "2.6.5", - "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-2.6.5.tgz", - "integrity": "sha512-SYLBRzPTew8T5Suh2U8jCSDKY+4NARua4aqjj8HOysBh2tSgT9u4jc1FYirAdPx1akUxxDeK++fqw6Jg0LkQRg==", - "dev": true, - "requires": { - "@gulp-sourcemaps/identity-map": "1.X", - "@gulp-sourcemaps/map-sources": "1.X", - "acorn": "5.X", - "convert-source-map": "1.X", - "css": "2.X", - "debug-fabulous": "1.X", - "detect-newline": "2.X", - "graceful-fs": "4.X", - "source-map": "~0.6.0", - "strip-bom-string": "1.X", - "through2": "2.X" - }, - "dependencies": { - "acorn": { - "version": "5.7.4", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz", - "integrity": "sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==", - "dev": true - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "gulplog": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", - "integrity": "sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==", - "dev": true, - "requires": { - "glogg": "^1.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", - "requires": { - "has-symbols": "^1.0.2" - } - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "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==", - "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==", - "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==", - "requires": { - "inherits": "^2.0.3", - "minimalistic-assert": "^1.0.1" - } - }, - "he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha512-Tti3gMqLdZfhOQY1Mzf/AanLiqh1WTiJgEj26ZuYQ9fbkLomzGchCws4FyrSd4VkpBfiNhaE1On+lOz894jvXg==", - "requires": { - "hash.js": "^1.0.3", - "minimalistic-assert": "^1.0.0", - "minimalistic-crypto-utils": "^1.0.1" - } - }, - "homedir-polyfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", - "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "htmlescape": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz", - "integrity": "sha512-eVcrzgbR4tim7c7soKQKtxa/kQM4TzjnlU83rcZ9bHU6t31ehfV7SktN6McWgwPWg+JYMA/O3qpGxBvFq1z2Jg==", - "dev": true - }, - "https-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", - "integrity": "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==", - "dev": true - }, - "human-signals": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz", - "integrity": "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==", - "dev": true - }, - "husky": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-8.0.3.tgz", - "integrity": "sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "dev": true - }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true - }, - "indent-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", - "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, - "inline-source-map": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz", - "integrity": "sha512-0mVWSSbNDvedDWIN4wxLsdPM4a7cIPcpyMxj3QZ406QRwQ6ePGB1YIHxVPjqpcUGbWQ5C+nHTwGNWAGvt7ggVA==", - "dev": true, - "requires": { - "source-map": "~0.5.3" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } - } - }, - "inquirer": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", - "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==", - "dev": true, - "requires": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", - "lodash": "^4.17.19", - "mute-stream": "0.0.8", - "run-async": "^2.4.0", - "rxjs": "^6.6.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "rxjs": { - "version": "6.6.7", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", - "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", - "dev": true, - "requires": { - "tslib": "^1.9.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "insert-module-globals": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.1.tgz", - "integrity": "sha512-ufS5Qq9RZN+Bu899eA9QCAYThY+gGW7oRkmb0vC93Vlyu/CFGcH0OYPEjVkDXA5FEbTt1+VWzdoOD3Ny9N+8tg==", - "dev": true, - "requires": { - "acorn-node": "^1.5.2", - "combine-source-map": "^0.8.0", - "concat-stream": "^1.6.1", - "is-buffer": "^1.1.0", - "JSONStream": "^1.0.3", - "path-is-absolute": "^1.0.1", - "process": "~0.11.0", - "through2": "^2.0.0", - "undeclared-identifiers": "^1.1.2", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==", - "dev": true - }, - "ipaddr.js": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true - }, - "is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "requires": { - "binary-extensions": "^2.0.0" - } - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==" - }, - "is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "dev": true - }, - "is-generator-function": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", - "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-negated-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", - "integrity": "sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==", - "dev": true - }, - "is-number": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", - "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, - "is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true - }, - "is-plain-object": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", - "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", - "dev": true - }, - "is-promise": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", - "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", - "dev": true - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true - }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", - "dev": true - }, - "is-valid-glob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-1.0.0.tgz", - "integrity": "sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==", - "dev": true - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "js-sdsl": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.4.0.tgz", - "integrity": "sha512-FfVSdx6pJ41Oa+CF7RDaFmTnCaFhua+SNYQX74riGOpl96x+2jQCqEfQ2bnXu/5DPCqlRuiqyvTJM0Qjz26IVg==", - "dev": true - }, - "js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz", - "integrity": "sha512-nKtD/Qxm7tWdZqJoldEC7fF0S41v0mWbeaXG3637stOWfyGxTgWTYE2wtfKmjzpvxv2MA2xzxsXOIiwUpkX6Qw==", - "dev": true, - "requires": { - "jsonify": "~0.0.0" - } - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "json-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-stream/-/json-stream-1.0.0.tgz", - "integrity": "sha512-H/ZGY0nIAg3QcOwE1QN/rK/Fa7gJn7Ii5obwp6zyPO4xiPNwpIMjqy2gwjBEGqzkF/vSWEIBQCBuN19hYiL6Qg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", - "dev": true - }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true - }, - "jsonify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.1.tgz", - "integrity": "sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==", - "dev": true - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", - "dev": true - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "dev": true, - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "just-debounce": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.1.0.tgz", - "integrity": "sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==", - "dev": true - }, - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - }, - "labeled-stream-splicer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", - "integrity": "sha512-Ca4LSXFFZUjPScRaqOcFxneA0VpKZr4MMYCljyQr4LIewTLb3Y0IUTIsnBBsVubIeEfxeSZpSjSsRM8APEQaAw==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "stream-splicer": "^2.0.0" - } - }, - "last-run": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/last-run/-/last-run-1.1.1.tgz", - "integrity": "sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==", - "dev": true, - "requires": { - "default-resolution": "^2.0.0", - "es6-weak-map": "^2.0.1" - } - }, - "lazystream": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.1.tgz", - "integrity": "sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==", - "dev": true, - "requires": { - "invert-kv": "^1.0.0" - } - }, - "lead": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lead/-/lead-1.0.0.tgz", - "integrity": "sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==", - "dev": true, - "requires": { - "flush-write-stream": "^1.0.2" - } - }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "liftoff": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-3.1.0.tgz", - "integrity": "sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^3.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } - } - }, - "lilconfig": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", - "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", - "dev": true - }, - "lint-staged": { - "version": "13.2.1", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-13.2.1.tgz", - "integrity": "sha512-8gfzinVXoPfga5Dz/ZOn8I2GOhf81Wvs+KwbEXQn/oWZAvCVS2PivrXfVbFJc93zD16uC0neS47RXHIjXKYZQw==", - "dev": true, - "requires": { - "chalk": "5.2.0", - "cli-truncate": "^3.1.0", - "commander": "^10.0.0", - "debug": "^4.3.4", - "execa": "^7.0.0", - "lilconfig": "2.1.0", - "listr2": "^5.0.7", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-inspect": "^1.12.3", - "pidtree": "^0.6.0", - "string-argv": "^0.3.1", - "yaml": "^2.2.1" - }, - "dependencies": { - "chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", - "dev": true - } - } - }, - "listr2": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-5.0.8.tgz", - "integrity": "sha512-mC73LitKHj9w6v30nLNGPetZIlfpUniNSsxxrbaPcWOjDb92SHPzJPi/t+v1YC/lxKz/AJ9egOjww0qUuFxBpA==", - "dev": true, - "requires": { - "cli-truncate": "^2.1.0", - "colorette": "^2.0.19", - "log-update": "^4.0.0", - "p-map": "^4.0.0", - "rfdc": "^1.3.0", - "rxjs": "^7.8.0", - "through": "^2.3.8", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", - "dev": true, - "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" - } - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" - }, - "lodash.debounce": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true - }, - "lodash.memoize": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz", - "integrity": "sha512-eDn9kqrAmVUC1wmZvlQ6Uhde44n+tXpqPrN8olQJbttgh0oKclk+SF54P47VEGE9CEiMeRwAP8BaM7UHvBkz2A==", - "dev": true - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "requires": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - } - }, - "log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", - "dev": true, - "requires": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - } - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", - "dev": true, - "requires": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - } - } - } - }, - "loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "requires": { - "get-func-name": "^2.0.0" - } - }, - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "requires": { - "yallist": "^3.0.2" - } - }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha512-BpdYkt9EvGl8OfWHDQPISVpcl5xZthb+XPsbELj5AQXxIC8IriDZIQYjBJPEm5rS420sjZ0TLEzRcq5KdBhYrQ==", - "dev": true, - "requires": { - "es5-ext": "~0.10.2" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "matchdep": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", - "integrity": "sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==", - "dev": true, - "requires": { - "findup-sync": "^2.0.0", - "micromatch": "^3.0.4", - "resolve": "^1.4.0", - "stack-trace": "0.0.10" - }, - "dependencies": { - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - } - } - }, - "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==", - "requires": { - "hash-base": "^3.0.0", - "inherits": "^2.0.1", - "safe-buffer": "^5.1.2" - } - }, - "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dev": true, - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "requires": { - "bn.js": "^4.0.0", - "brorand": "^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==" - } - } - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", - "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", - "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==" - }, - "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==" - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" - }, - "mixin-deep": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", - "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - } - }, - "mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "requires": { - "minimist": "^1.2.6" - } - }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, - "mocha": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-9.2.2.tgz", - "integrity": "sha512-L6XC3EdwT6YrIk0yXpavvLkn8h+EU+Y5UcCHKECyMbdUIxyMuZj4bX4U9e1nvnvUUvQVsV2VHQr5zLdcUkhW/g==", - "dev": true, - "requires": { - "@ungap/promise-all-settled": "1.1.2", - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.3", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "growl": "1.10.5", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "4.2.1", - "ms": "2.1.3", - "nanoid": "3.3.1", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "which": "2.0.2", - "workerpool": "6.2.0", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "dependencies": { - "ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true - }, - "debug": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", - "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", - "dev": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } - } - }, - "glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "dependencies": { - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - } - } - }, - "minimatch": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-4.2.1.tgz", - "integrity": "sha512-9Uq1ChtSZO+Mxa/CL1eGizn2vRn3MlLgzhT0Iz8zaY8NdvxvB0d5QdPFmCKf7JKA9Lerx5vRrnwO03jsSfGG9g==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - } - } - }, - "mocha-steps": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/mocha-steps/-/mocha-steps-1.3.0.tgz", - "integrity": "sha512-KZvpMJTqzLZw3mOb+EEuYi4YZS41C9iTnb7skVFRxHjUd1OYbl64tCMSmpdIRM9LnwIrSOaRfPtNpF5msgv6Eg==", - "dev": true - }, - "module-deps": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.2.3.tgz", - "integrity": "sha512-fg7OZaQBcL4/L+AK5f4iVqf9OMbCclXfy/znXRxTVhJSeW5AIlS9AwheYwDaXM3lVW7OBeaeUEY3gbaC6cLlSA==", - "dev": true, - "requires": { - "browser-resolve": "^2.0.0", - "cached-path-relative": "^1.0.2", - "concat-stream": "~1.6.0", - "defined": "^1.0.0", - "detective": "^5.2.0", - "duplexer2": "^0.1.2", - "inherits": "^2.0.1", - "JSONStream": "^1.0.3", - "parents": "^1.0.0", - "readable-stream": "^2.0.2", - "resolve": "^1.4.0", - "stream-combiner2": "^1.1.1", - "subarg": "^1.0.0", - "through2": "^2.0.0", - "xtend": "^4.0.0" - }, - "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "mute-stdout": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mute-stdout/-/mute-stdout-1.0.1.tgz", - "integrity": "sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true - }, - "nanoid": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz", - "integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - } - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==", - "dev": true - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, - "nock": { - "version": "13.3.0", - "resolved": "https://registry.npmjs.org/nock/-/nock-13.3.0.tgz", - "integrity": "sha512-HHqYQ6mBeiMc+N038w8LkMpDCRquCHWeNmN3v6645P3NhN2+qXOBqvPqo7Rt1VyCMzKhJ733wZqw5B7cQVFNPg==", - "dev": true, - "requires": { - "debug": "^4.1.0", - "json-stringify-safe": "^5.0.1", - "lodash": "^4.17.21", - "propagate": "^2.0.0" - } - }, - "node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, - "normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true - }, - "now-and-later": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/now-and-later/-/now-and-later-2.0.1.tgz", - "integrity": "sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==", - "dev": true, - "requires": { - "once": "^1.3.2" - } - }, - "npm": { - "version": "https://registry.npmjs.org/npm/-/npm-7.24.2.tgz", - "integrity": "sha512-120p116CE8VMMZ+hk8IAb1inCPk4Dj3VZw29/n2g6UI77urJKVYb7FZUDW8hY+EBnfsjI/2yrobBgFyzo7YpVQ==", - "requires": { - "@isaacs/string-locale-compare": "*", - "@npmcli/arborist": "*", - "@npmcli/ci-detect": "*", - "@npmcli/config": "*", - "@npmcli/map-workspaces": "*", - "@npmcli/package-json": "*", - "@npmcli/run-script": "*", - "abbrev": "*", - "ansicolors": "*", - "ansistyles": "*", - "archy": "*", - "cacache": "*", - "chalk": "*", - "chownr": "*", - "cli-columns": "*", - "cli-table3": "*", - "columnify": "*", - "fastest-levenshtein": "*", - "glob": "*", - "graceful-fs": "*", - "hosted-git-info": "*", - "ini": "*", - "init-package-json": "*", - "is-cidr": "*", - "json-parse-even-better-errors": "*", - "libnpmaccess": "*", - "libnpmdiff": "*", - "libnpmexec": "*", - "libnpmfund": "*", - "libnpmhook": "*", - "libnpmorg": "*", - "libnpmpack": "*", - "libnpmpublish": "*", - "libnpmsearch": "*", - "libnpmteam": "*", - "libnpmversion": "*", - "make-fetch-happen": "*", - "minipass": "*", - "minipass-pipeline": "*", - "mkdirp": "*", - "mkdirp-infer-owner": "*", - "ms": "*", - "node-gyp": "*", - "nopt": "*", - "npm-audit-report": "*", - "npm-install-checks": "*", - "npm-package-arg": "*", - "npm-pick-manifest": "*", - "npm-profile": "*", - "npm-registry-fetch": "*", - "npm-user-validate": "*", - "npmlog": "*", - "opener": "*", - "pacote": "*", - "parse-conflict-json": "*", - "qrcode-terminal": "*", - "read": "*", - "read-package-json": "*", - "read-package-json-fast": "*", - "readdir-scoped-modules": "*", - "rimraf": "*", - "semver": "*", - "ssri": "*", - "tar": "*", - "text-table": "*", - "tiny-relative-date": "*", - "treeverse": "*", - "validate-npm-package-name": "*", - "which": "*", - "write-file-atomic": "*" - }, - "dependencies": { - "@gar/promisify": { - "version": "1.1.2", - "bundled": true, - "extraneous": true - }, - "@isaacs/string-locale-compare": { - "version": "1.1.0", - "bundled": true, - "extraneous": true - }, - "@npmcli/arborist": { - "version": "2.9.0", - "bundled": true, - "extraneous": true, - "requires": { - "@isaacs/string-locale-compare": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "@npmcli/map-workspaces": "^1.0.2", - "@npmcli/metavuln-calculator": "^1.1.0", - "@npmcli/move-file": "^1.1.0", - "@npmcli/name-from-folder": "^1.0.1", - "@npmcli/node-gyp": "^1.0.1", - "@npmcli/package-json": "^1.0.1", - "@npmcli/run-script": "^1.8.2", - "bin-links": "^2.2.1", - "cacache": "^15.0.3", - "common-ancestor-path": "^1.0.1", - "json-parse-even-better-errors": "^2.3.1", - "json-stringify-nice": "^1.1.4", - "mkdirp": "^1.0.4", - "mkdirp-infer-owner": "^2.0.0", - "npm-install-checks": "^4.0.0", - "npm-package-arg": "^8.1.5", - "npm-pick-manifest": "^6.1.0", - "npm-registry-fetch": "^11.0.0", - "pacote": "^11.3.5", - "parse-conflict-json": "^1.1.1", - "proc-log": "^1.0.0", - "promise-all-reject-late": "^1.0.0", - "promise-call-limit": "^1.0.1", - "read-package-json-fast": "^2.0.2", - "readdir-scoped-modules": "^1.1.0", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "ssri": "^8.0.1", - "treeverse": "^1.0.4", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/ci-detect": { - "version": "1.3.0", - "bundled": true, - "extraneous": true - }, - "@npmcli/config": { - "version": "2.3.0", - "bundled": true, - "extraneous": true, - "requires": { - "ini": "^2.0.0", - "mkdirp-infer-owner": "^2.0.0", - "nopt": "^5.0.0", - "semver": "^7.3.4", - "walk-up-path": "^1.0.0" - } - }, - "@npmcli/disparity-colors": { - "version": "1.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "ansi-styles": "^4.3.0" - } - }, - "@npmcli/fs": { - "version": "1.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "@gar/promisify": "^1.0.1", - "semver": "^7.3.5" - } - }, - "@npmcli/git": { - "version": "2.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/promise-spawn": "^1.3.2", - "lru-cache": "^6.0.0", - "mkdirp": "^1.0.4", - "npm-pick-manifest": "^6.1.1", - "promise-inflight": "^1.0.1", - "promise-retry": "^2.0.1", - "semver": "^7.3.5", - "which": "^2.0.2" - } - }, - "@npmcli/installed-package-contents": { - "version": "1.0.7", - "bundled": true, - "extraneous": true, - "requires": { - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "@npmcli/map-workspaces": { - "version": "1.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/name-from-folder": "^1.0.1", - "glob": "^7.1.6", - "minimatch": "^3.0.4", - "read-package-json-fast": "^2.0.1" - } - }, - "@npmcli/metavuln-calculator": { - "version": "1.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "cacache": "^15.0.5", - "pacote": "^11.1.11", - "semver": "^7.3.2" - } - }, - "@npmcli/move-file": { - "version": "1.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "mkdirp": "^1.0.4", - "rimraf": "^3.0.2" - } - }, - "@npmcli/name-from-folder": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "@npmcli/node-gyp": { - "version": "1.0.2", - "bundled": true, - "extraneous": true - }, - "@npmcli/package-json": { - "version": "1.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "json-parse-even-better-errors": "^2.3.1" - } - }, - "@npmcli/promise-spawn": { - "version": "1.3.2", - "bundled": true, - "extraneous": true, - "requires": { - "infer-owner": "^1.0.4" - } - }, - "@npmcli/run-script": { - "version": "1.8.6", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/node-gyp": "^1.0.2", - "@npmcli/promise-spawn": "^1.3.2", - "node-gyp": "^7.1.0", - "read-package-json-fast": "^2.0.1" - } - }, - "@tootallnate/once": { - "version": "1.1.2", - "bundled": true, - "extraneous": true - }, - "abbrev": { - "version": "1.1.1", - "bundled": true, - "extraneous": true - }, - "agent-base": { - "version": "6.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "debug": "4" - } - }, - "agentkeepalive": { - "version": "4.1.4", - "bundled": true, - "extraneous": true, - "requires": { - "debug": "^4.1.0", - "depd": "^1.1.2", - "humanize-ms": "^1.2.1" - } - }, - "aggregate-error": { - "version": "3.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "clean-stack": "^2.0.0", - "indent-string": "^4.0.0" - } - }, - "ajv": { - "version": "6.12.6", - "bundled": true, - "extraneous": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "extraneous": true - }, - "ansi-styles": { - "version": "4.3.0", - "bundled": true, - "extraneous": true, - "requires": { - "color-convert": "^2.0.1" - } - }, - "ansicolors": { - "version": "0.3.2", - "bundled": true, - "extraneous": true - }, - "ansistyles": { - "version": "0.1.3", - "bundled": true, - "extraneous": true - }, - "aproba": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "archy": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "are-we-there-yet": { - "version": "1.1.6", - "bundled": true, - "extraneous": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - }, - "asap": { - "version": "2.0.6", - "bundled": true, - "extraneous": true - }, - "asn1": { - "version": "0.2.4", - "bundled": true, - "extraneous": true, - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "extraneous": true - }, - "aws-sign2": { - "version": "0.7.0", - "bundled": true, - "extraneous": true - }, - "aws4": { - "version": "1.11.0", - "bundled": true, - "extraneous": true - }, - "balanced-match": { - "version": "1.0.2", - "bundled": true, - "extraneous": true - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bin-links": { - "version": "2.2.1", - "bundled": true, - "extraneous": true, - "requires": { - "cmd-shim": "^4.0.1", - "mkdirp": "^1.0.3", - "npm-normalize-package-bin": "^1.0.0", - "read-cmd-shim": "^2.0.0", - "rimraf": "^3.0.0", - "write-file-atomic": "^3.0.3" - } - }, - "binary-extensions": { - "version": "2.2.0", - "bundled": true, - "extraneous": true - }, - "brace-expansion": { - "version": "1.1.11", - "bundled": true, - "extraneous": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "builtins": { - "version": "1.0.3", - "bundled": true, - "extraneous": true - }, - "cacache": { - "version": "15.3.0", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/fs": "^1.0.0", - "@npmcli/move-file": "^1.0.1", - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "glob": "^7.1.4", - "infer-owner": "^1.0.4", - "lru-cache": "^6.0.0", - "minipass": "^3.1.1", - "minipass-collect": "^1.0.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.2", - "mkdirp": "^1.0.3", - "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.0.2", - "unique-filename": "^1.1.1" - } - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "extraneous": true - }, - "chalk": { - "version": "4.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "chownr": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "cidr-regex": { - "version": "3.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "ip-regex": "^4.1.0" - } - }, - "clean-stack": { - "version": "2.2.0", - "bundled": true, - "extraneous": true - }, - "cli-columns": { - "version": "3.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "string-width": "^2.0.0", - "strip-ansi": "^3.0.1" - } - }, - "cli-table3": { - "version": "0.6.0", - "bundled": true, - "extraneous": true, - "requires": { - "colors": "^1.1.2", - "object-assign": "^4.1.0", - "string-width": "^4.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "bundled": true, - "extraneous": true - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "bundled": true, - "extraneous": true - }, - "string-width": { - "version": "4.2.2", - "bundled": true, - "extraneous": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - } - }, - "strip-ansi": { - "version": "6.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, - "clone": { - "version": "1.0.4", - "bundled": true, - "extraneous": true - }, - "cmd-shim": { - "version": "4.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "mkdirp-infer-owner": "^2.0.0" - } - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "extraneous": true - }, - "color-convert": { - "version": "2.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "bundled": true, - "extraneous": true - }, - "color-support": { - "version": "1.1.3", - "bundled": true, - "extraneous": true - }, - "colors": { - "version": "1.4.0", - "bundled": true, - "extraneous": true - }, - "columnify": { - "version": "1.5.4", - "bundled": true, - "extraneous": true, - "requires": { - "strip-ansi": "^3.0.0", - "wcwidth": "^1.0.0" - } - }, - "combined-stream": { - "version": "1.0.8", - "bundled": true, - "extraneous": true, - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "common-ancestor-path": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "extraneous": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "extraneous": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "extraneous": true - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "extraneous": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.2", - "bundled": true, - "extraneous": true, - "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "bundled": true, - "extraneous": true - } - } - }, - "debuglog": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "defaults": { - "version": "1.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "clone": "^1.0.2" - } - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "depd": { - "version": "1.1.2", - "bundled": true, - "extraneous": true - }, - "dezalgo": { - "version": "1.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "diff": { - "version": "5.0.0", - "bundled": true, - "extraneous": true - }, - "ecc-jsbn": { - "version": "0.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "emoji-regex": { - "version": "8.0.0", - "bundled": true, - "extraneous": true - }, - "encoding": { - "version": "0.1.13", - "bundled": true, - "extraneous": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "env-paths": { - "version": "2.2.1", - "bundled": true, - "extraneous": true - }, - "err-code": { - "version": "2.0.3", - "bundled": true, - "extraneous": true - }, - "extend": { - "version": "3.0.2", - "bundled": true, - "extraneous": true - }, - "extsprintf": { - "version": "1.3.0", - "bundled": true, - "extraneous": true - }, - "fast-deep-equal": { - "version": "3.1.3", - "bundled": true, - "extraneous": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "bundled": true, - "extraneous": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "bundled": true, - "extraneous": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "extraneous": true - }, - "fs-minipass": { - "version": "2.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "function-bind": { - "version": "1.1.1", - "bundled": true, - "extraneous": true - }, - "gauge": { - "version": "3.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^1.0.3 || ^2.0.0", - "color-support": "^1.1.2", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.1", - "object-assign": "^4.1.1", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1 || ^2.0.0", - "strip-ansi": "^3.0.1 || ^4.0.0", - "wide-align": "^1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "extraneous": true, - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.2.0", - "bundled": true, - "extraneous": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.8", - "bundled": true, - "extraneous": true - }, - "har-schema": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "har-validator": { - "version": "5.1.5", - "bundled": true, - "extraneous": true, - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "bundled": true, - "extraneous": true - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "extraneous": true - }, - "hosted-git-info": { - "version": "4.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "bundled": true, - "extraneous": true - }, - "http-proxy-agent": { - "version": "4.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "@tootallnate/once": "1", - "agent-base": "6", - "debug": "4" - } - }, - "http-signature": { - "version": "1.2.0", - "bundled": true, - "extraneous": true, - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "5.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "agent-base": "6", - "debug": "4" - } - }, - "humanize-ms": { - "version": "1.2.1", - "bundled": true, - "extraneous": true, - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.3", - "bundled": true, - "extraneous": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "ignore-walk": { - "version": "3.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "minimatch": "^3.0.4" - } - }, - "imurmurhash": { - "version": "0.1.4", - "bundled": true, - "extraneous": true - }, - "indent-string": { - "version": "4.0.0", - "bundled": true, - "extraneous": true - }, - "infer-owner": { - "version": "1.0.4", - "bundled": true, - "extraneous": true - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "extraneous": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "bundled": true, - "extraneous": true - }, - "ini": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "init-package-json": { - "version": "2.0.5", - "bundled": true, - "extraneous": true, - "requires": { - "npm-package-arg": "^8.1.5", - "promzard": "^0.3.0", - "read": "~1.0.1", - "read-package-json": "^4.1.1", - "semver": "^7.3.5", - "validate-npm-package-license": "^3.0.4", - "validate-npm-package-name": "^3.0.0" - } - }, - "ip": { - "version": "1.1.5", - "bundled": true, - "extraneous": true - }, - "ip-regex": { - "version": "4.3.0", - "bundled": true, - "extraneous": true - }, - "is-cidr": { - "version": "4.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "cidr-regex": "^3.1.1" - } - }, - "is-core-module": { - "version": "2.7.0", - "bundled": true, - "extraneous": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "is-lambda": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "isexe": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "extraneous": true - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "extraneous": true - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "bundled": true, - "extraneous": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "extraneous": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "bundled": true, - "extraneous": true - }, - "json-stringify-nice": { - "version": "1.1.4", - "bundled": true, - "extraneous": true - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "extraneous": true - }, - "jsonparse": { - "version": "1.3.1", - "bundled": true, - "extraneous": true - }, - "jsprim": { - "version": "1.4.1", - "bundled": true, - "extraneous": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "just-diff": { - "version": "3.1.1", - "bundled": true, - "extraneous": true - }, - "just-diff-apply": { - "version": "3.0.0", - "bundled": true, - "extraneous": true - }, - "libnpmaccess": { - "version": "4.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^2.0.0", - "minipass": "^3.1.1", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmdiff": { - "version": "2.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/disparity-colors": "^1.0.1", - "@npmcli/installed-package-contents": "^1.0.7", - "binary-extensions": "^2.2.0", - "diff": "^5.0.0", - "minimatch": "^3.0.4", - "npm-package-arg": "^8.1.4", - "pacote": "^11.3.4", - "tar": "^6.1.0" - } - }, - "libnpmexec": { - "version": "2.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/arborist": "^2.3.0", - "@npmcli/ci-detect": "^1.3.0", - "@npmcli/run-script": "^1.8.4", - "chalk": "^4.1.0", - "mkdirp-infer-owner": "^2.0.0", - "npm-package-arg": "^8.1.2", - "pacote": "^11.3.1", - "proc-log": "^1.0.0", - "read": "^1.0.7", - "read-package-json-fast": "^2.0.2", - "walk-up-path": "^1.0.0" - } - }, - "libnpmfund": { - "version": "1.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/arborist": "^2.5.0" - } - }, - "libnpmhook": { - "version": "6.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmorg": { - "version": "2.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmpack": { - "version": "2.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/run-script": "^1.8.3", - "npm-package-arg": "^8.1.0", - "pacote": "^11.2.6" - } - }, - "libnpmpublish": { - "version": "4.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "normalize-package-data": "^3.0.2", - "npm-package-arg": "^8.1.2", - "npm-registry-fetch": "^11.0.0", - "semver": "^7.1.3", - "ssri": "^8.0.1" - } - }, - "libnpmsearch": { - "version": "3.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmteam": { - "version": "2.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^2.0.0", - "npm-registry-fetch": "^11.0.0" - } - }, - "libnpmversion": { - "version": "1.2.1", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/git": "^2.0.7", - "@npmcli/run-script": "^1.8.4", - "json-parse-even-better-errors": "^2.3.1", - "semver": "^7.3.5", - "stringify-package": "^1.0.1" - } - }, - "lru-cache": { - "version": "6.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-fetch-happen": { - "version": "9.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "agentkeepalive": "^4.1.3", - "cacache": "^15.2.0", - "http-cache-semantics": "^4.1.0", - "http-proxy-agent": "^4.0.1", - "https-proxy-agent": "^5.0.0", - "is-lambda": "^1.0.1", - "lru-cache": "^6.0.0", - "minipass": "^3.1.3", - "minipass-collect": "^1.0.2", - "minipass-fetch": "^1.3.2", - "minipass-flush": "^1.0.5", - "minipass-pipeline": "^1.2.4", - "negotiator": "^0.6.2", - "promise-retry": "^2.0.1", - "socks-proxy-agent": "^6.0.0", - "ssri": "^8.0.0" - } - }, - "mime-db": { - "version": "1.49.0", - "bundled": true, - "extraneous": true - }, - "mime-types": { - "version": "2.1.32", - "bundled": true, - "extraneous": true, - "requires": { - "mime-db": "1.49.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minipass": { - "version": "3.1.5", - "bundled": true, - "extraneous": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "minipass-collect": { - "version": "1.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-fetch": { - "version": "1.4.1", - "bundled": true, - "extraneous": true, - "requires": { - "encoding": "^0.1.12", - "minipass": "^3.1.0", - "minipass-sized": "^1.0.3", - "minizlib": "^2.0.0" - } - }, - "minipass-flush": { - "version": "1.0.5", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-json-stream": { - "version": "1.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "jsonparse": "^1.3.1", - "minipass": "^3.0.0" - } - }, - "minipass-pipeline": { - "version": "1.2.4", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minipass-sized": { - "version": "1.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0" - } - }, - "minizlib": { - "version": "2.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.0.0", - "yallist": "^4.0.0" - } - }, - "mkdirp": { - "version": "1.0.4", - "bundled": true, - "extraneous": true - }, - "mkdirp-infer-owner": { - "version": "2.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "chownr": "^2.0.0", - "infer-owner": "^1.0.4", - "mkdirp": "^1.0.3" - } - }, - "ms": { - "version": "2.1.3", - "bundled": true, - "extraneous": true - }, - "mute-stream": { - "version": "0.0.8", - "bundled": true, - "extraneous": true - }, - "negotiator": { - "version": "0.6.2", - "bundled": true, - "extraneous": true - }, - "node-gyp": { - "version": "7.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "env-paths": "^2.2.0", - "glob": "^7.1.4", - "graceful-fs": "^4.2.3", - "nopt": "^5.0.0", - "npmlog": "^4.1.2", - "request": "^2.88.2", - "rimraf": "^3.0.2", - "semver": "^7.3.2", - "tar": "^6.0.2", - "which": "^2.0.2" - }, - "dependencies": { - "aproba": { - "version": "1.2.0", - "bundled": true, - "extraneous": true - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "extraneous": true, - "requires": { - "aproba": "^1.0.3", - "console-control-strings": "^1.0.0", - "has-unicode": "^2.0.0", - "object-assign": "^4.1.0", - "signal-exit": "^3.0.0", - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wide-align": "^1.1.0" - } - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "npmlog": { - "version": "4.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "are-we-there-yet": "~1.1.2", - "console-control-strings": "~1.1.0", - "gauge": "~2.7.3", - "set-blocking": "~2.0.0" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, - "nopt": { - "version": "5.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "3.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "hosted-git-info": "^4.0.1", - "is-core-module": "^2.5.0", - "semver": "^7.3.4", - "validate-npm-package-license": "^3.0.1" - } - }, - "npm-audit-report": { - "version": "2.1.5", - "bundled": true, - "extraneous": true, - "requires": { - "chalk": "^4.0.0" - } - }, - "npm-bundled": { - "version": "1.1.2", - "bundled": true, - "extraneous": true, - "requires": { - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-install-checks": { - "version": "4.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "semver": "^7.1.1" - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "npm-package-arg": { - "version": "8.1.5", - "bundled": true, - "extraneous": true, - "requires": { - "hosted-git-info": "^4.0.1", - "semver": "^7.3.4", - "validate-npm-package-name": "^3.0.0" - } - }, - "npm-packlist": { - "version": "2.2.2", - "bundled": true, - "extraneous": true, - "requires": { - "glob": "^7.1.6", - "ignore-walk": "^3.0.3", - "npm-bundled": "^1.1.1", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "npm-pick-manifest": { - "version": "6.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "npm-install-checks": "^4.0.0", - "npm-normalize-package-bin": "^1.0.1", - "npm-package-arg": "^8.1.2", - "semver": "^7.3.4" - } - }, - "npm-profile": { - "version": "5.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "npm-registry-fetch": "^11.0.0" - } - }, - "npm-registry-fetch": { - "version": "11.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "make-fetch-happen": "^9.0.1", - "minipass": "^3.1.3", - "minipass-fetch": "^1.3.0", - "minipass-json-stream": "^1.0.1", - "minizlib": "^2.0.0", - "npm-package-arg": "^8.0.0" - } - }, - "npm-user-validate": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "npmlog": { - "version": "5.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "are-we-there-yet": "^2.0.0", - "console-control-strings": "^1.1.0", - "gauge": "^3.0.0", - "set-blocking": "^2.0.0" - }, - "dependencies": { - "are-we-there-yet": { - "version": "2.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "delegates": "^1.0.0", - "readable-stream": "^3.6.0" - } - } - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "oauth-sign": { - "version": "0.9.0", - "bundled": true, - "extraneous": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "extraneous": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "extraneous": true, - "requires": { - "wrappy": "1" - } - }, - "opener": { - "version": "1.5.2", - "bundled": true, - "extraneous": true - }, - "p-map": { - "version": "4.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "aggregate-error": "^3.0.0" - } - }, - "pacote": { - "version": "11.3.5", - "bundled": true, - "extraneous": true, - "requires": { - "@npmcli/git": "^2.1.0", - "@npmcli/installed-package-contents": "^1.0.6", - "@npmcli/promise-spawn": "^1.2.0", - "@npmcli/run-script": "^1.8.2", - "cacache": "^15.0.5", - "chownr": "^2.0.0", - "fs-minipass": "^2.1.0", - "infer-owner": "^1.0.4", - "minipass": "^3.1.3", - "mkdirp": "^1.0.3", - "npm-package-arg": "^8.0.1", - "npm-packlist": "^2.1.4", - "npm-pick-manifest": "^6.0.0", - "npm-registry-fetch": "^11.0.0", - "promise-retry": "^2.0.1", - "read-package-json-fast": "^2.0.1", - "rimraf": "^3.0.2", - "ssri": "^8.0.1", - "tar": "^6.1.0" - } - }, - "parse-conflict-json": { - "version": "1.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "just-diff": "^3.0.1", - "just-diff-apply": "^3.0.0" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "performance-now": { - "version": "2.1.0", - "bundled": true, - "extraneous": true - }, - "proc-log": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "promise-all-reject-late": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "promise-call-limit": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "promise-inflight": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "promise-retry": { - "version": "2.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "err-code": "^2.0.2", - "retry": "^0.12.0" - } - }, - "promzard": { - "version": "0.3.0", - "bundled": true, - "extraneous": true, - "requires": { - "read": "1" - } - }, - "psl": { - "version": "1.8.0", - "bundled": true, - "extraneous": true - }, - "punycode": { - "version": "2.1.1", - "bundled": true, - "extraneous": true - }, - "qrcode-terminal": { - "version": "0.12.0", - "bundled": true, - "extraneous": true - }, - "qs": { - "version": "6.5.2", - "bundled": true, - "extraneous": true - }, - "read": { - "version": "1.0.7", - "bundled": true, - "extraneous": true, - "requires": { - "mute-stream": "~0.0.4" - } - }, - "read-cmd-shim": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "read-package-json": { - "version": "4.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^3.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "read-package-json-fast": { - "version": "2.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "json-parse-even-better-errors": "^2.3.0", - "npm-normalize-package-bin": "^1.0.1" - } - }, - "readable-stream": { - "version": "3.6.0", - "bundled": true, - "extraneous": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "request": { - "version": "2.88.2", - "bundled": true, - "extraneous": true, - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "bundled": true, - "extraneous": true, - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "tough-cookie": { - "version": "2.5.0", - "bundled": true, - "extraneous": true, - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } - }, - "retry": { - "version": "0.12.0", - "bundled": true, - "extraneous": true - }, - "rimraf": { - "version": "3.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "glob": "^7.1.3" - } - }, - "safe-buffer": { - "version": "5.2.1", - "bundled": true, - "extraneous": true - }, - "safer-buffer": { - "version": "2.1.2", - "bundled": true, - "extraneous": true - }, - "semver": { - "version": "7.3.5", - "bundled": true, - "extraneous": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "extraneous": true - }, - "signal-exit": { - "version": "3.0.3", - "bundled": true, - "extraneous": true - }, - "smart-buffer": { - "version": "4.2.0", - "bundled": true, - "extraneous": true - }, - "socks": { - "version": "2.6.1", - "bundled": true, - "extraneous": true, - "requires": { - "ip": "^1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "6.1.0", - "bundled": true, - "extraneous": true, - "requires": { - "agent-base": "^6.0.2", - "debug": "^4.3.1", - "socks": "^2.6.1" - } - }, - "spdx-correct": { - "version": "3.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "bundled": true, - "extraneous": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "bundled": true, - "extraneous": true - }, - "sshpk": { - "version": "1.16.1", - "bundled": true, - "extraneous": true, - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "8.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "minipass": "^3.1.1" - } - }, - "string_decoder": { - "version": "1.3.0", - "bundled": true, - "extraneous": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "string-width": { - "version": "2.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "bundled": true, - "extraneous": true - }, - "strip-ansi": { - "version": "4.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, - "stringify-package": { - "version": "1.0.1", - "bundled": true, - "extraneous": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "bundled": true, - "extraneous": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "tar": { - "version": "6.1.11", - "bundled": true, - "extraneous": true, - "requires": { - "chownr": "^2.0.0", - "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", - "minizlib": "^2.1.1", - "mkdirp": "^1.0.3", - "yallist": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "bundled": true, - "extraneous": true - }, - "tiny-relative-date": { - "version": "1.3.0", - "bundled": true, - "extraneous": true - }, - "treeverse": { - "version": "1.0.4", - "bundled": true, - "extraneous": true - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "extraneous": true, - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "extraneous": true - }, - "typedarray-to-buffer": { - "version": "3.1.5", - "bundled": true, - "extraneous": true, - "requires": { - "is-typedarray": "^1.0.0" - } - }, - "unique-filename": { - "version": "1.1.1", - "bundled": true, - "extraneous": true, - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "uri-js": { - "version": "4.4.1", - "bundled": true, - "extraneous": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "extraneous": true - }, - "uuid": { - "version": "3.4.0", - "bundled": true, - "extraneous": true - }, - "validate-npm-package-license": { - "version": "3.0.4", - "bundled": true, - "extraneous": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "bundled": true, - "extraneous": true, - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "bundled": true, - "extraneous": true, - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "walk-up-path": { - "version": "1.0.0", - "bundled": true, - "extraneous": true - }, - "wcwidth": { - "version": "1.0.1", - "bundled": true, - "extraneous": true, - "requires": { - "defaults": "^1.0.3" - } - }, - "which": { - "version": "2.0.2", - "bundled": true, - "extraneous": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wide-align": { - "version": "1.1.3", - "bundled": true, - "extraneous": true, - "requires": { - "string-width": "^1.0.2 || 2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "extraneous": true - }, - "write-file-atomic": { - "version": "3.0.3", - "bundled": true, - "extraneous": true, - "requires": { - "imurmurhash": "^0.1.4", - "is-typedarray": "^1.0.0", - "signal-exit": "^3.0.2", - "typedarray-to-buffer": "^3.1.5" - } - }, - "yallist": { - "version": "4.0.0", - "bundled": true, - "extraneous": true - } + "node": ">=0.10.0" } }, - "npm-run-path": { + "node_modules/object-copy/node_modules/is-descriptor/node_modules/kind-of": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", - "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", "dev": true, - "requires": { - "path-key": "^4.0.0" - }, - "dependencies": { - "path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "object-inspect": { + "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "object-keys": { + "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + } }, - "object-visit": { + "node_modules/object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.assign": { + "node_modules/object.assign": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "object.defaults": { + "node_modules/object.defaults": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", "integrity": "sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==", "dev": true, - "requires": { + "dependencies": { "array-each": "^1.0.1", "array-slice": "^1.0.0", "for-own": "^1.0.0", "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.map": { + "node_modules/object.map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", "integrity": "sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==", "dev": true, - "requires": { + "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.pick": { + "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", "dev": true, - "requires": { + "dependencies": { "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "object.reduce": { + "node_modules/object.reduce": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object.reduce/-/object.reduce-1.0.1.tgz", "integrity": "sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==", "dev": true, - "requires": { + "dependencies": { "for-own": "^1.0.0", "make-iterator": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "once": { + "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "requires": { + "dependencies": { "wrappy": "1" } }, - "onetime": { + "node_modules/onetime": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, - "requires": { + "dependencies": { "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "optionator": { + "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", "dev": true, - "requires": { + "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", @@ -25143,101 +9556,129 @@ "type-check": "^0.4.0", "word-wrap": "^1.2.3" }, - "dependencies": { - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - } + "engines": { + "node": ">= 0.8.0" } }, - "ordered-read-streams": { + "node_modules/optionator/node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/ordered-read-streams": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", "integrity": "sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.0.1" } }, - "os-browserify": { + "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", "integrity": "sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==", "dev": true }, - "os-locale": { + "node_modules/os-locale": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", "integrity": "sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==", "dev": true, - "requires": { + "dependencies": { "lcid": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "os-tmpdir": { + "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "p-limit": { + "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "requires": { + "dependencies": { "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-locate": { + "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "requires": { + "dependencies": { "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "p-map": { + "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", "dev": true, - "requires": { + "dependencies": { "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "pako": { + "node_modules/pako": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, - "parent-module": { + "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "requires": { + "dependencies": { "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" } }, - "parents": { + "node_modules/parents": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz", "integrity": "sha512-mXKF3xkoUt5td2DoxpLmtOmZvko9VfFpwRwkKDHSNvgmpLAeBo18YDhcPbBzJq+QLCHMbGOfzia2cX4U+0v9Mg==", "dev": true, - "requires": { + "dependencies": { "path-platform": "~0.11.15" } }, - "parse-asn1": { + "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==", - "requires": { + "dependencies": { "asn1.js": "^5.2.0", "browserify-aes": "^1.0.0", "evp_bytestokey": "^1.0.0", @@ -25245,410 +9686,543 @@ "safe-buffer": "^5.1.1" } }, - "parse-filepath": { + "node_modules/parse-filepath": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", "integrity": "sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==", "dev": true, - "requires": { + "dependencies": { "is-absolute": "^1.0.0", "map-cache": "^0.2.0", "path-root": "^0.1.1" + }, + "engines": { + "node": ">=0.8" } }, - "parse-json": { + "node_modules/parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==", "dev": true, - "requires": { + "dependencies": { "error-ex": "^1.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "parse-node-version": { + "node_modules/parse-node-version": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "parse-passwd": { + "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pascalcase": { + "node_modules/pascalcase": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-browserify": { + "node_modules/path-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", "dev": true }, - "path-dirname": { + "node_modules/path-dirname": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", "integrity": "sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==", "dev": true }, - "path-exists": { + "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-is-absolute": { + "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-key": { + "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "path-parse": { + "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==", "dev": true }, - "path-platform": { + "node_modules/path-platform": { "version": "0.11.15", "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz", "integrity": "sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "path-root": { + "node_modules/path-root": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", "integrity": "sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==", "dev": true, - "requires": { + "dependencies": { "path-root-regex": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "path-root-regex": { + "node_modules/path-root-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", "integrity": "sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "path-type": { + "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "pathval": { + "node_modules/pathval": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "pbkdf2": { + "node_modules/pbkdf2": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.2.tgz", "integrity": "sha512-iuh7L6jA7JEGu2WxDwtQP1ddOpaJNC4KlDEFfdQajSGgGPNi4OyDc2R7QnbY2bR9QjBVGwgvTdNJZoE7RaxUMA==", - "requires": { + "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" } }, - "picocolors": { + "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", "dev": true }, - "picomatch": { + "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } }, - "pidtree": { + "node_modules/pidtree": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", - "dev": true + "dev": true, + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } }, - "pify": { + "node_modules/pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pinkie": { + "node_modules/pinkie": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "pinkie-promise": { + "node_modules/pinkie-promise": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", "dev": true, - "requires": { + "dependencies": { "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "plugin-error": { + "node_modules/plugin-error": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", "dev": true, - "requires": { + "dependencies": { "ansi-colors": "^1.0.1", "arr-diff": "^4.0.0", "arr-union": "^3.1.0", "extend-shallow": "^3.0.2" + }, + "engines": { + "node": ">= 0.10" } }, - "posix-character-classes": { + "node_modules/posix-character-classes": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "prelude-ls": { + "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8.0" + } }, - "prettier": { + "node_modules/prettier": { "version": "2.8.7", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", - "dev": true + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } }, - "pretty-hrtime": { + "node_modules/pretty-hrtime": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.8" + } }, - "process": { + "node_modules/process": { "version": "0.11.10", "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.6.0" + } }, - "process-nextick-args": { + "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, - "progress": { + "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.0" + } }, - "propagate": { + "node_modules/propagate": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/propagate/-/propagate-2.0.1.tgz", "integrity": "sha512-vGrhOavPSTz4QVNuBNdcNXePNdNMaO1xj9yBeH1ScQPjk/rhg9sSlCXPhMkFuaNNW/syTvYqsnbIJxMBfRbbag==", - "dev": true + "dev": true, + "engines": { + "node": ">= 8" + } }, - "public-encrypt": { + "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", - "requires": { + "dependencies": { "bn.js": "^4.1.0", "browserify-rsa": "^4.0.0", "create-hash": "^1.1.0", "parse-asn1": "^5.0.0", "randombytes": "^2.0.1", "safe-buffer": "^5.1.2" - }, - "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==" - } } }, - "pump": { + "node_modules/public-encrypt/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==" + }, + "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", "dev": true, - "requires": { + "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, - "pumpify": { + "node_modules/pumpify": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", "dev": true, - "requires": { + "dependencies": { "duplexify": "^3.6.0", "inherits": "^2.0.3", "pump": "^2.0.0" - }, + } + }, + "node_modules/pumpify/node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, "dependencies": { - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - } + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" } }, - "punycode": { + "node_modules/punycode": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", "dev": true }, - "qs": { + "node_modules/qs": { "version": "6.11.1", "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", "dev": true, - "requires": { + "dependencies": { "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "query-string": { + "node_modules/query-string": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "requires": { + "dependencies": { "decode-uri-component": "^0.2.2", "filter-obj": "^1.1.0", "split-on-first": "^1.0.0", "strict-uri-encode": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "querystring": { + "node_modules/querystring": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==", - "dev": true + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "dev": true, + "engines": { + "node": ">=0.4.x" + } }, - "querystring-es3": { + "node_modules/querystring-es3": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", "integrity": "sha512-773xhDQnZBMFobEiztv8LIl70ch5MSF/jUQVlhwFyBILqq96anmoctVIYz+ZRp0qbCKATTn6ev02M3r7Ga5vqA==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4.x" + } }, - "queue-microtask": { + "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "randombytes": { + "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "requires": { + "dependencies": { "safe-buffer": "^5.1.0" } }, - "randomfill": { + "node_modules/randomfill": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", - "requires": { + "dependencies": { "randombytes": "^2.0.5", "safe-buffer": "^5.1.0" } }, - "read-only-stream": { + "node_modules/read-only-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz", "integrity": "sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==", "dev": true, - "requires": { + "dependencies": { "readable-stream": "^2.0.2" } }, - "read-pkg": { + "node_modules/read-pkg": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", "integrity": "sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==", "dev": true, - "requires": { + "dependencies": { "load-json-file": "^1.0.0", "normalize-package-data": "^2.3.2", "path-type": "^1.0.0" }, - "dependencies": { - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - } + "engines": { + "node": ">=0.10.0" } }, - "read-pkg-up": { + "node_modules/read-pkg-up": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", "integrity": "sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==", "dev": true, - "requires": { + "dependencies": { "find-up": "^1.0.0", "read-pkg": "^1.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", + "dev": true, "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==", - "dev": true, - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", - "dev": true, - "requires": { - "pinkie-promise": "^2.0.0" - } - } + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg-up/node_modules/path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==", + "dev": true, + "dependencies": { + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/read-pkg/node_modules/path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "readable-stream": { + "node_modules/readable-stream": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dev": true, - "requires": { + "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", "isarray": "~1.0.0", @@ -25656,531 +10230,696 @@ "safe-buffer": "~5.1.1", "string_decoder": "~1.1.1", "util-deprecate": "~1.0.1" - }, + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "node_modules/readable-stream/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - } + "safe-buffer": "~5.1.0" } }, - "readdirp": { + "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "requires": { + "dependencies": { "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" } }, - "rechoir": { + "node_modules/rechoir": { "version": "0.6.2", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", "integrity": "sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==", "dev": true, - "requires": { + "dependencies": { "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" } }, - "regenerate": { + "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, - "regenerate-unicode-properties": { + "node_modules/regenerate-unicode-properties": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", "dev": true, - "requires": { + "dependencies": { "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" } }, - "regenerator-runtime": { + "node_modules/regenerator-runtime": { "version": "0.13.11", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "dev": true }, - "regenerator-transform": { + "node_modules/regenerator-transform": { "version": "0.15.1", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", "dev": true, - "requires": { + "dependencies": { "@babel/runtime": "^7.8.4" } }, - "regex-not": { + "node_modules/regex-not": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "regexpp": { + "node_modules/regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", - "dev": true + "dev": true, + "engines": { + "node": ">=6.5.0" + } }, - "regexpu-core": { + "node_modules/regexpu-core": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, - "requires": { + "dependencies": { "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" } }, - "regjsparser": { + "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", "dev": true, - "requires": { + "dependencies": { "jsesc": "~0.5.0" }, - "dependencies": { - "jsesc": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true - } + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" } }, - "remove-bom-buffer": { + "node_modules/remove-bom-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/remove-bom-buffer/-/remove-bom-buffer-3.0.0.tgz", "integrity": "sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==", "dev": true, - "requires": { + "dependencies": { "is-buffer": "^1.1.5", "is-utf8": "^0.2.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "remove-bom-stream": { + "node_modules/remove-bom-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/remove-bom-stream/-/remove-bom-stream-1.2.0.tgz", "integrity": "sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==", "dev": true, - "requires": { + "dependencies": { "remove-bom-buffer": "^3.0.0", "safe-buffer": "^5.1.0", "through2": "^2.0.3" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remove-bom-stream/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "remove-trailing-separator": { + "node_modules/remove-trailing-separator": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", "integrity": "sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==", "dev": true }, - "repeat-element": { + "node_modules/repeat-element": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "repeat-string": { + "node_modules/repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10" + } }, - "replace-ext": { + "node_modules/replace-ext": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.1.tgz", "integrity": "sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "replace-homedir": { + "node_modules/replace-homedir": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-homedir/-/replace-homedir-1.0.0.tgz", "integrity": "sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==", "dev": true, - "requires": { + "dependencies": { "homedir-polyfill": "^1.0.1", "is-absolute": "^1.0.0", "remove-trailing-separator": "^1.1.0" + }, + "engines": { + "node": ">= 0.10" } }, - "require-directory": { + "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "require-main-filename": { + "node_modules/require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==", "dev": true }, - "resolve": { + "node_modules/resolve": { "version": "1.22.2", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dev": true, - "requires": { + "dependencies": { "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "resolve-dir": { + "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, - "requires": { + "dependencies": { "expand-tilde": "^2.0.0", "global-modules": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "resolve-from": { + "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "resolve-options": { + "node_modules/resolve-options": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/resolve-options/-/resolve-options-1.1.0.tgz", "integrity": "sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==", "dev": true, - "requires": { + "dependencies": { "value-or-function": "^3.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "resolve-url": { + "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", "dev": true }, - "restore-cursor": { + "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, - "requires": { + "dependencies": { "onetime": "^5.1.0", "signal-exit": "^3.0.2" }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, "dependencies": { - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - } + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "ret": { + "node_modules/ret": { "version": "0.1.15", "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12" + } }, - "reusify": { + "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } }, - "rfdc": { + "node_modules/rfdc": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", "dev": true }, - "rimraf": { + "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", "dev": true, - "requires": { + "dependencies": { "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "ripemd160": { + "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", - "requires": { + "dependencies": { "hash-base": "^3.0.0", "inherits": "^2.0.1" } }, - "run-async": { + "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.12.0" + } }, - "run-parallel": { + "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, - "requires": { + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { "queue-microtask": "^1.2.2" } }, - "rxjs": { + "node_modules/rxjs": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.0.tgz", "integrity": "sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg==", "dev": true, - "requires": { - "tslib": "^2.1.0" - }, "dependencies": { - "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", - "dev": true - } + "tslib": "^2.1.0" } }, - "safe-buffer": { + "node_modules/rxjs/node_modules/tslib": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "dev": true + }, + "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "safe-regex": { + "node_modules/safe-regex": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", "dev": true, - "requires": { + "dependencies": { "ret": "~0.1.10" } }, - "safer-buffer": { + "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, - "sax": { + "node_modules/sax": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "semver": { + "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "dev": true, + "bin": { + "semver": "bin/semver.js" + } }, - "semver-greatest-satisfied-range": { + "node_modules/semver-greatest-satisfied-range": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/semver-greatest-satisfied-range/-/semver-greatest-satisfied-range-1.1.0.tgz", "integrity": "sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==", "dev": true, - "requires": { + "dependencies": { "sver-compat": "^1.5.0" + }, + "engines": { + "node": ">= 0.10" } }, - "serialize-javascript": { + "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", "dev": true, - "requires": { + "dependencies": { "randombytes": "^2.1.0" } }, - "set-blocking": { + "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==", "dev": true }, - "set-value": { + "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^2.0.1", "is-extendable": "^0.1.1", "is-plain-object": "^2.0.3", "split-string": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - } + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "sha.js": { + "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==", - "requires": { + "dependencies": { "inherits": "^2.0.1", "safe-buffer": "^5.0.1" + }, + "bin": { + "sha.js": "bin.js" } }, - "shasum": { + "node_modules/shasum": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz", "integrity": "sha512-UTzHm/+AzKfO9RgPgRpDIuMSNie1ubXRaljjlhFMNGYoG7z+rm9AHLPMf70R7887xboDH9Q+5YQbWKObFHEAtw==", "dev": true, - "requires": { + "dependencies": { "json-stable-stringify": "~0.0.0", "sha.js": "~2.4.4" } }, - "shasum-object": { + "node_modules/shasum-object": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shasum-object/-/shasum-object-1.0.0.tgz", "integrity": "sha512-Iqo5rp/3xVi6M4YheapzZhhGPVs0yZwHj7wvwQ1B9z8H6zk+FEnI7y3Teq7qwnekfEhu8WmG2z0z4iWZaxLWVg==", "dev": true, - "requires": { + "dependencies": { "fast-safe-stringify": "^2.0.7" } }, - "shebang-command": { + "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "requires": { + "dependencies": { "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" } }, - "shebang-regex": { + "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "shell-quote": { + "node_modules/shell-quote": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", - "dev": true + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "side-channel": { + "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dev": true, - "requires": { + "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "signal-exit": { + "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, - "simple-concat": { + "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "dev": true + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, - "slash": { + "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + } }, - "slice-ansi": { + "node_modules/slice-ansi": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^6.0.0", "is-fullwidth-code-point": "^4.0.0" }, - "dependencies": { - "ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "dev": true - } + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "snapdragon": { + "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", "dev": true, - "requires": { + "dependencies": { "base": "^0.11.1", "debug": "^2.2.0", "define-property": "^0.2.5", @@ -26190,159 +10929,195 @@ "source-map-resolve": "^0.5.0", "use": "^3.1.0" }, - "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" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-node": { + "node_modules/snapdragon-node": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^1.0.0", "isobject": "^3.0.0", "snapdragon-util": "^3.0.1" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - } + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "snapdragon-util": { + "node_modules/snapdragon-util": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.2.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/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/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "source-map": { + "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "source-map-resolve": { + "node_modules/source-map-resolve": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", "dev": true, - "requires": { + "dependencies": { "atob": "^2.1.2", "decode-uri-component": "^0.2.0", "resolve-url": "^0.2.1", @@ -26350,343 +11125,419 @@ "urix": "^0.1.0" } }, - "source-map-support": { + "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, - "requires": { + "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, - "source-map-url": { + "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", "dev": true }, - "sparkles": { + "node_modules/sparkles": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.1.tgz", "integrity": "sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "spdx-correct": { + "node_modules/spdx-correct": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, - "requires": { + "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-exceptions": { + "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, - "spdx-expression-parse": { + "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, - "requires": { + "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, - "spdx-license-ids": { + "node_modules/spdx-license-ids": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", "dev": true }, - "split-file": { + "node_modules/split-file": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/split-file/-/split-file-2.3.0.tgz", "integrity": "sha512-dc/0SDKvjtSjUI999vkclWQAk5xhD86pKEWWL2ULR6WrHI9/euIEMG/JSUbwbNW8IC+gYLJqynSGHwlOVmSwGA==", "dev": true, - "requires": { + "dependencies": { "bluebird": "^3.7.2" + }, + "bin": { + "split-file": "split-file-cli.js" } }, - "split-on-first": { + "node_modules/split-on-first": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==" + "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", + "engines": { + "node": ">=6" + } }, - "split-string": { + "node_modules/split-string": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, - "requires": { + "dependencies": { "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "sprintf-js": { + "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, - "stack-trace": { + "node_modules/stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true + "dev": true, + "engines": { + "node": "*" + } }, - "static-extend": { + "node_modules/static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", "dev": true, - "requires": { + "dependencies": { "define-property": "^0.2.5", "object-copy": "^0.1.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", + "dev": true, "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - } - } + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-accessor-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-data-descriptor/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "stream-browserify": { + "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, - "requires": { + "dependencies": { "inherits": "~2.0.1", "readable-stream": "^2.0.2" } }, - "stream-combiner2": { + "node_modules/stream-combiner2": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz", "integrity": "sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==", "dev": true, - "requires": { + "dependencies": { "duplexer2": "~0.1.0", "readable-stream": "^2.0.2" } }, - "stream-exhaust": { + "node_modules/stream-exhaust": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/stream-exhaust/-/stream-exhaust-1.0.2.tgz", "integrity": "sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==", "dev": true }, - "stream-http": { + "node_modules/stream-http": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-3.2.0.tgz", "integrity": "sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==", "dev": true, - "requires": { + "dependencies": { "builtin-status-codes": "^3.0.0", "inherits": "^2.0.4", "readable-stream": "^3.6.0", "xtend": "^4.0.2" - }, + } + }, + "node_modules/stream-http/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": { - "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" - } - } + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "stream-shift": { + "node_modules/stream-shift": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", "dev": true }, - "stream-splicer": { + "node_modules/stream-splicer": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.1.tgz", "integrity": "sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==", "dev": true, - "requires": { + "dependencies": { "inherits": "^2.0.1", "readable-stream": "^2.0.2" } }, - "strict-uri-encode": { + "node_modules/strict-uri-encode": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==" + "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", + "engines": { + "node": ">=4" + } }, - "string_decoder": { + "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { + "dependencies": { "safe-buffer": "~5.2.0" } }, - "string-argv": { + "node_modules/string-argv": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.6.19" + } }, - "string-width": { + "node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, - "requires": { + "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", "strip-ansi": "^7.0.1" }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true - }, - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", - "dev": true, - "requires": { - "ansi-regex": "^6.0.1" - } - } + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "strip-ansi": { + "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "requires": { + "dependencies": { "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" } }, - "strip-bom": { + "node_modules/strip-bom": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", "integrity": "sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==", "dev": true, - "requires": { + "dependencies": { "is-utf8": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "strip-bom-string": { + "node_modules/strip-bom-string": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-bom-string/-/strip-bom-string-1.0.0.tgz", "integrity": "sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "strip-final-newline": { + "node_modules/strip-final-newline": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", - "dev": true + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "strip-json-comments": { + "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "strnum": { + "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" }, - "subarg": { + "node_modules/subarg": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", "integrity": "sha512-RIrIdRY0X1xojthNcVtgT9sjpOGagEUKpZdgBUi054OEPFo282yg+zE+t1Rj3+RqKq2xStL7uUHhY+AjbC4BXg==", "dev": true, - "requires": { + "dependencies": { "minimist": "^1.1.0" } }, - "superagent": { + "node_modules/superagent": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/superagent/-/superagent-5.3.1.tgz", "integrity": "sha512-wjJ/MoTid2/RuGCOFtlacyGNxN9QLMgcpYLDQlWFIhhdJ93kNscFonGvrpAHSCVjRVj++DGCglocF7Aej1KHvQ==", + "deprecated": "Please upgrade to v7.0.2+ of superagent. We have fixed numerous issues with streams, form-data, attach(), filesystem errors not bubbling up (ENOENT on attach()), and all tests are now passing. See the releases tab for more information at .", "dev": true, - "requires": { + "dependencies": { "component-emitter": "^1.3.0", "cookiejar": "^2.1.2", "debug": "^4.1.1", @@ -26699,450 +11550,557 @@ "readable-stream": "^3.6.0", "semver": "^7.3.2" }, + "engines": { + "node": ">= 7.0.0" + } + }, + "node_modules/superagent/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/superagent/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/superagent/node_modules/semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "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" - } - }, - "semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - } + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, - "supports-color": { + "node_modules/superagent/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, - "requires": { + "dependencies": { "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "supports-preserve-symlinks-flag": { + "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, - "sver-compat": { + "node_modules/sver-compat": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/sver-compat/-/sver-compat-1.5.0.tgz", "integrity": "sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==", "dev": true, - "requires": { + "dependencies": { "es6-iterator": "^2.0.1", "es6-symbol": "^3.1.1" } }, - "syntax-error": { + "node_modules/syntax-error": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz", "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==", "dev": true, - "requires": { + "dependencies": { "acorn-node": "^1.2.0" } }, - "table": { + "node_modules/table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, - "requires": { + "dependencies": { "ajv": "^6.10.2", "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/table/node_modules/ansi-regex": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", + "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "dev": true - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "astral-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", - "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", - "dev": true - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "slice-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", - "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.0", - "astral-regex": "^1.0.0", - "is-fullwidth-code-point": "^2.0.0" - } - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "dev": true, - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "dev": true, - "requires": { - "ansi-regex": "^4.1.0" - } - } + "color-name": "1.1.3" + } + }, + "node_modules/table/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", + "dev": true + }, + "node_modules/table/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/table/node_modules/slice-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.0", + "astral-regex": "^1.0.0", + "is-fullwidth-code-point": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "dependencies": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/table/node_modules/strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "dependencies": { + "ansi-regex": "^4.1.0" + }, + "engines": { + "node": ">=6" } }, - "ternary-stream": { + "node_modules/ternary-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-3.0.0.tgz", "integrity": "sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==", "dev": true, - "requires": { + "dependencies": { "duplexify": "^4.1.1", "fork-stream": "^0.0.4", "merge-stream": "^2.0.0", "through2": "^3.0.1" } }, - "text-table": { + "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "through": { + "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "through2": { + "node_modules/through2": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", - "requires": { + "dependencies": { "inherits": "^2.0.4", "readable-stream": "2 || 3" - }, - "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==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - } } }, - "through2-filter": { + "node_modules/through2-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", "dev": true, - "requires": { + "dependencies": { "through2": "~2.0.0", "xtend": "~4.0.0" - }, + } + }, + "node_modules/through2-filter/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "node_modules/through2/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==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" } }, - "time-stamp": { + "node_modules/time-stamp": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", "integrity": "sha512-gLCeArryy2yNTRzTGKbZbloctj64jkZ57hj5zdraXue6aFgd6PmvVtEyiUU+hvU0v7q08oVv8r8ev0tRo6bvgw==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "timers-browserify": { + "node_modules/timers-browserify": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz", "integrity": "sha512-PIxwAupJZiYU4JmVZYwXp9FKsHMXb5h0ZEFyuXTAn8WLHOlcij+FEcbrvDsom1o5dr1YggEtFbECvGCW2sT53Q==", "dev": true, - "requires": { + "dependencies": { "process": "~0.11.0" + }, + "engines": { + "node": ">=0.6.0" } }, - "timers-ext": { + "node_modules/timers-ext": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", "dev": true, - "requires": { + "dependencies": { "es5-ext": "~0.10.46", "next-tick": "1" } }, - "tmp": { + "node_modules/tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, - "requires": { + "dependencies": { "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" } }, - "to-absolute-glob": { + "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", "integrity": "sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==", "dev": true, - "requires": { + "dependencies": { "is-absolute": "^1.0.0", "is-negated-glob": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-fast-properties": { + "node_modules/to-fast-properties": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "to-object-path": { + "node_modules/to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", "dev": true, - "requires": { + "dependencies": { "kind-of": "^3.0.2" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex": { + "node_modules/to-regex": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", "dev": true, - "requires": { + "dependencies": { "define-property": "^2.0.2", "extend-shallow": "^3.0.2", "regex-not": "^1.0.2", "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" } }, - "to-regex-range": { + "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "requires": { + "dependencies": { "is-number": "^7.0.0" }, - "dependencies": { - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - } + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex-range/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" } }, - "to-through": { + "node_modules/to-through": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-through/-/to-through-2.0.0.tgz", "integrity": "sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==", "dev": true, - "requires": { + "dependencies": { "through2": "^2.0.3" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/to-through/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "tslib": { + "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true }, - "tsutils": { + "node_modules/tsutils": { "version": "3.21.0", "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, - "requires": { + "dependencies": { "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" } }, - "tty-browserify": { + "node_modules/tty-browserify": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz", "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "type": { + "node_modules/type": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==", "dev": true }, - "type-check": { + "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "requires": { + "dependencies": { "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" } }, - "type-detect": { + "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "type-fest": { + "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "typedarray": { + "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", "dev": true }, - "typescript": { + "node_modules/typescript": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", "dev": true, - "peer": true + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=12.20" + } }, - "umd": { + "node_modules/umd": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz", "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow==", - "dev": true + "dev": true, + "bin": { + "umd": "bin/cli.js" + } }, - "unc-path-regex": { + "node_modules/unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", "integrity": "sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "undeclared-identifiers": { + "node_modules/undeclared-identifiers": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.3.tgz", "integrity": "sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==", "dev": true, - "requires": { + "dependencies": { "acorn-node": "^1.3.0", "dash-ast": "^1.0.0", "get-assigned-identifiers": "^1.2.0", "simple-concat": "^1.0.0", "xtend": "^4.0.1" + }, + "bin": { + "undeclared-identifiers": "bin.js" } }, - "undertaker": { + "node_modules/undertaker": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/undertaker/-/undertaker-1.3.0.tgz", "integrity": "sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==", "dev": true, - "requires": { + "dependencies": { "arr-flatten": "^1.0.1", "arr-map": "^2.0.0", "bach": "^1.0.0", @@ -27153,180 +12111,233 @@ "object.defaults": "^1.0.0", "object.reduce": "^1.0.0", "undertaker-registry": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "undertaker-registry": { + "node_modules/undertaker-registry": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/undertaker-registry/-/undertaker-registry-1.0.1.tgz", "integrity": "sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "unicode-canonical-property-names-ecmascript": { + "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "unicode-match-property-ecmascript": { + "node_modules/unicode-match-property-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", "dev": true, - "requires": { + "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" } }, - "unicode-match-property-value-ecmascript": { + "node_modules/unicode-match-property-value-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "unicode-property-aliases-ecmascript": { + "node_modules/unicode-property-aliases-ecmascript": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", - "dev": true + "dev": true, + "engines": { + "node": ">=4" + } }, - "union-value": { + "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", "dev": true, - "requires": { + "dependencies": { "arr-union": "^3.1.0", "get-value": "^2.0.6", "is-extendable": "^0.1.1", "set-value": "^2.0.1" }, - "dependencies": { - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", - "dev": true - } + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/union-value/node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "unique-stream": { + "node_modules/unique-stream": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", "dev": true, - "requires": { + "dependencies": { "json-stable-stringify-without-jsonify": "^1.0.1", "through2-filter": "^3.0.0" } }, - "unset-value": { + "node_modules/unset-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", "dev": true, - "requires": { + "dependencies": { "has-value": "^0.3.1", "isobject": "^3.0.0" }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", - "dev": true - } + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, - "upath": { + "node_modules/upath": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", - "dev": true + "dev": true, + "engines": { + "node": ">=4", + "yarn": "*" + } }, - "update-browserslist-db": { + "node_modules/update-browserslist-db": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, - "requires": { + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0" + }, + "bin": { + "browserslist-lint": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, - "uri-js": { + "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "requires": { - "punycode": "^2.1.0" - }, "dependencies": { - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - } + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" } }, - "urix": { + "node_modules/urix": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", "dev": true }, - "url": { + "node_modules/url": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", "integrity": "sha512-kbailJa29QrtXnxgq+DdCEGlbTeYM2eJUxsz6vjZavrCYPMIFHMKQmSKYAIuUK2i7hgPm28a8piX5NTUtM/LKQ==", "dev": true, - "requires": { + "dependencies": { "punycode": "1.3.2", "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", - "dev": true - } } }, - "use": { + "node_modules/url/node_modules/punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha512-RofWgt/7fL5wP1Y7fxE7/EmTLzQVnB0ycyibJ0OOHIlJqTNzglYFxVwETOcIoJqJmpDXJ9xImDv+Fq34F/d4Dw==", + "dev": true + }, + "node_modules/use": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "util": { + "node_modules/util": { "version": "0.12.5", "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "requires": { + "dependencies": { "inherits": "^2.0.3", "is-arguments": "^1.0.4", "is-generator-function": "^1.0.7", @@ -27334,68 +12345,81 @@ "which-typed-array": "^1.1.2" } }, - "util-deprecate": { + "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, - "uuid": { + "node_modules/uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "dev": true + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "dev": true, + "bin": { + "uuid": "bin/uuid" + } }, - "v8-compile-cache": { + "node_modules/v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "v8flags": { + "node_modules/v8flags": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.2.0.tgz", "integrity": "sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==", "dev": true, - "requires": { + "dependencies": { "homedir-polyfill": "^1.0.1" + }, + "engines": { + "node": ">= 0.10" } }, - "validate-npm-package-license": { + "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, - "requires": { + "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, - "value-or-function": { + "node_modules/value-or-function": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/value-or-function/-/value-or-function-3.0.0.tgz", "integrity": "sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==", - "dev": true + "dev": true, + "engines": { + "node": ">= 0.10" + } }, - "vinyl": { + "node_modules/vinyl": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.2.1.tgz", "integrity": "sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==", "dev": true, - "requires": { + "dependencies": { "clone": "^2.1.1", "clone-buffer": "^1.0.0", "clone-stats": "^1.0.0", "cloneable-readable": "^1.0.0", "remove-trailing-separator": "^1.0.1", "replace-ext": "^1.0.0" + }, + "engines": { + "node": ">= 0.10" } }, - "vinyl-fs": { + "node_modules/vinyl-fs": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-3.0.3.tgz", "integrity": "sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==", "dev": true, - "requires": { + "dependencies": { "fs-mkdirp-stream": "^1.0.0", "glob-stream": "^6.1.0", "graceful-fs": "^4.0.0", @@ -27414,25 +12438,26 @@ "vinyl": "^2.0.0", "vinyl-sourcemap": "^1.1.0" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-fs/node_modules/through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, "dependencies": { - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - } + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" } }, - "vinyl-sourcemap": { + "node_modules/vinyl-sourcemap": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/vinyl-sourcemap/-/vinyl-sourcemap-1.1.0.tgz", "integrity": "sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==", "dev": true, - "requires": { + "dependencies": { "append-buffer": "^1.0.2", "convert-source-map": "^1.5.0", "graceful-fs": "^4.1.6", @@ -27441,226 +12466,286 @@ "remove-bom-buffer": "^3.0.0", "vinyl": "^2.0.0" }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/vinyl-sourcemap/node_modules/normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", + "dev": true, "dependencies": { - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - } + "remove-trailing-separator": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" } }, - "vinyl-sourcemaps-apply": { + "node_modules/vinyl-sourcemaps-apply": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/vinyl-sourcemaps-apply/-/vinyl-sourcemaps-apply-0.2.1.tgz", "integrity": "sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==", "dev": true, - "requires": { - "source-map": "^0.5.1" - }, "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", - "dev": true - } + "source-map": "^0.5.1" } }, - "vm-browserify": { + "node_modules/vinyl-sourcemaps-apply/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", "dev": true }, - "web-encoding": { + "node_modules/web-encoding": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "requires": { - "@zxing/text-encoding": "0.9.0", + "dependencies": { "util": "^0.12.3" + }, + "optionalDependencies": { + "@zxing/text-encoding": "0.9.0" } }, - "which": { + "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "requires": { + "dependencies": { "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, - "which-module": { + "node_modules/which-module": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", "integrity": "sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==", "dev": true }, - "which-typed-array": { + "node_modules/which-typed-array": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "requires": { + "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", "has-tostringtag": "^1.0.0", "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, - "wide-align": { + "node_modules/wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, - "requires": { + "dependencies": { "string-width": "^1.0.2 || 2" + } + }, + "node_modules/wide-align/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/wide-align/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dev": true, "dependencies": { - "ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "dev": true - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" } }, - "word-wrap": { + "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.10.0" + } }, - "workerpool": { + "node_modules/workerpool": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.0.tgz", "integrity": "sha512-Rsk5qQHJ9eowMH28Jwhe8HEbmdYDX4lwoMWshiCXugjtHqMD9ZbiqSDLxcsfdqsETPzVUtX5s1Z5kStiIM6l4A==", "dev": true }, - "wrap-ansi": { + "node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, - "requires": { + "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" } }, - "wrappy": { + "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, - "write": { + "node_modules/write": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, - "requires": { + "dependencies": { "mkdirp": "^0.5.1" + }, + "engines": { + "node": ">=4" } }, - "xml": { + "node_modules/xml": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/xml/-/xml-1.0.1.tgz", "integrity": "sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==" }, - "xml2js": { + "node_modules/xml2js": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.5.0.tgz", "integrity": "sha512-drPFnkQJik/O+uPKpqSgr22mpuFHqKdbS835iAQrUC73L2F5WkboIRd63ai/2Yg6I1jzifPFKH2NTK+cfglkIA==", - "requires": { + "dependencies": { "sax": ">=0.6.0", "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" } }, - "xmlbuilder": { + "node_modules/xmlbuilder": { "version": "11.0.1", "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==" + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } }, - "xtend": { + "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "dev": true + "dev": true, + "engines": { + "node": ">=0.4" + } }, - "y18n": { + "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yallist": { + "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, - "yaml": { + "node_modules/yaml": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.1.tgz", "integrity": "sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==", - "dev": true + "dev": true, + "engines": { + "node": ">= 14" + } }, - "yargs": { + "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", "dev": true, - "requires": { + "dependencies": { "cliui": "^7.0.2", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", @@ -27669,63 +12754,89 @@ "y18n": "^5.0.5", "yargs-parser": "^20.2.2" }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true - }, - "string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - } - }, - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } + "engines": { + "node": ">=10" } }, - "yargs-parser": { + "node_modules/yargs-parser": { "version": "20.2.4", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + } }, - "yargs-unparser": { + "node_modules/yargs-unparser": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", "dev": true, - "requires": { + "dependencies": { "camelcase": "^6.0.0", "decamelize": "^4.0.0", "flat": "^5.0.2", "is-plain-obj": "^2.1.0" }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-unparser/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yargs/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, "dependencies": { - "camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true - } + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" } }, - "yocto-queue": { + "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } } } } From 8c3b7fb1b7d584f751bb2e3a7ed930d1ee523fac Mon Sep 17 00:00:00 2001 From: Trim21 Date: Sun, 30 Apr 2023 09:36:08 +0800 Subject: [PATCH 23/23] chmod --- .husky/pre-commit | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 .husky/pre-commit diff --git a/.husky/pre-commit b/.husky/pre-commit old mode 100644 new mode 100755