diff --git a/.gitignore b/.gitignore
index db68e34..1f6752c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,3 @@
-*.js
-*.d.ts
node_modules
/test/generated
/coverage
diff --git a/index.d.ts b/index.d.ts
new file mode 100644
index 0000000..b798801
--- /dev/null
+++ b/index.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..6749dc3
--- /dev/null
+++ b/index.js
@@ -0,0 +1,39 @@
+#!/usr/bin/env node
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var yargs = require("yargs");
+var fs = require("fs");
+var path = require("path");
+var index_1 = require("./lib/index");
+var argv = yargs.usage('Usage: $0 [options] inputFile rootName')
+ .alias('i', 'interface-file')
+ .string('i')
+ .describe('i', 'Specify output file for interfaces')
+ .alias('p', 'proxy-file')
+ .string('p')
+ .describe('p', 'Specity output file for TypeScript proxy classes')
+ .help('h')
+ .alias('h', 'help')
+ .argv;
+var interfaceWriter = new index_1.NopWriter();
+var proxyWriter = interfaceWriter;
+if (argv.i && argv.p && path.resolve(argv.i) === path.resolve(argv.p)) {
+ console.error("Interfaces and proxies cannot be written to same file.");
+ yargs.showHelp();
+ process.exit(1);
+}
+if (argv.i) {
+ interfaceWriter = new index_1.StreamWriter(fs.createWriteStream(argv.i));
+}
+if (argv.p) {
+ proxyWriter = new index_1.StreamWriter(fs.createWriteStream(argv.p));
+}
+if (argv._.length !== 2) {
+ console.error("Please supply an input file with samples in a JSON array, and a symbol to use for the root interface / proxy.");
+ yargs.showHelp();
+ process.exit(1);
+}
+var samples = JSON.parse(fs.readFileSync(argv._[0]).toString());
+var e = new index_1.Emitter(interfaceWriter, proxyWriter);
+e.emit(samples, argv._[1]);
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2QkFBK0I7QUFDL0IsdUJBQXlCO0FBQ3pCLDJCQUE2QjtBQUU3QixxQ0FBNkQ7QUFFN0QsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQztLQUMvRCxLQUFLLENBQUMsR0FBRyxFQUFFLGdCQUFnQixDQUFDO0tBQzVCLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDWCxRQUFRLENBQUMsR0FBRyxFQUFFLG9DQUFvQyxDQUFDO0tBQ25ELEtBQUssQ0FBQyxHQUFHLEVBQUUsWUFBWSxDQUFDO0tBQ3hCLE1BQU0sQ0FBQyxHQUFHLENBQUM7S0FDWCxRQUFRLENBQUMsR0FBRyxFQUFFLGtEQUFrRCxDQUFDO0tBQ2pFLElBQUksQ0FBQyxHQUFHLENBQUM7S0FDVCxLQUFLLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQztLQUNsQixJQUFJLENBQUM7QUFFUixJQUFJLGVBQWUsR0FBRyxJQUFJLGlCQUFTLEVBQUUsQ0FBQztBQUN0QyxJQUFJLFdBQVcsR0FBRyxlQUFlLENBQUM7QUFDbEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUU7SUFDckUsT0FBTyxDQUFDLEtBQUssQ0FBQyx3REFBd0QsQ0FBQyxDQUFDO0lBQ3hFLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0NBQ2pCO0FBQ0QsSUFBSSxJQUFJLENBQUMsQ0FBQyxFQUFFO0lBQ1YsZUFBZSxHQUFHLElBQUksb0JBQVksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Q0FDbEU7QUFDRCxJQUFJLElBQUksQ0FBQyxDQUFDLEVBQUU7SUFDVixXQUFXLEdBQUcsSUFBSSxvQkFBWSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUM5RDtBQUNELElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO0lBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0dBQStHLENBQUMsQ0FBQztJQUMvSCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDakIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztDQUNqQjtBQUVELElBQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztBQUNsRSxJQUFNLENBQUMsR0FBRyxJQUFJLGVBQU8sQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDcEQsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDIn0=
\ No newline at end of file
diff --git a/lib/cb_writer.d.ts b/lib/cb_writer.d.ts
new file mode 100644
index 0000000..0d36f82
--- /dev/null
+++ b/lib/cb_writer.d.ts
@@ -0,0 +1,11 @@
+import Writer from './writer';
+/**
+ * Calls callbacks when written to.
+ */
+export default class CallbackWriter extends Writer {
+ private readonly _writeCb;
+ private readonly _endCb;
+ constructor(writeCb: (s: string) => any, endCb: () => any);
+ write(s: string): this;
+ close(cb: () => void): void;
+}
diff --git a/lib/cb_writer.js b/lib/cb_writer.js
new file mode 100644
index 0000000..be5c254
--- /dev/null
+++ b/lib/cb_writer.js
@@ -0,0 +1,36 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var writer_1 = require("./writer");
+/**
+ * Calls callbacks when written to.
+ */
+var CallbackWriter = /** @class */ (function (_super) {
+ __extends(CallbackWriter, _super);
+ function CallbackWriter(writeCb, endCb) {
+ var _this = _super.call(this) || this;
+ _this._writeCb = writeCb;
+ _this._endCb = endCb;
+ return _this;
+ }
+ CallbackWriter.prototype.write = function (s) {
+ this._writeCb(s);
+ return this;
+ };
+ CallbackWriter.prototype.close = function (cb) {
+ this._endCb();
+ setTimeout(cb, 4);
+ };
+ return CallbackWriter;
+}(writer_1.default));
+exports.default = CallbackWriter;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Jfd3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiY2Jfd3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztBQUFBLG1DQUE4QjtBQUU5Qjs7R0FFRztBQUNIO0lBQTRDLGtDQUFNO0lBR2hELHdCQUFZLE9BQTJCLEVBQUUsS0FBZ0I7UUFBekQsWUFDRSxpQkFBTyxTQUdSO1FBRkMsS0FBSSxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFDeEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7O0lBQ3RCLENBQUM7SUFDTSw4QkFBSyxHQUFaLFVBQWEsQ0FBUztRQUNwQixJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLDhCQUFLLEdBQVosVUFBYSxFQUFjO1FBQ3pCLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNkLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNILHFCQUFDO0FBQUQsQ0FBQyxBQWhCRCxDQUE0QyxnQkFBTSxHQWdCakQifQ==
\ No newline at end of file
diff --git a/lib/emit.d.ts b/lib/emit.d.ts
new file mode 100644
index 0000000..e5aa5a4
--- /dev/null
+++ b/lib/emit.d.ts
@@ -0,0 +1,26 @@
+import Writer from './writer';
+import { CRecordShape, Shape } from './types';
+export declare function emitProxyTypeCheck(e: Emitter, w: Writer, t: Shape, tabLevel: number, dataVar: string, fieldName: string): void;
+export default class Emitter {
+ private _records;
+ private _claimedNames;
+ readonly interfaces: Writer;
+ readonly proxies: Writer;
+ private _helpersToEmit;
+ constructor(interfaces: Writer, proxies: Writer);
+ markHelperAsUsed(n: string): void;
+ emit(root: any, rootName: string): void;
+ private _emitRootRecordShape;
+ private _emitProxyHelpers;
+ /**
+ * Registers the provided shape with the emitter. If an equivalent shape
+ * already exists, then the emitter returns the equivalent shape.
+ */
+ registerRecordShape(s: CRecordShape): CRecordShape;
+ /**
+ * Registers the provided shape name with the emitter. If another
+ * shape has already claimed this name, it returns a similar unique
+ * name that should be used instead.
+ */
+ registerName(name: string): string;
+}
diff --git a/lib/emit.js b/lib/emit.js
new file mode 100644
index 0000000..562db05
--- /dev/null
+++ b/lib/emit.js
@@ -0,0 +1,242 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var types_1 = require("./types");
+function emitProxyTypeCheck(e, w, t, tabLevel, dataVar, fieldName) {
+ switch (t.type) {
+ case 7 /* ANY */:
+ // TODO: This is terrible.
+ var distilledShapes_1 = t.getDistilledShapes(e);
+ w.tab(tabLevel).writeln("// This will be refactored in the next release.");
+ distilledShapes_1.forEach(function (s, i) {
+ w.tab(tabLevel + i).writeln("try {");
+ emitProxyTypeCheck(e, w, s, tabLevel + i + 1, dataVar, fieldName);
+ w.tab(tabLevel + i).writeln("} catch (e) {");
+ if (i === distilledShapes_1.length - 1) {
+ w.tab(tabLevel + i + 1).writeln("throw e;");
+ }
+ });
+ for (var i = 0; i < distilledShapes_1.length; i++) {
+ w.tab(tabLevel + (distilledShapes_1.length - i - 1)).writeln("}");
+ }
+ break;
+ case 4 /* BOOLEAN */:
+ e.markHelperAsUsed('checkBoolean');
+ w.tab(tabLevel).writeln("checkBoolean(" + dataVar + ", " + t.nullable + ", " + fieldName + ");");
+ break;
+ case 0 /* BOTTOM */:
+ throw new TypeError('Impossible: Bottom should never appear in a type.');
+ case 6 /* COLLECTION */:
+ e.markHelperAsUsed('checkArray');
+ w.tab(tabLevel).writeln("checkArray(" + dataVar + ", " + fieldName + ");");
+ w.tab(tabLevel).writeln("if (" + dataVar + ") {");
+ // Now, we check each element.
+ w.tab(tabLevel + 1).writeln("for (let i = 0; i < " + dataVar + ".length; i++) {");
+ emitProxyTypeCheck(e, w, t.baseShape, tabLevel + 2, dataVar + "[i]", fieldName + " + \"[\" + i + \"]\"");
+ w.tab(tabLevel + 1).writeln("}");
+ w.tab(tabLevel).writeln("}");
+ break;
+ case 1 /* NULL */:
+ e.markHelperAsUsed('checkNull');
+ w.tab(tabLevel).writeln("checkNull(" + dataVar + ", " + fieldName + ");");
+ break;
+ case 5 /* NUMBER */:
+ e.markHelperAsUsed('checkNumber');
+ w.tab(tabLevel).writeln("checkNumber(" + dataVar + ", " + t.nullable + ", " + fieldName + ");");
+ break;
+ case 2 /* RECORD */:
+ // Convert into a proxy.
+ w.tab(tabLevel).writeln(dataVar + " = " + t.getProxyClass(e) + ".Create(" + dataVar + ", " + fieldName + ");");
+ break;
+ case 3 /* STRING */:
+ e.markHelperAsUsed('checkString');
+ w.tab(tabLevel).writeln("checkString(" + dataVar + ", " + t.nullable + ", " + fieldName + ");");
+ break;
+ }
+ // Standardize undefined into null.
+ if (t.nullable) {
+ w.tab(tabLevel).writeln("if (" + dataVar + " === undefined) {");
+ w.tab(tabLevel + 1).writeln(dataVar + " = null;");
+ w.tab(tabLevel).writeln("}");
+ }
+}
+exports.emitProxyTypeCheck = emitProxyTypeCheck;
+var Emitter = /** @class */ (function () {
+ function Emitter(interfaces, proxies) {
+ this._records = [];
+ this._claimedNames = new Set();
+ this._helpersToEmit = new Set();
+ this.interfaces = interfaces;
+ this.proxies = proxies;
+ }
+ Emitter.prototype.markHelperAsUsed = function (n) {
+ this._helpersToEmit.add(n);
+ };
+ Emitter.prototype.emit = function (root, rootName) {
+ var rootShape = types_1.d2s(this, root);
+ if (rootShape.type === 6 /* COLLECTION */) {
+ rootShape = rootShape.baseShape;
+ }
+ this.proxies.writeln("// Stores the currently-being-typechecked object for error messages.");
+ this.proxies.writeln("let obj: any = null;");
+ if (rootShape.type !== 2 /* RECORD */) {
+ this._claimedNames.add(rootName);
+ var roots = new Set();
+ types_1.getReferencedRecordShapes(this, roots, rootShape);
+ var rootArray_1 = new Array();
+ roots.forEach(function (root) { return rootArray_1.push(root); });
+ if (rootArray_1.length === 1) {
+ this._emitRootRecordShape(rootName + "Entity", rootArray_1[0]);
+ }
+ else {
+ for (var i = 0; i < rootArray_1.length; i++) {
+ this._emitRootRecordShape(rootName + "Entity" + i, rootArray_1[i]);
+ }
+ }
+ this.interfaces.write("export type " + rootName + " = ");
+ rootShape.emitType(this);
+ this.interfaces.writeln(";").endl();
+ this.proxies.writeln("export class " + rootName + "Proxy {");
+ this.proxies.tab(1).writeln("public static Parse(s: string): " + rootShape.getProxyType(this) + " {");
+ this.proxies.tab(2).writeln("return " + rootName + "Proxy.Create(JSON.parse(s));");
+ this.proxies.tab(1).writeln("}");
+ this.proxies.tab(1).writeln("public static Create(s: any, fieldName?: string): " + rootShape.getProxyType(this) + " {");
+ this.proxies.tab(2).writeln("if (!fieldName) {");
+ this.proxies.tab(3).writeln("obj = s;");
+ this.proxies.tab(3).writeln("fieldName = \"root\";");
+ this.proxies.tab(2).writeln("}");
+ emitProxyTypeCheck(this, this.proxies, rootShape, 2, 's', "fieldName");
+ this.proxies.tab(2).writeln("return s;");
+ this.proxies.tab(1).writeln("}");
+ this.proxies.writeln("}").endl();
+ }
+ else {
+ this._emitRootRecordShape(rootName, rootShape);
+ }
+ this._emitProxyHelpers();
+ };
+ Emitter.prototype._emitRootRecordShape = function (name, rootShape) {
+ var _this = this;
+ this._claimedNames.add(name);
+ rootShape.markAsRoot(name);
+ rootShape.emitInterfaceDefinition(this);
+ rootShape.emitProxyClass(this);
+ this.interfaces.endl();
+ this.proxies.endl();
+ var set = new Set();
+ rootShape.getReferencedRecordShapes(this, set);
+ set.forEach(function (shape) {
+ shape.emitInterfaceDefinition(_this);
+ shape.emitProxyClass(_this);
+ _this.interfaces.endl();
+ _this.proxies.endl();
+ });
+ };
+ Emitter.prototype._emitProxyHelpers = function () {
+ var w = this.proxies;
+ var s = this._helpersToEmit;
+ if (s.has('throwNull2NonNull')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function throwNull2NonNull(field: string, d: any): never {");
+ w.tab(1).writeln("return errorHelper(field, d, \"non-nullable object\", false);");
+ w.writeln("}");
+ }
+ if (s.has('throwNotObject')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function throwNotObject(field: string, d: any, nullable: boolean): never {");
+ w.tab(1).writeln("return errorHelper(field, d, \"object\", nullable);");
+ w.writeln("}");
+ }
+ if (s.has('throwIsArray')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function throwIsArray(field: string, d: any, nullable: boolean): never {");
+ w.tab(1).writeln("return errorHelper(field, d, \"object\", nullable);");
+ w.writeln("}");
+ }
+ if (s.has('checkArray')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function checkArray(d: any, field: string): void {");
+ w.tab(1).writeln("if (!Array.isArray(d) && d !== null && d !== undefined) {");
+ w.tab(2).writeln("errorHelper(field, d, \"array\", true);");
+ w.tab(1).writeln("}");
+ w.writeln("}");
+ }
+ if (s.has('checkNumber')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function checkNumber(d: any, nullable: boolean, field: string): void {");
+ w.tab(1).writeln("if (typeof(d) !== 'number' && (!nullable || (nullable && d !== null && d !== undefined))) {");
+ w.tab(2).writeln("errorHelper(field, d, \"number\", nullable);");
+ w.tab(1).writeln("}");
+ w.writeln("}");
+ }
+ if (s.has('checkBoolean')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function checkBoolean(d: any, nullable: boolean, field: string): void {");
+ w.tab(1).writeln("if (typeof(d) !== 'boolean' && (!nullable || (nullable && d !== null && d !== undefined))) {");
+ w.tab(2).writeln("errorHelper(field, d, \"boolean\", nullable);");
+ w.tab(1).writeln("}");
+ w.writeln("}");
+ }
+ if (s.has('checkString')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function checkString(d: any, nullable: boolean, field: string): void {");
+ w.tab(1).writeln("if (typeof(d) !== 'string' && (!nullable || (nullable && d !== null && d !== undefined))) {");
+ w.tab(2).writeln("errorHelper(field, d, \"string\", nullable);");
+ w.tab(1).writeln("}");
+ w.writeln("}");
+ }
+ if (s.has('checkNull')) {
+ this.markHelperAsUsed("errorHelper");
+ w.writeln("function checkNull(d: any, field: string): void {");
+ w.tab(1).writeln("if (d !== null && d !== undefined) {");
+ w.tab(2).writeln("errorHelper(field, d, \"null or undefined\", false);");
+ w.tab(1).writeln("}");
+ w.writeln("}");
+ }
+ if (s.has('errorHelper')) {
+ w.writeln("function errorHelper(field: string, d: any, type: string, nullable: boolean): never {");
+ w.tab(1).writeln("if (nullable) {");
+ w.tab(2).writeln("type += \", null, or undefined\";");
+ w.tab(1).writeln("}");
+ w.tab(1).writeln("throw new TypeError('Expected ' + type + \" at \" + field + \" but found:\\n\" + JSON.stringify(d) + \"\\n\\nFull object:\\n\" + JSON.stringify(obj));");
+ w.writeln("}");
+ }
+ };
+ /**
+ * Registers the provided shape with the emitter. If an equivalent shape
+ * already exists, then the emitter returns the equivalent shape.
+ */
+ Emitter.prototype.registerRecordShape = function (s) {
+ var rv = this._records.filter(function (r) { return r.equal(s); });
+ if (rv.length === 0) {
+ this._records.push(s);
+ return s;
+ }
+ else {
+ return rv[0];
+ }
+ };
+ /**
+ * Registers the provided shape name with the emitter. If another
+ * shape has already claimed this name, it returns a similar unique
+ * name that should be used instead.
+ */
+ Emitter.prototype.registerName = function (name) {
+ if (!this._claimedNames.has(name)) {
+ this._claimedNames.add(name);
+ return name;
+ }
+ else {
+ var baseName = name;
+ var i = 1;
+ do {
+ name = "" + baseName + i;
+ i++;
+ } while (this._claimedNames.has(name));
+ this._claimedNames.add(name);
+ return name;
+ }
+ };
+ return Emitter;
+}());
+exports.default = Emitter;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1pdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImVtaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFDQSxpQ0FBdUY7QUFFdkYsNEJBQW1DLENBQVUsRUFBRSxDQUFTLEVBQUUsQ0FBUSxFQUFFLFFBQWdCLEVBQUUsT0FBZSxFQUFFLFNBQWlCO0lBQ3RILFFBQU8sQ0FBQyxDQUFDLElBQUksRUFBRTtRQUNmO1lBQ0UsMEJBQTBCO1lBQzFCLElBQU0saUJBQWUsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxPQUFPLENBQUMsaURBQWlELENBQUMsQ0FBQztZQUMzRSxpQkFBZSxDQUFDLE9BQU8sQ0FBQyxVQUFDLENBQUMsRUFBRSxDQUFDO2dCQUMzQixDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3JDLGtCQUFrQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDbEUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM3QyxJQUFJLENBQUMsS0FBSyxpQkFBZSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3BDLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7aUJBQzdDO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsaUJBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVB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
\ No newline at end of file
diff --git a/lib/index.d.ts b/lib/index.d.ts
new file mode 100644
index 0000000..5a51845
--- /dev/null
+++ b/lib/index.d.ts
@@ -0,0 +1,10 @@
+/**
+ * Library entry point. Exports public-facing interfaces.
+ */
+import Writer from './writer';
+import CbWriter from './cb_writer';
+import NopWriter from './nop_writer';
+import StreamWriter from './stream_writer';
+import * as Types from './types';
+import { default as Emitter } from './emit';
+export { Writer, CbWriter, NopWriter, StreamWriter, Types, Emitter };
diff --git a/lib/index.js b/lib/index.js
new file mode 100644
index 0000000..8da9c23
--- /dev/null
+++ b/lib/index.js
@@ -0,0 +1,18 @@
+"use strict";
+/**
+ * Library entry point. Exports public-facing interfaces.
+ */
+Object.defineProperty(exports, "__esModule", { value: true });
+var writer_1 = require("./writer");
+exports.Writer = writer_1.default;
+var cb_writer_1 = require("./cb_writer");
+exports.CbWriter = cb_writer_1.default;
+var nop_writer_1 = require("./nop_writer");
+exports.NopWriter = nop_writer_1.default;
+var stream_writer_1 = require("./stream_writer");
+exports.StreamWriter = stream_writer_1.default;
+var Types = require("./types");
+exports.Types = Types;
+var emit_1 = require("./emit");
+exports.Emitter = emit_1.default;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJpbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUc7O0FBRUgsbUNBQThCO0FBT3RCLGlCQVBELGdCQUFNLENBT0M7QUFOZCx5Q0FBbUM7QUFNbkIsbUJBTlQsbUJBQVEsQ0FNUztBQUx4QiwyQ0FBcUM7QUFLWCxvQkFMbkIsb0JBQVMsQ0FLbUI7QUFKbkMsaURBQTJDO0FBSU4sdUJBSjlCLHVCQUFZLENBSThCO0FBSGpELCtCQUFpQztBQUdrQixzQkFBSztBQUZ4RCwrQkFBMEM7QUFFZ0Isa0JBRnZDLGNBQU8sQ0FFdUMifQ==
\ No newline at end of file
diff --git a/lib/nop_writer.d.ts b/lib/nop_writer.d.ts
new file mode 100644
index 0000000..7fbe809
--- /dev/null
+++ b/lib/nop_writer.d.ts
@@ -0,0 +1,8 @@
+import Writer from './writer';
+/**
+ * Does nothing.
+ */
+export default class NopWriter extends Writer {
+ write(s: string): this;
+ close(cb: () => void): void;
+}
diff --git a/lib/nop_writer.js b/lib/nop_writer.js
new file mode 100644
index 0000000..2b349ec
--- /dev/null
+++ b/lib/nop_writer.js
@@ -0,0 +1,31 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var writer_1 = require("./writer");
+/**
+ * Does nothing.
+ */
+var NopWriter = /** @class */ (function (_super) {
+ __extends(NopWriter, _super);
+ function NopWriter() {
+ return _super !== null && _super.apply(this, arguments) || this;
+ }
+ NopWriter.prototype.write = function (s) {
+ return this;
+ };
+ NopWriter.prototype.close = function (cb) {
+ setTimeout(cb, 4);
+ };
+ return NopWriter;
+}(writer_1.default));
+exports.default = NopWriter;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9wX3dyaXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIm5vcF93cml0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThCO0FBRTlCOztHQUVHO0FBQ0g7SUFBdUMsNkJBQU07SUFBN0M7O0lBT0EsQ0FBQztJQU5RLHlCQUFLLEdBQVosVUFBYSxDQUFTO1FBQ3BCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNNLHlCQUFLLEdBQVosVUFBYSxFQUFjO1FBQ3pCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQVBELENBQXVDLGdCQUFNLEdBTzVDIn0=
\ No newline at end of file
diff --git a/lib/stream_writer.d.ts b/lib/stream_writer.d.ts
new file mode 100644
index 0000000..303a13a
--- /dev/null
+++ b/lib/stream_writer.d.ts
@@ -0,0 +1,11 @@
+///
+import Writer from './writer';
+/**
+ * Writes output to a stream.
+ */
+export default class StreamWriter extends Writer {
+ readonly stream: NodeJS.WritableStream;
+ constructor(stream: NodeJS.WritableStream);
+ write(s: string): this;
+ close(cb: () => void): void;
+}
diff --git a/lib/stream_writer.js b/lib/stream_writer.js
new file mode 100644
index 0000000..0cccc0b
--- /dev/null
+++ b/lib/stream_writer.js
@@ -0,0 +1,35 @@
+"use strict";
+var __extends = (this && this.__extends) || (function () {
+ var extendStatics = Object.setPrototypeOf ||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
+ function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
+ return function (d, b) {
+ extendStatics(d, b);
+ function __() { this.constructor = d; }
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+ };
+})();
+Object.defineProperty(exports, "__esModule", { value: true });
+var writer_1 = require("./writer");
+/**
+ * Writes output to a stream.
+ */
+var StreamWriter = /** @class */ (function (_super) {
+ __extends(StreamWriter, _super);
+ function StreamWriter(stream) {
+ var _this = _super.call(this) || this;
+ _this.stream = stream;
+ return _this;
+ }
+ StreamWriter.prototype.write = function (s) {
+ this.stream.write(new Buffer(s, 'utf8'));
+ return this;
+ };
+ StreamWriter.prototype.close = function (cb) {
+ this.stream.end();
+ setTimeout(cb, 4);
+ };
+ return StreamWriter;
+}(writer_1.default));
+exports.default = StreamWriter;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyZWFtX3dyaXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInN0cmVhbV93cml0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBQUEsbUNBQThCO0FBRTlCOztHQUVHO0FBQ0g7SUFBMEMsZ0NBQU07SUFFOUMsc0JBQVksTUFBNkI7UUFBekMsWUFDRSxpQkFBTyxTQUVSO1FBREMsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7O0lBQ3ZCLENBQUM7SUFDTSw0QkFBSyxHQUFaLFVBQWEsQ0FBUztRQUNwQixJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDTSw0QkFBSyxHQUFaLFVBQWEsRUFBYztRQUN6QixJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLFVBQVUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDcEIsQ0FBQztJQUNILG1CQUFDO0FBQUQsQ0FBQyxBQWRELENBQTBDLGdCQUFNLEdBYy9DIn0=
\ No newline at end of file
diff --git a/lib/types.d.ts b/lib/types.d.ts
new file mode 100644
index 0000000..e541d54
--- /dev/null
+++ b/lib/types.d.ts
@@ -0,0 +1,146 @@
+import { default as Emitter } from './emit';
+export declare const enum BaseShape {
+ BOTTOM = 0,
+ NULL = 1,
+ RECORD = 2,
+ STRING = 3,
+ BOOLEAN = 4,
+ NUMBER = 5,
+ COLLECTION = 6,
+ ANY = 7
+}
+export declare type Shape = CBottomShape | CNullShape | CRecordShape | CStringShape | CBooleanShape | CNumberShape | CCollectionShape | CAnyShape;
+export declare const enum ContextType {
+ ENTITY = 0,
+ FIELD = 1
+}
+export declare function getReferencedRecordShapes(e: Emitter, s: Set, sh: Shape): void;
+export declare class FieldContext {
+ readonly type: ContextType.FIELD;
+ readonly parent: CRecordShape;
+ readonly field: string;
+ constructor(parent: CRecordShape, field: string);
+ getName(e: Emitter): string;
+}
+export declare class EntityContext {
+ readonly type: ContextType.ENTITY;
+ readonly parent: CCollectionShape;
+ constructor(parent: CCollectionShape);
+ getName(e: Emitter): string;
+}
+export declare type Context = FieldContext | EntityContext;
+export declare class CBottomShape {
+ readonly type: BaseShape.BOTTOM;
+ readonly nullable: boolean;
+ makeNullable(): CBottomShape;
+ makeNonNullable(): CBottomShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare const BottomShape: CBottomShape;
+export declare class CNullShape {
+ readonly nullable: boolean;
+ readonly type: BaseShape.NULL;
+ makeNullable(): CNullShape;
+ makeNonNullable(): CNullShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare const NullShape: CNullShape;
+export declare class CNumberShape {
+ readonly nullable: boolean;
+ readonly type: BaseShape.NUMBER;
+ makeNullable(): CNumberShape;
+ makeNonNullable(): CNumberShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare const NumberShape: CNumberShape;
+export declare const NullableNumberShape: CNumberShape;
+export declare class CStringShape {
+ readonly type: BaseShape.STRING;
+ readonly nullable: boolean;
+ makeNullable(): CStringShape;
+ makeNonNullable(): CStringShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare const StringShape: CStringShape;
+export declare const NullableStringShape: CStringShape;
+export declare class CBooleanShape {
+ readonly type: BaseShape.BOOLEAN;
+ readonly nullable: boolean;
+ makeNullable(): CBooleanShape;
+ makeNonNullable(): CBooleanShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare const BooleanShape: CBooleanShape;
+export declare const NullableBooleanShape: CBooleanShape;
+export declare class CAnyShape {
+ readonly type: BaseShape.ANY;
+ private readonly _shapes;
+ private readonly _nullable;
+ private _hasDistilledShapes;
+ private _distilledShapes;
+ constructor(shapes: Shape[], nullable: boolean);
+ readonly nullable: boolean;
+ makeNullable(): CAnyShape;
+ makeNonNullable(): CAnyShape;
+ private _ensureDistilled;
+ getDistilledShapes(e: Emitter): Shape[];
+ addToShapes(shape: Shape): CAnyShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+}
+export declare class CRecordShape {
+ readonly type: BaseShape.RECORD;
+ private readonly _nullable;
+ private readonly _fields;
+ readonly contexts: Context[];
+ private _name;
+ private constructor();
+ readonly nullable: boolean;
+ /**
+ * Construct a new record shape. Returns an existing, equivalent record shape
+ * if applicable.
+ */
+ static Create(e: Emitter, fields: Map, nullable: boolean, contexts?: Context[]): CRecordShape;
+ makeNullable(): CRecordShape;
+ addContext(ctx: Context): CRecordShape;
+ makeNonNullable(): CRecordShape;
+ forEachField(cb: (t: Shape, name: string) => any): void;
+ getField(name: string): Shape;
+ equal(t: Shape): boolean;
+ emitType(e: Emitter): void;
+ getProxyClass(e: Emitter): string;
+ getProxyType(e: Emitter): string;
+ emitInterfaceDefinition(e: Emitter): void;
+ emitProxyClass(e: Emitter): void;
+ getReferencedRecordShapes(e: Emitter, rv: Set): void;
+ markAsRoot(name: string): void;
+ getName(e: Emitter): string;
+}
+export declare class CCollectionShape {
+ readonly type: BaseShape.COLLECTION;
+ readonly baseShape: Shape;
+ readonly contexts: Context[];
+ private _name;
+ constructor(baseShape: Shape, contexts?: Context[]);
+ readonly nullable: boolean;
+ makeNullable(): CCollectionShape;
+ makeNonNullable(): CCollectionShape;
+ addContext(ctx: Context): CCollectionShape;
+ emitType(e: Emitter): void;
+ getProxyType(e: Emitter): string;
+ equal(t: Shape): boolean;
+ getName(e: Emitter): string;
+}
+export declare function csh(e: Emitter, s1: Shape, s2: Shape): Shape;
+export declare function d2s(e: Emitter, d: any): Shape;
diff --git a/lib/types.js b/lib/types.js
new file mode 100644
index 0000000..8b88952
--- /dev/null
+++ b/lib/types.js
@@ -0,0 +1,719 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var emit_1 = require("./emit");
+// Add any more invalid charachaters here
+var invalidChars = /[0-9-+\*\/\?: ]/g;
+function safeField(field) {
+ return field.match(invalidChars)
+ ? "\"" + field + "\""
+ : field;
+}
+function safeInterfaceName(name) {
+ return name.match(invalidChars) ? name.replace(invalidChars, "_") : name;
+}
+function safeObjectField(objectName, field) {
+ return field.match(invalidChars)
+ ? objectName + "[\"" + field + "\"]"
+ : objectName + "." + field;
+}
+function pascalCase(n) {
+ return n.split("_").map(function (s) { return (s[0] ? s[0].toUpperCase() : "") + s.slice(1); }).join("");
+}
+function getReferencedRecordShapes(e, s, sh) {
+ switch (sh.type) {
+ case 2 /* RECORD */:
+ if (!s.has(sh)) {
+ s.add(sh);
+ sh.getReferencedRecordShapes(e, s);
+ }
+ break;
+ case 6 /* COLLECTION */:
+ getReferencedRecordShapes(e, s, sh.baseShape);
+ break;
+ case 7 /* ANY */:
+ sh.getDistilledShapes(e).forEach(function (sh) { return getReferencedRecordShapes(e, s, sh); });
+ break;
+ }
+}
+exports.getReferencedRecordShapes = getReferencedRecordShapes;
+var FieldContext = /** @class */ (function () {
+ function FieldContext(parent, field) {
+ this.parent = parent;
+ this.field = field;
+ }
+ Object.defineProperty(FieldContext.prototype, "type", {
+ get: function () {
+ return 1 /* FIELD */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ FieldContext.prototype.getName = function (e) {
+ var name = pascalCase(this.field);
+ return name;
+ };
+ return FieldContext;
+}());
+exports.FieldContext = FieldContext;
+var EntityContext = /** @class */ (function () {
+ function EntityContext(parent) {
+ this.parent = parent;
+ }
+ Object.defineProperty(EntityContext.prototype, "type", {
+ get: function () {
+ return 0 /* ENTITY */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ EntityContext.prototype.getName = function (e) {
+ return this.parent.getName(e) + "Entity";
+ };
+ return EntityContext;
+}());
+exports.EntityContext = EntityContext;
+var CBottomShape = /** @class */ (function () {
+ function CBottomShape() {
+ }
+ Object.defineProperty(CBottomShape.prototype, "type", {
+ get: function () {
+ return 0 /* BOTTOM */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CBottomShape.prototype, "nullable", {
+ get: function () {
+ return false;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CBottomShape.prototype.makeNullable = function () {
+ throw new TypeError("Doesn't make sense.");
+ };
+ CBottomShape.prototype.makeNonNullable = function () {
+ return this;
+ };
+ CBottomShape.prototype.emitType = function (e) {
+ throw new Error("Doesn't make sense.");
+ };
+ CBottomShape.prototype.getProxyType = function (e) {
+ throw new Error("Doesn't make sense.");
+ };
+ CBottomShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CBottomShape;
+}());
+exports.CBottomShape = CBottomShape;
+exports.BottomShape = new CBottomShape();
+var CNullShape = /** @class */ (function () {
+ function CNullShape() {
+ }
+ Object.defineProperty(CNullShape.prototype, "nullable", {
+ get: function () {
+ return true;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CNullShape.prototype, "type", {
+ get: function () {
+ return 1 /* NULL */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CNullShape.prototype.makeNullable = function () {
+ return this;
+ };
+ CNullShape.prototype.makeNonNullable = function () {
+ return this;
+ };
+ CNullShape.prototype.emitType = function (e) {
+ e.interfaces.write("null");
+ };
+ CNullShape.prototype.getProxyType = function (e) {
+ return "null";
+ };
+ CNullShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CNullShape;
+}());
+exports.CNullShape = CNullShape;
+exports.NullShape = new CNullShape();
+var CNumberShape = /** @class */ (function () {
+ function CNumberShape() {
+ }
+ Object.defineProperty(CNumberShape.prototype, "nullable", {
+ get: function () {
+ return this === exports.NullableNumberShape;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CNumberShape.prototype, "type", {
+ get: function () {
+ return 5 /* NUMBER */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CNumberShape.prototype.makeNullable = function () {
+ return exports.NullableNumberShape;
+ };
+ CNumberShape.prototype.makeNonNullable = function () {
+ return exports.NumberShape;
+ };
+ CNumberShape.prototype.emitType = function (e) {
+ e.interfaces.write(this.getProxyType(e));
+ };
+ CNumberShape.prototype.getProxyType = function (e) {
+ var rv = "number";
+ if (this.nullable) {
+ rv += " | null";
+ }
+ return rv;
+ };
+ CNumberShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CNumberShape;
+}());
+exports.CNumberShape = CNumberShape;
+exports.NumberShape = new CNumberShape();
+exports.NullableNumberShape = new CNumberShape();
+var CStringShape = /** @class */ (function () {
+ function CStringShape() {
+ }
+ Object.defineProperty(CStringShape.prototype, "type", {
+ get: function () {
+ return 3 /* STRING */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CStringShape.prototype, "nullable", {
+ get: function () {
+ return this === exports.NullableStringShape;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CStringShape.prototype.makeNullable = function () {
+ return exports.NullableStringShape;
+ };
+ CStringShape.prototype.makeNonNullable = function () {
+ return exports.StringShape;
+ };
+ CStringShape.prototype.emitType = function (e) {
+ e.interfaces.write(this.getProxyType(e));
+ };
+ CStringShape.prototype.getProxyType = function (e) {
+ var rv = "string";
+ if (this.nullable) {
+ rv += " | null";
+ }
+ return rv;
+ };
+ CStringShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CStringShape;
+}());
+exports.CStringShape = CStringShape;
+exports.StringShape = new CStringShape();
+exports.NullableStringShape = new CStringShape();
+var CBooleanShape = /** @class */ (function () {
+ function CBooleanShape() {
+ }
+ Object.defineProperty(CBooleanShape.prototype, "type", {
+ get: function () {
+ return 4 /* BOOLEAN */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CBooleanShape.prototype, "nullable", {
+ get: function () {
+ return this === exports.NullableBooleanShape;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CBooleanShape.prototype.makeNullable = function () {
+ return exports.NullableBooleanShape;
+ };
+ CBooleanShape.prototype.makeNonNullable = function () {
+ return exports.BooleanShape;
+ };
+ CBooleanShape.prototype.emitType = function (e) {
+ e.interfaces.write(this.getProxyType(e));
+ };
+ CBooleanShape.prototype.getProxyType = function (e) {
+ var rv = "boolean";
+ if (this.nullable) {
+ rv += " | null";
+ }
+ return rv;
+ };
+ CBooleanShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CBooleanShape;
+}());
+exports.CBooleanShape = CBooleanShape;
+exports.BooleanShape = new CBooleanShape();
+exports.NullableBooleanShape = new CBooleanShape();
+var CAnyShape = /** @class */ (function () {
+ function CAnyShape(shapes, nullable) {
+ this._nullable = false;
+ this._hasDistilledShapes = false;
+ this._distilledShapes = [];
+ this._shapes = shapes;
+ this._nullable = nullable;
+ }
+ Object.defineProperty(CAnyShape.prototype, "type", {
+ get: function () {
+ return 7 /* ANY */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CAnyShape.prototype, "nullable", {
+ get: function () {
+ return this._nullable === true;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CAnyShape.prototype.makeNullable = function () {
+ if (this._nullable) {
+ return this;
+ }
+ else {
+ return new CAnyShape(this._shapes, true);
+ }
+ };
+ CAnyShape.prototype.makeNonNullable = function () {
+ if (this._nullable) {
+ return new CAnyShape(this._shapes, false);
+ }
+ else {
+ return this;
+ }
+ };
+ CAnyShape.prototype._ensureDistilled = function (e) {
+ var _this = this;
+ if (!this._hasDistilledShapes) {
+ var shapes = new Map();
+ for (var i = 0; i < this._shapes.length; i++) {
+ var s = this._shapes[i];
+ if (!shapes.has(s.type)) {
+ shapes.set(s.type, []);
+ }
+ shapes.get(s.type).push(s);
+ }
+ shapes.forEach(function (shapes, key) {
+ var shape = exports.BottomShape;
+ for (var i = 0; i < shapes.length; i++) {
+ shape = csh(e, shape, shapes[i]);
+ }
+ _this._distilledShapes.push(shape);
+ });
+ this._hasDistilledShapes = true;
+ }
+ };
+ CAnyShape.prototype.getDistilledShapes = function (e) {
+ this._ensureDistilled(e);
+ return this._distilledShapes;
+ };
+ CAnyShape.prototype.addToShapes = function (shape) {
+ var shapeClone = this._shapes.slice(0);
+ shapeClone.push(shape);
+ return new CAnyShape(shapeClone, this._nullable);
+ };
+ CAnyShape.prototype.emitType = function (e) {
+ var _this = this;
+ this._ensureDistilled(e);
+ this._distilledShapes.forEach(function (s, i) {
+ s.emitType(e);
+ if (i < _this._distilledShapes.length - 1) {
+ e.interfaces.write(" | ");
+ }
+ });
+ };
+ CAnyShape.prototype.getProxyType = function (e) {
+ this._ensureDistilled(e);
+ return this._distilledShapes.map(function (s) { return s.getProxyType(e); }).join(" | ");
+ };
+ CAnyShape.prototype.equal = function (t) {
+ return this === t;
+ };
+ return CAnyShape;
+}());
+exports.CAnyShape = CAnyShape;
+var CRecordShape = /** @class */ (function () {
+ function CRecordShape(fields, nullable, contexts) {
+ var _this = this;
+ this._name = null;
+ // Assign a context to all fields.
+ var fieldsWithContext = new Map();
+ fields.forEach(function (val, index) {
+ if (val.type === 2 /* RECORD */ || val.type === 6 /* COLLECTION */) {
+ fieldsWithContext.set(index, val.addContext(new FieldContext(_this, index)));
+ }
+ else {
+ fieldsWithContext.set(index, val);
+ }
+ });
+ this._fields = fieldsWithContext;
+ this._nullable = nullable;
+ this.contexts = contexts;
+ }
+ Object.defineProperty(CRecordShape.prototype, "type", {
+ get: function () {
+ return 2 /* RECORD */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CRecordShape.prototype, "nullable", {
+ get: function () {
+ return this._nullable;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ /**
+ * Construct a new record shape. Returns an existing, equivalent record shape
+ * if applicable.
+ */
+ CRecordShape.Create = function (e, fields, nullable, contexts) {
+ if (contexts === void 0) { contexts = []; }
+ var record = new CRecordShape(fields, nullable, contexts);
+ return e.registerRecordShape(record);
+ };
+ CRecordShape.prototype.makeNullable = function () {
+ if (this._nullable) {
+ return this;
+ }
+ else {
+ return new CRecordShape(this._fields, true, this.contexts);
+ }
+ };
+ CRecordShape.prototype.addContext = function (ctx) {
+ this.contexts.push(ctx);
+ return this;
+ };
+ CRecordShape.prototype.makeNonNullable = function () {
+ if (this._nullable) {
+ return new CRecordShape(this._fields, false, this.contexts);
+ }
+ else {
+ return this;
+ }
+ };
+ CRecordShape.prototype.forEachField = function (cb) {
+ this._fields.forEach(cb);
+ };
+ CRecordShape.prototype.getField = function (name) {
+ var t = this._fields.get(name);
+ if (!t) {
+ return exports.NullShape;
+ }
+ else {
+ return t;
+ }
+ };
+ CRecordShape.prototype.equal = function (t) {
+ if (t.type === 2 /* RECORD */ && this._nullable === t._nullable && this._fields.size === t._fields.size) {
+ var rv_1 = true;
+ var tFields_1 = t._fields;
+ // Check all fields.
+ // NOTE: Since size is equal, no need to iterate over t. Either they have the same fields
+ // or t is missing fields from this one.
+ this.forEachField(function (t, name) {
+ if (rv_1) {
+ var field = tFields_1.get(name);
+ if (field) {
+ rv_1 = field.equal(t);
+ }
+ else {
+ rv_1 = false;
+ }
+ }
+ });
+ return rv_1;
+ }
+ return false;
+ };
+ CRecordShape.prototype.emitType = function (e) {
+ e.interfaces.write(this.getName(e));
+ if (this.nullable) {
+ e.interfaces.write(" | null");
+ }
+ };
+ CRecordShape.prototype.getProxyClass = function (e) {
+ return this.getName(e) + "Proxy";
+ };
+ CRecordShape.prototype.getProxyType = function (e) {
+ var rv = this.getName(e) + "Proxy";
+ if (this.nullable) {
+ rv += " | null";
+ }
+ return rv;
+ };
+ CRecordShape.prototype.emitInterfaceDefinition = function (e) {
+ var w = e.interfaces;
+ w.write("export interface " + this.getName(e) + " {").endl();
+ this.forEachField(function (t, name) {
+ w.tab(1).write(safeField(name));
+ if (t.nullable) {
+ w.write("?");
+ }
+ w.write(": ");
+ t.emitType(e);
+ w.write(";").endl();
+ });
+ w.write("}");
+ };
+ CRecordShape.prototype.emitProxyClass = function (e) {
+ var w = e.proxies;
+ w.writeln("export class " + this.getProxyClass(e) + " {");
+ this.forEachField(function (t, name) {
+ w.tab(1).writeln("public readonly " + safeField(name) + ": " + t.getProxyType(e) + ";");
+ });
+ w.tab(1).writeln("public static Parse(d: string): " + this.getProxyType(e) + " {");
+ w.tab(2).writeln("return " + this.getProxyClass(e) + ".Create(JSON.parse(d));");
+ w.tab(1).writeln("}");
+ w.tab(1).writeln("public static Create(d: any, field: string = 'root'): " + this.getProxyType(e) + " {");
+ w.tab(2).writeln("if (!field) {");
+ w.tab(3).writeln("obj = d;");
+ w.tab(3).writeln("field = \"root\";");
+ w.tab(2).writeln("}");
+ w.tab(2).writeln("if (d === null || d === undefined) {");
+ w.tab(3);
+ if (this.nullable) {
+ w.writeln("return null;");
+ }
+ else {
+ e.markHelperAsUsed('throwNull2NonNull');
+ w.writeln("throwNull2NonNull(field, d);");
+ }
+ w.tab(2).writeln("} else if (typeof(d) !== 'object') {");
+ e.markHelperAsUsed('throwNotObject');
+ w.tab(3).writeln("throwNotObject(field, d, " + this.nullable + ");");
+ w.tab(2).writeln("} else if (Array.isArray(d)) {");
+ e.markHelperAsUsed('throwIsArray');
+ w.tab(3).writeln("throwIsArray(field, d, " + this.nullable + ");");
+ w.tab(2).writeln("}");
+ // At this point, we know we have a non-null object.
+ // Check all fields.
+ this.forEachField(function (t, name) {
+ emit_1.emitProxyTypeCheck(e, w, t, 2, "" + safeObjectField('d', name), "field + \"." + name + "\"");
+ });
+ w.tab(2).writeln("return new " + this.getProxyClass(e) + "(d);");
+ w.tab(1).writeln("}");
+ w.tab(1).writeln("private constructor(d: any) {");
+ // Emit an assignment for each field.
+ this.forEachField(function (t, name) {
+ w.tab(2).writeln(safeObjectField('this', name) + " = " + safeObjectField('d', name) + ";");
+ });
+ w.tab(1).writeln("}");
+ w.writeln('}');
+ };
+ CRecordShape.prototype.getReferencedRecordShapes = function (e, rv) {
+ this.forEachField(function (t, name) {
+ getReferencedRecordShapes(e, rv, t);
+ });
+ };
+ CRecordShape.prototype.markAsRoot = function (name) {
+ this._name = name;
+ };
+ CRecordShape.prototype.getName = function (e) {
+ if (typeof (this._name) === 'string') {
+ return this._name;
+ }
+ // Calculate unique name.
+ var nameSet = new Set();
+ var name = this.contexts
+ .map(function (c) { return c.getName(e); })
+ // Remove duplicate names.
+ .filter(function (n) {
+ if (!nameSet.has(n)) {
+ nameSet.add(n);
+ return true;
+ }
+ return false;
+ })
+ .join("Or");
+ // Replace invalid Typescript charachters
+ name = safeInterfaceName(name);
+ this._name = e.registerName(name);
+ return this._name;
+ };
+ return CRecordShape;
+}());
+exports.CRecordShape = CRecordShape;
+var CCollectionShape = /** @class */ (function () {
+ function CCollectionShape(baseShape, contexts) {
+ if (contexts === void 0) { contexts = []; }
+ this._name = null;
+ // Add context if a record/collection.
+ this.baseShape = (baseShape.type === 2 /* RECORD */ || baseShape.type === 6 /* COLLECTION */) ? baseShape.addContext(new EntityContext(this)) : baseShape;
+ this.contexts = contexts;
+ }
+ Object.defineProperty(CCollectionShape.prototype, "type", {
+ get: function () {
+ return 6 /* COLLECTION */;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ Object.defineProperty(CCollectionShape.prototype, "nullable", {
+ get: function () {
+ return true;
+ },
+ enumerable: true,
+ configurable: true
+ });
+ CCollectionShape.prototype.makeNullable = function () {
+ return this;
+ };
+ CCollectionShape.prototype.makeNonNullable = function () {
+ return this;
+ };
+ CCollectionShape.prototype.addContext = function (ctx) {
+ this.contexts.push(ctx);
+ return this;
+ };
+ CCollectionShape.prototype.emitType = function (e) {
+ e.interfaces.write("(");
+ this.baseShape.emitType(e);
+ e.interfaces.write(")[] | null");
+ };
+ CCollectionShape.prototype.getProxyType = function (e) {
+ var base = this.baseShape.getProxyType(e);
+ if (base.indexOf("|") !== -1) {
+ return "(" + base + ")[] | null";
+ }
+ else {
+ return base + "[] | null";
+ }
+ };
+ CCollectionShape.prototype.equal = function (t) {
+ return t.type === 6 /* COLLECTION */ && this.baseShape.equal(t.baseShape);
+ };
+ CCollectionShape.prototype.getName = function (e) {
+ if (typeof (this._name) === 'string') {
+ return this._name;
+ }
+ var nameSet = new Set();
+ // No need to make collection names unique.
+ this._name = this.contexts
+ .map(function (c) { return c.getName(e); })
+ .filter(function (name) {
+ if (!nameSet.has(name)) {
+ nameSet.add(name);
+ return true;
+ }
+ return false;
+ })
+ .join("Or");
+ return this._name;
+ };
+ return CCollectionShape;
+}());
+exports.CCollectionShape = CCollectionShape;
+function csh(e, s1, s2) {
+ // csh(σ, σ) = σ
+ if (s1 === s2) {
+ return s1;
+ }
+ if (s1.type === 6 /* COLLECTION */ && s2.type === 6 /* COLLECTION */) {
+ // csh([σ1], [σ2]) = [csh(σ1, σ2)]
+ return new CCollectionShape(csh(e, s1.baseShape, s2.baseShape));
+ }
+ // csh(⊥, σ) = csh(σ, ⊥) = σ
+ if (s1.type === 0 /* BOTTOM */) {
+ return s2;
+ }
+ if (s2.type === 0 /* BOTTOM */) {
+ return s1;
+ }
+ // csh(null, σ) = csh(σ, null) = nullable<σ>
+ if (s1.type === 1 /* NULL */) {
+ return s2.makeNullable();
+ }
+ if (s2.type === 1 /* NULL */) {
+ return s1.makeNullable();
+ }
+ // csh(any, σ) = csh(σ, any) = any
+ if (s1.type === 7 /* ANY */) {
+ return s1.addToShapes(s2);
+ }
+ if (s2.type === 7 /* ANY */) {
+ return s2.addToShapes(s1);
+ }
+ // csh(σ2, nullable<σˆ1> ) = csh(nullable<σˆ1> , σ2) = nullable
+ if (s1.nullable && s1.type !== 6 /* COLLECTION */) {
+ return csh(e, s1.makeNonNullable(), s2).makeNullable();
+ }
+ if (s2.nullable && s2.type !== 6 /* COLLECTION */) {
+ return csh(e, s2.makeNonNullable(), s1).makeNullable();
+ }
+ // (recd) rule
+ if (s1.type === 2 /* RECORD */ && s2.type === 2 /* RECORD */) {
+ // Get all fields.
+ var fields_1 = new Map();
+ s1.forEachField(function (t, name) {
+ fields_1.set(name, csh(e, t, s2.getField(name)));
+ });
+ s2.forEachField(function (t, name) {
+ if (!fields_1.has(name)) {
+ fields_1.set(name, csh(e, t, s1.getField(name)));
+ }
+ });
+ return CRecordShape.Create(e, fields_1, false);
+ }
+ // (any) rule
+ return new CAnyShape([s1, s2], s1.nullable || s2.nullable);
+}
+exports.csh = csh;
+function d2s(e, d) {
+ if (d === undefined || d === null) {
+ return exports.NullShape;
+ }
+ switch (typeof (d)) {
+ case 'number':
+ return exports.NumberShape;
+ case 'string':
+ return exports.StringShape;
+ case 'boolean':
+ return exports.BooleanShape;
+ }
+ // Must be an object or array.
+ if (Array.isArray(d)) {
+ // Empty array: Not enough information to figure out a precise type.
+ if (d.length === 0) {
+ return new CCollectionShape(exports.NullShape);
+ }
+ var t = exports.BottomShape;
+ for (var i = 0; i < d.length; i++) {
+ t = csh(e, t, d2s(e, d[i]));
+ }
+ return new CCollectionShape(t);
+ }
+ var keys = Object.keys(d);
+ var fields = new Map();
+ for (var i = 0; i < keys.length; i++) {
+ var name = keys[i];
+ fields.set(name, d2s(e, d[name]));
+ }
+ return CRecordShape.Create(e, fields, false);
+}
+exports.d2s = d2s;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ0eXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUE4RDtBQUU1RCwwQ0FBMEM7QUFDMUMsSUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQUM7QUFDMUMsbUJBQW1CLEtBQWE7SUFFOUIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQztRQUM5QixDQUFDLENBQUMsT0FBSSxLQUFLLE9BQUc7UUFDZCxDQUFDLENBQUMsS0FBSyxDQUFDO0FBQ1osQ0FBQztBQUVELDJCQUEyQixJQUFZO0lBQ3JDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUMzRSxDQUFDO0FBRUQseUJBQXlCLFVBQWtCLEVBQUUsS0FBYTtJQUV4RCxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDO1FBQzlCLENBQUMsQ0FBSSxVQUFVLFdBQUssS0FBSyxRQUFJO1FBQzdCLENBQUMsQ0FBSSxVQUFVLFNBQUksS0FBTyxDQUFDO0FBQy9CLENBQUM7QUFvQkQsb0JBQW9CLENBQVM7SUFDM0IsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQTdDLENBQTZDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDekYsQ0FBQztBQUVELG1DQUEwQyxDQUFVLEVBQUUsQ0FBb0IsRUFBRSxF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
\ No newline at end of file
diff --git a/lib/types.ts b/lib/types.ts
index edc3cfa..ad6c7fb 100644
--- a/lib/types.ts
+++ b/lib/types.ts
@@ -1,5 +1,25 @@
import {default as Emitter, emitProxyTypeCheck} from './emit';
+ // Add any more invalid charachaters here
+ const invalidChars = /[0-9-+\*\/\?: ]/g;
+function safeField(field: string)
+{
+ return field.match(invalidChars)
+ ? `"${field}"`
+ : field;
+}
+
+function safeInterfaceName(name: string) {
+ return name.match(invalidChars) ? name.replace(invalidChars, "_") : name;
+}
+
+function safeObjectField(objectName: string, field: string)
+{
+ return field.match(invalidChars)
+ ? `${objectName}["${field}"]`
+ : `${objectName}.${field}`;
+}
+
export const enum BaseShape {
BOTTOM,
NULL,
@@ -395,7 +415,7 @@ export class CRecordShape {
const w = e.interfaces;
w.write(`export interface ${this.getName(e)} {`).endl();
this.forEachField((t, name) => {
- w.tab(1).write(name);
+ w.tab(1).write(safeField(name));
if (t.nullable) {
w.write("?");
}
@@ -409,7 +429,7 @@ export class CRecordShape {
const w = e.proxies;
w.writeln(`export class ${this.getProxyClass(e)} {`);
this.forEachField((t, name) => {
- w.tab(1).writeln(`public readonly ${name}: ${t.getProxyType(e)};`);
+ w.tab(1).writeln(`public readonly ${safeField(name)}: ${t.getProxyType(e)};`);
});
w.tab(1).writeln(`public static Parse(d: string): ${this.getProxyType(e)} {`);
w.tab(2).writeln(`return ${this.getProxyClass(e)}.Create(JSON.parse(d));`);
@@ -437,14 +457,14 @@ export class CRecordShape {
// At this point, we know we have a non-null object.
// Check all fields.
this.forEachField((t, name) => {
- emitProxyTypeCheck(e, w, t, 2, `d.${name}`, `field + ".${name}"`);
+ emitProxyTypeCheck(e, w, t, 2, `${safeObjectField('d', name)}`, `field + ".${name}"`);
});
w.tab(2).writeln(`return new ${this.getProxyClass(e)}(d);`);
w.tab(1).writeln(`}`);
w.tab(1).writeln(`private constructor(d: any) {`);
// Emit an assignment for each field.
this.forEachField((t, name) => {
- w.tab(2).writeln(`this.${name} = d.${name};`);
+ w.tab(2).writeln(`${safeObjectField('this',name)} = ${safeObjectField('d', name)};`);
});
w.tab(1).writeln(`}`);
w.writeln('}');
@@ -474,6 +494,9 @@ export class CRecordShape {
return false;
})
.join("Or");
+
+ // Replace invalid Typescript charachters
+ name = safeInterfaceName(name);
this._name = e.registerName(name);
return this._name;
}
diff --git a/lib/writer.d.ts b/lib/writer.d.ts
new file mode 100644
index 0000000..8bb4504
--- /dev/null
+++ b/lib/writer.d.ts
@@ -0,0 +1,11 @@
+declare abstract class Writer {
+ private readonly _tab;
+ private readonly _nl;
+ constructor(tab?: string, newline?: string);
+ abstract write(s: string): this;
+ abstract close(cb: () => void): void;
+ tab(n: number): this;
+ endl(): this;
+ writeln(s: string): this;
+}
+export default Writer;
diff --git a/lib/writer.js b/lib/writer.js
new file mode 100644
index 0000000..ce644b4
--- /dev/null
+++ b/lib/writer.js
@@ -0,0 +1,27 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var Writer = /** @class */ (function () {
+ function Writer(tab, newline) {
+ if (tab === void 0) { tab = " "; }
+ if (newline === void 0) { newline = "\n"; }
+ this._tab = tab;
+ this._nl = newline;
+ }
+ // Tab n times
+ Writer.prototype.tab = function (n) {
+ for (var i = 0; i < n; i++) {
+ this.write(this._tab);
+ }
+ return this;
+ };
+ // End current line.
+ Writer.prototype.endl = function () {
+ return this.write(this._nl);
+ };
+ Writer.prototype.writeln = function (s) {
+ return this.write(s).endl();
+ };
+ return Writer;
+}());
+exports.default = Writer;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid3JpdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUE7SUFHRSxnQkFBYSxHQUFrQixFQUFFLE9BQWM7UUFBbEMsb0JBQUEsRUFBQSxVQUFrQjtRQUFFLHdCQUFBLEVBQUEsY0FBYztRQUM3QyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQztRQUNoQixJQUFJLENBQUMsR0FBRyxHQUFHLE9BQU8sQ0FBQztJQUNyQixDQUFDO0lBR0QsY0FBYztJQUNQLG9CQUFHLEdBQVYsVUFBVyxDQUFTO1FBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkI7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFDRCxvQkFBb0I7SUFDYixxQkFBSSxHQUFYO1FBQ0UsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ00sd0JBQU8sR0FBZCxVQUFlLENBQVM7UUFDdEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFDSCxhQUFDO0FBQUQsQ0FBQyxBQXZCRCxJQXVCQztBQUNELGtCQUFlLE1BQU0sQ0FBQyJ9
\ No newline at end of file
diff --git a/test/collections.d.ts b/test/collections.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/collections.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/collections.js b/test/collections.js
new file mode 100644
index 0000000..1f1f936
--- /dev/null
+++ b/test/collections.js
@@ -0,0 +1,35 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var util_1 = require("./common/util");
+var PrimitiveArrayProxy_1 = require("./generated/PrimitiveArrayProxy");
+var EmptyArrayProxy_1 = require("./generated/EmptyArrayProxy");
+var MixedArrayProxy_1 = require("./generated/MixedArrayProxy");
+var MixedArray2Proxy_1 = require("./generated/MixedArray2Proxy");
+describe("Collections", function () {
+ it("Empty arrays", function () {
+ var eas = [null, [], [null]];
+ eas.forEach(function (ea) { return util_1.parseEquals(EmptyArrayProxy_1.EmptyArrayProxy, JSON.stringify(ea), ea); });
+ util_1.parseThrows(EmptyArrayProxy_1.EmptyArrayProxy, JSON.stringify([2]));
+ });
+ it("Numerical arrays", function () {
+ var nas = [null, [1], []];
+ nas.forEach(function (na) { return util_1.parseEquals(PrimitiveArrayProxy_1.PrimitiveArrayProxy, JSON.stringify(na), na); });
+ });
+ it("Mixed type arrays", function () {
+ var mta = [
+ null,
+ [1, 2, 3],
+ [true, false],
+ [true, 1, false],
+ [{ foo: 3 }]
+ ];
+ var mta2 = mta;
+ [MixedArrayProxy_1.MixedArrayProxy, MixedArray2Proxy_1.MixedArray2Proxy].forEach(function (proxy) {
+ mta2.forEach(function (mta) {
+ util_1.parseEquals(proxy, JSON.stringify(mta), mta);
+ });
+ util_1.parseThrows(proxy, JSON.stringify(["hello"]));
+ });
+ });
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJjb2xsZWN0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLHNDQUF1RDtBQUV2RCx1RUFBb0U7QUFFcEUsK0RBQTREO0FBRTVELCtEQUE0RDtBQUU1RCxpRUFBOEQ7QUFFOUQsUUFBUSxDQUFDLGFBQWEsRUFBRTtJQUN0QixFQUFFLENBQUMsY0FBYyxFQUFFO1FBQ2pCLElBQU0sR0FBRyxHQUFpQixDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQzdDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBQyxFQUFFLElBQUssT0FBQSxrQkFBVyxDQUFhLGlDQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBaEUsQ0FBZ0UsQ0FBQyxDQUFDO1FBQ3RGLGtCQUFXLENBQUMsaUNBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRSxDQUFDLGtCQUFrQixFQUFFO1FBQ3JCLElBQU0sR0FBRyxHQUFxQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlDLEdBQUcsQ0FBQyxPQUFPLENBQUMsVUFBQyxFQUFFLElBQUssT0FBQSxrQkFBVyxDQUFpQix5Q0FBbUIsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUF4RSxDQUF3RSxDQUFDLENBQUM7SUFDaEcsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsbUJBQW1CLEVBQUU7UUFDdEIsSUFBTSxHQUFHLEdBQWlCO1lBQ3hCLElBQUk7WUFDSixDQUFDLENBQUMsRUFBQyxDQUFDLEVBQUMsQ0FBQyxDQUFDO1lBQ1AsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDO1lBQ2IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQztZQUNoQixDQUFDLEVBQUMsR0FBRyxFQUFFLENBQUMsRUFBQyxDQUFDO1NBQ1gsQ0FBQztRQUNGLElBQU0sSUFBSSxHQUFrQixHQUFHLENBQUM7UUFDaEMsQ0FBQyxpQ0FBZSxFQUFFLG1DQUFnQixDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSztZQUNoRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBRztnQkFDZixrQkFBVyxDQUFhLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQzNELENBQUMsQ0FBQyxDQUFDO1lBQ0gsa0JBQVcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
\ No newline at end of file
diff --git a/test/common/generateSamples.d.ts b/test/common/generateSamples.d.ts
new file mode 100644
index 0000000..b798801
--- /dev/null
+++ b/test/common/generateSamples.d.ts
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+export {};
diff --git a/test/common/generateSamples.js b/test/common/generateSamples.js
new file mode 100644
index 0000000..63b6c4a
--- /dev/null
+++ b/test/common/generateSamples.js
@@ -0,0 +1,20 @@
+#!/usr/bin/env node
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var fs = require("fs");
+var path = require("path");
+var index_1 = require("../../lib/index");
+var outdir = path.join(__dirname, "../generated");
+var sampledir = path.join(__dirname, "../samples");
+fs.readdirSync(sampledir)
+ .filter(function (d) { return path.extname(d).toLowerCase() === '.json'; })
+ .forEach(function (d) {
+ var name = d.slice(0, d.length - 5);
+ console.log("Emitting " + name + "...");
+ var interfaceWriter = new index_1.StreamWriter(fs.createWriteStream(path.join(outdir, name + ".ts")));
+ var proxyWriter = new index_1.StreamWriter(fs.createWriteStream(path.join(outdir, name + "Proxy.ts")));
+ var samples = JSON.parse(fs.readFileSync(path.join(sampledir, d)).toString());
+ var e = new index_1.Emitter(interfaceWriter, proxyWriter);
+ e.emit(samples, name);
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVTYW1wbGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiZ2VuZXJhdGVTYW1wbGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHVCQUF5QjtBQUN6QiwyQkFBNkI7QUFDN0IseUNBQXNEO0FBRXRELElBQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ3BELElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBRXJELEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO0tBQ3RCLE1BQU0sQ0FBQyxVQUFDLENBQUMsSUFBSyxPQUFBLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxFQUF6QyxDQUF5QyxDQUFDO0tBQ3hELE9BQU8sQ0FBQyxVQUFDLENBQUM7SUFDVCxJQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBWSxJQUFJLFFBQUssQ0FBQyxDQUFDO0lBQ25DLElBQU0sZUFBZSxHQUFHLElBQUksb0JBQVksQ0FBQyxFQUFFLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUssSUFBSSxRQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEcsSUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBWSxDQUFDLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBSyxJQUFJLGFBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqRyxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2hGLElBQU0sQ0FBQyxHQUFHLElBQUksZUFBTyxDQUFDLGVBQWUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRCxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDLENBQUMsQ0FBQyJ9
\ No newline at end of file
diff --git a/test/common/util.d.ts b/test/common/util.d.ts
new file mode 100644
index 0000000..1d5f54c
--- /dev/null
+++ b/test/common/util.d.ts
@@ -0,0 +1,5 @@
+export interface Proxy {
+ Parse(s: string): T;
+}
+export declare function parseEquals(proxy: Proxy, s: string, expected: T): void;
+export declare function parseThrows(proxy: Proxy, s: string): void;
diff --git a/test/common/util.js b/test/common/util.js
new file mode 100644
index 0000000..e2506b5
--- /dev/null
+++ b/test/common/util.js
@@ -0,0 +1,69 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var assert = require("assert");
+var Context = /** @class */ (function () {
+ function Context(fail, prop, msg) {
+ this.fail = fail;
+ this.prop = prop;
+ this.msg = msg;
+ }
+ Context.prototype.or = function (test, msg) {
+ if (!this.fail) {
+ return new Context(test(), this.prop, msg);
+ }
+ else {
+ return this;
+ }
+ };
+ return Context;
+}());
+function equal(expected, actual, prop) {
+ if (expected === null || typeof (expected) !== "object") {
+ return new Context(expected !== actual, prop, expected + " !== " + actual);
+ }
+ if (Array.isArray(expected)) {
+ var ctx = new Context(!Array.isArray(actual), prop, 'Expected an array.')
+ .or(function () { return actual.length !== expected.length; }, "Array lengths do not match.");
+ if (!ctx.fail) {
+ for (var i = 0; i < expected.length; i++) {
+ var ctx_1 = equal(expected[i], actual[i], prop + "[" + i + "]");
+ if (ctx_1.fail) {
+ return ctx_1;
+ }
+ }
+ return new Context(false, prop, '');
+ }
+ else {
+ return ctx;
+ }
+ }
+ else {
+ var keys = Object.keys(expected);
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var ctx = equal(expected[key], actual[key], prop + "." + key);
+ if (ctx.fail) {
+ return ctx;
+ }
+ }
+ return new Context(false, prop, '');
+ }
+}
+function parseEquals(proxy, s, expected) {
+ var d = proxy.Parse(s);
+ var ctx = equal(expected, d, 'root');
+ assert(!ctx.fail, "Property " + ctx.prop + " does not match: " + ctx.msg);
+}
+exports.parseEquals = parseEquals;
+function parseThrows(proxy, s) {
+ var threw = false;
+ try {
+ proxy.Parse(s);
+ }
+ catch (e) {
+ threw = true;
+ }
+ assert(threw);
+}
+exports.parseThrows = parseThrows;
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInV0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBaUM7QUFNakM7SUFJRSxpQkFBWSxJQUFhLEVBQUUsSUFBWSxFQUFFLEdBQVc7UUFDbEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDakIsQ0FBQztJQUNNLG9CQUFFLEdBQVQsVUFBVSxJQUFtQixFQUFFLEdBQVc7UUFDeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZCxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNMLE9BQU8sSUFBSSxDQUFDO1NBQ2I7SUFDSCxDQUFDO0lBQ0gsY0FBQztBQUFELENBQUMsQUFoQkQsSUFnQkM7QUFFRCxlQUFlLFFBQWEsRUFBRSxNQUFXLEVBQUUsSUFBWTtJQUNyRCxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksT0FBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUN0RCxPQUFPLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxNQUFNLEVBQUUsSUFBSSxFQUFLLFFBQVEsYUFBUSxNQUFRLENBQUMsQ0FBQztLQUM1RTtJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUMzQixJQUFNLEdBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsSUFBSSxFQUFFLG9CQUFvQixDQUFDO2FBQ3hFLEVBQUUsQ0FBQyxjQUFNLE9BQUEsTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsTUFBTSxFQUFqQyxDQUFpQyxFQUFFLDZCQUE2QixDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUU7WUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDeEMsSUFBTSxLQUFHLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUssSUFBSSxTQUFJLENBQUMsTUFBRyxDQUFDLENBQUM7Z0JBQzNELElBQUksS0FBRyxDQUFDLElBQUksRUFBRTtvQkFDWixPQUFPLEtBQUcsQ0FBQztpQkFDWjthQUNGO1lBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1NBQ3JDO2FBQU07WUFDTCxPQUFPLEdBQUcsQ0FBQztTQUNaO0tBQ0Y7U0FBTTtRQUNMLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEMsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BCLElBQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFLLElBQUksU0FBSSxHQUFLLENBQUMsQ0FBQztZQUNoRSxJQUFJLEdBQUcsQ0FBQyxJQUFJLEVBQUU7Z0JBQ1osT0FBTyxHQUFHLENBQUM7YUFDWjtTQUNGO1FBQ0QsT0FBTyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3JDO0FBQ0gsQ0FBQztBQUVELHFCQUErQixLQUFlLEVBQUUsQ0FBUyxFQUFFLFFBQVc7SUFDcEUsSUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QixJQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLGNBQVksR0FBRyxDQUFDLElBQUkseUJBQW9CLEdBQUcsQ0FBQyxHQUFLLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBSkQsa0NBSUM7QUFFRCxxQkFBK0IsS0FBZSxFQUFFLENBQVM7SUFDdkQsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ2xCLElBQUk7UUFDRixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hCO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixLQUFLLEdBQUcsSUFBSSxDQUFDO0tBQ2Q7SUFDRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDaEIsQ0FBQztBQVJELGtDQVFDIn0=
\ No newline at end of file
diff --git a/test/large_samples.d.ts b/test/large_samples.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/large_samples.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/large_samples.js b/test/large_samples.js
new file mode 100644
index 0000000..68a8e53
--- /dev/null
+++ b/test/large_samples.js
@@ -0,0 +1,120 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var util_1 = require("./common/util");
+var WorldBankProxy_1 = require("./generated/WorldBankProxy");
+var GitHubProxy_1 = require("./generated/GitHubProxy");
+var TwitterStreamProxy_1 = require("./generated/TwitterStreamProxy");
+describe("Large Samples", function () {
+ it("World Bank", function () {
+ var wb = [
+ {
+ "page": 1,
+ "pages": 1,
+ "per_page": "1000",
+ "total": 53
+ }
+ ];
+ var wb2 = [
+ {
+ "page": 1,
+ "pages": 1,
+ "per_page": "1000",
+ "total": 53
+ },
+ [
+ {
+ "indicator": {
+ "id": "GC.DOD.TOTL.GD.ZS",
+ "value": "Central government debt, total (% of GDP)"
+ },
+ "country": {
+ "id": "CZ",
+ "value": "Czech Republic"
+ },
+ "value": null,
+ "decimal": "1",
+ "date": "2012"
+ }
+ ]
+ ];
+ util_1.parseEquals(WorldBankProxy_1.WorldBankProxy, JSON.stringify(wb), wb);
+ util_1.parseEquals(WorldBankProxy_1.WorldBankProxy, JSON.stringify(wb2), wb2);
+ util_1.parseThrows(WorldBankProxy_1.WorldBankProxy, JSON.stringify({
+ "page": 1, "per_page": 1000
+ }));
+ // Type checking: Figure out what is a page / what isn't.
+ var wbParsed = WorldBankProxy_1.WorldBankProxy.Parse(JSON.stringify(wb2));
+ if (Array.isArray(wbParsed)) {
+ wbParsed.forEach(function (wbEntry) {
+ if (Array.isArray(wbEntry)) {
+ // TS knows this is the actual data.
+ wbEntry[0].indicator;
+ }
+ else if (wbEntry !== null) {
+ // TS knows this is not an array, so it must be the page data.
+ wbEntry.page;
+ }
+ });
+ }
+ });
+ it("GitHub", function () {
+ var GH = {
+ "url": "https://api.github.com/repos/fsharp/FSharp.Data/issues/879",
+ "labels_url": "https://api.github.com/repos/fsharp/FSharp.Data/issues/879/labels{/name}",
+ "comments_url": "https://api.github.com/repos/fsharp/FSharp.Data/issues/879/comments",
+ "events_url": "https://api.github.com/repos/fsharp/FSharp.Data/issues/879/events",
+ "html_url": "https://github.com/fsharp/FSharp.Data/issues/879",
+ "id": 109254988,
+ "number": 879,
+ "title": "Bug when call request from Http module",
+ "user": {
+ "login": "flypixel",
+ "id": 14139485,
+ "avatar_url": "https://avatars.githubusercontent.com/u/14139485?v=3",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/flypixel",
+ "html_url": "https://github.com/flypixel",
+ "followers_url": "https://api.github.com/users/flypixel/followers",
+ "following_url": "https://api.github.com/users/flypixel/following{/other_user}",
+ "gists_url": "https://api.github.com/users/flypixel/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/flypixel/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/flypixel/subscriptions",
+ "organizations_url": "https://api.github.com/users/flypixel/orgs",
+ "repos_url": "https://api.github.com/users/flypixel/repos",
+ "events_url": "https://api.github.com/users/flypixel/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/flypixel/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "labels": [
+ {
+ "url": "https://api.github.com/repos/fsharp/FSharp.Data/labels/type-bug",
+ "name": "type-bug",
+ "color": "6E0069"
+ },
+ {
+ "url": "https://api.github.com/repos/fsharp/FSharp.Data/labels/up-for-grabs",
+ "name": "up-for-grabs",
+ "color": "207de5"
+ }
+ ],
+ "state": "open",
+ "locked": false,
+ "assignee": null,
+ "milestone": null,
+ "comments": 2,
+ "created_at": "2015-10-01T08:47:05Z",
+ "updated_at": "2015-10-11T11:18:02Z",
+ "closed_at": null,
+ "body": "```fsharp\r\n[]\r\nlet url = \"http://www.staples.com/\"\r\nlet custom (req: System.Net.HttpWebRequest) = \r\n req.Proxy <- new System.Net.WebProxy(\"http://XXX.XXX.XXX.XXX:8889\")\r\n req\r\nlet page = Http.RequestString(url=url, customizeHttpRequest=custom)\r\n```\r\nand I get this exception in fsi:\r\n*System.ArgumentOutOfRangeException: Length cannot be less than zero.\r\nParameter name: length\r\n at Microsoft.FSharp.Control.AsyncBuilderImpl.commit[a](Result`1 res)\r\n at Microsoft.FSharp.Control.CancellationTokenOps.RunSynchronously[a](CancellationToken token, FSharpAsync`1 computation, FSharpOption`1 timeout)\r\n at Microsoft.FSharp.Control.FSharpAsync.RunSynchronously[T](FSharpAsync`1 computation, FSharpOption`1 timeout, FSharpOption`1 cancellationToken)\r\n at .$FSI_0004.main@() in ...\\HttpExperiment.fsx:line 42\r\nStopped due to error.*\r\nWhen I use standard *HttpWebRequest* for the same purposes, no exceptions were raised.\r\nP.S. There are sites where this exception wasn't raised in the same situation."
+ };
+ util_1.parseEquals(GitHubProxy_1.GitHubProxy, JSON.stringify(GH), GH);
+ util_1.parseThrows(GitHubProxy_1.GitHubProxy, "[]");
+ });
+ it("Twitter", function () {
+ var tw = { "in_reply_to_status_id_str": null, "text": "I hate this stupid bumper on my iPhone. I want a new case waahhhhh", "in_reply_to_user_id_str": null, "retweet_count": 0, "geo": null, "source": "\u003Ca href=\"http:\/\/twitter.com\/devices\" rel=\"nofollow\"\u003Etxt\u003C\/a\u003E", "retweeted": false, "truncated": false, "id_str": "263290764656791552", "entities": { "user_mentions": [], "hashtags": [], "urls": [] }, "in_reply_to_user_id": null, "in_reply_to_status_id": null, "place": null, "coordinates": null, "in_reply_to_screen_name": null, "created_at": "Tue Oct 30 14:46:24 +0000 2012", "user": { "notifications": null, "contributors_enabled": false, "time_zone": "Alaska", "profile_background_color": "C0DEED", "location": "Portland, Oregon.", "profile_background_tile": false, "profile_image_url_https": "https:\/\/si0.twimg.com\/profile_images\/2782994666\/db3c2083f2a8840f6e76e9069bfaea61_normal.jpeg", "default_profile_image": false, "follow_request_sent": null, "profile_sidebar_fill_color": "DDEEF6", "description": "16 & I talk to myself.", "profile_banner_url": "https:\/\/si0.twimg.com\/profile_banners\/446688343\/1351200744", "favourites_count": 444, "screen_name": "MsHaileyMary", "profile_sidebar_border_color": "C0DEED", "id_str": "446688343", "verified": false, "lang": "en", "statuses_count": 2774, "profile_use_background_image": true, "protected": false, "profile_image_url": "http:\/\/a0.twimg.com\/profile_images\/2782994666\/db3c2083f2a8840f6e76e9069bfaea61_normal.jpeg", "listed_count": 2, "geo_enabled": false, "created_at": "Mon Dec 26 01:51:32 +0000 2011", "profile_text_color": "333333", "name": "Hailey", "profile_background_image_url": "http:\/\/a0.twimg.com\/images\/themes\/theme1\/bg.png", "friends_count": 199, "url": null, "id": 446688343, "is_translator": false, "default_profile": true, "following": null, "profile_background_image_url_https": "https:\/\/si0.twimg.com\/images\/themes\/theme1\/bg.png", "utc_offset": -32400, "profile_link_color": "0084B4", "followers_count": 221 }, "id": 263290764656791552, "contributors": null, "favorited": false };
+ util_1.parseEquals(TwitterStreamProxy_1.TwitterStreamProxy, JSON.stringify(tw), tw);
+ util_1.parseThrows(TwitterStreamProxy_1.TwitterStreamProxy, JSON.stringify({ 'delete': {} }));
+ });
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFyZ2Vfc2FtcGxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbImxhcmdlX3NhbXBsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBdUQ7QUFFdkQsNkRBQTBEO0FBRTFELHVEQUFvRDtBQUVwRCxxRUFBa0U7QUFFbEUsUUFBUSxDQUFDLGVBQWUsRUFBRTtJQUN4QixFQUFFLENBQUMsWUFBWSxFQUFFO1FBQ2YsSUFBTSxFQUFFLEdBQWM7WUFDcEI7Z0JBQ0UsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLE9BQU8sRUFBRSxFQUFFO2FBQ1o7U0FDRixDQUFDO1FBRUYsSUFBTSxHQUFHLEdBQWM7WUFDckI7Z0JBQ0UsTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07Z0JBQ2xCLE9BQU8sRUFBRSxFQUFFO2FBQ1o7WUFDRDtnQkFDRTtvQkFDRSxXQUFXLEVBQUU7d0JBQ1gsSUFBSSxFQUFFLG1CQUFtQjt3QkFDekIsT0FBTyxFQUFFLDJDQUEyQztxQkFDckQ7b0JBQ0QsU0FBUyxFQUFFO3dCQUNULElBQUksRUFBRSxJQUFJO3dCQUNWLE9BQU8sRUFBRSxnQkFBZ0I7cUJBQzFCO29CQUNELE9BQU8sRUFBRSxJQUFJO29CQUNiLFNBQVMsRUFBRSxHQUFHO29CQUNkLE1BQU0sRUFBRSxNQUFNO2lCQUNmO2FBQ0Y7U0FDRixDQUFDO1FBRUYsa0JBQVcsQ0FBWSwrQkFBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0Qsa0JBQVcsQ0FBWSwrQkFBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakUsa0JBQVcsQ0FBQywrQkFBYyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekMsTUFB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
\ No newline at end of file
diff --git a/test/primitives.d.ts b/test/primitives.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/primitives.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/primitives.js b/test/primitives.js
new file mode 100644
index 0000000..c7c8587
--- /dev/null
+++ b/test/primitives.js
@@ -0,0 +1,96 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var util_1 = require("./common/util");
+var NumberProxy_1 = require("./generated/NumberProxy");
+var NumbersProxy_1 = require("./generated/NumbersProxy");
+var StringProxy_1 = require("./generated/StringProxy");
+var StringsProxy_1 = require("./generated/StringsProxy");
+var BooleanProxy_1 = require("./generated/BooleanProxy");
+var BooleansProxy_1 = require("./generated/BooleansProxy");
+var NullProxy_1 = require("./generated/NullProxy");
+var NullsProxy_1 = require("./generated/NullsProxy");
+var MaybeNumberProxy_1 = require("./generated/MaybeNumberProxy");
+var BooleanOrStringProxy_1 = require("./generated/BooleanOrStringProxy");
+describe('Primitive Types', function () {
+ it('Number', function () {
+ [NumberProxy_1.NumberProxy, NumbersProxy_1.NumbersProxy].forEach(function (proxy) {
+ util_1.parseEquals(proxy, '3', 3);
+ util_1.parseThrows(proxy, '"hello"');
+ util_1.parseThrows(proxy, '[]');
+ util_1.parseThrows(proxy, '[3]');
+ util_1.parseThrows(proxy, "null");
+ });
+ {
+ var n = 3;
+ var m = n;
+ var m2 = n;
+ var n2 = m;
+ n2 = m2;
+ }
+ });
+ it('String', function () {
+ [StringProxy_1.StringProxy, StringsProxy_1.StringsProxy].forEach(function (proxy) {
+ util_1.parseEquals(proxy, "\"hello\"", "hello");
+ util_1.parseThrows(proxy, "3");
+ util_1.parseThrows(proxy, '[]');
+ util_1.parseThrows(proxy, "null");
+ });
+ {
+ var s = "hello";
+ var m = s;
+ var m2 = s;
+ var s2 = m;
+ s2 = m2;
+ }
+ });
+ it('Boolean', function () {
+ [BooleanProxy_1.BooleanProxy, BooleansProxy_1.BooleansProxy].forEach(function (proxy) {
+ util_1.parseEquals(proxy, "true", true);
+ util_1.parseEquals(proxy, "false", false);
+ util_1.parseThrows(proxy, "\"true\"");
+ util_1.parseThrows(proxy, "[]");
+ util_1.parseThrows(proxy, "null");
+ });
+ {
+ var b = true;
+ var m = b;
+ var m2 = b;
+ var b2 = m;
+ b2 = m2;
+ }
+ });
+ it('Null', function () {
+ [NullProxy_1.NullProxy, NullsProxy_1.NullsProxy].forEach(function (proxy) {
+ util_1.parseEquals(proxy, "null", null);
+ util_1.parseThrows(proxy, "\"null\"");
+ util_1.parseThrows(proxy, "[]");
+ util_1.parseThrows(proxy, "3");
+ });
+ {
+ var n = null;
+ var m = n;
+ var m2 = n;
+ var n2 = m;
+ n2 = m2;
+ }
+ });
+ it('Optional number', function () {
+ util_1.parseEquals(MaybeNumberProxy_1.MaybeNumberProxy, "null", null);
+ util_1.parseEquals(MaybeNumberProxy_1.MaybeNumberProxy, "3", 3);
+ util_1.parseThrows(MaybeNumberProxy_1.MaybeNumberProxy, "[]");
+ util_1.parseThrows(MaybeNumberProxy_1.MaybeNumberProxy, "\"hello\"");
+ var n = 3;
+ var m = n;
+ m = null;
+ });
+ it("Boolean or string", function () {
+ util_1.parseEquals(BooleanOrStringProxy_1.BooleanOrStringProxy, "true", true);
+ util_1.parseEquals(BooleanOrStringProxy_1.BooleanOrStringProxy, "\"hello\"", "hello");
+ util_1.parseThrows(BooleanOrStringProxy_1.BooleanOrStringProxy, '[]');
+ var b = true;
+ var s = "hello";
+ var bs = b;
+ bs = s;
+ });
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbWl0aXZlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInByaW1pdGl2ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBdUQ7QUFDdkQsdURBQW9EO0FBQ3BELHlEQUFzRDtBQUd0RCx1REFBb0Q7QUFFcEQseURBQXNEO0FBRXRELHlEQUFzRDtBQUN0RCwyREFBd0Q7QUFHeEQsbURBQWdEO0FBQ2hELHFEQUFrRDtBQUdsRCxpRUFBOEQ7QUFFOUQseUVBQXNFO0FBR3RFLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRTtJQUMxQixFQUFFLENBQUMsUUFBUSxFQUFFO1FBQ1gsQ0FBQyx5QkFBVyxFQUFFLDJCQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxLQUFLO1lBQ3hDLGtCQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixrQkFBVyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztZQUM5QixrQkFBVyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztZQUN6QixrQkFBVyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQixrQkFBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUM3QixDQUFDLENBQUMsQ0FBQztRQUVIO1lBQ0UsSUFBTSxDQUFDLEdBQVcsQ0FBQyxDQUFDO1lBQ3BCLElBQU0sQ0FBQyxHQUFXLENBQUMsQ0FBQztZQUNwQixJQUFNLEVBQUUsR0FBWSxDQUFDLENBQUM7WUFDdEIsSUFBSSxFQUFFLEdBQVcsQ0FBQyxDQUFDO1lBQ25CLEVBQUUsR0FBRyxFQUFFLENBQUM7U0FDVDtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUNYLENBQUMseUJBQVcsRUFBRSwyQkFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsS0FBSztZQUN4QyxrQkFBVyxDQUFDLEtBQUssRUFBRSxXQUFTLEVBQUUsT0FB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
\ No newline at end of file
diff --git a/test/records.d.ts b/test/records.d.ts
new file mode 100644
index 0000000..cb0ff5c
--- /dev/null
+++ b/test/records.d.ts
@@ -0,0 +1 @@
+export {};
diff --git a/test/records.js b/test/records.js
new file mode 100644
index 0000000..477c7e7
--- /dev/null
+++ b/test/records.js
@@ -0,0 +1,77 @@
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+var util_1 = require("./common/util");
+var OptionalFieldProxy_1 = require("./generated/OptionalFieldProxy");
+var FieldNamesProxy_1 = require("./generated/FieldNamesProxy");
+var InvalidCharactersProxy_1 = require("./generated/InvalidCharactersProxy");
+describe("Records", function () {
+ it("Invalid Charachters fields", function () {
+ var invalidChars = {
+ normal: 1,
+ "2d-canvas": 2,
+ "forward-looking": 3,
+ "space ": 4,
+ "2-and-with-3-multiple-numbers and spaces": 5,
+ "plus+": 6,
+ "star*": 7,
+ "slash/": 8,
+ "minus-": 9,
+ "colon:": 11,
+ "question-mark?": 11,
+ "some-object": {
+ "with-yes-more": 12,
+ fine: 13,
+ "-more_wrong": 14
+ }
+ };
+ util_1.parseEquals(InvalidCharactersProxy_1.InvalidCharactersProxy, JSON.stringify(invalidChars), invalidChars);
+ });
+ it("Optional fields", function () {
+ var optfields = [{}, {
+ foo: 3
+ }, {
+ bar: 3
+ }, {
+ foo: 3, bar: 4
+ }];
+ optfields.forEach(function (optfield) {
+ util_1.parseEquals(OptionalFieldProxy_1.OptionalFieldProxy, JSON.stringify(optfield), optfield);
+ });
+ util_1.parseThrows(OptionalFieldProxy_1.OptionalFieldProxy, 'null');
+ });
+ it("Field names with underscores", function () {
+ var optfields = [{
+ "lower1": 3,
+ "lower2": { "x": 3 },
+ "Upper1": 4,
+ "Upper2": { "y": 3 },
+ "_lower1": 3,
+ "_lower2": { "x2": 3 },
+ "_Upper1": 4,
+ "_Upper2": { "y2": 3 },
+ "_underscore1": 5,
+ "_underscore2": { "z": 5 },
+ "TwoComponents1": 6,
+ "TwoComponents2": { "v": 6 },
+ "Underscore_Separates1": 7,
+ "Underscore_Separates2": { "m": 7 },
+ "_Underscore_Separates1": 7,
+ "_Underscore_Separates2": { "m2": 7 },
+ "_Underscore_prefix1": 8,
+ "_Underscore_prefix2": { "n": 7 },
+ "_Underscore_Prefix1": 8,
+ "_Underscore_Prefix2": { "p": 7 },
+ "_UnderscorePrefix1": 8,
+ "_UnderscorePrefix2": { "q": 7 },
+ "underscore_Separates1": 7,
+ "underscore_Separates2": { "a": 7 },
+ "_underscore_prefix1": 8,
+ "_underscore_prefix2": { "b": 7 }
+ }];
+ optfields.forEach(function (optfield) {
+ util_1.parseEquals(FieldNamesProxy_1.FieldNamesProxy, JSON.stringify(optfield), optfield);
+ });
+ util_1.parseThrows(FieldNamesProxy_1.FieldNamesProxy, 'null');
+ });
+});
+//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3Jkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInJlY29yZHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxzQ0FBdUQ7QUFFdkQscUVBQWtFO0FBRWxFLCtEQUE0RDtBQUU1RCw2RUFBMEU7QUFFMUUsUUFBUSxDQUFDLFNBQVMsRUFBRTtJQUNsQixFQUFFLENBQUMsNEJBQTRCLEVBQUU7UUFDL0IsSUFBSSxZQUFZLEdBQXNCO1lBQ3BDLE1BQU0sRUFBRSxDQUFDO1lBQ1QsV0FBVyxFQUFFLENBQUM7WUFDZCxpQkFBaUIsRUFBRSxDQUFDO1lBQ3BCLFFBQVEsRUFBRSxDQUFDO1lBQ1gsMENBQTBDLEVBQUUsQ0FBQztZQUM3QyxPQUFPLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxDQUFDO1lBQ1YsUUFBUSxFQUFFLENBQUM7WUFDWCxRQUFRLEVBQUUsQ0FBQztZQUNYLFFBQVEsRUFBRSxFQUFFO1lBQ1osZ0JBQWdCLEVBQUUsRUFBRTtZQUNwQixhQUFhLEVBQUU7Z0JBQ2IsZUFBZSxFQUFFLEVBQUU7Z0JBQ25CLElBQUksRUFBRSxFQUFFO2dCQUNSLGFBQWEsRUFBRSxFQUFFO2FBQ2xCO1NBQ0YsQ0FBQztRQUNGLGtCQUFXLENBQW9CLCtDQUFzQixFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckcsQ0FBQyxDQUFDLENBQUM7SUFDSCxFQUFFLENBQUMsaUJBQWlCLEVBQUU7UUFDcEIsSUFBTSxTQUFTLEdBQW9CLENBQUMsRUFBRSxFQUFFO2dCQUN0QyxHQUFHLEVBQUUsQ0FBQzthQUNQLEVBQUU7Z0JBQ0QsR0FBRyxFQUFFLENBQUM7YUFDUCxFQUFFO2dCQUNELEdBQUcsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7YUFDZixDQUFDLENBQUM7UUFDSCxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQUMsUUFBUTtZQUN6QixrQkFBVyxDQUFnQix1Q0FBa0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JGLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0JBQVcsQ0FBQyx1Q0FBa0IsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMxQyxDQUFDLENBQUMsQ0FBQztJQUNILEVBQUUsQ0FBQyw4QkFBOEIsRUFBRTtRQUNqQyxJQUFNLFNBQVMsR0FBaUIsQ0FBQztnQkFDL0IsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFHLENBQUMsRUFBQztnQkFDcEIsUUFBUSxFQUFFLENBQUM7Z0JBQ1gsUUFBUSxFQUFFLEVBQUUsR0FBRyxFQUFHLENBQUMsRUFBQztnQkFDcEIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFHLENBQUMsRUFBQztnQkFDdEIsU0FBUyxFQUFFLENBQUM7Z0JBQ1osU0FBUyxFQUFFLEVBQUUsSUFBSSxFQUFHLENBQUMsRUFBQztnQkFDdEIsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLGNBQWMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUU7Z0JBQzFCLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFHLENBQUMsRUFBRTtnQkFDN0IsdUJBQXVCLEVBQUUsQ0FBQztnQkFDMUIsdUJBQXVCLEVBQUUsRUFBRSxHQUFHLEVBQUcsQ0FBQyxFQUFDO2dCQUNuQyx3QkFBd0IsRUFBRSxDQUFDO2dCQUMzQix3QkFBd0IsRUFBRSxFQUFFLElBQUksRUFBRyxDQUFDLEVBQUM7Z0JBQ3JDLHFCQUFxQixFQUFHLENBQUM7Z0JBQ3pCLHFCQUFxQixFQUFHLEVBQUUsR0FBRyxFQUFHLENBQUMsRUFBQztnQkFDbEMscUJBQXFCLEVBQUcsQ0FBQztnQkFDekIscUJBQXFCLEVBQUcsRUFBRSxHQUFHLEVBQUcsQ0FBQyxFQUFDO2dCQUNsQyxvQkFBb0IsRUFBRyxDQUFDO2dCQUN4QixvQkFBb0IsRUFBRyxFQUFFLEdBQUcsRUFBRyxDQUFDLEVBQUM7Z0JBQ2pDLHVCQUF1QixFQUFFLENBQUM7Z0JBQzFCLHVCQUF1QixFQUFFLEVBQUUsR0FBRyxFQUFHLENBQUMsRUFBQztnQkFDbkMscUJBQXFCLEVBQUcsQ0FBQztnQkFDekIscUJBQXFCLEVBQUcsRUFBRSxHQUFHLEVBQUcsQ0FBQyxFQUFDO2FBQ25DLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxPQUFPLENBQUMsVUFBQyxRQUFRO1lBQ3pCLGtCQUFXLENBQWEsaUNBQWUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9FLENBQUMsQ0FBQyxDQUFDO1FBQ0gsa0JBQVcsQ0FBQyxpQ0FBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMifQ==
\ No newline at end of file
diff --git a/test/records.ts b/test/records.ts
index 4c02980..33ddd23 100644
--- a/test/records.ts
+++ b/test/records.ts
@@ -3,8 +3,31 @@ import {OptionalField} from './generated/OptionalField';
import {OptionalFieldProxy} from './generated/OptionalFieldProxy';
import {FieldNames} from './generated/FieldNames';
import {FieldNamesProxy} from './generated/FieldNamesProxy';
+import {InvalidCharacters} from './generated/InvalidCharacters';
+import {InvalidCharactersProxy} from './generated/InvalidCharactersProxy';
describe("Records", () => {
+ it("Invalid Charachters fields", () => {
+ var invalidChars: InvalidCharacters = {
+ normal: 1,
+ "2d-canvas": 2,
+ "forward-looking": 3,
+ "space ": 4,
+ "2-and-with-3-multiple-numbers and spaces": 5,
+ "plus+": 6,
+ "star*": 7,
+ "slash/": 8,
+ "minus-": 9,
+ "colon:": 11,
+ "question-mark?": 11,
+ "some-object": {
+ "with-yes-more": 12,
+ fine: 13,
+ "-more_wrong": 14
+ }
+ };
+ parseEquals(InvalidCharactersProxy, JSON.stringify(invalidChars), invalidChars);
+ });
it("Optional fields", () => {
const optfields: OptionalField[] = [{}, {
foo: 3
diff --git a/test/samples/InvalidCharacters.json b/test/samples/InvalidCharacters.json
new file mode 100644
index 0000000..6045525
--- /dev/null
+++ b/test/samples/InvalidCharacters.json
@@ -0,0 +1,18 @@
+{
+ "normal": 1,
+ "2d-canvas": 2,
+ "forward-looking": 3,
+ "space ": 4,
+ "2-and-with-3-multiple-numbers and spaces": 5,
+ "plus+": 6,
+ "star*": 7,
+ "slash/": 8,
+ "minus-": 9,
+ "colon:": 10,
+ "question-mark?": 11,
+ "some-object": {
+ "with-yes-more": 12,
+ "fine": 13,
+ "-more_wrong": 14
+ }
+}
\ No newline at end of file
diff --git a/yarn.lock b/yarn.lock
new file mode 100644
index 0000000..2b32217
--- /dev/null
+++ b/yarn.lock
@@ -0,0 +1,1669 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@types/mocha@^5.2.4":
+ version "5.2.7"
+ resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea"
+ integrity sha512-NYrtPht0wGzhwe9+/idPaBB+TqkY9AhTvOLMkThm0IoEfLaiVQZwBwyJ5puCkO3AUCWrmcoePjp2mbFocKy4SQ==
+
+"@types/node@0.0.2":
+ version "0.0.2"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-0.0.2.tgz#0da4934902fbf68a97a0f53204a35ad2224917bc"
+ integrity sha1-DaSTSQL79oqXoPUyBKNa0iJJF7w=
+
+"@types/yargs@^6.3.3":
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-6.6.0.tgz#91f8e2580a8083049f78311c059aa57d6949df6b"
+ integrity sha1-kfjiWAqAgwSfeDEcBZqlfWlJ32s=
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+abbrev@1.0.x:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
+ integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU=
+
+ajv@^6.12.3:
+ version "6.12.6"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+ integrity sha1-w7M6te42DYbg5ijwRorn7yfWVN8=
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+ integrity sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=
+
+append-transform@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991"
+ integrity sha1-126/jKlNJ24keja61EpLdKthGZE=
+ dependencies:
+ default-require-extensions "^1.0.0"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+asn1@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.6.tgz#0d3a7bb6e64e02a90c0303b31f292868ea09a08d"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525"
+ integrity sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=
+
+async@1.x:
+ version "1.5.2"
+ resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
+ integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
+
+async@^2.1.4:
+ version "2.6.3"
+ resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
+ integrity sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==
+ dependencies:
+ lodash "^4.17.14"
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+ integrity sha1-x57Zf380y48robyXkLzDZkdLS3k=
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
+ integrity sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b"
+ integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-generator@^6.18.0:
+ version "6.26.1"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ integrity sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+ integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.16.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02"
+ integrity sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.18.0, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee"
+ integrity sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.18.0, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497"
+ integrity sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
+ integrity sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=
+ dependencies:
+ tweetnacl "^0.14.3"
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+browser-stdout@1.3.1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60"
+ integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
+ integrity sha1-MvxLn82vhF/N9+c7uXysImHwqwo=
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc"
+ integrity sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=
+
+chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+ integrity sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d"
+ integrity sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+ integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@2.15.1:
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-2.15.1.tgz#df46e867d0fc2aec66a34662b406a9ccafff5b0f"
+ integrity sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b"
+ integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=
+
+core-js@^2.4.0:
+ version "2.6.12"
+ resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
+ integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
+
+coveralls@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-3.1.1.tgz#f5d4431d8b5ae69c5079c8f8ca00d64ac77cf081"
+ integrity sha512-+dxnG2NHncSD1NrqbSM3dn/lE57O6Qf/koe9+I7c+wzkqRmEvcp0kgJdxKInzYzkICKkFMZsX3Vct3++tsF9ww==
+ dependencies:
+ js-yaml "^3.13.1"
+ lcov-parse "^1.0.0"
+ log-driver "^1.2.7"
+ minimist "^1.2.5"
+ request "^2.88.2"
+
+cross-spawn@^4.0.0:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-4.0.2.tgz#7b9247621c23adfdd3856004a823cbe397424d41"
+ integrity sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
+ integrity sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261"
+ integrity sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==
+ dependencies:
+ ms "2.0.0"
+
+debug@^2.6.8:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0:
+ version "3.2.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+decamelize@^1.1.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
+ integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+
+default-require-extensions@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/default-require-extensions/-/default-require-extensions-1.0.0.tgz#f37ea15d3e13ffd9b437d33e1a75b5fb97874cb8"
+ integrity sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=
+ dependencies:
+ strip-bom "^2.0.0"
+
+define-properties@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
+ integrity sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==
+ dependencies:
+ object-keys "^1.0.12"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+ integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk=
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-4.0.0.tgz#f76d064352cdf43a1cb6ce619c4ee3a9475de208"
+ integrity sha1-920GQ1LN9Docts5hnE7jqUdd4gg=
+ dependencies:
+ repeating "^2.0.0"
+
+diff@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
+ integrity sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==
+
+duplexer@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.2.tgz#3abe43aef3835f8ae077d136ddce0f276b0400e6"
+ integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
+ integrity sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz#b4ac40648107fdcdcfae242f428bea8a14d4f1bf"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+es-abstract@^1.19.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
+ integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.4"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.1"
+ is-string "^1.0.7"
+ is-weakref "^1.0.1"
+ object-inspect "^1.11.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+ integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+event-stream@=3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571"
+ integrity sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=
+ dependencies:
+ duplexer "~0.1.1"
+ from "~0"
+ map-stream "~0.1.0"
+ pause-stream "0.0.11"
+ split "0.3"
+ stream-combiner "~0.0.4"
+ through "~2.3.1"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+extsprintf@1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
+ integrity sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=
+
+extsprintf@^1.2.0:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
+ integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
+
+fast-deep-equal@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fileset@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/fileset/-/fileset-2.0.3.tgz#8e7548a96d3cc2327ee5e674168723a333bba2a0"
+ integrity sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=
+ dependencies:
+ glob "^7.0.3"
+ minimatch "^3.0.3"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
+ integrity sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
+ integrity sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz#dcce52c05f644f298c6a7ab936bd724ceffbf3a6"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+from@~0:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe"
+ integrity sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
+ integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.3.tgz#f978fa4c90d1dfe7ff2d6beda2a515e713bdcf4a"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz#15f59f376f855c446963948f0d24cd3637b4abc6"
+ integrity sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.1"
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa"
+ integrity sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob@7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15"
+ integrity sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@^7.0.3, glob@^7.1.3:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
+ integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+graceful-fs@^4.1.2:
+ version "4.2.8"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.8.tgz#e412b8d33f5e006593cbd3cee6df9f2cebbe802a"
+ integrity sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==
+
+growl@1.10.5:
+ version "1.10.5"
+ resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e"
+ integrity sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==
+
+handlebars@^4.0.3:
+ version "4.7.7"
+ resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1"
+ integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA==
+ dependencies:
+ minimist "^1.2.5"
+ neo-async "^2.6.0"
+ source-map "^0.6.1"
+ wordwrap "^1.0.0"
+ optionalDependencies:
+ uglify-js "^3.1.4"
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92"
+ integrity sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.5.tgz#1f0803b9f8cb20c0fa13822df1ecddb36bde1efd"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+ integrity sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/has-bigints/-/has-bigints-1.0.1.tgz#64fe6acb020673e3b78db035a5af69aa9d07b113"
+ integrity sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==
+
+has-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa"
+ integrity sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd"
+ integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
+
+has-symbols@^1.0.1, has-symbols@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
+ integrity sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+he@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd"
+ integrity sha1-k0EP0hsAlzUVH4howvJx80J+I/0=
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
+ integrity sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9"
+ integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6"
+ integrity sha1-EEqOSqym09jNFXqO+L+rLXo//bY=
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
+ integrity sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.4, is-callable@^1.2.4:
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
+ integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+
+is-core-module@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.0.tgz#0321336c3d0925e497fd97f5d95cb114a5ccd548"
+ integrity sha512-vd15qHsaqrRL7dtH6QNuy0ndJmRDrS9HAM1CAiSifNUFv4x1a0CCVsj18hJ1mShxIG6T2i1sO78MkP56r0nYRw==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+ integrity sha1-754xOG8DGn8NZDr4L95QxFfvAMs=
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-negative-zero@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
+ integrity sha512-bEVOqiRcvo3zO1+G2lVMy+gkkEm9Yh7cDMRusKKu5ZJKPUYSJwICTKZrNKHA2EbSP0Tu0+6B/emsYNHZyn6K8g==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-shared-array-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
+ integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
+ integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
+ integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+
+is-weakref@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
+ integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+ integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
+istanbul-api@^1.0.0-alpha:
+ version "1.3.7"
+ resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.3.7.tgz#a86c770d2b03e11e3f778cd7aedd82d2722092aa"
+ integrity sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==
+ dependencies:
+ async "^2.1.4"
+ fileset "^2.0.2"
+ istanbul-lib-coverage "^1.2.1"
+ istanbul-lib-hook "^1.2.2"
+ istanbul-lib-instrument "^1.10.2"
+ istanbul-lib-report "^1.1.5"
+ istanbul-lib-source-maps "^1.2.6"
+ istanbul-reports "^1.5.1"
+ js-yaml "^3.7.0"
+ mkdirp "^0.5.1"
+ once "^1.4.0"
+
+istanbul-lib-coverage@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz#ccf7edcd0a0bb9b8f729feeb0930470f9af664f0"
+ integrity sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==
+
+istanbul-lib-hook@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz#bc6bf07f12a641fbf1c85391d0daa8f0aea6bf86"
+ integrity sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==
+ dependencies:
+ append-transform "^0.4.0"
+
+istanbul-lib-instrument@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz#1f55ed10ac3c47f2bdddd5307935126754d0a9ca"
+ integrity sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==
+ dependencies:
+ babel-generator "^6.18.0"
+ babel-template "^6.16.0"
+ babel-traverse "^6.18.0"
+ babel-types "^6.18.0"
+ babylon "^6.18.0"
+ istanbul-lib-coverage "^1.2.1"
+ semver "^5.3.0"
+
+istanbul-lib-report@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz#f2a657fc6282f96170aaf281eb30a458f7f4170c"
+ integrity sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==
+ dependencies:
+ istanbul-lib-coverage "^1.2.1"
+ mkdirp "^0.5.1"
+ path-parse "^1.0.5"
+ supports-color "^3.1.2"
+
+istanbul-lib-source-maps@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz#37b9ff661580f8fca11232752ee42e08c6675d8f"
+ integrity sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==
+ dependencies:
+ debug "^3.1.0"
+ istanbul-lib-coverage "^1.2.1"
+ mkdirp "^0.5.1"
+ rimraf "^2.6.1"
+ source-map "^0.5.3"
+
+istanbul-reports@^1.5.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.5.1.tgz#97e4dbf3b515e8c484caea15d6524eebd3ff4e1a"
+ integrity sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==
+ dependencies:
+ handlebars "^4.0.3"
+
+istanbul@^1.0.0-alpha:
+ version "1.0.0-alpha.2"
+ resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-1.0.0-alpha.2.tgz#06096bc08e98baad744aae46962d8df9fac63d08"
+ integrity sha1-BglrwI6Yuq10Sq5Gli2N+frGPQg=
+ dependencies:
+ abbrev "1.0.x"
+ async "1.x"
+ istanbul-api "^1.0.0-alpha"
+ js-yaml "3.x"
+ mkdirp "0.5.x"
+ nopt "3.x"
+ which "^1.1.1"
+ wordwrap "^1.0.0"
+
+"js-tokens@^3.0.0 || ^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
+ integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
+
+js-yaml@3.x, js-yaml@^3.13.1, js-yaml@^3.7.0:
+ version "3.14.1"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.1.tgz#dae812fdb3825fa306609a8717383c50c36a0537"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
+ integrity sha1-peZUwuWi3rXyAdls77yoDA7y9RM=
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-1.3.0.tgz#46c3fec8c1892b12b0833db9bc7622176dbab34b"
+ integrity sha1-RsP+yMGJKxKwgz25vHYiF226s0s=
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
+ integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
+
+jsprim@^1.2.2:
+ version "1.4.2"
+ resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.4.0"
+ verror "1.10.0"
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835"
+ integrity sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=
+ dependencies:
+ invert-kv "^1.0.0"
+
+lcov-parse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-1.0.0.tgz#eb0d46b54111ebc561acb4c408ef9363bdc8f7e0"
+ integrity sha1-6w1GtUER68VhrLTECO+TY73I9+A=
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0"
+ integrity sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+lodash@^4.17.14, lodash@^4.17.4:
+ version "4.17.21"
+ resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-driver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
+ integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+map-stream@~0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194"
+ integrity sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=
+
+mime-db@1.51.0:
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c"
+ integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==
+
+mime-types@^2.1.12, mime-types@~2.1.19:
+ version "2.1.34"
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24"
+ integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==
+ dependencies:
+ mime-db "1.51.0"
+
+minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
+ integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
+ integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=
+
+minimist@^1.2.5:
+ version "1.2.5"
+ resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz#67d66014b66a6a8aaa0c083c5fd58df4e4e97602"
+ integrity sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==
+
+mkdirp@0.5.1:
+ version "0.5.1"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903"
+ integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=
+ dependencies:
+ minimist "0.0.8"
+
+mkdirp@0.5.x, mkdirp@^0.5.1:
+ version "0.5.5"
+ resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def"
+ integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==
+ dependencies:
+ minimist "^1.2.5"
+
+mocha@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.yarnpkg.com/mocha/-/mocha-5.2.0.tgz#6d8ae508f59167f940f2b5b3c4a612ae50c90ae6"
+ integrity sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==
+ dependencies:
+ browser-stdout "1.3.1"
+ commander "2.15.1"
+ debug "3.1.0"
+ diff "3.5.0"
+ escape-string-regexp "1.0.5"
+ glob "7.1.2"
+ growl "1.10.5"
+ he "1.1.1"
+ minimatch "3.0.4"
+ mkdirp "0.5.1"
+ supports-color "5.4.0"
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
+ integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
+
+ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+neo-async@^2.6.0:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+nopt@3.x:
+ version "3.0.6"
+ resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
+ integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz#e66db1838b200c1dfc233225d12cb36520e234a8"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+npm-run-all@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-3.1.2.tgz#c7e3faf4aa0a59bf0dcfc12601166151692171cf"
+ integrity sha1-x+P69KoKWb8Nz8EmARZhUWkhcc8=
+ dependencies:
+ chalk "^1.1.3"
+ cross-spawn "^4.0.0"
+ minimatch "^3.0.2"
+ object-assign "^4.0.1"
+ pinkie-promise "^2.0.1"
+ ps-tree "^1.0.1"
+ read-pkg "^1.1.0"
+ read-pkg-up "^1.0.1"
+ shell-quote "^1.6.1"
+ string.prototype.padend "^3.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+ integrity sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+ integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
+
+object-inspect@^1.11.0, object-inspect@^1.9.0:
+ version "1.12.0"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.0.tgz#6e2c120e868fd1fd18cb4f18c31741d0d6e776f0"
+ integrity sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==
+
+object-keys@^1.0.12, object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940"
+ integrity sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==
+ dependencies:
+ call-bind "^1.0.0"
+ define-properties "^1.1.3"
+ has-symbols "^1.0.1"
+ object-keys "^1.1.1"
+
+once@^1.3.0, once@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
+ integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
+ dependencies:
+ wrappy "1"
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9"
+ integrity sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=
+ dependencies:
+ lcid "^1.0.0"
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
+ integrity sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=
+ dependencies:
+ error-ex "^1.2.0"
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b"
+ integrity sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-is-absolute@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
+ integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+
+path-parse@^1.0.5, path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
+ integrity sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+pause-stream@0.0.11:
+ version "0.0.11"
+ resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445"
+ integrity sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=
+ dependencies:
+ through "~2.3"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
+ integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
+ integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw=
+
+pinkie-promise@^2.0.0, pinkie-promise@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
+ integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o=
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
+ integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
+
+ps-tree@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/ps-tree/-/ps-tree-1.2.0.tgz#5e7425b89508736cdd4f2224d028f7bb3f722ebd"
+ integrity sha512-0VnamPPYHl4uaU/nSFeZZpR21QAWRz+sRv4iW9+v/GS/J5U5iZB5BNN6J0RMoOvdx2gWM2+ZFMIm58q24e4UYA==
+ dependencies:
+ event-stream "=3.3.4"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3"
+ integrity sha1-8FKijacOYYkX7wqKw0wa5aaChrM=
+
+psl@^1.1.28:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
+ integrity sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@~6.5.2:
+ version "6.5.2"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36"
+ integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02"
+ integrity sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0, read-pkg@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28"
+ integrity sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda"
+ integrity sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.88.2:
+ version "2.88.2"
+ resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
+ integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1"
+ integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=
+
+resolve@^1.10.0:
+ version "1.21.0"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.21.0.tgz#b51adc97f3472e6a5cf4444d34bc9d6b9037591f"
+ integrity sha512-3wCbTpk5WJlyE4mSOtDLhqQmGFi0/TD9VPwmiolnk8U0wRgMEktqCXd3vy5buTO3tljvalNvKrjHEfrd2WpEKA==
+ dependencies:
+ is-core-module "^2.8.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+rimraf@^2.6.1:
+ version "2.7.1"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+safe-buffer@^5.0.1, safe-buffer@^5.1.2:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.7.1"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+set-blocking@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
+ integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+
+shell-quote@^1.6.1:
+ version "1.7.3"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123"
+ integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+source-map@^0.5.3, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc"
+ integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=
+
+source-map@^0.6.1:
+ version "0.6.1"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz#cf70f50482eefdc98e3ce0a6833e4a53ceeba679"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.11"
+ resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
+ integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+
+split@0.3:
+ version "0.3.3"
+ resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f"
+ integrity sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=
+ dependencies:
+ through "2"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c"
+ integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
+
+sshpk@^1.7.0:
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stream-combiner@~0.0.4:
+ version "0.0.4"
+ resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14"
+ integrity sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=
+ dependencies:
+ duplexer "~0.1.1"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+ integrity sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+string.prototype.padend@^3.0.0:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.3.tgz#997a6de12c92c7cb34dc8a201a6c53d9bd88a5f1"
+ integrity sha512-jNIIeokznm8SD/TZISQsZKYu7RJyheFNt84DUPrh482GC8RVp2MKqm2O5oBRdGxbDQoXrhhWtPIWQOiy20svUg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+string.prototype.trimend@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
+ integrity sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+string.prototype.trimstart@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
+ integrity sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+ integrity sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
+ integrity sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=
+ dependencies:
+ is-utf8 "^0.2.0"
+
+supports-color@5.4.0:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.4.0.tgz#1c6b337402c2137605efe19f10fec390f6faab54"
+ integrity sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+ integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
+
+supports-color@^3.1.2:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
+ integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
+ dependencies:
+ has-flag "^1.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+through@2, through@~2.3, through@~2.3.1:
+ version "2.3.8"
+ resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+ integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47"
+ integrity sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+ integrity sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
+ integrity sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64"
+ integrity sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=
+
+typescript@^2.1.4:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.9.2.tgz#1cbf61d05d6b96269244eb6a3bce4bd914e0f00c"
+ integrity sha512-Gr4p6nFNaoufRIY4NMdpQRNmgxVIGMs4Fcu/ujdYk3nAZqk7supzBE9idmvfZIlH/Cuj//dvi+019qEue9lV0w==
+
+uglify-js@^3.1.4:
+ version "3.14.5"
+ resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.14.5.tgz#cdabb7d4954231d80cb4a927654c4655e51f4859"
+ integrity sha512-qZukoSxOG0urUTvjc2ERMTcAy+BiFh3weWAkeurLwjrCba73poHmG3E36XEjd/JGukMzwTL7uCxZiAexj8ppvQ==
+
+unbox-primitive@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.0.1.tgz#085e215625ec3162574dc8859abee78a59b14471"
+ integrity sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==
+ dependencies:
+ function-bind "^1.1.1"
+ has-bigints "^1.0.1"
+ has-symbols "^1.0.2"
+ which-boxed-primitive "^1.0.2"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz#3a105ca17053af55d6e270c1f8288682e18da400"
+ integrity sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f"
+ integrity sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=
+
+which@^1.1.1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+wordwrap@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
+ integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+ integrity sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
+ integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.2.tgz#85c901bd6470ce71fc4bb723ad209b70f7f28696"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"
+ integrity sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-4.2.1.tgz#29cceac0dc4f03c6c87b4a9f217dd18c9f74871c"
+ integrity sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^6.5.0:
+ version "6.6.0"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-6.6.0.tgz#782ec21ef403345f830a808ca3d513af56065208"
+ integrity sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.2.0"