├── .github ├── ISSUE_TEMPLATE └── PULL_REQUEST_TEMPLATE ├── .gitignore ├── .npmignore ├── LICENSE ├── README.md ├── artificialInteligence └── autoML.js ├── compute └── google.js ├── database └── google-datastore.js ├── gcp.js ├── helpers.js ├── index.js ├── network └── google-dns.js ├── package-lock.json ├── package.json ├── storage ├── google-compute.js └── google-storage.js └── test ├── .nc.config.js ├── compute └── compute-engine.js ├── database └── data-store.js ├── gcp-mock.js ├── network └── DNS.js └── storage ├── cloud-storage.js └── object-storage.js /.github/ISSUE_TEMPLATE: -------------------------------------------------------------------------------- 1 | ## Expected Behavior 2 | 3 | 4 | ## Actual Behavior 5 | 6 | 7 | ## Steps to Reproduce the Problem 8 | 9 | 1. 10 | 1. 11 | 1. 12 | 13 | ## Specifications 14 | 15 | - Version: 16 | - Platform: 17 | - Subsystem: 18 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE: -------------------------------------------------------------------------------- 1 | Fixes # 2 | 3 | ## Proposed Changes 4 | 5 | - 6 | - 7 | - 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | 11 | # Directory for instrumented libs generated by jscoverage/JSCover 12 | lib-cov 13 | 14 | # Coverage directory used by tools like istanbul 15 | coverage 16 | 17 | # nyc test coverage 18 | .nyc_output 19 | 20 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 21 | .grunt 22 | 23 | # node-waf configuration 24 | .lock-wscript 25 | 26 | # Compiled binary addons (http://nodejs.org/api/addons.html) 27 | build/Release 28 | 29 | # Dependency directories 30 | node_modules 31 | jspm_packages 32 | 33 | # Optional npm cache directory 34 | .npm 35 | 36 | # Optional REPL history 37 | .node_repl_history 38 | 39 | # code coverage 40 | coverage 41 | # .coveralls.yml didn't see it in master branch 42 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | .git 2 | test 3 | .npmrc 4 | .DS_Store 5 | .*.swp 6 | npm-debug.log -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Cloudlibz 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. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # nodecloud-gcp-plugin 2 | Google Cloud plugin for [nodecloud](https://github.com/cloudlibz/nodecloud) 3 | 4 | ## 🚀 Install 5 | 6 | ``` 7 | $ npm install nodecloud-gcp-plugin 8 | OR 9 | $ yarn add nodecloud-gcp-plugin 10 | ``` 11 | 12 | ## ✌️ How to setup 13 | 14 | - Download keyFile from GCP console 15 | - Set environment variables 16 | 17 | ``` 18 | GCLOUD_PROJECT='nodecloud-demo', 19 | GCLOUD_KEY_FILE_NAME='xxxxxxxxxxx' 20 | ``` 21 | 22 | Use same key names as they are used in this plugin implementation. 23 | 24 | Make sure you have `.nc.config` file in the project root and have `nodecloud-core` installed. 25 | 26 | Content of `.nc.config` file is assumed as the following json structure. 27 | It is an array of supported providers. 28 | 29 | 1. `name` : Provider name which nodecloud supports. 30 | 2. `tag` : Name that you will use to load the given provider. It is for your reference in code. It can be anything that you may like. 31 | 3. `libName` : Library name which has to be installed before loading a provider. 32 | 33 | Config file can contain array of objects for all providers and all will be loaded. 34 | Supported values for `name` : azure, google, aws 35 | 36 | ```js 37 | const providers = [ 38 | { 39 | name: 'google', 40 | tag: 'google', 41 | libName: 'nodecloud-gcp-plugin', 42 | configFile: { 43 | projectId: "YOUR_GCLOUD_PROJECT_ID", 44 | keyFilename: "ABSOLUTE_PATH_TO_SERVICE_KEY" 45 | } 46 | }, 47 | // other providers might be included here 48 | ] 49 | 50 | module.exports = providers; 51 | ``` 52 | 53 | Here is how to obtain a service [key](https://cloud.google.com/iam/docs/creating-managing-service-account-keys). 54 | 55 | Remember that you need to give this service account appropiate roles! 56 | 57 | ## 💻 Development 58 | 59 | ``` 60 | $ git clone https://github.com/cloudliz/nodecloud-gcp-plugin 61 | $ cd nodecloud-gcp-plugin 62 | $ npm link 63 | $ cd .. && mkdir nodecloud-dev && cd nodecloud-dev 64 | $ npm link nodecloud-gcp-plugin 65 | $ cd .. && git clone https://github.com/cloudliz/nodecloud 66 | $ cd nodecloud 67 | $ npm link 68 | $ cd nodecloud-dev 69 | $ npm link nodecloud 70 | ``` 71 | -------------------------------------------------------------------------------- /artificialInteligence/autoML.js: -------------------------------------------------------------------------------- 1 | class AutoML { 2 | /** 3 | * AutoML constructor 4 | * @constructor 5 | * @param {object} googleCloudSDK - google cloud SDK 6 | * @param {object} config - { projectId, keyFilename } 7 | */ 8 | constructor(google, config) { 9 | this._google = google; 10 | this.autoMlClient = new this._google.autoML(config); 11 | this.autoMlBetaClient = new this._google.autoMLBeta(config); 12 | this.config = config; 13 | } 14 | 15 | createDataset(params) { 16 | const request = { 17 | parent: this.autoMlBetaClient.locationPath(this.config.projectId, params.location), 18 | dataset: { 19 | displayName: params.name, 20 | tablesDatasetMetadata: {} 21 | } 22 | }; 23 | 24 | return new Promise((resolve, reject) => { 25 | this.autoMlBetaClient.createDataset(request, (error, data) => { 26 | if (error) { 27 | reject(error); 28 | } else { 29 | resolve(data); 30 | } 31 | }); 32 | }); 33 | } 34 | 35 | getDataset(params) { 36 | const request = { 37 | name: this.autoMlClient.datasetPath(this.config.projectId, params.location, params.datasetId), 38 | }; 39 | 40 | return new Promise((resolve, reject) => { 41 | this.autoMlClient.getDataset(request, (error, data) => { 42 | if (error) { 43 | reject(error); 44 | } else { 45 | resolve(data); 46 | } 47 | }); 48 | }); 49 | } 50 | 51 | importDataSet(params) { 52 | const request = { 53 | name: this.autoMlClient.datasetPath(this.config.projectId, params.targetDataset.location, params.targetDataset.id), 54 | inputConfig: { 55 | gcsSource: { 56 | inputUris: params.source 57 | } 58 | } 59 | }; 60 | 61 | return new Promise((resolve, reject) => { 62 | this.autoMlClient.importData(request).then((responses) => { 63 | const operation = responses[0]; 64 | console.log('Processing import...'); 65 | return operation.promise(); 66 | }).then(result => { 67 | resolve(result); 68 | }, (error) => { 69 | reject(error); 70 | }); 71 | }); 72 | } 73 | 74 | listModels(params) { 75 | const request = { 76 | parent: this.autoMlClient.locationPath(this.config.projectId, params.location) 77 | }; 78 | 79 | return new Promise((resolve, reject) => { 80 | this.autoMlClient.listModels(request, (error, data) => { 81 | if (error) { 82 | reject(error); 83 | } else { 84 | resolve(data); 85 | } 86 | }); 87 | }); 88 | } 89 | 90 | createModel(params) { 91 | const columnSpecId = this.autoMlBetaClient.columnSpecPath( 92 | this.config.projectId, 93 | params.location, 94 | params.datasetId, 95 | params.tableId, 96 | params.columnId 97 | ); 98 | 99 | const tablesModelMetadata = { 100 | targetColumnSpec: { name: columnSpecId }, 101 | trainBudgetMilliNodeHours: params.trainBudget 102 | }; 103 | 104 | const modelDetails = { 105 | parent: this.autoMlBetaClient.locationPath(this.config.projectId, params.location), 106 | model: { 107 | datasetId: params.datasetId, 108 | displayName: params.modelName, 109 | tablesModelMetadata: tablesModelMetadata 110 | } 111 | }; 112 | 113 | return new Promise((resolve, reject) => { 114 | this.autoMlBetaClient.createModel(modelDetails, (error, data) => { 115 | if (error) { 116 | reject(error); 117 | } else { 118 | resolve(data); 119 | } 120 | }); 121 | }); 122 | } 123 | 124 | deployModel(params) { 125 | const request = { 126 | name: this.autoMlClient.modelPath(this.config.projectId, params.location, params.modelId) 127 | } 128 | 129 | return new Promise((resolve, reject) => { 130 | this.autoMlClient.deployModel(request).then((responses) => { 131 | const operation = responses[0]; 132 | console.log('Deploying model....'); 133 | return operation.promise(); 134 | }).then((result) => { 135 | resolve(result); 136 | }, (error) => { 137 | reject(error); 138 | }); 139 | }); 140 | } 141 | 142 | undeployModel(params) { 143 | const request = { 144 | name: this.autoMlClient.modelPath(this.config.projectId, params.location, params.modelId) 145 | } 146 | 147 | return new Promise((resolve, reject) => { 148 | this.autoMlClient.undeployModel(request).then((responses) => { 149 | const operation = responses[0]; 150 | console.log('Undeploying model....'); 151 | return operation.promise(); 152 | }).then((result) => { 153 | resolve(result); 154 | }, (error) => { 155 | reject(error); 156 | }); 157 | }); 158 | } 159 | 160 | getModel(params) { 161 | const request = { 162 | name: this.autoMlClient.modelPath(this.config.projectId, params.location, params.modelId) 163 | } 164 | 165 | return new Promise((resolve, reject) => { 166 | this.autoMlClient.getModel(request, (error, data) => { 167 | if (error) { 168 | reject(error); 169 | } else { 170 | resolve(data); 171 | } 172 | }); 173 | }); 174 | } 175 | 176 | exportDataset(params) { 177 | const request = { 178 | name: this.autoMlClient.datasetPath(this.config.projectId, params.location, params.datasetId), 179 | outputConfig: { 180 | gcsDestination: { 181 | outputUriPrefix: params.gcsUri 182 | } 183 | } 184 | }; 185 | 186 | return new Promise((resolve, reject) => { 187 | this.autoMlClient.exportData(request).then((responses) => { 188 | const operations = responses[0]; 189 | console.log('Exporting Data...'); 190 | return operations.promise(); 191 | }).then((result) => { 192 | resolve(result); 193 | }, (error) => { 194 | reject(error); 195 | }); 196 | }); 197 | } 198 | 199 | deleteModel(params) { 200 | const request = { 201 | name: this.autoMlClient.modelPath(this.config.projectId, params.location, params.modelId) 202 | }; 203 | 204 | return new Promise((resolve, reject) => { 205 | this.autoMlClient.deleteModel(request, (error, data) => { 206 | if (error) { 207 | return reject(error); 208 | } else { 209 | return resolve(data); 210 | } 211 | }); 212 | }); 213 | } 214 | 215 | deleteDataset(params) { 216 | const request = { 217 | name: this.autoMlClient.datasetPath(this.config.projectId, params.location, params.datasetId) 218 | }; 219 | 220 | return new Promise((resolve, reject) => { 221 | this.autoMlClient.deleteDataset(request).then((responses) => { 222 | const operations = responses[0]; 223 | console.log('Deleting Data...'); 224 | return operations.promise(); 225 | }).then((result) => { 226 | resolve(result); 227 | }, (error) => { 228 | reject(error); 229 | }); 230 | }); 231 | } 232 | } 233 | 234 | module.exports = AutoML; -------------------------------------------------------------------------------- /compute/google.js: -------------------------------------------------------------------------------- 1 | const { checkParams } = require('../helpers'); 2 | 3 | class GoogleCompute { 4 | /** 5 | * GoogleCompute constructor 6 | * @constructor 7 | * @param {object} gogole - google SDK 8 | * @param {object} config - { projectId, keyFilename } 9 | */ 10 | constructor(google, config) { 11 | this._google = google; 12 | this._gce = new this._google.compute(this._google._config); 13 | } 14 | /** 15 | * Create Google VM 16 | * @create 17 | * @param {object} params 18 | */ 19 | create(params) { 20 | checkParams(params); 21 | // Create zone 22 | const zone = this._gce.zone(params.zone); 23 | const { name } = params; 24 | // create GCP VM 25 | return new Promise((resolve, reject) => { 26 | zone.createVM(name, { os: params.os }, (err, vm, operation) => { 27 | if (err) { reject(err); return; } 28 | operation 29 | .on('error', (error) => { 30 | reject(error); 31 | }) 32 | .on('running', (metadata) => { 33 | resolve(metadata); 34 | }) 35 | .on('complete', (metadata) => { 36 | resolve(metadata); 37 | }); 38 | }); 39 | }); 40 | } 41 | /** 42 | * Describes one or more of your instances 43 | * @list 44 | * @param {object} params 45 | */ 46 | list(params) { 47 | checkParams(params); 48 | 49 | return this._gce.getVMs(params); 50 | } 51 | /** 52 | * Start VM 53 | * @start 54 | * @param {object} params 55 | */ 56 | start(params) { 57 | checkParams(params); 58 | 59 | // initialize zone, vm name 60 | const zone = this._gce.zone(params.zone); 61 | const vm = zone.vm(params.vmName); 62 | // start VM 63 | return vm.start(); 64 | } 65 | /** 66 | * Stop VM 67 | * @stop 68 | * @param {object} params 69 | */ 70 | stop(params) { 71 | checkParams(params); 72 | 73 | // initialize zone, vm name 74 | const zone = this._gce.zone(params.zone); 75 | const vm = zone.vm(params.vmName); 76 | // stop VM 77 | return vm.stop(); 78 | } 79 | /** 80 | * Reboot instance 81 | * @reboot 82 | * @param {object} params 83 | */ 84 | reboot(params) { 85 | checkParams(params); 86 | 87 | // reboot VM 88 | return this.stop(params) 89 | .then(res => this.start(params)) 90 | .catch(err => err); 91 | } 92 | /** 93 | * Terminate instance 94 | * @destory 95 | * @param {object} params 96 | */ 97 | destroy(params) { 98 | checkParams(params); 99 | 100 | // initialize zone, vm name 101 | const zone = this._gce.zone(params.zone); 102 | const vm = zone.vm(params.vmName); 103 | // delete VM 104 | return vm.delete(); 105 | } 106 | } 107 | 108 | module.exports = GoogleCompute; 109 | -------------------------------------------------------------------------------- /database/google-datastore.js: -------------------------------------------------------------------------------- 1 | class GCD { 2 | /** 3 | * GCD constructor 4 | * @constructor 5 | * @param {object} google - google SDK 6 | */ 7 | constructor(google) { 8 | this._google = google; 9 | this._gcd = new this._google.datastore(this._google._config); 10 | } 11 | /** 12 | * Create item 13 | * @createItem 14 | * @param {object} params 15 | */ 16 | createItem(params) { 17 | const key = this._gcd.key([params.key]); 18 | const { data } = params; 19 | 20 | // create record / item 21 | return this._gcd.save({ 22 | key, 23 | data, 24 | }); 25 | } 26 | /** 27 | * Delete item 28 | * @deleteItem 29 | * @param {object} params 30 | */ 31 | deleteItem(params) { 32 | const key = this._gcd.key(params.key); 33 | 34 | // delete record / item 35 | return this._gcd.delete(key); 36 | } 37 | /** 38 | * Update item 39 | * @updateItem 40 | * @param {object} params 41 | */ 42 | updateItem(params) { 43 | const key = this._gcd.key(params.key); 44 | const { data } = params; 45 | 46 | // update record / item 47 | return this._gcd.save({ 48 | key, 49 | data, 50 | }); 51 | } 52 | /** 53 | * Get query object 54 | * @getQuery 55 | * @param {object} params 56 | */ 57 | getQuery(params) { 58 | return this._gcd.createQuery(params.key); 59 | } 60 | /** 61 | * Query 62 | * @query 63 | * @param {object} params 64 | */ 65 | query(params) { 66 | const { query } = params; 67 | // run query 68 | return this._gcd.runQuery(query); 69 | } 70 | } 71 | 72 | module.exports = GCD; 73 | -------------------------------------------------------------------------------- /gcp.js: -------------------------------------------------------------------------------- 1 | const googleCompute = require("./compute/google"); 2 | const googleStorage = require("./storage/google-compute"); 3 | const googleStorageBucket = require("./storage/google-storage"); 4 | const googleDNS = require("./network/google-dns"); 5 | const googleDatastore = require("./database/google-datastore"); 6 | const googleAutoML = require("./artificialInteligence/autoML"); 7 | 8 | class Google { 9 | /** 10 | * Expose GCP/Google APIs 11 | * @constructor 12 | */ 13 | constructor(config, googleSDK) { 14 | this._googleSDK = googleSDK; 15 | this._config = config; 16 | 17 | if (!config.projectId && config.keyFilename) { 18 | throw new Error( 19 | "Provide parameters i.e: projectId, keyFilename" 20 | ); 21 | } 22 | 23 | return { 24 | getSDK: () => this._googleSDK, 25 | getConfig: () => this._config, 26 | compute: this.googleCompute, 27 | storage: this.googleStorage, 28 | bucket: this.googleStorageBucket, 29 | dns: this.googleDNS, 30 | nosql: this.googleDatastore, 31 | autoML: this.googleAutoML 32 | }; 33 | } 34 | 35 | /** 36 | * GCP compute Wrapper 37 | * @googleCompute 38 | * @param {object} params - { apiVersion } 39 | */ 40 | googleCompute(params) { 41 | return new googleCompute(this.getSDK(), this._config); 42 | } 43 | 44 | /** 45 | * GCP storage Wrapper 46 | * @googleCompute 47 | * @param {object} params - { apiVersion } 48 | */ 49 | googleStorage(params) { 50 | return new googleStorage(this.getSDK(), this._config); 51 | } 52 | 53 | /** 54 | * GCP storage bucket Wrapper 55 | * @googleStorageBucket 56 | * @param {object} params - { apiVersion } 57 | */ 58 | googleStorageBucket(params) { 59 | if (params === undefined) { 60 | return new googleStorageBucket(this.getSDK(), this._config); 61 | } 62 | return new googleStorageBucket( 63 | this.getSDK(), 64 | this._config, 65 | params.bucketName 66 | ); 67 | } 68 | 69 | /** 70 | * GCP DNS wrapper 71 | * @googleDNS 72 | * @param {object} params - { apiVersion } 73 | */ 74 | 75 | googleDNS(params) { 76 | if (params === undefined) { 77 | return new googleDNS(this.getSDK(), this._config); 78 | } 79 | return new googleDNS(this.getSDK(), this._config); 80 | } 81 | 82 | /** 83 | * GCP Datastore wrapper 84 | * @googleDatastore 85 | * @param {object} params - { apiVersion } 86 | */ 87 | googleDatastore(params) { 88 | return new googleDatastore(this.getSDK()); 89 | } 90 | 91 | /** 92 | * GCP autoML Wrapper 93 | * @googleAutoML 94 | * @param {object} params - { apiVersion } 95 | */ 96 | googleAutoML() { 97 | return new googleAutoML(this.getSDK(), this.getConfig()); 98 | } 99 | } 100 | 101 | module.exports = Google; 102 | -------------------------------------------------------------------------------- /helpers.js: -------------------------------------------------------------------------------- 1 | function checkParams(params, docsLink) { 2 | if (!params) { 3 | if (docsLink) { 4 | throw new Error(`Provide options ${docsLink}`); 5 | } 6 | throw new Error('Provide options'); 7 | } 8 | return true; 9 | } 10 | 11 | module.exports = { 12 | checkParams 13 | }; 14 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const compute = require("@google-cloud/compute"); 2 | const { datastore } = require("@google-cloud/datastore"); 3 | const { dns } = require("@google-cloud/dns"); 4 | const { storage } = require("@google-cloud/storage"); 5 | const { AutoMlClient } = require('@google-cloud/automl').v1; 6 | const autoMLBetaClient = require('@google-cloud/automl').v1beta1.AutoMlClient; 7 | 8 | const gcpPlugin = require("./gcp"); 9 | 10 | const googleCloudSDK = { 11 | compute: compute, 12 | datastore: datastore, 13 | dns: dns, 14 | storage: storage, 15 | autoML: AutoMlClient, 16 | autoMLBeta: autoMLBetaClient 17 | } 18 | 19 | const ncGcpPlugin = (options) => { 20 | return new gcpPlugin(options, googleCloudSDK); 21 | } 22 | 23 | module.exports = ncGcpPlugin; 24 | -------------------------------------------------------------------------------- /network/google-dns.js: -------------------------------------------------------------------------------- 1 | const helpers = require('../helpers'); 2 | const { checkParams } = helpers; 3 | 4 | class GooogleDNS { 5 | /** 6 | * GoogleDNS constructor 7 | * @constructor 8 | * @param {object} gogole - google SDK 9 | * @param {object} config - { projectId, keyFilename } 10 | */ 11 | constructor(google, config) { 12 | this._google = google; 13 | this._dns = new this._google.dns(this._google._config); 14 | } 15 | /** 16 | * Create a managed zone 17 | * @createZone 18 | * @param {object} params 19 | */ 20 | createZone(params) { 21 | checkParams(params); 22 | // create a zone 23 | return this._dns.createZone(params.zoneName, params.config); 24 | } 25 | /** 26 | * Delete zone 27 | * @deleteZone 28 | * @param {object} params 29 | */ 30 | deleteZone(params) { 31 | checkParams(params); 32 | // delete zone 33 | const zone = this._dns.zone(params); 34 | return zone.delete(); 35 | } 36 | /** 37 | * List zones 38 | * @listZones 39 | * @param {object} params 40 | */ 41 | listZones() { 42 | // list zones 43 | return this._dns.getZones(); 44 | } 45 | /** 46 | * Get record 47 | * @record 48 | * @param {object} params 49 | */ 50 | record(params) { 51 | this.checkParams(params); 52 | // return record object 53 | return zone.record(params.name, params.data); 54 | } 55 | 56 | /** 57 | * Change resource records 58 | * API DOCS [https://googlecloudplatform.github.io/google-cloud-node/#/docs/google-cloud/0.56.0/dns/record] 59 | * @changeRecordSets 60 | * @param {object} params 61 | */ 62 | changeRecordSets(params) { 63 | checkParams(params); 64 | // chage records 65 | const zone = this._dns.zone(params.zoneId); 66 | if (params.action === 'CREATE') { 67 | return zone.record(params.record, params.data); 68 | } else if (params.action === 'DELETE') { 69 | return zone.createChange({ delete: params.record }); 70 | } 71 | } 72 | } 73 | 74 | module.exports = GooogleDNS; 75 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodecloud-gcp", 3 | "version": "1.1.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@google-cloud/automl": { 8 | "version": "2.0.0", 9 | "resolved": "https://registry.npmjs.org/@google-cloud/automl/-/automl-2.0.0.tgz", 10 | "integrity": "sha512-xU07ShkWUflzWezvP+XXGAbjoMncWkHhYGVRR5wg4ZBdqBW1ejSXDYpLTUoWU6TJ8UilTxcuDZznNiIHVRlrkw==", 11 | "requires": { 12 | "google-gax": "^2.0.1" 13 | }, 14 | "dependencies": { 15 | "@grpc/grpc-js": { 16 | "version": "1.0.3", 17 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.3.tgz", 18 | "integrity": "sha512-JKV3f5Bv2TZxK6eJSB9EarsZrnLxrvcFNwI9goq0YRXa3S6NNoCSnI3cG3lkXVIJ03Wng1WXe76kc2JQtRe7AQ==", 19 | "requires": { 20 | "semver": "^6.2.0" 21 | } 22 | }, 23 | "@types/node": { 24 | "version": "13.13.5", 25 | "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.5.tgz", 26 | "integrity": "sha512-3ySmiBYJPqgjiHA7oEaIo2Rzz0HrOZ7yrNO5HWyaE5q0lQ3BppDZ3N53Miz8bw2I7gh1/zir2MGVZBvpb1zq9g==" 27 | }, 28 | "agent-base": { 29 | "version": "6.0.0", 30 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.0.tgz", 31 | "integrity": "sha512-j1Q7cSCqN+AwrmDd+pzgqc0/NpC655x2bUf5ZjRIO77DcNBFmh+OgRNzF6OKdCC9RSCb19fGd99+bhXFdkRNqw==", 32 | "requires": { 33 | "debug": "4" 34 | } 35 | }, 36 | "debug": { 37 | "version": "4.1.1", 38 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 39 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 40 | "requires": { 41 | "ms": "^2.1.1" 42 | } 43 | }, 44 | "gaxios": { 45 | "version": "3.0.3", 46 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz", 47 | "integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==", 48 | "requires": { 49 | "abort-controller": "^3.0.0", 50 | "extend": "^3.0.2", 51 | "https-proxy-agent": "^5.0.0", 52 | "is-stream": "^2.0.0", 53 | "node-fetch": "^2.3.0" 54 | } 55 | }, 56 | "gcp-metadata": { 57 | "version": "4.1.0", 58 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.0.tgz", 59 | "integrity": "sha512-r57SV28+olVsflPlKyVig3Muo/VDlcsObMtvDGOEtEJXj+DDE8bEl0coIkXh//hbkSDTvo+f5lbihZOndYXQQQ==", 60 | "requires": { 61 | "gaxios": "^3.0.0", 62 | "json-bigint": "^0.3.0" 63 | } 64 | }, 65 | "google-auth-library": { 66 | "version": "6.0.0", 67 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.0.tgz", 68 | "integrity": "sha512-uLydy1t6SHN/EvYUJrtN3GCHFrnJ0c8HJjOxXiGjoTuYHIoCUT3jVxnzmjHwVnSdkfE9Akasm2rM6qG1COTXfQ==", 69 | "requires": { 70 | "arrify": "^2.0.0", 71 | "base64-js": "^1.3.0", 72 | "ecdsa-sig-formatter": "^1.0.11", 73 | "fast-text-encoding": "^1.0.0", 74 | "gaxios": "^3.0.0", 75 | "gcp-metadata": "^4.0.0", 76 | "gtoken": "^5.0.0", 77 | "jws": "^4.0.0", 78 | "lru-cache": "^5.0.0" 79 | } 80 | }, 81 | "google-gax": { 82 | "version": "2.3.1", 83 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-2.3.1.tgz", 84 | "integrity": "sha512-9dMa/PKMexVpYEGiLFrqupPj4CDorDPk4lqhyefxXblvdkmLIT+cHprNRxqyVknWGoTY0E0a9VuRDKlQQgOE8w==", 85 | "requires": { 86 | "@grpc/grpc-js": "~1.0.0", 87 | "@grpc/proto-loader": "^0.5.1", 88 | "@types/long": "^4.0.0", 89 | "abort-controller": "^3.0.0", 90 | "duplexify": "^3.6.0", 91 | "google-auth-library": "^6.0.0", 92 | "is-stream-ended": "^0.1.4", 93 | "lodash.at": "^4.6.0", 94 | "lodash.has": "^4.5.2", 95 | "node-fetch": "^2.6.0", 96 | "protobufjs": "^6.9.0", 97 | "retry-request": "^4.0.0", 98 | "semver": "^6.0.0", 99 | "walkdir": "^0.4.0" 100 | } 101 | }, 102 | "google-p12-pem": { 103 | "version": "3.0.1", 104 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.1.tgz", 105 | "integrity": "sha512-VlQgtozgNVVVcYTXS36eQz4PXPt9gIPqLOhHN0QiV6W6h4qSCNVKPtKC5INtJsaHHF2r7+nOIa26MJeJMTaZEQ==", 106 | "requires": { 107 | "node-forge": "^0.9.0" 108 | } 109 | }, 110 | "gtoken": { 111 | "version": "5.0.1", 112 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.1.tgz", 113 | "integrity": "sha512-33w4FNDkUcyIOq/TqyC+drnKdI4PdXmWp9lZzssyEQKuvu9ZFN3KttaSnDKo52U3E51oujVGop93mKxmqO8HHg==", 114 | "requires": { 115 | "gaxios": "^3.0.0", 116 | "google-p12-pem": "^3.0.0", 117 | "jws": "^4.0.0", 118 | "mime": "^2.2.0" 119 | } 120 | }, 121 | "https-proxy-agent": { 122 | "version": "5.0.0", 123 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", 124 | "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", 125 | "requires": { 126 | "agent-base": "6", 127 | "debug": "4" 128 | } 129 | }, 130 | "jwa": { 131 | "version": "2.0.0", 132 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", 133 | "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", 134 | "requires": { 135 | "buffer-equal-constant-time": "1.0.1", 136 | "ecdsa-sig-formatter": "1.0.11", 137 | "safe-buffer": "^5.0.1" 138 | } 139 | }, 140 | "jws": { 141 | "version": "4.0.0", 142 | "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", 143 | "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", 144 | "requires": { 145 | "jwa": "^2.0.0", 146 | "safe-buffer": "^5.0.1" 147 | } 148 | }, 149 | "protobufjs": { 150 | "version": "6.9.0", 151 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.9.0.tgz", 152 | "integrity": "sha512-LlGVfEWDXoI/STstRDdZZKb/qusoAWUnmLg9R8OLSO473mBLWHowx8clbX5/+mKDEI+v7GzjoK9tRPZMMcoTrg==", 153 | "requires": { 154 | "@protobufjs/aspromise": "^1.1.2", 155 | "@protobufjs/base64": "^1.1.2", 156 | "@protobufjs/codegen": "^2.0.4", 157 | "@protobufjs/eventemitter": "^1.1.0", 158 | "@protobufjs/fetch": "^1.1.0", 159 | "@protobufjs/float": "^1.0.2", 160 | "@protobufjs/inquire": "^1.1.0", 161 | "@protobufjs/path": "^1.1.2", 162 | "@protobufjs/pool": "^1.1.0", 163 | "@protobufjs/utf8": "^1.1.0", 164 | "@types/long": "^4.0.1", 165 | "@types/node": "^13.7.0", 166 | "long": "^4.0.0" 167 | }, 168 | "dependencies": { 169 | "@types/long": { 170 | "version": "4.0.1", 171 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.1.tgz", 172 | "integrity": "sha512-5tXH6Bx/kNGd3MgffdmP4dy2Z+G4eaXw0SE81Tq3BNadtnMR5/ySMzX4SLEzHJzSmPNn4HIdpQsBvXMUykr58w==" 173 | } 174 | } 175 | } 176 | } 177 | }, 178 | "@google-cloud/common": { 179 | "version": "2.2.3", 180 | "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-2.2.3.tgz", 181 | "integrity": "sha512-lvw54mGKn8VqVIy2NzAk0l5fntBFX4UwQhHk6HaqkyCQ7WBl5oz4XhzKMtMilozF/3ObPcDogqwuyEWyZ6rnQQ==", 182 | "requires": { 183 | "@google-cloud/projectify": "^1.0.0", 184 | "@google-cloud/promisify": "^1.0.0", 185 | "arrify": "^2.0.0", 186 | "duplexify": "^3.6.0", 187 | "ent": "^2.2.0", 188 | "extend": "^3.0.2", 189 | "google-auth-library": "^5.5.0", 190 | "retry-request": "^4.0.0", 191 | "teeny-request": "^5.2.1" 192 | } 193 | }, 194 | "@google-cloud/compute": { 195 | "version": "1.1.5", 196 | "resolved": "https://registry.npmjs.org/@google-cloud/compute/-/compute-1.1.5.tgz", 197 | "integrity": "sha512-Uc4Le4vXFEJg8yXsh60jgEiBDFOAw9auAQkZIkrdqgfZ53UtLifSQTuKJdaZ6YUzWkudHGQyTVAxl7aekJqgEg==", 198 | "requires": { 199 | "@google-cloud/common": "^2.0.0", 200 | "@google-cloud/paginator": "^2.0.0", 201 | "@google-cloud/projectify": "^1.0.0", 202 | "@google-cloud/promisify": "^1.0.0", 203 | "arrify": "^2.0.0", 204 | "async": "^3.0.0", 205 | "extend": "^3.0.2", 206 | "gce-images": "^2.0.0", 207 | "is": "^3.2.1", 208 | "string-format-obj": "^1.1.1" 209 | } 210 | }, 211 | "@google-cloud/datastore": { 212 | "version": "4.4.1", 213 | "resolved": "https://registry.npmjs.org/@google-cloud/datastore/-/datastore-4.4.1.tgz", 214 | "integrity": "sha512-wtUEYS/UNOuu5N8rpdqmHsYTIpQeuoRMuphft7J/xrBdSU9sdTvJWA9WCIa82TjG6lNTYYpF2swF4raWCjS8CQ==", 215 | "requires": { 216 | "@google-cloud/projectify": "^1.0.0", 217 | "@google-cloud/promisify": "^1.0.0", 218 | "@grpc/grpc-js": "^0.6.0", 219 | "@types/duplexify": "^3.6.0", 220 | "@types/long": "^4.0.0", 221 | "arrify": "^2.0.1", 222 | "concat-stream": "^2.0.0", 223 | "extend": "^3.0.2", 224 | "google-auth-library": "^5.0.0", 225 | "google-gax": "^1.7.5", 226 | "is": "^3.3.0", 227 | "split-array-stream": "^2.0.0", 228 | "stream-events": "^1.0.5" 229 | } 230 | }, 231 | "@google-cloud/dns": { 232 | "version": "1.2.5", 233 | "resolved": "https://registry.npmjs.org/@google-cloud/dns/-/dns-1.2.5.tgz", 234 | "integrity": "sha512-iwXi/3M8UasFzVUVFNDCBEbTDI7jduKkW0lbHlpJ3Lv+CJ06FpU7kp1OGvD69cgBJAu94xJdgbg3owDIqeBHBw==", 235 | "requires": { 236 | "@google-cloud/common": "^2.0.0", 237 | "@google-cloud/paginator": "^2.0.0", 238 | "@google-cloud/promisify": "^1.0.0", 239 | "arrify": "^2.0.0", 240 | "dns-zonefile": "0.2.3", 241 | "lodash.groupby": "^4.6.0", 242 | "string-format-obj": "^1.1.1" 243 | } 244 | }, 245 | "@google-cloud/paginator": { 246 | "version": "2.0.1", 247 | "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-2.0.1.tgz", 248 | "integrity": "sha512-HZ6UTGY/gHGNriD7OCikYWL/Eu0sTEur2qqse2w6OVsz+57se3nTkqH14JIPxtf0vlEJ8IJN5w3BdZ22pjCB8g==", 249 | "requires": { 250 | "arrify": "^2.0.0", 251 | "extend": "^3.0.2" 252 | } 253 | }, 254 | "@google-cloud/projectify": { 255 | "version": "1.0.1", 256 | "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-1.0.1.tgz", 257 | "integrity": "sha512-xknDOmsMgOYHksKc1GPbwDLsdej8aRNIA17SlSZgQdyrcC0lx0OGo4VZgYfwoEU1YS8oUxF9Y+6EzDOb0eB7Xg==" 258 | }, 259 | "@google-cloud/promisify": { 260 | "version": "1.0.2", 261 | "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-1.0.2.tgz", 262 | "integrity": "sha512-7WfV4R/3YV5T30WRZW0lqmvZy9hE2/p9MvpI34WuKa2Wz62mLu5XplGTFEMK6uTbJCLWUxTcZ4J4IyClKucE5g==" 263 | }, 264 | "@google-cloud/storage": { 265 | "version": "4.0.0", 266 | "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-4.0.0.tgz", 267 | "integrity": "sha512-ZhMSvIrsyULJNGuhB3vK9VKxIh92W/sOjEezaxykKewB/NxK/d09cC1AfpwHFcnxN+ZZcy1fSLAIwfNAnKU+lA==", 268 | "requires": { 269 | "@google-cloud/common": "^2.1.1", 270 | "@google-cloud/paginator": "^2.0.0", 271 | "@google-cloud/promisify": "^1.0.0", 272 | "arrify": "^2.0.0", 273 | "compressible": "^2.0.12", 274 | "concat-stream": "^2.0.0", 275 | "date-and-time": "^0.10.0", 276 | "duplexify": "^3.5.0", 277 | "extend": "^3.0.2", 278 | "gaxios": "^2.0.1", 279 | "gcs-resumable-upload": "^2.2.4", 280 | "hash-stream-validation": "^0.2.2", 281 | "mime": "^2.2.0", 282 | "mime-types": "^2.0.8", 283 | "onetime": "^5.1.0", 284 | "p-limit": "^2.2.0", 285 | "pumpify": "^2.0.0", 286 | "readable-stream": "^3.4.0", 287 | "snakeize": "^0.1.0", 288 | "stream-events": "^1.0.1", 289 | "through2": "^3.0.0", 290 | "xdg-basedir": "^4.0.0" 291 | }, 292 | "dependencies": { 293 | "readable-stream": { 294 | "version": "3.4.0", 295 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 296 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 297 | "requires": { 298 | "inherits": "^2.0.3", 299 | "string_decoder": "^1.1.1", 300 | "util-deprecate": "^1.0.1" 301 | } 302 | } 303 | } 304 | }, 305 | "@grpc/grpc-js": { 306 | "version": "0.6.9", 307 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-0.6.9.tgz", 308 | "integrity": "sha512-r1nDOEEiYmAsVYBaS4DPPqdwPOXPw7YhVOnnpPdWhlNtKbYzPash6DqWTTza9gBiYMA5d2Wiq6HzrPqsRaP4yA==", 309 | "requires": { 310 | "semver": "^6.2.0" 311 | } 312 | }, 313 | "@grpc/proto-loader": { 314 | "version": "0.5.2", 315 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.5.2.tgz", 316 | "integrity": "sha512-eBKD/FPxQoY1x6QONW2nBd54QUEyzcFP9FenujmoeDPy1rutVSHki1s/wR68F6O1QfCNDx+ayBH1O2CVNMzyyw==", 317 | "requires": { 318 | "lodash.camelcase": "^4.3.0", 319 | "protobufjs": "^6.8.6" 320 | } 321 | }, 322 | "@protobufjs/aspromise": { 323 | "version": "1.1.2", 324 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 325 | "integrity": "sha1-m4sMxmPWaafY9vXQiToU00jzD78=" 326 | }, 327 | "@protobufjs/base64": { 328 | "version": "1.1.2", 329 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 330 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 331 | }, 332 | "@protobufjs/codegen": { 333 | "version": "2.0.4", 334 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 335 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 336 | }, 337 | "@protobufjs/eventemitter": { 338 | "version": "1.1.0", 339 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 340 | "integrity": "sha1-NVy8mLr61ZePntCV85diHx0Ga3A=" 341 | }, 342 | "@protobufjs/fetch": { 343 | "version": "1.1.0", 344 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 345 | "integrity": "sha1-upn7WYYUr2VwDBYZ/wbUVLDYTEU=", 346 | "requires": { 347 | "@protobufjs/aspromise": "^1.1.1", 348 | "@protobufjs/inquire": "^1.1.0" 349 | } 350 | }, 351 | "@protobufjs/float": { 352 | "version": "1.0.2", 353 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 354 | "integrity": "sha1-Xp4avctz/Ap8uLKR33jIy9l7h9E=" 355 | }, 356 | "@protobufjs/inquire": { 357 | "version": "1.1.0", 358 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 359 | "integrity": "sha1-/yAOPnzyQp4tyvwRQIKOjMY48Ik=" 360 | }, 361 | "@protobufjs/path": { 362 | "version": "1.1.2", 363 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 364 | "integrity": "sha1-bMKyDFya1q0NzP0hynZz2Nf79o0=" 365 | }, 366 | "@protobufjs/pool": { 367 | "version": "1.1.0", 368 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 369 | "integrity": "sha1-Cf0V8tbTq/qbZbw2ZQbWrXhG/1Q=" 370 | }, 371 | "@protobufjs/utf8": { 372 | "version": "1.1.0", 373 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 374 | "integrity": "sha1-p3c2C1s5oaLlEG+OhY8v0tBgxXA=" 375 | }, 376 | "@types/duplexify": { 377 | "version": "3.6.0", 378 | "resolved": "https://registry.npmjs.org/@types/duplexify/-/duplexify-3.6.0.tgz", 379 | "integrity": "sha512-5zOA53RUlzN74bvrSGwjudssD9F3a797sDZQkiYpUOxW+WHaXTCPz4/d5Dgi6FKnOqZ2CpaTo0DhgIfsXAOE/A==", 380 | "requires": { 381 | "@types/node": "*" 382 | } 383 | }, 384 | "@types/long": { 385 | "version": "4.0.0", 386 | "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.0.tgz", 387 | "integrity": "sha512-1w52Nyx4Gq47uuu0EVcsHBxZFJgurQ+rTKS3qMHxR1GY2T8c2AJYd6vZoZ9q1rupaDjU0yT+Jc2XTyXkjeMA+Q==" 388 | }, 389 | "@types/node": { 390 | "version": "12.11.7", 391 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", 392 | "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==" 393 | }, 394 | "abort-controller": { 395 | "version": "3.0.0", 396 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 397 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 398 | "requires": { 399 | "event-target-shim": "^5.0.0" 400 | } 401 | }, 402 | "agent-base": { 403 | "version": "4.3.0", 404 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", 405 | "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", 406 | "requires": { 407 | "es6-promisify": "^5.0.0" 408 | } 409 | }, 410 | "arrify": { 411 | "version": "2.0.1", 412 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", 413 | "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" 414 | }, 415 | "async": { 416 | "version": "3.1.0", 417 | "resolved": "https://registry.npmjs.org/async/-/async-3.1.0.tgz", 418 | "integrity": "sha512-4vx/aaY6j/j3Lw3fbCHNWP0pPaTCew3F6F3hYyl/tHs/ndmV1q7NW9T5yuJ2XAGwdQrP+6Wu20x06U4APo/iQQ==" 419 | }, 420 | "base64-js": { 421 | "version": "1.3.1", 422 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 423 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 424 | }, 425 | "bignumber.js": { 426 | "version": "7.2.1", 427 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-7.2.1.tgz", 428 | "integrity": "sha512-S4XzBk5sMB+Rcb/LNcpzXr57VRTxgAvaAEDAl1AwRx27j00hT84O6OkteE7u8UB3NuaaygCRrEpqox4uDOrbdQ==" 429 | }, 430 | "buffer-equal-constant-time": { 431 | "version": "1.0.1", 432 | "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", 433 | "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=" 434 | }, 435 | "buffer-from": { 436 | "version": "1.1.1", 437 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 438 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 439 | }, 440 | "compressible": { 441 | "version": "2.0.17", 442 | "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", 443 | "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", 444 | "requires": { 445 | "mime-db": ">= 1.40.0 < 2" 446 | } 447 | }, 448 | "concat-stream": { 449 | "version": "2.0.0", 450 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 451 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 452 | "requires": { 453 | "buffer-from": "^1.0.0", 454 | "inherits": "^2.0.3", 455 | "readable-stream": "^3.0.2", 456 | "typedarray": "^0.0.6" 457 | }, 458 | "dependencies": { 459 | "readable-stream": { 460 | "version": "3.4.0", 461 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 462 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 463 | "requires": { 464 | "inherits": "^2.0.3", 465 | "string_decoder": "^1.1.1", 466 | "util-deprecate": "^1.0.1" 467 | } 468 | } 469 | } 470 | }, 471 | "configstore": { 472 | "version": "5.0.0", 473 | "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.0.tgz", 474 | "integrity": "sha512-eE/hvMs7qw7DlcB5JPRnthmrITuHMmACUJAp89v6PT6iOqzoLS7HRWhBtuHMlhNHo2AhUSA/3Dh1bKNJHcublQ==", 475 | "requires": { 476 | "dot-prop": "^5.1.0", 477 | "graceful-fs": "^4.1.2", 478 | "make-dir": "^3.0.0", 479 | "unique-string": "^2.0.0", 480 | "write-file-atomic": "^3.0.0", 481 | "xdg-basedir": "^4.0.0" 482 | } 483 | }, 484 | "core-util-is": { 485 | "version": "1.0.2", 486 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 487 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 488 | }, 489 | "crypto-random-string": { 490 | "version": "2.0.0", 491 | "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", 492 | "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" 493 | }, 494 | "date-and-time": { 495 | "version": "0.10.0", 496 | "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.10.0.tgz", 497 | "integrity": "sha512-IbIzxtvK80JZOVsWF6+NOjunTaoFVYxkAQoyzmflJyuRCJAJebehy48mPiCAedcGp4P7/UO3QYRWa0fe6INftg==" 498 | }, 499 | "debug": { 500 | "version": "3.2.6", 501 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 502 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 503 | "requires": { 504 | "ms": "^2.1.1" 505 | } 506 | }, 507 | "dns-zonefile": { 508 | "version": "0.2.3", 509 | "resolved": "https://registry.npmjs.org/dns-zonefile/-/dns-zonefile-0.2.3.tgz", 510 | "integrity": "sha512-ijQM13UI3a1uFvN4IB0LNesgBdYhzJugSzpiEzfeIgZmPNvkTkO/U7Z5sjwxBGuhCc3vCClOhA762bGQchmr1Q==" 511 | }, 512 | "dot-prop": { 513 | "version": "5.1.1", 514 | "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.1.1.tgz", 515 | "integrity": "sha512-QCHI6Lkf+9fJMpwfAFsTvbiSh6ujoPmhCLiDvD/n4dGtLvHfhuBwPdN6z2x4YSOwwtTcLoO/LP70xELWGF/JVA==", 516 | "requires": { 517 | "is-obj": "^2.0.0" 518 | } 519 | }, 520 | "duplexify": { 521 | "version": "3.7.1", 522 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 523 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 524 | "requires": { 525 | "end-of-stream": "^1.0.0", 526 | "inherits": "^2.0.1", 527 | "readable-stream": "^2.0.0", 528 | "stream-shift": "^1.0.0" 529 | } 530 | }, 531 | "ecdsa-sig-formatter": { 532 | "version": "1.0.11", 533 | "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", 534 | "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", 535 | "requires": { 536 | "safe-buffer": "^5.0.1" 537 | } 538 | }, 539 | "end-of-stream": { 540 | "version": "1.4.4", 541 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 542 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 543 | "requires": { 544 | "once": "^1.4.0" 545 | } 546 | }, 547 | "ent": { 548 | "version": "2.2.0", 549 | "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", 550 | "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" 551 | }, 552 | "es6-promise": { 553 | "version": "4.2.8", 554 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 555 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 556 | }, 557 | "es6-promisify": { 558 | "version": "5.0.0", 559 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 560 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 561 | "requires": { 562 | "es6-promise": "^4.0.3" 563 | } 564 | }, 565 | "event-target-shim": { 566 | "version": "5.0.1", 567 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 568 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" 569 | }, 570 | "extend": { 571 | "version": "3.0.2", 572 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 573 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 574 | }, 575 | "fast-text-encoding": { 576 | "version": "1.0.0", 577 | "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.0.tgz", 578 | "integrity": "sha512-R9bHCvweUxxwkDwhjav5vxpFvdPGlVngtqmx4pIZfSUhM/Q4NiIUHB456BAf+Q1Nwu3HEZYONtu+Rya+af4jiQ==" 579 | }, 580 | "gaxios": { 581 | "version": "2.1.0", 582 | "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.1.0.tgz", 583 | "integrity": "sha512-Gtpb5sdQmb82sgVkT2GnS2n+Kx4dlFwbeMYcDlD395aEvsLCSQXJJcHt7oJ2LrGxDEAeiOkK79Zv2A8Pzt6CFg==", 584 | "requires": { 585 | "abort-controller": "^3.0.0", 586 | "extend": "^3.0.2", 587 | "https-proxy-agent": "^3.0.0", 588 | "is-stream": "^2.0.0", 589 | "node-fetch": "^2.3.0" 590 | } 591 | }, 592 | "gce-images": { 593 | "version": "2.1.3", 594 | "resolved": "https://registry.npmjs.org/gce-images/-/gce-images-2.1.3.tgz", 595 | "integrity": "sha512-rRH35PbqHF9KYhv0/LQcAElbwpIIleNAvX0bliP1a3XelbEY3r92kCCpmFujJ8zipmN6Ex7UVVXsB66mUqR2SQ==", 596 | "requires": { 597 | "arrify": "^2.0.0", 598 | "google-auth-library": "^5.0.0" 599 | } 600 | }, 601 | "gcp-metadata": { 602 | "version": "3.2.0", 603 | "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-3.2.0.tgz", 604 | "integrity": "sha512-ympv+yQ6k5QuWCuwQqnGEvFGS7MBKdcQdj1i188v3bW9QLFIchTGaBCEZxSQapT0jffdn1vdt8oJhB5VBWQO1Q==", 605 | "requires": { 606 | "gaxios": "^2.0.1", 607 | "json-bigint": "^0.3.0" 608 | } 609 | }, 610 | "gcs-resumable-upload": { 611 | "version": "2.3.0", 612 | "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.0.tgz", 613 | "integrity": "sha512-PclXJiEngrVx0c4K0LfE1XOxhmOkBEy39Rrhspdn6jAbbwe4OQMZfjo7Z1LHBrh57+bNZeIN4M+BooYppCoHSg==", 614 | "requires": { 615 | "abort-controller": "^3.0.0", 616 | "configstore": "^5.0.0", 617 | "gaxios": "^2.0.0", 618 | "google-auth-library": "^5.0.0", 619 | "pumpify": "^2.0.0", 620 | "stream-events": "^1.0.4" 621 | } 622 | }, 623 | "google-auth-library": { 624 | "version": "5.5.1", 625 | "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.5.1.tgz", 626 | "integrity": "sha512-zCtjQccWS/EHYyFdXRbfeSGM/gW+d7uMAcVnvXRnjBXON5ijo6s0nsObP0ifqileIDSbZjTlLtgo+UoN8IFJcg==", 627 | "requires": { 628 | "arrify": "^2.0.0", 629 | "base64-js": "^1.3.0", 630 | "fast-text-encoding": "^1.0.0", 631 | "gaxios": "^2.1.0", 632 | "gcp-metadata": "^3.2.0", 633 | "gtoken": "^4.1.0", 634 | "jws": "^3.1.5", 635 | "lru-cache": "^5.0.0" 636 | } 637 | }, 638 | "google-gax": { 639 | "version": "1.7.5", 640 | "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-1.7.5.tgz", 641 | "integrity": "sha512-Tz2DFs8umzDcCBTi2W1cY4vEgAKaYRj70g6Hh/MiiZaJizrly7PgyxsIYUGi7sOpEuAbARQymYKvy5mNi8hEbg==", 642 | "requires": { 643 | "@grpc/grpc-js": "0.6.9", 644 | "@grpc/proto-loader": "^0.5.1", 645 | "abort-controller": "^3.0.0", 646 | "duplexify": "^3.6.0", 647 | "google-auth-library": "^5.0.0", 648 | "is-stream-ended": "^0.1.4", 649 | "lodash.at": "^4.6.0", 650 | "lodash.has": "^4.5.2", 651 | "node-fetch": "^2.6.0", 652 | "protobufjs": "^6.8.8", 653 | "retry-request": "^4.0.0", 654 | "semver": "^6.0.0", 655 | "walkdir": "^0.4.0" 656 | } 657 | }, 658 | "google-p12-pem": { 659 | "version": "2.0.2", 660 | "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.2.tgz", 661 | "integrity": "sha512-UfnEARfJKI6pbmC1hfFFm+UAcZxeIwTiEcHfqKe/drMsXD/ilnVjF7zgOGpHXyhuvX6jNJK3S8A0hOQjwtFxEw==", 662 | "requires": { 663 | "node-forge": "^0.9.0" 664 | } 665 | }, 666 | "graceful-fs": { 667 | "version": "4.2.3", 668 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz", 669 | "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==" 670 | }, 671 | "gtoken": { 672 | "version": "4.1.0", 673 | "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.0.tgz", 674 | "integrity": "sha512-wqyn2gf5buzEZN4QNmmiiW2i2JkEdZnL7Z/9p44RtZqgt4077m4khRgAYNuu8cBwHWCc6MsP6eDUn/KkF6jFIw==", 675 | "requires": { 676 | "gaxios": "^2.0.0", 677 | "google-p12-pem": "^2.0.0", 678 | "jws": "^3.1.5", 679 | "mime": "^2.2.0" 680 | } 681 | }, 682 | "hash-stream-validation": { 683 | "version": "0.2.2", 684 | "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.2.tgz", 685 | "integrity": "sha512-cMlva5CxWZOrlS/cY0C+9qAzesn5srhFA8IT1VPiHc9bWWBLkJfEUIZr7MWoi89oOOGmpg8ymchaOjiArsGu5A==", 686 | "requires": { 687 | "through2": "^2.0.0" 688 | }, 689 | "dependencies": { 690 | "through2": { 691 | "version": "2.0.5", 692 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 693 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 694 | "requires": { 695 | "readable-stream": "~2.3.6", 696 | "xtend": "~4.0.1" 697 | } 698 | } 699 | } 700 | }, 701 | "http-proxy-agent": { 702 | "version": "2.1.0", 703 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 704 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 705 | "requires": { 706 | "agent-base": "4", 707 | "debug": "3.1.0" 708 | }, 709 | "dependencies": { 710 | "debug": { 711 | "version": "3.1.0", 712 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 713 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 714 | "requires": { 715 | "ms": "2.0.0" 716 | } 717 | }, 718 | "ms": { 719 | "version": "2.0.0", 720 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 721 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 722 | } 723 | } 724 | }, 725 | "https-proxy-agent": { 726 | "version": "3.0.1", 727 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-3.0.1.tgz", 728 | "integrity": "sha512-+ML2Rbh6DAuee7d07tYGEKOEi2voWPUGan+ExdPbPW6Z3svq+JCqr0v8WmKPOkz1vOVykPCBSuobe7G8GJUtVg==", 729 | "requires": { 730 | "agent-base": "^4.3.0", 731 | "debug": "^3.1.0" 732 | } 733 | }, 734 | "imurmurhash": { 735 | "version": "0.1.4", 736 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 737 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 738 | }, 739 | "inherits": { 740 | "version": "2.0.4", 741 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 742 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 743 | }, 744 | "is": { 745 | "version": "3.3.0", 746 | "resolved": "https://registry.npmjs.org/is/-/is-3.3.0.tgz", 747 | "integrity": "sha512-nW24QBoPcFGGHJGUwnfpI7Yc5CdqWNdsyHQszVE/z2pKHXzh7FZ5GWhJqSyaQ9wMkQnsTx+kAI8bHlCX4tKdbg==" 748 | }, 749 | "is-obj": { 750 | "version": "2.0.0", 751 | "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", 752 | "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" 753 | }, 754 | "is-stream": { 755 | "version": "2.0.0", 756 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 757 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 758 | }, 759 | "is-stream-ended": { 760 | "version": "0.1.4", 761 | "resolved": "https://registry.npmjs.org/is-stream-ended/-/is-stream-ended-0.1.4.tgz", 762 | "integrity": "sha512-xj0XPvmr7bQFTvirqnFr50o0hQIh6ZItDqloxt5aJrR4NQsYeSsyFQERYGCAzfindAcnKjINnwEEgLx4IqVzQw==" 763 | }, 764 | "is-typedarray": { 765 | "version": "1.0.0", 766 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 767 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 768 | }, 769 | "isarray": { 770 | "version": "1.0.0", 771 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 772 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 773 | }, 774 | "json-bigint": { 775 | "version": "0.3.0", 776 | "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-0.3.0.tgz", 777 | "integrity": "sha1-DM2RLEuCcNBfBW+9E4FLU9OCWx4=", 778 | "requires": { 779 | "bignumber.js": "^7.0.0" 780 | } 781 | }, 782 | "jwa": { 783 | "version": "1.4.1", 784 | "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", 785 | "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", 786 | "requires": { 787 | "buffer-equal-constant-time": "1.0.1", 788 | "ecdsa-sig-formatter": "1.0.11", 789 | "safe-buffer": "^5.0.1" 790 | } 791 | }, 792 | "jws": { 793 | "version": "3.2.2", 794 | "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", 795 | "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", 796 | "requires": { 797 | "jwa": "^1.4.1", 798 | "safe-buffer": "^5.0.1" 799 | } 800 | }, 801 | "lodash.at": { 802 | "version": "4.6.0", 803 | "resolved": "https://registry.npmjs.org/lodash.at/-/lodash.at-4.6.0.tgz", 804 | "integrity": "sha1-k83OZk8KGZTqM9181A4jr9EbD/g=" 805 | }, 806 | "lodash.camelcase": { 807 | "version": "4.3.0", 808 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 809 | "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=" 810 | }, 811 | "lodash.groupby": { 812 | "version": "4.6.0", 813 | "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", 814 | "integrity": "sha1-Cwih3PaDl8OXhVwyOXg4Mt90A9E=" 815 | }, 816 | "lodash.has": { 817 | "version": "4.5.2", 818 | "resolved": "https://registry.npmjs.org/lodash.has/-/lodash.has-4.5.2.tgz", 819 | "integrity": "sha1-0Z9NwQlQWMzL4rDN9O4P5Ko3yGI=" 820 | }, 821 | "long": { 822 | "version": "4.0.0", 823 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 824 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 825 | }, 826 | "lru-cache": { 827 | "version": "5.1.1", 828 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", 829 | "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", 830 | "requires": { 831 | "yallist": "^3.0.2" 832 | } 833 | }, 834 | "make-dir": { 835 | "version": "3.0.0", 836 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.0.0.tgz", 837 | "integrity": "sha512-grNJDhb8b1Jm1qeqW5R/O63wUo4UXo2v2HMic6YT9i/HBlF93S8jkMgH7yugvY9ABDShH4VZMn8I+U8+fCNegw==", 838 | "requires": { 839 | "semver": "^6.0.0" 840 | } 841 | }, 842 | "mime": { 843 | "version": "2.4.4", 844 | "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", 845 | "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" 846 | }, 847 | "mime-db": { 848 | "version": "1.42.0", 849 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 850 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" 851 | }, 852 | "mime-types": { 853 | "version": "2.1.24", 854 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 855 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 856 | "requires": { 857 | "mime-db": "1.40.0" 858 | }, 859 | "dependencies": { 860 | "mime-db": { 861 | "version": "1.40.0", 862 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 863 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 864 | } 865 | } 866 | }, 867 | "mimic-fn": { 868 | "version": "2.1.0", 869 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", 870 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" 871 | }, 872 | "ms": { 873 | "version": "2.1.2", 874 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 875 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 876 | }, 877 | "node-fetch": { 878 | "version": "2.6.0", 879 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 880 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 881 | }, 882 | "node-forge": { 883 | "version": "0.9.1", 884 | "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", 885 | "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" 886 | }, 887 | "once": { 888 | "version": "1.4.0", 889 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 890 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 891 | "requires": { 892 | "wrappy": "1" 893 | } 894 | }, 895 | "onetime": { 896 | "version": "5.1.0", 897 | "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", 898 | "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", 899 | "requires": { 900 | "mimic-fn": "^2.1.0" 901 | } 902 | }, 903 | "p-limit": { 904 | "version": "2.2.1", 905 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 906 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 907 | "requires": { 908 | "p-try": "^2.0.0" 909 | } 910 | }, 911 | "p-try": { 912 | "version": "2.2.0", 913 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 914 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 915 | }, 916 | "process-nextick-args": { 917 | "version": "2.0.1", 918 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 919 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 920 | }, 921 | "protobufjs": { 922 | "version": "6.8.8", 923 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", 924 | "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", 925 | "requires": { 926 | "@protobufjs/aspromise": "^1.1.2", 927 | "@protobufjs/base64": "^1.1.2", 928 | "@protobufjs/codegen": "^2.0.4", 929 | "@protobufjs/eventemitter": "^1.1.0", 930 | "@protobufjs/fetch": "^1.1.0", 931 | "@protobufjs/float": "^1.0.2", 932 | "@protobufjs/inquire": "^1.1.0", 933 | "@protobufjs/path": "^1.1.2", 934 | "@protobufjs/pool": "^1.1.0", 935 | "@protobufjs/utf8": "^1.1.0", 936 | "@types/long": "^4.0.0", 937 | "@types/node": "^10.1.0", 938 | "long": "^4.0.0" 939 | }, 940 | "dependencies": { 941 | "@types/node": { 942 | "version": "10.17.0", 943 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.0.tgz", 944 | "integrity": "sha512-wuJwN2KV4tIRz1bu9vq5kSPasJ8IsEjZaP1ZR7KlmdUZvGF/rXy8DmXOVwUD0kAtvtJ7aqMKPqUXC0NUTDbrDg==" 945 | } 946 | } 947 | }, 948 | "pump": { 949 | "version": "3.0.0", 950 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 951 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 952 | "requires": { 953 | "end-of-stream": "^1.1.0", 954 | "once": "^1.3.1" 955 | } 956 | }, 957 | "pumpify": { 958 | "version": "2.0.1", 959 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", 960 | "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", 961 | "requires": { 962 | "duplexify": "^4.1.1", 963 | "inherits": "^2.0.3", 964 | "pump": "^3.0.0" 965 | }, 966 | "dependencies": { 967 | "duplexify": { 968 | "version": "4.1.1", 969 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", 970 | "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", 971 | "requires": { 972 | "end-of-stream": "^1.4.1", 973 | "inherits": "^2.0.3", 974 | "readable-stream": "^3.1.1", 975 | "stream-shift": "^1.0.0" 976 | } 977 | }, 978 | "readable-stream": { 979 | "version": "3.4.0", 980 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", 981 | "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", 982 | "requires": { 983 | "inherits": "^2.0.3", 984 | "string_decoder": "^1.1.1", 985 | "util-deprecate": "^1.0.1" 986 | } 987 | } 988 | } 989 | }, 990 | "readable-stream": { 991 | "version": "2.3.6", 992 | "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 993 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 994 | "requires": { 995 | "core-util-is": "~1.0.0", 996 | "inherits": "~2.0.3", 997 | "isarray": "~1.0.0", 998 | "process-nextick-args": "~2.0.0", 999 | "safe-buffer": "~5.1.1", 1000 | "string_decoder": "~1.1.1", 1001 | "util-deprecate": "~1.0.1" 1002 | } 1003 | }, 1004 | "retry-request": { 1005 | "version": "4.1.1", 1006 | "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", 1007 | "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", 1008 | "requires": { 1009 | "debug": "^4.1.1", 1010 | "through2": "^3.0.1" 1011 | }, 1012 | "dependencies": { 1013 | "debug": { 1014 | "version": "4.1.1", 1015 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 1016 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 1017 | "requires": { 1018 | "ms": "^2.1.1" 1019 | } 1020 | } 1021 | } 1022 | }, 1023 | "safe-buffer": { 1024 | "version": "5.1.2", 1025 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1026 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1027 | }, 1028 | "semver": { 1029 | "version": "6.3.0", 1030 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 1031 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 1032 | }, 1033 | "signal-exit": { 1034 | "version": "3.0.2", 1035 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1036 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1037 | }, 1038 | "snakeize": { 1039 | "version": "0.1.0", 1040 | "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", 1041 | "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" 1042 | }, 1043 | "split-array-stream": { 1044 | "version": "2.0.0", 1045 | "resolved": "https://registry.npmjs.org/split-array-stream/-/split-array-stream-2.0.0.tgz", 1046 | "integrity": "sha512-hmMswlVY91WvGMxs0k8MRgq8zb2mSen4FmDNc5AFiTWtrBpdZN6nwD6kROVe4vNL+ywrvbCKsWVCnEd4riELIg==", 1047 | "requires": { 1048 | "is-stream-ended": "^0.1.4" 1049 | } 1050 | }, 1051 | "stream-events": { 1052 | "version": "1.0.5", 1053 | "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", 1054 | "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", 1055 | "requires": { 1056 | "stubs": "^3.0.0" 1057 | } 1058 | }, 1059 | "stream-shift": { 1060 | "version": "1.0.0", 1061 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1062 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 1063 | }, 1064 | "string-format-obj": { 1065 | "version": "1.1.1", 1066 | "resolved": "https://registry.npmjs.org/string-format-obj/-/string-format-obj-1.1.1.tgz", 1067 | "integrity": "sha512-Mm+sROy+pHJmx0P/0Bs1uxIX6UhGJGj6xDGQZ5zh9v/SZRmLGevp+p0VJxV7lirrkAmQ2mvva/gHKpnF/pTb+Q==" 1068 | }, 1069 | "string_decoder": { 1070 | "version": "1.1.1", 1071 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1072 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1073 | "requires": { 1074 | "safe-buffer": "~5.1.0" 1075 | } 1076 | }, 1077 | "stubs": { 1078 | "version": "3.0.0", 1079 | "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", 1080 | "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" 1081 | }, 1082 | "teeny-request": { 1083 | "version": "5.3.0", 1084 | "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-5.3.0.tgz", 1085 | "integrity": "sha512-sN9E3JvEBe2CFqB/jpJpw1erWD1C7MxyYCxogHFCQSyZfkHYcdf4wzVQSw7FZxbwcfnS+FP0W9BS0mp6SEOKjg==", 1086 | "requires": { 1087 | "http-proxy-agent": "^2.1.0", 1088 | "https-proxy-agent": "^3.0.0", 1089 | "node-fetch": "^2.2.0", 1090 | "stream-events": "^1.0.5", 1091 | "uuid": "^3.3.2" 1092 | } 1093 | }, 1094 | "through2": { 1095 | "version": "3.0.1", 1096 | "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.1.tgz", 1097 | "integrity": "sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==", 1098 | "requires": { 1099 | "readable-stream": "2 || 3" 1100 | } 1101 | }, 1102 | "typedarray": { 1103 | "version": "0.0.6", 1104 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1105 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1106 | }, 1107 | "typedarray-to-buffer": { 1108 | "version": "3.1.5", 1109 | "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", 1110 | "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", 1111 | "requires": { 1112 | "is-typedarray": "^1.0.0" 1113 | } 1114 | }, 1115 | "unique-string": { 1116 | "version": "2.0.0", 1117 | "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", 1118 | "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", 1119 | "requires": { 1120 | "crypto-random-string": "^2.0.0" 1121 | } 1122 | }, 1123 | "util-deprecate": { 1124 | "version": "1.0.2", 1125 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1126 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1127 | }, 1128 | "uuid": { 1129 | "version": "3.3.3", 1130 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1131 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 1132 | }, 1133 | "walkdir": { 1134 | "version": "0.4.1", 1135 | "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", 1136 | "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==" 1137 | }, 1138 | "wrappy": { 1139 | "version": "1.0.2", 1140 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1141 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1142 | }, 1143 | "write-file-atomic": { 1144 | "version": "3.0.1", 1145 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", 1146 | "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", 1147 | "requires": { 1148 | "imurmurhash": "^0.1.4", 1149 | "is-typedarray": "^1.0.0", 1150 | "signal-exit": "^3.0.2", 1151 | "typedarray-to-buffer": "^3.1.5" 1152 | } 1153 | }, 1154 | "xdg-basedir": { 1155 | "version": "4.0.0", 1156 | "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", 1157 | "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==" 1158 | }, 1159 | "xtend": { 1160 | "version": "4.0.2", 1161 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1162 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1163 | }, 1164 | "yallist": { 1165 | "version": "3.1.1", 1166 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1167 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1168 | } 1169 | } 1170 | } 1171 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "nodecloud-gcp", 3 | "version": "1.1.0", 4 | "description": "GCP Wrapper for NodeCloud Core", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/cloudlibz/nodecloud-gcp.git" 12 | }, 13 | "keywords": [ 14 | "nodecloud", 15 | "aws", 16 | "gcp", 17 | "nodecloud-core" 18 | ], 19 | "author": "Scorelab", 20 | "license": "Apache-2.0", 21 | "bugs": { 22 | "url": "https://github.com/cloudlibz/nodecloud-gcp/issues" 23 | }, 24 | "homepage": "https://github.com/cloudlibz/nodecloud-gcp#readme", 25 | "dependencies": { 26 | "@google-cloud/automl": "^2.0.0", 27 | "@google-cloud/compute": "^1.1.5", 28 | "@google-cloud/datastore": "^4.4.1", 29 | "@google-cloud/dns": "^1.2.5", 30 | "@google-cloud/storage": "^4.0.0" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /storage/google-compute.js: -------------------------------------------------------------------------------- 1 | const helpers = require('../helpers'); 2 | const { checkParams } = helpers; 3 | 4 | class GCPComputeStorage { 5 | /** 6 | * GCPStorage constructor 7 | * @constructor 8 | * @param {object} gogole - google SDK 9 | * @param {object} config - { projectId, keyFilename } 10 | */ 11 | constructor(google, config) { 12 | this._google = google; 13 | this._gce = new this._google.compute(this._google._config); 14 | this._zone = gce.zone(params.zone); 15 | this._disk = zone.disk(params.disk); 16 | } 17 | /** 18 | * Create a persistent disk 19 | * @create 20 | * @param String disk name 21 | */ 22 | create(params) { 23 | checkParams(params); 24 | 25 | return this._disk.create(params); 26 | } 27 | /** 28 | * Delete GCP disk 29 | * @deleteSnapshot 30 | */ 31 | delete() { 32 | checkParams(params); 33 | // delete snapshot 34 | return disk.delete(); 35 | } 36 | /** 37 | * Get disk if exists 38 | * @describe 39 | */ 40 | get() { 41 | return disk.get(); 42 | } 43 | /** 44 | * Get disk metadata 45 | * @describe 46 | */ 47 | describe() { 48 | return disk.getMetadata(); 49 | } 50 | /** 51 | * Create GCP snapshot 52 | * @createSnapshot 53 | * @param String snapshot name 54 | */ 55 | createSnapshot(params) { 56 | checkParams(params); 57 | // create snapshot 58 | this._snapshot = this._disk.createSnapshot(params); 59 | return this._snapshot; 60 | } 61 | /** 62 | * Delete GCP snapshot 63 | * @createSnapshot 64 | */ 65 | deleteSnapshot() { 66 | checkParams(params); 67 | // create snapshot 68 | return this._snapshot.delete(); 69 | } 70 | /** 71 | * Check snapshot exists 72 | * @existsSnapshot 73 | */ 74 | existsSnapshot() { 75 | return new Promise((resolve, reject) => { 76 | this._snapshot.exists((err, exists) => { 77 | if (err) { 78 | reject(); 79 | return; 80 | } 81 | if (exists) { 82 | resolve(); 83 | } else { 84 | reject(); 85 | return; 86 | } 87 | }); 88 | }); 89 | } 90 | /** 91 | * Describe snapshot 92 | * @describeSnapshot 93 | */ 94 | describeSnapshot() { 95 | return snapshot.getMetadata(); 96 | } 97 | } 98 | 99 | module.exports = GCPComputeStorage; 100 | -------------------------------------------------------------------------------- /storage/google-storage.js: -------------------------------------------------------------------------------- 1 | const helpers = require('../helpers'); 2 | const { checkParams } = helpers; 3 | 4 | class GCStorage { 5 | /** 6 | * GCStorage constructor 7 | * @constructor 8 | * @param {object} google - google SDK 9 | * @param {object} config - { projectId, keyFilename } 10 | * @param string bucketName 11 | */ 12 | constructor(google, config, bucketName) { 13 | this._google = google; 14 | this._gcs = new this._google.storage(this._google._config); 15 | if (bucketName) { 16 | this._bucket = this._gcs.bucket(bucketName); 17 | } 18 | } 19 | /** 20 | * Create GCloud bucket 21 | * @create 22 | * @param {object} params 23 | */ 24 | create(params) { 25 | checkParams(params); 26 | 27 | if (params.metaData) { 28 | return this._gcs.createBucket(params.bucketName, params.metaData); 29 | } 30 | return this._gcs.createBucket(params.bucketName); 31 | } 32 | /** 33 | * Delete GCP Bucket 34 | * @delete 35 | * @param {object} params 36 | */ 37 | delete() { 38 | return this._bucket.delete(); 39 | } 40 | /** 41 | * List buckets 42 | * @list 43 | */ 44 | list() { 45 | return this._gcs.getBuckets(); 46 | } 47 | /** 48 | * Upload to GCP 49 | * @upload 50 | * @param {object} params 51 | */ 52 | upload(params) { 53 | checkParams(params); 54 | 55 | if (params.options) { 56 | return this._gcs.bucket(params.bucketName).upload(params.contentPath, params.options); 57 | } 58 | return this._gcs.bucket(params.bucketName).upload(params.contentPath); 59 | // return this._bucket.upload(params.contentPath); 60 | } 61 | } 62 | 63 | module.exports = GCStorage; 64 | -------------------------------------------------------------------------------- /test/.nc.config.js: -------------------------------------------------------------------------------- 1 | const nodeCloudGcpPlugin = require("../index"); 2 | 3 | const providers = [ 4 | { 5 | name: "gcp", 6 | tag: "gcp", 7 | plugin: nodeCloudGcpPlugin 8 | } 9 | ]; 10 | 11 | module.exports = providers; 12 | -------------------------------------------------------------------------------- /test/compute/compute-engine.js: -------------------------------------------------------------------------------- 1 | const chai = require("chai"); 2 | const assert = chai.assert; 3 | const gcpPlugin = require("../../gcp"); 4 | const gcpSDk = require("../gcp-mock"); 5 | 6 | const options = { 7 | projectId: "", 8 | keyFilename: "" 9 | }; 10 | 11 | const ncGcpPlugin = new gcpPlugin(options, gcpSDk); 12 | const gceCompute = ncGcpPlugin.compute(); 13 | 14 | describe("Google/GCP compute", () => { 15 | it("should list all VMs", done => { 16 | gceCompute 17 | .list({ 18 | maxResults: 1 19 | }) 20 | .then(res => { 21 | assert.typeOf(res, "array"); 22 | done(); 23 | }) 24 | .catch(err => { 25 | done(); 26 | }); 27 | }); 28 | 29 | it("should start VM", done => { 30 | gceCompute 31 | .stop({ 32 | zone: "us-central1-a", 33 | vmName: "ubuntu-http" 34 | }) 35 | .then(res => { 36 | const operation = res[0]; 37 | assert(typeof operation, "object"); 38 | assert.equal(operation.metadata.id, "string"); 39 | done(); 40 | }) 41 | .catch(err => { 42 | done(); 43 | }); 44 | }); 45 | 46 | it("should reboot VM", done => { 47 | gceCompute 48 | .reboot({ 49 | zone: "us-central1-a", 50 | vmName: "ubuntu-http" 51 | }) 52 | .then(res => { 53 | assert.typeOf(res[0], "object"); 54 | assert.equal( 55 | res[0].id, 56 | "operation-1500210015617-5546edd11bfe9-3597d10f-27280f22" 57 | ); 58 | done(); 59 | }); 60 | }); 61 | 62 | it("should terminate/destory VM", done => { 63 | gceCompute 64 | .destroy({ 65 | zone: "us-central1-a", 66 | vmName: "ubuntu-http-1" 67 | }) 68 | .then(res => { 69 | const operation = res[0]; 70 | const apiResponse = res[1]; 71 | assert(typeof apiResponse, "object"); 72 | assert.equal(apiResponse.kind, "compute#operation"); 73 | done(); 74 | }); 75 | }); 76 | }); 77 | -------------------------------------------------------------------------------- /test/database/data-store.js: -------------------------------------------------------------------------------- 1 | const chai = require("chai"); 2 | const assert = chai.assert; 3 | const gcpPlugin = require("../../gcp"); 4 | const gcpSDk = require("../gcp-mock"); 5 | 6 | const options = { 7 | projectId: "", 8 | keyFilename: "" 9 | }; 10 | 11 | const ncGcpPlugin = new gcpPlugin(options, gcpSDk); 12 | const gcd = ncGcpPlugin.nosql(); 13 | 14 | describe("Google/GCP datastore", () => { 15 | it("should create entity", done => { 16 | const params = { 17 | key: "Google", 18 | data: { 19 | name: "Google", 20 | location: "CA" 21 | } 22 | }; 23 | 24 | gcd.createItem(params).then(res => { 25 | assert.equal(res[0].indexUpdates, 5); 26 | done(); 27 | }); 28 | }); 29 | 30 | it("should delete entity", done => { 31 | const params = { 32 | key: ["Company", "Google"] 33 | }; 34 | 35 | gcd.deleteItem(params).then(res => { 36 | assert.equal(res[0].indexUpdates, 0); 37 | done(); 38 | }); 39 | }); 40 | 41 | it("should update entity", done => { 42 | const params = { 43 | key: "Company", 44 | data: { 45 | rating: "10" 46 | } 47 | }; 48 | 49 | gcd.updateItem(params).then(res => { 50 | assert.equal(res[0].indexUpdates, 3); 51 | done(); 52 | }); 53 | }); 54 | 55 | it("should run query", done => { 56 | const query = gcd.getQuery({ 57 | key: "Google" 58 | }); 59 | 60 | query.limit(5); 61 | 62 | gcd.query({ query }).then(res => { 63 | assert.typeOf(res, "array"); 64 | done(); 65 | }); 66 | }); 67 | }); 68 | -------------------------------------------------------------------------------- /test/gcp-mock.js: -------------------------------------------------------------------------------- 1 | class GcpMockSdk { 2 | constructor(options) { 3 | this.config = { 4 | credentials: "gcpMockSdk", 5 | loadFromPath: () => { 6 | return true; 7 | } 8 | }; 9 | this.options = options; 10 | this.GoogleCompute = GoogleCompute; 11 | this.GCD = GCD; 12 | this.GooogleDNS = GooogleDNS; 13 | this.GCPComputeStorage = GCPComputeStorage; 14 | this.GCStorage = GCStorage; 15 | } 16 | } 17 | 18 | class GoogleCompute { 19 | create(params) { 20 | return new Promise((resolve, reject) => { 21 | if (params) { 22 | resolve(this.respObj(params)); 23 | } 24 | reject("error"); 25 | }); 26 | } 27 | 28 | list(params) { 29 | return new Promise((resolve, reject) => { 30 | if (params) { 31 | resolve(this.respArr(params)); 32 | } 33 | reject("error"); 34 | }); 35 | } 36 | 37 | start(params) { 38 | return new Promise((resolve, reject) => { 39 | if (params) { 40 | resolve([ 41 | { 42 | id: "operation-1500210015617-5546edd11bfe9-3597d10f-27280f22" 43 | } 44 | ]); 45 | } 46 | reject("error"); 47 | }); 48 | } 49 | 50 | stop(params) { 51 | return new Promise((resolve, reject) => { 52 | if (params) { 53 | resolve([ 54 | { 55 | metadata: { 56 | id: "operation-1500210015617-5546edd11bfe9-3597d10f-27280f22" 57 | } 58 | } 59 | ]); 60 | } 61 | reject("error"); 62 | }); 63 | } 64 | 65 | reboot(params) { 66 | return new Promise((resolve, reject) => { 67 | if (params) { 68 | resolve([ 69 | { 70 | id: "operation-1500210015617-5546edd11bfe9-3597d10f-27280f22" 71 | } 72 | ]); 73 | } 74 | reject("error"); 75 | }); 76 | } 77 | 78 | destroy(params) { 79 | return new Promise((resolve, reject) => { 80 | if (params) { 81 | resolve([ 82 | {}, 83 | { 84 | kind: "compute#operation" 85 | } 86 | ]); 87 | } 88 | reject("error"); 89 | }); 90 | } 91 | 92 | respObj(paramsb) { 93 | return {}; 94 | } 95 | 96 | respArr(params) { 97 | return []; 98 | } 99 | } 100 | 101 | class GCD { 102 | createItem(params) { 103 | return new Promise((resolve, reject) => { 104 | if (params) { 105 | resolve([ 106 | { 107 | indexUpdates: 5 108 | } 109 | ]); 110 | } 111 | reject("error"); 112 | }); 113 | } 114 | 115 | deleteItem(params) { 116 | return new Promise((resolve, reject) => { 117 | if (params) { 118 | resolve([ 119 | { 120 | indexUpdates: 0 121 | } 122 | ]); 123 | } 124 | reject("error"); 125 | }); 126 | } 127 | 128 | updateItem(params) { 129 | return new Promise((resolve, reject) => { 130 | if (params) { 131 | resolve([ 132 | { 133 | indexUpdates: 3 134 | } 135 | ]); 136 | } 137 | reject("error"); 138 | }); 139 | } 140 | 141 | getQuery(params) { 142 | if (params) { 143 | cb(null, { 144 | service: { 145 | serviceName: "ecs-simple-service" 146 | } 147 | }); 148 | } else { 149 | cb(true, null); 150 | } 151 | } 152 | 153 | query(params) { 154 | return new Promise((resolve, reject) => { 155 | if (params) { 156 | resolve(this.respArr(params)); 157 | } 158 | reject("error"); 159 | }); 160 | } 161 | 162 | respObj(params) { 163 | return {}; 164 | } 165 | 166 | respArr(params) { 167 | return []; 168 | } 169 | } 170 | 171 | class GooogleDNS { 172 | createZone(params) { 173 | return new Promise((resolve, reject) => { 174 | if (params) { 175 | resolve(this.respObj(params)); 176 | } 177 | reject("error"); 178 | }); 179 | } 180 | 181 | createZone(params) { 182 | return new Promise((resolve, reject) => { 183 | if (params) { 184 | resolve(this.respObj(params)); 185 | } 186 | reject("error"); 187 | }); 188 | } 189 | 190 | listZones(params) { 191 | return new Promise((resolve, reject) => { 192 | if (params) { 193 | resolve(this.respObj(params)); 194 | } 195 | reject("error"); 196 | }); 197 | } 198 | 199 | record(params) { 200 | return new Promise((resolve, reject) => { 201 | if (params) { 202 | resolve(this.respObj(params)); 203 | } 204 | reject("error"); 205 | }); 206 | } 207 | 208 | changeRecordSets(params) { 209 | return new Promise((resolve, reject) => { 210 | if (params) { 211 | resolve(this.respObj(params)); 212 | } 213 | reject("error"); 214 | }); 215 | } 216 | 217 | respObj(paramsb) { 218 | return {}; 219 | } 220 | 221 | respArr(params) { 222 | return []; 223 | } 224 | } 225 | 226 | class GCStorage { 227 | createBucket(params) { 228 | return new Promise((resolve, reject) => { 229 | if (params) { 230 | resolve({ Location: "http://ncbucketcr.s3.amazonaws.com/" }); 231 | } 232 | reject("error"); 233 | }); 234 | } 235 | 236 | deleteBucket(params) { 237 | return new Promise((resolve, reject) => { 238 | if (params) { 239 | resolve(this.respObj(params)); 240 | } 241 | reject("BucketNotEmpty: The bucket you tried to delete is not empty"); 242 | }); 243 | } 244 | 245 | createMultipartUpload(params) { 246 | return new Promise((resolve, reject) => { 247 | if (params) { 248 | resolve({ 249 | UploadId: "e1jh1da1", 250 | Bucket: "ncbucketcr", 251 | Key: "largeobject" 252 | }); 253 | } 254 | reject("Error"); 255 | }); 256 | } 257 | 258 | listBuckets(params) { 259 | return new Promise((resolve, reject) => { 260 | if (params) { 261 | resolve({ 262 | Buckets: ["ncbucketcr"], 263 | Bucket: "ncbucketcr" 264 | }); 265 | } 266 | reject("Error"); 267 | }); 268 | } 269 | 270 | upload(params) { 271 | return new Promise((resolve, reject) => { 272 | if (params) { 273 | resolve({ 274 | Location: "https://ncbucketcr.s3.us-west-2.amazonaws.com/key", 275 | Buckets: ["ncbucketcr"], 276 | Bucket: "ncbucketcr" 277 | }); 278 | } 279 | reject("Error"); 280 | }); 281 | } 282 | 283 | respObj(params) { 284 | if (params) cb(null, {}); 285 | else cb(true, null); 286 | } 287 | 288 | respArr(params) { 289 | if (params) { 290 | cb(null, []); 291 | } else { 292 | cb(true, null); 293 | } 294 | } 295 | } 296 | 297 | class GCPComputeStorage { 298 | create(params) { 299 | return new Promise((resolve, reject) => { 300 | if (params) { 301 | resolve({ Location: "http://ncbucketcr.s3.amazonaws.com/" }); 302 | } 303 | reject("Error"); 304 | }); 305 | } 306 | 307 | delete(params) { 308 | return new Promise((resolve, reject) => { 309 | if (params) { 310 | resolve({ Location: "http://ncbucketcr.s3.amazonaws.com/" }); 311 | } 312 | reject("BucketNotEmpty: The bucket you tried to delete is not empty"); 313 | }); 314 | } 315 | 316 | list(params) { 317 | return new Promise((resolve, reject) => { 318 | if (params) { 319 | resolve({ 320 | UploadId: "e1jh1da1", 321 | Bucket: "ncbucketcr", 322 | Key: "largeobject" 323 | }); 324 | } 325 | reject("Error"); 326 | }); 327 | } 328 | 329 | upload(params) { 330 | return new Promise((resolve, reject) => { 331 | if (params) { 332 | resolve({ 333 | Buckets: ["ncbucketcr"], 334 | Bucket: "ncbucketcr" 335 | }); 336 | } 337 | reject("Error"); 338 | }); 339 | } 340 | 341 | respObj(params) { 342 | if (params) cb(null, {}); 343 | else cb(true, null); 344 | } 345 | 346 | respArr(params) { 347 | if (params) { 348 | cb(null, []); 349 | } else { 350 | cb(true, null); 351 | } 352 | } 353 | } 354 | 355 | module.exports = new GcpMockSdk(); 356 | -------------------------------------------------------------------------------- /test/network/DNS.js: -------------------------------------------------------------------------------- 1 | const chai = require("chai"); 2 | const assert = chai.assert; 3 | const gcpPlugin = require("../../gcp"); 4 | const gcpSDk = require("../gcp-mock"); 5 | 6 | const options = { 7 | projectId: "", 8 | keyFilename: "" 9 | }; 10 | 11 | const ncGcpPlugin = new gcpPlugin(options, gcpSDk); 12 | const dns = ncGcpPlugin.dns(options); 13 | 14 | describe("GCP DNS", () => { 15 | it("should Create a managed zone", done => { 16 | const params = { 17 | zoneName: "us-central1-a", 18 | config: "" 19 | }; 20 | dns 21 | .createZone(params) 22 | .then(res => { 23 | assert.typeOf(res, "object"); 24 | done(); 25 | }) 26 | .catch(err => { 27 | console.log("Err", err); 28 | }); 29 | }); 30 | 31 | it("should Delete a managed zone", done => { 32 | const params = { 33 | zoneName: "us-central1-a", 34 | config: "" 35 | }; 36 | dns 37 | .deleteZone(params) 38 | .then(res => { 39 | assert.typeOf(res, "object"); 40 | done(); 41 | }) 42 | .catch(err => { 43 | console.log("Err", err); 44 | }); 45 | }); 46 | 47 | it("should list all managed zone", done => { 48 | const params = { 49 | zoneName: "us-central1-a", 50 | config: "" 51 | }; 52 | dns 53 | .listZones() 54 | .then(res => { 55 | assert.typeOf(res, "object"); 56 | done(); 57 | }) 58 | .catch(err => { 59 | console.log("Err", err); 60 | }); 61 | }); 62 | 63 | it("should get record", done => { 64 | const params = { 65 | name: "", 66 | data: "" 67 | }; 68 | dns 69 | .record(params) 70 | .then(res => { 71 | assert.typeOf(res, "object"); 72 | done(); 73 | }) 74 | .catch(err => { 75 | console.log("Err", err); 76 | }); 77 | }); 78 | 79 | it("should change resource records", done => { 80 | const params = { 81 | zoneId: "", 82 | record: "", 83 | action: "", 84 | data: "" 85 | }; 86 | dns 87 | .changeRecordSets(params) 88 | .then(res => { 89 | assert.typeOf(res, "object"); 90 | done(); 91 | }) 92 | .catch(err => { 93 | console.log("Err", err); 94 | }); 95 | }); 96 | }); 97 | -------------------------------------------------------------------------------- /test/storage/cloud-storage.js: -------------------------------------------------------------------------------- 1 | const chai = require("chai"); 2 | const assert = chai.assert; 3 | const gcpPlugin = require("../../gcp"); 4 | const gcpSDk = require("../gcp-mock"); 5 | 6 | const options = { 7 | projectId: "", 8 | keyFilename: "" 9 | }; 10 | 11 | const ncGcpPlugin = new gcpPlugin(options, gcpSDk); 12 | const gceStorage = ncGcpPlugin.storage(); 13 | 14 | describe("Google/GCP storage", () => { 15 | before(() => {}); 16 | 17 | it("should create peristent disk", done => { 18 | const params = {}; 19 | 20 | gceStorage.create(params).then(res => { 21 | assert.equal(typeof res, "object"); 22 | }); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/storage/object-storage.js: -------------------------------------------------------------------------------- 1 | const chai = require("chai"); 2 | const assert = chai.assert; 3 | const gcpPlugin = require("../../gcp"); 4 | const gcpSDk = require("../gcp-mock"); 5 | 6 | const options = { 7 | projectId: "", 8 | keyFilename: "" 9 | }; 10 | 11 | const ncGcpPlugin = new gcpPlugin(options, gcpSDk); 12 | const bucket = ncGcpPlugin.bucket({ bucketName: "ncbucketcr" }); 13 | 14 | describe("Google/GCP object storage", () => { 15 | it("should create bucket", done => { 16 | const params = { 17 | bucketName: "ubuntu-httpx", 18 | metaData: { 19 | location: "US-CENTRAL1", 20 | regional: true 21 | } 22 | }; 23 | 24 | bucket.create(params).then(res => { 25 | console.log(res); 26 | // assert.equal(res.Bucket.Id, 'ncbucketcr'); 27 | }); 28 | }); 29 | }); 30 | --------------------------------------------------------------------------------