tiny-types
Advanced tools
| /** | ||
| * @access private | ||
| */ | ||
| export declare function equal(v1: any, v2: any): boolean; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| var significantFields_1 = require("./significantFields"); | ||
| /** | ||
| * @access private | ||
| */ | ||
| function equal(v1, v2) { | ||
| switch (true) { | ||
| case !sameType(v1, v2): | ||
| return false; | ||
| case both(arePrimitives, v1, v2): | ||
| return checkIdentityOf(v1, v2); | ||
| case both(areObjects, v1, v2) && sameClass(v1, v2): | ||
| return checkSignificantFieldsOf(v1, v2); | ||
| } | ||
| return false; | ||
| } | ||
| exports.equal = equal; | ||
| var areObjects = function (_) { return new Object(_) === _; }; | ||
| var arePrimitives = function (_) { return !areObjects(_); }; // arrays are objects | ||
| function both(condition, v1, v2) { | ||
| return condition(v1) && condition(v2); | ||
| } | ||
| var sameType = function (v1, v2) { return typeof v1 === typeof v2; }; | ||
| var sameClass = function (v1, v2) { return (v1.constructor && v2 instanceof v1.constructor) || (v2.constructor && v1 instanceof v2.constructor); }; | ||
| var sameLength = function (v1, v2) { return v1.length === v2.length; }; | ||
| function checkIdentityOf(v1, v2) { | ||
| return v1 === v2; | ||
| } | ||
| function checkSignificantFieldsOf(o1, o2) { | ||
| var fieldsOfObject1 = significantFields_1.significantFieldsOf(o1), fieldsOfObject2 = significantFields_1.significantFieldsOf(o2); | ||
| if (!sameLength(fieldsOfObject1, fieldsOfObject2)) { | ||
| return false; | ||
| } | ||
| return fieldsOfObject1.reduce(function (previousFieldsAreEqual, field) { | ||
| var currentFieldIsEqual = !!o1[field] && !!o2[field] && equal(o1[field], o2[field]); | ||
| return previousFieldsAreEqual && currentFieldIsEqual; | ||
| }, true); | ||
| } | ||
| //# sourceMappingURL=equal.js.map |
| {"version":3,"file":"equal.js","sourceRoot":"","sources":["../../src/objects/equal.ts"],"names":[],"mappings":";;AAAA,yDAA0D;AAE1D;;GAEG;AACH,eAAsB,EAAO,EAAE,EAAO;IAClC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QACX,KAAK,CAAE,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC;YACnB,MAAM,CAAC,KAAK,CAAC;QACjB,KAAK,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,EAAE,CAAC;YAC5B,MAAM,CAAC,eAAe,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACnC,KAAK,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,EAAE,CAAC,IAAI,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;YAC9C,MAAM,CAAC,wBAAwB,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,CAAC,KAAK,CAAC;AACjB,CAAC;AAXD,sBAWC;AAED,IAAM,UAAU,GAAO,UAAC,CAAM,IAAK,OAAA,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,EAAnB,CAAmB,CAAC;AACvD,IAAM,aAAa,GAAI,UAAC,CAAM,IAAK,OAAA,CAAE,UAAU,CAAC,CAAC,CAAC,EAAf,CAAe,CAAC,CAAC,qBAAqB;AAEzE,cAAc,SAA8B,EAAE,EAAO,EAAE,EAAO;IAC1D,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,SAAS,CAAC,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,IAAM,QAAQ,GAAI,UAAC,EAAO,EAAE,EAAO,IAAK,OAAA,OAAO,EAAE,KAAK,OAAO,EAAE,EAAvB,CAAuB,CAAC;AAChE,IAAM,SAAS,GAAG,UAAC,EAAO,EAAE,EAAO,IAAK,OAAA,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,YAAY,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,YAAa,EAAE,CAAC,WAAW,CAAC,EAArG,CAAqG,CAAC;AAC9I,IAAM,UAAU,GAAG,UAAC,EAAsB,EAAE,EAAsB,IAAK,OAAA,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM,EAAvB,CAAuB,CAAC;AAE/F,yBAAyB,EAAO,EAAE,EAAO;IACrC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;AACrB,CAAC;AAED,kCAAkC,EAAU,EAAE,EAAU;IACpD,IACI,eAAe,GAAG,uCAAmB,CAAC,EAAE,CAAC,EACzC,eAAe,GAAG,uCAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,EAAE,CAAC,CAAC,CAAE,UAAU,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,UAAC,sBAA+B,EAAE,KAAa;QACzE,IAAM,mBAAmB,GAAG,CAAC,CAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QACxF,MAAM,CAAC,sBAAsB,IAAI,mBAAmB,CAAC;IACzD,CAAC,EAAE,IAAI,CAAC,CAAC;AACb,CAAC"} |
| export * from './equal'; | ||
| export * from './significantFields'; |
| "use strict"; | ||
| function __export(m) { | ||
| for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p]; | ||
| } | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| __export(require("./equal")); | ||
| __export(require("./significantFields")); | ||
| //# sourceMappingURL=index.js.map |
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/objects/index.ts"],"names":[],"mappings":";;;;;AAAA,6BAAwB;AACxB,yCAAoC"} |
| /** | ||
| * @access private | ||
| * | ||
| * @param {object|Array} o | ||
| * @returns {string[]} | ||
| */ | ||
| export declare function significantFieldsOf(o: { | ||
| [_: string]: any; | ||
| }): string[]; |
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| /** | ||
| * @access private | ||
| * | ||
| * @param {object|Array} o | ||
| * @returns {string[]} | ||
| */ | ||
| function significantFieldsOf(o) { | ||
| return Object.getOwnPropertyNames(o) | ||
| .filter(function (field) { return typeof o[field] !== 'function'; }) | ||
| .sort(); | ||
| } | ||
| exports.significantFieldsOf = significantFieldsOf; | ||
| //# sourceMappingURL=significantFields.js.map |
| {"version":3,"file":"significantFields.js","sourceRoot":"","sources":["../../src/objects/significantFields.ts"],"names":[],"mappings":";;AAAA;;;;;GAKG;AACH,6BAAoC,CAAuB;IACvD,MAAM,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC,CAAC;SAC/B,MAAM,CAAC,UAAA,KAAK,IAAI,OAAA,OAAO,CAAC,CAAC,KAAK,CAAC,KAAK,UAAU,EAA9B,CAA8B,CAAC;SAC/C,IAAI,EAAE,CAAC;AAChB,CAAC;AAJD,kDAIC"} |
| import { significantFieldsOf } from './significantFields'; | ||
| /** | ||
| * @access private | ||
| */ | ||
| export function equal(v1: any, v2: any): boolean { | ||
| switch (true) { | ||
| case ! sameType(v1, v2): | ||
| return false; | ||
| case both(arePrimitives, v1, v2): | ||
| return checkIdentityOf(v1, v2); | ||
| case both(areObjects, v1, v2) && sameClass(v1, v2): | ||
| return checkSignificantFieldsOf(v1, v2); | ||
| } | ||
| return false; | ||
| } | ||
| const areObjects = (_: any) => new Object(_) === _; | ||
| const arePrimitives = (_: any) => ! areObjects(_); // arrays are objects | ||
| function both(condition: (_: any) => boolean, v1: any, v2: any): boolean { | ||
| return condition(v1) && condition(v2); | ||
| } | ||
| const sameType = (v1: any, v2: any) => typeof v1 === typeof v2; | ||
| const sameClass = (v1: any, v2: any) => (v1.constructor && v2 instanceof v1.constructor) || (v2.constructor && v1 instanceof v2.constructor); | ||
| const sameLength = (v1: { length: number }, v2: { length: number }) => v1.length === v2.length; | ||
| function checkIdentityOf(v1: any, v2: any) { | ||
| return v1 === v2; | ||
| } | ||
| function checkSignificantFieldsOf(o1: object, o2: object) { | ||
| const | ||
| fieldsOfObject1 = significantFieldsOf(o1), | ||
| fieldsOfObject2 = significantFieldsOf(o2); | ||
| if (! sameLength(fieldsOfObject1, fieldsOfObject2)) { | ||
| return false; | ||
| } | ||
| return fieldsOfObject1.reduce((previousFieldsAreEqual: boolean, field: string) => { | ||
| const currentFieldIsEqual = !! o1[field] && !! o2[field] && equal(o1[field], o2[field]); | ||
| return previousFieldsAreEqual && currentFieldIsEqual; | ||
| }, true); | ||
| } |
| export * from './equal'; | ||
| export * from './significantFields'; |
| /** | ||
| * @access private | ||
| * | ||
| * @param {object|Array} o | ||
| * @returns {string[]} | ||
| */ | ||
| export function significantFieldsOf(o: { [_: string]: any }) { | ||
| return Object.getOwnPropertyNames(o) | ||
| .filter(field => typeof o[field] !== 'function') | ||
| .sort(); | ||
| } |
@@ -75,3 +75,3 @@ import { JSONObject, NonNullJSONPrimitive, Serialisable } from './types'; | ||
| */ | ||
| equals(another: TinyType): any; | ||
| equals(another: TinyType): boolean; | ||
| toString(): string; | ||
@@ -107,11 +107,4 @@ /** | ||
| * @returns {JSONValue} | ||
| * | ||
| * @todo should also serialise arrays | ||
| */ | ||
| toJSON(): JSONObject | NonNullJSONPrimitive; | ||
| /** | ||
| * @access private | ||
| * @returns {string[]} names of significant fields that determine the identity of the object | ||
| */ | ||
| private significantFields(); | ||
| } |
+7
-27
@@ -14,2 +14,3 @@ "use strict"; | ||
| var check_1 = require("./check"); | ||
| var objects_1 = require("./objects"); | ||
| var predicates_1 = require("./predicates"); | ||
@@ -67,2 +68,3 @@ /** | ||
| } | ||
| // todo: can I make all fields `readonly` without making it a dictionary? | ||
| /** | ||
@@ -101,19 +103,7 @@ * @desc Compares two tiny types by value | ||
| TinyType.prototype.equals = function (another) { | ||
| var _this = this; | ||
| if (another === this) { | ||
| return true; | ||
| } | ||
| if (!(another instanceof this.constructor)) { | ||
| return false; | ||
| } | ||
| return this.significantFields().reduce(function (previousFieldsAreEqual, field) { | ||
| var currentFieldIsEqual = (_this[field].equals | ||
| ? _this[field].equals(another[field]) | ||
| : _this[field] === another[field]); | ||
| return previousFieldsAreEqual && currentFieldIsEqual; | ||
| }, true); | ||
| return objects_1.equal(this, another); | ||
| }; | ||
| TinyType.prototype.toString = function () { | ||
| var _this = this; | ||
| var fields = this.significantFields().reduce(function (acc, field) { | ||
| var fields = objects_1.significantFieldsOf(this).reduce(function (acc, field) { | ||
| return acc.concat(field + "=" + _this[field]); | ||
@@ -152,4 +142,2 @@ }, []); | ||
| * @returns {JSONValue} | ||
| * | ||
| * @todo should also serialise arrays | ||
| */ | ||
@@ -163,2 +151,4 @@ TinyType.prototype.toJSON = function () { | ||
| return value.toJSON(); | ||
| case value && Array.isArray(value): | ||
| return value.map(function (v) { return toJSON(v); }); | ||
| case value && !isPrimitive(value): | ||
@@ -170,3 +160,3 @@ return JSON.stringify(value); | ||
| } | ||
| var fields = this.significantFields(); | ||
| var fields = objects_1.significantFieldsOf(this); | ||
| if (fields.length === 1) { | ||
@@ -180,12 +170,2 @@ return toJSON(this[fields[0]]); | ||
| }; | ||
| /** | ||
| * @access private | ||
| * @returns {string[]} names of significant fields that determine the identity of the object | ||
| */ | ||
| TinyType.prototype.significantFields = function () { | ||
| var _this = this; | ||
| return Object.getOwnPropertyNames(this) | ||
| .filter(function (field) { return typeof _this[field] !== 'function'; }) | ||
| .sort(); | ||
| }; | ||
| return TinyType; | ||
@@ -192,0 +172,0 @@ }()); |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"TinyType.js","sourceRoot":"","sources":["../src/TinyType.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"TinyType.js","sourceRoot":"","sources":["../src/TinyType.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,iCAAgC;AAChC,qCAAuD;AACvD,2CAAyC;AAGzC;;;;;;;;;;;;;;;GAeG;AACH;IACI,MAAM;QAAe,2BAAQ;QACzB,iBAA4B,KAAQ;YAApC,YACI,iBAAO,SAEV;YAH2B,WAAK,GAAL,KAAK,CAAG;YAEhC,aAAK,CAAC,KAAI,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,EAAE,sBAAS,EAAE,CAAC,CAAC;;QACrD,CAAC;QACL,cAAC;IAAD,CAAC,AALM,CAAc,QAAQ,GAK3B;AACN,CAAC;AAPD,gCAOC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH;IAAA;IAwGA,CAAC;IAtGG,yEAAyE;IAEzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA+BG;IACH,yBAAM,GAAN,UAAO,OAAiB;QACpB,MAAM,CAAC,eAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IAED,2BAAQ,GAAR;QAAA,iBAMC;QALG,IAAM,MAAM,GAAG,6BAAmB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAC,GAAa,EAAE,KAAa;YACzE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAI,KAAK,SAAI,KAAI,CAAC,KAAK,CAAG,CAAC,CAAC;QACjD,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,MAAM,CAAI,IAAI,CAAC,WAAW,CAAC,IAAI,SAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAG,CAAC;IAC5D,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,yBAAM,GAAN;QAAA,iBAyBC;QAxBG,IAAM,WAAW,GAAG,UAAC,KAAU,IAAK,OAAA,MAAM,CAAC,KAAK,CAAC,KAAK,KAAK,EAAvB,CAAuB,CAAC;QAC5D,gBAAgB,KAAU;YACtB,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACX,KAAK,KAAK,IAAI,CAAC,CAAE,KAAK,CAAC,MAAM;oBACzB,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1B,KAAK,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBAC9B,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAA,CAAC,IAAI,OAAA,MAAM,CAAC,CAAC,CAAC,EAAT,CAAS,CAAC,CAAC;gBACrC,KAAK,KAAK,IAAI,CAAE,WAAW,CAAC,KAAK,CAAC;oBAC9B,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;gBACjC;oBACI,MAAM,CAAC,KAAK,CAAC,CAAO,mCAAmC;YAC/D,CAAC;QACL,CAAC;QAED,IAAM,MAAM,GAAG,6BAAmB,CAAC,IAAI,CAAC,CAAC;QAEzC,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QAED,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,UAAC,GAAG,EAAE,KAAK;YAC5B,GAAG,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,KAAI,CAAC,KAAK,CAAC,CAAC,CAAC;YACjC,MAAM,CAAC,GAAG,CAAC;QACf,CAAC,EAAE,EAAE,CAAqB,CAAC;IAC/B,CAAC;IACL,eAAC;AAAD,CAAC,AAxGD,IAwGC;AAxGqB,4BAAQ"} |
+1
-1
| { | ||
| "name": "tiny-types", | ||
| "version": "1.6.1", | ||
| "version": "1.7.0", | ||
| "description": "A tiny library that brings Tiny Types to JavaScript and TypeScript", | ||
@@ -5,0 +5,0 @@ "main": "lib/index.js", |
+9
-31
| import { check } from './check'; | ||
| import { equal, significantFieldsOf } from './objects'; | ||
| import { isDefined } from './predicates'; | ||
| import { JSONObject, JSONPrimitive, JSONValue, NonNullJSONPrimitive, Serialisable, Serialised } from './types'; | ||
| import { JSONObject, JSONValue, NonNullJSONPrimitive, Serialisable, Serialised } from './types'; | ||
@@ -51,2 +52,4 @@ /** | ||
| // todo: can I make all fields `readonly` without making it a dictionary? | ||
| /** | ||
@@ -85,22 +88,7 @@ * @desc Compares two tiny types by value | ||
| equals(another: TinyType) { | ||
| if (another === this) { | ||
| return true; | ||
| } | ||
| if (! (another instanceof this.constructor)) { | ||
| return false; | ||
| } | ||
| return this.significantFields().reduce((previousFieldsAreEqual: boolean, field: string) => { | ||
| const currentFieldIsEqual = (this[field].equals | ||
| ? this[field].equals(another[field]) | ||
| : this[field] === another[field]); | ||
| return previousFieldsAreEqual && currentFieldIsEqual; | ||
| }, true); | ||
| return equal(this, another); | ||
| } | ||
| toString() { | ||
| const fields = this.significantFields().reduce((acc: string[], field: string) => { | ||
| const fields = significantFieldsOf(this).reduce((acc: string[], field: string) => { | ||
| return acc.concat(`${field}=${this[field]}`); | ||
@@ -141,4 +129,2 @@ }, []); | ||
| * @returns {JSONValue} | ||
| * | ||
| * @todo should also serialise arrays | ||
| */ | ||
@@ -151,2 +137,4 @@ toJSON(): JSONObject | NonNullJSONPrimitive { | ||
| return value.toJSON(); | ||
| case value && Array.isArray(value): | ||
| return value.map(v => toJSON(v)); | ||
| case value && ! isPrimitive(value): | ||
@@ -159,3 +147,3 @@ return JSON.stringify(value); | ||
| const fields = this.significantFields(); | ||
| const fields = significantFieldsOf(this); | ||
@@ -171,12 +159,2 @@ if (fields.length === 1) { | ||
| } | ||
| /** | ||
| * @access private | ||
| * @returns {string[]} names of significant fields that determine the identity of the object | ||
| */ | ||
| private significantFields(): string[] { | ||
| return Object.getOwnPropertyNames(this) | ||
| .filter(field => typeof this[field] !== 'function') | ||
| .sort(); | ||
| } | ||
| } |
143336
3.53%164
7.89%2806
2.97%