├── .env.example ├── .gitignore ├── ISSUE_TEMPLATE.md ├── LICENSE.md ├── PULL_REQUEST_TEMPLATE.md ├── README.md ├── example.txt ├── index.js ├── package-lock.json └── package.json /.env.example: -------------------------------------------------------------------------------- 1 | AZURE_STORAGE_CONNECTION_STRING= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | .vscode 4 | example.downloaded.txt -------------------------------------------------------------------------------- /ISSUE_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | 4 | > Please provide us with the following information: 5 | > --------------------------------------------------------------- 6 | 7 | ### This issue is for a: (mark with an `x`) 8 | ``` 9 | - [ ] bug report -> please search issues before submitting 10 | - [ ] feature request 11 | - [ ] documentation issue or request 12 | - [ ] regression (a behavior that used to work and stopped in a new release) 13 | ``` 14 | 15 | ### Minimal steps to reproduce 16 | > 17 | 18 | ### Any log messages given by the failure 19 | > 20 | 21 | ### Expected/desired behavior 22 | > 23 | 24 | ### OS and Version? 25 | > Windows 7, 8 or 10. Linux (which distribution). macOS (Yosemite? El Capitan? Sierra?) 26 | 27 | ### Versions 28 | > 29 | 30 | ### Mention any other details that might be useful 31 | 32 | > --------------------------------------------------------------- 33 | > Thanks! We'll be in touch soon. -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Microsoft Corporation. All rights reserved. 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE -------------------------------------------------------------------------------- /PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ## Purpose 2 | 3 | * ... 4 | 5 | ## Does this introduce a breaking change? 6 | 7 | ``` 8 | [ ] Yes 9 | [ ] No 10 | ``` 11 | 12 | ## Pull Request Type 13 | What kind of change does this Pull Request introduce? 14 | 15 | 16 | ``` 17 | [ ] Bugfix 18 | [ ] Feature 19 | [ ] Code style update (formatting, local variables) 20 | [ ] Refactoring (no functional changes, no api changes) 21 | [ ] Documentation content changes 22 | [ ] Other... Please describe: 23 | ``` 24 | 25 | ## How to Test 26 | * Get the code 27 | 28 | ``` 29 | git clone [repo-address] 30 | cd [repo-name] 31 | git checkout [branch-name] 32 | npm install 33 | ``` 34 | 35 | * Test the code 36 | 37 | ``` 38 | ``` 39 | 40 | ## What to Check 41 | Verify that the following are valid 42 | * ... 43 | 44 | ## Other Information 45 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | --- 2 | page_type: sample 3 | languages: 4 | - javascript 5 | products: 6 | - azure 7 | description: "You are viewing a tutorial for the legacy version of the Azure Storage Node.js SDK." 8 | urlFragment: storage-blobs-node-quickstart 9 | --- 10 | 11 | # Storage Blobs Quickstart 12 | 13 | > **WARNING** 14 | > Samples in this repository use older package `azure-storage` for Azure Storage Blobs. 15 | We recommend that you refer to the [samples that use the new package](https://github.com/Azure-Samples/azure-sdk-for-js-storage-blob-upload-download) `@azure/storage-blob` instead. 16 | 17 | The following sample includes the following features: 18 | 19 | - **Uses async/await**: The [Azure Storage SDK API](https://github.com/Azure/azure-storage-node) is still callback-based, but the approach in this sample modernizes the syntax. API calls are wrapped in `Promises` and are executed in the context of an `async/await` operation. 20 | 21 | - **Uses environment variables**: This sample accesses the connection string from an environment variable. The use of environment variables is representative of how you would access sensitive information in production. 22 | 23 | 24 | To run this sample, you need an [Azure account](https://azure.microsoft.com/free/), a [blob storage account](https://docs.microsoft.com/azure/storage/common/storage-create-storage-account), and the associated blob storage connection string. 25 | 26 | ## Set up 27 | First, clone the repository on your machine: 28 | 29 | git clone https://github.com/Azure-Samples/storage-blobs-node-quickstart.git 30 | 31 | Then, switch to the appropriate folder: 32 | 33 | cd storage-blobs-node-quickstart 34 | 35 | Next, install the dependencies: 36 | 37 | npm install 38 | 39 | Now, add your blob storage connection string as an environment variable named `AZURE_STORAGE_CONNECTION_STRING` to a file named `.env`. 40 | 41 | > **Note**: This repository includes a file named `.env.example`. You can rename this file by removing `.example` and adding the correct value for your connection string in the `.env` file. 42 | 43 | ## Running the sample 44 | 45 | Once the setup, you can run the sample by using `npm start`. 46 | 47 | ```bash 48 | npm start 49 | ``` 50 | When complete, the application should produce output similar to the following: 51 | 52 | ```bash 53 | Containers: 54 | - container-one 55 | - container-two 56 | Container "demo" is created 57 | Blob "quickstart.txt" is uploaded 58 | Local file "./readme.md" is uploaded 59 | Blobs in "demo" container: 60 | - quickstart.txt 61 | - readme.md 62 | Blob downloaded blob content: "hello Blob SDK" 63 | Blob "quickstart.txt" is deleted 64 | Container "demo" is deleted 65 | Done 66 | ``` 67 | 68 | ## Resources 69 | 70 | You can use the [Azure Storage Explorer](https://azure.microsoft.com/features/storage-explorer/) to see the data in your Azure account. 71 | -------------------------------------------------------------------------------- /example.txt: -------------------------------------------------------------------------------- 1 | Hello Blob World! -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | if (process.env.NODE_ENV !== 'production') { 2 | require('dotenv').load(); 3 | } 4 | 5 | const path = require('path'); 6 | const storage = require('azure-storage'); 7 | 8 | const blobService = storage.createBlobService(); 9 | 10 | const listContainers = async () => { 11 | return new Promise((resolve, reject) => { 12 | blobService.listContainersSegmented(null, (err, data) => { 13 | if (err) { 14 | reject(err); 15 | } else { 16 | resolve({ message: `${data.entries.length} containers`, containers: data.entries }); 17 | } 18 | }); 19 | }); 20 | }; 21 | 22 | const createContainer = async (containerName) => { 23 | return new Promise((resolve, reject) => { 24 | blobService.createContainerIfNotExists(containerName, { publicAccessLevel: 'blob' }, err => { 25 | if (err) { 26 | reject(err); 27 | } else { 28 | resolve({ message: `Container '${containerName}' created` }); 29 | } 30 | }); 31 | }); 32 | }; 33 | 34 | const uploadString = async (containerName, blobName, text) => { 35 | return new Promise((resolve, reject) => { 36 | blobService.createBlockBlobFromText(containerName, blobName, text, err => { 37 | if (err) { 38 | reject(err); 39 | } else { 40 | resolve({ message: `Text "${text}" is written to blob storage` }); 41 | } 42 | }); 43 | }); 44 | }; 45 | 46 | const uploadLocalFile = async (containerName, filePath) => { 47 | return new Promise((resolve, reject) => { 48 | const fullPath = path.resolve(filePath); 49 | const blobName = path.basename(filePath); 50 | blobService.createBlockBlobFromLocalFile(containerName, blobName, fullPath, err => { 51 | if (err) { 52 | reject(err); 53 | } else { 54 | resolve({ message: `Local file "${filePath}" is uploaded` }); 55 | } 56 | }); 57 | }); 58 | }; 59 | 60 | const listBlobs = async (containerName) => { 61 | return new Promise((resolve, reject) => { 62 | blobService.listBlobsSegmented(containerName, null, (err, data) => { 63 | if (err) { 64 | reject(err); 65 | } else { 66 | resolve({ message: `${data.entries.length} blobs in '${containerName}'`, blobs: data.entries }); 67 | } 68 | }); 69 | }); 70 | }; 71 | 72 | const downloadBlob = async (containerName, blobName) => { 73 | const dowloadFilePath = path.resolve('./' + blobName.replace('.txt', '.downloaded.txt')); 74 | return new Promise((resolve, reject) => { 75 | blobService.getBlobToText(containerName, blobName, (err, data) => { 76 | if (err) { 77 | reject(err); 78 | } else { 79 | resolve({ message: `Blob downloaded "${data}"`, text: data }); 80 | } 81 | }); 82 | }); 83 | }; 84 | 85 | const deleteBlob = async (containerName, blobName) => { 86 | return new Promise((resolve, reject) => { 87 | blobService.deleteBlobIfExists(containerName, blobName, err => { 88 | if (err) { 89 | reject(err); 90 | } else { 91 | resolve({ message: `Block blob '${blobName}' deleted` }); 92 | } 93 | }); 94 | }); 95 | }; 96 | 97 | const deleteContainer = async (containerName) => { 98 | return new Promise((resolve, reject) => { 99 | blobService.deleteContainer(containerName, err => { 100 | if (err) { 101 | reject(err); 102 | } else { 103 | resolve({ message: `Container '${containerName}' deleted` }); 104 | } 105 | }); 106 | }); 107 | }; 108 | 109 | const execute = async () => { 110 | 111 | const containerName = "demo"; 112 | const blobName = "quickstart.txt"; 113 | const content = "hello Blob SDK"; 114 | const localFilePath = "./readme.md"; 115 | let response; 116 | 117 | console.log("Containers:"); 118 | response = await listContainers(); 119 | response.containers.forEach((container) => console.log(` - ${container.name}`)); 120 | 121 | const containerDoesNotExist = response.containers.findIndex((container) => container.name === containerName) === -1; 122 | 123 | if (containerDoesNotExist) { 124 | await createContainer(containerName); 125 | console.log(`Container "${containerName}" is created`); 126 | } 127 | 128 | await uploadString(containerName, blobName, content); 129 | console.log(`Blob "${blobName}" is uploaded`); 130 | 131 | response = await uploadLocalFile(containerName, localFilePath); 132 | console.log(response.message); 133 | 134 | console.log(`Blobs in "${containerName}" container:`); 135 | response = await listBlobs(containerName); 136 | response.blobs.forEach((blob) => console.log(` - ${blob.name}`)); 137 | 138 | response = await downloadBlob(containerName, blobName); 139 | console.log(`Downloaded blob content: ${response.text}"`); 140 | 141 | await deleteBlob(containerName, blobName); 142 | console.log(`Blob "${blobName}" is deleted`); 143 | 144 | await deleteContainer(containerName); 145 | console.log(`Container "${containerName}" is deleted`); 146 | 147 | } 148 | 149 | execute().then(() => console.log("Done")).catch((e) => console.log(e)); 150 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blob-storage-quickstart", 3 | "version": "1.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "ajv": { 8 | "version": "4.11.8", 9 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", 10 | "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", 11 | "requires": { 12 | "co": "4.6.0", 13 | "json-stable-stringify": "1.0.1" 14 | } 15 | }, 16 | "ansi-regex": { 17 | "version": "3.0.0", 18 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 19 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 20 | }, 21 | "asn1": { 22 | "version": "0.2.3", 23 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 24 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 25 | }, 26 | "assert-plus": { 27 | "version": "0.2.0", 28 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", 29 | "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" 30 | }, 31 | "asynckit": { 32 | "version": "0.4.0", 33 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 34 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 35 | }, 36 | "aws-sign2": { 37 | "version": "0.6.0", 38 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", 39 | "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" 40 | }, 41 | "aws4": { 42 | "version": "1.6.0", 43 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", 44 | "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" 45 | }, 46 | "azure-storage": { 47 | "version": "2.8.0", 48 | "resolved": "https://registry.npmjs.org/azure-storage/-/azure-storage-2.8.0.tgz", 49 | "integrity": "sha1-OtDZD0df+SCdZWWvPg7JxWQTBKQ=", 50 | "requires": { 51 | "browserify-mime": "1.2.9", 52 | "extend": "1.2.1", 53 | "json-edm-parser": "0.1.2", 54 | "md5.js": "1.3.4", 55 | "readable-stream": "2.0.6", 56 | "request": "2.81.0", 57 | "underscore": "1.8.3", 58 | "uuid": "3.2.1", 59 | "validator": "3.35.0", 60 | "xml2js": "0.2.8", 61 | "xmlbuilder": "0.4.3" 62 | } 63 | }, 64 | "bcrypt-pbkdf": { 65 | "version": "1.0.1", 66 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 67 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 68 | "optional": true, 69 | "requires": { 70 | "tweetnacl": "0.14.5" 71 | } 72 | }, 73 | "boom": { 74 | "version": "2.10.1", 75 | "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", 76 | "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", 77 | "requires": { 78 | "hoek": "2.16.3" 79 | } 80 | }, 81 | "browserify-mime": { 82 | "version": "1.2.9", 83 | "resolved": "https://registry.npmjs.org/browserify-mime/-/browserify-mime-1.2.9.tgz", 84 | "integrity": "sha1-rrGvKN5sDXpqLOQK22j/GEIq8x8=" 85 | }, 86 | "camelcase": { 87 | "version": "4.1.0", 88 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 89 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 90 | }, 91 | "caseless": { 92 | "version": "0.12.0", 93 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 94 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 95 | }, 96 | "cliui": { 97 | "version": "4.0.0", 98 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", 99 | "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", 100 | "requires": { 101 | "string-width": "2.1.1", 102 | "strip-ansi": "4.0.0", 103 | "wrap-ansi": "2.1.0" 104 | } 105 | }, 106 | "co": { 107 | "version": "4.6.0", 108 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 109 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 110 | }, 111 | "code-point-at": { 112 | "version": "1.1.0", 113 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 114 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 115 | }, 116 | "combined-stream": { 117 | "version": "1.0.5", 118 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", 119 | "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", 120 | "requires": { 121 | "delayed-stream": "1.0.0" 122 | } 123 | }, 124 | "core-util-is": { 125 | "version": "1.0.2", 126 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 127 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 128 | }, 129 | "cross-spawn": { 130 | "version": "5.1.0", 131 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 132 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 133 | "requires": { 134 | "lru-cache": "4.1.1", 135 | "shebang-command": "1.2.0", 136 | "which": "1.3.0" 137 | } 138 | }, 139 | "cryptiles": { 140 | "version": "2.0.5", 141 | "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", 142 | "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", 143 | "requires": { 144 | "boom": "2.10.1" 145 | } 146 | }, 147 | "dashdash": { 148 | "version": "1.14.1", 149 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 150 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 151 | "requires": { 152 | "assert-plus": "1.0.0" 153 | }, 154 | "dependencies": { 155 | "assert-plus": { 156 | "version": "1.0.0", 157 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 158 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 159 | } 160 | } 161 | }, 162 | "decamelize": { 163 | "version": "1.2.0", 164 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 165 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 166 | }, 167 | "delayed-stream": { 168 | "version": "1.0.0", 169 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 170 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 171 | }, 172 | "dotenv": { 173 | "version": "5.0.0", 174 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.0.tgz", 175 | "integrity": "sha512-p4A7snaxI9Hnj3GDWhTpckHYcd9WwZDmGPcvJJV3CoRFq0Dvsp96eYgXBl9WbmbJfuxqiZ2WenNaeWSs675ghQ==" 176 | }, 177 | "ecc-jsbn": { 178 | "version": "0.1.1", 179 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 180 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 181 | "optional": true, 182 | "requires": { 183 | "jsbn": "0.1.1" 184 | } 185 | }, 186 | "execa": { 187 | "version": "0.7.0", 188 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 189 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 190 | "requires": { 191 | "cross-spawn": "5.1.0", 192 | "get-stream": "3.0.0", 193 | "is-stream": "1.1.0", 194 | "npm-run-path": "2.0.2", 195 | "p-finally": "1.0.0", 196 | "signal-exit": "3.0.2", 197 | "strip-eof": "1.0.0" 198 | } 199 | }, 200 | "extend": { 201 | "version": "1.2.1", 202 | "resolved": "https://registry.npmjs.org/extend/-/extend-1.2.1.tgz", 203 | "integrity": "sha1-oPX9bPyDpf5J72mNYOyKYk3UV2w=" 204 | }, 205 | "extsprintf": { 206 | "version": "1.3.0", 207 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 208 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 209 | }, 210 | "find-up": { 211 | "version": "2.1.0", 212 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 213 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 214 | "requires": { 215 | "locate-path": "2.0.0" 216 | } 217 | }, 218 | "forever-agent": { 219 | "version": "0.6.1", 220 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 221 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 222 | }, 223 | "form-data": { 224 | "version": "2.1.4", 225 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", 226 | "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", 227 | "requires": { 228 | "asynckit": "0.4.0", 229 | "combined-stream": "1.0.5", 230 | "mime-types": "2.1.17" 231 | } 232 | }, 233 | "get-caller-file": { 234 | "version": "1.0.2", 235 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 236 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" 237 | }, 238 | "get-stream": { 239 | "version": "3.0.0", 240 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 241 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 242 | }, 243 | "getpass": { 244 | "version": "0.1.7", 245 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 246 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 247 | "requires": { 248 | "assert-plus": "1.0.0" 249 | }, 250 | "dependencies": { 251 | "assert-plus": { 252 | "version": "1.0.0", 253 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 254 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 255 | } 256 | } 257 | }, 258 | "har-schema": { 259 | "version": "1.0.5", 260 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", 261 | "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" 262 | }, 263 | "har-validator": { 264 | "version": "4.2.1", 265 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", 266 | "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", 267 | "requires": { 268 | "ajv": "4.11.8", 269 | "har-schema": "1.0.5" 270 | } 271 | }, 272 | "hash-base": { 273 | "version": "3.0.4", 274 | "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", 275 | "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", 276 | "requires": { 277 | "inherits": "2.0.3", 278 | "safe-buffer": "5.1.1" 279 | } 280 | }, 281 | "hawk": { 282 | "version": "3.1.3", 283 | "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", 284 | "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", 285 | "requires": { 286 | "boom": "2.10.1", 287 | "cryptiles": "2.0.5", 288 | "hoek": "2.16.3", 289 | "sntp": "1.0.9" 290 | } 291 | }, 292 | "hoek": { 293 | "version": "2.16.3", 294 | "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", 295 | "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" 296 | }, 297 | "http-signature": { 298 | "version": "1.1.1", 299 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", 300 | "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", 301 | "requires": { 302 | "assert-plus": "0.2.0", 303 | "jsprim": "1.4.1", 304 | "sshpk": "1.13.1" 305 | } 306 | }, 307 | "inherits": { 308 | "version": "2.0.3", 309 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 310 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 311 | }, 312 | "invert-kv": { 313 | "version": "1.0.0", 314 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 315 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 316 | }, 317 | "is-fullwidth-code-point": { 318 | "version": "2.0.0", 319 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 320 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 321 | }, 322 | "is-stream": { 323 | "version": "1.1.0", 324 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 325 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 326 | }, 327 | "is-typedarray": { 328 | "version": "1.0.0", 329 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 330 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 331 | }, 332 | "isarray": { 333 | "version": "1.0.0", 334 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 335 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 336 | }, 337 | "isexe": { 338 | "version": "2.0.0", 339 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 340 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 341 | }, 342 | "isstream": { 343 | "version": "0.1.2", 344 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 345 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 346 | }, 347 | "jsbn": { 348 | "version": "0.1.1", 349 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 350 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 351 | "optional": true 352 | }, 353 | "json-edm-parser": { 354 | "version": "0.1.2", 355 | "resolved": "https://registry.npmjs.org/json-edm-parser/-/json-edm-parser-0.1.2.tgz", 356 | "integrity": "sha1-HmCw/vG8CvZ7wNFG393lSGzWFbQ=", 357 | "requires": { 358 | "jsonparse": "1.2.0" 359 | } 360 | }, 361 | "json-schema": { 362 | "version": "0.2.3", 363 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 364 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 365 | }, 366 | "json-stable-stringify": { 367 | "version": "1.0.1", 368 | "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", 369 | "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", 370 | "requires": { 371 | "jsonify": "0.0.0" 372 | } 373 | }, 374 | "json-stringify-safe": { 375 | "version": "5.0.1", 376 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 377 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 378 | }, 379 | "jsonify": { 380 | "version": "0.0.0", 381 | "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", 382 | "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" 383 | }, 384 | "jsonparse": { 385 | "version": "1.2.0", 386 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.2.0.tgz", 387 | "integrity": "sha1-XAxWhRBxYOcv50ib3eoLRMK8Z70=" 388 | }, 389 | "jsprim": { 390 | "version": "1.4.1", 391 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 392 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 393 | "requires": { 394 | "assert-plus": "1.0.0", 395 | "extsprintf": "1.3.0", 396 | "json-schema": "0.2.3", 397 | "verror": "1.10.0" 398 | }, 399 | "dependencies": { 400 | "assert-plus": { 401 | "version": "1.0.0", 402 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 403 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 404 | } 405 | } 406 | }, 407 | "lcid": { 408 | "version": "1.0.0", 409 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 410 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 411 | "requires": { 412 | "invert-kv": "1.0.0" 413 | } 414 | }, 415 | "locate-path": { 416 | "version": "2.0.0", 417 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 418 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 419 | "requires": { 420 | "p-locate": "2.0.0", 421 | "path-exists": "3.0.0" 422 | } 423 | }, 424 | "lru-cache": { 425 | "version": "4.1.1", 426 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", 427 | "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", 428 | "requires": { 429 | "pseudomap": "1.0.2", 430 | "yallist": "2.1.2" 431 | } 432 | }, 433 | "md5.js": { 434 | "version": "1.3.4", 435 | "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", 436 | "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", 437 | "requires": { 438 | "hash-base": "3.0.4", 439 | "inherits": "2.0.3" 440 | } 441 | }, 442 | "mem": { 443 | "version": "1.1.0", 444 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", 445 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", 446 | "requires": { 447 | "mimic-fn": "1.2.0" 448 | } 449 | }, 450 | "mime-db": { 451 | "version": "1.30.0", 452 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", 453 | "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" 454 | }, 455 | "mime-types": { 456 | "version": "2.1.17", 457 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", 458 | "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", 459 | "requires": { 460 | "mime-db": "1.30.0" 461 | } 462 | }, 463 | "mimic-fn": { 464 | "version": "1.2.0", 465 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 466 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 467 | }, 468 | "npm-run-path": { 469 | "version": "2.0.2", 470 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 471 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 472 | "requires": { 473 | "path-key": "2.0.1" 474 | } 475 | }, 476 | "number-is-nan": { 477 | "version": "1.0.1", 478 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 479 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 480 | }, 481 | "oauth-sign": { 482 | "version": "0.8.2", 483 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 484 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 485 | }, 486 | "os-locale": { 487 | "version": "2.1.0", 488 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", 489 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", 490 | "requires": { 491 | "execa": "0.7.0", 492 | "lcid": "1.0.0", 493 | "mem": "1.1.0" 494 | } 495 | }, 496 | "p-finally": { 497 | "version": "1.0.0", 498 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 499 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 500 | }, 501 | "p-limit": { 502 | "version": "1.2.0", 503 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 504 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 505 | "requires": { 506 | "p-try": "1.0.0" 507 | } 508 | }, 509 | "p-locate": { 510 | "version": "2.0.0", 511 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 512 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 513 | "requires": { 514 | "p-limit": "1.2.0" 515 | } 516 | }, 517 | "p-try": { 518 | "version": "1.0.0", 519 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 520 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 521 | }, 522 | "path-exists": { 523 | "version": "3.0.0", 524 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 525 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 526 | }, 527 | "path-key": { 528 | "version": "2.0.1", 529 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 530 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 531 | }, 532 | "performance-now": { 533 | "version": "0.2.0", 534 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", 535 | "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" 536 | }, 537 | "process-nextick-args": { 538 | "version": "1.0.7", 539 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 540 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 541 | }, 542 | "pseudomap": { 543 | "version": "1.0.2", 544 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 545 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 546 | }, 547 | "punycode": { 548 | "version": "1.4.1", 549 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 550 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 551 | }, 552 | "qs": { 553 | "version": "6.4.0", 554 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", 555 | "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" 556 | }, 557 | "readable-stream": { 558 | "version": "2.0.6", 559 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", 560 | "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", 561 | "requires": { 562 | "core-util-is": "1.0.2", 563 | "inherits": "2.0.3", 564 | "isarray": "1.0.0", 565 | "process-nextick-args": "1.0.7", 566 | "string_decoder": "0.10.31", 567 | "util-deprecate": "1.0.2" 568 | } 569 | }, 570 | "request": { 571 | "version": "2.81.0", 572 | "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", 573 | "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", 574 | "requires": { 575 | "aws-sign2": "0.6.0", 576 | "aws4": "1.6.0", 577 | "caseless": "0.12.0", 578 | "combined-stream": "1.0.5", 579 | "extend": "3.0.1", 580 | "forever-agent": "0.6.1", 581 | "form-data": "2.1.4", 582 | "har-validator": "4.2.1", 583 | "hawk": "3.1.3", 584 | "http-signature": "1.1.1", 585 | "is-typedarray": "1.0.0", 586 | "isstream": "0.1.2", 587 | "json-stringify-safe": "5.0.1", 588 | "mime-types": "2.1.17", 589 | "oauth-sign": "0.8.2", 590 | "performance-now": "0.2.0", 591 | "qs": "6.4.0", 592 | "safe-buffer": "5.1.1", 593 | "stringstream": "0.0.5", 594 | "tough-cookie": "2.3.3", 595 | "tunnel-agent": "0.6.0", 596 | "uuid": "3.2.1" 597 | }, 598 | "dependencies": { 599 | "extend": { 600 | "version": "3.0.1", 601 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 602 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 603 | } 604 | } 605 | }, 606 | "require-directory": { 607 | "version": "2.1.1", 608 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 609 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 610 | }, 611 | "require-main-filename": { 612 | "version": "1.0.1", 613 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 614 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 615 | }, 616 | "safe-buffer": { 617 | "version": "5.1.1", 618 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 619 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 620 | }, 621 | "sax": { 622 | "version": "0.5.8", 623 | "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", 624 | "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" 625 | }, 626 | "set-blocking": { 627 | "version": "2.0.0", 628 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 629 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 630 | }, 631 | "shebang-command": { 632 | "version": "1.2.0", 633 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 634 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 635 | "requires": { 636 | "shebang-regex": "1.0.0" 637 | } 638 | }, 639 | "shebang-regex": { 640 | "version": "1.0.0", 641 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 642 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 643 | }, 644 | "signal-exit": { 645 | "version": "3.0.2", 646 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 647 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 648 | }, 649 | "sntp": { 650 | "version": "1.0.9", 651 | "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", 652 | "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", 653 | "requires": { 654 | "hoek": "2.16.3" 655 | } 656 | }, 657 | "sshpk": { 658 | "version": "1.13.1", 659 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", 660 | "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", 661 | "requires": { 662 | "asn1": "0.2.3", 663 | "assert-plus": "1.0.0", 664 | "bcrypt-pbkdf": "1.0.1", 665 | "dashdash": "1.14.1", 666 | "ecc-jsbn": "0.1.1", 667 | "getpass": "0.1.7", 668 | "jsbn": "0.1.1", 669 | "tweetnacl": "0.14.5" 670 | }, 671 | "dependencies": { 672 | "assert-plus": { 673 | "version": "1.0.0", 674 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 675 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 676 | } 677 | } 678 | }, 679 | "string-width": { 680 | "version": "2.1.1", 681 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 682 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 683 | "requires": { 684 | "is-fullwidth-code-point": "2.0.0", 685 | "strip-ansi": "4.0.0" 686 | } 687 | }, 688 | "string_decoder": { 689 | "version": "0.10.31", 690 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", 691 | "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" 692 | }, 693 | "stringstream": { 694 | "version": "0.0.5", 695 | "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", 696 | "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" 697 | }, 698 | "strip-ansi": { 699 | "version": "4.0.0", 700 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 701 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 702 | "requires": { 703 | "ansi-regex": "3.0.0" 704 | } 705 | }, 706 | "strip-eof": { 707 | "version": "1.0.0", 708 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 709 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 710 | }, 711 | "tough-cookie": { 712 | "version": "2.3.3", 713 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", 714 | "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", 715 | "requires": { 716 | "punycode": "1.4.1" 717 | } 718 | }, 719 | "tunnel-agent": { 720 | "version": "0.6.0", 721 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 722 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 723 | "requires": { 724 | "safe-buffer": "5.1.1" 725 | } 726 | }, 727 | "tweetnacl": { 728 | "version": "0.14.5", 729 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 730 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 731 | "optional": true 732 | }, 733 | "underscore": { 734 | "version": "1.8.3", 735 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", 736 | "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" 737 | }, 738 | "util-deprecate": { 739 | "version": "1.0.2", 740 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 741 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 742 | }, 743 | "uuid": { 744 | "version": "3.2.1", 745 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 746 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 747 | }, 748 | "validator": { 749 | "version": "3.35.0", 750 | "resolved": "https://registry.npmjs.org/validator/-/validator-3.35.0.tgz", 751 | "integrity": "sha1-PwcklALB/I/Ak8MsbkPXKnnModw=" 752 | }, 753 | "verror": { 754 | "version": "1.10.0", 755 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 756 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 757 | "requires": { 758 | "assert-plus": "1.0.0", 759 | "core-util-is": "1.0.2", 760 | "extsprintf": "1.3.0" 761 | }, 762 | "dependencies": { 763 | "assert-plus": { 764 | "version": "1.0.0", 765 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 766 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 767 | } 768 | } 769 | }, 770 | "which": { 771 | "version": "1.3.0", 772 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 773 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 774 | "requires": { 775 | "isexe": "2.0.0" 776 | } 777 | }, 778 | "which-module": { 779 | "version": "2.0.0", 780 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 781 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 782 | }, 783 | "wrap-ansi": { 784 | "version": "2.1.0", 785 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 786 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 787 | "requires": { 788 | "string-width": "1.0.2", 789 | "strip-ansi": "3.0.1" 790 | }, 791 | "dependencies": { 792 | "ansi-regex": { 793 | "version": "2.1.1", 794 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 795 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 796 | }, 797 | "is-fullwidth-code-point": { 798 | "version": "1.0.0", 799 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 800 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 801 | "requires": { 802 | "number-is-nan": "1.0.1" 803 | } 804 | }, 805 | "string-width": { 806 | "version": "1.0.2", 807 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 808 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 809 | "requires": { 810 | "code-point-at": "1.1.0", 811 | "is-fullwidth-code-point": "1.0.0", 812 | "strip-ansi": "3.0.1" 813 | } 814 | }, 815 | "strip-ansi": { 816 | "version": "3.0.1", 817 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 818 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 819 | "requires": { 820 | "ansi-regex": "2.1.1" 821 | } 822 | } 823 | } 824 | }, 825 | "xml2js": { 826 | "version": "0.2.8", 827 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", 828 | "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", 829 | "requires": { 830 | "sax": "0.5.8" 831 | } 832 | }, 833 | "xmlbuilder": { 834 | "version": "0.4.3", 835 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-0.4.3.tgz", 836 | "integrity": "sha1-xGFLp04K0ZbmCcknLNnh3bKKilg=" 837 | }, 838 | "y18n": { 839 | "version": "3.2.1", 840 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 841 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 842 | }, 843 | "yallist": { 844 | "version": "2.1.2", 845 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 846 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 847 | }, 848 | "yargs": { 849 | "version": "11.0.0", 850 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", 851 | "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", 852 | "requires": { 853 | "cliui": "4.0.0", 854 | "decamelize": "1.2.0", 855 | "find-up": "2.1.0", 856 | "get-caller-file": "1.0.2", 857 | "os-locale": "2.1.0", 858 | "require-directory": "2.1.1", 859 | "require-main-filename": "1.0.1", 860 | "set-blocking": "2.0.0", 861 | "string-width": "2.1.1", 862 | "which-module": "2.0.0", 863 | "y18n": "3.2.1", 864 | "yargs-parser": "9.0.2" 865 | } 866 | }, 867 | "yargs-parser": { 868 | "version": "9.0.2", 869 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", 870 | "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", 871 | "requires": { 872 | "camelcase": "4.1.0" 873 | } 874 | } 875 | } 876 | } 877 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "blob-storage-quickstart", 3 | "version": "1.1.0", 4 | "description": "Learn to use Node.js to upload, download, list and delete block blobs in a container in Azure Blob storage", 5 | "main": "index.js", 6 | "dependencies": { 7 | "azure-storage": "^2.8.0", 8 | "dotenv": "^5.0.0", 9 | "yargs": "^11.0.0" 10 | }, 11 | "devDependencies": {}, 12 | "scripts": { 13 | "start": "node index.js" 14 | }, 15 | "repository": { 16 | "type": "git", 17 | "url": "git+https://github.com/Azure-Samples/storage-blobs-node-quickstart.git" 18 | }, 19 | "keywords": [ 20 | "Azure", 21 | "Storage", 22 | "Quick", 23 | "Start", 24 | "Blob", 25 | "BlockBlob", 26 | "Upload", 27 | "Download", 28 | "Container", 29 | "List" 30 | ], 31 | "author": "Microsoft", 32 | "license": "MIT", 33 | "bugs": { 34 | "url": "https://github.com/Azure-Samples/storage-blobs-node-quickstart/issues" 35 | }, 36 | "homepage": "https://github.com/Azure-Samples/storage-blobs-node-quickstart#readme" 37 | } 38 | --------------------------------------------------------------------------------