├── .gitignore ├── README.md ├── docs └── example.toml ├── export.js ├── lib.js ├── package-lock.json ├── package.json └── test ├── test.db └── tests.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | private 3 | kv.db 4 | test/test.db 5 | test.db -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cloudflare-workers-kv-export 2 | Export your Cloudflare Workers KV namespaces to sqlite for querying 3 | 4 | Helpful if you need to explore your KV data with SQL, such as joining, extracting JSON values etc. 5 | 6 | ## Installation 7 | `npm install` 8 | 9 | ## Usage 10 | `Usage: node export ` 11 | 12 | Sample config.toml 13 | ``` 14 | account_id = "xxx" 15 | auth_email = "john@example.com" 16 | filename = "kv.db" 17 | 18 | # You can suppress values being written, such as if values are large 19 | kv-namespaces = [ 20 | { title = "NAMESPACE_1", id = "yyy" }, 21 | { title = "BIG_NAMESPACE_2", id = "zzz", values = "false" }, 22 | ] 23 | ``` 24 | 25 | Once you've exported your data, you can query in sqlite using the `json` function. 26 | 27 | For example: 28 | 29 | ``` 30 | SELECT DISTINCT json_extract(json(val), '$.subscriptions[0].bookId') as bookId 31 | FROM ACCOUNTS 32 | where bookId is not NULL 33 | ``` 34 | 35 | 36 | ## Features 37 | - Creates a table in a local sqlite db for each KV Namespace you specify in the toml 38 | - Paginates keys for namespaces with > 1000 keys 39 | - Upserts to support re-runs 40 | - Can get or supress retrieving the values 41 | -------------------------------------------------------------------------------- /docs/example.toml: -------------------------------------------------------------------------------- 1 | account_id = "xxx" 2 | auth_email = "john@example.com" 3 | filename = "kv.db" 4 | 5 | # You can suppress values being written, such as if values are large 6 | kv-namespaces = [ 7 | { title = "NAMESPACE_1", id = "yyy" }, 8 | { title = "BIG_NAMESPACE_2", id = "zzz", values = "false" }, 9 | ] -------------------------------------------------------------------------------- /export.js: -------------------------------------------------------------------------------- 1 | //GO 2 | const {ExportRunner} = require('./lib'); 3 | let runner = new ExportRunner(); 4 | runner.execute(process.argv) 5 | .then(res => console.log(res)) 6 | .catch(e => console.error(e)); 7 | -------------------------------------------------------------------------------- /lib.js: -------------------------------------------------------------------------------- 1 | 2 | class ExportRunner { 3 | constructor() {} 4 | 5 | parseConf(args) { 6 | try { 7 | console.debug("Parsing args..."); 8 | if (process.argv.length < 4 || !args[2] || !args[3]) { 9 | console.log("Usage: node index.js "); 10 | process.exit(1); 11 | } 12 | let configPath = args[2]; 13 | console.info(`Reading config from ${configPath}`); 14 | const fs = require('fs'); 15 | let contents = fs.readFileSync(configPath); 16 | console.info(`Parsing...`); 17 | const toml = require('toml'); 18 | let conf = toml.parse(contents); 19 | console.debug(JSON.stringify(conf, null, 2)); 20 | conf["api_key"] = args[3]; 21 | //console.debug(JSON.stringify(conf, null, 2)); 22 | console.debug("OK"); 23 | return conf; 24 | } catch (e) { 25 | console.error("Failed to initialize"); 26 | console.error(e); 27 | process.exit(1); 28 | } 29 | } 30 | 31 | validate(conf) { 32 | console.info("Validating..."); 33 | if (!conf["account_id"]) { 34 | console.error(`accountId required`); 35 | return false; 36 | } 37 | 38 | if (!conf["kv-namespaces"]) { 39 | console.error("kv-namespaces required"); 40 | return false; 41 | } 42 | 43 | let namespaces = conf["kv-namespaces"]; 44 | for (let namespace of namespaces) { 45 | if (!namespace.id) { 46 | console.error('id required on all namespace elements'); 47 | return false; 48 | } 49 | } 50 | 51 | if (!conf.filename) { 52 | const defaultFilename = "kv.db"; 53 | console.warn(`Sqlite file not found. Defaulting to ${defaultFilename}`); 54 | } 55 | console.debug("OK"); 56 | return conf; 57 | } 58 | 59 | async syncNamespace(namespace, destination) { 60 | try { 61 | let keys = await namespace.getKeys(); 62 | console.info(`${keys.length} keys to process...`); 63 | //TODO: parallelize in batches 64 | for (let key of keys) { 65 | try { 66 | let val = await namespace.getValue(key); 67 | await destination.sync(namespace, key, val); 68 | } catch (e) { 69 | console.warn(`Failed to write ${key}. Ignoring...`); 70 | console.warn(e); 71 | } 72 | } 73 | console.debug(`${namespace.title} complete`); 74 | } catch (e) { 75 | console.warn(`Failed to process namespace ${namespace.title}/${namespace.id}. Ignoring...`); 76 | console.warn(e.message); 77 | } 78 | } 79 | 80 | async execute(args) { 81 | let conf = this.parseConf(args); 82 | if (!this.validate(conf)) { 83 | return false; 84 | } 85 | let namespaces = conf["kv-namespaces"]; 86 | let destination = new SqliteDestination(conf.filename); 87 | destination.init(namespaces); 88 | 89 | let promises = []; 90 | for (let namespaceConf of namespaces) { 91 | console.info(`Processing ${namespaceConf.title}/${namespaceConf.id}...`); 92 | let namespace = new Namespace(conf["account_id"], namespaceConf.id, namespaceConf.title, namespaceConf.values, conf["auth_email"], conf["api_key"]); 93 | let p = this.syncNamespace(namespace, destination); 94 | promises.push(p); 95 | } 96 | await Promise.all(promises); 97 | await destination.close(); 98 | return "Export complete"; 99 | } 100 | } 101 | 102 | /** 103 | * A Workers KV namespace 104 | */ 105 | class Namespace { 106 | 107 | constructor(accountId, id, title, values, email, apiKey, axiosImpl) { 108 | this.accountId = accountId; 109 | this.id = id; 110 | this.title = title; 111 | this.email = email; 112 | this.values = values; 113 | this.apiKey = apiKey; 114 | this.baseUrl = `https://api.cloudflare.com/client/v4/accounts/${accountId}`; 115 | this.axios = axiosImpl || require('axios'); 116 | } 117 | 118 | async getKeys() { 119 | 120 | let cursor = ""; 121 | let keys = []; 122 | let batchKeys = null; 123 | let limit = 1000; 124 | do { 125 | let listKeysUrl = `${this.baseUrl}/storage/kv/namespaces/${this.id}/keys?${limit}=1000&cursor=${cursor}`; 126 | console.info(`Getting keys from ${listKeysUrl}...`); 127 | let keysResult = await this.axios.get(listKeysUrl, { 128 | headers: { 129 | "X-Auth-Email": this.email, 130 | "X-Auth-Key": this.apiKey 131 | } 132 | }); 133 | // console.debug(JSON.stringify(keysResult.data), null, 2); 134 | // console.debug(JSON.stringify(keysResult.data.result_info), null, 2); 135 | cursor = keysResult.data.result_info.cursor; 136 | console.log("Cursor present. Will paginate..."); 137 | batchKeys = keysResult.data.result.map(item => item.name); 138 | keys = keys.concat(batchKeys); 139 | console.log(`Current keys=${keys.length}`); 140 | } while (cursor != null && batchKeys.length === limit) 141 | console.info(`Got ${keys.length} keys`); 142 | console.debug("OK"); 143 | return keys; 144 | } 145 | 146 | async getValue(key) { 147 | if (this.values == "false") { 148 | console.debug("values flag is false. Skipping values"); 149 | return null; 150 | } 151 | console.debug(`Getting value for ${key}...`) 152 | let getValueUrl = `${this.baseUrl}/storage/kv/namespaces/${this.id}/values/${key}`; 153 | console.info(getValueUrl); 154 | let valueResult = await this.axios.get(getValueUrl, { 155 | headers: { 156 | "X-Auth-Email": this.email, 157 | "X-Auth-Key": this.apiKey 158 | }, 159 | responseType: "text" 160 | }); 161 | // console.debug(JSON.stringify(valueResult.data, null, 2)); 162 | // process.exit(0); 163 | let val = valueResult.data; 164 | console.debug("OK"); 165 | return JSON.stringify(val, null, 2); 166 | } 167 | } 168 | 169 | /** 170 | * Destination implemented as a Sqlite database 171 | */ 172 | class SqliteDestination { 173 | constructor(filename) { 174 | this.filename = filename; 175 | this.db = null; 176 | } 177 | 178 | init(namespaces) { 179 | const fs = require('fs'); 180 | let exists = false; 181 | if (!fs.existsSync(this.filename)) { 182 | console.info(`${this.filename} does not exist. Will create...`); 183 | } else { 184 | console.info(`${this.filename} exists. Will open...`); 185 | exists = true; 186 | } 187 | try { 188 | //Connect or create 189 | const sqlite3 = require('sqlite3').verbose(); 190 | this.db = new sqlite3.Database(this.filename, (e) => { 191 | if (e) { 192 | console.error(e); 193 | } 194 | }); 195 | console.info(`Database ${exists ? "opened" : "created" } at ${this.filename}`); 196 | this.db.serialize(() => { 197 | //sqlite: Create tables if not exist 198 | for (let namespace of namespaces) { 199 | console.info(`Creating table ${namespace.title} if not exist (id: ${namespace.id})`); 200 | this.db.run(`CREATE TABLE IF NOT EXISTS ${namespace.title} (key TEXT CONSTRAINT PK_key PRIMARY KEY, val TEXT)`); 201 | } 202 | }); 203 | } catch (e) { 204 | console.error("Failed to init db"); 205 | console.error(e); 206 | } finally { 207 | 208 | } 209 | } 210 | async sync(namespace, key, val) { 211 | let table = namespace.title; 212 | console.debug(`Writing ${table} --> ${key}:${val}`); 213 | //TODO: Make the key primary key so things get updated 214 | var stmt = this.db.prepare(`INSERT OR REPLACE INTO ${table} (key, val) VALUES (?,?)`); 215 | stmt.run(key, val); 216 | return new Promise((resolve, reject) => { 217 | stmt.finalize(e => { 218 | if (e) { 219 | reject(e); 220 | } else { 221 | console.debug("Written"); 222 | resolve(); 223 | } 224 | }); 225 | }) 226 | } 227 | 228 | async close() { 229 | return new Promise((resolve, reject) => { 230 | if (this.db) { 231 | this.db.close(e => { 232 | if (e) { 233 | reject(e); 234 | } else { 235 | console.info("DB closed"); 236 | resolve() 237 | } 238 | }); 239 | this.db = null; 240 | } else { 241 | resolve(); 242 | } 243 | }) 244 | 245 | } 246 | } 247 | module.exports = {SqliteDestination, Namespace, ExportRunner}; 248 | 249 | 250 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workerskv-export", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "ajv": { 13 | "version": "6.10.2", 14 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", 15 | "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", 16 | "requires": { 17 | "fast-deep-equal": "^2.0.1", 18 | "fast-json-stable-stringify": "^2.0.0", 19 | "json-schema-traverse": "^0.4.1", 20 | "uri-js": "^4.2.2" 21 | } 22 | }, 23 | "ansi-colors": { 24 | "version": "3.2.3", 25 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", 26 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==" 27 | }, 28 | "ansi-regex": { 29 | "version": "2.1.1", 30 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 31 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 32 | }, 33 | "ansi-styles": { 34 | "version": "3.2.1", 35 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 36 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 37 | "requires": { 38 | "color-convert": "^1.9.0" 39 | } 40 | }, 41 | "aproba": { 42 | "version": "1.2.0", 43 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 44 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 45 | }, 46 | "are-we-there-yet": { 47 | "version": "1.1.5", 48 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", 49 | "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", 50 | "requires": { 51 | "delegates": "^1.0.0", 52 | "readable-stream": "^2.0.6" 53 | } 54 | }, 55 | "argparse": { 56 | "version": "1.0.10", 57 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 58 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 59 | "requires": { 60 | "sprintf-js": "~1.0.2" 61 | } 62 | }, 63 | "asn1": { 64 | "version": "0.2.4", 65 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", 66 | "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", 67 | "requires": { 68 | "safer-buffer": "~2.1.0" 69 | } 70 | }, 71 | "assert-plus": { 72 | "version": "1.0.0", 73 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 74 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 75 | }, 76 | "asynckit": { 77 | "version": "0.4.0", 78 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 79 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 80 | }, 81 | "aws-sign2": { 82 | "version": "0.7.0", 83 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 84 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 85 | }, 86 | "aws4": { 87 | "version": "1.9.0", 88 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.0.tgz", 89 | "integrity": "sha512-Uvq6hVe90D0B2WEnUqtdgY1bATGz3mw33nH9Y+dmA+w5DHvUmBgkr5rM/KCHpCsiFNRUfokW/szpPPgMK2hm4A==" 90 | }, 91 | "axios": { 92 | "version": "0.19.0", 93 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz", 94 | "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==", 95 | "requires": { 96 | "follow-redirects": "1.5.10", 97 | "is-buffer": "^2.0.2" 98 | } 99 | }, 100 | "balanced-match": { 101 | "version": "1.0.0", 102 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 103 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 104 | }, 105 | "bcrypt-pbkdf": { 106 | "version": "1.0.2", 107 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", 108 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", 109 | "requires": { 110 | "tweetnacl": "^0.14.3" 111 | } 112 | }, 113 | "brace-expansion": { 114 | "version": "1.1.11", 115 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 116 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 117 | "requires": { 118 | "balanced-match": "^1.0.0", 119 | "concat-map": "0.0.1" 120 | } 121 | }, 122 | "browser-stdout": { 123 | "version": "1.3.1", 124 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 125 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==" 126 | }, 127 | "camelcase": { 128 | "version": "5.3.1", 129 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 130 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" 131 | }, 132 | "caseless": { 133 | "version": "0.12.0", 134 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 135 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 136 | }, 137 | "chalk": { 138 | "version": "2.4.2", 139 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 140 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 141 | "requires": { 142 | "ansi-styles": "^3.2.1", 143 | "escape-string-regexp": "^1.0.5", 144 | "supports-color": "^5.3.0" 145 | }, 146 | "dependencies": { 147 | "supports-color": { 148 | "version": "5.5.0", 149 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 150 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 151 | "requires": { 152 | "has-flag": "^3.0.0" 153 | } 154 | } 155 | } 156 | }, 157 | "chownr": { 158 | "version": "1.1.3", 159 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.3.tgz", 160 | "integrity": "sha512-i70fVHhmV3DtTl6nqvZOnIjbY0Pe4kAUjwHj8z0zAdgBtYrJyYwLKCCuRBQ5ppkyL0AkN7HKRnETdmdp1zqNXw==" 161 | }, 162 | "cliui": { 163 | "version": "5.0.0", 164 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", 165 | "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", 166 | "requires": { 167 | "string-width": "^3.1.0", 168 | "strip-ansi": "^5.2.0", 169 | "wrap-ansi": "^5.1.0" 170 | }, 171 | "dependencies": { 172 | "ansi-regex": { 173 | "version": "4.1.0", 174 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 175 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 176 | }, 177 | "is-fullwidth-code-point": { 178 | "version": "2.0.0", 179 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 180 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 181 | }, 182 | "string-width": { 183 | "version": "3.1.0", 184 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 185 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 186 | "requires": { 187 | "emoji-regex": "^7.0.1", 188 | "is-fullwidth-code-point": "^2.0.0", 189 | "strip-ansi": "^5.1.0" 190 | } 191 | }, 192 | "strip-ansi": { 193 | "version": "5.2.0", 194 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 195 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 196 | "requires": { 197 | "ansi-regex": "^4.1.0" 198 | } 199 | } 200 | } 201 | }, 202 | "code-point-at": { 203 | "version": "1.1.0", 204 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 205 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 206 | }, 207 | "color-convert": { 208 | "version": "1.9.3", 209 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 210 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 211 | "requires": { 212 | "color-name": "1.1.3" 213 | } 214 | }, 215 | "color-name": { 216 | "version": "1.1.3", 217 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 218 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 219 | }, 220 | "combined-stream": { 221 | "version": "1.0.8", 222 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 223 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 224 | "requires": { 225 | "delayed-stream": "~1.0.0" 226 | } 227 | }, 228 | "concat-map": { 229 | "version": "0.0.1", 230 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 231 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 232 | }, 233 | "console-control-strings": { 234 | "version": "1.1.0", 235 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 236 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 237 | }, 238 | "core-util-is": { 239 | "version": "1.0.2", 240 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 241 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 242 | }, 243 | "dashdash": { 244 | "version": "1.14.1", 245 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 246 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 247 | "requires": { 248 | "assert-plus": "^1.0.0" 249 | } 250 | }, 251 | "debug": { 252 | "version": "3.2.6", 253 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", 254 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", 255 | "requires": { 256 | "ms": "^2.1.1" 257 | } 258 | }, 259 | "decamelize": { 260 | "version": "1.2.0", 261 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 262 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 263 | }, 264 | "deep-extend": { 265 | "version": "0.6.0", 266 | "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", 267 | "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" 268 | }, 269 | "define-properties": { 270 | "version": "1.1.3", 271 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", 272 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", 273 | "requires": { 274 | "object-keys": "^1.0.12" 275 | } 276 | }, 277 | "delayed-stream": { 278 | "version": "1.0.0", 279 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 280 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 281 | }, 282 | "delegates": { 283 | "version": "1.0.0", 284 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 285 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 286 | }, 287 | "detect-libc": { 288 | "version": "1.0.3", 289 | "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", 290 | "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" 291 | }, 292 | "diff": { 293 | "version": "3.5.0", 294 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 295 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" 296 | }, 297 | "ecc-jsbn": { 298 | "version": "0.1.2", 299 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", 300 | "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", 301 | "requires": { 302 | "jsbn": "~0.1.0", 303 | "safer-buffer": "^2.1.0" 304 | } 305 | }, 306 | "emoji-regex": { 307 | "version": "7.0.3", 308 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", 309 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" 310 | }, 311 | "es-abstract": { 312 | "version": "1.16.3", 313 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.16.3.tgz", 314 | "integrity": "sha512-WtY7Fx5LiOnSYgF5eg/1T+GONaGmpvpPdCpSnYij+U2gDTL0UPfWrhDw7b2IYb+9NQJsYpCA0wOQvZfsd6YwRw==", 315 | "requires": { 316 | "es-to-primitive": "^1.2.1", 317 | "function-bind": "^1.1.1", 318 | "has": "^1.0.3", 319 | "has-symbols": "^1.0.1", 320 | "is-callable": "^1.1.4", 321 | "is-regex": "^1.0.4", 322 | "object-inspect": "^1.7.0", 323 | "object-keys": "^1.1.1", 324 | "string.prototype.trimleft": "^2.1.0", 325 | "string.prototype.trimright": "^2.1.0" 326 | } 327 | }, 328 | "es-to-primitive": { 329 | "version": "1.2.1", 330 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", 331 | "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", 332 | "requires": { 333 | "is-callable": "^1.1.4", 334 | "is-date-object": "^1.0.1", 335 | "is-symbol": "^1.0.2" 336 | } 337 | }, 338 | "escape-string-regexp": { 339 | "version": "1.0.5", 340 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 341 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 342 | }, 343 | "esprima": { 344 | "version": "4.0.1", 345 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 346 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" 347 | }, 348 | "extend": { 349 | "version": "3.0.2", 350 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 351 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 352 | }, 353 | "extsprintf": { 354 | "version": "1.3.0", 355 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 356 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 357 | }, 358 | "fast-deep-equal": { 359 | "version": "2.0.1", 360 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", 361 | "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" 362 | }, 363 | "fast-json-stable-stringify": { 364 | "version": "2.0.0", 365 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 366 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 367 | }, 368 | "find-up": { 369 | "version": "3.0.0", 370 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", 371 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", 372 | "requires": { 373 | "locate-path": "^3.0.0" 374 | } 375 | }, 376 | "flat": { 377 | "version": "4.1.0", 378 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", 379 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", 380 | "requires": { 381 | "is-buffer": "~2.0.3" 382 | } 383 | }, 384 | "follow-redirects": { 385 | "version": "1.5.10", 386 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 387 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 388 | "requires": { 389 | "debug": "=3.1.0" 390 | }, 391 | "dependencies": { 392 | "debug": { 393 | "version": "3.1.0", 394 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 395 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 396 | "requires": { 397 | "ms": "2.0.0" 398 | } 399 | }, 400 | "ms": { 401 | "version": "2.0.0", 402 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 403 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 404 | } 405 | } 406 | }, 407 | "forever-agent": { 408 | "version": "0.6.1", 409 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 410 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 411 | }, 412 | "form-data": { 413 | "version": "2.3.3", 414 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", 415 | "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", 416 | "requires": { 417 | "asynckit": "^0.4.0", 418 | "combined-stream": "^1.0.6", 419 | "mime-types": "^2.1.12" 420 | } 421 | }, 422 | "fs-minipass": { 423 | "version": "1.2.7", 424 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", 425 | "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", 426 | "requires": { 427 | "minipass": "^2.6.0" 428 | } 429 | }, 430 | "fs.realpath": { 431 | "version": "1.0.0", 432 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 433 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 434 | }, 435 | "function-bind": { 436 | "version": "1.1.1", 437 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 438 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 439 | }, 440 | "gauge": { 441 | "version": "2.7.4", 442 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 443 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 444 | "requires": { 445 | "aproba": "^1.0.3", 446 | "console-control-strings": "^1.0.0", 447 | "has-unicode": "^2.0.0", 448 | "object-assign": "^4.1.0", 449 | "signal-exit": "^3.0.0", 450 | "string-width": "^1.0.1", 451 | "strip-ansi": "^3.0.1", 452 | "wide-align": "^1.1.0" 453 | } 454 | }, 455 | "get-caller-file": { 456 | "version": "2.0.5", 457 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 458 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" 459 | }, 460 | "getpass": { 461 | "version": "0.1.7", 462 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 463 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 464 | "requires": { 465 | "assert-plus": "^1.0.0" 466 | } 467 | }, 468 | "glob": { 469 | "version": "7.1.6", 470 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 471 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 472 | "requires": { 473 | "fs.realpath": "^1.0.0", 474 | "inflight": "^1.0.4", 475 | "inherits": "2", 476 | "minimatch": "^3.0.4", 477 | "once": "^1.3.0", 478 | "path-is-absolute": "^1.0.0" 479 | } 480 | }, 481 | "growl": { 482 | "version": "1.10.5", 483 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 484 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==" 485 | }, 486 | "har-schema": { 487 | "version": "2.0.0", 488 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 489 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 490 | }, 491 | "har-validator": { 492 | "version": "5.1.3", 493 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", 494 | "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", 495 | "requires": { 496 | "ajv": "^6.5.5", 497 | "har-schema": "^2.0.0" 498 | } 499 | }, 500 | "has": { 501 | "version": "1.0.3", 502 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 503 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 504 | "requires": { 505 | "function-bind": "^1.1.1" 506 | } 507 | }, 508 | "has-flag": { 509 | "version": "3.0.0", 510 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 511 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" 512 | }, 513 | "has-symbols": { 514 | "version": "1.0.1", 515 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", 516 | "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==" 517 | }, 518 | "has-unicode": { 519 | "version": "2.0.1", 520 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 521 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 522 | }, 523 | "he": { 524 | "version": "1.2.0", 525 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", 526 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" 527 | }, 528 | "http-signature": { 529 | "version": "1.2.0", 530 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 531 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 532 | "requires": { 533 | "assert-plus": "^1.0.0", 534 | "jsprim": "^1.2.2", 535 | "sshpk": "^1.7.0" 536 | } 537 | }, 538 | "iconv-lite": { 539 | "version": "0.4.24", 540 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 541 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 542 | "requires": { 543 | "safer-buffer": ">= 2.1.2 < 3" 544 | } 545 | }, 546 | "ignore-walk": { 547 | "version": "3.0.3", 548 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", 549 | "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", 550 | "requires": { 551 | "minimatch": "^3.0.4" 552 | } 553 | }, 554 | "inflight": { 555 | "version": "1.0.6", 556 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 557 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 558 | "requires": { 559 | "once": "^1.3.0", 560 | "wrappy": "1" 561 | } 562 | }, 563 | "inherits": { 564 | "version": "2.0.4", 565 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 566 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 567 | }, 568 | "ini": { 569 | "version": "1.3.5", 570 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", 571 | "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" 572 | }, 573 | "is-buffer": { 574 | "version": "2.0.4", 575 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", 576 | "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" 577 | }, 578 | "is-callable": { 579 | "version": "1.1.4", 580 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", 581 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==" 582 | }, 583 | "is-date-object": { 584 | "version": "1.0.1", 585 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", 586 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=" 587 | }, 588 | "is-fullwidth-code-point": { 589 | "version": "1.0.0", 590 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 591 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 592 | "requires": { 593 | "number-is-nan": "^1.0.0" 594 | } 595 | }, 596 | "is-regex": { 597 | "version": "1.0.4", 598 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", 599 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", 600 | "requires": { 601 | "has": "^1.0.1" 602 | } 603 | }, 604 | "is-symbol": { 605 | "version": "1.0.3", 606 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", 607 | "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", 608 | "requires": { 609 | "has-symbols": "^1.0.1" 610 | } 611 | }, 612 | "is-typedarray": { 613 | "version": "1.0.0", 614 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 615 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 616 | }, 617 | "isarray": { 618 | "version": "1.0.0", 619 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 620 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 621 | }, 622 | "isexe": { 623 | "version": "2.0.0", 624 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 625 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 626 | }, 627 | "isstream": { 628 | "version": "0.1.2", 629 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 630 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 631 | }, 632 | "js-yaml": { 633 | "version": "3.13.1", 634 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", 635 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", 636 | "requires": { 637 | "argparse": "^1.0.7", 638 | "esprima": "^4.0.0" 639 | } 640 | }, 641 | "jsbn": { 642 | "version": "0.1.1", 643 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 644 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" 645 | }, 646 | "json-schema": { 647 | "version": "0.2.3", 648 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 649 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 650 | }, 651 | "json-schema-traverse": { 652 | "version": "0.4.1", 653 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", 654 | "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" 655 | }, 656 | "json-stringify-safe": { 657 | "version": "5.0.1", 658 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 659 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 660 | }, 661 | "jsprim": { 662 | "version": "1.4.1", 663 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 664 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 665 | "requires": { 666 | "assert-plus": "1.0.0", 667 | "extsprintf": "1.3.0", 668 | "json-schema": "0.2.3", 669 | "verror": "1.10.0" 670 | } 671 | }, 672 | "locate-path": { 673 | "version": "3.0.0", 674 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", 675 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", 676 | "requires": { 677 | "p-locate": "^3.0.0", 678 | "path-exists": "^3.0.0" 679 | } 680 | }, 681 | "lodash": { 682 | "version": "4.17.15", 683 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 684 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 685 | }, 686 | "log-symbols": { 687 | "version": "2.2.0", 688 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", 689 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", 690 | "requires": { 691 | "chalk": "^2.0.1" 692 | } 693 | }, 694 | "mime-db": { 695 | "version": "1.42.0", 696 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.42.0.tgz", 697 | "integrity": "sha512-UbfJCR4UAVRNgMpfImz05smAXK7+c+ZntjaA26ANtkXLlOe947Aag5zdIcKQULAiF9Cq4WxBi9jUs5zkA84bYQ==" 698 | }, 699 | "mime-types": { 700 | "version": "2.1.25", 701 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.25.tgz", 702 | "integrity": "sha512-5KhStqB5xpTAeGqKBAMgwaYMnQik7teQN4IAzC7npDv6kzeU6prfkR67bc87J1kWMPGkoaZSq1npmexMgkmEVg==", 703 | "requires": { 704 | "mime-db": "1.42.0" 705 | } 706 | }, 707 | "minimatch": { 708 | "version": "3.0.4", 709 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 710 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 711 | "requires": { 712 | "brace-expansion": "^1.1.7" 713 | } 714 | }, 715 | "minimist": { 716 | "version": "0.0.8", 717 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 718 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 719 | }, 720 | "minipass": { 721 | "version": "2.9.0", 722 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", 723 | "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", 724 | "requires": { 725 | "safe-buffer": "^5.1.2", 726 | "yallist": "^3.0.0" 727 | } 728 | }, 729 | "minizlib": { 730 | "version": "1.3.3", 731 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", 732 | "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", 733 | "requires": { 734 | "minipass": "^2.9.0" 735 | } 736 | }, 737 | "mkdirp": { 738 | "version": "0.5.1", 739 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 740 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 741 | "requires": { 742 | "minimist": "0.0.8" 743 | } 744 | }, 745 | "mocha": { 746 | "version": "6.2.2", 747 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.2.tgz", 748 | "integrity": "sha512-FgDS9Re79yU1xz5d+C4rv1G7QagNGHZ+iXF81hO8zY35YZZcLEsJVfFolfsqKFWunATEvNzMK0r/CwWd/szO9A==", 749 | "requires": { 750 | "ansi-colors": "3.2.3", 751 | "browser-stdout": "1.3.1", 752 | "debug": "3.2.6", 753 | "diff": "3.5.0", 754 | "escape-string-regexp": "1.0.5", 755 | "find-up": "3.0.0", 756 | "glob": "7.1.3", 757 | "growl": "1.10.5", 758 | "he": "1.2.0", 759 | "js-yaml": "3.13.1", 760 | "log-symbols": "2.2.0", 761 | "minimatch": "3.0.4", 762 | "mkdirp": "0.5.1", 763 | "ms": "2.1.1", 764 | "node-environment-flags": "1.0.5", 765 | "object.assign": "4.1.0", 766 | "strip-json-comments": "2.0.1", 767 | "supports-color": "6.0.0", 768 | "which": "1.3.1", 769 | "wide-align": "1.1.3", 770 | "yargs": "13.3.0", 771 | "yargs-parser": "13.1.1", 772 | "yargs-unparser": "1.6.0" 773 | }, 774 | "dependencies": { 775 | "glob": { 776 | "version": "7.1.3", 777 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 778 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 779 | "requires": { 780 | "fs.realpath": "^1.0.0", 781 | "inflight": "^1.0.4", 782 | "inherits": "2", 783 | "minimatch": "^3.0.4", 784 | "once": "^1.3.0", 785 | "path-is-absolute": "^1.0.0" 786 | } 787 | }, 788 | "ms": { 789 | "version": "2.1.1", 790 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 791 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 792 | } 793 | } 794 | }, 795 | "ms": { 796 | "version": "2.1.2", 797 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 798 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 799 | }, 800 | "nan": { 801 | "version": "2.14.0", 802 | "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", 803 | "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" 804 | }, 805 | "needle": { 806 | "version": "2.4.0", 807 | "resolved": "https://registry.npmjs.org/needle/-/needle-2.4.0.tgz", 808 | "integrity": "sha512-4Hnwzr3mi5L97hMYeNl8wRW/Onhy4nUKR/lVemJ8gJedxxUyBLm9kkrDColJvoSfwi0jCNhD+xCdOtiGDQiRZg==", 809 | "requires": { 810 | "debug": "^3.2.6", 811 | "iconv-lite": "^0.4.4", 812 | "sax": "^1.2.4" 813 | } 814 | }, 815 | "node-environment-flags": { 816 | "version": "1.0.5", 817 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", 818 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", 819 | "requires": { 820 | "object.getownpropertydescriptors": "^2.0.3", 821 | "semver": "^5.7.0" 822 | } 823 | }, 824 | "node-pre-gyp": { 825 | "version": "0.11.0", 826 | "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", 827 | "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", 828 | "requires": { 829 | "detect-libc": "^1.0.2", 830 | "mkdirp": "^0.5.1", 831 | "needle": "^2.2.1", 832 | "nopt": "^4.0.1", 833 | "npm-packlist": "^1.1.6", 834 | "npmlog": "^4.0.2", 835 | "rc": "^1.2.7", 836 | "rimraf": "^2.6.1", 837 | "semver": "^5.3.0", 838 | "tar": "^4" 839 | } 840 | }, 841 | "nopt": { 842 | "version": "4.0.1", 843 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", 844 | "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", 845 | "requires": { 846 | "abbrev": "1", 847 | "osenv": "^0.1.4" 848 | } 849 | }, 850 | "npm-bundled": { 851 | "version": "1.1.1", 852 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", 853 | "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", 854 | "requires": { 855 | "npm-normalize-package-bin": "^1.0.1" 856 | } 857 | }, 858 | "npm-normalize-package-bin": { 859 | "version": "1.0.1", 860 | "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", 861 | "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" 862 | }, 863 | "npm-packlist": { 864 | "version": "1.4.7", 865 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.7.tgz", 866 | "integrity": "sha512-vAj7dIkp5NhieaGZxBJB8fF4R0078rqsmhJcAfXZ6O7JJhjhPK96n5Ry1oZcfLXgfun0GWTZPOxaEyqv8GBykQ==", 867 | "requires": { 868 | "ignore-walk": "^3.0.1", 869 | "npm-bundled": "^1.0.1" 870 | } 871 | }, 872 | "npmlog": { 873 | "version": "4.1.2", 874 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 875 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 876 | "requires": { 877 | "are-we-there-yet": "~1.1.2", 878 | "console-control-strings": "~1.1.0", 879 | "gauge": "~2.7.3", 880 | "set-blocking": "~2.0.0" 881 | } 882 | }, 883 | "number-is-nan": { 884 | "version": "1.0.1", 885 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 886 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 887 | }, 888 | "oauth-sign": { 889 | "version": "0.9.0", 890 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", 891 | "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" 892 | }, 893 | "object-assign": { 894 | "version": "4.1.1", 895 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 896 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 897 | }, 898 | "object-inspect": { 899 | "version": "1.7.0", 900 | "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", 901 | "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==" 902 | }, 903 | "object-keys": { 904 | "version": "1.1.1", 905 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 906 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" 907 | }, 908 | "object.assign": { 909 | "version": "4.1.0", 910 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", 911 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", 912 | "requires": { 913 | "define-properties": "^1.1.2", 914 | "function-bind": "^1.1.1", 915 | "has-symbols": "^1.0.0", 916 | "object-keys": "^1.0.11" 917 | } 918 | }, 919 | "object.getownpropertydescriptors": { 920 | "version": "2.0.3", 921 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", 922 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", 923 | "requires": { 924 | "define-properties": "^1.1.2", 925 | "es-abstract": "^1.5.1" 926 | } 927 | }, 928 | "once": { 929 | "version": "1.4.0", 930 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 931 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 932 | "requires": { 933 | "wrappy": "1" 934 | } 935 | }, 936 | "os-homedir": { 937 | "version": "1.0.2", 938 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 939 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 940 | }, 941 | "os-tmpdir": { 942 | "version": "1.0.2", 943 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 944 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 945 | }, 946 | "osenv": { 947 | "version": "0.1.5", 948 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 949 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 950 | "requires": { 951 | "os-homedir": "^1.0.0", 952 | "os-tmpdir": "^1.0.0" 953 | } 954 | }, 955 | "p-limit": { 956 | "version": "2.2.1", 957 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", 958 | "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", 959 | "requires": { 960 | "p-try": "^2.0.0" 961 | } 962 | }, 963 | "p-locate": { 964 | "version": "3.0.0", 965 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", 966 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", 967 | "requires": { 968 | "p-limit": "^2.0.0" 969 | } 970 | }, 971 | "p-try": { 972 | "version": "2.2.0", 973 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", 974 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" 975 | }, 976 | "path-exists": { 977 | "version": "3.0.0", 978 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 979 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 980 | }, 981 | "path-is-absolute": { 982 | "version": "1.0.1", 983 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 984 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 985 | }, 986 | "performance-now": { 987 | "version": "2.1.0", 988 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 989 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 990 | }, 991 | "process-nextick-args": { 992 | "version": "2.0.1", 993 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 994 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 995 | }, 996 | "psl": { 997 | "version": "1.6.0", 998 | "resolved": "https://registry.npmjs.org/psl/-/psl-1.6.0.tgz", 999 | "integrity": "sha512-SYKKmVel98NCOYXpkwUqZqh0ahZeeKfmisiLIcEZdsb+WbLv02g/dI5BUmZnIyOe7RzZtLax81nnb2HbvC2tzA==" 1000 | }, 1001 | "punycode": { 1002 | "version": "2.1.1", 1003 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", 1004 | "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" 1005 | }, 1006 | "qs": { 1007 | "version": "6.5.2", 1008 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1009 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1010 | }, 1011 | "rc": { 1012 | "version": "1.2.8", 1013 | "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", 1014 | "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", 1015 | "requires": { 1016 | "deep-extend": "^0.6.0", 1017 | "ini": "~1.3.0", 1018 | "minimist": "^1.2.0", 1019 | "strip-json-comments": "~2.0.1" 1020 | }, 1021 | "dependencies": { 1022 | "minimist": { 1023 | "version": "1.2.0", 1024 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", 1025 | "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" 1026 | } 1027 | } 1028 | }, 1029 | "readable-stream": { 1030 | "version": "2.3.6", 1031 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", 1032 | "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", 1033 | "requires": { 1034 | "core-util-is": "~1.0.0", 1035 | "inherits": "~2.0.3", 1036 | "isarray": "~1.0.0", 1037 | "process-nextick-args": "~2.0.0", 1038 | "safe-buffer": "~5.1.1", 1039 | "string_decoder": "~1.1.1", 1040 | "util-deprecate": "~1.0.1" 1041 | } 1042 | }, 1043 | "request": { 1044 | "version": "2.88.0", 1045 | "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", 1046 | "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", 1047 | "requires": { 1048 | "aws-sign2": "~0.7.0", 1049 | "aws4": "^1.8.0", 1050 | "caseless": "~0.12.0", 1051 | "combined-stream": "~1.0.6", 1052 | "extend": "~3.0.2", 1053 | "forever-agent": "~0.6.1", 1054 | "form-data": "~2.3.2", 1055 | "har-validator": "~5.1.0", 1056 | "http-signature": "~1.2.0", 1057 | "is-typedarray": "~1.0.0", 1058 | "isstream": "~0.1.2", 1059 | "json-stringify-safe": "~5.0.1", 1060 | "mime-types": "~2.1.19", 1061 | "oauth-sign": "~0.9.0", 1062 | "performance-now": "^2.1.0", 1063 | "qs": "~6.5.2", 1064 | "safe-buffer": "^5.1.2", 1065 | "tough-cookie": "~2.4.3", 1066 | "tunnel-agent": "^0.6.0", 1067 | "uuid": "^3.3.2" 1068 | } 1069 | }, 1070 | "require-directory": { 1071 | "version": "2.1.1", 1072 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1073 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1074 | }, 1075 | "require-main-filename": { 1076 | "version": "2.0.0", 1077 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", 1078 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" 1079 | }, 1080 | "rimraf": { 1081 | "version": "2.7.1", 1082 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", 1083 | "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", 1084 | "requires": { 1085 | "glob": "^7.1.3" 1086 | } 1087 | }, 1088 | "safe-buffer": { 1089 | "version": "5.1.2", 1090 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1091 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1092 | }, 1093 | "safer-buffer": { 1094 | "version": "2.1.2", 1095 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1096 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1097 | }, 1098 | "sax": { 1099 | "version": "1.2.4", 1100 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", 1101 | "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" 1102 | }, 1103 | "semver": { 1104 | "version": "5.7.1", 1105 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 1106 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 1107 | }, 1108 | "set-blocking": { 1109 | "version": "2.0.0", 1110 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1111 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1112 | }, 1113 | "signal-exit": { 1114 | "version": "3.0.2", 1115 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1116 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1117 | }, 1118 | "sprintf-js": { 1119 | "version": "1.0.3", 1120 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1121 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" 1122 | }, 1123 | "sqlite3": { 1124 | "version": "4.1.1", 1125 | "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-4.1.1.tgz", 1126 | "integrity": "sha512-CvT5XY+MWnn0HkbwVKJAyWEMfzpAPwnTiB3TobA5Mri44SrTovmmh499NPQP+gatkeOipqPlBLel7rn4E/PCQg==", 1127 | "requires": { 1128 | "nan": "^2.12.1", 1129 | "node-pre-gyp": "^0.11.0", 1130 | "request": "^2.87.0" 1131 | } 1132 | }, 1133 | "sshpk": { 1134 | "version": "1.16.1", 1135 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", 1136 | "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", 1137 | "requires": { 1138 | "asn1": "~0.2.3", 1139 | "assert-plus": "^1.0.0", 1140 | "bcrypt-pbkdf": "^1.0.0", 1141 | "dashdash": "^1.12.0", 1142 | "ecc-jsbn": "~0.1.1", 1143 | "getpass": "^0.1.1", 1144 | "jsbn": "~0.1.0", 1145 | "safer-buffer": "^2.0.2", 1146 | "tweetnacl": "~0.14.0" 1147 | } 1148 | }, 1149 | "string-width": { 1150 | "version": "1.0.2", 1151 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1152 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1153 | "requires": { 1154 | "code-point-at": "^1.0.0", 1155 | "is-fullwidth-code-point": "^1.0.0", 1156 | "strip-ansi": "^3.0.0" 1157 | } 1158 | }, 1159 | "string.prototype.trimleft": { 1160 | "version": "2.1.0", 1161 | "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.0.tgz", 1162 | "integrity": "sha512-FJ6b7EgdKxxbDxc79cOlok6Afd++TTs5szo+zJTUyow3ycrRfJVE2pq3vcN53XexvKZu/DJMDfeI/qMiZTrjTw==", 1163 | "requires": { 1164 | "define-properties": "^1.1.3", 1165 | "function-bind": "^1.1.1" 1166 | } 1167 | }, 1168 | "string.prototype.trimright": { 1169 | "version": "2.1.0", 1170 | "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.0.tgz", 1171 | "integrity": "sha512-fXZTSV55dNBwv16uw+hh5jkghxSnc5oHq+5K/gXgizHwAvMetdAJlHqqoFC1FSDVPYWLkAKl2cxpUT41sV7nSg==", 1172 | "requires": { 1173 | "define-properties": "^1.1.3", 1174 | "function-bind": "^1.1.1" 1175 | } 1176 | }, 1177 | "string_decoder": { 1178 | "version": "1.1.1", 1179 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1180 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1181 | "requires": { 1182 | "safe-buffer": "~5.1.0" 1183 | } 1184 | }, 1185 | "strip-ansi": { 1186 | "version": "3.0.1", 1187 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1188 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1189 | "requires": { 1190 | "ansi-regex": "^2.0.0" 1191 | } 1192 | }, 1193 | "strip-json-comments": { 1194 | "version": "2.0.1", 1195 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", 1196 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" 1197 | }, 1198 | "supports-color": { 1199 | "version": "6.0.0", 1200 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", 1201 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", 1202 | "requires": { 1203 | "has-flag": "^3.0.0" 1204 | } 1205 | }, 1206 | "tar": { 1207 | "version": "4.4.13", 1208 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", 1209 | "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", 1210 | "requires": { 1211 | "chownr": "^1.1.1", 1212 | "fs-minipass": "^1.2.5", 1213 | "minipass": "^2.8.6", 1214 | "minizlib": "^1.2.1", 1215 | "mkdirp": "^0.5.0", 1216 | "safe-buffer": "^5.1.2", 1217 | "yallist": "^3.0.3" 1218 | } 1219 | }, 1220 | "toml": { 1221 | "version": "3.0.0", 1222 | "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", 1223 | "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" 1224 | }, 1225 | "tough-cookie": { 1226 | "version": "2.4.3", 1227 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", 1228 | "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", 1229 | "requires": { 1230 | "psl": "^1.1.24", 1231 | "punycode": "^1.4.1" 1232 | }, 1233 | "dependencies": { 1234 | "punycode": { 1235 | "version": "1.4.1", 1236 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1237 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1238 | } 1239 | } 1240 | }, 1241 | "tunnel-agent": { 1242 | "version": "0.6.0", 1243 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1244 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1245 | "requires": { 1246 | "safe-buffer": "^5.0.1" 1247 | } 1248 | }, 1249 | "tweetnacl": { 1250 | "version": "0.14.5", 1251 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1252 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" 1253 | }, 1254 | "uri-js": { 1255 | "version": "4.2.2", 1256 | "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", 1257 | "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", 1258 | "requires": { 1259 | "punycode": "^2.1.0" 1260 | } 1261 | }, 1262 | "util-deprecate": { 1263 | "version": "1.0.2", 1264 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1265 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1266 | }, 1267 | "uuid": { 1268 | "version": "3.3.3", 1269 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", 1270 | "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" 1271 | }, 1272 | "verror": { 1273 | "version": "1.10.0", 1274 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1275 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1276 | "requires": { 1277 | "assert-plus": "^1.0.0", 1278 | "core-util-is": "1.0.2", 1279 | "extsprintf": "^1.2.0" 1280 | } 1281 | }, 1282 | "which": { 1283 | "version": "1.3.1", 1284 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 1285 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 1286 | "requires": { 1287 | "isexe": "^2.0.0" 1288 | } 1289 | }, 1290 | "which-module": { 1291 | "version": "2.0.0", 1292 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1293 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1294 | }, 1295 | "wide-align": { 1296 | "version": "1.1.3", 1297 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", 1298 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", 1299 | "requires": { 1300 | "string-width": "^1.0.2 || 2" 1301 | } 1302 | }, 1303 | "wrap-ansi": { 1304 | "version": "5.1.0", 1305 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", 1306 | "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", 1307 | "requires": { 1308 | "ansi-styles": "^3.2.0", 1309 | "string-width": "^3.0.0", 1310 | "strip-ansi": "^5.0.0" 1311 | }, 1312 | "dependencies": { 1313 | "ansi-regex": { 1314 | "version": "4.1.0", 1315 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1316 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1317 | }, 1318 | "is-fullwidth-code-point": { 1319 | "version": "2.0.0", 1320 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1321 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1322 | }, 1323 | "string-width": { 1324 | "version": "3.1.0", 1325 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1326 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1327 | "requires": { 1328 | "emoji-regex": "^7.0.1", 1329 | "is-fullwidth-code-point": "^2.0.0", 1330 | "strip-ansi": "^5.1.0" 1331 | } 1332 | }, 1333 | "strip-ansi": { 1334 | "version": "5.2.0", 1335 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1336 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1337 | "requires": { 1338 | "ansi-regex": "^4.1.0" 1339 | } 1340 | } 1341 | } 1342 | }, 1343 | "wrappy": { 1344 | "version": "1.0.2", 1345 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1346 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1347 | }, 1348 | "y18n": { 1349 | "version": "4.0.0", 1350 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1351 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1352 | }, 1353 | "yallist": { 1354 | "version": "3.1.1", 1355 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", 1356 | "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" 1357 | }, 1358 | "yargs": { 1359 | "version": "13.3.0", 1360 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.0.tgz", 1361 | "integrity": "sha512-2eehun/8ALW8TLoIl7MVaRUrg+yCnenu8B4kBlRxj3GJGDKU1Og7sMXPNm1BYyM1DOJmTZ4YeN/Nwxv+8XJsUA==", 1362 | "requires": { 1363 | "cliui": "^5.0.0", 1364 | "find-up": "^3.0.0", 1365 | "get-caller-file": "^2.0.1", 1366 | "require-directory": "^2.1.1", 1367 | "require-main-filename": "^2.0.0", 1368 | "set-blocking": "^2.0.0", 1369 | "string-width": "^3.0.0", 1370 | "which-module": "^2.0.0", 1371 | "y18n": "^4.0.0", 1372 | "yargs-parser": "^13.1.1" 1373 | }, 1374 | "dependencies": { 1375 | "ansi-regex": { 1376 | "version": "4.1.0", 1377 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", 1378 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" 1379 | }, 1380 | "is-fullwidth-code-point": { 1381 | "version": "2.0.0", 1382 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1383 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1384 | }, 1385 | "string-width": { 1386 | "version": "3.1.0", 1387 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", 1388 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", 1389 | "requires": { 1390 | "emoji-regex": "^7.0.1", 1391 | "is-fullwidth-code-point": "^2.0.0", 1392 | "strip-ansi": "^5.1.0" 1393 | } 1394 | }, 1395 | "strip-ansi": { 1396 | "version": "5.2.0", 1397 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", 1398 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", 1399 | "requires": { 1400 | "ansi-regex": "^4.1.0" 1401 | } 1402 | } 1403 | } 1404 | }, 1405 | "yargs-parser": { 1406 | "version": "13.1.1", 1407 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", 1408 | "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", 1409 | "requires": { 1410 | "camelcase": "^5.0.0", 1411 | "decamelize": "^1.2.0" 1412 | } 1413 | }, 1414 | "yargs-unparser": { 1415 | "version": "1.6.0", 1416 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", 1417 | "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", 1418 | "requires": { 1419 | "flat": "^4.1.0", 1420 | "lodash": "^4.17.15", 1421 | "yargs": "^13.3.0" 1422 | } 1423 | } 1424 | } 1425 | } 1426 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "workerskv-export", 3 | "version": "1.0.0", 4 | "description": "Export your Cloudflare Workers KV data to other stores", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "mocha" 8 | }, 9 | "author": "", 10 | "license": "MIT", 11 | "dependencies": { 12 | "axios": "^0.19.0", 13 | "mocha": "^6.2.2", 14 | "sqlite3": "^4.1.1", 15 | "toml": "^3.0.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /test/test.db: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/stevenpack/cloudflare-workers-kv-export/6388d810a123d5947b369c0fc3bfec5ae18be061/test/test.db -------------------------------------------------------------------------------- /test/tests.js: -------------------------------------------------------------------------------- 1 | const assert = require('assert'); 2 | 3 | /** 4 | * Not full coverage, but exercises most code paths 5 | */ 6 | describe('Export', function() { 7 | 8 | it('Can write to sqlite', async function() { 9 | const fs = require('fs'); 10 | const {SqliteDestination} = require('../lib'); 11 | //delete 12 | if (fs.existsSync("test.db")) { 13 | fs.unlinkSync("test.db"); 14 | } 15 | let namespaces = [ 16 | { 17 | id: "xxx", 18 | title: "TEST_NS1" 19 | }, 20 | { 21 | id: "yyy", 22 | title: "TEST_NS2" 23 | } 24 | 25 | ] 26 | let destination = new SqliteDestination("test.db"); 27 | destination.init(namespaces); 28 | let ns1 = namespaces[0]; 29 | destination.sync(ns1, "KEY1", "VAL1"); 30 | await destination.close(); 31 | 32 | console.log("Test DB created and test data written..."); 33 | const sqlite3 = require('sqlite3').verbose(); 34 | let testDb = new sqlite3.Database("test.db", (e) => { 35 | if (e) { 36 | console.error(e); 37 | } else { 38 | console.info("Connected to test.db"); 39 | } 40 | }); 41 | testDb.each("SELECT * FROM TEST_NS1", function(err, row) { 42 | console.log("Result of select"); 43 | console.log(JSON.stringify(err || row)); 44 | assert.equal(row.key, "KEY1"); 45 | assert.equal(row.val, "VAL1"); 46 | }); 47 | testDb.close(); 48 | }); 49 | 50 | it('Can process kv data', async function() { 51 | let mockAxios = { 52 | get: function(url, conf) { 53 | return new Promise((resolve, reject) => { 54 | if (url.indexOf("/keys") > -1) { 55 | let keys = [ 56 | {name: "100"}, 57 | {name: "200"} 58 | ] 59 | resolve({ 60 | data: {result: keys} 61 | }); 62 | } 63 | else if (url.indexOf("/values") > -1) { 64 | resolve({ 65 | data: "some val" 66 | }); 67 | } else { 68 | reject("Unknown url"); 69 | } 70 | }); 71 | } 72 | }; 73 | 74 | const {Namespace} = require('../lib'); 75 | let testNs = new Namespace("abc", "xyz", "NS_TEST1", "a@b.com", "xxx", mockAxios); 76 | let keys = await testNs.getKeys(); 77 | assert.equal(keys[0], "100"); 78 | let val = await testNs.getValue(keys[0]); 79 | //TOOD: if the kv val is text, this may not be what you want... 80 | //Should probably configure axios to return it raw and not as parsed 81 | assert.equal(val, "\"some val\""); 82 | }); 83 | 84 | }) 85 | 86 | async function sqlIntegrationTest() { 87 | //TODO: Use mocha 88 | 89 | } 90 | 91 | async function namespaceUnitTest() { 92 | 93 | } 94 | 95 | // // namespaceUnitTest() 96 | // // .catch(e => console.error(e)) 97 | // // .finally(() => console.log("done")); 98 | 99 | // sqlIntegrationTest() 100 | // .catch(e => console.error(e)) 101 | // .finally(() => console.log("done")); --------------------------------------------------------------------------------