diff --git a/Cargo.toml b/Cargo.toml index b0c3877..eb261c3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,11 +14,16 @@ exclude = [ [dependencies] async-std = "0.99" log = "0.4" +num-traits = "0.2" +num-derive = "0.3" parking_lot = { version = "0.9", features = [ "nightly" ] } reqwest = { version = "0.10.0-alpha.1", features = [ "gzip", "json" ] } scan_fmt = "0.2" serde = "^1.0" -tokio = "0.2.0-alpha.6" [dev-dependencies] env_logger = "0.7" +tokio = "0.2.0-alpha.6" + +[build-dependencies] +os_pipe = "0.9" diff --git a/src/consts/mod.rs b/src/consts/mod.rs index c9fe174..f1b9ad6 100644 --- a/src/consts/mod.rs +++ b/src/consts/mod.rs @@ -1,3 +1,4 @@ mod region; pub use region::*; +pub use crate::champion::*; diff --git a/src/lib.rs b/src/lib.rs index 041fd00..340e0b0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,3 +1,5 @@ +include!("../srcgen/mod.rs"); + pub mod consts; mod riot_api_config; @@ -18,10 +20,12 @@ mod tests { fn it_works() { env_logger::init(); + let champ = crate::consts::Champion::Riven; + println!("{}", champ); + let api_key_raw = std::fs::read_to_string("apikey.txt").unwrap(); // TODO don't use unwrap. let api_key = api_key_raw.trim(); - let rt = Runtime::new().unwrap(); let riot_api = RiotApi::with_key(api_key); diff --git a/src/req/rate_limit.rs b/src/req/rate_limit.rs index 272a7df..febc72d 100644 --- a/src/req/rate_limit.rs +++ b/src/req/rate_limit.rs @@ -1,7 +1,7 @@ use std::cmp; use std::time::{ Duration, Instant }; -use log::debug; +use log::*; use parking_lot::{ RwLock, RwLockUpgradableReadGuard }; use reqwest::{ StatusCode, Response }; use scan_fmt::scan_fmt; @@ -81,7 +81,8 @@ impl RateLimit { { // Only care if the header that indicates the relevant RateLimit is present. let type_name_header = response.headers() - .get(RateLimit::HEADER_XRATELIMITTYPE)?.to_str().unwrap(); + .get(RateLimit::HEADER_XRATELIMITTYPE)?.to_str() + .expect("Failed to read x-rate-limit-type header as string."); // Only care if that header's value matches us. if self.rate_limit_type.type_name() != type_name_header.to_lowercase() { return None; @@ -90,9 +91,14 @@ impl RateLimit { // Get retry after header. Only care if it exists. let retry_after_header = response.headers() - .get(RateLimit::HEADER_RETRYAFTER)?.to_str().ok()?; - let retry_after_secs: u64 = retry_after_header.parse().ok()?; - return Some(Instant::now() + Duration::from_secs(retry_after_secs)); + .get(RateLimit::HEADER_RETRYAFTER)?.to_str() + .expect("Failed to read retry-after header as string."); + // Header currently only returns ints, but float is more general. Can be zero. + let retry_after_secs: f32 = retry_after_header.parse() + .expect("Failed to parse retry-after header as f32."); + // Add 0.5 seconds to account for rounding, cases when response is zero. + let delay = Duration::from_secs_f32(0.5 + retry_after_secs); + return Some(Instant::now() + delay); }() { *self.retry_after.write() = Some(retry_after); } @@ -102,11 +108,15 @@ impl RateLimit { fn on_response_rate_limits(&self, response: &Response) { // Check if rate limits changed. let headers = response.headers(); - let limit_header_opt = headers.get(self.rate_limit_type.limit_header()).map(|h| h.to_str().unwrap()); - let count_header_opt = headers.get(self.rate_limit_type.count_header()).map(|h| h.to_str().unwrap()); + let limit_header_opt = headers.get(self.rate_limit_type.limit_header()) + .map(|h| h.to_str().expect("Failed to read limit header as string.")); + let count_header_opt = headers.get(self.rate_limit_type.count_header()) + .map(|h| h.to_str().expect("Failed to read count header as string.")); + // https://github.com/rust-lang/rust/issues/53667 if let Some(limit_header) = limit_header_opt { if let Some(count_header) = count_header_opt { + let buckets = self.buckets.upgradable_read(); if !buckets_require_updating(limit_header, &*buckets) { return; @@ -141,8 +151,10 @@ fn buckets_from_header(limit_header: &str, count_header: &str) -> Vec RequesterManager<'a> { pub fn new(riot_api_config: RiotApiConfig<'a>) -> Self { // TODO configure client. let client = Client::new(); + trace!("Creating client (TODO: configuration)."); + Self { riot_api_config: riot_api_config, client: client, diff --git a/src/req/token_bucket.rs b/src/req/token_bucket.rs index 27db671..2fc5981 100644 --- a/src/req/token_bucket.rs +++ b/src/req/token_bucket.rs @@ -61,16 +61,13 @@ impl TokenBucket for VectorTokenBucket { fn get_delay(&self) -> Option { let timestamps = self.update_get_timestamps(); - if timestamps.len() < self.total_limit { - None - } - else { - // Timestamp that needs to be popped before - // we can enter another timestamp. - let ts = *timestamps.get(self.total_limit - 1).unwrap(); - Instant::now().checked_duration_since(ts) - .and_then(|passed_dur| self.duration.checked_sub(passed_dur)) - } + // The "?" means: + // `if timestamps.len() < self.total_limit { return None }` + // Timestamp that needs to be popped before + // we can enter another timestamp. + let ts = *timestamps.get(self.total_limit - 1)?; + Instant::now().checked_duration_since(ts) + .and_then(|passed_dur| self.duration.checked_sub(passed_dur)) } fn get_tokens(&self, n: usize) -> bool { diff --git a/srcgen/.gitignore b/srcgen/.gitignore new file mode 100644 index 0000000..78f44ec --- /dev/null +++ b/srcgen/.gitignore @@ -0,0 +1,4 @@ +node_modules/ +*.rs +!mod.rs +.*.json diff --git a/srcgen/champion.rs.dt b/srcgen/champion.rs.dt new file mode 100644 index 0000000..d176ee7 --- /dev/null +++ b/srcgen/champion.rs.dt @@ -0,0 +1,94 @@ +{{ + const champions = require('./.champion.json') + .filter(({ id }) => id > 0) + .sort(({ name: a }, { name: b }) => a > b ? 1 : -1); + const hashFactor = 256; + const enumName = name => name.replace(/[^a-z]+/i, ''); + const strHash = function(str) { + let h = 0; + for (let c of str) + h = hashFactor * h + c.charCodeAt(0); + return h; + }; + const padId = function(id) { return ('' + id).padEnd(3); }; +}} +// This file is automatically generated. +// Do not directly edit. +// Generated on {{= (new Date).toISOString() }} + +use std::fmt; +use num_derive; + +#[derive(fmt::Debug, Copy, Clone)] +#[derive(num_derive::FromPrimitive, num_derive::ToPrimitive)] +pub enum Champion { +{{ + for (let { id, name } of champions) { +}} + {{= enumName(name).padEnd(12) }} = {{= id }}, +{{ + } +}} + } + +impl Champion { + pub fn name(self) -> &'static str { + match self { +{{ + for (let { id, name } of champions) { +}} + Self::{{= enumName(name).padEnd(12) }} => "{{= name }}", +{{ + } +}} + } + } + + pub fn identifier(self) -> &'static str { + match self { +{{ + for (let { name, alias } of champions) { +}} + Self::{{= enumName(name).padEnd(12) }} => "{{= alias }}", +{{ + } +}} + } + } +} + +impl std::str::FromStr for Champion { + type Err = (); + + fn from_str(val: &str) -> Result { + // 4 characters encoded as an int. + match val.chars() + .filter(|c| c.is_ascii_alphabetic()) + .take(4) + .map(|c| c.to_ascii_uppercase() as u32) + .fold(0u32, |hash, next| hash * {{= hashFactor }} + next) + { +{{ + let keyStrings = (name, alias) => new Set([].concat(...[ name, alias ].map(s => s.toUpperCase()) + .map(s => [ + s.replace(/[^A-Z]+/, '').substring(0, 4), + s.split(/[^A-Z]/, 1)[0].substring(0, 4) + ]))); + for (let { id, alias, name } of champions) { + for (let prefix of keyStrings(name, alias)) { +}} + {{= ('' + strHash(prefix)).padEnd(10) }} /* {{= prefix.padEnd(4) }} */ => Ok(Self::{{= enumName(name) }}), +{{ + } + } +}} + _ => Err(()), + } + } +} + +impl fmt::Display for Champion { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:?}", self) + } +} diff --git a/srcgen/dotUtils.js b/srcgen/dotUtils.js new file mode 100644 index 0000000..b56c993 --- /dev/null +++ b/srcgen/dotUtils.js @@ -0,0 +1,105 @@ +// flatMap: https://gist.github.com/samgiles/762ee337dff48623e729 +// [B](f: (A) ⇒ [B]): [B] ; Although the types in the arrays aren't strict (: +Array.prototype.flatMap = function(lambda) { + return Array.prototype.concat.apply([], this.map(lambda)); +}; +Array.prototype.groupBy = function(lambda) { + return Object.entries(this.reduce((agg, x) => { + const k = lambda(x); + (agg[k] = agg[k] || []).push(x); + return agg; + }, {})); +} + +function capitalize(input) { + return input[0].toUpperCase() + input.slice(1); +} + +function decapitalize(input) { + return input[0].toLowerCase() + input.slice(1); +} + +function normalizeEndpointName(name) { + return name.split('-') + .join('_'); +} + +function normalizeSchemaName(name) { + return name.replace(/DTO/ig, ''); +} + +function normalizeArgName(name) { + var tokens = name.split('_'); + var argName = decapitalize(tokens.map(capitalize).join('')); + return 'base' === argName ? 'Base' : argName; +} + +function normalizePropName(propName, schemaName, value) { + var tokens = propName.split('_'); + var name = tokens.map(capitalize).join(''); + if (name === schemaName) + name += stringifyType(value); + return name; +} + +function stringifyType(prop, endpoint = null, nullable = false) { + if (prop.anyOf) { + prop = prop.anyOf[0]; + } + + let refType = prop['$ref']; + if (refType) { + return (!endpoint ? '' : endpoint + '.') + + normalizeSchemaName(refType.slice(refType.indexOf('.') + 1)); + } + var qm = nullable ? '?' : ''; + switch (prop.type) { + case 'boolean': return 'bool' + qm; + case 'integer': return ('int32' === prop.format ? 'int' : 'long') + qm; + case 'number': return prop.format + qm; + case 'array': return stringifyType(prop.items, endpoint) + '[]' + qm; + case 'object': + return 'IDictionary<' + stringifyType(prop['x-key'], endpoint) + ', ' + + stringifyType(prop.additionalProperties, endpoint) + '>' + qm; + default: return prop.type + qm; + } +} + +function formatJsonProperty(name) { + return `[JsonProperty(\"${name}\")]`; +} + +function formatQueryParamStringify(prop) { + switch (prop.type) { + case 'boolean': return '.ToString().ToLowerInvariant()'; + case 'string': return ''; + default: return '.ToString()'; + } +} + +function formatAddQueryParam(param) { + let k = `nameof(${param.name})`; + let nc = param.required ? '' : `if (null != ${param.name}) `; + let prop = param.schema; + switch (prop.type) { + case 'array': return `${nc}queryParams.AddRange(${param.name}.Select(` + + `w => new KeyValuePair(${k}, w${formatQueryParamStringify(prop.items)})))`; + case 'object': throw 'unsupported'; + default: + let vnc = param.required ? '' : '.Value'; + return `${nc}queryParams.Add(new KeyValuePair(${k}, ` + + `${param.name}${vnc}${formatQueryParamStringify(prop.type)}))`; + } +} + +module.exports = { + capitalize, + decapitalize, + normalizeEndpointName, + normalizeSchemaName, + normalizeArgName, + normalizePropName, + stringifyType, + formatJsonProperty, + formatAddQueryParam +}; \ No newline at end of file diff --git a/srcgen/dto.rs.dt b/srcgen/dto.rs.dt new file mode 100644 index 0000000..3c3fab3 --- /dev/null +++ b/srcgen/dto.rs.dt @@ -0,0 +1,45 @@ +{{ + const spec = require('./.spec.json'); + const dotUtils = require('./dotUtils.js'); +}} +// This file is automatically generated. +// Do not directly edit. +// Generated on {{= (new Date).toISOString() }} + +// http://www.mingweisamuel.com/riotapi-schema/tool/ +// Version {{= spec.info.version }} + +{{ + let schemas = spec.components.schemas; + let schemaKeyByEndpoint = Object.keys(schemas) + .filter(schemaKey => 'Error' != schemaKey) + .groupBy(schemaKey => schemaKey.split('.')[0]); + + for (let [endpoint, schemaKeyGroup] of schemaKeyByEndpoint) { +}} +// {{= endpoint }} +#[allow(dead_code)] +pub mod {{= dotUtils.normalizeEndpointName(endpoint) }} { +{{ + for (let schemaKey of schemaKeyGroup) { + let [endpoint, rawSchemaName] = schemaKey.split('.'); + let schemaName = dotUtils.normalizeSchemaName(rawSchemaName); + let schema = schemas[schemaKey]; + let props = schema.properties; +}} + /// {{= schemaName }} data object. This class is automatically generated. +{{? schema.description }} + /// # Description + /// {{= schema.description }} +{{?}} + pub struct {{= schemaName }} { + // TODO. + } +{{ + } +}} +} + +{{ + } +}} \ No newline at end of file diff --git a/srcgen/index.js b/srcgen/index.js new file mode 100644 index 0000000..50a5f6a --- /dev/null +++ b/srcgen/index.js @@ -0,0 +1,60 @@ +const util = require('util'); +const fs = require('fs'); +fs.readFileAsync = util.promisify(fs.readFile); +fs.writeFileAsync = util.promisify(fs.writeFile); +const req = require("request-promise-native"); + +process.chdir(__dirname); + +const files = [ + [ + 'http://raw.communitydragon.org/pbe/plugins/rcp-be-lol-game-data/global/default/v1/champion-summary.json', + '.champion.json' + ], + [ + 'http://www.mingweisamuel.com/riotapi-schema/openapi-3.0.0.json', + '.spec.json' + ] +] + +const downloadFilesPromise = Promise.all(files.map(([url, file]) => req(url) + .then(body => fs.writeFileAsync(file, body, "utf8")))); + +const doT = require('dot'); +const glob = require('glob-promise'); + +const log = a => { console.log(a); return a; }; +const suffix = '.dt'; + +doT.templateSettings = { + evaluate: /\r?\n?\{\{([\s\S]+?)\}\}/g, + interpolate: /\r?\n?\{\{=([\s\S]+?)\}\}/g, + encode: /\r?\n?\{\{!([\s\S]+?)\}\}/g, + use: /\r?\n?\{\{#([\s\S]+?)\}\}/g, + define: /\r?\n?\{\{##\s*([\w\.$]+)\s*(\:|=)([\s\S]+?)#\}\}/g, + conditional: /\r?\n?\{\{\?(\?)?\s*([\s\S]*?)\s*\}\}/g, + iterate: /\r?\n?\{\{~\s*(?:\}\}|([\s\S]+?)\s*\:\s*([\w$]+)\s*(?:\:\s*([\w$]+))?\s*\}\})/g, + varname: 'it', + strip: false, + append: false, + selfcontained: false +}; + +global.require = require; + +downloadFilesPromise.then(() => glob.promise("**/*" + suffix, { ignore: ["**/node_modules/**"] })) + .then(files => Promise.all(files + .map(log) + .map(file => fs.readFileAsync(file, "utf8") + .then(input => { + try { + return doT.template(input)({}); + } + catch (e) { + console.error(`Error thrown while running "${file}":`, e); + } + }) + .then(output => fs.writeFileAsync(file.slice(0, -suffix.length), output, "utf8")) + ) + )) + .catch(console.error); \ No newline at end of file diff --git a/srcgen/mod.rs b/srcgen/mod.rs new file mode 100644 index 0000000..61a6519 --- /dev/null +++ b/srcgen/mod.rs @@ -0,0 +1,2 @@ +mod champion; +mod dto; diff --git a/srcgen/package-lock.json b/srcgen/package-lock.json new file mode 100644 index 0000000..ac18486 --- /dev/null +++ b/srcgen/package-lock.json @@ -0,0 +1,489 @@ +{ + "name": "dot-gen", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==" + }, + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", + "requires": { + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" + }, + "@types/node": { + "version": "12.11.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.1.tgz", + "integrity": "sha512-TJtwsqZ39pqcljJpajeoofYRfeZ7/I/OMUQ5pR4q5wOKf2ocrUvBAZUMhWsOvKx3dVc/aaV5GluBivt0sWqA5A==" + }, + "ajv": { + "version": "6.10.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", + "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", + "requires": { + "fast-deep-equal": "^2.0.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "dot": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/dot/-/dot-1.1.2.tgz", + "integrity": "sha1-xzdwGfxOVQeYkosrmv62ar+h8vk=" + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "fast-deep-equal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-promise": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/glob-promise/-/glob-promise-3.4.0.tgz", + "integrity": "sha512-q08RJ6O+eJn+dVanerAndJwIcumgbDdYiUT7zFQl3Wm1xD6fBKtah7H8ZJChj4wP+8C+QfeVy8xautR7rdmKEw==", + "requires": { + "@types/glob": "*" + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "lodash": { + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" + }, + "mime-db": { + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", + "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" + }, + "mime-types": { + "version": "2.1.24", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", + "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", + "requires": { + "mime-db": "1.40.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "psl": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.4.0.tgz", + "integrity": "sha512-HZzqCGPecFLyoRj5HLfuDSKYTJkAfB5thKBIkRHtGjWwY7p1dAyveIbXIq4tO0KYfDF2tHqPUgY9SDnGm00uFw==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.0", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "request-promise-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.2.tgz", + "integrity": "sha512-UHYyq1MO8GsefGEt7EprS8UrXsm1TxEvFUX1IMTuSLU2Rh7fTIdFtl8xD7JiEYiWU2dl+NYAjCTksTehQUxPag==", + "requires": { + "lodash": "^4.17.11" + } + }, + "request-promise-native": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.7.tgz", + "integrity": "sha512-rIMnbBdgNViL37nZ1b3L/VfPOpSi0TqVDQPAvO6U14lMzOLrt5nilxCQqtDKhZeDiW0/hkCXGoQjhgJd/tCh6w==", + "requires": { + "request-promise-core": "1.1.2", + "stealthy-require": "^1.1.1", + "tough-cookie": "^2.3.3" + } + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "stealthy-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", + "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "uri-js": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", + "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", + "requires": { + "punycode": "^2.1.0" + } + }, + "uuid": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.3.tgz", + "integrity": "sha512-pW0No1RGHgzlpHJO1nsVrHKpOEIxkGg1xB+v0ZmdNH5OAeAwzAVrCnI2/6Mtx+Uys6iaylxa+D3g4j63IKKjSQ==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + } + } +} diff --git a/srcgen/package.json b/srcgen/package.json new file mode 100644 index 0000000..9a0b180 --- /dev/null +++ b/srcgen/package.json @@ -0,0 +1,19 @@ +{ + "name": "dot-gen", + "version": "0.0.0", + "description": "", + "main": "index.js", + "dependencies": { + "request": "^2.88.0", + "request-promise-native": "^1.0.7", + "dot": "^1.1.2", + "glob": "^7.1.2", + "glob-promise": "^3.3.0" + }, + "devDependencies": {}, + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "GPL-2.0" +}