itemsholdr
Advanced tools
Comparing version 0.6.1 to 0.7.0
{ | ||
"name": "itemsholdr", | ||
"description": "Cache-based wrapper around localStorage.", | ||
"version": "0.6.1", | ||
"author": { | ||
"name": "Josh Goldberg", | ||
"email": "joshuakgoldberg@outlook.com" | ||
}, | ||
"repository": { | ||
"type": "git", | ||
"url": "ssh://git@github.com:FullScreenShenanigans/ItemsHoldr.git" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/FullScreenShenanigans/ItemsHoldr/issues" | ||
}, | ||
"license": "MIT", | ||
"devDependencies": { | ||
"gulp-shenanigans": "0.6.X" | ||
} | ||
"author": { | ||
"email": "joshuakgoldberg@outlook.com", | ||
"name": "Josh Goldberg" | ||
}, | ||
"bugs": { | ||
"url": "https://github.com/FullScreenShenanigans/ItemsHoldr/issues" | ||
}, | ||
"dependencies": {}, | ||
"description": "Cache-based wrapper around localStorage.", | ||
"devDependencies": { | ||
"@types/chai": "^4.0.4", | ||
"@types/lolex": "^1.5.32", | ||
"@types/mocha": "^2.2.44", | ||
"@types/sinon": "^4.0.0", | ||
"@types/sinon-chai": "^2.7.29", | ||
"chai": "^4.1.2", | ||
"glob": "^7.1.2", | ||
"gulp": "^3.9.1", | ||
"gulp-shenanigans": "^0.6.17", | ||
"lolex": "^2.3.0", | ||
"mocha": "^4.0.1", | ||
"mocha-headless-chrome": "^1.7.1", | ||
"requirejs": "^2.3.5", | ||
"run-for-every-file": "^1.0.4", | ||
"shenanigans-manager": "^0.2.1", | ||
"sinon": "^4.1.2", | ||
"sinon-chai": "^2.14.0", | ||
"tslint": "5.8.0", | ||
"typedoc": "^0.9.0", | ||
"typescript": "^2.6.2", | ||
"webpack": "^3.10.0" | ||
}, | ||
"license": "MIT", | ||
"name": "itemsholdr", | ||
"repository": { | ||
"type": "git", | ||
"url": "ssh://git@github.com:FullScreenShenanigans/ItemsHoldr.git" | ||
}, | ||
"scripts": { | ||
"dist": "npm run dist:webpack", | ||
"dist:webpack": "webpack --config webpack.config.js", | ||
"docs": "npm run docs:typedoc", | ||
"docs:typedoc": "typedoc src/ --out docs/generated", | ||
"gulp": "gulp", | ||
"init": "npm install && npm run setup && npm run verify", | ||
"setup": "npm run setup:copy && npm run setup:package", | ||
"setup:copy": "npm run setup:copy:default", | ||
"setup:copy:default": "run-for-every-file --dot --src \"node_modules/shenanigans-manager/setup/default/\" --file \"**/*\" --run \"mustache package.json {{src-file}} {{file}}\" --dest \".\"", | ||
"setup:package": "shenanigans-manager hydrate-package-json", | ||
"src": "npm run src:tsc && npm run src:tslint", | ||
"src:tsc": "tsc -p .", | ||
"src:tslint": "tslint -c tslint.json -p tsconfig.json -t stylish", | ||
"test": "npm run test:setup && npm run test:run", | ||
"test:run": "mocha-headless-chrome --file test/index.html", | ||
"test:setup": "npm run test:setup:copy && npm run test:setup:html && npm run test:setup:tsc", | ||
"test:setup:copy": "npm run test:setup:copy:default", | ||
"test:setup:copy:default": "run-for-every-file --dot --src \"node_modules/shenanigans-manager/setup/test/\" --file \"**/*\" --run \"mustache package.json {{src-file}} ./test/{{file}}\" --dest \".\"", | ||
"test:setup:html": "shenanigans-manager generate-test-html", | ||
"test:setup:tsc": "tsc -p test", | ||
"verify": "npm run src && npm run test && npm run dist && npm run docs", | ||
"watch": "tsc -p . -w" | ||
}, | ||
"shenanigans": { | ||
"name": "ItemsHoldr" | ||
}, | ||
"types": "./src/index.d.ts", | ||
"version": "0.7.0" | ||
} |
@@ -0,1 +1,2 @@ | ||
<!-- {{Top}} --> | ||
# ItemsHoldr | ||
@@ -6,17 +7,10 @@ [![Build Status](https://travis-ci.org/FullScreenShenanigans/ItemsHoldr.svg?branch=master)](https://travis-ci.org/FullScreenShenanigans/ItemsHoldr) | ||
Cache-based wrapper around localStorage. | ||
<!-- {{/Top}} --> | ||
<!-- {{Development}} --> | ||
## Development | ||
See [Documentation/Development](https://github.com/FullScreenShenanigans/Documentation). | ||
## Build Process | ||
ItemsHoldr uses [Gulp](http://gulpjs.com/) to automate building, which requires [Node.js](http://node.js.org). | ||
To build from scratch, install NodeJS and run the following commands: | ||
``` | ||
npm install -g gulp | ||
npm install | ||
gulp | ||
``` | ||
See [Build Details](https://github.com/FullScreenShenanigans/Documentation/blob/master/Build%20Details.md) for detailed Gulp usage. | ||
<!-- {{/Development}} --> |
@@ -25,6 +25,2 @@ import { IItemValue, IItemValueDefaults } from "./IItemValue"; | ||
/** | ||
* Arguments to pass to triggered callback Functions. | ||
*/ | ||
callbackArgs?: any[]; | ||
/** | ||
* A localStorage object to use instead of the global localStorage. | ||
@@ -41,20 +37,5 @@ */ | ||
defaults?: IItemValueDefaults; | ||
/** | ||
* Any hardcoded changes to element content. | ||
*/ | ||
displayChanges?: { | ||
[i: string]: string; | ||
}; | ||
/** | ||
* Whether an HTML container should be created to house the IItemValue elements. | ||
*/ | ||
doMakeContainer?: boolean; | ||
/** | ||
* Arguments to pass to create the container, if not the default div and className. | ||
*/ | ||
containersArguments?: [string, any][]; | ||
} | ||
/** | ||
* A versatile container to store and manipulate values in localStorage, and | ||
* optionally keep an updated HTML container showing these values. | ||
* A versatile container to store and manipulate values in localStorage. | ||
*/ | ||
@@ -85,20 +66,2 @@ export interface IItemsHoldr { | ||
/** | ||
* @returns The container HTML element, if it exists. | ||
*/ | ||
getContainer(): HTMLElement; | ||
/** | ||
* @returns createElement arguments for HTML containers, outside-to-inside. | ||
*/ | ||
getContainersArguments(): [string, any][]; | ||
/** | ||
* @returns Any hard-coded changes to element content. | ||
*/ | ||
getDisplayChanges(): { | ||
[i: string]: string; | ||
}; | ||
/** | ||
* @returns Arguments to be passed to triggered event callbacks. | ||
*/ | ||
getCallbackArgs(): any[]; | ||
/** | ||
* @returns String keys for each of the stored IItemValues. | ||
@@ -139,16 +102,13 @@ */ | ||
/** | ||
* Clears a value from the listing, and removes its element from the | ||
* container (if they both exist). | ||
* Clears a value from the listing. | ||
* | ||
* @param key The key of the element to remove. | ||
* @param key The key of the value to remove. | ||
*/ | ||
removeItem(key: string): void; | ||
/** | ||
* Completely clears all values from the ItemsHoldr, removing their | ||
* elements from the container (if they both exist) as well. | ||
* Completely clears all values from the ItemsHoldr. | ||
*/ | ||
clear(): void; | ||
/** | ||
* Sets the value for the ItemValue under the given key, then updates the ItemValue | ||
* (including the ItemValue's element and localStorage, if needed). | ||
* Sets the value for the ItemValue under the given key. | ||
* | ||
@@ -185,3 +145,3 @@ * @param key The key of the ItemValue. | ||
* | ||
* @param key | ||
* @param key Key of an ItemValue. | ||
*/ | ||
@@ -199,63 +159,2 @@ checkExistence(key: string): void; | ||
saveAll(): void; | ||
/** | ||
* Hides the container Element by setting its visibility to hidden. | ||
*/ | ||
hideContainer(): void; | ||
/** | ||
* Shows the container Element by setting its visibility to visible. | ||
*/ | ||
displayContainer(): void; | ||
/** | ||
* Creates the container Element, which contains a child for each ItemValue that | ||
* specifies hasElement to be true. | ||
* | ||
* @param containers An Array representing the Element to be created and the | ||
* children between it and the contained ItemValues. | ||
* Each contained Object has a String tag name as its | ||
* first member, followed by any number of Objects to apply | ||
* via createElement. | ||
* @returns A newly created Element that can be used as a container. | ||
*/ | ||
makeContainer(containers: [string, any][]): HTMLElement; | ||
/** | ||
* @returns Whether displayChanges has an entry for a particular value. | ||
*/ | ||
hasDisplayChange(value: string): boolean; | ||
/** | ||
* @returns The displayChanges entry for a particular value. | ||
*/ | ||
getDisplayChange(value: string): string; | ||
/** | ||
* Creates a new HTMLElement of the given type. For each Object given as | ||
* arguments after, each member is proliferated onto the element. | ||
* | ||
* @param tag The type of the HTMLElement (by default, "div"). | ||
* @param args Any number of Objects to be proliferated onto the | ||
* new HTMLElement. | ||
* @returns A newly created HTMLElement of the given tag. | ||
*/ | ||
createElement(tag?: string, ...args: any[]): HTMLElement; | ||
/** | ||
* Proliferates all members of the donor to the recipient recursively, as | ||
* a deep copy. | ||
* | ||
* @param recipient An object receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferate(recipient: any, donor: any, noOverride?: boolean): any; | ||
/** | ||
* Identical to proliferate, but tailored for HTML elements because many | ||
* element attributes don't play nicely with JavaScript Array standards. | ||
* Looking at you, HTMLCollection! | ||
* | ||
* @param recipient An HTMLElement receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferateElement(recipient: any, donor: any, noOverride?: boolean): any; | ||
} |
define(["require", "exports"], function (require, exports) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
}); | ||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJJSXRlbXNIb2xkci5qcyIsInNvdXJjZXNDb250ZW50IjpbXX0= |
@@ -30,7 +30,2 @@ import { IItemValue, IItemValueDefaults } from "./IItemValue"; | ||
/** | ||
* Arguments to pass to triggered callback Functions. | ||
*/ | ||
callbackArgs?: any[]; | ||
/** | ||
* A localStorage object to use instead of the global localStorage. | ||
@@ -49,22 +44,6 @@ */ | ||
defaults?: IItemValueDefaults; | ||
/** | ||
* Any hardcoded changes to element content. | ||
*/ | ||
displayChanges?: { [i: string]: string }; | ||
/** | ||
* Whether an HTML container should be created to house the IItemValue elements. | ||
*/ | ||
doMakeContainer?: boolean; | ||
/** | ||
* Arguments to pass to create the container, if not the default div and className. | ||
*/ | ||
containersArguments?: [string, any][]; | ||
} | ||
/** | ||
* A versatile container to store and manipulate values in localStorage, and | ||
* optionally keep an updated HTML container showing these values. | ||
* A versatile container to store and manipulate values in localStorage. | ||
*/ | ||
@@ -98,22 +77,2 @@ export interface IItemsHoldr { | ||
/** | ||
* @returns The container HTML element, if it exists. | ||
*/ | ||
getContainer(): HTMLElement; | ||
/** | ||
* @returns createElement arguments for HTML containers, outside-to-inside. | ||
*/ | ||
getContainersArguments(): [string, any][]; | ||
/** | ||
* @returns Any hard-coded changes to element content. | ||
*/ | ||
getDisplayChanges(): { [i: string]: string }; | ||
/** | ||
* @returns Arguments to be passed to triggered event callbacks. | ||
*/ | ||
getCallbackArgs(): any[]; | ||
/** | ||
* @returns String keys for each of the stored IItemValues. | ||
@@ -153,3 +112,3 @@ */ | ||
* Adds a new key & value pair to by linking to a newly created ItemValue. | ||
* | ||
* | ||
* @param key The key to reference by new ItemValue by. | ||
@@ -162,6 +121,5 @@ * @param settings The settings for the new ItemValue. | ||
/** | ||
* Clears a value from the listing, and removes its element from the | ||
* container (if they both exist). | ||
* | ||
* @param key The key of the element to remove. | ||
* Clears a value from the listing. | ||
* | ||
* @param key The key of the value to remove. | ||
*/ | ||
@@ -171,4 +129,3 @@ removeItem(key: string): void; | ||
/** | ||
* Completely clears all values from the ItemsHoldr, removing their | ||
* elements from the container (if they both exist) as well. | ||
* Completely clears all values from the ItemsHoldr. | ||
*/ | ||
@@ -178,5 +135,4 @@ clear(): void; | ||
/** | ||
* Sets the value for the ItemValue under the given key, then updates the ItemValue | ||
* (including the ItemValue's element and localStorage, if needed). | ||
* | ||
* Sets the value for the ItemValue under the given key. | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -190,3 +146,3 @@ * @param value The new value for the ItemValue. | ||
* Numbers or concatenation for Strings. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -200,3 +156,3 @@ * @param amount The amount to increase by (by default, 1). | ||
* Numbers or concatenation for Strings. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -209,3 +165,3 @@ * @param amount The amount to increase by (by default, 1). | ||
* Toggles whether a value is true or false. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -218,4 +174,4 @@ */ | ||
* allowed, it creates it; otherwise, it throws an Error. | ||
* | ||
* @param key | ||
* | ||
* @param key Key of an ItemValue. | ||
*/ | ||
@@ -226,3 +182,3 @@ checkExistence(key: string): void; | ||
* Manually saves an item's value to localStorage, ignoring the autoSave flag. | ||
* | ||
* | ||
* @param key The key of the item to save. | ||
@@ -233,74 +189,5 @@ */ | ||
/** | ||
* Manually saves all values to localStorage, ignoring the autoSave flag. | ||
* Manually saves all values to localStorage, ignoring the autoSave flag. | ||
*/ | ||
saveAll(): void; | ||
/** | ||
* Hides the container Element by setting its visibility to hidden. | ||
*/ | ||
hideContainer(): void; | ||
/** | ||
* Shows the container Element by setting its visibility to visible. | ||
*/ | ||
displayContainer(): void; | ||
/** | ||
* Creates the container Element, which contains a child for each ItemValue that | ||
* specifies hasElement to be true. | ||
* | ||
* @param containers An Array representing the Element to be created and the | ||
* children between it and the contained ItemValues. | ||
* Each contained Object has a String tag name as its | ||
* first member, followed by any number of Objects to apply | ||
* via createElement. | ||
* @returns A newly created Element that can be used as a container. | ||
*/ | ||
makeContainer(containers: [string, any][]): HTMLElement; | ||
/** | ||
* @returns Whether displayChanges has an entry for a particular value. | ||
*/ | ||
hasDisplayChange(value: string): boolean; | ||
/** | ||
* @returns The displayChanges entry for a particular value. | ||
*/ | ||
getDisplayChange(value: string): string; | ||
/** | ||
* Creates a new HTMLElement of the given type. For each Object given as | ||
* arguments after, each member is proliferated onto the element. | ||
* | ||
* @param tag The type of the HTMLElement (by default, "div"). | ||
* @param args Any number of Objects to be proliferated onto the | ||
* new HTMLElement. | ||
* @returns A newly created HTMLElement of the given tag. | ||
*/ | ||
createElement(tag?: string, ...args: any[]): HTMLElement; | ||
/** | ||
* Proliferates all members of the donor to the recipient recursively, as | ||
* a deep copy. | ||
* | ||
* @param recipient An object receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferate(recipient: any, donor: any, noOverride?: boolean): any; | ||
/** | ||
* Identical to proliferate, but tailored for HTML elements because many | ||
* element attributes don't play nicely with JavaScript Array standards. | ||
* Looking at you, HTMLCollection! | ||
* | ||
* @param recipient An HTMLElement receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferateElement(recipient: any, donor: any, noOverride?: boolean): any; | ||
} |
@@ -37,10 +37,2 @@ /** | ||
/** | ||
* Whether an Element should be created and synced to the value. | ||
*/ | ||
hasElement?: boolean; | ||
/** | ||
* An Element tag to use in creating the element, if hasElement is true. | ||
*/ | ||
elementTag?: string; | ||
/** | ||
* A minimum value for the value to equal, if value is a number. | ||
@@ -79,4 +71,3 @@ */ | ||
/** | ||
* Storage container for a single IItemsHoldr value. The value may have triggers | ||
* assigned to value, modularity, and other triggers, as well as an HTML element. | ||
* Storage container for a single IItemsHoldr value. | ||
*/ | ||
@@ -96,9 +87,3 @@ export interface IItemValue { | ||
/** | ||
* @returns The stored HTML element, if it exists. | ||
*/ | ||
getElement(): HTMLElement; | ||
/** | ||
* General update Function to be run whenever the internal value is changed. | ||
* It runs all the trigger, modular, etc. checks, updates the HTML element | ||
* if there is one, and updates localStorage if needed. | ||
*/ | ||
@@ -105,0 +90,0 @@ update(): void; |
define(["require", "exports"], function (require, exports) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
}); | ||
//# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsImZpbGUiOiJJSXRlbVZhbHVlLmpzIiwic291cmNlc0NvbnRlbnQiOltdfQ== |
@@ -43,12 +43,2 @@ /** | ||
/** | ||
* Whether an Element should be created and synced to the value. | ||
*/ | ||
hasElement?: boolean; | ||
/** | ||
* An Element tag to use in creating the element, if hasElement is true. | ||
*/ | ||
elementTag?: string; | ||
/** | ||
* A minimum value for the value to equal, if value is a number. | ||
@@ -95,4 +85,3 @@ */ | ||
/** | ||
* Storage container for a single IItemsHoldr value. The value may have triggers | ||
* assigned to value, modularity, and other triggers, as well as an HTML element. | ||
* Storage container for a single IItemsHoldr value. | ||
*/ | ||
@@ -114,10 +103,3 @@ export interface IItemValue { | ||
/** | ||
* @returns The stored HTML element, if it exists. | ||
*/ | ||
getElement(): HTMLElement; | ||
/** | ||
* General update Function to be run whenever the internal value is changed. | ||
* It runs all the trigger, modular, etc. checks, updates the HTML element | ||
* if there is one, and updates localStorage if needed. | ||
*/ | ||
@@ -128,3 +110,3 @@ update(): void; | ||
* Stores a ItemValue's value in localStorage under the prefix plus its key. | ||
* | ||
* | ||
* @param overrideAutoSave Whether the policy on saving should be ignored | ||
@@ -131,0 +113,0 @@ * so saving happens regardless. By default, false. |
@@ -11,48 +11,32 @@ import { IItemsHoldr, IItemsHoldrSettings } from "./IItemsHoldr"; | ||
*/ | ||
private settings; | ||
private readonly settings; | ||
/** | ||
* The ItemValues being stored, keyed by name. | ||
*/ | ||
private items; | ||
/** | ||
* A listing of all the String keys for the stored items. | ||
*/ | ||
private itemKeys; | ||
/** | ||
* Default attributes for ItemValues. | ||
*/ | ||
private defaults; | ||
private readonly defaults; | ||
/** | ||
* A reference to localStorage or a replacement object. | ||
*/ | ||
private localStorage; | ||
private readonly localStorage; | ||
/** | ||
* A prefix to store things under in localStorage. | ||
*/ | ||
private prefix; | ||
private readonly prefix; | ||
/** | ||
* Whether new items are allowed to be created using setItem. | ||
*/ | ||
private allowNewItems; | ||
private readonly allowNewItems; | ||
/** | ||
* Whether this should save changes to localStorage automatically. | ||
* The ItemValues being stored, keyed by name. | ||
*/ | ||
private autoSave; | ||
private items; | ||
/** | ||
* A container element containing children for each value's element. | ||
* A listing of all the String keys for the stored items. | ||
*/ | ||
private container; | ||
private itemKeys; | ||
/** | ||
* An Array of elements as createElement arguments, outside-to-inside. | ||
* Whether this should save changes to localStorage automatically. | ||
*/ | ||
private containersArguments; | ||
private autoSave; | ||
/** | ||
* Any hardcoded changes to element content, such as "INF" for Infinity. | ||
*/ | ||
private displayChanges; | ||
/** | ||
* Arguments to be passed to triggered callback Functions. | ||
*/ | ||
private callbackArgs; | ||
/** | ||
* Initializes a new instance of the ItemsHoldr class. | ||
@@ -64,2 +48,4 @@ * | ||
/** | ||
* Gets the key at an index. | ||
* | ||
* @param index An index for a key. | ||
@@ -70,2 +56,4 @@ * @returns The indexed key. | ||
/** | ||
* Gets the contained values. | ||
* | ||
* @returns The values contained within, keyed by their keys. | ||
@@ -77,10 +65,16 @@ */ | ||
/** | ||
* @returns {Mixed} Default attributes for values. | ||
* Gets the default attributes for values. | ||
* | ||
* @returns Default attributes for values. | ||
*/ | ||
getDefaults(): any; | ||
/** | ||
* @returns A reference to localStorage or a replacment object. | ||
* Gets the reference to localStorage or its placeholder. | ||
* | ||
* @returns A reference to localStorage or its placeholder. | ||
*/ | ||
getLocalStorage(): Storage; | ||
/** | ||
* Gets whether this should save changes to localStorage automatically. | ||
* | ||
* @returns Whether this should save changes to localStorage automatically. | ||
@@ -90,24 +84,10 @@ */ | ||
/** | ||
* @returns The prefix to store thigns under in localStorage. | ||
* Gets the prefix for localStorage keys. | ||
* | ||
* @returns The prefix to store keys under in localStorage. | ||
*/ | ||
getPrefix(): string; | ||
/** | ||
* @returns The container HTML element, if it exists. | ||
*/ | ||
getContainer(): HTMLElement; | ||
/** | ||
* @returns createElement arguments for HTML containers, outside-to-inside. | ||
*/ | ||
getContainersArguments(): [string, any][]; | ||
/** | ||
* @returns Any hard-coded changes to element content. | ||
*/ | ||
getDisplayChanges(): { | ||
[i: string]: string; | ||
}; | ||
/** | ||
* @returns Arguments to be passed to triggered event callbacks. | ||
*/ | ||
getCallbackArgs(): any[]; | ||
/** | ||
* Gets all keys for all items. | ||
* | ||
* @returns String keys for each of the stored ItemValues. | ||
@@ -117,6 +97,10 @@ */ | ||
/** | ||
* @returns All String keys of items. | ||
* Gets all stored keys of items. | ||
* | ||
* @returns All keys of items. | ||
*/ | ||
getItemKeys(): string[]; | ||
/** | ||
* Gets the value for a known key. | ||
* | ||
* @param key The key for a known value. | ||
@@ -127,3 +111,5 @@ * @returns The known value of a key, assuming that key exists. | ||
/** | ||
* @param key The key for a known value. | ||
* Gets the value for a potentially unknown key. | ||
* | ||
* @param key The key for a potentially unknown value. | ||
* @returns The settings for that particular key. | ||
@@ -133,2 +119,4 @@ */ | ||
/** | ||
* Checks whether a key exists. | ||
* | ||
* @param key The key for a potentially known value. | ||
@@ -139,2 +127,4 @@ * @returns Whether there is a value under that key. | ||
/** | ||
* Maps key names to their values. | ||
* | ||
* @returns A mapping of key names to the actual values of all objects being stored. | ||
@@ -214,74 +204,2 @@ */ | ||
saveAll(): void; | ||
/** | ||
* Hides the container Element by setting its visibility to hidden. | ||
*/ | ||
hideContainer(): void; | ||
/** | ||
* Shows the container Element by setting its visibility to visible. | ||
*/ | ||
displayContainer(): void; | ||
/** | ||
* Creates the container Element, which contains a child for each ItemValue that | ||
* specifies hasElement to be true. | ||
* | ||
* @param containers An Array representing the Element to be created and the | ||
* children between it and the contained ItemValues. | ||
* Each contained Object has a String tag name as its | ||
* first member, followed by any number of Objects to apply | ||
* via createElement. | ||
* @returns A newly created Element that can be used as a container. | ||
*/ | ||
makeContainer(containers: [string, any][]): HTMLElement; | ||
/** | ||
* @returns Whether displayChanges has an entry for a particular value. | ||
*/ | ||
hasDisplayChange(value: string): boolean; | ||
/** | ||
* @returns The displayChanges entry for a particular value. | ||
*/ | ||
getDisplayChange(value: string): string; | ||
/** | ||
* Creates a new HTMLElement of the given type. For each Object given as | ||
* arguments after, each member is proliferated onto the element. | ||
* | ||
* @param tag The type of the HTMLElement (by default, "div"). | ||
* @param args Any number of Objects to be proliferated onto the | ||
* new HTMLElement. | ||
* @returns A newly created HTMLElement of the given tag. | ||
*/ | ||
createElement(tag?: string, ...args: any[]): HTMLElement; | ||
/** | ||
* Proliferates all members of the donor to the recipient recursively, as | ||
* a deep copy. | ||
* | ||
* @param recipient An object receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferate(recipient: any, donor: any, noOverride?: boolean): any; | ||
/** | ||
* Identical to proliferate, but tailored for HTML elements because many | ||
* element attributes don't play nicely with JavaScript Array standards. | ||
* Looking at you, HTMLCollection! | ||
* | ||
* @param recipient An HTMLElement receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
proliferateElement(recipient: any, donor: any, noOverride?: boolean): HTMLElement; | ||
/** | ||
* Creates an Object that can be used to create a new LocalStorage | ||
* replacement, if the JavaScript environment doesn't have one. | ||
* | ||
* @returns {Object} | ||
*/ | ||
private createPlaceholderStorage(); | ||
/** | ||
* Resets this.items to their default values and resets this.itemKeys. | ||
*/ | ||
private resetItemsToDefaults(); | ||
} |
@@ -1,3 +0,4 @@ | ||
define(["require", "exports", "./ItemValue"], function (require, exports, ItemValue_1) { | ||
define(["require", "exports", "./createPlaceholderStorage", "./ItemValue"], function (require, exports, createPlaceholderStorage_1, ItemValue_1) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
/** | ||
@@ -7,3 +8,3 @@ * A versatile container to store and manipulate values in localStorage, and | ||
*/ | ||
var ItemsHoldr = (function () { | ||
var ItemsHoldr = /** @class */ (function () { | ||
/** | ||
@@ -18,3 +19,2 @@ * Initializes a new instance of the ItemsHoldr class. | ||
this.autoSave = !!settings.autoSave; | ||
this.callbackArgs = settings.callbackArgs || []; | ||
this.prefix = settings.prefix || ""; | ||
@@ -27,3 +27,3 @@ this.allowNewItems = settings.allowNewItems === undefined | ||
else if (typeof localStorage === "undefined") { | ||
this.localStorage = this.createPlaceholderStorage(); | ||
this.localStorage = createPlaceholderStorage_1.createPlaceholderStorage(); | ||
} | ||
@@ -34,14 +34,7 @@ else { | ||
this.defaults = settings.defaults || {}; | ||
this.displayChanges = settings.displayChanges || {}; | ||
this.resetItemsToDefaults(); | ||
if (settings.doMakeContainer) { | ||
this.containersArguments = settings.containersArguments || [ | ||
["div", { | ||
"className": this.prefix + "_container" | ||
}] | ||
]; | ||
this.container = this.makeContainer(this.containersArguments); | ||
} | ||
this.clear(); | ||
} | ||
/** | ||
* Gets the key at an index. | ||
* | ||
* @param index An index for a key. | ||
@@ -54,2 +47,4 @@ * @returns The indexed key. | ||
/** | ||
* Gets the contained values. | ||
* | ||
* @returns The values contained within, keyed by their keys. | ||
@@ -61,3 +56,5 @@ */ | ||
/** | ||
* @returns {Mixed} Default attributes for values. | ||
* Gets the default attributes for values. | ||
* | ||
* @returns Default attributes for values. | ||
*/ | ||
@@ -68,3 +65,5 @@ ItemsHoldr.prototype.getDefaults = function () { | ||
/** | ||
* @returns A reference to localStorage or a replacment object. | ||
* Gets the reference to localStorage or its placeholder. | ||
* | ||
* @returns A reference to localStorage or its placeholder. | ||
*/ | ||
@@ -75,2 +74,4 @@ ItemsHoldr.prototype.getLocalStorage = function () { | ||
/** | ||
* Gets whether this should save changes to localStorage automatically. | ||
* | ||
* @returns Whether this should save changes to localStorage automatically. | ||
@@ -82,3 +83,5 @@ */ | ||
/** | ||
* @returns The prefix to store thigns under in localStorage. | ||
* Gets the prefix for localStorage keys. | ||
* | ||
* @returns The prefix to store keys under in localStorage. | ||
*/ | ||
@@ -89,26 +92,4 @@ ItemsHoldr.prototype.getPrefix = function () { | ||
/** | ||
* @returns The container HTML element, if it exists. | ||
*/ | ||
ItemsHoldr.prototype.getContainer = function () { | ||
return this.container; | ||
}; | ||
/** | ||
* @returns createElement arguments for HTML containers, outside-to-inside. | ||
*/ | ||
ItemsHoldr.prototype.getContainersArguments = function () { | ||
return this.containersArguments; | ||
}; | ||
/** | ||
* @returns Any hard-coded changes to element content. | ||
*/ | ||
ItemsHoldr.prototype.getDisplayChanges = function () { | ||
return this.displayChanges; | ||
}; | ||
/** | ||
* @returns Arguments to be passed to triggered event callbacks. | ||
*/ | ||
ItemsHoldr.prototype.getCallbackArgs = function () { | ||
return this.callbackArgs; | ||
}; | ||
/** | ||
* Gets all keys for all items. | ||
* | ||
* @returns String keys for each of the stored ItemValues. | ||
@@ -120,3 +101,5 @@ */ | ||
/** | ||
* @returns All String keys of items. | ||
* Gets all stored keys of items. | ||
* | ||
* @returns All keys of items. | ||
*/ | ||
@@ -127,2 +110,4 @@ ItemsHoldr.prototype.getItemKeys = function () { | ||
/** | ||
* Gets the value for a known key. | ||
* | ||
* @param key The key for a known value. | ||
@@ -136,3 +121,5 @@ * @returns The known value of a key, assuming that key exists. | ||
/** | ||
* @param key The key for a known value. | ||
* Gets the value for a potentially unknown key. | ||
* | ||
* @param key The key for a potentially unknown value. | ||
* @returns The settings for that particular key. | ||
@@ -144,2 +131,4 @@ */ | ||
/** | ||
* Checks whether a key exists. | ||
* | ||
* @param key The key for a potentially known value. | ||
@@ -152,2 +141,4 @@ * @returns Whether there is a value under that key. | ||
/** | ||
* Maps key names to their values. | ||
* | ||
* @returns A mapping of key names to the actual values of all objects being stored. | ||
@@ -158,5 +149,3 @@ */ | ||
for (var i in this.items) { | ||
if (this.items.hasOwnProperty(i)) { | ||
output[i] = this.items[i].getValue(); | ||
} | ||
output[i] = this.items[i].getValue(); | ||
} | ||
@@ -188,5 +177,2 @@ return output; | ||
} | ||
if (this.container && this.items[key].getElement() !== undefined) { | ||
this.container.removeChild(this.items[key].getElement()); | ||
} | ||
this.itemKeys.splice(this.itemKeys.indexOf(key), 1); | ||
@@ -201,10 +187,12 @@ delete this.items[key]; | ||
ItemsHoldr.prototype.clear = function () { | ||
if (this.container) { | ||
for (var i in this.items) { | ||
if (this.items[i].getElement() !== undefined) { | ||
this.container.removeChild(this.items[i].getElement()); | ||
} | ||
this.items = {}; | ||
this.itemKeys = []; | ||
if (!this.settings.values) { | ||
return; | ||
} | ||
for (var key in this.settings.values) { | ||
if (this.settings.values.hasOwnProperty(key)) { | ||
this.addItem(key, this.settings.values[key]); | ||
} | ||
} | ||
this.resetItemsToDefaults(); | ||
}; | ||
@@ -232,2 +220,3 @@ /** | ||
this.checkExistence(key); | ||
// tslint:disable-next-line restrict-plus-operands | ||
var value = this.items[key].getValue() + amount; | ||
@@ -296,226 +285,5 @@ this.items[key].setValue(value); | ||
for (var key in this.items) { | ||
if (this.items.hasOwnProperty(key)) { | ||
this.items[key].updateLocalStorage(true); | ||
} | ||
this.items[key].updateLocalStorage(true); | ||
} | ||
}; | ||
/** | ||
* Hides the container Element by setting its visibility to hidden. | ||
*/ | ||
ItemsHoldr.prototype.hideContainer = function () { | ||
this.container.style.visibility = "hidden"; | ||
}; | ||
/** | ||
* Shows the container Element by setting its visibility to visible. | ||
*/ | ||
ItemsHoldr.prototype.displayContainer = function () { | ||
this.container.style.visibility = "visible"; | ||
}; | ||
/** | ||
* Creates the container Element, which contains a child for each ItemValue that | ||
* specifies hasElement to be true. | ||
* | ||
* @param containers An Array representing the Element to be created and the | ||
* children between it and the contained ItemValues. | ||
* Each contained Object has a String tag name as its | ||
* first member, followed by any number of Objects to apply | ||
* via createElement. | ||
* @returns A newly created Element that can be used as a container. | ||
*/ | ||
ItemsHoldr.prototype.makeContainer = function (containers) { | ||
var output = this.createElement.apply(this, containers[0]); | ||
var lastElement = output; | ||
for (var i = 1; i < containers.length; i += 1) { | ||
var child = this.createElement.apply(this, containers[i]); | ||
lastElement.appendChild(child); | ||
lastElement = child; | ||
} | ||
for (var key in this.items) { | ||
if (this.items[key].getElement() !== undefined) { | ||
lastElement.appendChild(this.items[key].getElement()); | ||
} | ||
} | ||
return output; | ||
}; | ||
/** | ||
* @returns Whether displayChanges has an entry for a particular value. | ||
*/ | ||
ItemsHoldr.prototype.hasDisplayChange = function (value) { | ||
return this.displayChanges.hasOwnProperty(value); | ||
}; | ||
/** | ||
* @returns The displayChanges entry for a particular value. | ||
*/ | ||
ItemsHoldr.prototype.getDisplayChange = function (value) { | ||
return this.displayChanges[value]; | ||
}; | ||
/** | ||
* Creates a new HTMLElement of the given type. For each Object given as | ||
* arguments after, each member is proliferated onto the element. | ||
* | ||
* @param tag The type of the HTMLElement (by default, "div"). | ||
* @param args Any number of Objects to be proliferated onto the | ||
* new HTMLElement. | ||
* @returns A newly created HTMLElement of the given tag. | ||
*/ | ||
ItemsHoldr.prototype.createElement = function (tag) { | ||
if (tag === void 0) { tag = "div"; } | ||
var args = []; | ||
for (var _i = 1; _i < arguments.length; _i++) { | ||
args[_i - 1] = arguments[_i]; | ||
} | ||
var element = document.createElement(tag); | ||
// For each provided object, add those settings to the element | ||
for (var _a = 0, args_1 = args; _a < args_1.length; _a++) { | ||
var arg = args_1[_a]; | ||
this.proliferateElement(element, arg); | ||
} | ||
return element; | ||
}; | ||
/** | ||
* Proliferates all members of the donor to the recipient recursively, as | ||
* a deep copy. | ||
* | ||
* @param recipient An object receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
ItemsHoldr.prototype.proliferate = function (recipient, donor, noOverride) { | ||
// For each attribute of the donor: | ||
for (var i in donor) { | ||
if (!donor.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If noOverride, don't override already existing properties | ||
if (noOverride && recipient.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If it's an object, recurse on a new version of it | ||
var setting = donor[i]; | ||
if (typeof setting === "object") { | ||
if (!recipient.hasOwnProperty(i)) { | ||
recipient[i] = new setting.constructor(); | ||
} | ||
this.proliferate(recipient[i], setting, noOverride); | ||
} | ||
else { | ||
// Regular primitives are easy to copy otherwise | ||
recipient[i] = setting; | ||
} | ||
} | ||
return recipient; | ||
}; | ||
/** | ||
* Identical to proliferate, but tailored for HTML elements because many | ||
* element attributes don't play nicely with JavaScript Array standards. | ||
* Looking at you, HTMLCollection! | ||
* | ||
* @param recipient An HTMLElement receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
ItemsHoldr.prototype.proliferateElement = function (recipient, donor, noOverride) { | ||
// For each attribute of the donor: | ||
for (var i in donor) { | ||
if (!donor.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If noOverride, don't override already existing properties | ||
if (noOverride && recipient.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
var setting = donor[i]; | ||
// Special cases for HTML elements | ||
switch (i) { | ||
// Children and options: just append all of them directly | ||
case "children": | ||
case "options": | ||
if (typeof setting !== "undefined") { | ||
for (var _i = 0, setting_1 = setting; _i < setting_1.length; _i++) { | ||
var member = setting_1[_i]; | ||
recipient.appendChild(member); | ||
} | ||
} | ||
break; | ||
// Style: proliferate (instead of making a new Object) | ||
case "style": | ||
this.proliferate(recipient[i], setting); | ||
break; | ||
// By default, use the normal proliferate logic | ||
default: | ||
// If it's an object, recurse on a new version of it | ||
if (typeof setting === "object") { | ||
if (!recipient.hasOwnProperty(i)) { | ||
recipient[i] = new setting.constructor(); | ||
} | ||
this.proliferate(recipient[i], setting, noOverride); | ||
} | ||
else { | ||
// Regular primitives are easy to copy otherwise | ||
recipient[i] = setting; | ||
} | ||
break; | ||
} | ||
} | ||
return recipient; | ||
}; | ||
/** | ||
* Creates an Object that can be used to create a new LocalStorage | ||
* replacement, if the JavaScript environment doesn't have one. | ||
* | ||
* @returns {Object} | ||
*/ | ||
ItemsHoldr.prototype.createPlaceholderStorage = function () { | ||
var _this = this; | ||
var output = { | ||
keys: [], | ||
getItem: function (key) { | ||
return _this.localStorage[key]; | ||
}, | ||
setItem: function (key, value) { | ||
_this.localStorage[key] = value; | ||
}, | ||
clear: function () { | ||
for (var i in _this) { | ||
if (_this.hasOwnProperty(i)) { | ||
delete _this[i]; | ||
} | ||
} | ||
}, | ||
removeItem: function (key) { | ||
delete _this[key]; | ||
}, | ||
key: function (index) { | ||
return this.keys[index]; | ||
} | ||
}; | ||
Object.defineProperties(output, { | ||
length: { | ||
get: function () { return output.keys.length; } | ||
}, | ||
remainingSpace: { | ||
get: function () { return 9001; } | ||
} | ||
}); | ||
return output; | ||
}; | ||
/** | ||
* Resets this.items to their default values and resets this.itemKeys. | ||
*/ | ||
ItemsHoldr.prototype.resetItemsToDefaults = function () { | ||
this.items = {}; | ||
this.itemKeys = []; | ||
if (!this.settings.values) { | ||
return; | ||
} | ||
for (var key in this.settings.values) { | ||
if (this.settings.values.hasOwnProperty(key)) { | ||
this.addItem(key, this.settings.values[key]); | ||
} | ||
} | ||
}; | ||
return ItemsHoldr; | ||
@@ -525,3 +293,1 @@ }()); | ||
}); | ||
//# sourceMappingURL=data:application/json;charset=utf8;base64,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R0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNuQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUM7UUFDTCxpQkFBQztJQUFELENBdm1CQSxBQXVtQkMsSUFBQTtJQXZtQlksa0JBQVUsYUF1bUJ0QixDQUFBIiwiZmlsZSI6Ikl0ZW1zSG9sZHIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSXRlbXMsIElJdGVtc0hvbGRyLCBJSXRlbXNIb2xkclNldHRpbmdzIH0gZnJvbSBcIi4vSUl0ZW1zSG9sZHJcIjtcclxuaW1wb3J0IHsgSUl0ZW1WYWx1ZSwgSUl0ZW1WYWx1ZURlZmF1bHRzIH0gZnJvbSBcIi4vSUl0ZW1WYWx1ZVwiO1xyXG5pbXBvcnQgeyBJdGVtVmFsdWUgfSBmcm9tIFwiLi9JdGVtVmFsdWVcIjtcclxuXHJcbi8qKlxyXG4gKiBBIHZlcnNhdGlsZSBjb250YWluZXIgdG8gc3RvcmUgYW5kIG1hbmlwdWxhdGUgdmFsdWVzIGluIGxvY2FsU3RvcmFnZSwgYW5kXHJcbiAqIG9wdGlvbmFsbHkga2VlcCBhbiB1cGRhdGVkIEhUTUwgY29udGFpbmVyIHNob3dpbmcgdGhlc2UgdmFsdWVzLiBcclxuICovXHJcbmV4cG9ydCBjbGFzcyBJdGVtc0hvbGRyIGltcGxlbWVudHMgSUl0ZW1zSG9sZHIge1xyXG4gICAgLyoqXHJcbiAgICAgKiBTZXR0aW5ncyB1c2VkIHRvIGNvbnN0cnVjdCB0aGlzIEl0ZW1zSG9sZHIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2V0dGluZ3M6IElJdGVtc0hvbGRyU2V0dGluZ3M7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgSXRlbVZhbHVlcyBiZWluZyBzdG9yZWQsIGtleWVkIGJ5IG5hbWUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaXRlbXM6IElJdGVtcztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgbGlzdGluZyBvZiBhbGwgdGhlIFN0cmluZyBrZXlzIGZvciB0aGUgc3RvcmVkIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGl0ZW1LZXlzOiBzdHJpbmdbXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIERlZmF1bHQgYXR0cmlidXRlcyBmb3IgSXRlbVZhbHVlcy5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBkZWZhdWx0czogSUl0ZW1WYWx1ZURlZmF1bHRzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSByZWZlcmVuY2UgdG8gbG9jYWxTdG9yYWdlIG9yIGEgcmVwbGFjZW1lbnQgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGxvY2FsU3RvcmFnZTogU3RvcmFnZTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgcHJlZml4IHRvIHN0b3JlIHRoaW5ncyB1bmRlciBpbiBsb2NhbFN0b3JhZ2UuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgcHJlZml4OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBXaGV0aGVyIG5ldyBpdGVtcyBhcmUgYWxsb3dlZCB0byBiZSBjcmVhdGVkIHVzaW5nIHNldEl0ZW0uXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYWxsb3dOZXdJdGVtczogYm9vbGVhbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhpcyBzaG91bGQgc2F2ZSBjaGFuZ2VzIHRvIGxvY2FsU3RvcmFnZSBhdXRvbWF0aWNhbGx5LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGF1dG9TYXZlOiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjb250YWluZXIgZWxlbWVudCBjb250YWluaW5nIGNoaWxkcmVuIGZvciBlYWNoIHZhbHVlJ3MgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb250YWluZXI6IEhUTUxFbGVtZW50O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gQXJyYXkgb2YgZWxlbWVudHMgYXMgY3JlYXRlRWxlbWVudCBhcmd1bWVudHMsIG91dHNpZGUtdG8taW5zaWRlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNvbnRhaW5lcnNBcmd1bWVudHM6IFtzdHJpbmcsIGFueV1bXTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEFueSBoYXJkY29kZWQgY2hhbmdlcyB0byBlbGVtZW50IGNvbnRlbnQsIHN1Y2ggYXMgXCJJTkZcIiBmb3IgSW5maW5pdHkuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZGlzcGxheUNoYW5nZXM6IHsgW2k6IHN0cmluZ106IHN0cmluZyB9O1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQXJndW1lbnRzIHRvIGJlIHBhc3NlZCB0byB0cmlnZ2VyZWQgY2FsbGJhY2sgRnVuY3Rpb25zLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNhbGxiYWNrQXJnczogYW55W107XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbml0aWFsaXplcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgSXRlbXNIb2xkciBjbGFzcy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHNldHRpbmdzICAgQW55IG9wdGlvbmFsIGN1c3RvbSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IElJdGVtc0hvbGRyU2V0dGluZ3MgPSB7fSkge1xyXG4gICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcclxuICAgICAgICB0aGlzLmF1dG9TYXZlID0gISFzZXR0aW5ncy5hdXRvU2F2ZTtcclxuICAgICAgICB0aGlzLmNhbGxiYWNrQXJncyA9IHNldHRpbmdzLmNhbGxiYWNrQXJncyB8fCBbXTtcclxuICAgICAgICB0aGlzLnByZWZpeCA9IHNldHRpbmdzLnByZWZpeCB8fCBcIlwiO1xyXG5cclxuICAgICAgICB0aGlzLmFsbG93TmV3SXRlbXMgPSBzZXR0aW5ncy5hbGxvd05ld0l0ZW1zID09PSB1bmRlZmluZWRcclxuICAgICAgICAgICAgPyB0cnVlIDogc2V0dGluZ3MuYWxsb3dOZXdJdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHNldHRpbmdzLmxvY2FsU3RvcmFnZSkge1xyXG4gICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZSA9IHNldHRpbmdzLmxvY2FsU3RvcmFnZTtcclxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBsb2NhbFN0b3JhZ2UgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgdGhpcy5sb2NhbFN0b3JhZ2UgPSB0aGlzLmNyZWF0ZVBsYWNlaG9sZGVyU3RvcmFnZSgpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5kZWZhdWx0cyA9IHNldHRpbmdzLmRlZmF1bHRzIHx8IHt9O1xyXG4gICAgICAgIHRoaXMuZGlzcGxheUNoYW5nZXMgPSBzZXR0aW5ncy5kaXNwbGF5Q2hhbmdlcyB8fCB7fTtcclxuXHJcbiAgICAgICAgdGhpcy5yZXNldEl0ZW1zVG9EZWZhdWx0cygpO1xyXG5cclxuICAgICAgICBpZiAoc2V0dGluZ3MuZG9NYWtlQ29udGFpbmVyKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY29udGFpbmVyc0FyZ3VtZW50cyA9IHNldHRpbmdzLmNvbnRhaW5lcnNBcmd1bWVudHMgfHwgW1xyXG4gICAgICAgICAgICAgICAgW1wiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgICAgICBcImNsYXNzTmFtZVwiOiB0aGlzLnByZWZpeCArIFwiX2NvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICB9XVxyXG4gICAgICAgICAgICBdO1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lciA9IHRoaXMubWFrZUNvbnRhaW5lcih0aGlzLmNvbnRhaW5lcnNBcmd1bWVudHMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwYXJhbSBpbmRleCAgIEFuIGluZGV4IGZvciBhIGtleS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBpbmRleGVkIGtleS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGtleShpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtS2V5c1tpbmRleF07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgdmFsdWVzIGNvbnRhaW5lZCB3aXRoaW4sIGtleWVkIGJ5IHRoZWlyIGtleXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRWYWx1ZXMoKTogeyBbaTogc3RyaW5nXTogSUl0ZW1WYWx1ZSB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5pdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIHtNaXhlZH0gRGVmYXVsdCBhdHRyaWJ1dGVzIGZvciB2YWx1ZXMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREZWZhdWx0cygpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRlZmF1bHRzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gbG9jYWxTdG9yYWdlIG9yIGEgcmVwbGFjbWVudCBvYmplY3QuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRMb2NhbFN0b3JhZ2UoKTogU3RvcmFnZSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMubG9jYWxTdG9yYWdlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgV2hldGhlciB0aGlzIHNob3VsZCBzYXZlIGNoYW5nZXMgdG8gbG9jYWxTdG9yYWdlIGF1dG9tYXRpY2FsbHkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRBdXRvU2F2ZSgpOiBib29sZWFuIHtcclxuICAgICAgICByZXR1cm4gdGhpcy5hdXRvU2F2ZTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIFRoZSBwcmVmaXggdG8gc3RvcmUgdGhpZ25zIHVuZGVyIGluIGxvY2FsU3RvcmFnZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFByZWZpeCgpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLnByZWZpeDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIFRoZSBjb250YWluZXIgSFRNTCBlbGVtZW50LCBpZiBpdCBleGlzdHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRDb250YWluZXIoKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIGNyZWF0ZUVsZW1lbnQgYXJndW1lbnRzIGZvciBIVE1MIGNvbnRhaW5lcnMsIG91dHNpZGUtdG8taW5zaWRlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0Q29udGFpbmVyc0FyZ3VtZW50cygpOiBbc3RyaW5nLCBhbnldW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lcnNBcmd1bWVudHM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcmV0dXJucyBBbnkgaGFyZC1jb2RlZCBjaGFuZ2VzIHRvIGVsZW1lbnQgY29udGVudC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldERpc3BsYXlDaGFuZ2VzKCk6IHsgW2k6IHN0cmluZ106IHN0cmluZyB9IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5kaXNwbGF5Q2hhbmdlcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIEFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdHJpZ2dlcmVkIGV2ZW50IGNhbGxiYWNrcy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENhbGxiYWNrQXJncygpOiBhbnlbXSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsbGJhY2tBcmdzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgU3RyaW5nIGtleXMgZm9yIGVhY2ggb2YgdGhlIHN0b3JlZCBJdGVtVmFsdWVzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0S2V5cygpOiBzdHJpbmdbXSB7XHJcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuaXRlbXMpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgQWxsIFN0cmluZyBrZXlzIG9mIGl0ZW1zLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0SXRlbUtleXMoKTogc3RyaW5nW10ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1LZXlzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgZm9yIGEga25vd24gdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUga25vd24gdmFsdWUgb2YgYSBrZXksIGFzc3VtaW5nIHRoYXQga2V5IGV4aXN0cy5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldEl0ZW0oa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHRoaXMuY2hlY2tFeGlzdGVuY2Uoa2V5KTtcclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbXNba2V5XS5nZXRWYWx1ZSgpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgZm9yIGEga25vd24gdmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgc2V0dGluZ3MgZm9yIHRoYXQgcGFydGljdWxhciBrZXkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRPYmplY3Qoa2V5OiBzdHJpbmcpOiBhbnkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleSBmb3IgYSBwb3RlbnRpYWxseSBrbm93biB2YWx1ZS5cclxuICAgICAqIEByZXR1cm5zIFdoZXRoZXIgdGhlcmUgaXMgYSB2YWx1ZSB1bmRlciB0aGF0IGtleS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhc0tleShrZXk6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcmV0dXJucyBBIG1hcHBpbmcgb2Yga2V5IG5hbWVzIHRvIHRoZSBhY3R1YWwgdmFsdWVzIG9mIGFsbCBvYmplY3RzIGJlaW5nIHN0b3JlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGV4cG9ydEl0ZW1zKCk6IGFueSB7XHJcbiAgICAgICAgY29uc3Qgb3V0cHV0OiBhbnkgPSB7fTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICBvdXRwdXRbaV0gPSB0aGlzLml0ZW1zW2ldLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBZGRzIGEgbmV3IGtleSAmIHZhbHVlIHBhaXIgdG8gYnkgbGlua2luZyB0byBhIG5ld2x5IGNyZWF0ZWQgSXRlbVZhbHVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleSB0byByZWZlcmVuY2UgYnkgbmV3IEl0ZW1WYWx1ZSBieS5cclxuICAgICAqIEBwYXJhbSBzZXR0aW5ncyAgIFRoZSBzZXR0aW5ncyBmb3IgdGhlIG5ldyBJdGVtVmFsdWUuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgbmV3bHkgY3JlYXRlZCBJdGVtVmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBhZGRJdGVtKGtleTogc3RyaW5nLCBzZXR0aW5nczogYW55ID0ge30pOiBJSXRlbVZhbHVlIHtcclxuICAgICAgICB0aGlzLml0ZW1zW2tleV0gPSBuZXcgSXRlbVZhbHVlKHRoaXMsIGtleSwgc2V0dGluZ3MpO1xyXG4gICAgICAgIHRoaXMuaXRlbUtleXMucHVzaChrZXkpO1xyXG4gICAgICAgIHJldHVybiB0aGlzLml0ZW1zW2tleV07XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDbGVhcnMgYSB2YWx1ZSBmcm9tIHRoZSBsaXN0aW5nLCBhbmQgcmVtb3ZlcyBpdHMgZWxlbWVudCBmcm9tIHRoZVxyXG4gICAgICogY29udGFpbmVyIChpZiB0aGV5IGJvdGggZXhpc3QpLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleSBvZiB0aGUgZWxlbWVudCB0byByZW1vdmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyByZW1vdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyICYmIHRoaXMuaXRlbXNba2V5XS5nZXRFbGVtZW50KCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICB0aGlzLmNvbnRhaW5lci5yZW1vdmVDaGlsZCh0aGlzLml0ZW1zW2tleV0uZ2V0RWxlbWVudCgpKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbUtleXMuc3BsaWNlKHRoaXMuaXRlbUtleXMuaW5kZXhPZihrZXkpLCAxKTtcclxuXHJcbiAgICAgICAgZGVsZXRlIHRoaXMuaXRlbXNba2V5XTtcclxuICAgICAgICBkZWxldGUgdGhpcy5sb2NhbFN0b3JhZ2VbdGhpcy5wcmVmaXggKyBrZXldO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29tcGxldGVseSBjbGVhcnMgYWxsIHZhbHVlcyBmcm9tIHRoZSBJdGVtc0hvbGRyLCByZW1vdmluZyB0aGVpclxyXG4gICAgICogZWxlbWVudHMgZnJvbSB0aGUgY29udGFpbmVyIChpZiB0aGV5IGJvdGggZXhpc3QpIGFzIHdlbGwuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhcigpOiB2b2lkIHtcclxuICAgICAgICBpZiAodGhpcy5jb250YWluZXIpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLml0ZW1zKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pdGVtc1tpXS5nZXRFbGVtZW50KCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyLnJlbW92ZUNoaWxkKHRoaXMuaXRlbXNbaV0uZ2V0RWxlbWVudCgpKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5yZXNldEl0ZW1zVG9EZWZhdWx0cygpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIHRoZSBJdGVtVmFsdWUgdW5kZXIgdGhlIGdpdmVuIGtleSwgdGhlbiB1cGRhdGVzIHRoZSBJdGVtVmFsdWVcclxuICAgICAqIChpbmNsdWRpbmcgdGhlIEl0ZW1WYWx1ZSdzIGVsZW1lbnQgYW5kIGxvY2FsU3RvcmFnZSwgaWYgbmVlZGVkKS5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgb2YgdGhlIEl0ZW1WYWx1ZS5cclxuICAgICAqIEBwYXJhbSB2YWx1ZSAgIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBJdGVtVmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRJdGVtKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja0V4aXN0ZW5jZShrZXkpO1xyXG5cclxuICAgICAgICB0aGlzLml0ZW1zW2tleV0uc2V0VmFsdWUodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSW5jcmVhc2VzIHRoZSB2YWx1ZSBmb3IgdGhlIEl0ZW1WYWx1ZSB1bmRlciB0aGUgZ2l2ZW4ga2V5LCB2aWEgYWRkaXRpb24gZm9yXHJcbiAgICAgKiBOdW1iZXJzIG9yIGNvbmNhdGVuYXRpb24gZm9yIFN0cmluZ3MuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBrZXkgICBUaGUga2V5IG9mIHRoZSBJdGVtVmFsdWUuXHJcbiAgICAgKiBAcGFyYW0gYW1vdW50ICAgVGhlIGFtb3VudCB0byBpbmNyZWFzZSBieSAoYnkgZGVmYXVsdCwgMSkuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBpbmNyZWFzZShrZXk6IHN0cmluZywgYW1vdW50OiBudW1iZXIgfCBzdHJpbmcgPSAxKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja0V4aXN0ZW5jZShrZXkpO1xyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZTogbnVtYmVyIHwgc3RyaW5nID0gdGhpcy5pdGVtc1trZXldLmdldFZhbHVlKCkgKyBhbW91bnQ7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbXNba2V5XS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEZWNyZWFzZXMgdGhlIHZhbHVlIGZvciB0aGUgSXRlbVZhbHVlIHVuZGVyIHRoZSBnaXZlbiBrZXksIHZpYSBhZGRpdGlvbiBmb3JcclxuICAgICAqIE51bWJlcnMgb3IgY29uY2F0ZW5hdGlvbiBmb3IgU3RyaW5ncy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgb2YgdGhlIEl0ZW1WYWx1ZS5cclxuICAgICAqIEBwYXJhbSBhbW91bnQgICBUaGUgYW1vdW50IHRvIGRlY3JlYXNlIGJ5IChieSBkZWZhdWx0LCAxKS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlY3JlYXNlKGtleTogc3RyaW5nLCBhbW91bnQ6IG51bWJlciA9IDEpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrRXhpc3RlbmNlKGtleSk7XHJcblxyXG4gICAgICAgIGxldCB2YWx1ZTogbnVtYmVyID0gdGhpcy5pdGVtc1trZXldLmdldFZhbHVlKCkgLSBhbW91bnQ7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbXNba2V5XS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2dnbGVzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnVlIG9yIGZhbHNlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleSBvZiB0aGUgSXRlbVZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgdG9nZ2xlKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgdGhpcy5jaGVja0V4aXN0ZW5jZShrZXkpO1xyXG5cclxuICAgICAgICBjb25zdCB2YWx1ZTogYW55ID0gdGhpcy5pdGVtc1trZXldLmdldFZhbHVlKCkgPyBmYWxzZSA6IHRydWU7XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbXNba2V5XS5zZXRWYWx1ZSh2YWx1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUb2dnbGVzIHRoaXMuYXV0b1NhdmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB0b2dnbGVBdXRvU2F2ZSgpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmF1dG9TYXZlID0gIXRoaXMuYXV0b1NhdmU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBFbnN1cmVzIGEga2V5IGV4aXN0cyBpbiB2YWx1ZXMuIElmIGl0IGRvZXNuJ3QsIGFuZCBuZXcgdmFsdWVzIGFyZVxyXG4gICAgICogYWxsb3dlZCwgaXQgY3JlYXRlcyBpdDsgb3RoZXJ3aXNlLCBpdCB0aHJvd3MgYW4gRXJyb3IuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBrZXlcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNoZWNrRXhpc3RlbmNlKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMuaXRlbXMuaGFzT3duUHJvcGVydHkoa2V5KSkge1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoIXRoaXMuYWxsb3dOZXdJdGVtcykge1xyXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmtub3duIGtleSBnaXZlbiB0byBJdGVtc0hvbGRyOiAnXCIgKyBrZXkgKyBcIicuXCIpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5hZGRJdGVtKGtleSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBzYXZlcyBhbiBpdGVtJ3MgdmFsdWUgdG8gbG9jYWxTdG9yYWdlLCBpZ25vcmluZyB0aGUgYXV0b1NhdmUgZmxhZy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIGtleSAgIFRoZSBrZXkgb2YgdGhlIGl0ZW0gdG8gc2F2ZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHNhdmVJdGVtKGtleTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKCF0aGlzLml0ZW1zLmhhc093blByb3BlcnR5KGtleSkpIHtcclxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5rbm93biBrZXkgZ2l2ZW4gdG8gSXRlbXNIb2xkcjogJ1wiICsga2V5ICsgXCInLlwiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuaXRlbXNba2V5XS51cGRhdGVMb2NhbFN0b3JhZ2UodHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBNYW51YWxseSBzYXZlcyBhbGwgdmFsdWVzIHRvIGxvY2FsU3RvcmFnZSwgaWdub3JpbmcgdGhlIGF1dG9TYXZlIGZsYWcuIFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2F2ZUFsbCgpOiB2b2lkIHtcclxuICAgICAgICBmb3IgKGxldCBrZXkgaW4gdGhpcy5pdGVtcykge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5pdGVtcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2tleV0udXBkYXRlTG9jYWxTdG9yYWdlKHRydWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGlkZXMgdGhlIGNvbnRhaW5lciBFbGVtZW50IGJ5IHNldHRpbmcgaXRzIHZpc2liaWxpdHkgdG8gaGlkZGVuLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGlkZUNvbnRhaW5lcigpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNvbnRhaW5lci5zdHlsZS52aXNpYmlsaXR5ID0gXCJoaWRkZW5cIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFNob3dzIHRoZSBjb250YWluZXIgRWxlbWVudCBieSBzZXR0aW5nIGl0cyB2aXNpYmlsaXR5IHRvIHZpc2libGUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkaXNwbGF5Q29udGFpbmVyKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuY29udGFpbmVyLnN0eWxlLnZpc2liaWxpdHkgPSBcInZpc2libGVcIjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgdGhlIGNvbnRhaW5lciBFbGVtZW50LCB3aGljaCBjb250YWlucyBhIGNoaWxkIGZvciBlYWNoIEl0ZW1WYWx1ZSB0aGF0XHJcbiAgICAgKiBzcGVjaWZpZXMgaGFzRWxlbWVudCB0byBiZSB0cnVlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY29udGFpbmVycyAgIEFuIEFycmF5IHJlcHJlc2VudGluZyB0aGUgRWxlbWVudCB0byBiZSBjcmVhdGVkIGFuZCB0aGVcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4gYmV0d2VlbiBpdCBhbmQgdGhlIGNvbnRhaW5lZCBJdGVtVmFsdWVzLiBcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgRWFjaCBjb250YWluZWQgT2JqZWN0IGhhcyBhIFN0cmluZyB0YWcgbmFtZSBhcyBpdHMgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGZpcnN0IG1lbWJlciwgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBPYmplY3RzIHRvIGFwcGx5IFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICB2aWEgY3JlYXRlRWxlbWVudC5cclxuICAgICAqIEByZXR1cm5zIEEgbmV3bHkgY3JlYXRlZCBFbGVtZW50IHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBjb250YWluZXIuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBtYWtlQ29udGFpbmVyKGNvbnRhaW5lcnM6IFtzdHJpbmcsIGFueV1bXSk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICBjb25zdCBvdXRwdXQ6IEhUTUxFbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50LmFwcGx5KHRoaXMsIGNvbnRhaW5lcnNbMF0pO1xyXG4gICAgICAgIGxldCBsYXN0RWxlbWVudDogSFRNTEVsZW1lbnQgPSBvdXRwdXQ7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGk6IG51bWJlciA9IDE7IGkgPCBjb250YWluZXJzLmxlbmd0aDsgaSArPSAxKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGNoaWxkOiBIVE1MRWxlbWVudCA9IHRoaXMuY3JlYXRlRWxlbWVudC5hcHBseSh0aGlzLCBjb250YWluZXJzW2ldKTtcclxuICAgICAgICAgICAgbGFzdEVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpO1xyXG4gICAgICAgICAgICBsYXN0RWxlbWVudCA9IGNoaWxkO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuaXRlbXMpIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuaXRlbXNba2V5XS5nZXRFbGVtZW50KCkgIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICAgICAgbGFzdEVsZW1lbnQuYXBwZW5kQ2hpbGQodGhpcy5pdGVtc1trZXldLmdldEVsZW1lbnQoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBvdXRwdXQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcmV0dXJucyBXaGV0aGVyIGRpc3BsYXlDaGFuZ2VzIGhhcyBhbiBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFzRGlzcGxheUNoYW5nZSh2YWx1ZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheUNoYW5nZXMuaGFzT3duUHJvcGVydHkodmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHJldHVybnMgVGhlIGRpc3BsYXlDaGFuZ2VzIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXREaXNwbGF5Q2hhbmdlKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlDaGFuZ2VzW3ZhbHVlXTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgSFRNTEVsZW1lbnQgb2YgdGhlIGdpdmVuIHR5cGUuIEZvciBlYWNoIE9iamVjdCBnaXZlbiBhc1xyXG4gICAgICogYXJndW1lbnRzIGFmdGVyLCBlYWNoIG1lbWJlciBpcyBwcm9saWZlcmF0ZWQgb250byB0aGUgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHRhZyAgIFRoZSB0eXBlIG9mIHRoZSBIVE1MRWxlbWVudCAoYnkgZGVmYXVsdCwgXCJkaXZcIikuXHJcbiAgICAgKiBAcGFyYW0gYXJncyAgIEFueSBudW1iZXIgb2YgT2JqZWN0cyB0byBiZSBwcm9saWZlcmF0ZWQgb250byB0aGUgXHJcbiAgICAgKiAgICAgICAgICAgICAgIG5ldyBIVE1MRWxlbWVudC5cclxuICAgICAqIEByZXR1cm5zIEEgbmV3bHkgY3JlYXRlZCBIVE1MRWxlbWVudCBvZiB0aGUgZ2l2ZW4gdGFnLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY3JlYXRlRWxlbWVudCh0YWc6IHN0cmluZyA9IFwiZGl2XCIsIC4uLmFyZ3M6IGFueVtdKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIGNvbnN0IGVsZW1lbnQ6IEhUTUxFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpO1xyXG5cclxuICAgICAgICAvLyBGb3IgZWFjaCBwcm92aWRlZCBvYmplY3QsIGFkZCB0aG9zZSBzZXR0aW5ncyB0byB0aGUgZWxlbWVudFxyXG4gICAgICAgIGZvciAoY29uc3QgYXJnIG9mIGFyZ3MpIHtcclxuICAgICAgICAgICAgdGhpcy5wcm9saWZlcmF0ZUVsZW1lbnQoZWxlbWVudCwgYXJnKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUHJvbGlmZXJhdGVzIGFsbCBtZW1iZXJzIG9mIHRoZSBkb25vciB0byB0aGUgcmVjaXBpZW50IHJlY3Vyc2l2ZWx5LCBhc1xyXG4gICAgICogYSBkZWVwIGNvcHkuXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSByZWNpcGllbnQgICBBbiBvYmplY3QgcmVjZWl2aW5nIHRoZSBkb25vcidzIG1lbWJlcnMuXHJcbiAgICAgKiBAcGFyYW0gZG9ub3IgICBBbiBvYmplY3Qgd2hvc2UgbWVtYmVycyBhcmUgY29waWVkIHRvIHJlY2lwaWVudC5cclxuICAgICAqIEBwYXJhbSBub092ZXJyaWRlICAgSWYgcmVjaXBpZW50IHByb3BlcnRpZXMgbWF5IGJlIG92ZXJyaWRlbiAoYnkgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQsIGZhbHNlKS5cclxuICAgICAqIEByZXR1cm5zIFRoZSByZWNpcGllbnQsIHdoaWNoIHNob3VsZCBoYXZlIHRoZSBkb25vciBwcm9saWZlcmF0ZWQgb250byBpdC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHByb2xpZmVyYXRlKHJlY2lwaWVudDogYW55LCBkb25vcjogYW55LCBub092ZXJyaWRlPzogYm9vbGVhbik6IGFueSB7XHJcbiAgICAgICAgLy8gRm9yIGVhY2ggYXR0cmlidXRlIG9mIHRoZSBkb25vcjpcclxuICAgICAgICBmb3IgKGxldCBpIGluIGRvbm9yKSB7XHJcbiAgICAgICAgICAgIGlmICghZG9ub3IuaGFzT3duUHJvcGVydHkoaSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAvLyBJZiBub092ZXJyaWRlLCBkb24ndCBvdmVycmlkZSBhbHJlYWR5IGV4aXN0aW5nIHByb3BlcnRpZXNcclxuICAgICAgICAgICAgaWYgKG5vT3ZlcnJpZGUgJiYgcmVjaXBpZW50Lmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgaXQncyBhbiBvYmplY3QsIHJlY3Vyc2Ugb24gYSBuZXcgdmVyc2lvbiBvZiBpdFxyXG4gICAgICAgICAgICBjb25zdCBzZXR0aW5nOiBhbnkgPSBkb25vcltpXTtcclxuICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXJlY2lwaWVudC5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudFtpXSA9IG5ldyBzZXR0aW5nLmNvbnN0cnVjdG9yKCk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB0aGlzLnByb2xpZmVyYXRlKHJlY2lwaWVudFtpXSwgc2V0dGluZywgbm9PdmVycmlkZSk7XHJcbiAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIHByaW1pdGl2ZXMgYXJlIGVhc3kgdG8gY29weSBvdGhlcndpc2VcclxuICAgICAgICAgICAgICAgIHJlY2lwaWVudFtpXSA9IHNldHRpbmc7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZWNpcGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJZGVudGljYWwgdG8gcHJvbGlmZXJhdGUsIGJ1dCB0YWlsb3JlZCBmb3IgSFRNTCBlbGVtZW50cyBiZWNhdXNlIG1hbnlcclxuICAgICAqIGVsZW1lbnQgYXR0cmlidXRlcyBkb24ndCBwbGF5IG5pY2VseSB3aXRoIEphdmFTY3JpcHQgQXJyYXkgc3RhbmRhcmRzLiBcclxuICAgICAqIExvb2tpbmcgYXQgeW91LCBIVE1MQ29sbGVjdGlvbiFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHJlY2lwaWVudCAgIEFuIEhUTUxFbGVtZW50IHJlY2VpdmluZyB0aGUgZG9ub3IncyBtZW1iZXJzLlxyXG4gICAgICogQHBhcmFtIGRvbm9yICAgQW4gb2JqZWN0IHdob3NlIG1lbWJlcnMgYXJlIGNvcGllZCB0byByZWNpcGllbnQuXHJcbiAgICAgKiBAcGFyYW0gbm9PdmVycmlkZSAgIElmIHJlY2lwaWVudCBwcm9wZXJ0aWVzIG1heSBiZSBvdmVycmlkZW4gKGJ5IFxyXG4gICAgICogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0LCBmYWxzZSkuXHJcbiAgICAgKiBAcmV0dXJucyBUaGUgcmVjaXBpZW50LCB3aGljaCBzaG91bGQgaGF2ZSB0aGUgZG9ub3IgcHJvbGlmZXJhdGVkIG9udG8gaXQuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBwcm9saWZlcmF0ZUVsZW1lbnQocmVjaXBpZW50OiBhbnksIGRvbm9yOiBhbnksIG5vT3ZlcnJpZGU/OiBib29sZWFuKTogSFRNTEVsZW1lbnQge1xyXG4gICAgICAgIC8vIEZvciBlYWNoIGF0dHJpYnV0ZSBvZiB0aGUgZG9ub3I6XHJcbiAgICAgICAgZm9yIChsZXQgaSBpbiBkb25vcikge1xyXG4gICAgICAgICAgICBpZiAoIWRvbm9yLmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgLy8gSWYgbm9PdmVycmlkZSwgZG9uJ3Qgb3ZlcnJpZGUgYWxyZWFkeSBleGlzdGluZyBwcm9wZXJ0aWVzXHJcbiAgICAgICAgICAgIGlmIChub092ZXJyaWRlICYmIHJlY2lwaWVudC5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGNvbnN0IHNldHRpbmc6IGFueSA9IGRvbm9yW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlcyBmb3IgSFRNTCBlbGVtZW50c1xyXG4gICAgICAgICAgICBzd2l0Y2ggKGkpIHtcclxuICAgICAgICAgICAgICAgIC8vIENoaWxkcmVuIGFuZCBvcHRpb25zOiBqdXN0IGFwcGVuZCBhbGwgb2YgdGhlbSBkaXJlY3RseVxyXG4gICAgICAgICAgICAgICAgY2FzZSBcImNoaWxkcmVuXCI6XHJcbiAgICAgICAgICAgICAgICBjYXNlIFwib3B0aW9uc1wiOlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygc2V0dGluZyAhPT0gXCJ1bmRlZmluZWRcIikge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1lbWJlciBvZiBzZXR0aW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQuYXBwZW5kQ2hpbGQobWVtYmVyKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBTdHlsZTogcHJvbGlmZXJhdGUgKGluc3RlYWQgb2YgbWFraW5nIGEgbmV3IE9iamVjdClcclxuICAgICAgICAgICAgICAgIGNhc2UgXCJzdHlsZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbGlmZXJhdGUocmVjaXBpZW50W2ldLCBzZXR0aW5nKTtcclxuICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB1c2UgdGhlIG5vcm1hbCBwcm9saWZlcmF0ZSBsb2dpY1xyXG4gICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIGFuIG9iamVjdCwgcmVjdXJzZSBvbiBhIG5ldyB2ZXJzaW9uIG9mIGl0XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzZXR0aW5nID09PSBcIm9iamVjdFwiKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjaXBpZW50Lmhhc093blByb3BlcnR5KGkpKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNpcGllbnRbaV0gPSBuZXcgc2V0dGluZy5jb25zdHJ1Y3RvcigpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvbGlmZXJhdGUocmVjaXBpZW50W2ldLCBzZXR0aW5nLCBub092ZXJyaWRlKTtcclxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWd1bGFyIHByaW1pdGl2ZXMgYXJlIGVhc3kgdG8gY29weSBvdGhlcndpc2VcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50W2ldID0gc2V0dGluZztcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiByZWNpcGllbnQ7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBDcmVhdGVzIGFuIE9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhIG5ldyBMb2NhbFN0b3JhZ2VcclxuICAgICAqIHJlcGxhY2VtZW50LCBpZiB0aGUgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCBkb2Vzbid0IGhhdmUgb25lLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGNyZWF0ZVBsYWNlaG9sZGVyU3RvcmFnZSgpOiBTdG9yYWdlIHtcclxuICAgICAgICBjb25zdCBvdXRwdXQ6IGFueSA9IHtcclxuICAgICAgICAgICAga2V5czogW10sXHJcbiAgICAgICAgICAgIGdldEl0ZW06IChrZXk6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhbFN0b3JhZ2Vba2V5XTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgc2V0SXRlbTogKGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmxvY2FsU3RvcmFnZVtrZXldID0gdmFsdWU7XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIGNsZWFyOiAoKTogdm9pZCA9PiB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNPd25Qcm9wZXJ0eShpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgKHRoaXMgYXMgYW55KVtpXTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgIHJlbW92ZUl0ZW06IChrZXk6IHN0cmluZyk6IHZvaWQgPT4ge1xyXG4gICAgICAgICAgICAgICAgZGVsZXRlICh0aGlzIGFzIGFueSlba2V5XTtcclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAga2V5OiBmdW5jdGlvbiAodGhpczogYW55LCBpbmRleDogbnVtYmVyKTogc3RyaW5nIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmtleXNbaW5kZXhdO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfTtcclxuXHJcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMob3V0cHV0LCB7XHJcbiAgICAgICAgICAgIGxlbmd0aDoge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiAoKTogbnVtYmVyID0+IG91dHB1dC5rZXlzLmxlbmd0aFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICByZW1haW5pbmdTcGFjZToge1xyXG4gICAgICAgICAgICAgICAgZ2V0OiAoKTogbnVtYmVyID0+IDkwMDFcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG5cclxuICAgICAgICByZXR1cm4gb3V0cHV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmVzZXRzIHRoaXMuaXRlbXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMgYW5kIHJlc2V0cyB0aGlzLml0ZW1LZXlzLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlc2V0SXRlbXNUb0RlZmF1bHRzKCk6IHZvaWQge1xyXG4gICAgICAgIHRoaXMuaXRlbXMgPSB7fTtcclxuICAgICAgICB0aGlzLml0ZW1LZXlzID0gW107XHJcblxyXG4gICAgICAgIGlmICghdGhpcy5zZXR0aW5ncy52YWx1ZXMpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgZm9yIChsZXQga2V5IGluIHRoaXMuc2V0dGluZ3MudmFsdWVzKSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLnNldHRpbmdzLnZhbHVlcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oa2V5LCB0aGlzLnNldHRpbmdzLnZhbHVlc1trZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0= |
@@ -0,1 +1,2 @@ | ||
import { createPlaceholderStorage } from "./createPlaceholderStorage"; | ||
import { IItems, IItemsHoldr, IItemsHoldrSettings } from "./IItemsHoldr"; | ||
@@ -7,3 +8,3 @@ import { IItemValue, IItemValueDefaults } from "./IItemValue"; | ||
* A versatile container to store and manipulate values in localStorage, and | ||
* optionally keep an updated HTML container showing these values. | ||
* optionally keep an updated HTML container showing these values. | ||
*/ | ||
@@ -14,18 +15,8 @@ export class ItemsHoldr implements IItemsHoldr { | ||
*/ | ||
private settings: IItemsHoldrSettings; | ||
private readonly settings: IItemsHoldrSettings; | ||
/** | ||
* The ItemValues being stored, keyed by name. | ||
*/ | ||
private items: IItems; | ||
/** | ||
* A listing of all the String keys for the stored items. | ||
*/ | ||
private itemKeys: string[]; | ||
/** | ||
* Default attributes for ItemValues. | ||
*/ | ||
private defaults: IItemValueDefaults; | ||
private readonly defaults: IItemValueDefaults; | ||
@@ -35,3 +26,3 @@ /** | ||
*/ | ||
private localStorage: Storage; | ||
private readonly localStorage: Storage; | ||
@@ -41,3 +32,3 @@ /** | ||
*/ | ||
private prefix: string; | ||
private readonly prefix: string; | ||
@@ -47,38 +38,27 @@ /** | ||
*/ | ||
private allowNewItems: boolean; | ||
private readonly allowNewItems: boolean; | ||
/** | ||
* Whether this should save changes to localStorage automatically. | ||
* The ItemValues being stored, keyed by name. | ||
*/ | ||
private autoSave: boolean; | ||
private items: IItems; | ||
/** | ||
* A container element containing children for each value's element. | ||
* A listing of all the String keys for the stored items. | ||
*/ | ||
private container: HTMLElement; | ||
private itemKeys: string[]; | ||
/** | ||
* An Array of elements as createElement arguments, outside-to-inside. | ||
* Whether this should save changes to localStorage automatically. | ||
*/ | ||
private containersArguments: [string, any][]; | ||
private autoSave: boolean; | ||
/** | ||
* Any hardcoded changes to element content, such as "INF" for Infinity. | ||
*/ | ||
private displayChanges: { [i: string]: string }; | ||
/** | ||
* Arguments to be passed to triggered callback Functions. | ||
*/ | ||
private callbackArgs: any[]; | ||
/** | ||
* Initializes a new instance of the ItemsHoldr class. | ||
* | ||
* | ||
* @param settings Any optional custom settings. | ||
*/ | ||
constructor(settings: IItemsHoldrSettings = {}) { | ||
public constructor(settings: IItemsHoldrSettings = {}) { | ||
this.settings = settings; | ||
this.autoSave = !!settings.autoSave; | ||
this.callbackArgs = settings.callbackArgs || []; | ||
this.prefix = settings.prefix || ""; | ||
@@ -91,4 +71,4 @@ | ||
this.localStorage = settings.localStorage; | ||
} else if (typeof localStorage === "undefined") { | ||
this.localStorage = this.createPlaceholderStorage(); | ||
} else if (typeof localStorage === "undefined") { // tslint:disable-line strict-type-predicates | ||
this.localStorage = createPlaceholderStorage(); | ||
} else { | ||
@@ -99,17 +79,9 @@ this.localStorage = localStorage; | ||
this.defaults = settings.defaults || {}; | ||
this.displayChanges = settings.displayChanges || {}; | ||
this.resetItemsToDefaults(); | ||
if (settings.doMakeContainer) { | ||
this.containersArguments = settings.containersArguments || [ | ||
["div", { | ||
"className": this.prefix + "_container" | ||
}] | ||
]; | ||
this.container = this.makeContainer(this.containersArguments); | ||
} | ||
this.clear(); | ||
} | ||
/** | ||
* Gets the key at an index. | ||
* | ||
* @param index An index for a key. | ||
@@ -123,2 +95,4 @@ * @returns The indexed key. | ||
/** | ||
* Gets the contained values. | ||
* | ||
* @returns The values contained within, keyed by their keys. | ||
@@ -131,3 +105,5 @@ */ | ||
/** | ||
* @returns {Mixed} Default attributes for values. | ||
* Gets the default attributes for values. | ||
* | ||
* @returns Default attributes for values. | ||
*/ | ||
@@ -139,3 +115,5 @@ public getDefaults(): any { | ||
/** | ||
* @returns A reference to localStorage or a replacment object. | ||
* Gets the reference to localStorage or its placeholder. | ||
* | ||
* @returns A reference to localStorage or its placeholder. | ||
*/ | ||
@@ -147,2 +125,4 @@ public getLocalStorage(): Storage { | ||
/** | ||
* Gets whether this should save changes to localStorage automatically. | ||
* | ||
* @returns Whether this should save changes to localStorage automatically. | ||
@@ -155,3 +135,5 @@ */ | ||
/** | ||
* @returns The prefix to store thigns under in localStorage. | ||
* Gets the prefix for localStorage keys. | ||
* | ||
* @returns The prefix to store keys under in localStorage. | ||
*/ | ||
@@ -163,30 +145,4 @@ public getPrefix(): string { | ||
/** | ||
* @returns The container HTML element, if it exists. | ||
*/ | ||
public getContainer(): HTMLElement { | ||
return this.container; | ||
} | ||
/** | ||
* @returns createElement arguments for HTML containers, outside-to-inside. | ||
*/ | ||
public getContainersArguments(): [string, any][] { | ||
return this.containersArguments; | ||
} | ||
/** | ||
* @returns Any hard-coded changes to element content. | ||
*/ | ||
public getDisplayChanges(): { [i: string]: string } { | ||
return this.displayChanges; | ||
} | ||
/** | ||
* @returns Arguments to be passed to triggered event callbacks. | ||
*/ | ||
public getCallbackArgs(): any[] { | ||
return this.callbackArgs; | ||
} | ||
/** | ||
* Gets all keys for all items. | ||
* | ||
* @returns String keys for each of the stored ItemValues. | ||
@@ -199,3 +155,5 @@ */ | ||
/** | ||
* @returns All String keys of items. | ||
* Gets all stored keys of items. | ||
* | ||
* @returns All keys of items. | ||
*/ | ||
@@ -207,2 +165,4 @@ public getItemKeys(): string[] { | ||
/** | ||
* Gets the value for a known key. | ||
* | ||
* @param key The key for a known value. | ||
@@ -218,3 +178,5 @@ * @returns The known value of a key, assuming that key exists. | ||
/** | ||
* @param key The key for a known value. | ||
* Gets the value for a potentially unknown key. | ||
* | ||
* @param key The key for a potentially unknown value. | ||
* @returns The settings for that particular key. | ||
@@ -227,2 +189,4 @@ */ | ||
/** | ||
* Checks whether a key exists. | ||
* | ||
* @param key The key for a potentially known value. | ||
@@ -236,2 +200,4 @@ * @returns Whether there is a value under that key. | ||
/** | ||
* Maps key names to their values. | ||
* | ||
* @returns A mapping of key names to the actual values of all objects being stored. | ||
@@ -242,6 +208,4 @@ */ | ||
for (let i in this.items) { | ||
if (this.items.hasOwnProperty(i)) { | ||
output[i] = this.items[i].getValue(); | ||
} | ||
for (const i in this.items) { | ||
output[i] = this.items[i].getValue(); | ||
} | ||
@@ -254,3 +218,3 @@ | ||
* Adds a new key & value pair to by linking to a newly created ItemValue. | ||
* | ||
* | ||
* @param key The key to reference by new ItemValue by. | ||
@@ -269,3 +233,3 @@ * @param settings The settings for the new ItemValue. | ||
* container (if they both exist). | ||
* | ||
* | ||
* @param key The key of the element to remove. | ||
@@ -278,6 +242,2 @@ */ | ||
if (this.container && this.items[key].getElement() !== undefined) { | ||
this.container.removeChild(this.items[key].getElement()); | ||
} | ||
this.itemKeys.splice(this.itemKeys.indexOf(key), 1); | ||
@@ -294,11 +254,14 @@ | ||
public clear(): void { | ||
if (this.container) { | ||
for (let i in this.items) { | ||
if (this.items[i].getElement() !== undefined) { | ||
this.container.removeChild(this.items[i].getElement()); | ||
} | ||
this.items = {}; | ||
this.itemKeys = []; | ||
if (!this.settings.values) { | ||
return; | ||
} | ||
for (const key in this.settings.values) { | ||
if (this.settings.values.hasOwnProperty(key)) { | ||
this.addItem(key, this.settings.values[key]); | ||
} | ||
} | ||
this.resetItemsToDefaults(); | ||
} | ||
@@ -309,3 +272,3 @@ | ||
* (including the ItemValue's element and localStorage, if needed). | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -323,3 +286,3 @@ * @param value The new value for the ItemValue. | ||
* Numbers or concatenation for Strings. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -331,2 +294,3 @@ * @param amount The amount to increase by (by default, 1). | ||
// tslint:disable-next-line restrict-plus-operands | ||
const value: number | string = this.items[key].getValue() + amount; | ||
@@ -340,3 +304,3 @@ | ||
* Numbers or concatenation for Strings. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -348,3 +312,3 @@ * @param amount The amount to decrease by (by default, 1). | ||
let value: number = this.items[key].getValue() - amount; | ||
const value: number = this.items[key].getValue() - amount; | ||
@@ -356,3 +320,3 @@ this.items[key].setValue(value); | ||
* Toggles whether a value is true or false. | ||
* | ||
* | ||
* @param key The key of the ItemValue. | ||
@@ -378,3 +342,3 @@ */ | ||
* allowed, it creates it; otherwise, it throws an Error. | ||
* | ||
* | ||
* @param key | ||
@@ -388,3 +352,3 @@ */ | ||
if (!this.allowNewItems) { | ||
throw new Error("Unknown key given to ItemsHoldr: '" + key + "'."); | ||
throw new Error(`Unknown key given to ItemsHoldr: '${key}'.`); | ||
} | ||
@@ -397,3 +361,3 @@ | ||
* Manually saves an item's value to localStorage, ignoring the autoSave flag. | ||
* | ||
* | ||
* @param key The key of the item to save. | ||
@@ -403,3 +367,3 @@ */ | ||
if (!this.items.hasOwnProperty(key)) { | ||
throw new Error("Unknown key given to ItemsHoldr: '" + key + "'."); | ||
throw new Error(`Unknown key given to ItemsHoldr: '${key}'.`); | ||
} | ||
@@ -411,248 +375,9 @@ | ||
/** | ||
* Manually saves all values to localStorage, ignoring the autoSave flag. | ||
* Manually saves all values to localStorage, ignoring the autoSave flag. | ||
*/ | ||
public saveAll(): void { | ||
for (let key in this.items) { | ||
if (this.items.hasOwnProperty(key)) { | ||
this.items[key].updateLocalStorage(true); | ||
} | ||
for (const key in this.items) { | ||
this.items[key].updateLocalStorage(true); | ||
} | ||
} | ||
/** | ||
* Hides the container Element by setting its visibility to hidden. | ||
*/ | ||
public hideContainer(): void { | ||
this.container.style.visibility = "hidden"; | ||
} | ||
/** | ||
* Shows the container Element by setting its visibility to visible. | ||
*/ | ||
public displayContainer(): void { | ||
this.container.style.visibility = "visible"; | ||
} | ||
/** | ||
* Creates the container Element, which contains a child for each ItemValue that | ||
* specifies hasElement to be true. | ||
* | ||
* @param containers An Array representing the Element to be created and the | ||
* children between it and the contained ItemValues. | ||
* Each contained Object has a String tag name as its | ||
* first member, followed by any number of Objects to apply | ||
* via createElement. | ||
* @returns A newly created Element that can be used as a container. | ||
*/ | ||
public makeContainer(containers: [string, any][]): HTMLElement { | ||
const output: HTMLElement = this.createElement.apply(this, containers[0]); | ||
let lastElement: HTMLElement = output; | ||
for (let i: number = 1; i < containers.length; i += 1) { | ||
const child: HTMLElement = this.createElement.apply(this, containers[i]); | ||
lastElement.appendChild(child); | ||
lastElement = child; | ||
} | ||
for (let key in this.items) { | ||
if (this.items[key].getElement() !== undefined) { | ||
lastElement.appendChild(this.items[key].getElement()); | ||
} | ||
} | ||
return output; | ||
} | ||
/** | ||
* @returns Whether displayChanges has an entry for a particular value. | ||
*/ | ||
public hasDisplayChange(value: string): boolean { | ||
return this.displayChanges.hasOwnProperty(value); | ||
} | ||
/** | ||
* @returns The displayChanges entry for a particular value. | ||
*/ | ||
public getDisplayChange(value: string): string { | ||
return this.displayChanges[value]; | ||
} | ||
/** | ||
* Creates a new HTMLElement of the given type. For each Object given as | ||
* arguments after, each member is proliferated onto the element. | ||
* | ||
* @param tag The type of the HTMLElement (by default, "div"). | ||
* @param args Any number of Objects to be proliferated onto the | ||
* new HTMLElement. | ||
* @returns A newly created HTMLElement of the given tag. | ||
*/ | ||
public createElement(tag: string = "div", ...args: any[]): HTMLElement { | ||
const element: HTMLElement = document.createElement(tag); | ||
// For each provided object, add those settings to the element | ||
for (const arg of args) { | ||
this.proliferateElement(element, arg); | ||
} | ||
return element; | ||
} | ||
/** | ||
* Proliferates all members of the donor to the recipient recursively, as | ||
* a deep copy. | ||
* | ||
* @param recipient An object receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
public proliferate(recipient: any, donor: any, noOverride?: boolean): any { | ||
// For each attribute of the donor: | ||
for (let i in donor) { | ||
if (!donor.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If noOverride, don't override already existing properties | ||
if (noOverride && recipient.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If it's an object, recurse on a new version of it | ||
const setting: any = donor[i]; | ||
if (typeof setting === "object") { | ||
if (!recipient.hasOwnProperty(i)) { | ||
recipient[i] = new setting.constructor(); | ||
} | ||
this.proliferate(recipient[i], setting, noOverride); | ||
} else { | ||
// Regular primitives are easy to copy otherwise | ||
recipient[i] = setting; | ||
} | ||
} | ||
return recipient; | ||
} | ||
/** | ||
* Identical to proliferate, but tailored for HTML elements because many | ||
* element attributes don't play nicely with JavaScript Array standards. | ||
* Looking at you, HTMLCollection! | ||
* | ||
* @param recipient An HTMLElement receiving the donor's members. | ||
* @param donor An object whose members are copied to recipient. | ||
* @param noOverride If recipient properties may be overriden (by | ||
* default, false). | ||
* @returns The recipient, which should have the donor proliferated onto it. | ||
*/ | ||
public proliferateElement(recipient: any, donor: any, noOverride?: boolean): HTMLElement { | ||
// For each attribute of the donor: | ||
for (let i in donor) { | ||
if (!donor.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
// If noOverride, don't override already existing properties | ||
if (noOverride && recipient.hasOwnProperty(i)) { | ||
continue; | ||
} | ||
const setting: any = donor[i]; | ||
// Special cases for HTML elements | ||
switch (i) { | ||
// Children and options: just append all of them directly | ||
case "children": | ||
case "options": | ||
if (typeof setting !== "undefined") { | ||
for (const member of setting) { | ||
recipient.appendChild(member); | ||
} | ||
} | ||
break; | ||
// Style: proliferate (instead of making a new Object) | ||
case "style": | ||
this.proliferate(recipient[i], setting); | ||
break; | ||
// By default, use the normal proliferate logic | ||
default: | ||
// If it's an object, recurse on a new version of it | ||
if (typeof setting === "object") { | ||
if (!recipient.hasOwnProperty(i)) { | ||
recipient[i] = new setting.constructor(); | ||
} | ||
this.proliferate(recipient[i], setting, noOverride); | ||
} else { | ||
// Regular primitives are easy to copy otherwise | ||
recipient[i] = setting; | ||
} | ||
break; | ||
} | ||
} | ||
return recipient; | ||
} | ||
/** | ||
* Creates an Object that can be used to create a new LocalStorage | ||
* replacement, if the JavaScript environment doesn't have one. | ||
* | ||
* @returns {Object} | ||
*/ | ||
private createPlaceholderStorage(): Storage { | ||
const output: any = { | ||
keys: [], | ||
getItem: (key: string): any => { | ||
return this.localStorage[key]; | ||
}, | ||
setItem: (key: string, value: string): void => { | ||
this.localStorage[key] = value; | ||
}, | ||
clear: (): void => { | ||
for (let i in this) { | ||
if (this.hasOwnProperty(i)) { | ||
delete (this as any)[i]; | ||
} | ||
} | ||
}, | ||
removeItem: (key: string): void => { | ||
delete (this as any)[key]; | ||
}, | ||
key: function (this: any, index: number): string { | ||
return this.keys[index]; | ||
} | ||
}; | ||
Object.defineProperties(output, { | ||
length: { | ||
get: (): number => output.keys.length | ||
}, | ||
remainingSpace: { | ||
get: (): number => 9001 | ||
} | ||
}); | ||
return output; | ||
} | ||
/** | ||
* Resets this.items to their default values and resets this.itemKeys. | ||
*/ | ||
private resetItemsToDefaults(): void { | ||
this.items = {}; | ||
this.itemKeys = []; | ||
if (!this.settings.values) { | ||
return; | ||
} | ||
for (let key in this.settings.values) { | ||
if (this.settings.values.hasOwnProperty(key)) { | ||
this.addItem(key, this.settings.values[key]); | ||
} | ||
} | ||
} | ||
} |
import { IItemsHoldr } from "./IItemsHoldr"; | ||
import { IItemValue } from "./IItemValue"; | ||
/** | ||
* Storage container for a single ItemsHoldr value. The value may have triggers | ||
* assigned to value, modularity, and other triggers, as well as an HTML element. | ||
* Storage container for a single ItemsHoldr value. | ||
*/ | ||
@@ -11,3 +10,3 @@ export declare class ItemValue implements IItemValue { | ||
*/ | ||
private ItemsHolder; | ||
private itemsHolder; | ||
/** | ||
@@ -31,14 +30,2 @@ * The unique key identifying this ItemValue in the ItemsHoldr. | ||
/** | ||
* An HTML element whose second child's textContent is always set to that of the element. | ||
*/ | ||
private element; | ||
/** | ||
* Whether an Element should be created and synced to the value. | ||
*/ | ||
private hasElement; | ||
/** | ||
* An Element tag to use in creating the element, if hasElement is true. | ||
*/ | ||
private elementTag; | ||
/** | ||
* A minimum value for the value to equal, if value is a number. | ||
@@ -70,7 +57,7 @@ */ | ||
*/ | ||
private transformGet; | ||
private transformGet?; | ||
/** | ||
* A Function to transform the value when it's being retrieved. | ||
*/ | ||
private transformSet; | ||
private transformSet?; | ||
/** | ||
@@ -84,10 +71,11 @@ * The value being stored. | ||
* | ||
* @constructor | ||
* @param ItemsHolder The container for this value. | ||
* @param itemsHolder The container for this value. | ||
* @param key The key to reference this new ItemValue by. | ||
* @param settings Any optional custom settings. | ||
*/ | ||
constructor(ItemsHolder: IItemsHoldr, key: string, settings?: any); | ||
constructor(itemsHolder: IItemsHoldr, key: string, settings?: any); | ||
/** | ||
* @returns The value being stored, with a transformGet applied if one exists. | ||
* Gets a stored value, with a transformGet applied if one exists. | ||
* | ||
* @returns The value being stored. | ||
*/ | ||
@@ -103,9 +91,3 @@ getValue(): any; | ||
/** | ||
* @returns The stored HTML element, if it exists. | ||
*/ | ||
getElement(): HTMLElement; | ||
/** | ||
* General update Function to be run whenever the internal value is changed. | ||
* It runs all the trigger, modular, etc. checks, updates the HTML element | ||
* if there is one, and updates localStorage if needed. | ||
*/ | ||
@@ -132,12 +114,6 @@ update(): void; | ||
/** | ||
* Updates the ItemValue's element's second child to be the ItemValue's value. | ||
*/ | ||
private updateElement(); | ||
/** | ||
* Retrieves a ItemValue's value from localStorage, making sure not to try to | ||
* JSON.parse an undefined or null value. | ||
* | ||
* @returns {Mixed} | ||
*/ | ||
private retrieveLocalStorage(); | ||
} |
@@ -1,8 +0,8 @@ | ||
define(["require", "exports"], function (require, exports) { | ||
define(["require", "exports", "./proliferate"], function (require, exports, proliferate_1) { | ||
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
/** | ||
* Storage container for a single ItemsHoldr value. The value may have triggers | ||
* assigned to value, modularity, and other triggers, as well as an HTML element. | ||
* Storage container for a single ItemsHoldr value. | ||
*/ | ||
var ItemValue = (function () { | ||
var ItemValue = /** @class */ (function () { | ||
/** | ||
@@ -12,12 +12,11 @@ * Creates a new ItemValue with the given key and settings. Defaults are given | ||
* | ||
* @constructor | ||
* @param ItemsHolder The container for this value. | ||
* @param itemsHolder The container for this value. | ||
* @param key The key to reference this new ItemValue by. | ||
* @param settings Any optional custom settings. | ||
*/ | ||
function ItemValue(ItemsHolder, key, settings) { | ||
function ItemValue(itemsHolder, key, settings) { | ||
if (settings === void 0) { settings = {}; } | ||
this.ItemsHolder = ItemsHolder; | ||
ItemsHolder.proliferate(this, ItemsHolder.getDefaults()); | ||
ItemsHolder.proliferate(this, settings); | ||
this.itemsHolder = itemsHolder; | ||
proliferate_1.proliferate(this, itemsHolder.getDefaults()); | ||
proliferate_1.proliferate(this, settings); | ||
this.key = key; | ||
@@ -27,16 +26,5 @@ if (!this.hasOwnProperty("value")) { | ||
} | ||
if (this.hasElement) { | ||
this.element = ItemsHolder.createElement(this.elementTag || "div", { | ||
className: ItemsHolder.getPrefix() + "_value " + key | ||
}); | ||
this.element.appendChild(ItemsHolder.createElement("div", { | ||
"textContent": key | ||
})); | ||
this.element.appendChild(ItemsHolder.createElement("div", { | ||
"textContent": this.value | ||
})); | ||
} | ||
if (this.storeLocally) { | ||
// If there exists an old version of this property, get it | ||
if (ItemsHolder.getLocalStorage().hasOwnProperty(ItemsHolder.getPrefix() + key)) { | ||
// If there exists an old version of this property, get it | ||
if (itemsHolder.getLocalStorage().hasOwnProperty(itemsHolder.getPrefix() + key)) { | ||
this.value = this.retrieveLocalStorage(); | ||
@@ -52,3 +40,5 @@ this.update(); | ||
/** | ||
* @returns The value being stored, with a transformGet applied if one exists. | ||
* Gets a stored value, with a transformGet applied if one exists. | ||
* | ||
* @returns The value being stored. | ||
*/ | ||
@@ -68,20 +58,9 @@ ItemValue.prototype.getValue = function () { | ||
ItemValue.prototype.setValue = function (value) { | ||
if (this.transformSet) { | ||
this.value = this.transformSet(value); | ||
} | ||
else { | ||
this.value = value; | ||
} | ||
this.value = this.transformSet === undefined | ||
? value | ||
: this.transformSet(value); | ||
this.update(); | ||
}; | ||
/** | ||
* @returns The stored HTML element, if it exists. | ||
*/ | ||
ItemValue.prototype.getElement = function () { | ||
return this.element; | ||
}; | ||
/** | ||
* General update Function to be run whenever the internal value is changed. | ||
* It runs all the trigger, modular, etc. checks, updates the HTML element | ||
* if there is one, and updates localStorage if needed. | ||
*/ | ||
@@ -92,4 +71,4 @@ ItemValue.prototype.update = function () { | ||
this.value = this.minimum; | ||
if (this.onMinimum) { | ||
this.onMinimum.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
if (this.onMinimum !== undefined) { | ||
this.onMinimum(); | ||
} | ||
@@ -99,4 +78,4 @@ } | ||
this.value = this.maximum; | ||
if (this.onMaximum) { | ||
this.onMaximum.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
if (this.onMaximum !== undefined) { | ||
this.onMaximum(); | ||
} | ||
@@ -110,5 +89,2 @@ } | ||
} | ||
if (this.hasElement) { | ||
this.updateElement(); | ||
} | ||
if (this.storeLocally) { | ||
@@ -126,4 +102,4 @@ this.updateLocalStorage(); | ||
ItemValue.prototype.updateLocalStorage = function (overrideAutoSave) { | ||
if (overrideAutoSave || this.ItemsHolder.getAutoSave()) { | ||
this.ItemsHolder.getLocalStorage()[this.ItemsHolder.getPrefix() + this.key] = JSON.stringify(this.value); | ||
if (overrideAutoSave || this.itemsHolder.getAutoSave()) { | ||
this.itemsHolder.getLocalStorage()[this.itemsHolder.getPrefix() + this.key] = JSON.stringify(this.value); | ||
} | ||
@@ -136,3 +112,3 @@ }; | ||
if (this.triggers.hasOwnProperty(this.value)) { | ||
this.triggers[this.value].apply(this, this.ItemsHolder.getCallbackArgs()); | ||
this.triggers[this.value](); | ||
} | ||
@@ -152,3 +128,3 @@ }; | ||
if (this.onModular) { | ||
this.onModular.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
this.onModular(); | ||
} | ||
@@ -158,20 +134,7 @@ } | ||
/** | ||
* Updates the ItemValue's element's second child to be the ItemValue's value. | ||
*/ | ||
ItemValue.prototype.updateElement = function () { | ||
if (this.ItemsHolder.hasDisplayChange(this.value)) { | ||
this.element.children[1].textContent = this.ItemsHolder.getDisplayChange(this.value); | ||
} | ||
else { | ||
this.element.children[1].textContent = this.value; | ||
} | ||
}; | ||
/** | ||
* Retrieves a ItemValue's value from localStorage, making sure not to try to | ||
* JSON.parse an undefined or null value. | ||
* | ||
* @returns {Mixed} | ||
*/ | ||
ItemValue.prototype.retrieveLocalStorage = function () { | ||
var value = this.ItemsHolder.getLocalStorage()[this.ItemsHolder.getPrefix() + this.key]; | ||
var value = this.itemsHolder.getLocalStorage()[this.itemsHolder.getPrefix() + this.key]; | ||
if (typeof value === "undefined" || value === "undefined") { | ||
@@ -189,3 +152,1 @@ return undefined; | ||
}); | ||
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxXQUFXLElBQUksS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3hELE1BQU0sQ0FBQyxTQUFTLENBQUM7WUFDckIsQ0FBQztZQUVELEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxXQUFXLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxDQUFDLEtBQUssQ0FBQztZQUNqQixDQUFDO1lBRUQsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUNMLGdCQUFDO0lBQUQsQ0FoUkEsQUFnUkMsSUFBQTtJQWhSWSxpQkFBUyxZQWdSckIsQ0FBQSIsImZpbGUiOiJJdGVtVmFsdWUuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJSXRlbXNIb2xkciB9IGZyb20gXCIuL0lJdGVtc0hvbGRyXCI7XHJcbmltcG9ydCB7IElJdGVtVmFsdWUsIElUcmlnZ2VycyB9IGZyb20gXCIuL0lJdGVtVmFsdWVcIjtcclxuXHJcbi8qKlxyXG4gKiBTdG9yYWdlIGNvbnRhaW5lciBmb3IgYSBzaW5nbGUgSXRlbXNIb2xkciB2YWx1ZS4gVGhlIHZhbHVlIG1heSBoYXZlIHRyaWdnZXJzXHJcbiAqIGFzc2lnbmVkIHRvIHZhbHVlLCBtb2R1bGFyaXR5LCBhbmQgb3RoZXIgdHJpZ2dlcnMsIGFzIHdlbGwgYXMgYW4gSFRNTCBlbGVtZW50LlxyXG4gKi9cclxuZXhwb3J0IGNsYXNzIEl0ZW1WYWx1ZSBpbXBsZW1lbnRzIElJdGVtVmFsdWUge1xyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgY29udGFpbmVyIEl0ZW1zSG9sZHIgZ292ZXJuaW5nIHVzYWdlIG9mIHRoaXMgSXRlbXNWYWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBJdGVtc0hvbGRlcjogSUl0ZW1zSG9sZHI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBUaGUgdW5pcXVlIGtleSBpZGVudGlmeWluZyB0aGlzIEl0ZW1WYWx1ZSBpbiB0aGUgSXRlbXNIb2xkci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBrZXk6IHN0cmluZztcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgZGVmYXVsdCBpbml0aWFsIHZhbHVlIHRvIHN0b3JlLCBpZiB2YWx1ZSBpc24ndCBwcm92aWRlZC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB2YWx1ZURlZmF1bHQ6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgdGhlIHZhbHVlIHNob3VsZCBiZSBzdG9yZWQgaW4gdGhlIEl0ZW1Ib2xkcidzIGxvY2FsU3RvcmFnZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBzdG9yZUxvY2FsbHk6IGJvb2xlYW47XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1hcHBpbmcgb2YgdmFsdWVzIHRvIGNhbGxiYWNrcyB0aGF0IHNob3VsZCBiZSB0cmlnZ2VyZWQgd2hlbiB2YWx1ZVxyXG4gICAgICogaXMgZXF1YWwgdG8gdGhlbS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmlnZ2VyczogSVRyaWdnZXJzO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gSFRNTCBlbGVtZW50IHdob3NlIHNlY29uZCBjaGlsZCdzIHRleHRDb250ZW50IGlzIGFsd2F5cyBzZXQgdG8gdGhhdCBvZiB0aGUgZWxlbWVudC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBlbGVtZW50OiBIVE1MRWxlbWVudDtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFdoZXRoZXIgYW4gRWxlbWVudCBzaG91bGQgYmUgY3JlYXRlZCBhbmQgc3luY2VkIHRvIHRoZSB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBoYXNFbGVtZW50OiBib29sZWFuO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQW4gRWxlbWVudCB0YWcgdG8gdXNlIGluIGNyZWF0aW5nIHRoZSBlbGVtZW50LCBpZiBoYXNFbGVtZW50IGlzIHRydWUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZWxlbWVudFRhZzogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBtaW5pbXVtIHZhbHVlIGZvciB0aGUgdmFsdWUgdG8gZXF1YWwsIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG1pbmltdW06IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgY2FsbGJhY2sgdG8gY2FsbCB3aGVuIHRoZSB2YWx1ZSByZWFjaGVzIHRoZSBtaW5pbXVtIHZhbHVlLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uTWluaW11bTogRnVuY3Rpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIG1heGltdW0gdmFsdWUgZm9yIHRoZSB2YWx1ZSB0byBlcXVhbCwgaWYgdmFsdWUgaXMgYSBudW1iZXIuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgbWF4aW11bTogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBjYWxsYmFjayB0byBjYWxsIHdoZW4gdGhlIHZhbHVlIHJlYWNoZXMgdGhlIG1heGltdW0gdmFsdWUuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgb25NYXhpbXVtOiBGdW5jdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEEgbWF4aW11bSBudW1iZXIgdG8gbW9kdWxvIHRoZSB2YWx1ZSBhZ2FpbnN0LCBpZiB2YWx1ZSBpcyBhIG51bWJlci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBtb2R1bGFyaXR5OiBudW1iZXI7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIGNhbGxiYWNrIHRvIGNhbGwgd2hlbiB0aGUgdmFsdWUgcmVhY2hlcyBtb2R1bGFyaXR5LlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIG9uTW9kdWxhcjogRnVuY3Rpb247XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBIEZ1bmN0aW9uIHRvIHRyYW5zZm9ybSB0aGUgdmFsdWUgd2hlbiBpdCdzIGJlaW5nIHNldC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1HZXQ6IEZ1bmN0aW9uO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQSBGdW5jdGlvbiB0byB0cmFuc2Zvcm0gdGhlIHZhbHVlIHdoZW4gaXQncyBiZWluZyByZXRyaWV2ZWQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdHJhbnNmb3JtU2V0OiBGdW5jdGlvbjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFRoZSB2YWx1ZSBiZWluZyBzdG9yZWQuXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgdmFsdWU6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIENyZWF0ZXMgYSBuZXcgSXRlbVZhbHVlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgc2V0dGluZ3MuIERlZmF1bHRzIGFyZSBnaXZlblxyXG4gICAgICogdG8gdGhlIHZhbHVlIHZpYSBwcm9saWZlcmF0ZSBiZWZvcmUgdGhlIHNldHRpbmdzLlxyXG4gICAgICogXHJcbiAgICAgKiBAY29uc3RydWN0b3JcclxuICAgICAqIEBwYXJhbSBJdGVtc0hvbGRlciAgIFRoZSBjb250YWluZXIgZm9yIHRoaXMgdmFsdWUuXHJcbiAgICAgKiBAcGFyYW0ga2V5ICAgVGhlIGtleSB0byByZWZlcmVuY2UgdGhpcyBuZXcgSXRlbVZhbHVlIGJ5LlxyXG4gICAgICogQHBhcmFtIHNldHRpbmdzICAgQW55IG9wdGlvbmFsIGN1c3RvbSBzZXR0aW5ncy5cclxuICAgICAqL1xyXG4gICAgY29uc3RydWN0b3IoSXRlbXNIb2xkZXI6IElJdGVtc0hvbGRyLCBrZXk6IHN0cmluZywgc2V0dGluZ3M6IGFueSA9IHt9KSB7XHJcbiAgICAgICAgdGhpcy5JdGVtc0hvbGRlciA9IEl0ZW1zSG9sZGVyO1xyXG5cclxuICAgICAgICBJdGVtc0hvbGRlci5wcm9saWZlcmF0ZSh0aGlzLCBJdGVtc0hvbGRlci5nZXREZWZhdWx0cygpKTtcclxuICAgICAgICBJdGVtc0hvbGRlci5wcm9saWZlcmF0ZSh0aGlzLCBzZXR0aW5ncyk7XHJcblxyXG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xyXG5cclxuICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoXCJ2YWx1ZVwiKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy52YWx1ZURlZmF1bHQ7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5oYXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IEl0ZW1zSG9sZGVyLmNyZWF0ZUVsZW1lbnQodGhpcy5lbGVtZW50VGFnIHx8IFwiZGl2XCIsIHtcclxuICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogSXRlbXNIb2xkZXIuZ2V0UHJlZml4KCkgKyBcIl92YWx1ZSBcIiArIGtleVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZENoaWxkKEl0ZW1zSG9sZGVyLmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiwge1xyXG4gICAgICAgICAgICAgICAgXCJ0ZXh0Q29udGVudFwiOiBrZXlcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXBwZW5kQ2hpbGQoSXRlbXNIb2xkZXIuY3JlYXRlRWxlbWVudChcImRpdlwiLCB7XHJcbiAgICAgICAgICAgICAgICBcInRleHRDb250ZW50XCI6IHRoaXMudmFsdWVcclxuICAgICAgICAgICAgfSkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVMb2NhbGx5KSB7XHJcbiAgICAgICAgICAgIC8vIElmIHRoZXJlIGV4aXN0cyBhbiBvbGQgdmVyc2lvbiBvZiB0aGlzIHByb3BlcnR5LCBnZXQgaXQgXHJcbiAgICAgICAgICAgIGlmIChJdGVtc0hvbGRlci5nZXRMb2NhbFN0b3JhZ2UoKS5oYXNPd25Qcm9wZXJ0eShJdGVtc0hvbGRlci5nZXRQcmVmaXgoKSArIGtleSkpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnJldHJpZXZlTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNhdmUgdGhlIG5ldyB2ZXJzaW9uIHRvIG1lbW9yeVxyXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVMb2NhbFN0b3JhZ2UoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIFRoZSB2YWx1ZSBiZWluZyBzdG9yZWQsIHdpdGggYSB0cmFuc2Zvcm1HZXQgYXBwbGllZCBpZiBvbmUgZXhpc3RzLlxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ2V0VmFsdWUoKTogYW55IHtcclxuICAgICAgICBpZiAodGhpcy50cmFuc2Zvcm1HZXQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtR2V0KHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTZXRzIHRoZSB2YWx1ZSBiZWluZyBzdG9yZWQsIHdpdGggYSBpcyBhIHRyYW5zZm9ybVNldCBhcHBsaWVkIGlmIG9uZSBleGlzdHMuXHJcbiAgICAgKiBBbnkgYXR0YWNoZWQgdHJpZ2dlcnMgdG8gdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGNhbGxlZC5cclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0gdmFsdWUgICBUaGUgZGVzaXJlZCB2YWx1ZSB0byBub3cgc3RvcmUuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzZXRWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudHJhbnNmb3JtU2V0KSB7XHJcbiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLnRyYW5zZm9ybVNldCh2YWx1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy51cGRhdGUoKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEByZXR1cm5zIFRoZSBzdG9yZWQgSFRNTCBlbGVtZW50LCBpZiBpdCBleGlzdHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRFbGVtZW50KCk6IEhUTUxFbGVtZW50IHtcclxuICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogR2VuZXJhbCB1cGRhdGUgRnVuY3Rpb24gdG8gYmUgcnVuIHdoZW5ldmVyIHRoZSBpbnRlcm5hbCB2YWx1ZSBpcyBjaGFuZ2VkLlxyXG4gICAgICogSXQgcnVucyBhbGwgdGhlIHRyaWdnZXIsIG1vZHVsYXIsIGV0Yy4gY2hlY2tzLCB1cGRhdGVzIHRoZSBIVE1MIGVsZW1lbnRcclxuICAgICAqIGlmIHRoZXJlIGlzIG9uZSwgYW5kIHVwZGF0ZXMgbG9jYWxTdG9yYWdlIGlmIG5lZWRlZC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIHVwZGF0ZSgpOiB2b2lkIHtcclxuICAgICAgICAvLyBNaW5zIGFuZCBtYXhlcyBtdXN0IGJlIG9iZXllZCBiZWZvcmUgYW55IG90aGVyIGNvbnNpZGVyYXRpb25zXHJcbiAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkoXCJtaW5pbXVtXCIpICYmIE51bWJlcih0aGlzLnZhbHVlKSA8PSBOdW1iZXIodGhpcy5taW5pbXVtKSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5taW5pbXVtO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5vbk1pbmltdW0pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMub25NaW5pbXVtLmFwcGx5KHRoaXMsIHRoaXMuSXRlbXNIb2xkZXIuZ2V0Q2FsbGJhY2tBcmdzKCkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc093blByb3BlcnR5KFwibWF4aW11bVwiKSAmJiBOdW1iZXIodGhpcy52YWx1ZSkgPD0gTnVtYmVyKHRoaXMubWF4aW11bSkpIHtcclxuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4aW11bTtcclxuICAgICAgICAgICAgaWYgKHRoaXMub25NYXhpbXVtKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uTWF4aW11bS5hcHBseSh0aGlzLCB0aGlzLkl0ZW1zSG9sZGVyLmdldENhbGxiYWNrQXJncygpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMubW9kdWxhcml0eSkge1xyXG4gICAgICAgICAgICB0aGlzLmNoZWNrTW9kdWxhcml0eSgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMudHJpZ2dlcnMpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja1RyaWdnZXJzKCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAodGhpcy5oYXNFbGVtZW50KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlRWxlbWVudCgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHRoaXMuc3RvcmVMb2NhbGx5KSB7XHJcbiAgICAgICAgICAgIHRoaXMudXBkYXRlTG9jYWxTdG9yYWdlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3RvcmVzIGEgSXRlbVZhbHVlJ3MgdmFsdWUgaW4gbG9jYWxTdG9yYWdlIHVuZGVyIHRoZSBwcmVmaXggcGx1cyBpdHMga2V5LlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gW292ZXJyaWRlQXV0b1NhdmVdICAgV2hldGhlciB0aGUgcG9saWN5IG9uIHNhdmluZyBzaG91bGQgYmVcclxuICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmVkIChzbyBzYXZpbmcgaGFwcGVucyByZWdhcmRsZXNzKS4gQnkgXHJcbiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCwgZmFsc2UuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyB1cGRhdGVMb2NhbFN0b3JhZ2Uob3ZlcnJpZGVBdXRvU2F2ZT86IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgICAgICBpZiAob3ZlcnJpZGVBdXRvU2F2ZSB8fCB0aGlzLkl0ZW1zSG9sZGVyLmdldEF1dG9TYXZlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5JdGVtc0hvbGRlci5nZXRMb2NhbFN0b3JhZ2UoKVt0aGlzLkl0ZW1zSG9sZGVyLmdldFByZWZpeCgpICsgdGhpcy5rZXldID0gSlNPTi5zdHJpbmdpZnkodGhpcy52YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHZhbHVlIHNob3VsZCB0cmlnZ2VyIGEgY2FsbGJhY2ssIGFuZCBpZiBzbyBjYWxscyBpdC5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja1RyaWdnZXJzKCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLnRyaWdnZXJzLmhhc093blByb3BlcnR5KHRoaXMudmFsdWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcnNbdGhpcy52YWx1ZV0uYXBwbHkodGhpcywgdGhpcy5JdGVtc0hvbGRlci5nZXRDYWxsYmFja0FyZ3MoKSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2hlY2tzIGlmIHRoZSBjdXJyZW50IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbW9kdWxhcml0eSAoYXNzdW1pbmdcclxuICAgICAqIG1vZHVsYXIgaXMgYSBub24temVybyBOdW1iZXJzKSwgYW5kIGlmIHNvLCBjb250aW51b3VzbHkgcmVkdWNlcyB2YWx1ZSBhbmQgXHJcbiAgICAgKiBjYWxscyB0aGlzLm9uTW9kdWxhci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja01vZHVsYXJpdHkoKTogdm9pZCB7XHJcbiAgICAgICAgaWYgKHRoaXMudmFsdWUuY29uc3RydWN0b3IgIT09IE51bWJlciB8fCAhdGhpcy5tb2R1bGFyaXR5KSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHdoaWxlICh0aGlzLnZhbHVlID49IHRoaXMubW9kdWxhcml0eSkge1xyXG4gICAgICAgICAgICB0aGlzLnZhbHVlID0gTWF0aC5tYXgoMCwgdGhpcy52YWx1ZSAtIHRoaXMubW9kdWxhcml0eSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLm9uTW9kdWxhcikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5vbk1vZHVsYXIuYXBwbHkodGhpcywgdGhpcy5JdGVtc0hvbGRlci5nZXRDYWxsYmFja0FyZ3MoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBVcGRhdGVzIHRoZSBJdGVtVmFsdWUncyBlbGVtZW50J3Mgc2Vjb25kIGNoaWxkIHRvIGJlIHRoZSBJdGVtVmFsdWUncyB2YWx1ZS5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSB1cGRhdGVFbGVtZW50KCk6IHZvaWQge1xyXG4gICAgICAgIGlmICh0aGlzLkl0ZW1zSG9sZGVyLmhhc0Rpc3BsYXlDaGFuZ2UodGhpcy52YWx1ZSkpIHtcclxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNoaWxkcmVuWzFdLnRleHRDb250ZW50ID0gdGhpcy5JdGVtc0hvbGRlci5nZXREaXNwbGF5Q2hhbmdlKHRoaXMudmFsdWUpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5jaGlsZHJlblsxXS50ZXh0Q29udGVudCA9IHRoaXMudmFsdWU7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0cmlldmVzIGEgSXRlbVZhbHVlJ3MgdmFsdWUgZnJvbSBsb2NhbFN0b3JhZ2UsIG1ha2luZyBzdXJlIG5vdCB0byB0cnkgdG9cclxuICAgICAqIEpTT04ucGFyc2UgYW4gdW5kZWZpbmVkIG9yIG51bGwgdmFsdWUuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtNaXhlZH1cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZXRyaWV2ZUxvY2FsU3RvcmFnZSgpOiBhbnkge1xyXG4gICAgICAgIGNvbnN0IHZhbHVlOiBhbnkgPSB0aGlzLkl0ZW1zSG9sZGVyLmdldExvY2FsU3RvcmFnZSgpW3RoaXMuSXRlbXNIb2xkZXIuZ2V0UHJlZml4KCkgKyB0aGlzLmtleV07XHJcblxyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIgfHwgdmFsdWUgPT09IFwidW5kZWZpbmVkXCIpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmICh2YWx1ZS5jb25zdHJ1Y3RvciAhPT0gU3RyaW5nKSB7XHJcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlKTtcclxuICAgIH1cclxufVxyXG4iXX0= |
import { IItemsHoldr } from "./IItemsHoldr"; | ||
import { IItemValue, ITriggers } from "./IItemValue"; | ||
import { proliferate } from "./proliferate"; | ||
/** | ||
* Storage container for a single ItemsHoldr value. The value may have triggers | ||
* assigned to value, modularity, and other triggers, as well as an HTML element. | ||
* Storage container for a single ItemsHoldr value. | ||
*/ | ||
@@ -12,3 +12,3 @@ export class ItemValue implements IItemValue { | ||
*/ | ||
private ItemsHolder: IItemsHoldr; | ||
private itemsHolder: IItemsHoldr; | ||
@@ -37,17 +37,2 @@ /** | ||
/** | ||
* An HTML element whose second child's textContent is always set to that of the element. | ||
*/ | ||
private element: HTMLElement; | ||
/** | ||
* Whether an Element should be created and synced to the value. | ||
*/ | ||
private hasElement: boolean; | ||
/** | ||
* An Element tag to use in creating the element, if hasElement is true. | ||
*/ | ||
private elementTag: string; | ||
/** | ||
* A minimum value for the value to equal, if value is a number. | ||
@@ -60,3 +45,3 @@ */ | ||
*/ | ||
private onMinimum: Function; | ||
private onMinimum: Function | undefined; | ||
@@ -71,3 +56,3 @@ /** | ||
*/ | ||
private onMaximum: Function; | ||
private onMaximum: Function | undefined; | ||
@@ -87,3 +72,3 @@ /** | ||
*/ | ||
private transformGet: Function; | ||
private transformGet?: Function; | ||
@@ -93,3 +78,3 @@ /** | ||
*/ | ||
private transformSet: Function; | ||
private transformSet?: Function; | ||
@@ -104,13 +89,12 @@ /** | ||
* to the value via proliferate before the settings. | ||
* | ||
* @constructor | ||
* @param ItemsHolder The container for this value. | ||
* | ||
* @param itemsHolder The container for this value. | ||
* @param key The key to reference this new ItemValue by. | ||
* @param settings Any optional custom settings. | ||
*/ | ||
constructor(ItemsHolder: IItemsHoldr, key: string, settings: any = {}) { | ||
this.ItemsHolder = ItemsHolder; | ||
public constructor(itemsHolder: IItemsHoldr, key: string, settings: any = {}) { | ||
this.itemsHolder = itemsHolder; | ||
ItemsHolder.proliferate(this, ItemsHolder.getDefaults()); | ||
ItemsHolder.proliferate(this, settings); | ||
proliferate(this, itemsHolder.getDefaults()); | ||
proliferate(this, settings); | ||
@@ -123,17 +107,5 @@ this.key = key; | ||
if (this.hasElement) { | ||
this.element = ItemsHolder.createElement(this.elementTag || "div", { | ||
className: ItemsHolder.getPrefix() + "_value " + key | ||
}); | ||
this.element.appendChild(ItemsHolder.createElement("div", { | ||
"textContent": key | ||
})); | ||
this.element.appendChild(ItemsHolder.createElement("div", { | ||
"textContent": this.value | ||
})); | ||
} | ||
if (this.storeLocally) { | ||
// If there exists an old version of this property, get it | ||
if (ItemsHolder.getLocalStorage().hasOwnProperty(ItemsHolder.getPrefix() + key)) { | ||
// If there exists an old version of this property, get it | ||
if (itemsHolder.getLocalStorage().hasOwnProperty(itemsHolder.getPrefix() + key)) { | ||
this.value = this.retrieveLocalStorage(); | ||
@@ -149,3 +121,5 @@ this.update(); | ||
/** | ||
* @returns The value being stored, with a transformGet applied if one exists. | ||
* Gets a stored value, with a transformGet applied if one exists. | ||
* | ||
* @returns The value being stored. | ||
*/ | ||
@@ -167,7 +141,5 @@ public getValue(): any { | ||
public setValue(value: any): void { | ||
if (this.transformSet) { | ||
this.value = this.transformSet(value); | ||
} else { | ||
this.value = value; | ||
} | ||
this.value = this.transformSet === undefined | ||
? value | ||
: this.transformSet(value); | ||
@@ -178,12 +150,3 @@ this.update(); | ||
/** | ||
* @returns The stored HTML element, if it exists. | ||
*/ | ||
public getElement(): HTMLElement { | ||
return this.element; | ||
} | ||
/** | ||
* General update Function to be run whenever the internal value is changed. | ||
* It runs all the trigger, modular, etc. checks, updates the HTML element | ||
* if there is one, and updates localStorage if needed. | ||
*/ | ||
@@ -194,9 +157,9 @@ public update(): void { | ||
this.value = this.minimum; | ||
if (this.onMinimum) { | ||
this.onMinimum.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
if (this.onMinimum !== undefined) { | ||
this.onMinimum(); | ||
} | ||
} else if (this.hasOwnProperty("maximum") && Number(this.value) <= Number(this.maximum)) { | ||
this.value = this.maximum; | ||
if (this.onMaximum) { | ||
this.onMaximum.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
if (this.onMaximum !== undefined) { | ||
this.onMaximum(); | ||
} | ||
@@ -213,6 +176,2 @@ } | ||
if (this.hasElement) { | ||
this.updateElement(); | ||
} | ||
if (this.storeLocally) { | ||
@@ -225,10 +184,10 @@ this.updateLocalStorage(); | ||
* Stores a ItemValue's value in localStorage under the prefix plus its key. | ||
* | ||
* | ||
* @param [overrideAutoSave] Whether the policy on saving should be | ||
* ignored (so saving happens regardless). By | ||
* ignored (so saving happens regardless). By | ||
* default, false. | ||
*/ | ||
public updateLocalStorage(overrideAutoSave?: boolean): void { | ||
if (overrideAutoSave || this.ItemsHolder.getAutoSave()) { | ||
this.ItemsHolder.getLocalStorage()[this.ItemsHolder.getPrefix() + this.key] = JSON.stringify(this.value); | ||
if (overrideAutoSave || this.itemsHolder.getAutoSave()) { | ||
this.itemsHolder.getLocalStorage()[this.itemsHolder.getPrefix() + this.key] = JSON.stringify(this.value); | ||
} | ||
@@ -242,3 +201,3 @@ } | ||
if (this.triggers.hasOwnProperty(this.value)) { | ||
this.triggers[this.value].apply(this, this.ItemsHolder.getCallbackArgs()); | ||
this.triggers[this.value](); | ||
} | ||
@@ -249,3 +208,3 @@ } | ||
* Checks if the current value is greater than the modularity (assuming | ||
* modular is a non-zero Numbers), and if so, continuously reduces value and | ||
* modular is a non-zero Numbers), and if so, continuously reduces value and | ||
* calls this.onModular. | ||
@@ -261,3 +220,3 @@ */ | ||
if (this.onModular) { | ||
this.onModular.apply(this, this.ItemsHolder.getCallbackArgs()); | ||
this.onModular(); | ||
} | ||
@@ -268,20 +227,7 @@ } | ||
/** | ||
* Updates the ItemValue's element's second child to be the ItemValue's value. | ||
*/ | ||
private updateElement(): void { | ||
if (this.ItemsHolder.hasDisplayChange(this.value)) { | ||
this.element.children[1].textContent = this.ItemsHolder.getDisplayChange(this.value); | ||
} else { | ||
this.element.children[1].textContent = this.value; | ||
} | ||
} | ||
/** | ||
* Retrieves a ItemValue's value from localStorage, making sure not to try to | ||
* JSON.parse an undefined or null value. | ||
* | ||
* @returns {Mixed} | ||
*/ | ||
private retrieveLocalStorage(): any { | ||
const value: any = this.ItemsHolder.getLocalStorage()[this.ItemsHolder.getPrefix() + this.key]; | ||
const value: any = this.itemsHolder.getLocalStorage()[this.itemsHolder.getPrefix() + this.key]; | ||
@@ -288,0 +234,0 @@ if (typeof value === "undefined" || value === "undefined") { |
{ | ||
"compilerOptions": { | ||
"declaration": true, | ||
"experimentalDecorators": true, | ||
"jsx": "react", | ||
"lib": ["dom", "es2015.collection", "es2015.promise", "es5"], | ||
"module": "amd", | ||
@@ -10,10 +13,14 @@ "moduleResolution": "node", | ||
"noFallthroughCasesInSwitch": true, | ||
"noUnusedLocals": true, | ||
"noUnusedParameters": true, | ||
"pretty": true, | ||
"strictNullChecks": true, | ||
"target": "es3" | ||
"target": "es5" | ||
}, | ||
"exclude": [ | ||
"dist", | ||
"node_modules" | ||
], | ||
"include": [ | ||
"./src/**/*.ts" | ||
"./src/**/*.ts", | ||
"./src/**/*.tsx" | ||
] | ||
} |
101
tslint.json
{ | ||
"extends": "./node_modules/shenanigans-manager/setup/tslint.json", | ||
"rules": { | ||
"align": [ | ||
true, | ||
"parameters", | ||
"arguments", | ||
"statements" | ||
], | ||
"class-name": true, | ||
"comment-format": [true, "check-space"], | ||
"curly": true, | ||
"eofline": true, | ||
"forin": true, | ||
"indent": [true, 4], | ||
"interface-name": [true, "always-prefix"], | ||
"jsdoc-format": true, | ||
"label-position": true, | ||
"max-line-length": [true, 140], | ||
"member-access": true, | ||
"member-ordering": [ | ||
true, | ||
"public-before-private", | ||
"static-before-instance", | ||
"variables-before-functions" | ||
], | ||
"new-parens": true, | ||
"no-angle-bracket-type-assertion": true, | ||
"no-arg": true, | ||
"no-conditional-assignment": true, | ||
"no-consecutive-blank-lines": true, | ||
"no-console": [ | ||
true, | ||
"debug", | ||
"info", | ||
"time", | ||
"timeEnd", | ||
"trace" | ||
], | ||
"no-construct": true, | ||
"no-debugger": true, | ||
"no-duplicate-variable": true, | ||
"no-empty": true, | ||
"no-eval": true, | ||
"no-internal-module": true, | ||
"no-null-keyword": true, | ||
"no-shadowed-variable": true, | ||
"no-string-literal": true, | ||
"no-switch-case-fall-through": true, | ||
"no-trailing-whitespace": true, | ||
"no-unsafe-finally": true, | ||
"no-unused-expression": true, | ||
"no-unused-new": true, | ||
"no-use-before-declare": true, | ||
"no-var-keyword": true, | ||
"one-line": [ | ||
true, | ||
"check-catch", | ||
"check-else", | ||
"check-finally", | ||
"check-open-brace", | ||
"check-whitespace" | ||
], | ||
"one-variable-per-declaration": true, | ||
"ordered-imports": true, | ||
"quotemark": [true, "double"], | ||
"semicolon": [true, "always"], | ||
"switch-default": true, | ||
"trailing-comma": true, | ||
"triple-equals": [true, "allow-null-check"], | ||
"typedef": [ | ||
true, | ||
"call-signature", | ||
"parameter", | ||
"property-declaration", | ||
"variable-declaration", | ||
"member-variable-declaration" | ||
], | ||
"typedef-whitespace": [ | ||
true, | ||
{ | ||
"call-signature": "nospace", | ||
"index-signature": "nospace", | ||
"parameter": "nospace", | ||
"property-declaration": "nospace", | ||
"variable-declaration": "nospace" | ||
} | ||
], | ||
"use-isnan": true, | ||
"whitespace": [ | ||
true, | ||
"check-branch", | ||
"check-decl", | ||
"check-operator", | ||
"check-separator", | ||
"check-type" | ||
] | ||
"ban-types": false, | ||
"no-any": false, | ||
"no-unsafe-any": false, | ||
"strict-boolean-expressions": false | ||
} | ||
} | ||
} |
Sorry, the diff of this file is not supported yet
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
Dynamic require
Supply chain riskDynamic require can indicate the package is performing dangerous or unsafe dynamic code execution.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
0
773708
21
59
3813
16
4