From 1c5e0227fbbf225bfb687e5734de2023e119611f Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sun, 8 Oct 2017 17:10:17 +0200 Subject: [PATCH 01/51] begun work on virtual groups --- README.md | 3 +++ io-package.json | 8 ++++---- package.json | 2 +- src/lib/virtual-group.ts | 5 +++++ 4 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 src/lib/virtual-group.ts diff --git a/README.md b/README.md index ef85bea2..b7fbcd44 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,9 @@ The result object `ret` looks as follows: ## Changelog +#### 0.5.0 (2017-10-XX) +* (AlCalzone) Support virtual groups + #### 0.3.3 (2017-10-07) * (AlCalzone) Eliminated potential sources of infinite loops diff --git a/io-package.json b/io-package.json index 625fb757..a1baf0e2 100644 --- a/io-package.json +++ b/io-package.json @@ -1,11 +1,11 @@ { "common": { "name": "tradfri", - "version": "0.3.3", + "version": "0.5.0", "news": { - "0.3.3": { - "en": "Eliminated potential sources of infinite loops", - "de": "Potentielle Auslöser von Endlosschleifen eliminiert" + "0.5.0": { + "en": "Support of virtual groups", + "de": "Unterstützung virtueller Gruppen" }, "0.3.0": { "en": "Support of groups and scenes, improved connection handling, internal improvements.", diff --git a/package.json b/package.json index 708865ce..c38be7bc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.3.3", + "version": "0.5.0", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts new file mode 100644 index 00000000..c8c89884 --- /dev/null +++ b/src/lib/virtual-group.ts @@ -0,0 +1,5 @@ +import { Accessory } from "../ipso/accessory"; + +export class VirtualGroup { + +} From f4c947f815ad07e55af5cc3754c1cf1c3d8aa303 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 27 Sep 2017 13:19:19 +0200 Subject: [PATCH 02/51] react to changes in virtual group states --- src/lib/virtual-group.ts | 36 ++++++++++++++++++++++++++++++++++++ src/main.ts | 25 +++++++++++++++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index c8c89884..e094940a 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -1,5 +1,41 @@ import { Accessory } from "../ipso/accessory"; +import { Global as _ } from "./global"; +import { DictionaryLike } from "./object-polyfill"; export class VirtualGroup { + public onOff: boolean = false; // + public dimmer: number = 0; // [0..254] + public colorX: number = 0; // int + public transitionTime: number = 0; // + + /** + * The instance ids of all devices combined in this group + */ + public instanceIDs: number[]; + + public serialize(references: DictionaryLike): DictionaryLike { + const ret = {}; + for (const id of this.instanceIDs) { + if (!(id in references)) { + _.log(`VirtualGroup > cannot serialize command for accessory with id ${id}`, "warn"); + continue; + } + // get the reference value and a clone to modify + const oldAcc = references[id]; + const newAcc = oldAcc.clone(); + // get the light to modify + const light = newAcc.lightList[0]; + light.merge({ + onOff: this.onOff, + dimmer: this.dimmer, + colorX: this.colorX, + colorY: 27000, + transitionTime: this.transitionTime, + }); + // and serialize the payload + ret[id] = newAcc.serialize(oldAcc); + } + return ret; + } } diff --git a/src/main.ts b/src/main.ts index 4d548660..854bb16b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -19,6 +19,7 @@ import { Group } from "./ipso/group"; import { IPSOObject } from "./ipso/ipsoObject"; import { Light } from "./ipso/light"; import { Scene } from "./ipso/scene"; +import { VirtualGroup } from "./lib/virtual-group"; // Adapter-Utils laden import utils from "./lib/utils"; @@ -56,6 +57,7 @@ interface GroupInfo { scenes: DictionaryLike; } const groups: DictionaryLike = {}; +const virtualGroups: DictionaryLike = {}; // dictionary of ioBroker objects const objects: DictionaryLike = {}; @@ -310,6 +312,29 @@ let adapter: ExtendedAdapter = utils.adapter({ url = `${requestBase}${coapEndpoints.groups}/${rootObj.native.instanceId}`; break; + case "virtual group": + // find the virtual group instance + const vGroup = virtualGroups[rootObj.native.instanceId]; + + if (id.endsWith(".state")) { + vGroup.onOff = val; + } else if (id.endsWith(".brightness")) { + vGroup.dimmer = val; + vGroup.transitionTime = await getTransitionDuration(group); + } else if (id.endsWith(".color")) { + vGroup.colorX = val; + vGroup.transitionTime = await getTransitionDuration(group); + } else if (id.endsWith(".transitionDuration")) { + // TODO: check if we need to buffer this somehow + // for now just ack the change + await adapter.$setState(id, state, true); + return; + } + + serializedObj = vGroup.serialize(devices); + url = `${requestBase}${coapEndpoints.groups}`; + break; + default: // accessory // read the instanceId and get a reference value const accessory = devices[rootObj.native.instanceId]; From 1fe2c18667bc04a7f297fe3b6fc38426be9b5ef9 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 27 Sep 2017 13:39:52 +0200 Subject: [PATCH 03/51] load virtual groups from ioBroker --- src/lib/virtual-group.ts | 3 +++ src/main.ts | 24 ++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index e094940a..d2fbe428 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -4,6 +4,9 @@ import { DictionaryLike } from "./object-polyfill"; export class VirtualGroup { + constructor(public readonly instanceId: number) { + } + public onOff: boolean = false; // public dimmer: number = 0; // [0..254] public colorX: number = 0; // int diff --git a/src/main.ts b/src/main.ts index 854bb16b..9308f6ee 100644 --- a/src/main.ts +++ b/src/main.ts @@ -130,6 +130,7 @@ let adapter: ExtendedAdapter = utils.adapter({ connectionAlive = true; pingTimer = setInterval(pingThread, 10000); + loadVirtualGroups(); // TODO: load known devices from ioBroker into & observeDevices(); observeGroups(); @@ -1324,6 +1325,29 @@ function parsePayload(response: CoapResponse): any { } } +/** + * Loads defined virtual groups from the ioBroker objects DB + */ +async function loadVirtualGroups(): Promise { + // find all defined virtual groups + let groupObjects = values(await _.$$("VG-*", "channel")); + groupObjects = groupObjects.filter(g => { + return g.native && + g.native.instanceId != null && + g.native.type === "virtual group"; + }); + // load them into the virtualGroups dict + Object.assign(virtualGroups, composeObject( + groupObjects.map(g => { + const id: number = g.native.instanceId; + const instanceIDs: number[] = g.native.instanceIDs; + const ret = new VirtualGroup(id); + ret.instanceIDs = instanceIDs; + return [`${id}`, ret] as [string, VirtualGroup]; + }), + )); +} + // Connection check let pingTimer: NodeJS.Timer; let connectionAlive: boolean = false; From 4280564744d854c4eda93c7bdc5d8c2ed3539ee3 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 27 Sep 2017 14:00:36 +0200 Subject: [PATCH 04/51] add virtual groups to group name calculation --- src/lib/constants.ts | 2 +- src/lib/strings.ts | 9 +++++++++ src/main.ts | 40 +++++++++++++++++++++++++--------------- 3 files changed, 35 insertions(+), 16 deletions(-) create mode 100644 src/lib/strings.ts diff --git a/src/lib/constants.ts b/src/lib/constants.ts index 66a237e0..5f26037a 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -1,6 +1,6 @@ // tslint:disable:variable-name -// Endpunkte, die abgefragt werden können +// Endpunkte, die abgefragt werden können export const Endpoints = { DEVICES: "15001", HS_LINK: "15002", // HSAccessoryLink diff --git a/src/lib/strings.ts b/src/lib/strings.ts new file mode 100644 index 00000000..285fec00 --- /dev/null +++ b/src/lib/strings.ts @@ -0,0 +1,9 @@ +export function padStart(str: string, targetLen: number, fill: string = " "): string { + if (str != null && str.length >= targetLen) return str; + if (fill == null && fill.length !== 1) throw new Error("fill must be a single char"); + let ret: string = str; + while (ret.length < targetLen) { + ret = fill + ret; + } + return ret; +} diff --git a/src/main.ts b/src/main.ts index 9308f6ee..056f512f 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,6 +12,7 @@ import { ExtendedAdapter, Global as _ } from "./lib/global"; import { composeObject, DictionaryLike, dig, entries, filter, values } from "./lib/object-polyfill"; import { wait } from "./lib/promises"; import { str2regex } from "./lib/str2regex"; +import { padStart } from "./lib/strings"; // Datentypen laden import { Accessory, AccessoryTypes } from "./ipso/accessory"; @@ -720,32 +721,41 @@ function calcObjId(accessory: Accessory): string { * excluding the adapter namespace */ function calcObjName(accessory: Accessory): string { - const prefix = (() => { - switch (accessory.type) { - case AccessoryTypes.remote: - return "RC"; - case AccessoryTypes.lightbulb: - return "L"; - default: - _.log("unknown accessory type " + accessory.type); - return "XYZ"; - } - })(); + let prefix: string; + switch (accessory.type) { + case AccessoryTypes.remote: + prefix = "RC"; + break; + case AccessoryTypes.lightbulb: + prefix = "L"; + break; + default: + _.log("unknown accessory type " + accessory.type); + prefix = "XYZ"; + break; + } return `${prefix}-${accessory.instanceId}`; } /** * Determines the object ID under which the given group should be stored */ -function calcGroupId(group: Group): string { +function calcGroupId(group: Group | VirtualGroup): string { return `${adapter.namespace}.${calcGroupName(group)}`; } /** * Determines the object name under which the given group should be stored, * excluding the adapter namespace */ -function calcGroupName(group: Group): string { - return `G-${group.instanceId}`; +function calcGroupName(group: Group | VirtualGroup): string { + let prefix: string; + if (group instanceof Group) { + prefix = "G"; + } else if (group instanceof VirtualGroup) { + prefix = "VG"; + } + const postfix: string = group.instanceId.toString(); + return `${prefix}-${padStart(postfix, 5, "0")}`; } /** @@ -841,7 +851,7 @@ function extendDevice(accessory: Accessory) { // Object could have a default value, find it const newValue = dig(accessory, obj.native.path); adapter.setState(id, newValue, true); - } catch (e) {/* skip this value */} + } catch (e) { /* skip this value */ } } } else { From f9a7ae9f78fd364604b90dca3ece743a0bb6c6f2 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 27 Sep 2017 14:39:02 +0200 Subject: [PATCH 05/51] fix getTransitionDuration for virtual groups --- src/main.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main.ts b/src/main.ts index 056f512f..faa40bef 100644 --- a/src/main.ts +++ b/src/main.ts @@ -322,10 +322,10 @@ let adapter: ExtendedAdapter = utils.adapter({ vGroup.onOff = val; } else if (id.endsWith(".brightness")) { vGroup.dimmer = val; - vGroup.transitionTime = await getTransitionDuration(group); + vGroup.transitionTime = await getTransitionDuration(vGroup); } else if (id.endsWith(".color")) { vGroup.colorX = val; - vGroup.transitionTime = await getTransitionDuration(group); + vGroup.transitionTime = await getTransitionDuration(vGroup); } else if (id.endsWith(".transitionDuration")) { // TODO: check if we need to buffer this somehow // for now just ack the change @@ -775,14 +775,14 @@ function calcSceneName(scene: Scene): string { /** * Returns the configured transition duration for an accessory or a group */ -async function getTransitionDuration(accessoryOrGroup: Accessory | Group): Promise { +async function getTransitionDuration(accessoryOrGroup: Accessory | Group | VirtualGroup): Promise { let stateId: string; if (accessoryOrGroup instanceof Accessory) { switch (accessoryOrGroup.type) { case AccessoryTypes.lightbulb: stateId = calcObjId(accessoryOrGroup) + ".lightbulb.transitionDuration"; } - } else if (accessoryOrGroup instanceof Group) { + } else if (accessoryOrGroup instanceof Group || accessoryOrGroup instanceof VirtualGroup) { stateId = calcGroupId(accessoryOrGroup) + ".transitionDuration"; } const ret = await adapter.$getState(stateId); From d54bdaf76028bf21f3d8bb8f684604352c134d7c Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 27 Sep 2017 14:54:02 +0200 Subject: [PATCH 06/51] define extendVirtualGroup function deprecate _.isdef --- src/ipso/ipsoObject.ts | 8 +- src/lib/global.ts | 3 - src/lib/virtual-group.ts | 4 +- src/main.ts | 165 ++++++++++++++++++++++++++++++++++----- 4 files changed, 153 insertions(+), 27 deletions(-) diff --git a/src/ipso/ipsoObject.ts b/src/ipso/ipsoObject.ts index 01237d98..859b18ec 100644 --- a/src/ipso/ipsoObject.ts +++ b/src/ipso/ipsoObject.ts @@ -79,7 +79,7 @@ export class IPSOObject { if (value.isSerializedObjectEmpty(_ret)) return null; } else { // if the value is not the default one, then remember it - if (_.isdef(refValue)) { + if (refValue != null) { if (!_required && refValue === value) return null; } else { // there is no default value, just remember the actual value @@ -98,7 +98,7 @@ export class IPSOObject { // find value and reference (default) value let value = this[propName]; let refValue = null; - if (_.isdef(reference) && reference.hasOwnProperty(propName)) { + if (reference != null && reference.hasOwnProperty(propName)) { refValue = reference[propName]; } @@ -107,7 +107,7 @@ export class IPSOObject { if (value instanceof Array) { // serialize each item - if (_.isdef(refValue)) { + if (refValue != null) { // reference value exists, make sure we have the same amount of items if (!(refValue instanceof Array && refValue.length === value.length)) { throw new Error("cannot serialize arrays when the reference values don't match"); @@ -119,7 +119,7 @@ export class IPSOObject { value = value.map(v => serializeValue(key, propName, v, null, serializer)); } // now remove null items - value = value.filter(v => _.isdef(v)); + value = value.filter(v => v != null); if (value.length === 0) value = null; } else { // directly serialize the value diff --git a/src/lib/global.ts b/src/lib/global.ts index 93f5cfd3..5ae97326 100644 --- a/src/lib/global.ts +++ b/src/lib/global.ts @@ -213,9 +213,6 @@ export class Global { } } - // Prüfen auf (un)defined - public static isdef(value: any): boolean { return value != undefined; } - // custom subscriptions public static subscribeStates: (pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void) => string; public static unsubscribeStates: (id: string) => void; diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index d2fbe428..1f27dfb2 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -15,11 +15,11 @@ export class VirtualGroup { /** * The instance ids of all devices combined in this group */ - public instanceIDs: number[]; + public deviceIDs: number[]; public serialize(references: DictionaryLike): DictionaryLike { const ret = {}; - for (const id of this.instanceIDs) { + for (const id of this.deviceIDs) { if (!(id in references)) { _.log(`VirtualGroup > cannot serialize command for accessory with id ${id}`, "warn"); continue; diff --git a/src/main.ts b/src/main.ts index faa40bef..f9f846f2 100644 --- a/src/main.ts +++ b/src/main.ts @@ -279,8 +279,8 @@ let adapter: ExtendedAdapter = utils.adapter({ // make sure we have whole numbers if (stateObj.common.type === "number") { val = Math.round(val); // TODO: check if there are situations where decimal numbers are allowed - if (_.isdef(stateObj.common.min)) val = Math.max(stateObj.common.min, val); - if (_.isdef(stateObj.common.max)) val = Math.min(stateObj.common.max, val); + if (stateObj.common.min != null) val = Math.max(stateObj.common.min, val); + if (stateObj.common.max != null) val = Math.min(stateObj.common.max, val); } // this will contain the serialized payload @@ -817,7 +817,7 @@ function accessoryToNative(accessory: Accessory): DictionaryLike { function extendDevice(accessory: Accessory) { const objId = calcObjId(accessory); - if (_.isdef(objects[objId])) { + if (objId in objects) { // check if we need to edit the existing object const devObj = objects[objId]; let changed = false; @@ -983,15 +983,14 @@ function extendDevice(accessory: Accessory) { const createObjects = Object.keys(stateObjs) .map((key) => { - const stateId = `${objId}.${key}`; const obj = stateObjs[key]; let initialValue = null; - if (_.isdef(obj.native.path)) { + if (obj.native.path != null) { // Object could have a default value, find it initialValue = dig(accessory, obj.native.path); } // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(stateId, obj, initialValue); + return adapter.$createOwnStateEx(obj._id, obj, initialValue); }) ; Promise.all(createObjects); @@ -1002,20 +1001,26 @@ function extendDevice(accessory: Accessory) { /** * Returns the common part of the ioBroker object representing the given group */ -function groupToCommon(group: Group): ioBroker.ObjectCommon { - return { - name: group.name, - }; +function groupToCommon(group: Group | VirtualGroup): ioBroker.ObjectCommon { + if (group instanceof Group) { + return { + name: group.name, + }; + } else { + return { + name: `virtual group ${group.instanceId}`, + }; + } } /** * Returns the native part of the ioBroker object representing the given group */ -function groupToNative(group: Group): DictionaryLike { +function groupToNative(group: Group | VirtualGroup): DictionaryLike { return { instanceId: group.instanceId, deviceIDs: group.deviceIDs, - type: "group", + type: (group instanceof VirtualGroup ? "virtual " : "") + "group", }; } @@ -1023,7 +1028,7 @@ function groupToNative(group: Group): DictionaryLike { function extendGroup(group: Group) { const objId = calcGroupId(group); - if (_.isdef(objects[objId])) { + if (objId in objects) { // check if we need to edit the existing object const grpObj = objects[objId]; let changed = false; @@ -1141,15 +1146,14 @@ function extendGroup(group: Group) { const createObjects = Object.keys(stateObjs) .map((key) => { - const stateId = `${objId}.${key}`; const obj = stateObjs[key]; let initialValue = null; - if (_.isdef(obj.native.path)) { + if (obj.native.path != null) { // Object could have a default value, find it initialValue = dig(group, obj.native.path); } // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(stateId, obj, initialValue); + return adapter.$createOwnStateEx(obj._id, obj, initialValue); }) ; Promise.all(createObjects); @@ -1167,7 +1171,7 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { const scenesId = `${objId}.activeScene`; // only extend that object if it exists already - if (_.isdef(objects[scenesId])) { + if (scenesId in objects) { _.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); const activeSceneObj = objects[scenesId]; @@ -1182,6 +1186,131 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { } } +/* creates or edits an existing -object for a virtual group */ +function extendVirtualGroup(group: VirtualGroup) { + const objId = calcGroupId(group); + + if (objId in objects) { + // check if we need to edit the existing object + const grpObj = objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) adapter.extendObject(objId, grpObj); + + // TODO: Update group states where applicable. See extendGroup for the code + + } else { + // create new object + const devObj: ioBroker.Object = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + adapter.setObject(objId, devObj); + + // also create state objects, depending on the accessory type + const stateObjs: DictionaryLike = { + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, // TODO: check + write: true, // TODO: check + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, // TODO: check + def: 0, + role: "light.dimmer", // TODO: better role? + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, // TODO: check + write: true, // TODO: check + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, // TODO: check + write: true, // TODO: check + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorX", + }, + }, + }; + + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return adapter.$createOwnStateEx(obj._id, obj, initialValue); + }) + ; + Promise.all(createObjects); + + } +} + /** * Renames a device * @param accessory The device to be renamed @@ -1352,7 +1481,7 @@ async function loadVirtualGroups(): Promise { const id: number = g.native.instanceId; const instanceIDs: number[] = g.native.instanceIDs; const ret = new VirtualGroup(id); - ret.instanceIDs = instanceIDs; + ret.deviceIDs = instanceIDs; return [`${id}`, ret] as [string, VirtualGroup]; }), )); From 57dab616c02bfabc448fa9090a1c2602ee42f8b1 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sun, 8 Oct 2017 17:12:25 +0200 Subject: [PATCH 07/51] compiled the changes --- build/ipso/ipsoObject.js | 8 +- build/ipso/ipsoObject.js.map | 2 +- build/lib/constants.js | 2 +- build/lib/global.d.ts | 1 - build/lib/global.js | 2 - build/lib/global.js.map | 2 +- build/lib/strings.d.ts | 1 + build/lib/strings.js | 15 +++ build/lib/strings.js.map | 1 + build/lib/virtual-group.d.ts | 15 +++ build/lib/virtual-group.js | 38 ++++++ build/lib/virtual-group.js.map | 1 + build/main.js | 239 +++++++++++++++++++++++++++++---- build/main.js.map | 2 +- 14 files changed, 290 insertions(+), 39 deletions(-) create mode 100644 build/lib/strings.d.ts create mode 100644 build/lib/strings.js create mode 100644 build/lib/strings.js.map create mode 100644 build/lib/virtual-group.d.ts create mode 100644 build/lib/virtual-group.js create mode 100644 build/lib/virtual-group.js.map diff --git a/build/ipso/ipsoObject.js b/build/ipso/ipsoObject.js index fa978f58..f9b02e6c 100644 --- a/build/ipso/ipsoObject.js +++ b/build/ipso/ipsoObject.js @@ -82,7 +82,7 @@ class IPSOObject { } else { // if the value is not the default one, then remember it - if (global_1.Global.isdef(refValue)) { + if (refValue != null) { if (!_required && refValue === value) return null; } @@ -103,14 +103,14 @@ class IPSOObject { // find value and reference (default) value let value = this[propName]; let refValue = null; - if (global_1.Global.isdef(reference) && reference.hasOwnProperty(propName)) { + if (reference != null && reference.hasOwnProperty(propName)) { refValue = reference[propName]; } // try to find serializer for this property const serializer = getSerializer(this, propName); if (value instanceof Array) { // serialize each item - if (global_1.Global.isdef(refValue)) { + if (refValue != null) { // reference value exists, make sure we have the same amount of items if (!(refValue instanceof Array && refValue.length === value.length)) { throw new Error("cannot serialize arrays when the reference values don't match"); @@ -123,7 +123,7 @@ class IPSOObject { value = value.map(v => serializeValue(key, propName, v, null, serializer)); } // now remove null items - value = value.filter(v => global_1.Global.isdef(v)); + value = value.filter(v => v != null); if (value.length === 0) value = null; } diff --git a/build/ipso/ipsoObject.js.map b/build/ipso/ipsoObject.js.map index 03e93abe..7bb2da39 100644 --- a/build/ipso/ipsoObject.js.map +++ b/build/ipso/ipsoObject.js.map @@ -1 +1 @@ -{"version":3,"file":"ipsoObject.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["ipso/ipsoObject.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ipsoObject.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["ipso/ipsoObject.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/constants.js b/build/lib/constants.js index dfb54653..ed81d614 100644 --- a/build/lib/constants.js +++ b/build/lib/constants.js @@ -1,7 +1,7 @@ "use strict"; // tslint:disable:variable-name Object.defineProperty(exports, "__esModule", { value: true }); -// Endpunkte, die abgefragt werden k�nnen +// Endpunkte, die abgefragt werden können exports.Endpoints = { DEVICES: "15001", HS_LINK: "15002", diff --git a/build/lib/global.d.ts b/build/lib/global.d.ts index 68f7e7bf..9c5d41c9 100644 --- a/build/lib/global.d.ts +++ b/build/lib/global.d.ts @@ -94,7 +94,6 @@ export declare class Global { * @param id */ static $$(pattern: string, type: ioBroker.ObjectType, role?: string): Promise>; - static isdef(value: any): boolean; static subscribeStates: (pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void) => string; static unsubscribeStates: (id: string) => void; static subscribeObjects: (pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void) => string; diff --git a/build/lib/global.js b/build/lib/global.js index 75135771..07f344b7 100644 --- a/build/lib/global.js +++ b/build/lib/global.js @@ -140,8 +140,6 @@ class Global { } }); } - // Prüfen auf (un)defined - static isdef(value) { return value != undefined; } // Workaround für unvollständige Adapter-Upgrades static ensureInstanceObjects() { return __awaiter(this, void 0, void 0, function* () { diff --git a/build/lib/global.js.map b/build/lib/global.js.map index 4d06434c..cce4971a 100644 --- a/build/lib/global.js.map +++ b/build/lib/global.js.map @@ -1 +1 @@ -{"version":3,"file":"global.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/global.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"global.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/global.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/strings.d.ts b/build/lib/strings.d.ts new file mode 100644 index 00000000..6aeb1bc0 --- /dev/null +++ b/build/lib/strings.d.ts @@ -0,0 +1 @@ +export declare function padStart(str: string, targetLen: number, fill?: string): string; diff --git a/build/lib/strings.js b/build/lib/strings.js new file mode 100644 index 00000000..4e8364ed --- /dev/null +++ b/build/lib/strings.js @@ -0,0 +1,15 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function padStart(str, targetLen, fill = " ") { + if (str != null && str.length >= targetLen) + return str; + if (fill == null && fill.length !== 1) + throw new Error("fill must be a single char"); + let ret = str; + while (ret.length < targetLen) { + ret = fill + ret; + } + return ret; +} +exports.padStart = padStart; +//# sourceMappingURL=strings.js.map \ No newline at end of file diff --git a/build/lib/strings.js.map b/build/lib/strings.js.map new file mode 100644 index 00000000..6a15d983 --- /dev/null +++ b/build/lib/strings.js.map @@ -0,0 +1 @@ +{"version":3,"file":"strings.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/strings.ts"],"names":[],"mappings":";;AAAA,kBAAyB,GAAW,EAAE,SAAiB,EAAE,OAAe,GAAG;IAC1E,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC;IACvD,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACrF,IAAI,GAAG,GAAW,GAAG,CAAC;IACtB,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC/B,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,GAAG,CAAC;AACZ,CAAC;AARD,4BAQC"} \ No newline at end of file diff --git a/build/lib/virtual-group.d.ts b/build/lib/virtual-group.d.ts new file mode 100644 index 00000000..d86f8df8 --- /dev/null +++ b/build/lib/virtual-group.d.ts @@ -0,0 +1,15 @@ +import { Accessory } from "../ipso/accessory"; +import { DictionaryLike } from "./object-polyfill"; +export declare class VirtualGroup { + readonly instanceId: number; + constructor(instanceId: number); + onOff: boolean; + dimmer: number; + colorX: number; + transitionTime: number; + /** + * The instance ids of all devices combined in this group + */ + deviceIDs: number[]; + serialize(references: DictionaryLike): DictionaryLike; +} diff --git a/build/lib/virtual-group.js b/build/lib/virtual-group.js new file mode 100644 index 00000000..e1868527 --- /dev/null +++ b/build/lib/virtual-group.js @@ -0,0 +1,38 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const global_1 = require("./global"); +class VirtualGroup { + constructor(instanceId) { + this.instanceId = instanceId; + this.onOff = false; // + this.dimmer = 0; // [0..254] + this.colorX = 0; // int + this.transitionTime = 0; // + } + serialize(references) { + const ret = {}; + for (const id of this.deviceIDs) { + if (!(id in references)) { + global_1.Global.log(`VirtualGroup > cannot serialize command for accessory with id ${id}`, "warn"); + continue; + } + // get the reference value and a clone to modify + const oldAcc = references[id]; + const newAcc = oldAcc.clone(); + // get the light to modify + const light = newAcc.lightList[0]; + light.merge({ + onOff: this.onOff, + dimmer: this.dimmer, + colorX: this.colorX, + colorY: 27000, + transitionTime: this.transitionTime, + }); + // and serialize the payload + ret[id] = newAcc.serialize(oldAcc); + } + return ret; + } +} +exports.VirtualGroup = VirtualGroup; +//# sourceMappingURL=virtual-group.js.map \ No newline at end of file diff --git a/build/lib/virtual-group.js.map b/build/lib/virtual-group.js.map new file mode 100644 index 00000000..3eff4e25 --- /dev/null +++ b/build/lib/virtual-group.js.map @@ -0,0 +1 @@ +{"version":3,"file":"virtual-group.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/virtual-group.ts"],"names":[],"mappings":";;AACA,qCAAuC;AAGvC;IAEC,YAA4B,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAGvC,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QACjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QACrC,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAC1B,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAL7C,CAAC;IAYM,SAAS,CAAC,UAAqC;QACrD,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;gBACzB,eAAC,CAAC,GAAG,CAAC,iEAAiE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBACrF,QAAQ,CAAC;YACV,CAAC;YACD,gDAAgD;YAChD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,0BAA0B;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClC,KAAK,CAAC,KAAK,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,IAAI,CAAC,cAAc;aACnC,CAAC,CAAC;YACH,4BAA4B;YAC5B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC;IACZ,CAAC;CACD;AAvCD,oCAuCC"} \ No newline at end of file diff --git a/build/main.js b/build/main.js index c32cfa5c..29c0c624 100644 --- a/build/main.js +++ b/build/main.js @@ -20,10 +20,12 @@ const global_1 = require("./lib/global"); const object_polyfill_1 = require("./lib/object-polyfill"); const promises_1 = require("./lib/promises"); const str2regex_1 = require("./lib/str2regex"); +const strings_1 = require("./lib/strings"); // Datentypen laden const accessory_1 = require("./ipso/accessory"); const group_1 = require("./ipso/group"); const scene_1 = require("./ipso/scene"); +const virtual_group_1 = require("./lib/virtual-group"); // Adapter-Utils laden const utils_1 = require("./lib/utils"); const customStateSubscriptions = { @@ -39,6 +41,7 @@ const observers = []; // dictionary of known devices const devices = {}; const groups = {}; +const virtualGroups = {}; // dictionary of ioBroker objects const objects = {}; // the base of all requests @@ -101,6 +104,7 @@ let adapter = utils_1.default.adapter({ yield adapter.$setState("info.connection", true, true); connectionAlive = true; pingTimer = setInterval(pingThread, 10000); + loadVirtualGroups(); // TODO: load known devices from ioBroker into & observeDevices(); observeGroups(); @@ -241,9 +245,9 @@ let adapter = utils_1.default.adapter({ // make sure we have whole numbers if (stateObj.common.type === "number") { val = Math.round(val); // TODO: check if there are situations where decimal numbers are allowed - if (global_1.Global.isdef(stateObj.common.min)) + if (stateObj.common.min != null) val = Math.max(stateObj.common.min, val); - if (global_1.Global.isdef(stateObj.common.max)) + if (stateObj.common.max != null) val = Math.min(stateObj.common.max, val); } // this will contain the serialized payload @@ -275,6 +279,29 @@ let adapter = utils_1.default.adapter({ serializedObj = newGroup.serialize(group); // serialize with the old object as a reference url = `${requestBase}${endpoints_1.default.groups}/${rootObj.native.instanceId}`; break; + case "virtual group": + // find the virtual group instance + const vGroup = virtualGroups[rootObj.native.instanceId]; + if (id.endsWith(".state")) { + vGroup.onOff = val; + } + else if (id.endsWith(".brightness")) { + vGroup.dimmer = val; + vGroup.transitionTime = yield getTransitionDuration(vGroup); + } + else if (id.endsWith(".color")) { + vGroup.colorX = val; + vGroup.transitionTime = yield getTransitionDuration(vGroup); + } + else if (id.endsWith(".transitionDuration")) { + // TODO: check if we need to buffer this somehow + // for now just ack the change + yield adapter.$setState(id, state, true); + return; + } + serializedObj = vGroup.serialize(devices); + url = `${requestBase}${endpoints_1.default.groups}`; + break; default: // read the instanceId and get a reference value const accessory = devices[rootObj.native.instanceId]; @@ -610,17 +637,19 @@ function calcObjId(accessory) { * excluding the adapter namespace */ function calcObjName(accessory) { - const prefix = (() => { - switch (accessory.type) { - case accessory_1.AccessoryTypes.remote: - return "RC"; - case accessory_1.AccessoryTypes.lightbulb: - return "L"; - default: - global_1.Global.log("unknown accessory type " + accessory.type); - return "XYZ"; - } - })(); + let prefix; + switch (accessory.type) { + case accessory_1.AccessoryTypes.remote: + prefix = "RC"; + break; + case accessory_1.AccessoryTypes.lightbulb: + prefix = "L"; + break; + default: + global_1.Global.log("unknown accessory type " + accessory.type); + prefix = "XYZ"; + break; + } return `${prefix}-${accessory.instanceId}`; } /** @@ -634,7 +663,15 @@ function calcGroupId(group) { * excluding the adapter namespace */ function calcGroupName(group) { - return `G-${group.instanceId}`; + let prefix; + if (group instanceof group_1.Group) { + prefix = "G"; + } + else if (group instanceof virtual_group_1.VirtualGroup) { + prefix = "VG"; + } + const postfix = group.instanceId.toString(); + return `${prefix}-${strings_1.padStart(postfix, 5, "0")}`; } /** * Determines the object ID under which the given scene should be stored @@ -661,7 +698,7 @@ function getTransitionDuration(accessoryOrGroup) { stateId = calcObjId(accessoryOrGroup) + ".lightbulb.transitionDuration"; } } - else if (accessoryOrGroup instanceof group_1.Group) { + else if (accessoryOrGroup instanceof group_1.Group || accessoryOrGroup instanceof virtual_group_1.VirtualGroup) { stateId = calcGroupId(accessoryOrGroup) + ".transitionDuration"; } const ret = yield adapter.$getState(stateId); @@ -694,7 +731,7 @@ function accessoryToNative(accessory) { /* creates or edits an existing -object for an accessory */ function extendDevice(accessory) { const objId = calcObjId(accessory); - if (global_1.Global.isdef(objects[objId])) { + if (objId in objects) { // check if we need to edit the existing object const devObj = objects[objId]; let changed = false; @@ -852,15 +889,14 @@ function extendDevice(accessory) { } const createObjects = Object.keys(stateObjs) .map((key) => { - const stateId = `${objId}.${key}`; const obj = stateObjs[key]; let initialValue = null; - if (global_1.Global.isdef(obj.native.path)) { + if (obj.native.path != null) { // Object could have a default value, find it initialValue = object_polyfill_1.dig(accessory, obj.native.path); } // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(stateId, obj, initialValue); + return adapter.$createOwnStateEx(obj._id, obj, initialValue); }); Promise.all(createObjects); } @@ -869,9 +905,16 @@ function extendDevice(accessory) { * Returns the common part of the ioBroker object representing the given group */ function groupToCommon(group) { - return { - name: group.name, - }; + if (group instanceof group_1.Group) { + return { + name: group.name, + }; + } + else { + return { + name: `virtual group ${group.instanceId}`, + }; + } } /** * Returns the native part of the ioBroker object representing the given group @@ -880,13 +923,13 @@ function groupToNative(group) { return { instanceId: group.instanceId, deviceIDs: group.deviceIDs, - type: "group", + type: (group instanceof virtual_group_1.VirtualGroup ? "virtual " : "") + "group", }; } /* creates or edits an existing -object for a group */ function extendGroup(group) { const objId = calcGroupId(group); - if (global_1.Global.isdef(objects[objId])) { + if (objId in objects) { // check if we need to edit the existing object const grpObj = objects[objId]; let changed = false; @@ -999,15 +1042,14 @@ function extendGroup(group) { }; const createObjects = Object.keys(stateObjs) .map((key) => { - const stateId = `${objId}.${key}`; const obj = stateObjs[key]; let initialValue = null; - if (global_1.Global.isdef(obj.native.path)) { + if (obj.native.path != null) { // Object could have a default value, find it initialValue = object_polyfill_1.dig(group, obj.native.path); } // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(stateId, obj, initialValue); + return adapter.$createOwnStateEx(obj._id, obj, initialValue); }); Promise.all(createObjects); } @@ -1023,7 +1065,7 @@ function updatePossibleScenes(groupInfo) { // scenes are stored under .activeScene const scenesId = `${objId}.activeScene`; // only extend that object if it exists already - if (global_1.Global.isdef(objects[scenesId])) { + if (scenesId in objects) { global_1.Global.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); const activeSceneObj = objects[scenesId]; const scenes = groupInfo.scenes; @@ -1035,6 +1077,125 @@ function updatePossibleScenes(groupInfo) { } }); } +/* creates or edits an existing -object for a virtual group */ +function extendVirtualGroup(group) { + const objId = calcGroupId(group); + if (objId in objects) { + // check if we need to edit the existing object + const grpObj = objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) + adapter.extendObject(objId, grpObj); + // TODO: Update group states where applicable. See extendGroup for the code + } + else { + // create new object + const devObj = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + adapter.setObject(objId, devObj); + // also create state objects, depending on the accessory type + const stateObjs = { + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, + write: true, + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, + def: 0, + role: "light.dimmer", + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, + write: true, + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorX", + }, + }, + }; + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = object_polyfill_1.dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return adapter.$createOwnStateEx(obj._id, obj, initialValue); + }); + Promise.all(createObjects); + } +} /** * Renames a device * @param accessory The device to be renamed @@ -1164,6 +1325,28 @@ function parsePayload(response) { return response.payload; } } +/** + * Loads defined virtual groups from the ioBroker objects DB + */ +function loadVirtualGroups() { + return __awaiter(this, void 0, void 0, function* () { + // find all defined virtual groups + let groupObjects = object_polyfill_1.values(yield global_1.Global.$$("VG-*", "channel")); + groupObjects = groupObjects.filter(g => { + return g.native && + g.native.instanceId != null && + g.native.type === "virtual group"; + }); + // load them into the virtualGroups dict + Object.assign(virtualGroups, object_polyfill_1.composeObject(groupObjects.map(g => { + const id = g.native.instanceId; + const instanceIDs = g.native.instanceIDs; + const ret = new virtual_group_1.VirtualGroup(id); + ret.deviceIDs = instanceIDs; + return [`${id}`, ret]; + }))); + }); +} // Connection check let pingTimer; let connectionAlive = false; diff --git a/build/main.js.map b/build/main.js.map index d75dfb23..7a6dc545 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file From ca761a4d7fce9d2252ccbe6e1a6154858f913a3a Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Mon, 9 Oct 2017 08:51:14 +0200 Subject: [PATCH 08/51] reworked padStart and added tests --- build/lib/strings.d.ts | 6 ++++++ build/lib/strings.js | 21 ++++++++++++++------- build/lib/strings.js.map | 2 +- src/lib/strings.test.ts | 28 ++++++++++++++++++++++++++++ src/lib/strings.ts | 20 ++++++++++++++------ 5 files changed, 63 insertions(+), 14 deletions(-) create mode 100644 src/lib/strings.test.ts diff --git a/build/lib/strings.d.ts b/build/lib/strings.d.ts index 6aeb1bc0..2e1d6030 100644 --- a/build/lib/strings.d.ts +++ b/build/lib/strings.d.ts @@ -1 +1,7 @@ +/** + * Pads a string to the given length by repeatedly prepending the filler at the beginning of the string. + * @param str The string to pad + * @param targetLen The target length + * @param fill The filler string to prepend. Depending on the lenght requirements, this might get truncated. + */ export declare function padStart(str: string, targetLen: number, fill?: string): string; diff --git a/build/lib/strings.js b/build/lib/strings.js index 4e8364ed..55ccf10b 100644 --- a/build/lib/strings.js +++ b/build/lib/strings.js @@ -1,15 +1,22 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); +/** + * Pads a string to the given length by repeatedly prepending the filler at the beginning of the string. + * @param str The string to pad + * @param targetLen The target length + * @param fill The filler string to prepend. Depending on the lenght requirements, this might get truncated. + */ function padStart(str, targetLen, fill = " ") { + // simply return strings that are long enough to not be padded if (str != null && str.length >= targetLen) return str; - if (fill == null && fill.length !== 1) - throw new Error("fill must be a single char"); - let ret = str; - while (ret.length < targetLen) { - ret = fill + ret; - } - return ret; + // make sure that isn't empty + if (fill == null || fill.length < 1) + throw new Error("fill must be at least one char"); + // figure out how often we need to repeat + const missingLength = targetLen - str.length; + const repeats = Math.ceil(missingLength / fill.length); + return fill.repeat(repeats).substr(0, missingLength) + str; } exports.padStart = padStart; //# sourceMappingURL=strings.js.map \ No newline at end of file diff --git a/build/lib/strings.js.map b/build/lib/strings.js.map index 6a15d983..f2ebbeed 100644 --- a/build/lib/strings.js.map +++ b/build/lib/strings.js.map @@ -1 +1 @@ -{"version":3,"file":"strings.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/strings.ts"],"names":[],"mappings":";;AAAA,kBAAyB,GAAW,EAAE,SAAiB,EAAE,OAAe,GAAG;IAC1E,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC;IACvD,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;IACrF,IAAI,GAAG,GAAW,GAAG,CAAC;IACtB,OAAO,GAAG,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;QAC/B,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;IAClB,CAAC;IACD,MAAM,CAAC,GAAG,CAAC;AACZ,CAAC;AARD,4BAQC"} \ No newline at end of file +{"version":3,"file":"strings.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["lib/strings.ts"],"names":[],"mappings":";;AAAA;;;;;GAKG;AACH,kBAAyB,GAAW,EAAE,SAAiB,EAAE,OAAe,GAAG;IAC1E,8DAA8D;IAC9D,EAAE,CAAC,CAAC,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QAAC,MAAM,CAAC,GAAG,CAAC;IACvD,oCAAoC;IACpC,EAAE,CAAC,CAAC,IAAI,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IAEvF,gDAAgD;IAChD,MAAM,aAAa,GAAG,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACvD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,aAAa,CAAC,GAAG,GAAG,CAAC;AAC5D,CAAC;AAVD,4BAUC"} \ No newline at end of file diff --git a/src/lib/strings.test.ts b/src/lib/strings.test.ts new file mode 100644 index 00000000..728ca217 --- /dev/null +++ b/src/lib/strings.test.ts @@ -0,0 +1,28 @@ +import { assert, expect } from "chai"; +import { padStart } from "./strings"; +// tslint:disable:no-unused-expression + +describe("lib/strings => padStart() => ", () => { + + it("should return a string padded to the given target length", () => { + const targetLength = 6; + const filler = " "; + const result = padStart("1234", targetLength, filler); + expect(result).to.have.length(targetLength); + assert(result.startsWith(filler)); + }); + it("should default to a space as filler", () => { + expect(padStart("1234", 6, " ")).to.equal(padStart("1234", 6)); + }); + it("should not alter string longer than the target length", () => { + expect(padStart("12345678", 6, " ")).to.equal("12345678"); + }); + it("should throw on empty fillers", () => { + expect(() => padStart("1234", 6, "")).to.throw(); + expect(() => padStart("1234", 6, null)).to.throw(); + }); + it("should truncate fillers whose length is not a multiple of the missing length", () => { + expect(padStart("12345", 8, "ab")).to.equal("aba12345"); + }); + +}); diff --git a/src/lib/strings.ts b/src/lib/strings.ts index 285fec00..7b390c4a 100644 --- a/src/lib/strings.ts +++ b/src/lib/strings.ts @@ -1,9 +1,17 @@ +/** + * Pads a string to the given length by repeatedly prepending the filler at the beginning of the string. + * @param str The string to pad + * @param targetLen The target length + * @param fill The filler string to prepend. Depending on the lenght requirements, this might get truncated. + */ export function padStart(str: string, targetLen: number, fill: string = " "): string { + // simply return strings that are long enough to not be padded if (str != null && str.length >= targetLen) return str; - if (fill == null && fill.length !== 1) throw new Error("fill must be a single char"); - let ret: string = str; - while (ret.length < targetLen) { - ret = fill + ret; - } - return ret; + // make sure that isn't empty + if (fill == null || fill.length < 1) throw new Error("fill must be at least one char"); + + // figure out how often we need to repeat + const missingLength = targetLen - str.length; + const repeats = Math.ceil(missingLength / fill.length); + return fill.repeat(repeats).substr(0, missingLength) + str; } From 15e76522388e9876f7b76396f7b6c7a55e01b54e Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Mon, 9 Oct 2017 10:47:42 +0200 Subject: [PATCH 09/51] refactored device/group operation code, added virtual states to real groups --- build/ipso/group.d.ts | 1 + build/ipso/group.js.map | 2 +- build/ipso/light.d.ts | 1 + build/ipso/light.js.map | 2 +- build/lib/virtual-group.d.ts | 8 +- build/lib/virtual-group.js | 31 +--- build/lib/virtual-group.js.map | 2 +- build/main.js | 259 ++++++++++++++++++++++--------- build/main.js.map | 2 +- src/flow/renamegroup.txt | 3 - src/ipso/group.ts | 2 + src/ipso/light.ts | 2 + src/lib/virtual-group.ts | 33 +--- src/main.ts | 269 ++++++++++++++++++++++++--------- 14 files changed, 410 insertions(+), 207 deletions(-) delete mode 100644 src/flow/renamegroup.txt diff --git a/build/ipso/group.d.ts b/build/ipso/group.d.ts index cfbe358e..141322fa 100644 --- a/build/ipso/group.d.ts +++ b/build/ipso/group.d.ts @@ -6,3 +6,4 @@ export declare class Group extends IPSODevice { deviceIDs: number[]; transitionTime: number; } +export declare type GroupOperation = Partial>; diff --git a/build/ipso/group.js.map b/build/ipso/group.js.map index 01745ce8..99b23f38 100644 --- a/build/ipso/group.js.map +++ b/build/ipso/group.js.map @@ -1 +1 @@ -{"version":3,"file":"group.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["ipso/group.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAgE;AAChE,6CAA0C;AAC1C,6CAAgH;AAEhH,WAAmB,SAAQ,uBAAU;IAArC;;QAGQ,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QAGjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QAU5C,qDAAqD;QACrD,uCAAuC;QAIhC,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAE9C,CAAC;CAAA;AApBA;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACc;AAG9B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;sCACkB;AAKlC;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,4BAAe,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/C,0BAAa,CAAC,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;;wCAChB;AAO3B;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,0BAAa,CAAC,yBAAW,CAAC,cAAc,CAAC;IACzC,4BAAe,CAAC,2BAAa,CAAC,cAAc,CAAC;;6CACZ;AArBnC,sBAuBC;AAED,wBAAwB;AACxB,4BAA4B,IAAI;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC;AAClB,CAAC;AACD,yBAAyB,GAAa;IACrC,MAAM,CAAC;QACN,KAAK,EAAE;YACN,IAAI,EAAE,GAAG;SACT;KACD,CAAC;AACH,CAAC"} \ No newline at end of file +{"version":3,"file":"group.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["ipso/group.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAgE;AAChE,6CAA0C;AAC1C,6CAAgH;AAEhH,WAAmB,SAAQ,uBAAU;IAArC;;QAGQ,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QAGjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QAU5C,qDAAqD;QACrD,uCAAuC;QAIhC,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAE9C,CAAC;CAAA;AApBA;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACc;AAG9B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;sCACkB;AAKlC;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,4BAAe,CAAC,GAAG,IAAI,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC/C,0BAAa,CAAC,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;;wCAChB;AAO3B;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,0BAAa,CAAC,yBAAW,CAAC,cAAc,CAAC;IACzC,4BAAe,CAAC,2BAAa,CAAC,cAAc,CAAC;;6CACZ;AArBnC,sBAuBC;AAID,wBAAwB;AACxB,4BAA4B,IAAI;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;IACjC,MAAM,CAAC,SAAS,CAAC;AAClB,CAAC;AACD,yBAAyB,GAAa;IACrC,MAAM,CAAC;QACN,KAAK,EAAE;YACN,IAAI,EAAE,GAAG;SACT;KACD,CAAC;AACH,CAAC"} \ No newline at end of file diff --git a/build/ipso/light.d.ts b/build/ipso/light.d.ts index 05a4c892..f99285bd 100644 --- a/build/ipso/light.d.ts +++ b/build/ipso/light.d.ts @@ -14,3 +14,4 @@ export declare class Light extends IPSODevice { powerFactor: number; unit: string; } +export declare type LightOperation = Partial>; diff --git a/build/ipso/light.js.map b/build/ipso/light.js.map index 3bcfa37c..01712e77 100644 --- a/build/ipso/light.js.map +++ b/build/ipso/light.js.map @@ -1 +1 @@ -{"version":3,"file":"light.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["ipso/light.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAgE;AAChE,6CAA0C;AAC1C,6CAAgH;AAEhH,WAAmB,SAAQ,uBAAU;IAArC;;QAGQ,UAAK,GAAW,QAAQ,CAAC,CAAC,aAAa;QAGvC,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAE5B,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAK5B,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAG1B,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAG1B,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAM5B,mBAAc,GAAW,GAAG,CAAC,CAAC,UAAU;QAGxC,0BAAqB,GAAW,GAAG,CAAC,CAAC,UAAU;QAG/C,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QAGrC,UAAK,GAAY,KAAK,CAAC;QAGvB,WAAM,GAAW,CAAC,CAAC,CAAC,QAAQ;QAG5B,gBAAW,GAAW,GAAG,CAAC,CAAC,UAAU;QAGrC,SAAI,GAAW,EAAE,CAAC;IAE1B,CAAC;CAAA;AA1CA;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACgB;AAGhC;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAE5B;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAK5B;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,0BAAa,CAAC,yBAAW,CAAC,KAAK,CAAC;IAChC,4BAAe,CAAC,2BAAa,CAAC,KAAK,CAAC;;qCACX;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAM5B;IAJC,oBAAO,CAAC,MAAM,CAAC;IACf,qBAAQ;IACR,0BAAa,CAAC,yBAAW,CAAC,cAAc,CAAC;IACzC,4BAAe,CAAC,2BAAa,CAAC,cAAc,CAAC;;6CACV;AAGpC;IADC,oBAAO,CAAC,MAAM,CAAC;;oDAC2B;AAG3C;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACc;AAG9B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;0CACiB;AAGjC;IADC,oBAAO,CAAC,MAAM,CAAC;;mCACS;AA3C1B,sBA6CC"} \ No newline at end of file +{"version":3,"file":"light.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["ipso/light.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oDAAgE;AAChE,6CAA0C;AAC1C,6CAAgH;AAEhH,WAAmB,SAAQ,uBAAU;IAArC;;QAGQ,UAAK,GAAW,QAAQ,CAAC,CAAC,aAAa;QAGvC,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAE5B,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAK5B,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAG1B,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAG1B,aAAQ,GAAW,CAAC,CAAC,CAAC,MAAM;QAM5B,mBAAc,GAAW,GAAG,CAAC,CAAC,UAAU;QAGxC,0BAAqB,GAAW,GAAG,CAAC,CAAC,UAAU;QAG/C,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QAGrC,UAAK,GAAY,KAAK,CAAC;QAGvB,WAAM,GAAW,CAAC,CAAC,CAAC,QAAQ;QAG5B,gBAAW,GAAW,GAAG,CAAC,CAAC,UAAU;QAGrC,SAAI,GAAW,EAAE,CAAC;IAE1B,CAAC;CAAA;AA1CA;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACgB;AAGhC;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAE5B;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAK5B;IAHC,oBAAO,CAAC,MAAM,CAAC;IACf,0BAAa,CAAC,yBAAW,CAAC,KAAK,CAAC;IAChC,4BAAe,CAAC,2BAAa,CAAC,KAAK,CAAC;;qCACX;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;uCACY;AAM5B;IAJC,oBAAO,CAAC,MAAM,CAAC;IACf,qBAAQ;IACR,0BAAa,CAAC,yBAAW,CAAC,cAAc,CAAC;IACzC,4BAAe,CAAC,2BAAa,CAAC,cAAc,CAAC;;6CACV;AAGpC;IADC,oBAAO,CAAC,MAAM,CAAC;;oDAC2B;AAG3C;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;oCACc;AAG9B;IADC,oBAAO,CAAC,MAAM,CAAC;;qCACU;AAG1B;IADC,oBAAO,CAAC,MAAM,CAAC;;0CACiB;AAGjC;IADC,oBAAO,CAAC,MAAM,CAAC;;mCACS;AA3C1B,sBA6CC"} \ No newline at end of file diff --git a/build/lib/virtual-group.d.ts b/build/lib/virtual-group.d.ts index d86f8df8..5f615de4 100644 --- a/build/lib/virtual-group.d.ts +++ b/build/lib/virtual-group.d.ts @@ -1,5 +1,4 @@ -import { Accessory } from "../ipso/accessory"; -import { DictionaryLike } from "./object-polyfill"; +import { LightOperation } from "../ipso/light"; export declare class VirtualGroup { readonly instanceId: number; constructor(instanceId: number); @@ -11,5 +10,8 @@ export declare class VirtualGroup { * The instance ids of all devices combined in this group */ deviceIDs: number[]; - serialize(references: DictionaryLike): DictionaryLike; + /** + * Updates this virtual group's state with the changes contained in the given operation + */ + merge(operation: LightOperation): void; } diff --git a/build/lib/virtual-group.js b/build/lib/virtual-group.js index e1868527..8516d202 100644 --- a/build/lib/virtual-group.js +++ b/build/lib/virtual-group.js @@ -1,6 +1,6 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const global_1 = require("./global"); +const object_polyfill_1 = require("./object-polyfill"); class VirtualGroup { constructor(instanceId) { this.instanceId = instanceId; @@ -9,29 +9,14 @@ class VirtualGroup { this.colorX = 0; // int this.transitionTime = 0; // } - serialize(references) { - const ret = {}; - for (const id of this.deviceIDs) { - if (!(id in references)) { - global_1.Global.log(`VirtualGroup > cannot serialize command for accessory with id ${id}`, "warn"); - continue; - } - // get the reference value and a clone to modify - const oldAcc = references[id]; - const newAcc = oldAcc.clone(); - // get the light to modify - const light = newAcc.lightList[0]; - light.merge({ - onOff: this.onOff, - dimmer: this.dimmer, - colorX: this.colorX, - colorY: 27000, - transitionTime: this.transitionTime, - }); - // and serialize the payload - ret[id] = newAcc.serialize(oldAcc); + /** + * Updates this virtual group's state with the changes contained in the given operation + */ + merge(operation) { + for (const [prop, val] of object_polyfill_1.entries(operation)) { + if (this.hasOwnProperty(prop)) + this[prop] = val; } - return ret; } } exports.VirtualGroup = VirtualGroup; diff --git a/build/lib/virtual-group.js.map b/build/lib/virtual-group.js.map index 3eff4e25..b7943248 100644 --- a/build/lib/virtual-group.js.map +++ b/build/lib/virtual-group.js.map @@ -1 +1 @@ -{"version":3,"file":"virtual-group.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/virtual-group.ts"],"names":[],"mappings":";;AACA,qCAAuC;AAGvC;IAEC,YAA4B,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAGvC,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QACjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QACrC,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAC1B,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAL7C,CAAC;IAYM,SAAS,CAAC,UAAqC;QACrD,MAAM,GAAG,GAAG,EAAE,CAAC;QACf,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;YACjC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC;gBACzB,eAAC,CAAC,GAAG,CAAC,iEAAiE,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;gBACrF,QAAQ,CAAC;YACV,CAAC;YACD,gDAAgD;YAChD,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,CAAC,CAAC;YAC9B,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9B,0BAA0B;YAC1B,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAClC,KAAK,CAAC,KAAK,CAAC;gBACX,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,KAAK;gBACb,cAAc,EAAE,IAAI,CAAC,cAAc;aACnC,CAAC,CAAC;YACH,4BAA4B;YAC5B,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACpC,CAAC;QACD,MAAM,CAAC,GAAG,CAAC;IACZ,CAAC;CACD;AAvCD,oCAuCC"} \ No newline at end of file +{"version":3,"file":"virtual-group.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["lib/virtual-group.ts"],"names":[],"mappings":";;AACA,uDAA4C;AAE5C;IAEC,YAA4B,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAGvC,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QACjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QACrC,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAC1B,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAL7C,CAAC;IAYD;;OAEG;IACI,KAAK,CAAC,SAAyB;QACrC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,yBAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACjD,CAAC;IACF,CAAC;CACD;AAvBD,oCAuBC"} \ No newline at end of file diff --git a/build/main.js b/build/main.js index 29c0c624..79a7c4b5 100644 --- a/build/main.js +++ b/build/main.js @@ -229,6 +229,20 @@ let adapter = utils_1.default.adapter({ else { global_1.Global.log(`{{blue}} state with id ${id} deleted`, "debug"); } + // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen + try { + for (const sub of customStateSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) + sub.callback(id, state); + } + } + } + catch (e) { + global_1.Global.log("error handling custom sub: " + e); + } + // Eigene Handling-Logik zum Schluss, damit wir return benutzen können if (state && !state.ack && id.startsWith(adapter.namespace)) { // our own state was changed from within ioBroker, react to it const stateObj = objects[id]; @@ -250,121 +264,120 @@ let adapter = utils_1.default.adapter({ if (stateObj.common.max != null) val = Math.min(stateObj.common.max, val); } - // this will contain the serialized payload - let serializedObj; - // this will contain the url to be requested - let url; switch (rootObj.native.type) { - case "group": + case "group": { // read the instanceId and get a reference value const group = groups[rootObj.native.instanceId].group; - // create a copy to modify - const newGroup = group.clone(); + // if the change was acknowledged, update the state later + let wasAcked; if (id.endsWith(".state")) { - newGroup.onOff = val; + wasAcked = !(yield operateGroup(group, { + onOff: val, + })); } else if (id.endsWith(".brightness")) { - newGroup.merge({ + wasAcked = !(yield operateGroup(group, { dimmer: val, transitionTime: yield getTransitionDuration(group), - }); + })); } else if (id.endsWith(".activeScene")) { // turn on and activate a scene - newGroup.merge({ + wasAcked = !(yield operateGroup(group, { onOff: true, sceneId: val, + })); + } + else if (id.endsWith(".color")) { + // color change is only supported manually, so we operate + // the virtual state of this group + yield operateVirtualGroup(group, { + colorX: val, + colorY: 27000, + transitionTime: yield getTransitionDuration(group), }); + wasAcked = true; } - serializedObj = newGroup.serialize(group); // serialize with the old object as a reference - url = `${requestBase}${endpoints_1.default.groups}/${rootObj.native.instanceId}`; - break; - case "virtual group": + // ack the state if neccessary and return + if (wasAcked) + adapter.$setState(id, state, true); + return; + } + case "virtual group": { // find the virtual group instance const vGroup = virtualGroups[rootObj.native.instanceId]; + let operation; if (id.endsWith(".state")) { - vGroup.onOff = val; + operation = { + onOff: val, + }; } else if (id.endsWith(".brightness")) { - vGroup.dimmer = val; - vGroup.transitionTime = yield getTransitionDuration(vGroup); + operation = { + dimmer: val, + transitionTime: yield getTransitionDuration(vGroup), + }; } else if (id.endsWith(".color")) { - vGroup.colorX = val; - vGroup.transitionTime = yield getTransitionDuration(vGroup); + operation = { + colorX: val, + colorY: 27000, + transitionTime: yield getTransitionDuration(vGroup), + }; } else if (id.endsWith(".transitionDuration")) { - // TODO: check if we need to buffer this somehow - // for now just ack the change - yield adapter.$setState(id, state, true); - return; + // No operation here, since this is part of another one } - serializedObj = vGroup.serialize(devices); - url = `${requestBase}${endpoints_1.default.groups}`; - break; - default: - // read the instanceId and get a reference value - const accessory = devices[rootObj.native.instanceId]; - // create a copy to modify - const newAccessory = accessory.clone(); + // update all lightbulbs in this group + if (operation != null) { + operateVirtualGroup(vGroup, operation); + } + // and ack the state change + adapter.$setState(id, state, true); + return; + } + default: { if (id.indexOf(".lightbulb.") > -1) { - // get the Light instance to modify - const light = newAccessory.lightList[0]; + // read the instanceId and get a reference value + const accessory = devices[rootObj.native.instanceId]; + // if the change was acknowledged, update the state later + let wasAcked; + // operate the lights depending on the set state + // if no request was sent, we can ack the state immediately if (id.endsWith(".state")) { - light.onOff = val; + wasAcked = !(yield operateLight(accessory, { + onOff: val, + })); } else if (id.endsWith(".brightness")) { - light.merge({ + wasAcked = !(yield operateLight(accessory, { dimmer: val, transitionTime: yield getTransitionDuration(accessory), - }); + })); } else if (id.endsWith(".color")) { - light.merge({ + wasAcked = !(yield operateLight(accessory, { colorX: val, colorY: 27000, transitionTime: yield getTransitionDuration(accessory), - }); + })); } else if (id.endsWith(".transitionDuration")) { - // TODO: check if we need to buffer this somehow - // for now just ack the change - yield adapter.$setState(id, state, true); - return; + // this is part of another operation, just ack the state + wasAcked = true; } + // ack the state if neccessary and return + if (wasAcked) + adapter.$setState(id, state, true); + return; } - serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference - url = `${requestBase}${endpoints_1.default.devices}/${rootObj.native.instanceId}`; - break; - } - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); - yield adapter.$setState(id, state.val, true); - return; + } } - let payload = JSON.stringify(serializedObj); - global_1.Global.log("stateChange > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - node_coap_client_1.CoapClient.request(url, "put", payload); } } else if (!state) { // TODO: find out what to do when states are deleted } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customStateSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) - sub.callback(id, state); - } - } - } - catch (e) { - global_1.Global.log("error handling custom sub: " + e); - } }), unload: (callback) => { // is called when adapter shuts down - callback has to be called under any circumstances! @@ -385,6 +398,85 @@ let adapter = utils_1.default.adapter({ } }, }); +/** + * Sets some properties on a lightbulb + * @param accessory The parent accessory of the lightbulb + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateLight(accessory, operation) { + return __awaiter(this, void 0, void 0, function* () { + if (accessory.type !== accessory_1.AccessoryTypes.lightbulb) { + throw new Error("The parameter accessory must be a lightbulb!"); + } + // the url to be requested + const url = `${requestBase}${endpoints_1.default.devices}/${accessory.instanceId}`; + // create a copy to modify + const newAccessory = accessory.clone(); + // get the Light instance to modify + const light = newAccessory.lightList[0]; + light.merge(operation); + const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + let payload = JSON.stringify(serializedObj); + global_1.Global.log("stateChange > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(url, "put", payload); + return true; + }); +} +/** + * Sets some properties on a group + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateGroup(group, operation) { + return __awaiter(this, void 0, void 0, function* () { + // the url to be requested + const url = `${requestBase}${endpoints_1.default.groups}/${group.instanceId}`; + // create a copy to modify + const newGroup = group.clone(); + newGroup.merge(operation); + const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + let payload = JSON.stringify(serializedObj); + global_1.Global.log("stateChange > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(url, "put", payload); + return true; + }); +} +/** + * Sets some properties on virtual group or virtual properties on a real group. + * Can be used to manually update non-existing endpoints on real groups. + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateVirtualGroup(group, operation) { + return __awaiter(this, void 0, void 0, function* () { + // find all lightbulbs belonging to this group + const lightbulbAccessories = group.deviceIDs + .map(did => devices[did]) + .filter(dev => dev != null && dev.type === accessory_1.AccessoryTypes.lightbulb); + for (const acc of lightbulbAccessories) { + yield operateLight(acc, operation); + } + // and update the group + if (group instanceof virtual_group_1.VirtualGroup) { + group.merge(operation); + } + }); +} // ================================== // manage devices /** Normalizes the path to a resource, so it can be used for storing the observer */ @@ -525,7 +617,7 @@ function coap_getGroup_cb(instanceId, response) { // check response code switch (response.code.toString()) { case "2.05": break; // all good - case "4.04": + case "4.04":// not found // We know this group existed or we wouldn't have requested it // This means it has been deleted // TODO: Should we delete it here or where its being handled right now? @@ -592,7 +684,7 @@ function coap_getScene_cb(groupId, instanceId, response) { // check response code switch (response.code.toString()) { case "2.05": break; // all good - case "4.04": + case "4.04":// not found // We know this scene existed or we wouldn't have requested it // This means it has been deleted // TODO: Should we delete it here or where its being handled right now? @@ -1039,6 +1131,26 @@ function extendGroup(group) { path: "dimmer", }, }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, }; const createObjects = Object.keys(stateObjs) .map((key) => { @@ -1067,7 +1179,6 @@ function updatePossibleScenes(groupInfo) { // only extend that object if it exists already if (scenesId in objects) { global_1.Global.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); - const activeSceneObj = objects[scenesId]; const scenes = groupInfo.scenes; // map scene ids and names to the dropdown const states = object_polyfill_1.composeObject(Object.keys(scenes).map(id => [id, scenes[id].name])); @@ -1314,9 +1425,9 @@ function unsubscribeObjects(id) { function parsePayload(response) { switch (response.format) { case 0: // text/plain - case null: + case null:// assume text/plain return response.payload.toString("utf-8"); - case 50: + case 50:// application/json const json = response.payload.toString("utf-8"); return JSON.parse(json); default: diff --git a/build/main.js.map b/build/main.js.map index 7a6dc545..8aca36d1 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/flow/renamegroup.txt b/src/flow/renamegroup.txt deleted file mode 100644 index 286f8f67..00000000 --- a/src/flow/renamegroup.txt +++ /dev/null @@ -1,3 +0,0 @@ --> put 15004/132848 = /groups/ - {"9001":"STARTERSET2"} -<- changed (code 68) \ No newline at end of file diff --git a/src/ipso/group.ts b/src/ipso/group.ts index ad970f13..62b7d581 100644 --- a/src/ipso/group.ts +++ b/src/ipso/group.ts @@ -27,6 +27,8 @@ export class Group extends IPSODevice { } +export type GroupOperation = Partial>; + // TODO: Type annotation function parseAccessoryLink(link): number[] { const hsLink = link["15002"]; diff --git a/src/ipso/light.ts b/src/ipso/light.ts index ced5bbbe..30feb2f4 100644 --- a/src/ipso/light.ts +++ b/src/ipso/light.ts @@ -48,3 +48,5 @@ export class Light extends IPSODevice { public unit: string = ""; } + +export type LightOperation = Partial>; diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index 1f27dfb2..78a15f1d 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -1,6 +1,5 @@ -import { Accessory } from "../ipso/accessory"; -import { Global as _ } from "./global"; -import { DictionaryLike } from "./object-polyfill"; +import { LightOperation } from "../ipso/light"; +import { entries } from "./object-polyfill"; export class VirtualGroup { @@ -17,28 +16,12 @@ export class VirtualGroup { */ public deviceIDs: number[]; - public serialize(references: DictionaryLike): DictionaryLike { - const ret = {}; - for (const id of this.deviceIDs) { - if (!(id in references)) { - _.log(`VirtualGroup > cannot serialize command for accessory with id ${id}`, "warn"); - continue; - } - // get the reference value and a clone to modify - const oldAcc = references[id]; - const newAcc = oldAcc.clone(); - // get the light to modify - const light = newAcc.lightList[0]; - light.merge({ - onOff: this.onOff, - dimmer: this.dimmer, - colorX: this.colorX, - colorY: 27000, - transitionTime: this.transitionTime, - }); - // and serialize the payload - ret[id] = newAcc.serialize(oldAcc); + /** + * Updates this virtual group's state with the changes contained in the given operation + */ + public merge(operation: LightOperation): void { + for (const [prop, val] of entries(operation)) { + if (this.hasOwnProperty(prop)) this[prop] = val; } - return ret; } } diff --git a/src/main.ts b/src/main.ts index f9f846f2..c74bca4c 100644 --- a/src/main.ts +++ b/src/main.ts @@ -16,9 +16,8 @@ import { padStart } from "./lib/strings"; // Datentypen laden import { Accessory, AccessoryTypes } from "./ipso/accessory"; -import { Group } from "./ipso/group"; -import { IPSOObject } from "./ipso/ipsoObject"; -import { Light } from "./ipso/light"; +import { Group, GroupOperation } from "./ipso/group"; +import { LightOperation } from "./ipso/light"; import { Scene } from "./ipso/scene"; import { VirtualGroup } from "./lib/virtual-group"; @@ -261,6 +260,19 @@ let adapter: ExtendedAdapter = utils.adapter({ _.log(`{{blue}} state with id ${id} deleted`, "debug"); } + // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen + try { + for (const sub of customStateSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) sub.callback(id, state); + } + } + } catch (e) { + _.log("error handling custom sub: " + e); + } + + // Eigene Handling-Logik zum Schluss, damit wir return benutzen können if (state && !state.ack && id.startsWith(adapter.namespace)) { // our own state was changed from within ioBroker, react to it @@ -283,125 +295,120 @@ let adapter: ExtendedAdapter = utils.adapter({ if (stateObj.common.max != null) val = Math.min(stateObj.common.max, val); } - // this will contain the serialized payload - let serializedObj: DictionaryLike; - // this will contain the url to be requested - let url: string; - switch (rootObj.native.type) { - case "group": + case "group": { // read the instanceId and get a reference value const group = groups[rootObj.native.instanceId].group; - // create a copy to modify - const newGroup = group.clone(); + // if the change was acknowledged, update the state later + let wasAcked: boolean; if (id.endsWith(".state")) { - newGroup.onOff = val; + wasAcked = !await operateGroup(group, { + onOff: val, + }); } else if (id.endsWith(".brightness")) { - newGroup.merge({ + wasAcked = !await operateGroup(group, { dimmer: val, transitionTime: await getTransitionDuration(group), }); } else if (id.endsWith(".activeScene")) { // turn on and activate a scene - newGroup.merge({ + wasAcked = !await operateGroup(group, { onOff: true, sceneId: val, }); + } else if (id.endsWith(".color")) { + // color change is only supported manually, so we operate + // the virtual state of this group + await operateVirtualGroup(group, { + colorX: val, + colorY: 27000, + transitionTime: await getTransitionDuration(group), + }); + wasAcked = true; } - serializedObj = newGroup.serialize(group); // serialize with the old object as a reference - url = `${requestBase}${coapEndpoints.groups}/${rootObj.native.instanceId}`; - break; + // ack the state if neccessary and return + if (wasAcked) adapter.$setState(id, state, true); + return; + } - case "virtual group": + case "virtual group": { // find the virtual group instance const vGroup = virtualGroups[rootObj.native.instanceId]; + let operation: LightOperation; + if (id.endsWith(".state")) { - vGroup.onOff = val; + operation = { + onOff: val, + }; } else if (id.endsWith(".brightness")) { - vGroup.dimmer = val; - vGroup.transitionTime = await getTransitionDuration(vGroup); + operation = { + dimmer: val, + transitionTime: await getTransitionDuration(vGroup), + }; } else if (id.endsWith(".color")) { - vGroup.colorX = val; - vGroup.transitionTime = await getTransitionDuration(vGroup); + operation = { + colorX: val, + colorY: 27000, + transitionTime: await getTransitionDuration(vGroup), + }; } else if (id.endsWith(".transitionDuration")) { - // TODO: check if we need to buffer this somehow - // for now just ack the change - await adapter.$setState(id, state, true); - return; + // No operation here, since this is part of another one } - serializedObj = vGroup.serialize(devices); - url = `${requestBase}${coapEndpoints.groups}`; - break; + // update all lightbulbs in this group + if (operation != null) { + operateVirtualGroup(vGroup, operation); + } + + // and ack the state change + adapter.$setState(id, state, true); + return; + } + + default: { // accessory - default: // accessory - // read the instanceId and get a reference value - const accessory = devices[rootObj.native.instanceId]; - // create a copy to modify - const newAccessory = accessory.clone(); if (id.indexOf(".lightbulb.") > -1) { - // get the Light instance to modify - const light = newAccessory.lightList[0]; + // read the instanceId and get a reference value + const accessory = devices[rootObj.native.instanceId]; + // if the change was acknowledged, update the state later + let wasAcked: boolean; + // operate the lights depending on the set state + // if no request was sent, we can ack the state immediately if (id.endsWith(".state")) { - light.onOff = val; + wasAcked = !await operateLight(accessory, { + onOff: val, + }); } else if (id.endsWith(".brightness")) { - light.merge({ + wasAcked = !await operateLight(accessory, { dimmer: val, transitionTime: await getTransitionDuration(accessory), }); } else if (id.endsWith(".color")) { - light.merge({ + wasAcked = !await operateLight(accessory, { colorX: val, colorY: 27000, transitionTime: await getTransitionDuration(accessory), }); } else if (id.endsWith(".transitionDuration")) { - // TODO: check if we need to buffer this somehow - // for now just ack the change - await adapter.$setState(id, state, true); - return; + // this is part of another operation, just ack the state + wasAcked = true; } - } - - serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference - url = `${requestBase}${coapEndpoints.devices}/${rootObj.native.instanceId}`; - break; - } - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - _.log("stateChange > empty object, not sending any payload", "debug"); - await adapter.$setState(id, state.val, true); - return; + // ack the state if neccessary and return + if (wasAcked) adapter.$setState(id, state, true); + return; + } + } } - - let payload: string | Buffer = JSON.stringify(serializedObj); - _.log("stateChange > sending payload: " + payload, "debug"); - - payload = Buffer.from(payload); - coap.request(url, "put", payload); - } } else if (!state) { // TODO: find out what to do when states are deleted } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customStateSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) sub.callback(id, state); - } - } - } catch (e) { - _.log("error handling custom sub: " + e); - } - }, unload: (callback) => { @@ -423,6 +430,99 @@ let adapter: ExtendedAdapter = utils.adapter({ }, }) as ExtendedAdapter; +/** + * Sets some properties on a lightbulb + * @param accessory The parent accessory of the lightbulb + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +async function operateLight(accessory: Accessory, operation: LightOperation): Promise { + if (accessory.type !== AccessoryTypes.lightbulb) { + throw new Error("The parameter accessory must be a lightbulb!"); + } + + // the url to be requested + const url: string = `${requestBase}${coapEndpoints.devices}/${accessory.instanceId}`; + + // create a copy to modify + const newAccessory = accessory.clone(); + // get the Light instance to modify + const light = newAccessory.lightList[0]; + light.merge(operation); + + const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference + + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("stateChange > sending payload: " + payload, "debug"); + + payload = Buffer.from(payload); + await coap.request(url, "put", payload); + + return true; +} + +/** + * Sets some properties on a group + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +async function operateGroup(group: Group, operation: GroupOperation): Promise { + + // the url to be requested + const url: string = `${requestBase}${coapEndpoints.groups}/${group.instanceId}`; + + // create a copy to modify + const newGroup = group.clone(); + newGroup.merge(operation); + + const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference + + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("stateChange > sending payload: " + payload, "debug"); + + payload = Buffer.from(payload); + await coap.request(url, "put", payload); + + return true; +} + +/** + * Sets some properties on virtual group or virtual properties on a real group. + * Can be used to manually update non-existing endpoints on real groups. + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +async function operateVirtualGroup(group: Group | VirtualGroup, operation: LightOperation): Promise { + + // find all lightbulbs belonging to this group + const lightbulbAccessories = group.deviceIDs + .map(did => devices[did]) + .filter(dev => dev != null && dev.type === AccessoryTypes.lightbulb) + ; + + for (const acc of lightbulbAccessories) { + await operateLight(acc, operation); + } + // and update the group + if (group instanceof VirtualGroup) { + group.merge(operation); + } +} + // ================================== // manage devices @@ -1142,6 +1242,26 @@ function extendGroup(group: Group) { path: "dimmer", }, }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, // TODO: check + write: true, // TODO: check + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, }; const createObjects = Object.keys(stateObjs) @@ -1174,7 +1294,6 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { if (scenesId in objects) { _.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); - const activeSceneObj = objects[scenesId]; const scenes = groupInfo.scenes; // map scene ids and names to the dropdown const states = composeObject( From a524f74bb25cdbdb2a2b616457d05f068ac466ab Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Mon, 9 Oct 2017 11:04:36 +0200 Subject: [PATCH 10/51] cleaned up some unused variables --- build/deploy_local.js | 3 +++ build/deploy_local.js.map | 2 +- build/ipso/ipsoObject.js | 8 ++++---- build/ipso/ipsoObject.js.map | 2 +- build/lib/promises.js | 4 ++-- build/lib/promises.js.map | 2 +- src/deploy_local.ts | 1 - src/ipso/ipsoObject.ts | 10 +++++----- src/lib/conversions.ts | 1 - src/lib/object-polyfill.test.ts | 4 ++-- src/lib/promises.ts | 4 ++-- tsconfig.json | 10 +++------- 12 files changed, 24 insertions(+), 27 deletions(-) diff --git a/build/deploy_local.js b/build/deploy_local.js index d3f2a7e6..dc23c68c 100644 --- a/build/deploy_local.js +++ b/build/deploy_local.js @@ -28,6 +28,9 @@ Object.defineProperty(exports, "__esModule", { value: true }); const uploadDirs = ["admin", "build"]; const uploadFiles = ["package.json", "io-package.json", "main.js"]; const rootDir = "../"; +// ========================= +// CAN'T TOUCH THIS +// ========================= const nodeSSH = require("node-ssh"); const path = require("path"); const localRoot = path.resolve(__dirname, rootDir); diff --git a/build/deploy_local.js.map b/build/deploy_local.js.map index 4f9254b6..04cc50ce 100644 --- a/build/deploy_local.js.map +++ b/build/deploy_local.js.map @@ -1 +1 @@ -{"version":3,"file":"deploy_local.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["deploy_local.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"deploy_local.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["deploy_local.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/ipso/ipsoObject.js b/build/ipso/ipsoObject.js index f9b02e6c..252b0e00 100644 --- a/build/ipso/ipsoObject.js +++ b/build/ipso/ipsoObject.js @@ -70,7 +70,7 @@ class IPSOObject { /** serializes this object in order to transfer it via COAP */ serialize(reference = null) { const ret = {}; - const serializeValue = (key, propName, value, refValue, transform) => { + const serializeValue = (propName, value, refValue, transform) => { const _required = isRequired(this, propName); let _ret = value; if (value instanceof IPSOObject) { @@ -116,11 +116,11 @@ class IPSOObject { throw new Error("cannot serialize arrays when the reference values don't match"); } // serialize each item with the matching reference value - value = value.map((v, i) => serializeValue(key, propName, v, refValue[i], serializer)); + value = value.map((v, i) => serializeValue(propName, v, refValue[i], serializer)); } else { // no reference value, makes things easier - value = value.map(v => serializeValue(key, propName, v, null, serializer)); + value = value.map(v => serializeValue(propName, v, null, serializer)); } // now remove null items value = value.filter(v => v != null); @@ -129,7 +129,7 @@ class IPSOObject { } else { // directly serialize the value - value = serializeValue(key, propName, value, refValue, serializer); + value = serializeValue(propName, value, refValue, serializer); } // only output the value if it's != null if (value != null) diff --git a/build/ipso/ipsoObject.js.map b/build/ipso/ipsoObject.js.map index 7bb2da39..87e617cd 100644 --- a/build/ipso/ipsoObject.js.map +++ b/build/ipso/ipsoObject.js.map @@ -1 +1 @@ -{"version":3,"file":"ipsoObject.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["ipso/ipsoObject.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"ipsoObject.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["ipso/ipsoObject.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/build/lib/promises.js b/build/lib/promises.js index cf25a71c..5603f030 100644 --- a/build/lib/promises.js +++ b/build/lib/promises.js @@ -22,7 +22,7 @@ exports.promisify = promisify; function promisifyNoError(fn, context) { return function (...args) { context = context || this; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { fn.apply(context, [...args, (result) => { return resolve(result); }]); @@ -38,7 +38,7 @@ function waterfall(...fn) { exports.waterfall = waterfall; /** Creates a promise that waits for the specified time and then resolves */ function wait(ms) { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { setTimeout(resolve, ms); }); } diff --git a/build/lib/promises.js.map b/build/lib/promises.js.map index 281f6784..0ee0d72f 100644 --- a/build/lib/promises.js.map +++ b/build/lib/promises.js.map @@ -1 +1 @@ -{"version":3,"file":"promises.js","sourceRoot":"C:/Users/Dominic/Documents/Visual Studio 2017/Repositories/ioBroker.tradfri/src/","sources":["lib/promises.ts"],"names":[],"mappings":";AAAA,GAAG;AACH,6EAA6E;AAC7E,GAAG;;AAKH,mBAA0B,EAAE,EAAE,OAAa;IAC1C,MAAM,CAAC,UAAS,GAAG,IAAI;QACtB,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;YAClC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM;oBACzC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;wBACX,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;oBAAC,IAAI,CAAC,CAAC;wBACP,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;gBACF,CAAC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAbD,8BAaC;AAGD,0BAAiC,EAAE,EAAE,OAAa;IACjD,MAAM,CAAC,UAAS,GAAG,IAAI;QACtB,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;YAClC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM;oBAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AATD,4CASC;AAED,mBAA0B,GAAG,EAAqB;IACjD,gDAAgD;IAChD,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CACf,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAC7B,OAAO,CAAC,OAAO,EAAE,CACjB,CAAC;AACH,CAAC;AAPD,8BAOC;AAED,4EAA4E;AAC5E,cAAqB,EAAU;IAC9B,MAAM,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM;QACxC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC;AAJD,oBAIC"} \ No newline at end of file +{"version":3,"file":"promises.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["lib/promises.ts"],"names":[],"mappings":";AAAA,GAAG;AACH,6EAA6E;AAC7E,GAAG;;AAKH,mBAA0B,EAAE,EAAE,OAAa;IAC1C,MAAM,CAAC,UAAS,GAAG,IAAI;QACtB,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM;YAClC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM;oBACzC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;wBACX,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACtB,CAAC;oBAAC,IAAI,CAAC,CAAC;wBACP,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;gBACF,CAAC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AAbD,8BAaC;AAGD,0BAAiC,EAAE,EAAE,OAAa;IACjD,MAAM,CAAC,UAAS,GAAG,IAAI;QACtB,OAAO,GAAG,OAAO,IAAI,IAAI,CAAC;QAC1B,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC,OAAO;YAC1B,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM;oBAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;gBACxB,CAAC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACJ,CAAC,CAAC;AACH,CAAC;AATD,4CASC;AAED,mBAA0B,GAAG,EAAqB;IACjD,gDAAgD;IAChD,qDAAqD;IACrD,MAAM,CAAC,EAAE,CAAC,MAAM,CACf,CAAC,IAAI,EAAE,GAAG,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAC7B,OAAO,CAAC,OAAO,EAAE,CACjB,CAAC;AACH,CAAC;AAPD,8BAOC;AAED,4EAA4E;AAC5E,cAAqB,EAAU;IAC9B,MAAM,CAAC,IAAI,OAAO,CAAO,CAAC,OAAO;QAChC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACJ,CAAC;AAJD,oBAIC"} \ No newline at end of file diff --git a/src/deploy_local.ts b/src/deploy_local.ts index 82c47f09..533bfc06 100644 --- a/src/deploy_local.ts +++ b/src/deploy_local.ts @@ -24,7 +24,6 @@ const rootDir = "../"; // CAN'T TOUCH THIS // ========================= -import * as fs from "fs"; import * as nodeSSH from "node-ssh"; import * as path from "path"; diff --git a/src/ipso/ipsoObject.ts b/src/ipso/ipsoObject.ts index 859b18ec..c54e8e91 100644 --- a/src/ipso/ipsoObject.ts +++ b/src/ipso/ipsoObject.ts @@ -1,5 +1,5 @@ import { Global as _ } from "../lib/global"; -import { composeObject, DictionaryLike, entries, values } from "../lib/object-polyfill"; +import { DictionaryLike, entries } from "../lib/object-polyfill"; // common base class for all objects that are transmitted somehow export class IPSOObject { @@ -69,7 +69,7 @@ export class IPSOObject { public serialize(reference = null): DictionaryLike { const ret = {}; - const serializeValue = (key, propName, value, refValue, transform?: PropertyTransform) => { + const serializeValue = (propName, value, refValue, transform?: PropertyTransform) => { const _required = isRequired(this, propName); let _ret = value; if (value instanceof IPSOObject) { @@ -113,17 +113,17 @@ export class IPSOObject { throw new Error("cannot serialize arrays when the reference values don't match"); } // serialize each item with the matching reference value - value = value.map((v, i) => serializeValue(key, propName, v, refValue[i], serializer)); + value = value.map((v, i) => serializeValue(propName, v, refValue[i], serializer)); } else { // no reference value, makes things easier - value = value.map(v => serializeValue(key, propName, v, null, serializer)); + value = value.map(v => serializeValue(propName, v, null, serializer)); } // now remove null items value = value.filter(v => v != null); if (value.length === 0) value = null; } else { // directly serialize the value - value = serializeValue(key, propName, value, refValue, serializer); + value = serializeValue(propName, value, refValue, serializer); } // only output the value if it's != null diff --git a/src/lib/conversions.ts b/src/lib/conversions.ts index acfca678..9941f07d 100644 --- a/src/lib/conversions.ts +++ b/src/lib/conversions.ts @@ -1,6 +1,5 @@ import { PropertyTransform } from "../ipso/ipsoObject"; import { clamp, roundTo } from "./math"; -import { DictionaryLike } from "./object-polyfill"; export const serializers = { color: ((value) => { diff --git a/src/lib/object-polyfill.test.ts b/src/lib/object-polyfill.test.ts index f4b86898..4a1fea52 100644 --- a/src/lib/object-polyfill.test.ts +++ b/src/lib/object-polyfill.test.ts @@ -105,11 +105,11 @@ describe("lib/object-polyfill => filter() =>", () => { }); it("should work correctly with an impossible filter", () => { - expect(filter(source, v => false)).to.deep.equal({ }); + expect(filter(source, () => false)).to.deep.equal({ }); }); it("should work for empty objects", () => { - expect(filter({}, v => true)).to.deep.equal({}); + expect(filter({}, () => true)).to.deep.equal({}); }); }); diff --git a/src/lib/promises.ts b/src/lib/promises.ts index 25348040..d1aa9de3 100644 --- a/src/lib/promises.ts +++ b/src/lib/promises.ts @@ -24,7 +24,7 @@ export function promisifyNoError(fn, context?: any): (...args: any[]) => Prom export function promisifyNoError(fn, context?: any) { return function(...args) { context = context || this; - return new Promise((resolve, reject) => { + return new Promise((resolve) => { fn.apply(context, [...args, (result) => { return resolve(result); }]); @@ -43,7 +43,7 @@ export function waterfall(...fn: PromiseCallback[]): Promise { /** Creates a promise that waits for the specified time and then resolves */ export function wait(ms: number): Promise { - return new Promise((resolve, reject) => { + return new Promise((resolve) => { setTimeout(resolve, ms); }); } diff --git a/tsconfig.json b/tsconfig.json index b85eba40..470fa155 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,17 +9,13 @@ "outDir": "build/", "removeComments": false, + // "noUnusedLocals": true, + // "noUnusedParameters": true, + // enable the new reflection API "experimentalDecorators": true, "emitDecoratorMetadata": true, - // Source maps are for debugging - // use *EITHER* sourceMap = true (generates .map file) - // or inlineSourceMap = true (includes map files in js files) - // *NOT* both. - // if you have problems finding the right lines while debugging, - // try switching the source map types - // you can also disable them for less output. "sourceMap": true, "inlineSourceMap": false, "sourceRoot": "src/", From 82a83f65c6d7de531ad33ee2764624b7531ff758 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 11 Oct 2017 14:46:13 +0200 Subject: [PATCH 11/51] setup react admin ui --- .gitignore | 9 +- .npmignore | 16 +- admin/build/main.bundle.js | 17 + admin/build/main.bundle.js.map | 1 + admin/build/runtime.bundle.js | 151 +++++ admin/build/runtime.bundle.js.map | 1 + admin/build/vendor.bundle.js | 963 ++++++++++++++++++++++++++++++ admin/build/vendor.bundle.js.map | 1 + admin/index.html | 221 +++---- admin/src/index.test.tsx | 20 + admin/src/index.tsx | 7 + package.json | 43 +- tsconfig.json | 2 + webpack.config.js | 51 ++ webpack.tsconfig.json | 26 + 15 files changed, 1401 insertions(+), 128 deletions(-) create mode 100644 admin/build/main.bundle.js create mode 100644 admin/build/main.bundle.js.map create mode 100644 admin/build/runtime.bundle.js create mode 100644 admin/build/runtime.bundle.js.map create mode 100644 admin/build/vendor.bundle.js create mode 100644 admin/build/vendor.bundle.js.map create mode 100644 admin/src/index.test.tsx create mode 100644 admin/src/index.tsx create mode 100644 webpack.config.js create mode 100644 webpack.tsconfig.json diff --git a/.gitignore b/.gitignore index e583ab59..09e206e5 100644 --- a/.gitignore +++ b/.gitignore @@ -282,6 +282,9 @@ coverage .nyc* # Compiled test files -build/**/*.test.js -build/**/*.test.d.ts -build/**/*.test.js.map \ No newline at end of file +**/build/**/*.test.js* +**/build/**/*.test.d.ts +**/build/**/*.test.js.map + +# no clue why those are generated +build/admin/**/*.d.ts \ No newline at end of file diff --git a/.npmignore b/.npmignore index c63c17d3..73966896 100644 --- a/.npmignore +++ b/.npmignore @@ -14,10 +14,11 @@ bin/ .vs*/ tslint.json tsconfig.json +webpack.config.js *.sln *.njsproj* iobroker.*.tgz -build/**/*.map +**/build/**/*.map # Local debugging password *_password.json @@ -38,7 +39,12 @@ coverage .nyc* # test files -src/**/*.test.ts -build/**/*.test.js -build/**/*.test.d.ts -build/**/*.test.map \ No newline at end of file +**/src/**/*.test.ts* +**/build/**/*.test.js* +**/build/**/*.test.d.ts +**/build/**/*.test.map + +# react sources +admin/src/**/*.* +# no clue why those are generated +build/admin/**/*.d.ts \ No newline at end of file diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js new file mode 100644 index 00000000..f3f803d0 --- /dev/null +++ b/admin/build/main.bundle.js @@ -0,0 +1,17 @@ +webpackJsonp(["main"],{ + +/***/ "./admin/src/index.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); +ReactDOM.render(React.createElement("h1", null, "Hello, World!"), document.getElementById("adapter-container")); +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiRDovaW9Ccm9rZXIudHJhZGZyaS9hZG1pbi9zcmMvIiwic291cmNlcyI6WyJpbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxNQUFNLENBQ2QsZ0RBQXNCLEVBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQyJ9 + +/***/ }) + +},["./admin/src/index.tsx"]); +//# sourceMappingURL=main.bundle.js.map \ No newline at end of file diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map new file mode 100644 index 00000000..36dfeb01 --- /dev/null +++ b/admin/build/main.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/index.tsx"],"sourcesContent":["\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst React = require(\"react\");\r\nconst ReactDOM = require(\"react-dom\");\r\nReactDOM.render(React.createElement(\"h1\", null, \"Hello, World!\"), document.getElementById(\"adapter-container\"));\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiRDovaW9Ccm9rZXIudHJhZGZyaS9hZG1pbi9zcmMvIiwic291cmNlcyI6WyJpbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxNQUFNLENBQ2QsZ0RBQXNCLEVBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQyJ9\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./admin/src/index.tsx\n// module id = ./admin/src/index.tsx\n// module chunks = main"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js b/admin/build/runtime.bundle.js new file mode 100644 index 00000000..80dfeed0 --- /dev/null +++ b/admin/build/runtime.bundle.js @@ -0,0 +1,151 @@ +/******/ (function(modules) { // webpackBootstrap +/******/ // install a JSONP callback for chunk loading +/******/ var parentJsonpFunction = window["webpackJsonp"]; +/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) { +/******/ // add "moreModules" to the modules object, +/******/ // then flag all "chunkIds" as loaded and fire callback +/******/ var moduleId, chunkId, i = 0, resolves = [], result; +/******/ for(;i < chunkIds.length; i++) { +/******/ chunkId = chunkIds[i]; +/******/ if(installedChunks[chunkId]) { +/******/ resolves.push(installedChunks[chunkId][0]); +/******/ } +/******/ installedChunks[chunkId] = 0; +/******/ } +/******/ for(moduleId in moreModules) { +/******/ if(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) { +/******/ modules[moduleId] = moreModules[moduleId]; +/******/ } +/******/ } +/******/ if(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules); +/******/ while(resolves.length) { +/******/ resolves.shift()(); +/******/ } +/******/ if(executeModules) { +/******/ for(i=0; i < executeModules.length; i++) { +/******/ result = __webpack_require__(__webpack_require__.s = executeModules[i]); +/******/ } +/******/ } +/******/ return result; +/******/ }; +/******/ +/******/ // The module cache +/******/ var installedModules = {}; +/******/ +/******/ // objects to store loaded and loading chunks +/******/ var installedChunks = { +/******/ "runtime": 0 +/******/ }; +/******/ +/******/ // The require function +/******/ function __webpack_require__(moduleId) { +/******/ +/******/ // Check if module is in cache +/******/ if(installedModules[moduleId]) { +/******/ return installedModules[moduleId].exports; +/******/ } +/******/ // Create a new module (and put it into the cache) +/******/ var module = installedModules[moduleId] = { +/******/ i: moduleId, +/******/ l: false, +/******/ exports: {} +/******/ }; +/******/ +/******/ // Execute the module function +/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); +/******/ +/******/ // Flag the module as loaded +/******/ module.l = true; +/******/ +/******/ // Return the exports of the module +/******/ return module.exports; +/******/ } +/******/ +/******/ // This file contains only the entry chunk. +/******/ // The chunk loading function for additional chunks +/******/ __webpack_require__.e = function requireEnsure(chunkId) { +/******/ var installedChunkData = installedChunks[chunkId]; +/******/ if(installedChunkData === 0) { +/******/ return new Promise(function(resolve) { resolve(); }); +/******/ } +/******/ +/******/ // a Promise means "currently loading". +/******/ if(installedChunkData) { +/******/ return installedChunkData[2]; +/******/ } +/******/ +/******/ // setup Promise in chunk cache +/******/ var promise = new Promise(function(resolve, reject) { +/******/ installedChunkData = installedChunks[chunkId] = [resolve, reject]; +/******/ }); +/******/ installedChunkData[2] = promise; +/******/ +/******/ // start chunk loading +/******/ var head = document.getElementsByTagName('head')[0]; +/******/ var script = document.createElement('script'); +/******/ script.type = 'text/javascript'; +/******/ script.charset = 'utf-8'; +/******/ script.async = true; +/******/ script.timeout = 120000; +/******/ +/******/ if (__webpack_require__.nc) { +/******/ script.setAttribute("nonce", __webpack_require__.nc); +/******/ } +/******/ script.src = __webpack_require__.p + "./admin/build/" + chunkId + ".bundle.js"; +/******/ var timeout = setTimeout(onScriptComplete, 120000); +/******/ script.onerror = script.onload = onScriptComplete; +/******/ function onScriptComplete() { +/******/ // avoid mem leaks in IE. +/******/ script.onerror = script.onload = null; +/******/ clearTimeout(timeout); +/******/ var chunk = installedChunks[chunkId]; +/******/ if(chunk !== 0) { +/******/ if(chunk) { +/******/ chunk[1](new Error('Loading chunk ' + chunkId + ' failed.')); +/******/ } +/******/ installedChunks[chunkId] = undefined; +/******/ } +/******/ }; +/******/ head.appendChild(script); +/******/ +/******/ return promise; +/******/ }; +/******/ +/******/ // expose the modules object (__webpack_modules__) +/******/ __webpack_require__.m = modules; +/******/ +/******/ // expose the module cache +/******/ __webpack_require__.c = installedModules; +/******/ +/******/ // define getter function for harmony exports +/******/ __webpack_require__.d = function(exports, name, getter) { +/******/ if(!__webpack_require__.o(exports, name)) { +/******/ Object.defineProperty(exports, name, { +/******/ configurable: false, +/******/ enumerable: true, +/******/ get: getter +/******/ }); +/******/ } +/******/ }; +/******/ +/******/ // getDefaultExport function for compatibility with non-harmony modules +/******/ __webpack_require__.n = function(module) { +/******/ var getter = module && module.__esModule ? +/******/ function getDefault() { return module['default']; } : +/******/ function getModuleExports() { return module; }; +/******/ __webpack_require__.d(getter, 'a', getter); +/******/ return getter; +/******/ }; +/******/ +/******/ // Object.prototype.hasOwnProperty.call +/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; +/******/ +/******/ // __webpack_public_path__ +/******/ __webpack_require__.p = ""; +/******/ +/******/ // on error function for async loading +/******/ __webpack_require__.oe = function(err) { console.error(err); throw err; }; +/******/ }) +/************************************************************************/ +/******/ ([]); +//# sourceMappingURL=runtime.bundle.js.map \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map new file mode 100644 index 00000000..e3c4efb6 --- /dev/null +++ b/admin/build/runtime.bundle.js.map @@ -0,0 +1 @@ +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 0080a4a9c615b1aac533"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0080a4a9c615b1aac533"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/vendor.bundle.js b/admin/build/vendor.bundle.js new file mode 100644 index 00000000..26f72096 --- /dev/null +++ b/admin/build/vendor.bundle.js @@ -0,0 +1,963 @@ +webpackJsonp(["vendor"],{ + +/***/ "./node_modules/fbjs/lib/EventListener.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + */ + +var emptyFunction = __webpack_require__("./node_modules/fbjs/lib/emptyFunction.js"); + +/** + * Upstream version of event listener. Does not take into account specific + * nature of platform. + */ +var EventListener = { + /** + * Listen to DOM events during the bubble phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + listen: function listen(target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, false); + return { + remove: function remove() { + target.removeEventListener(eventType, callback, false); + } + }; + } else if (target.attachEvent) { + target.attachEvent('on' + eventType, callback); + return { + remove: function remove() { + target.detachEvent('on' + eventType, callback); + } + }; + } + }, + + /** + * Listen to DOM events during the capture phase. + * + * @param {DOMEventTarget} target DOM element to register listener on. + * @param {string} eventType Event type, e.g. 'click' or 'mouseover'. + * @param {function} callback Callback function. + * @return {object} Object with a `remove` method. + */ + capture: function capture(target, eventType, callback) { + if (target.addEventListener) { + target.addEventListener(eventType, callback, true); + return { + remove: function remove() { + target.removeEventListener(eventType, callback, true); + } + }; + } else { + if (false) { + console.error('Attempted to listen to events during the capture phase on a ' + 'browser that does not support the capture phase. Your application ' + 'will not receive some events.'); + } + return { + remove: emptyFunction + }; + } + }, + + registerDefault: function registerDefault() {} +}; + +module.exports = EventListener; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/ExecutionEnvironment.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + + + +var canUseDOM = !!(typeof window !== 'undefined' && window.document && window.document.createElement); + +/** + * Simple, lightweight module assisting with the detection and context of + * Worker. Helps avoid circular dependencies and allows code to reason about + * whether or not they are in a Worker, even if they never include the main + * `ReactWorker` dependency. + */ +var ExecutionEnvironment = { + + canUseDOM: canUseDOM, + + canUseWorkers: typeof Worker !== 'undefined', + + canUseEventListeners: canUseDOM && !!(window.addEventListener || window.attachEvent), + + canUseViewport: canUseDOM && !!window.screen, + + isInWorker: !canUseDOM // For now, this is true - might change in the future. + +}; + +module.exports = ExecutionEnvironment; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/containsNode.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + */ + +var isTextNode = __webpack_require__("./node_modules/fbjs/lib/isTextNode.js"); + +/*eslint-disable no-bitwise */ + +/** + * Checks if a given DOM node contains or is another DOM node. + */ +function containsNode(outerNode, innerNode) { + if (!outerNode || !innerNode) { + return false; + } else if (outerNode === innerNode) { + return true; + } else if (isTextNode(outerNode)) { + return false; + } else if (isTextNode(innerNode)) { + return containsNode(outerNode, innerNode.parentNode); + } else if ('contains' in outerNode) { + return outerNode.contains(innerNode); + } else if (outerNode.compareDocumentPosition) { + return !!(outerNode.compareDocumentPosition(innerNode) & 16); + } else { + return false; + } +} + +module.exports = containsNode; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/emptyFunction.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * + */ + +function makeEmptyFunction(arg) { + return function () { + return arg; + }; +} + +/** + * This function accepts and discards inputs; it has no side effects. This is + * primarily useful idiomatically for overridable function endpoints which + * always need to be callable, since JS lacks a null-call idiom ala Cocoa. + */ +var emptyFunction = function emptyFunction() {}; + +emptyFunction.thatReturns = makeEmptyFunction; +emptyFunction.thatReturnsFalse = makeEmptyFunction(false); +emptyFunction.thatReturnsTrue = makeEmptyFunction(true); +emptyFunction.thatReturnsNull = makeEmptyFunction(null); +emptyFunction.thatReturnsThis = function () { + return this; +}; +emptyFunction.thatReturnsArgument = function (arg) { + return arg; +}; + +module.exports = emptyFunction; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/emptyObject.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + + + +var emptyObject = {}; + +if (false) { + Object.freeze(emptyObject); +} + +module.exports = emptyObject; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/focusNode.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + + + +/** + * @param {DOMElement} node input/textarea to focus + */ + +function focusNode(node) { + // IE8 can throw "Can't move focus to the control because it is invisible, + // not enabled, or of a type that does not accept the focus." for all kinds of + // reasons that are too expensive and fragile to test. + try { + node.focus(); + } catch (e) {} +} + +module.exports = focusNode; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/getActiveElement.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + */ + +/* eslint-disable fb-www/typeof-undefined */ + +/** + * Same as document.activeElement but wraps in a try-catch block. In IE it is + * not safe to call document.activeElement if there is nothing focused. + * + * The activeElement will be null only if the document or document body is not + * yet defined. + * + * @param {?DOMDocument} doc Defaults to current document. + * @return {?DOMElement} + */ +function getActiveElement(doc) /*?DOMElement*/{ + doc = doc || (typeof document !== 'undefined' ? document : undefined); + if (typeof doc === 'undefined') { + return null; + } + try { + return doc.activeElement || doc.body; + } catch (e) { + return doc.body; + } +} + +module.exports = getActiveElement; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/invariant.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + */ + + + +/** + * Use invariant() to assert state which your program assumes to be true. + * + * Provide sprintf-style format (only %s is supported) and arguments + * to provide information about what broke and what you were + * expecting. + * + * The invariant message will be stripped in production, but the invariant + * will remain to ensure logic does not differ in production. + */ + +var validateFormat = function validateFormat(format) {}; + +if (false) { + validateFormat = function validateFormat(format) { + if (format === undefined) { + throw new Error('invariant requires an error message argument'); + } + }; +} + +function invariant(condition, format, a, b, c, d, e, f) { + validateFormat(format); + + if (!condition) { + var error; + if (format === undefined) { + error = new Error('Minified exception occurred; use the non-minified dev environment ' + 'for the full error message and additional helpful warnings.'); + } else { + var args = [a, b, c, d, e, f]; + var argIndex = 0; + error = new Error(format.replace(/%s/g, function () { + return args[argIndex++]; + })); + error.name = 'Invariant Violation'; + } + + error.framesToPop = 1; // we don't care about invariant's own frame + throw error; + } +} + +module.exports = invariant; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/isNode.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + */ + +/** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM node. + */ +function isNode(object) { + var doc = object ? object.ownerDocument || object : document; + var defaultView = doc.defaultView || window; + return !!(object && (typeof defaultView.Node === 'function' ? object instanceof defaultView.Node : typeof object === 'object' && typeof object.nodeType === 'number' && typeof object.nodeName === 'string')); +} + +module.exports = isNode; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/isTextNode.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + + +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + */ + +var isNode = __webpack_require__("./node_modules/fbjs/lib/isNode.js"); + +/** + * @param {*} object The object to check. + * @return {boolean} Whether or not the object is a DOM text node. + */ +function isTextNode(object) { + return isNode(object) && object.nodeType == 3; +} + +module.exports = isTextNode; + +/***/ }), + +/***/ "./node_modules/fbjs/lib/shallowEqual.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/** + * Copyright (c) 2013-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @typechecks + * + */ + +/*eslint-disable no-self-compare */ + + + +var hasOwnProperty = Object.prototype.hasOwnProperty; + +/** + * inlined Object.is polyfill to avoid requiring consumers ship their own + * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is + */ +function is(x, y) { + // SameValue algorithm + if (x === y) { + // Steps 1-5, 7-10 + // Steps 6.b-6.e: +0 != -0 + // Added the nonzero y check to make Flow happy, but it is redundant + return x !== 0 || y !== 0 || 1 / x === 1 / y; + } else { + // Step 6.a: NaN == NaN + return x !== x && y !== y; + } +} + +/** + * Performs equality by iterating through keys on an object and returning false + * when any key has values which are not strictly equal between the arguments. + * Returns true when the values of all keys are strictly equal. + */ +function shallowEqual(objA, objB) { + if (is(objA, objB)) { + return true; + } + + if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) { + return false; + } + + var keysA = Object.keys(objA); + var keysB = Object.keys(objB); + + if (keysA.length !== keysB.length) { + return false; + } + + // Test for A's keys different from B. + for (var i = 0; i < keysA.length; i++) { + if (!hasOwnProperty.call(objB, keysA[i]) || !is(objA[keysA[i]], objB[keysA[i]])) { + return false; + } + } + + return true; +} + +module.exports = shallowEqual; + +/***/ }), + +/***/ "./node_modules/object-assign/index.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* +object-assign +(c) Sindre Sorhus +@license MIT +*/ + + +/* eslint-disable no-unused-vars */ +var getOwnPropertySymbols = Object.getOwnPropertySymbols; +var hasOwnProperty = Object.prototype.hasOwnProperty; +var propIsEnumerable = Object.prototype.propertyIsEnumerable; + +function toObject(val) { + if (val === null || val === undefined) { + throw new TypeError('Object.assign cannot be called with null or undefined'); + } + + return Object(val); +} + +function shouldUseNative() { + try { + if (!Object.assign) { + return false; + } + + // Detect buggy property enumeration order in older V8 versions. + + // https://bugs.chromium.org/p/v8/issues/detail?id=4118 + var test1 = new String('abc'); // eslint-disable-line no-new-wrappers + test1[5] = 'de'; + if (Object.getOwnPropertyNames(test1)[0] === '5') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test2 = {}; + for (var i = 0; i < 10; i++) { + test2['_' + String.fromCharCode(i)] = i; + } + var order2 = Object.getOwnPropertyNames(test2).map(function (n) { + return test2[n]; + }); + if (order2.join('') !== '0123456789') { + return false; + } + + // https://bugs.chromium.org/p/v8/issues/detail?id=3056 + var test3 = {}; + 'abcdefghijklmnopqrst'.split('').forEach(function (letter) { + test3[letter] = letter; + }); + if (Object.keys(Object.assign({}, test3)).join('') !== + 'abcdefghijklmnopqrst') { + return false; + } + + return true; + } catch (err) { + // We don't expect any of the above to throw, but better to be safe. + return false; + } +} + +module.exports = shouldUseNative() ? Object.assign : function (target, source) { + var from; + var to = toObject(target); + var symbols; + + for (var s = 1; s < arguments.length; s++) { + from = Object(arguments[s]); + + for (var key in from) { + if (hasOwnProperty.call(from, key)) { + to[key] = from[key]; + } + } + + if (getOwnPropertySymbols) { + symbols = getOwnPropertySymbols(from); + for (var i = 0; i < symbols.length; i++) { + if (propIsEnumerable.call(from, symbols[i])) { + to[symbols[i]] = from[symbols[i]]; + } + } + } + } + + return to; +}; + + +/***/ }), + +/***/ "./node_modules/react-dom/cjs/react-dom.production.min.js": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; +/* + React v16.0.0 + react-dom.production.min.js + + Copyright (c) 2013-present, Facebook, Inc. + + This source code is licensed under the MIT license found in the + LICENSE file in the root directory of this source tree. + Modernizr 3.0.0pre (Custom Build) | MIT +*/ +var aa=__webpack_require__("./node_modules/react/index.js");__webpack_require__("./node_modules/fbjs/lib/invariant.js");var l=__webpack_require__("./node_modules/fbjs/lib/ExecutionEnvironment.js"),n=__webpack_require__("./node_modules/object-assign/index.js"),ba=__webpack_require__("./node_modules/fbjs/lib/EventListener.js"),ca=__webpack_require__("./node_modules/fbjs/lib/emptyFunction.js"),da=__webpack_require__("./node_modules/fbjs/lib/emptyObject.js"),ea=__webpack_require__("./node_modules/fbjs/lib/shallowEqual.js"),fa=__webpack_require__("./node_modules/fbjs/lib/containsNode.js"),ha=__webpack_require__("./node_modules/fbjs/lib/focusNode.js"),ia=__webpack_require__("./node_modules/fbjs/lib/getActiveElement.js"); +function w(a){for(var b=arguments.length-1,c="Minified React error #"+a+"; visit http://facebook.github.io/react/docs/error-decoder.html?invariant\x3d"+a,d=0;d=g.hasBooleanValue+g.hasNumericValue+g.hasOverloadedBooleanValue?void 0:w("50",f);e.hasOwnProperty(f)&&(g.attributeName=e[f]);d.hasOwnProperty(f)&&(g.attributeNamespace=d[f]);a.hasOwnProperty(f)&&(g.mutationMethod=a[f]);xa.properties[f]= +g}}},xa={ID_ATTRIBUTE_NAME:"data-reactid",ROOT_ATTRIBUTE_NAME:"data-reactroot",ATTRIBUTE_NAME_START_CHAR:":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD",ATTRIBUTE_NAME_CHAR:":A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040", +properties:{},shouldSetAttribute:function(a,b){if(xa.isReservedProp(a)||!("o"!==a[0]&&"O"!==a[0]||"n"!==a[1]&&"N"!==a[1]))return!1;if(null===b)return!0;switch(typeof b){case "boolean":return xa.shouldAttributeAcceptBooleanValue(a);case "undefined":case "number":case "string":case "object":return!0;default:return!1}},getPropertyInfo:function(a){return xa.properties.hasOwnProperty(a)?xa.properties[a]:null},shouldAttributeAcceptBooleanValue:function(a){if(xa.isReservedProp(a))return!0;var b=xa.getPropertyInfo(a); +if(b)return b.hasBooleanValue||b.hasStringBooleanValue||b.hasOverloadedBooleanValue;a=a.toLowerCase().slice(0,5);return"data-"===a||"aria-"===a},isReservedProp:function(a){return ta.hasOwnProperty(a)},injection:wa},A=xa,E={IndeterminateComponent:0,FunctionalComponent:1,ClassComponent:2,HostRoot:3,HostPortal:4,HostComponent:5,HostText:6,CoroutineComponent:7,CoroutineHandlerPhase:8,YieldComponent:9,Fragment:10},F={ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_FRAGMENT_NODE:11}, +ya=E.HostComponent,za=E.HostText,Aa=F.ELEMENT_NODE,Ba=F.COMMENT_NODE,Ea=A.ID_ATTRIBUTE_NAME,Fa={hasCachedChildNodes:1},Ga=Math.random().toString(36).slice(2),Ha="__reactInternalInstance$"+Ga,Ia="__reactEventHandlers$"+Ga;function La(a){for(var b;b=a._renderedComponent;)a=b;return a}function Ma(a,b){a=La(a);a._hostNode=b;b[Ha]=a} +function Na(a,b){if(!(a._flags&Fa.hasCachedChildNodes)){var c=a._renderedChildren;b=b.firstChild;var d;a:for(d in c)if(c.hasOwnProperty(d)){var e=c[d],f=La(e)._domID;if(0!==f){for(;null!==b;b=b.nextSibling){var g=b,h=f;if(g.nodeType===Aa&&g.getAttribute(Ea)===""+h||g.nodeType===Ba&&g.nodeValue===" react-text: "+h+" "||g.nodeType===Ba&&g.nodeValue===" react-empty: "+h+" "){Ma(e,b);continue a}}w("32",f)}}a._flags|=Fa.hasCachedChildNodes}} +function Oa(a){if(a[Ha])return a[Ha];for(var b=[];!a[Ha];)if(b.push(a),a.parentNode)a=a.parentNode;else return null;var c=a[Ha];if(c.tag===ya||c.tag===za)return c;for(;a&&(c=a[Ha]);a=b.pop()){var d=c;b.length&&Na(c,a)}return d} +var G={getClosestInstanceFromNode:Oa,getInstanceFromNode:function(a){var b=a[Ha];if(b)return b.tag===ya||b.tag===za?b:b._hostNode===a?b:null;b=Oa(a);return null!=b&&b._hostNode===a?b:null},getNodeFromInstance:function(a){if(a.tag===ya||a.tag===za)return a.stateNode;void 0===a._hostNode?w("33"):void 0;if(a._hostNode)return a._hostNode;for(var b=[];!a._hostNode;)b.push(a),a._hostParent?void 0:w("34"),a=a._hostParent;for(;b.length;a=b.pop())Na(a,a._hostNode);return a._hostNode},precacheChildNodes:Na, +precacheNode:Ma,uncacheNode:function(a){var b=a._hostNode;b&&(delete b[Ha],a._hostNode=null)},precacheFiberNode:function(a,b){b[Ha]=a},getFiberCurrentPropsFromNode:function(a){return a[Ia]||null},updateFiberProps:function(a,b){a[Ia]=b}},Pa={remove:function(a){a._reactInternalFiber=void 0},get:function(a){return a._reactInternalFiber},has:function(a){return void 0!==a._reactInternalFiber},set:function(a,b){a._reactInternalFiber=b}},Qa={ReactCurrentOwner:aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner}; +function Ra(a){if("function"===typeof a.getName)return a.getName();if("number"===typeof a.tag){a=a.type;if("string"===typeof a)return a;if("function"===typeof a)return a.displayName||a.name}return null}var J={NoEffect:0,PerformedWork:1,Placement:2,Update:4,PlacementAndUpdate:6,Deletion:8,ContentReset:16,Callback:32,Err:64,Ref:128},Sa=E.HostComponent,Ta=E.HostRoot,Ua=E.HostPortal,Va=E.HostText,Wa=J.NoEffect,Xa=J.Placement; +function Za(a){var b=a;if(a.alternate)for(;b["return"];)b=b["return"];else{if((b.effectTag&Xa)!==Wa)return 1;for(;b["return"];)if(b=b["return"],(b.effectTag&Xa)!==Wa)return 1}return b.tag===Ta?2:3}function $a(a){2!==Za(a)?w("188"):void 0} +function ab(a){var b=a.alternate;if(!b)return b=Za(a),3===b?w("188"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c["return"],f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var g=e.child;g;){if(g===c)return $a(e),a;if(g===d)return $a(e),b;g=g.sibling}w("188")}if(c["return"]!==d["return"])c=e,d=f;else{g=!1;for(var h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}g? +void 0:w("189")}}c.alternate!==d?w("190"):void 0}c.tag!==Ta?w("188"):void 0;return c.stateNode.current===c?a:b} +var bb={isFiberMounted:function(a){return 2===Za(a)},isMounted:function(a){return(a=Pa.get(a))?2===Za(a):!1},findCurrentFiberUsingSlowPath:ab,findCurrentHostFiber:function(a){a=ab(a);if(!a)return null;for(var b=a;;){if(b.tag===Sa||b.tag===Va)return b;if(b.child)b.child["return"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b["return"]||b["return"]===a)return null;b=b["return"]}b.sibling["return"]=b["return"];b=b.sibling}}return null},findCurrentHostFiberWithNoPortals:function(a){a=ab(a); +if(!a)return null;for(var b=a;;){if(b.tag===Sa||b.tag===Va)return b;if(b.child&&b.tag!==Ua)b.child["return"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b["return"]||b["return"]===a)return null;b=b["return"]}b.sibling["return"]=b["return"];b=b.sibling}}return null}},K={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,injection:{injectErrorUtils:function(a){"function"!==typeof a.invokeGuardedCallback?w("197"):void 0;cb=a.invokeGuardedCallback}},invokeGuardedCallback:function(a, +b,c,d,e,f,g,h,k){cb.apply(K,arguments)},invokeGuardedCallbackAndCatchFirstError:function(a,b,c,d,e,f,g,h,k){K.invokeGuardedCallback.apply(this,arguments);if(K.hasCaughtError()){var p=K.clearCaughtError();K._hasRethrowError||(K._hasRethrowError=!0,K._rethrowError=p)}},rethrowCaughtError:function(){return db.apply(K,arguments)},hasCaughtError:function(){return K._hasCaughtError},clearCaughtError:function(){if(K._hasCaughtError){var a=K._caughtError;K._caughtError=null;K._hasCaughtError=!1;return a}w("198")}}; +function cb(a,b,c,d,e,f,g,h,k){K._hasCaughtError=!1;K._caughtError=null;var p=Array.prototype.slice.call(arguments,3);try{b.apply(c,p)}catch(x){K._caughtError=x,K._hasCaughtError=!0}}function db(){if(K._hasRethrowError){var a=K._rethrowError;K._rethrowError=null;K._hasRethrowError=!1;throw a;}}var eb=K,fb;function gb(a,b,c,d){b=a.type||"unknown-event";a.currentTarget=hb.getNodeFromInstance(d);eb.invokeGuardedCallbackAndCatchFirstError(b,c,void 0,a);a.currentTarget=null} +var hb={isEndish:function(a){return"topMouseUp"===a||"topTouchEnd"===a||"topTouchCancel"===a},isMoveish:function(a){return"topMouseMove"===a||"topTouchMove"===a},isStartish:function(a){return"topMouseDown"===a||"topTouchStart"===a},executeDirectDispatch:function(a){var b=a._dispatchListeners,c=a._dispatchInstances;Array.isArray(b)?w("103"):void 0;a.currentTarget=b?hb.getNodeFromInstance(c):null;b=b?b(a):null;a.currentTarget=null;a._dispatchListeners=null;a._dispatchInstances=null;return b},executeDispatchesInOrder:function(a, +b){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;ewb.length&&wb.push(a)}}}},L=yb;function Cb(a,b){null==b?w("30"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]} +function Db(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Eb=null;function Fb(a,b){a&&(ib.executeDispatchesInOrder(a,b),a.isPersistent()||a.constructor.release(a))}function Gb(a){return Fb(a,!0)}function Hb(a){return Fb(a,!1)} +function Ib(a,b,c){switch(a){case "onClick":case "onClickCapture":case "onDoubleClick":case "onDoubleClickCapture":case "onMouseDown":case "onMouseDownCapture":case "onMouseMove":case "onMouseMoveCapture":case "onMouseUp":case "onMouseUpCapture":return!(!c.disabled||"button"!==b&&"input"!==b&&"select"!==b&&"textarea"!==b);default:return!1}} +var Jb={injection:{injectEventPluginOrder:sa.injectEventPluginOrder,injectEventPluginsByName:sa.injectEventPluginsByName},getListener:function(a,b){if("number"===typeof a.tag){var c=a.stateNode;if(!c)return null;var d=ib.getFiberCurrentPropsFromNode(c);if(!d)return null;c=d[b];if(Ib(b,a.type,d))return null}else{d=a._currentElement;if("string"===typeof d||"number"===typeof d||!a._rootNodeID)return null;a=d.props;c=a[b];if(Ib(b,d.type,a))return null}c&&"function"!==typeof c?w("231",b,typeof c):void 0; +return c},extractEvents:function(a,b,c,d){for(var e,f=sa.plugins,g=0;gc||d.hasOverloadedBooleanValue&&!1===c?gc.deleteValueForProperty(a, +b):d.mustUseProperty?a[d.propertyName]=c:(b=d.attributeName,(e=d.attributeNamespace)?a.setAttributeNS(e,b,""+c):d.hasBooleanValue||d.hasOverloadedBooleanValue&&!0===c?a.setAttribute(b,""):a.setAttribute(b,""+c))}else gc.setValueForAttribute(a,b,A.shouldSetAttribute(b,c)?c:null)},setValueForAttribute:function(a,b,c){fc(b)&&(null==c?a.removeAttribute(b):a.setAttribute(b,""+c))},deleteValueForAttribute:function(a,b){a.removeAttribute(b)},deleteValueForProperty:function(a,b){var c=A.getPropertyInfo(b); +c?(b=c.mutationMethod)?b(a,void 0):c.mustUseProperty?a[c.propertyName]=c.hasBooleanValue?!1:"":a.removeAttribute(c.attributeName):a.removeAttribute(b)}},hc=gc,ic=Qa.ReactDebugCurrentFrame;function jc(){return null} +var kc={current:null,phase:null,resetCurrentFiber:function(){ic.getCurrentStack=null;kc.current=null;kc.phase=null},setCurrentFiber:function(a,b){ic.getCurrentStack=jc;kc.current=a;kc.phase=b},getCurrentFiberOwnerName:function(){return null},getCurrentFiberStackAddendum:jc},lc=kc,mc={getHostProps:function(a,b){var c=b.value,d=b.checked;return n({type:void 0,step:void 0,min:void 0,max:void 0},b,{defaultChecked:void 0,defaultValue:void 0,value:null!=c?c:a._wrapperState.initialValue,checked:null!=d? +d:a._wrapperState.initialChecked})},initWrapperState:function(a,b){var c=b.defaultValue;a._wrapperState={initialChecked:null!=b.checked?b.checked:b.defaultChecked,initialValue:null!=b.value?b.value:c,controlled:"checkbox"===b.type||"radio"===b.type?null!=b.checked:null!=b.value}},updateWrapper:function(a,b){var c=b.checked;null!=c&&hc.setValueForProperty(a,"checked",c||!1);c=b.value;if(null!=c)if(0===c&&""===a.value)a.value="0";else if("number"===b.type){if(b=parseFloat(a.value)||0,c!=b||c==b&&a.value!= +c)a.value=""+c}else a.value!==""+c&&(a.value=""+c);else null==b.value&&null!=b.defaultValue&&a.defaultValue!==""+b.defaultValue&&(a.defaultValue=""+b.defaultValue),null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)},postMountWrapper:function(a,b){switch(b.type){case "submit":case "reset":break;case "color":case "date":case "datetime":case "datetime-local":case "month":case "time":case "week":a.value="";a.value=a.defaultValue;break;default:a.value=a.value}b=a.name;""!== +b&&(a.name="");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!a.defaultChecked;""!==b&&(a.name=b)},restoreControlledState:function(a,b){mc.updateWrapper(a,b);var c=b.name;if("radio"===b.type&&null!=c){for(b=a;b.parentNode;)b=b.parentNode;c=b.querySelectorAll("input[name\x3d"+JSON.stringify(""+c)+'][type\x3d"radio"]');for(b=0;b=b.length?void 0:w("93"),b=b[0]),c=""+b),null==c&&(c=""),d=c);a._wrapperState={initialValue:""+d}},updateWrapper:function(a,b){var c=b.value;null!=c&&(c=""+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=b.defaultValue)},postMountWrapper:function(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)},restoreControlledState:function(a,b){vc.updateWrapper(a,b)}},wc=vc,xc=n({menuitem:!0},{area:!0, +base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function yc(a,b){b&&(xc[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?w("137",a,""):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?w("60"):void 0,"object"===typeof b.dangerouslySetInnerHTML&&"__html"in b.dangerouslySetInnerHTML?void 0:w("61")),null!=b.style&&"object"!==typeof b.style?w("62",""):void 0)} +function zc(a){var b=a.type;return(a=a.nodeName)&&"input"===a.toLowerCase()&&("checkbox"===b||"radio"===b)} +function Ac(a){var b=zc(a)?"checked":"value",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=""+a[b];if(!a.hasOwnProperty(b)&&"function"===typeof c.get&&"function"===typeof c.set)return Object.defineProperty(a,b,{enumerable:c.enumerable,configurable:!0,get:function(){return c.get.call(this)},set:function(a){d=""+a;c.set.call(this,a)}}),{getValue:function(){return d},setValue:function(a){d=""+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}} +var Bc={_getTrackerFromNode:function(a){return a._valueTracker},track:function(a){a._valueTracker||(a._valueTracker=Ac(a))},updateValueIfChanged:function(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d="";a&&(d=zc(a)?a.checked?"true":"false":a.value);a=d;return a!==c?(b.setValue(a),!0):!1},stopTracking:function(a){(a=a._valueTracker)&&a.stopTracking()}}; +function Cc(a,b){if(-1===a.indexOf("-"))return"string"===typeof b.is;switch(a){case "annotation-xml":case "color-profile":case "font-face":case "font-face-src":case "font-face-uri":case "font-face-format":case "font-face-name":case "missing-glyph":return!1;default:return!0}} +var Dc=ka.Namespaces,Ec,Fc=function(a){return"undefined"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Dc.svg||"innerHTML"in a)a.innerHTML=b;else for(Ec=Ec||document.createElement("div"),Ec.innerHTML="\x3csvg\x3e"+b+"\x3c/svg\x3e",b=Ec.firstChild;b.firstChild;)a.appendChild(b.firstChild)}),Gc=/["'&<>]/,Hc=F.TEXT_NODE; +function Ic(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&c.nodeType===Hc){c.nodeValue=b;return}}a.textContent=b} +l.canUseDOM&&("textContent"in document.documentElement||(Ic=function(a,b){if(a.nodeType===Hc)a.nodeValue=b;else{if("boolean"===typeof b||"number"===typeof b)b=""+b;else{b=""+b;var c=Gc.exec(b);if(c){var d="",e,f=0;for(e=c.index;e +b&&(b=8),$c=b=od(a.last.priorityLevel,b))c=a.last;else for(a=a.first;null!==a&&0>=od(a.priorityLevel,b);)c=a,a=a.next;return c} +function sd(a,b){var c=a.alternate,d=a.updateQueue;null===d&&(d=a.updateQueue=pd());null!==c?(a=c.updateQueue,null===a&&(a=c.updateQueue=pd())):a=null;md=d;nd=a!==d?a:null;var e=md;c=nd;var f=rd(e,b),g=null!==f?f.next:e.first;if(null===c)return qd(e,b,f,g),null;d=rd(c,b);a=null!==d?d.next:c.first;qd(e,b,f,g);if(g===a&&null!==g||f===d&&null!==f)return null===d&&(c.first=b),null===a&&(c.last=null),null;b={priorityLevel:b.priorityLevel,partialState:b.partialState,callback:b.callback,isReplace:b.isReplace, +isForced:b.isForced,isTopLevelUnmount:b.isTopLevelUnmount,next:null};qd(c,b,d,a);return b}function td(a,b,c,d){a=a.partialState;return"function"===typeof a?a.call(b,c,d):a} +var ud={addUpdate:function(a,b,c,d){sd(a,{priorityLevel:d,partialState:b,callback:c,isReplace:!1,isForced:!1,isTopLevelUnmount:!1,next:null})},addReplaceUpdate:function(a,b,c,d){sd(a,{priorityLevel:d,partialState:b,callback:c,isReplace:!0,isForced:!1,isTopLevelUnmount:!1,next:null})},addForceUpdate:function(a,b,c){sd(a,{priorityLevel:c,partialState:null,callback:b,isReplace:!1,isForced:!0,isTopLevelUnmount:!1,next:null})},getUpdatePriority:function(a){var b=a.updateQueue;return null===b||a.tag!== +jd&&a.tag!==kd?gd:null!==b.first?b.first.priorityLevel:gd},addTopLevelUpdate:function(a,b,c,d){var e=null===b.element;b={priorityLevel:d,partialState:b,callback:c,isReplace:!1,isForced:!1,isTopLevelUnmount:e,next:null};a=sd(a,b);e&&(e=md,c=nd,null!==e&&null!==b.next&&(b.next=null,e.last=b),null!==c&&null!==a&&null!==a.next&&(a.next=null,c.last=b))},beginUpdateQueue:function(a,b,c,d,e,f,g){null!==a&&a.updateQueue===c&&(c=b.updateQueue={first:c.first,last:c.last,callbackList:null,hasForceUpdate:!1}); +a=c.callbackList;for(var h=c.hasForceUpdate,k=!0,p=c.first;null!==p&&0>=od(p.priorityLevel,g);){c.first=p.next;null===c.first&&(c.last=null);var x;if(p.isReplace)e=td(p,d,e,f),k=!0;else if(x=td(p,d,e,f))e=k?n({},e,x):n(e,x),k=!1;p.isForced&&(h=!0);null===p.callback||p.isTopLevelUnmount&&null!==p.next||(a=null!==a?a:[],a.push(p.callback),b.effectTag|=fd);p=p.next}c.callbackList=a;c.hasForceUpdate=h;null!==c.first||null!==a||h||(b.updateQueue=null);return e},commitCallbacks:function(a,b,c){a=b.callbackList; +if(null!==a)for(b.callbackList=null,b=0;bwd||(a.current=vd[wd],vd[wd]=null,wd--)},push:function(a,b){wd++;vd[wd]=a.current;a.current=b},reset:function(){for(;-1a)?a:b}},ee=de.createHostRootFiber,fe=E.IndeterminateComponent,ge=E.FunctionalComponent,he=E.ClassComponent, +ie=E.HostComponent,je,ke;"function"===typeof Symbol&&Symbol["for"]?(je=Symbol["for"]("react.coroutine"),ke=Symbol["for"]("react.yield")):(je=60104,ke=60105); +var le={createCoroutine:function(a,b,c){var d=3r?(p=q,q=null):p=q.sibling;var v=H(a,q,h[r],k);if(null===v){null===q&&(q=p);break}b&&q&&null===v.alternate&&c(a,q);f=g(v,f,r);null===t?m=v:t.sibling=v;t=v;q=p}if(r===h.length)return d(a,q),m;if(null===q){for(;rk?(p=q,q=null):p=q.sibling;var V=H(a,q,v.value,r);if(null===V){q||(q=p);break}b&& +q&&null===V.alternate&&c(a,q);f=g(V,f,k);null===t?m=V:t.sibling=V;t=V;q=p}if(v.done)return d(a,q),m;if(null===q){for(;!v.done;k++,v=h.next())v=B(a,v.value,r),null!==v&&(f=g(v,f,k),null===t?m=v:t.sibling=v,t=v);return m}for(q=e(a,q);!v.done;k++,v=h.next())if(v=C(q,a,k,v.value,r),null!==v){if(b&&null!==v.alternate)q["delete"](null===v.key?k:v.key);f=g(v,f,k);null===t?m=v:t.sibling=v;t=v}b&&q.forEach(function(b){return c(a,b)});return m}return function(a,b,e,g){var m="object"===typeof e&&null!==e;if(m)switch(e.$$typeof){case Ke:a:{var C= +e.key;for(m=b;null!==m;){if(m.key===C)if(m.type===e.type){d(a,m.sibling);b=f(m,g);b.ref=Me(m,e);b.pendingProps=e.props;b["return"]=a;a=b;break a}else{d(a,m);break}else c(a,m);m=m.sibling}g=se(e,a.internalContextTag,g);g.ref=Me(b,e);g["return"]=a;a=g}return h(a);case oe:a:{for(m=e.key;null!==b;){if(b.key===m)if(b.tag===De){d(a,b.sibling);b=f(b,g);b.pendingProps=e;b["return"]=a;a=b;break a}else{d(a,b);break}else c(a,b);b=b.sibling}e=ve(e,a.internalContextTag,g);e["return"]=a;a=e}return h(a);case pe:a:{if(null!== +b)if(b.tag===Ee){d(a,b.sibling);b=f(b,g);b.type=e.value;b["return"]=a;a=b;break a}else d(a,b);b=we(e,a.internalContextTag,g);b.type=e.value;b["return"]=a;a=b}return h(a);case qe:a:{for(m=e.key;null!==b;){if(b.key===m)if(b.tag===Ce&&b.stateNode.containerInfo===e.containerInfo&&b.stateNode.implementation===e.implementation){d(a,b.sibling);b=f(b,g);b.pendingProps=e.children||[];b["return"]=a;a=b;break a}else{d(a,b);break}else c(a,b);b=b.sibling}e=xe(e,a.internalContextTag,g);e["return"]=a;a=e}return h(a)}if("string"=== +typeof e||"number"===typeof e)return e=""+e,null!==b&&b.tag===Be?(d(a,b.sibling),b=f(b,g),b.pendingProps=e,b["return"]=a,a=b):(d(a,b),e=ue(e,a.internalContextTag,g),e["return"]=a,a=e),h(a);if(ye(e))return Ca(a,b,e,g);if(Le(e))return r(a,b,e,g);m&&Ne(a,e);if("undefined"===typeof e)switch(a.tag){case Ae:case ze:e=a.type,w("152",e.displayName||e.name||"Component")}return d(a,b)}} +var Pe=Oe(!0,!0),Qe=Oe(!1,!0),Re=Oe(!1,!1),Se={reconcileChildFibers:Pe,reconcileChildFibersInPlace:Qe,mountChildFibersInPlace:Re,cloneChildFibers:function(a,b){null!==a&&b.child!==a.child?w("153"):void 0;if(null!==b.child){a=b.child;var c=re(a,a.pendingWorkPriority);c.pendingProps=a.pendingProps;b.child=c;for(c["return"]=b;null!==a.sibling;)a=a.sibling,c=c.sibling=re(a,a.pendingWorkPriority),c.pendingProps=a.pendingProps,c["return"]=b;c.sibling=null}}},Te=J.Update,Ue=Pd.AsyncUpdates,Ve=R.cacheContext, +We=R.getMaskedContext,Xe=R.getUnmaskedContext,Ye=R.isContextConsumer,Ze=ud.addUpdate,$e=ud.addReplaceUpdate,af=ud.addForceUpdate,bf=ud.beginUpdateQueue,cf=R.hasContextChanged,df=bb.isMounted; +function ef(a,b,c,d){function e(a,b){b.updater=f;a.stateNode=b;Pa.set(b,a)}var f={isMounted:df,enqueueSetState:function(c,d,e){c=Pa.get(c);var f=b(c,!1);Ze(c,d,void 0===e?null:e,f);a(c,f)},enqueueReplaceState:function(c,d,e){c=Pa.get(c);var f=b(c,!1);$e(c,d,void 0===e?null:e,f);a(c,f)},enqueueForceUpdate:function(c,d){c=Pa.get(c);var e=b(c,!1);af(c,void 0===d?null:d,e);a(c,e)}};return{adoptClassInstance:e,constructClassInstance:function(a,b){var c=a.type,d=Xe(a),f=Ye(a),g=f?We(a,d):da;b=new c(b,g); +e(a,b);f&&Ve(a,d,g);return b},mountClassInstance:function(a,b){var c=a.alternate,d=a.stateNode,e=d.state||null,g=a.pendingProps;g?void 0:w("158");var h=Xe(a);d.props=g;d.state=e;d.refs=da;d.context=We(a,h);ed.enableAsyncSubtreeAPI&&null!=a.type&&null!=a.type.prototype&&!0===a.type.prototype.unstable_isAsyncReactComponent&&(a.internalContextTag|=Ue);"function"===typeof d.componentWillMount&&(h=d.state,d.componentWillMount(),h!==d.state&&f.enqueueReplaceState(d,d.state,null),h=a.updateQueue,null!== +h&&(d.state=bf(c,a,h,d,e,g,b)));"function"===typeof d.componentDidMount&&(a.effectTag|=Te)},updateClassInstance:function(a,b,e){var g=b.stateNode;g.props=b.memoizedProps;g.state=b.memoizedState;var h=b.memoizedProps,k=b.pendingProps;k||(k=h,null==k?w("159"):void 0);var D=g.context,y=Xe(b);y=We(b,y);"function"!==typeof g.componentWillReceiveProps||h===k&&D===y||(D=g.state,g.componentWillReceiveProps(k,y),g.state!==D&&f.enqueueReplaceState(g,g.state,null));D=b.memoizedState;e=null!==b.updateQueue?bf(a, +b,b.updateQueue,g,D,k,e):D;if(!(h!==k||D!==e||cf()||null!==b.updateQueue&&b.updateQueue.hasForceUpdate))return"function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&D===a.memoizedState||(b.effectTag|=Te),!1;var B=k;if(null===h||null!==b.updateQueue&&b.updateQueue.hasForceUpdate)B=!0;else{var H=b.stateNode,C=b.type;B="function"===typeof H.shouldComponentUpdate?H.shouldComponentUpdate(B,e,y):C.prototype&&C.prototype.isPureReactComponent?!ea(h,B)||!ea(D,e):!0}B?("function"===typeof g.componentWillUpdate&& +g.componentWillUpdate(k,e,y),"function"===typeof g.componentDidUpdate&&(b.effectTag|=Te)):("function"!==typeof g.componentDidUpdate||h===a.memoizedProps&&D===a.memoizedState||(b.effectTag|=Te),c(b,k),d(b,e));g.props=k;g.state=e;g.context=y;return B}}} +var ff=Se.mountChildFibersInPlace,gf=Se.reconcileChildFibers,hf=Se.reconcileChildFibersInPlace,jf=Se.cloneChildFibers,kf=ud.beginUpdateQueue,lf=R.getMaskedContext,mf=R.getUnmaskedContext,nf=R.hasContextChanged,of=R.pushContextProvider,pf=R.pushTopLevelContextObject,qf=R.invalidateContextProvider,rf=E.IndeterminateComponent,sf=E.FunctionalComponent,tf=E.ClassComponent,uf=E.HostRoot,wf=E.HostComponent,xf=E.HostText,yf=E.HostPortal,zf=E.CoroutineComponent,Af=E.CoroutineHandlerPhase,Bf=E.YieldComponent, +Cf=E.Fragment,Df=Q.NoWork,Ef=Q.OffscreenPriority,Ff=J.PerformedWork,Gf=J.Placement,Hf=J.ContentReset,If=J.Err,Jf=J.Ref,Kf=Qa.ReactCurrentOwner; +function Lf(a,b,c,d,e){function f(a,b,c){g(a,b,c,b.pendingWorkPriority)}function g(a,b,c,d){b.child=null===a?ff(b,b.child,c,d):a.child===b.child?gf(b,b.child,c,d):hf(b,b.child,c,d)}function h(a,b){var c=b.ref;null===c||a&&a.ref===c||(b.effectTag|=Jf)}function k(a,b,c,d){h(a,b);if(!c)return d&&qf(b,!1),x(a,b);c=b.stateNode;Kf.current=b;var e=c.render();b.effectTag|=Ff;f(a,b,e);b.memoizedState=c.state;b.memoizedProps=c.props;d&&qf(b,!0);return b.child}function p(a){var b=a.stateNode;b.pendingContext? +pf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&pf(a,b.context,!1);C(a,b.containerInfo)}function x(a,b){jf(a,b);return b.child}function S(a,b){switch(b.tag){case uf:p(b);break;case tf:of(b);break;case yf:C(b,b.stateNode.containerInfo)}return null}var D=a.shouldSetTextContent,y=a.useSyncScheduling,B=a.shouldDeprioritizeSubtree,H=b.pushHostContext,C=b.pushHostContainer,Ca=c.enterHydrationState,r=c.resetHydrationState,m=c.tryToClaimNextHydratableInstance;a=ef(d,e,function(a,b){a.memoizedProps= +b},function(a,b){a.memoizedState=b});var t=a.adoptClassInstance,v=a.constructClassInstance,V=a.mountClassInstance,ld=a.updateClassInstance;return{beginWork:function(a,b,c){if(b.pendingWorkPriority===Df||b.pendingWorkPriority>c)return S(a,b);switch(b.tag){case rf:null!==a?w("155"):void 0;var d=b.type,e=b.pendingProps,g=mf(b);g=lf(b,g);d=d(e,g);b.effectTag|=Ff;"object"===typeof d&&null!==d&&"function"===typeof d.render?(b.tag=tf,e=of(b),t(b,d),V(b,c),b=k(a,b,!0,e)):(b.tag=sf,f(a,b,d),b.memoizedProps= +e,b=b.child);return b;case sf:a:{e=b.type;c=b.pendingProps;d=b.memoizedProps;if(nf())null===c&&(c=d);else if(null===c||d===c){b=x(a,b);break a}d=mf(b);d=lf(b,d);e=e(c,d);b.effectTag|=Ff;f(a,b,e);b.memoizedProps=c;b=b.child}return b;case tf:return e=of(b),d=void 0,null===a?b.stateNode?w("153"):(v(b,b.pendingProps),V(b,c),d=!0):d=ld(a,b,c),k(a,b,d,e);case uf:return p(b),d=b.updateQueue,null!==d?(e=b.memoizedState,d=kf(a,b,d,null,e,null,c),e===d?(r(),b=x(a,b)):(e=d.element,null!==a&&null!==a.child|| +!Ca(b)?(r(),f(a,b,e)):(b.effectTag|=Gf,b.child=ff(b,b.child,e,c)),b.memoizedState=d,b=b.child)):(r(),b=x(a,b)),b;case wf:H(b);null===a&&m(b);e=b.type;var q=b.memoizedProps;d=b.pendingProps;null===d&&(d=q,null===d?w("154"):void 0);g=null!==a?a.memoizedProps:null;nf()||null!==d&&q!==d?(q=d.children,D(e,d)?q=null:g&&D(e,g)&&(b.effectTag|=Hf),h(a,b),c!==Ef&&!y&&B(e,d)?(b.pendingWorkPriority=Ef,b=null):(f(a,b,q),b.memoizedProps=d,b=b.child)):b=x(a,b);return b;case xf:return null===a&&m(b),a=b.pendingProps, +null===a&&(a=b.memoizedProps),b.memoizedProps=a,null;case Af:b.tag=zf;case zf:c=b.pendingProps;if(nf())null===c&&(c=a&&a.memoizedProps,null===c?w("154"):void 0);else if(null===c||b.memoizedProps===c)c=b.memoizedProps;e=c.children;d=b.pendingWorkPriority;b.stateNode=null===a?ff(b,b.stateNode,e,d):a.child===b.child?gf(b,b.stateNode,e,d):hf(b,b.stateNode,e,d);b.memoizedProps=c;return b.stateNode;case Bf:return null;case yf:a:{C(b,b.stateNode.containerInfo);c=b.pendingWorkPriority;e=b.pendingProps;if(nf())null=== +e&&(e=a&&a.memoizedProps,null==e?w("154"):void 0);else if(null===e||b.memoizedProps===e){b=x(a,b);break a}null===a?b.child=hf(b,b.child,e,c):f(a,b,e);b.memoizedProps=e;b=b.child}return b;case Cf:a:{c=b.pendingProps;if(nf())null===c&&(c=b.memoizedProps);else if(null===c||b.memoizedProps===c){b=x(a,b);break a}f(a,b,c);b.memoizedProps=c;b=b.child}return b;default:w("156")}},beginFailedWork:function(a,b,c){switch(b.tag){case tf:of(b);break;case uf:p(b);break;default:w("157")}b.effectTag|=If;null===a? +b.child=null:b.child!==a.child&&(b.child=a.child);if(b.pendingWorkPriority===Df||b.pendingWorkPriority>c)return S(a,b);b.firstEffect=null;b.lastEffect=null;g(a,b,null,c);b.tag===tf&&(a=b.stateNode,b.memoizedProps=a.props,b.memoizedState=a.state);return b.child}}} +var Mf=Se.reconcileChildFibers,Nf=R.popContextProvider,Of=R.popTopLevelContextObject,Pf=E.IndeterminateComponent,Qf=E.FunctionalComponent,Rf=E.ClassComponent,Sf=E.HostRoot,Tf=E.HostComponent,Uf=E.HostText,Vf=E.HostPortal,Wf=E.CoroutineComponent,Xf=E.CoroutineHandlerPhase,Yf=E.YieldComponent,Zf=E.Fragment,ag=J.Placement,bg=J.Ref,cg=J.Update,dg=Q.OffscreenPriority; +function eg(a,b,c){var d=a.createInstance,e=a.createTextInstance,f=a.appendInitialChild,g=a.finalizeInitialChildren,h=a.prepareUpdate,k=b.getRootHostContainer,p=b.popHostContext,x=b.getHostContext,S=b.popHostContainer,D=c.prepareToHydrateHostInstance,y=c.prepareToHydrateHostTextInstance,B=c.popHydrationState;return{completeWork:function(a,b,c){var r=b.pendingProps;if(null===r)r=b.memoizedProps;else if(b.pendingWorkPriority!==dg||c===dg)b.pendingProps=null;switch(b.tag){case Qf:return null;case Rf:return Nf(b), +null;case Sf:S(b);Of(b);r=b.stateNode;r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null);if(null===a||null===a.child)B(b),b.effectTag&=~ag;return null;case Tf:p(b);c=k();var m=b.type;if(null!==a&&null!=b.stateNode){var t=a.memoizedProps,C=b.stateNode,V=x();r=h(C,m,t,r,c,V);if(b.updateQueue=r)b.effectTag|=cg;a.ref!==b.ref&&(b.effectTag|=bg)}else{if(!r)return null===b.stateNode?w("166"):void 0,null;a=x();if(B(b))D(b,c,a)&&(b.effectTag|=cg);else{a=d(m,r,c,a,b);a:for(t=b.child;null!== +t;){if(t.tag===Tf||t.tag===Uf)f(a,t.stateNode);else if(t.tag!==Vf&&null!==t.child){t=t.child;continue}if(t===b)break a;for(;null===t.sibling;){if(null===t["return"]||t["return"]===b)break a;t=t["return"]}t=t.sibling}g(a,m,r,c)&&(b.effectTag|=cg);b.stateNode=a}null!==b.ref&&(b.effectTag|=bg)}return null;case Uf:if(a&&null!=b.stateNode)a.memoizedProps!==r&&(b.effectTag|=cg);else{if("string"!==typeof r)return null===b.stateNode?w("166"):void 0,null;a=k();c=x();B(b)?y(b)&&(b.effectTag|=cg):b.stateNode= +e(r,a,c,b)}return null;case Wf:(r=b.memoizedProps)?void 0:w("165");b.tag=Xf;c=[];a:for((m=b.stateNode)&&(m["return"]=b);null!==m;){if(m.tag===Tf||m.tag===Uf||m.tag===Vf)w("164");else if(m.tag===Yf)c.push(m.type);else if(null!==m.child){m.child["return"]=m;m=m.child;continue}for(;null===m.sibling;){if(null===m["return"]||m["return"]===b)break a;m=m["return"]}m.sibling["return"]=m["return"];m=m.sibling}m=r.handler;r=m(r.props,c);b.child=Mf(b,null!==a?a.child:null,r,b.pendingWorkPriority);return b.child; +case Xf:return b.tag=Wf,null;case Yf:return null;case Zf:return null;case Vf:return b.effectTag|=cg,S(b),null;case Pf:w("167");default:w("156")}}}}var fg=null,gg=null;function hg(a){return function(b){try{return a(b)}catch(c){}}} +var ig={injectInternals:function(a){if("undefined"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!b.supportsFiber)return!0;try{var c=b.inject(a);fg=hg(function(a){return b.onCommitFiberRoot(c,a)});gg=hg(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0},onCommitRoot:function(a){"function"===typeof fg&&fg(a)},onCommitUnmount:function(a){"function"===typeof gg&&gg(a)}},jg=E.ClassComponent,kg=E.HostRoot,lg=E.HostComponent,mg=E.HostText,ng= +E.HostPortal,og=E.CoroutineComponent,pg=ud.commitCallbacks,qg=ig.onCommitUnmount,rg=J.Placement,sg=J.Update,tg=J.Callback,ug=J.ContentReset; +function vg(a,b){function c(a){var c=a.ref;if(null!==c)try{c(null)}catch(t){b(a,t)}}function d(a){return a.tag===lg||a.tag===kg||a.tag===ng}function e(a){for(var b=a;;)if(g(b),null!==b.child&&b.tag!==ng)b.child["return"]=b,b=b.child;else{if(b===a)break;for(;null===b.sibling;){if(null===b["return"]||b["return"]===a)return;b=b["return"]}b.sibling["return"]=b["return"];b=b.sibling}}function f(a){for(var b=a,c=!1,d=void 0,f=void 0;;){if(!c){c=b["return"];a:for(;;){null===c?w("160"):void 0;switch(c.tag){case lg:d= +c.stateNode;f=!1;break a;case kg:d=c.stateNode.containerInfo;f=!0;break a;case ng:d=c.stateNode.containerInfo;f=!0;break a}c=c["return"]}c=!0}if(b.tag===lg||b.tag===mg)e(b),f?C(d,b.stateNode):H(d,b.stateNode);else if(b.tag===ng?d=b.stateNode.containerInfo:g(b),null!==b.child){b.child["return"]=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b["return"]||b["return"]===a)return;b=b["return"];b.tag===ng&&(c=!1)}b.sibling["return"]=b["return"];b=b.sibling}}function g(a){"function"=== +typeof qg&&qg(a);switch(a.tag){case jg:c(a);var d=a.stateNode;if("function"===typeof d.componentWillUnmount)try{d.props=a.memoizedProps,d.state=a.memoizedState,d.componentWillUnmount()}catch(t){b(a,t)}break;case lg:c(a);break;case og:e(a.stateNode);break;case ng:f(a)}}var h=a.commitMount,k=a.commitUpdate,p=a.resetTextContent,x=a.commitTextUpdate,S=a.appendChild,D=a.appendChildToContainer,y=a.insertBefore,B=a.insertInContainerBefore,H=a.removeChild,C=a.removeChildFromContainer,Ca=a.getPublicInstance; +return{commitPlacement:function(a){a:{for(var b=a["return"];null!==b;){if(d(b)){var c=b;break a}b=b["return"]}w("160");c=void 0}var e=b=void 0;switch(c.tag){case lg:b=c.stateNode;e=!1;break;case kg:b=c.stateNode.containerInfo;e=!0;break;case ng:b=c.stateNode.containerInfo;e=!0;break;default:w("161")}c.effectTag&ug&&(p(b),c.effectTag&=~ug);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c["return"]||d(c["return"])){c=null;break a}c=c["return"]}c.sibling["return"]=c["return"];for(c=c.sibling;c.tag!== +lg&&c.tag!==mg;){if(c.effectTag&rg)continue b;if(null===c.child||c.tag===ng)continue b;else c.child["return"]=c,c=c.child}if(!(c.effectTag&rg)){c=c.stateNode;break a}}for(var f=a;;){if(f.tag===lg||f.tag===mg)c?e?B(b,f.stateNode,c):y(b,f.stateNode,c):e?D(b,f.stateNode):S(b,f.stateNode);else if(f.tag!==ng&&null!==f.child){f.child["return"]=f;f=f.child;continue}if(f===a)break;for(;null===f.sibling;){if(null===f["return"]||f["return"]===a)return;f=f["return"]}f.sibling["return"]=f["return"];f=f.sibling}}, +commitDeletion:function(a){f(a);a["return"]=null;a.child=null;a.alternate&&(a.alternate.child=null,a.alternate["return"]=null)},commitWork:function(a,b){switch(b.tag){case jg:break;case lg:var c=b.stateNode;if(null!=c){var d=b.memoizedProps;a=null!==a?a.memoizedProps:d;var e=b.type,f=b.updateQueue;b.updateQueue=null;null!==f&&k(c,f,e,a,d,b)}break;case mg:null===b.stateNode?w("162"):void 0;c=b.memoizedProps;x(b.stateNode,null!==a?a.memoizedProps:c,c);break;case kg:break;case ng:break;default:w("163")}}, +commitLifeCycles:function(a,b){switch(b.tag){case jg:var c=b.stateNode;if(b.effectTag&sg)if(null===a)c.props=b.memoizedProps,c.state=b.memoizedState,c.componentDidMount();else{var d=a.memoizedProps;a=a.memoizedState;c.props=b.memoizedProps;c.state=b.memoizedState;c.componentDidUpdate(d,a)}b.effectTag&tg&&null!==b.updateQueue&&pg(b,b.updateQueue,c);break;case kg:a=b.updateQueue;null!==a&&pg(b,a,b.child&&b.child.stateNode);break;case lg:c=b.stateNode;null===a&&b.effectTag&sg&&h(c,b.type,b.memoizedProps, +b);break;case mg:break;case ng:break;default:w("163")}},commitAttachRef:function(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case lg:b(Ca(c));break;default:b(c)}}},commitDetachRef:function(a){a=a.ref;null!==a&&a(null)}}}var wg=xd.createCursor,xg=xd.pop,yg=xd.push,zg={}; +function Ag(a){function b(a){a===zg?w("174"):void 0;return a}var c=a.getChildHostContext,d=a.getRootHostContext,e=wg(zg),f=wg(zg),g=wg(zg);return{getHostContext:function(){return b(e.current)},getRootHostContainer:function(){return b(g.current)},popHostContainer:function(a){xg(e,a);xg(f,a);xg(g,a)},popHostContext:function(a){f.current===a&&(xg(e,a),xg(f,a))},pushHostContainer:function(a,b){yg(g,b,a);b=d(b);yg(f,a,a);yg(e,b,a)},pushHostContext:function(a){var d=b(g.current),h=b(e.current);d=c(h,a.type, +d);h!==d&&(yg(f,a,a),yg(e,d,a))},resetHostContainer:function(){e.current=zg;g.current=zg}}}var Bg=E.HostComponent,Cg=E.HostText,Dg=E.HostRoot,Eg=J.Deletion,Fg=J.Placement,Gg=de.createFiberFromHostInstanceForDeletion; +function Hg(a){function b(a,b){var c=Gg();c.stateNode=b;c["return"]=a;c.effectTag=Eg;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function c(a,b){switch(a.tag){case Bg:return f(b,a.type,a.pendingProps);case Cg:return g(b,a.pendingProps);default:return!1}}function d(a){for(a=a["return"];null!==a&&a.tag!==Bg&&a.tag!==Dg;)a=a["return"];y=a}var e=a.shouldSetTextContent,f=a.canHydrateInstance,g=a.canHydrateTextInstance,h=a.getNextHydratableSibling,k=a.getFirstHydratableChild, +p=a.hydrateInstance,x=a.hydrateTextInstance,S=a.didNotHydrateInstance,D=a.didNotFindHydratableInstance;a=a.didNotFindHydratableTextInstance;if(!(f&&g&&h&&k&&p&&x&&S&&D&&a))return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){w("175")},prepareToHydrateHostTextInstance:function(){w("176")},popHydrationState:function(){return!1}};var y=null,B=null,H=!1;return{enterHydrationState:function(a){B= +k(a.stateNode.containerInfo);y=a;return H=!0},resetHydrationState:function(){B=y=null;H=!1},tryToClaimNextHydratableInstance:function(a){if(H){var d=B;if(d){if(!c(a,d)){d=h(d);if(!d||!c(a,d)){a.effectTag|=Fg;H=!1;y=a;return}b(y,B)}a.stateNode=d;y=a;B=k(d)}else a.effectTag|=Fg,H=!1,y=a}},prepareToHydrateHostInstance:function(a,b,c){b=p(a.stateNode,a.type,a.memoizedProps,b,c,a);a.updateQueue=b;return null!==b?!0:!1},prepareToHydrateHostTextInstance:function(a){return x(a.stateNode,a.memoizedProps,a)}, +popHydrationState:function(a){if(a!==y)return!1;if(!H)return d(a),H=!0,!1;var c=a.type;if(a.tag!==Bg||"head"!==c&&"body"!==c&&!e(c,a.memoizedProps))for(c=B;c;)b(a,c),c=h(c);d(a);B=y?h(a.stateNode):null;return!0}}} +var Ig=R.popContextProvider,Jg=xd.reset,Kg=Qa.ReactCurrentOwner,Lg=de.createWorkInProgress,Mg=de.largerPriority,Ng=ig.onCommitRoot,T=Q.NoWork,Og=Q.SynchronousPriority,U=Q.TaskPriority,Pg=Q.HighPriority,Qg=Q.LowPriority,Rg=Q.OffscreenPriority,Sg=Pd.AsyncUpdates,Tg=J.PerformedWork,Ug=J.Placement,Vg=J.Update,Wg=J.PlacementAndUpdate,Xg=J.Deletion,Yg=J.ContentReset,Zg=J.Callback,$g=J.Err,ah=J.Ref,bh=E.HostRoot,ch=E.HostComponent,dh=E.HostPortal,eh=E.ClassComponent,fh=ud.getUpdatePriority,gh=R.resetContext; +function hh(a){function b(){for(;null!==ma&&ma.current.pendingWorkPriority===T;){ma.isScheduled=!1;var a=ma.nextScheduledRoot;ma.nextScheduledRoot=null;if(ma===zb)return zb=ma=null,z=T,null;ma=a}a=ma;for(var b=null,c=T;null!==a;)a.current.pendingWorkPriority!==T&&(c===T||c>a.current.pendingWorkPriority)&&(c=a.current.pendingWorkPriority,b=a),a=a.nextScheduledRoot;null!==b?(z=c,Jg(),gh(),t(),I=Lg(b.current,c),b!==nc&&(oc=0,nc=b)):(z=T,nc=I=null)}function c(c){Hd=!0;na=null;var d=c.stateNode;d.current=== +c?w("177"):void 0;z!==Og&&z!==U||oc++;Kg.current=null;if(c.effectTag>Tg)if(null!==c.lastEffect){c.lastEffect.nextEffect=c;var e=c.firstEffect}else e=c;else e=c.firstEffect;Ui();for(u=e;null!==u;){var f=!1,g=void 0;try{for(;null!==u;){var h=u.effectTag;h&Yg&&a.resetTextContent(u.stateNode);if(h&ah){var k=u.alternate;null!==k&&Ph(k)}switch(h&~(Zg|$g|Yg|ah|Tg)){case Ug:q(u);u.effectTag&=~Ug;break;case Wg:q(u);u.effectTag&=~Ug;vf(u.alternate,u);break;case Vg:vf(u.alternate,u);break;case Xg:Id=!0,Mh(u), +Id=!1}u=u.nextEffect}}catch(Jd){f=!0,g=Jd}f&&(null===u?w("178"):void 0,x(u,g),null!==u&&(u=u.nextEffect))}Vi();d.current=c;for(u=e;null!==u;){d=!1;e=void 0;try{for(;null!==u;){var Gd=u.effectTag;Gd&(Vg|Zg)&&Nh(u.alternate,u);Gd&ah&&Oh(u);if(Gd&$g)switch(f=u,g=void 0,null!==P&&(g=P.get(f),P["delete"](f),null==g&&null!==f.alternate&&(f=f.alternate,g=P.get(f),P["delete"](f))),null==g?w("184"):void 0,f.tag){case eh:f.stateNode.componentDidCatch(g.error,{componentStack:g.componentStack});break;case bh:null=== +Ja&&(Ja=g.error);break;default:w("157")}var m=u.nextEffect;u.nextEffect=null;u=m}}catch(Jd){d=!0,e=Jd}d&&(null===u?w("178"):void 0,x(u,e),null!==u&&(u=u.nextEffect))}Hd=!1;"function"===typeof Ng&&Ng(c.stateNode);va&&(va.forEach(H),va=null);b()}function d(a){for(;;){var b=Lh(a.alternate,a,z),c=a["return"],d=a.sibling;var e=a;if(!(e.pendingWorkPriority!==T&&e.pendingWorkPriority>z)){for(var f=fh(e),g=e.child;null!==g;)f=Mg(f,g.pendingWorkPriority),g=g.sibling;e.pendingWorkPriority=f}if(null!==b)return b; +null!==c&&(null===c.firstEffect&&(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),a.effectTag>Tg&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a));if(null!==d)return d;if(null!==c)a=c;else{na=a;break}}return null}function e(a){var b=V(a.alternate,a,z);null===b&&(b=d(a));Kg.current=null;return b}function f(a){var b=ld(a.alternate,a,z);null===b&&(b=d(a));Kg.current=null;return b} +function g(a){p(Rg,a)}function h(){if(null!==P&&0a)){O=z;a:do{if(z<=U)for(;null!==I&&!(I=e(I),null===I&&(null===na?w("179"):void 0,O=U,c(na),O=z,h(),z===T||z>a||z>U)););else if(null!==d)for(;null!==I&&!Ab;)if(1a||zU&&!Bb&&($f(g),Bb=!0);a=Ja;Ya=Ab=Da=!1;nc=Ka=P=Ja=null;oc=0;if(null!==a)throw a;}function x(a,b){var c=Kg.current=null,d=!1,e=!1,f=null;if(a.tag===bh)c=a,S(a)&&(Ya=!0);else for(var g=a["return"];null!==g&&null===c;){g.tag===eh?"function"===typeof g.stateNode.componentDidCatch&& +(d=!0,f=Ra(g),c=g,e=!0):g.tag===bh&&(c=g);if(S(g)){if(Id||null!==va&&(va.has(g)||null!==g.alternate&&va.has(g.alternate)))return null;c=null;e=!1}g=g["return"]}if(null!==c){null===Ka&&(Ka=new Set);Ka.add(c);var h="";g=a;do{a:switch(g.tag){case fe:case ge:case he:case ie:var k=g._debugOwner,m=g._debugSource;var p=Ra(g);var q=null;k&&(q=Ra(k));k=m;p="\n in "+(p||"Unknown")+(k?" (at "+k.fileName.replace(/^.*[\\\/]/,"")+":"+k.lineNumber+")":q?" (created by "+q+")":"");break a;default:p=""}h+=p;g=g["return"]}while(g); +g=h;a=Ra(a);null===P&&(P=new Map);b={componentName:a,componentStack:g,error:b,errorBoundary:d?c.stateNode:null,errorBoundaryFound:d,errorBoundaryName:f,willRetry:e};P.set(c,b);try{console.error(b.error)}catch(Wi){console.error(Wi)}Hd?(null===va&&(va=new Set),va.add(c)):H(c);return c}null===Ja&&(Ja=b);return null}function S(a){return null!==Ka&&(Ka.has(a)||null!==a.alternate&&Ka.has(a.alternate))}function D(a,b){return y(a,b,!1)}function y(a,b){oc>Xi&&(Ya=!0,w("185"));!Da&&b<=z&&(I=null);for(var c= +!0;null!==a&&c;){c=!1;if(a.pendingWorkPriority===T||a.pendingWorkPriority>b)c=!0,a.pendingWorkPriority=b;null!==a.alternate&&(a.alternate.pendingWorkPriority===T||a.alternate.pendingWorkPriority>b)&&(c=!0,a.alternate.pendingWorkPriority=b);if(null===a["return"])if(a.tag===bh){var d=a.stateNode;b===T||d.isScheduled||(d.isScheduled=!0,zb?zb.nextScheduledRoot=d:ma=d,zb=d);if(!Da)switch(b){case Og:pc?p(Og,null):p(U,null);break;case U:W?void 0:w("186");break;default:Bb||($f(g),Bb=!0)}}else break;a=a["return"]}} +function B(a,b){var c=O;c===T&&(c=!Yi||a.internalContextTag&Sg||b?Qg:Og);return c===Og&&(Da||W)?U:c}function H(a){y(a,U,!0)}var C=Ag(a),Ca=Hg(a),r=C.popHostContainer,m=C.popHostContext,t=C.resetHostContainer,v=Lf(a,C,Ca,D,B),V=v.beginWork,ld=v.beginFailedWork,Lh=eg(a,C,Ca).completeWork;C=vg(a,x);var q=C.commitPlacement,Mh=C.commitDeletion,vf=C.commitWork,Nh=C.commitLifeCycles,Oh=C.commitAttachRef,Ph=C.commitDetachRef,$f=a.scheduleDeferredCallback,Yi=a.useSyncScheduling,Ui=a.prepareForCommit,Vi=a.resetAfterCommit, +O=T,Da=!1,Ab=!1,W=!1,pc=!1,I=null,z=T,u=null,na=null,ma=null,zb=null,Bb=!1,P=null,Ka=null,va=null,Ja=null,Ya=!1,Hd=!1,Id=!1,Xi=1E3,oc=0,nc=null;return{scheduleUpdate:D,getPriorityContext:B,batchedUpdates:function(a,b){var c=W;W=!0;try{return a(b)}finally{W=c,Da||W||p(U,null)}},unbatchedUpdates:function(a){var b=pc,c=W;pc=W;W=!1;try{return a()}finally{W=c,pc=b}},flushSync:function(a){var b=W,c=O;W=!0;O=Og;try{return a()}finally{W=b,O=c,Da?w("187"):void 0,p(U,null)}},deferredUpdates:function(a){var b= +O;O=Qg;try{return a()}finally{O=b}}}}function ih(){w("196")}function jh(a){if(!a)return da;a=Pa.get(a);return"number"===typeof a.tag?ih(a):a._processChildContext(a._context)}jh._injectFiber=function(a){ih=a};var kh=ud.addTopLevelUpdate,lh=R.findCurrentUnmaskedContext,mh=R.isContextProvider,nh=R.processChildContext,oh=E.HostComponent,ph=bb.findCurrentHostFiber,qh=bb.findCurrentHostFiberWithNoPortals;jh._injectFiber(function(a){var b=lh(a);return mh(a)?nh(a,b,!1):b});var rh=F.TEXT_NODE; +function sh(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function th(a,b){var c=sh(a);a=0;for(var d;c;){if(c.nodeType===rh){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=sh(c)}}var uh=null;function vh(){!uh&&l.canUseDOM&&(uh="textContent"in document.documentElement?"textContent":"innerText");return uh} +var wh={getOffsets:function(a){var b=window.getSelection&&window.getSelection();if(!b||0===b.rangeCount)return null;var c=b.anchorNode,d=b.anchorOffset,e=b.focusNode,f=b.focusOffset,g=b.getRangeAt(0);try{g.startContainer.nodeType,g.endContainer.nodeType}catch(k){return null}b=b.anchorNode===b.focusNode&&b.anchorOffset===b.focusOffset?0:g.toString().length;var h=g.cloneRange();h.selectNodeContents(a);h.setEnd(g.startContainer,g.startOffset);a=h.startContainer===h.endContainer&&h.startOffset===h.endOffset? +0:h.toString().length;g=a+b;b=document.createRange();b.setStart(c,d);b.setEnd(e,f);c=b.collapsed;return{start:c?g:a,end:c?a:g}},setOffsets:function(a,b){if(window.getSelection){var c=window.getSelection(),d=a[vh()].length,e=Math.min(b.start,d);b=void 0===b.end?e:Math.min(b.end,d);!c.extend&&e>b&&(d=b,b=e,e=d);d=th(a,e);a=th(a,b);if(d&&a){var f=document.createRange();f.setStart(d.node,d.offset);c.removeAllRanges();e>b?(c.addRange(f),c.extend(a.node,a.offset)):(f.setEnd(a.node,a.offset),c.addRange(f))}}}}, +xh=F.ELEMENT_NODE,yh={hasSelectionCapabilities:function(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&("input"===b&&"text"===a.type||"textarea"===b||"true"===a.contentEditable)},getSelectionInformation:function(){var a=ia();return{focusedElem:a,selectionRange:yh.hasSelectionCapabilities(a)?yh.getSelection(a):null}},restoreSelection:function(a){var b=ia(),c=a.focusedElem;a=a.selectionRange;if(b!==c&&fa(document.documentElement,c)){yh.hasSelectionCapabilities(c)&&yh.setSelection(c,a);b= +[];for(a=c;a=a.parentNode;)a.nodeType===xh&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});ha(c);for(c=0;cthis.eventPool.length&&this.eventPool.push(a)}function Yh(a){a.eventPool=[];a.getPooled=Zh;a.release=$h}function ai(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(ai,{data:null});function bi(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(bi,{data:null});var ci=[9,13,27,32],di=l.canUseDOM&&"CompositionEvent"in window,ei=null;l.canUseDOM&&"documentMode"in document&&(ei=document.documentMode);var fi; +if(fi=l.canUseDOM&&"TextEvent"in window&&!ei){var gi=window.opera;fi=!("object"===typeof gi&&"function"===typeof gi.version&&12>=parseInt(gi.version(),10))} +var hi=fi,ii=l.canUseDOM&&(!di||ei&&8=ei),ji=String.fromCharCode(32),ki={beforeInput:{phasedRegistrationNames:{bubbled:"onBeforeInput",captured:"onBeforeInputCapture"},dependencies:["topCompositionEnd","topKeyPress","topTextInput","topPaste"]},compositionEnd:{phasedRegistrationNames:{bubbled:"onCompositionEnd",captured:"onCompositionEndCapture"},dependencies:"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionStart:{phasedRegistrationNames:{bubbled:"onCompositionStart", +captured:"onCompositionStartCapture"},dependencies:"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")},compositionUpdate:{phasedRegistrationNames:{bubbled:"onCompositionUpdate",captured:"onCompositionUpdateCapture"},dependencies:"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown".split(" ")}},li=!1; +function mi(a,b){switch(a){case "topKeyUp":return-1!==ci.indexOf(b.keyCode);case "topKeyDown":return 229!==b.keyCode;case "topKeyPress":case "topMouseDown":case "topBlur":return!0;default:return!1}}function ni(a){a=a.detail;return"object"===typeof a&&"data"in a?a.data:null}var oi=!1;function pi(a,b){switch(a){case "topCompositionEnd":return ni(b);case "topKeyPress":if(32!==b.which)return null;li=!0;return ji;case "topTextInput":return a=b.data,a===ji&&li?null:a;default:return null}} +function qi(a,b){if(oi)return"topCompositionEnd"===a||!di&&mi(a,b)?(a=Vh.getData(),Vh.reset(),oi=!1,a):null;switch(a){case "topPaste":return null;case "topKeyPress":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=document.documentMode,Si={select:{phasedRegistrationNames:{bubbled:"onSelect",captured:"onSelectCapture"}, +dependencies:"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange".split(" ")}},Ti=null,Zi=null,$i=null,aj=!1,bj=M.isListeningToAllDependencies; +function cj(a,b){if(aj||null==Ti||Ti!==ia())return null;var c=Ti;"selectionStart"in c&&zh.hasSelectionCapabilities(c)?c={start:c.selectionStart,end:c.selectionEnd}:window.getSelection?(c=window.getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}):c=void 0;return $i&&ea($i,c)?null:($i=c,a=Y.getPooled(Si.select,Zi,a,b),a.type="select",a.target=Ti,Th.accumulateTwoPhaseDispatches(a),a)} +var dj={eventTypes:Si,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:d.nodeType===Qi?d:d.ownerDocument;if(!e||!bj("onSelect",e))return null;e=b?G.getNodeFromInstance(b):window;switch(a){case "topFocus":if(ti(e)||"true"===e.contentEditable)Ti=e,Zi=b,$i=null;break;case "topBlur":$i=Zi=Ti=null;break;case "topMouseDown":aj=!0;break;case "topContextMenu":case "topMouseUp":return aj=!1,cj(c,d);case "topSelectionChange":if(Ri)break;case "topKeyDown":case "topKeyUp":return cj(c,d)}return null}}; +function ej(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(ej,{animationName:null,elapsedTime:null,pseudoElement:null});function fj(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(fj,{clipboardData:function(a){return"clipboardData"in a?a.clipboardData:window.clipboardData}});function gj(a,b,c,d){return Y.call(this,a,b,c,d)}Ji.augmentClass(gj,{relatedTarget:null});function hj(a){var b=a.keyCode;"charCode"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;return 32<=a||13===a?a:0} +var ij={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},jj={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4", +116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"};function kj(a,b,c,d){return Y.call(this,a,b,c,d)} +Ji.augmentClass(kj,{key:function(a){if(a.key){var b=ij[a.key]||a.key;if("Unidentified"!==b)return b}return"keypress"===a.type?(a=hj(a),13===a?"Enter":String.fromCharCode(a)):"keydown"===a.type||"keyup"===a.type?jj[a.keyCode]||"Unidentified":""},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Mi,charCode:function(a){return"keypress"===a.type?hj(a):0},keyCode:function(a){return"keydown"===a.type||"keyup"===a.type?a.keyCode:0},which:function(a){return"keypress"=== +a.type?hj(a):"keydown"===a.type||"keyup"===a.type?a.keyCode:0}});function lj(a,b,c,d){return Y.call(this,a,b,c,d)}Ni.augmentClass(lj,{dataTransfer:null});function mj(a,b,c,d){return Y.call(this,a,b,c,d)}Ji.augmentClass(mj,{touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Mi});function nj(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(nj,{propertyName:null,elapsedTime:null,pseudoElement:null}); +function oj(a,b,c,d){return Y.call(this,a,b,c,d)}Ni.augmentClass(oj,{deltaX:function(a){return"deltaX"in a?a.deltaX:"wheelDeltaX"in a?-a.wheelDeltaX:0},deltaY:function(a){return"deltaY"in a?a.deltaY:"wheelDeltaY"in a?-a.wheelDeltaY:"wheelDelta"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null});var pj={},qj={}; +"abort animationEnd animationIteration animationStart blur cancel canPlay canPlayThrough click close contextMenu copy cut doubleClick drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error focus input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing progress rateChange reset scroll seeked seeking stalled submit suspend timeUpdate toggle touchCancel touchEnd touchMove touchStart transitionEnd volumeChange waiting wheel".split(" ").forEach(function(a){var b=a[0].toUpperCase()+ +a.slice(1),c="on"+b;b="top"+b;c={phasedRegistrationNames:{bubbled:c,captured:c+"Capture"},dependencies:[b]};pj[a]=c;qj[b]=c}); +var rj={eventTypes:pj,extractEvents:function(a,b,c,d){var e=qj[a];if(!e)return null;switch(a){case "topAbort":case "topCancel":case "topCanPlay":case "topCanPlayThrough":case "topClose":case "topDurationChange":case "topEmptied":case "topEncrypted":case "topEnded":case "topError":case "topInput":case "topInvalid":case "topLoad":case "topLoadedData":case "topLoadedMetadata":case "topLoadStart":case "topPause":case "topPlay":case "topPlaying":case "topProgress":case "topRateChange":case "topReset":case "topSeeked":case "topSeeking":case "topStalled":case "topSubmit":case "topSuspend":case "topTimeUpdate":case "topToggle":case "topVolumeChange":case "topWaiting":var f=Y; +break;case "topKeyPress":if(0===hj(c))return null;case "topKeyDown":case "topKeyUp":f=kj;break;case "topBlur":case "topFocus":f=gj;break;case "topClick":if(2===c.button)return null;case "topDoubleClick":case "topMouseDown":case "topMouseMove":case "topMouseUp":case "topMouseOut":case "topMouseOver":case "topContextMenu":f=Ni;break;case "topDrag":case "topDragEnd":case "topDragEnter":case "topDragExit":case "topDragLeave":case "topDragOver":case "topDragStart":case "topDrop":f=lj;break;case "topTouchCancel":case "topTouchEnd":case "topTouchMove":case "topTouchStart":f= +mj;break;case "topAnimationEnd":case "topAnimationIteration":case "topAnimationStart":f=ej;break;case "topTransitionEnd":f=nj;break;case "topScroll":f=Ji;break;case "topWheel":f=oj;break;case "topCopy":case "topCut":case "topPaste":f=fj}f?void 0:w("86",a);a=f.getPooled(e,b,c,d);Th.accumulateTwoPhaseDispatches(a);return a}};L.setHandleTopLevel(M.handleTopLevel);Jb.injection.injectEventPluginOrder("ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin".split(" ")); +ib.injection.injectComponentTree(G);Jb.injection.injectEventPluginsByName({SimpleEventPlugin:rj,EnterLeaveEventPlugin:Pi,ChangeEventPlugin:Ii,SelectEventPlugin:dj,BeforeInputEventPlugin:ri}); +var sj=A.injection.MUST_USE_PROPERTY,Z=A.injection.HAS_BOOLEAN_VALUE,tj=A.injection.HAS_NUMERIC_VALUE,uj=A.injection.HAS_POSITIVE_NUMERIC_VALUE,vj=A.injection.HAS_STRING_BOOLEAN_VALUE,wj={Properties:{allowFullScreen:Z,allowTransparency:vj,async:Z,autoPlay:Z,capture:Z,checked:sj|Z,cols:uj,contentEditable:vj,controls:Z,"default":Z,defer:Z,disabled:Z,download:A.injection.HAS_OVERLOADED_BOOLEAN_VALUE,draggable:vj,formNoValidate:Z,hidden:Z,loop:Z,multiple:sj|Z,muted:sj|Z,noValidate:Z,open:Z,playsInline:Z, +readOnly:Z,required:Z,reversed:Z,rows:uj,rowSpan:tj,scoped:Z,seamless:Z,selected:sj|Z,size:uj,start:tj,span:uj,spellCheck:vj,style:0,itemScope:Z,acceptCharset:0,className:0,htmlFor:0,httpEquiv:0,value:vj},DOMAttributeNames:{acceptCharset:"accept-charset",className:"class",htmlFor:"for",httpEquiv:"http-equiv"},DOMMutationMethods:{value:function(a,b){if(null==b)return a.removeAttribute("value");"number"!==a.type||!1===a.hasAttribute("value")?a.setAttribute("value",""+b):a.validity&&!a.validity.badInput&& +a.ownerDocument.activeElement!==a&&a.setAttribute("value",""+b)}}},xj=A.injection.HAS_STRING_BOOLEAN_VALUE,yj={xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace"},zj={Properties:{autoReverse:xj,externalResourcesRequired:xj,preserveAlpha:xj},DOMAttributeNames:{autoReverse:"autoReverse",externalResourcesRequired:"externalResourcesRequired",preserveAlpha:"preserveAlpha"},DOMAttributeNamespaces:{xlinkActuate:yj.xlink,xlinkArcrole:yj.xlink,xlinkHref:yj.xlink,xlinkRole:yj.xlink, +xlinkShow:yj.xlink,xlinkTitle:yj.xlink,xlinkType:yj.xlink,xmlBase:yj.xml,xmlLang:yj.xml,xmlSpace:yj.xml}},Aj=/[\-\:]([a-z])/g;function Bj(a){return a[1].toUpperCase()} +"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space".split(" ").forEach(function(a){var b=a.replace(Aj, +Bj);zj.Properties[b]=0;zj.DOMAttributeNames[b]=a});A.injection.injectDOMPropertyConfig(wj);A.injection.injectDOMPropertyConfig(zj); +var Cj=ig.injectInternals,Dj=F.ELEMENT_NODE,Ej=F.TEXT_NODE,Fj=F.COMMENT_NODE,Gj=F.DOCUMENT_NODE,Hj=F.DOCUMENT_FRAGMENT_NODE,Ij=A.ROOT_ATTRIBUTE_NAME,Jj=ka.getChildNamespace,Kj=N.createElement,Lj=N.createTextNode,Mj=N.setInitialProperties,Nj=N.diffProperties,Oj=N.updateProperties,Pj=N.diffHydratedProperties,Qj=N.diffHydratedText,Rj=N.warnForDeletedHydratableElement,Sj=N.warnForDeletedHydratableText,Tj=N.warnForInsertedHydratedElement,Uj=N.warnForInsertedHydratedText,Vj=G.precacheFiberNode,Wj=G.updateFiberProps; +nb.injection.injectFiberControlledHostComponent(N);Dh._injectFiber(function(a){return Xj.findHostInstance(a)});var Yj=null,Zj=null;function ak(a){return!(!a||a.nodeType!==Dj&&a.nodeType!==Gj&&a.nodeType!==Hj&&(a.nodeType!==Fj||" react-mount-point-unstable "!==a.nodeValue))}function bk(a){a=a?a.nodeType===Gj?a.documentElement:a.firstChild:null;return!(!a||a.nodeType!==Dj||!a.hasAttribute(Ij))} +var Xj=function(a){var b=a.getPublicInstance;a=hh(a);var c=a.scheduleUpdate,d=a.getPriorityContext;return{createContainer:function(a){var b=ee();a={current:b,containerInfo:a,isScheduled:!1,nextScheduledRoot:null,context:null,pendingContext:null};return b.stateNode=a},updateContainer:function(a,b,g,h){var e=b.current;g=jh(g);null===b.context?b.context=g:b.pendingContext=g;b=h;h=d(e,ed.enableAsyncSubtreeAPI&&null!=a&&null!=a.type&&null!=a.type.prototype&&!0===a.type.prototype.unstable_isAsyncReactComponent); +a={element:a};kh(e,a,void 0===b?null:b,h);c(e,h)},batchedUpdates:a.batchedUpdates,unbatchedUpdates:a.unbatchedUpdates,deferredUpdates:a.deferredUpdates,flushSync:a.flushSync,getPublicRootInstance:function(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case oh:return b(a.child.stateNode);default:return a.child.stateNode}},findHostInstance:function(a){a=ph(a);return null===a?null:a.stateNode},findHostInstanceWithNoPortals:function(a){a=qh(a);return null===a?null:a.stateNode}}}({getRootHostContext:function(a){if(a.nodeType=== +Gj)a=(a=a.documentElement)?a.namespaceURI:Jj(null,"");else{var b=a.nodeType===Fj?a.parentNode:a;a=b.namespaceURI||null;b=b.tagName;a=Jj(a,b)}return a},getChildHostContext:function(a,b){return Jj(a,b)},getPublicInstance:function(a){return a},prepareForCommit:function(){Yj=M.isEnabled();Zj=zh.getSelectionInformation();M.setEnabled(!1)},resetAfterCommit:function(){zh.restoreSelection(Zj);Zj=null;M.setEnabled(Yj);Yj=null},createInstance:function(a,b,c,d,e){a=Kj(a,b,c,d);Vj(e,a);Wj(a,b);return a},appendInitialChild:function(a, +b){a.appendChild(b)},finalizeInitialChildren:function(a,b,c,d){Mj(a,b,c,d);a:{switch(b){case "button":case "input":case "select":case "textarea":a=!!c.autoFocus;break a}a=!1}return a},prepareUpdate:function(a,b,c,d,e){return Nj(a,b,c,d,e)},commitMount:function(a){a.focus()},commitUpdate:function(a,b,c,d,e){Wj(a,e);Oj(a,b,c,d,e)},shouldSetTextContent:function(a,b){return"textarea"===a||"string"===typeof b.children||"number"===typeof b.children||"object"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&& +"string"===typeof b.dangerouslySetInnerHTML.__html},resetTextContent:function(a){a.textContent=""},shouldDeprioritizeSubtree:function(a,b){return!!b.hidden},createTextInstance:function(a,b,c,d){a=Lj(a,b);Vj(d,a);return a},commitTextUpdate:function(a,b,c){a.nodeValue=c},appendChild:function(a,b){a.appendChild(b)},appendChildToContainer:function(a,b){a.nodeType===Fj?a.parentNode.insertBefore(b,a):a.appendChild(b)},insertBefore:function(a,b,c){a.insertBefore(b,c)},insertInContainerBefore:function(a, +b,c){a.nodeType===Fj?a.parentNode.insertBefore(b,c):a.insertBefore(b,c)},removeChild:function(a,b){a.removeChild(b)},removeChildFromContainer:function(a,b){a.nodeType===Fj?a.parentNode.removeChild(b):a.removeChild(b)},canHydrateInstance:function(a,b){return a.nodeType===Dj&&b===a.nodeName.toLowerCase()},canHydrateTextInstance:function(a,b){return""===b?!1:a.nodeType===Ej},getNextHydratableSibling:function(a){for(a=a.nextSibling;a&&a.nodeType!==Dj&&a.nodeType!==Ej;)a=a.nextSibling;return a},getFirstHydratableChild:function(a){for(a= +a.firstChild;a&&a.nodeType!==Dj&&a.nodeType!==Ej;)a=a.nextSibling;return a},hydrateInstance:function(a,b,c,d,e,f){Vj(f,a);Wj(a,c);return Pj(a,b,c,e,d)},hydrateTextInstance:function(a,b,c){Vj(c,a);return Qj(a,b)},didNotHydrateInstance:function(a,b){1===b.nodeType?Rj(a,b):Sj(a,b)},didNotFindHydratableInstance:function(a,b,c){Tj(a,b,c)},didNotFindHydratableTextInstance:function(a,b){Uj(a,b)},scheduleDeferredCallback:dd.rIC,useSyncScheduling:!0});sb.injection.injectFiberBatchedUpdates(Xj.batchedUpdates); +function ck(a,b,c,d,e){ak(c)?void 0:w("200");var f=c._reactRootContainer;if(f)Xj.updateContainer(b,f,a,e);else{if(!d&&!bk(c))for(d=void 0;d=c.lastChild;)c.removeChild(d);var g=Xj.createContainer(c);f=c._reactRootContainer=g;Xj.unbatchedUpdates(function(){Xj.updateContainer(b,g,a,e)})}return Xj.getPublicRootInstance(f)}function dk(a,b){var c=2K.length&&K.push(a)} +function N(a,b,d,e){var c=typeof a;if("undefined"===c||"boolean"===c)a=null;if(null===a||"string"===c||"number"===c||"object"===c&&a.$$typeof===I)return d(e,a,""===b?"."+O(a,0):b),1;var g=0;b=""===b?".":b+":";if(Array.isArray(a))for(var k=0;k=g.hasBooleanValue+g.hasNumericValue+g.hasOverloadedBooleanValue?void 0:w(\"50\",f);e.hasOwnProperty(f)&&(g.attributeName=e[f]);d.hasOwnProperty(f)&&(g.attributeNamespace=d[f]);a.hasOwnProperty(f)&&(g.mutationMethod=a[f]);xa.properties[f]=\ng}}},xa={ID_ATTRIBUTE_NAME:\"data-reactid\",ROOT_ATTRIBUTE_NAME:\"data-reactroot\",ATTRIBUTE_NAME_START_CHAR:\":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\",ATTRIBUTE_NAME_CHAR:\":A-Z_a-z\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02FF\\\\u0370-\\\\u037D\\\\u037F-\\\\u1FFF\\\\u200C-\\\\u200D\\\\u2070-\\\\u218F\\\\u2C00-\\\\u2FEF\\\\u3001-\\\\uD7FF\\\\uF900-\\\\uFDCF\\\\uFDF0-\\\\uFFFD\\\\-.0-9\\\\u00B7\\\\u0300-\\\\u036F\\\\u203F-\\\\u2040\",\nproperties:{},shouldSetAttribute:function(a,b){if(xa.isReservedProp(a)||!(\"o\"!==a[0]&&\"O\"!==a[0]||\"n\"!==a[1]&&\"N\"!==a[1]))return!1;if(null===b)return!0;switch(typeof b){case \"boolean\":return xa.shouldAttributeAcceptBooleanValue(a);case \"undefined\":case \"number\":case \"string\":case \"object\":return!0;default:return!1}},getPropertyInfo:function(a){return xa.properties.hasOwnProperty(a)?xa.properties[a]:null},shouldAttributeAcceptBooleanValue:function(a){if(xa.isReservedProp(a))return!0;var b=xa.getPropertyInfo(a);\nif(b)return b.hasBooleanValue||b.hasStringBooleanValue||b.hasOverloadedBooleanValue;a=a.toLowerCase().slice(0,5);return\"data-\"===a||\"aria-\"===a},isReservedProp:function(a){return ta.hasOwnProperty(a)},injection:wa},A=xa,E={IndeterminateComponent:0,FunctionalComponent:1,ClassComponent:2,HostRoot:3,HostPortal:4,HostComponent:5,HostText:6,CoroutineComponent:7,CoroutineHandlerPhase:8,YieldComponent:9,Fragment:10},F={ELEMENT_NODE:1,TEXT_NODE:3,COMMENT_NODE:8,DOCUMENT_NODE:9,DOCUMENT_FRAGMENT_NODE:11},\nya=E.HostComponent,za=E.HostText,Aa=F.ELEMENT_NODE,Ba=F.COMMENT_NODE,Ea=A.ID_ATTRIBUTE_NAME,Fa={hasCachedChildNodes:1},Ga=Math.random().toString(36).slice(2),Ha=\"__reactInternalInstance$\"+Ga,Ia=\"__reactEventHandlers$\"+Ga;function La(a){for(var b;b=a._renderedComponent;)a=b;return a}function Ma(a,b){a=La(a);a._hostNode=b;b[Ha]=a}\nfunction Na(a,b){if(!(a._flags&Fa.hasCachedChildNodes)){var c=a._renderedChildren;b=b.firstChild;var d;a:for(d in c)if(c.hasOwnProperty(d)){var e=c[d],f=La(e)._domID;if(0!==f){for(;null!==b;b=b.nextSibling){var g=b,h=f;if(g.nodeType===Aa&&g.getAttribute(Ea)===\"\"+h||g.nodeType===Ba&&g.nodeValue===\" react-text: \"+h+\" \"||g.nodeType===Ba&&g.nodeValue===\" react-empty: \"+h+\" \"){Ma(e,b);continue a}}w(\"32\",f)}}a._flags|=Fa.hasCachedChildNodes}}\nfunction Oa(a){if(a[Ha])return a[Ha];for(var b=[];!a[Ha];)if(b.push(a),a.parentNode)a=a.parentNode;else return null;var c=a[Ha];if(c.tag===ya||c.tag===za)return c;for(;a&&(c=a[Ha]);a=b.pop()){var d=c;b.length&&Na(c,a)}return d}\nvar G={getClosestInstanceFromNode:Oa,getInstanceFromNode:function(a){var b=a[Ha];if(b)return b.tag===ya||b.tag===za?b:b._hostNode===a?b:null;b=Oa(a);return null!=b&&b._hostNode===a?b:null},getNodeFromInstance:function(a){if(a.tag===ya||a.tag===za)return a.stateNode;void 0===a._hostNode?w(\"33\"):void 0;if(a._hostNode)return a._hostNode;for(var b=[];!a._hostNode;)b.push(a),a._hostParent?void 0:w(\"34\"),a=a._hostParent;for(;b.length;a=b.pop())Na(a,a._hostNode);return a._hostNode},precacheChildNodes:Na,\nprecacheNode:Ma,uncacheNode:function(a){var b=a._hostNode;b&&(delete b[Ha],a._hostNode=null)},precacheFiberNode:function(a,b){b[Ha]=a},getFiberCurrentPropsFromNode:function(a){return a[Ia]||null},updateFiberProps:function(a,b){a[Ia]=b}},Pa={remove:function(a){a._reactInternalFiber=void 0},get:function(a){return a._reactInternalFiber},has:function(a){return void 0!==a._reactInternalFiber},set:function(a,b){a._reactInternalFiber=b}},Qa={ReactCurrentOwner:aa.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner};\nfunction Ra(a){if(\"function\"===typeof a.getName)return a.getName();if(\"number\"===typeof a.tag){a=a.type;if(\"string\"===typeof a)return a;if(\"function\"===typeof a)return a.displayName||a.name}return null}var J={NoEffect:0,PerformedWork:1,Placement:2,Update:4,PlacementAndUpdate:6,Deletion:8,ContentReset:16,Callback:32,Err:64,Ref:128},Sa=E.HostComponent,Ta=E.HostRoot,Ua=E.HostPortal,Va=E.HostText,Wa=J.NoEffect,Xa=J.Placement;\nfunction Za(a){var b=a;if(a.alternate)for(;b[\"return\"];)b=b[\"return\"];else{if((b.effectTag&Xa)!==Wa)return 1;for(;b[\"return\"];)if(b=b[\"return\"],(b.effectTag&Xa)!==Wa)return 1}return b.tag===Ta?2:3}function $a(a){2!==Za(a)?w(\"188\"):void 0}\nfunction ab(a){var b=a.alternate;if(!b)return b=Za(a),3===b?w(\"188\"):void 0,1===b?null:a;for(var c=a,d=b;;){var e=c[\"return\"],f=e?e.alternate:null;if(!e||!f)break;if(e.child===f.child){for(var g=e.child;g;){if(g===c)return $a(e),a;if(g===d)return $a(e),b;g=g.sibling}w(\"188\")}if(c[\"return\"]!==d[\"return\"])c=e,d=f;else{g=!1;for(var h=e.child;h;){if(h===c){g=!0;c=e;d=f;break}if(h===d){g=!0;d=e;c=f;break}h=h.sibling}if(!g){for(h=f.child;h;){if(h===c){g=!0;c=f;d=e;break}if(h===d){g=!0;d=f;c=e;break}h=h.sibling}g?\nvoid 0:w(\"189\")}}c.alternate!==d?w(\"190\"):void 0}c.tag!==Ta?w(\"188\"):void 0;return c.stateNode.current===c?a:b}\nvar bb={isFiberMounted:function(a){return 2===Za(a)},isMounted:function(a){return(a=Pa.get(a))?2===Za(a):!1},findCurrentFiberUsingSlowPath:ab,findCurrentHostFiber:function(a){a=ab(a);if(!a)return null;for(var b=a;;){if(b.tag===Sa||b.tag===Va)return b;if(b.child)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null},findCurrentHostFiberWithNoPortals:function(a){a=ab(a);\nif(!a)return null;for(var b=a;;){if(b.tag===Sa||b.tag===Va)return b;if(b.child&&b.tag!==Ua)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;!b.sibling;){if(!b[\"return\"]||b[\"return\"]===a)return null;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}return null}},K={_caughtError:null,_hasCaughtError:!1,_rethrowError:null,_hasRethrowError:!1,injection:{injectErrorUtils:function(a){\"function\"!==typeof a.invokeGuardedCallback?w(\"197\"):void 0;cb=a.invokeGuardedCallback}},invokeGuardedCallback:function(a,\nb,c,d,e,f,g,h,k){cb.apply(K,arguments)},invokeGuardedCallbackAndCatchFirstError:function(a,b,c,d,e,f,g,h,k){K.invokeGuardedCallback.apply(this,arguments);if(K.hasCaughtError()){var p=K.clearCaughtError();K._hasRethrowError||(K._hasRethrowError=!0,K._rethrowError=p)}},rethrowCaughtError:function(){return db.apply(K,arguments)},hasCaughtError:function(){return K._hasCaughtError},clearCaughtError:function(){if(K._hasCaughtError){var a=K._caughtError;K._caughtError=null;K._hasCaughtError=!1;return a}w(\"198\")}};\nfunction cb(a,b,c,d,e,f,g,h,k){K._hasCaughtError=!1;K._caughtError=null;var p=Array.prototype.slice.call(arguments,3);try{b.apply(c,p)}catch(x){K._caughtError=x,K._hasCaughtError=!0}}function db(){if(K._hasRethrowError){var a=K._rethrowError;K._rethrowError=null;K._hasRethrowError=!1;throw a;}}var eb=K,fb;function gb(a,b,c,d){b=a.type||\"unknown-event\";a.currentTarget=hb.getNodeFromInstance(d);eb.invokeGuardedCallbackAndCatchFirstError(b,c,void 0,a);a.currentTarget=null}\nvar hb={isEndish:function(a){return\"topMouseUp\"===a||\"topTouchEnd\"===a||\"topTouchCancel\"===a},isMoveish:function(a){return\"topMouseMove\"===a||\"topTouchMove\"===a},isStartish:function(a){return\"topMouseDown\"===a||\"topTouchStart\"===a},executeDirectDispatch:function(a){var b=a._dispatchListeners,c=a._dispatchInstances;Array.isArray(b)?w(\"103\"):void 0;a.currentTarget=b?hb.getNodeFromInstance(c):null;b=b?b(a):null;a.currentTarget=null;a._dispatchListeners=null;a._dispatchInstances=null;return b},executeDispatchesInOrder:function(a,\nb){var c=a._dispatchListeners,d=a._dispatchInstances;if(Array.isArray(c))for(var e=0;ewb.length&&wb.push(a)}}}},L=yb;function Cb(a,b){null==b?w(\"30\"):void 0;if(null==a)return b;if(Array.isArray(a)){if(Array.isArray(b))return a.push.apply(a,b),a;a.push(b);return a}return Array.isArray(b)?[a].concat(b):[a,b]}\nfunction Db(a,b,c){Array.isArray(a)?a.forEach(b,c):a&&b.call(c,a)}var Eb=null;function Fb(a,b){a&&(ib.executeDispatchesInOrder(a,b),a.isPersistent()||a.constructor.release(a))}function Gb(a){return Fb(a,!0)}function Hb(a){return Fb(a,!1)}\nfunction Ib(a,b,c){switch(a){case \"onClick\":case \"onClickCapture\":case \"onDoubleClick\":case \"onDoubleClickCapture\":case \"onMouseDown\":case \"onMouseDownCapture\":case \"onMouseMove\":case \"onMouseMoveCapture\":case \"onMouseUp\":case \"onMouseUpCapture\":return!(!c.disabled||\"button\"!==b&&\"input\"!==b&&\"select\"!==b&&\"textarea\"!==b);default:return!1}}\nvar Jb={injection:{injectEventPluginOrder:sa.injectEventPluginOrder,injectEventPluginsByName:sa.injectEventPluginsByName},getListener:function(a,b){if(\"number\"===typeof a.tag){var c=a.stateNode;if(!c)return null;var d=ib.getFiberCurrentPropsFromNode(c);if(!d)return null;c=d[b];if(Ib(b,a.type,d))return null}else{d=a._currentElement;if(\"string\"===typeof d||\"number\"===typeof d||!a._rootNodeID)return null;a=d.props;c=a[b];if(Ib(b,d.type,a))return null}c&&\"function\"!==typeof c?w(\"231\",b,typeof c):void 0;\nreturn c},extractEvents:function(a,b,c,d){for(var e,f=sa.plugins,g=0;gc||d.hasOverloadedBooleanValue&&!1===c?gc.deleteValueForProperty(a,\nb):d.mustUseProperty?a[d.propertyName]=c:(b=d.attributeName,(e=d.attributeNamespace)?a.setAttributeNS(e,b,\"\"+c):d.hasBooleanValue||d.hasOverloadedBooleanValue&&!0===c?a.setAttribute(b,\"\"):a.setAttribute(b,\"\"+c))}else gc.setValueForAttribute(a,b,A.shouldSetAttribute(b,c)?c:null)},setValueForAttribute:function(a,b,c){fc(b)&&(null==c?a.removeAttribute(b):a.setAttribute(b,\"\"+c))},deleteValueForAttribute:function(a,b){a.removeAttribute(b)},deleteValueForProperty:function(a,b){var c=A.getPropertyInfo(b);\nc?(b=c.mutationMethod)?b(a,void 0):c.mustUseProperty?a[c.propertyName]=c.hasBooleanValue?!1:\"\":a.removeAttribute(c.attributeName):a.removeAttribute(b)}},hc=gc,ic=Qa.ReactDebugCurrentFrame;function jc(){return null}\nvar kc={current:null,phase:null,resetCurrentFiber:function(){ic.getCurrentStack=null;kc.current=null;kc.phase=null},setCurrentFiber:function(a,b){ic.getCurrentStack=jc;kc.current=a;kc.phase=b},getCurrentFiberOwnerName:function(){return null},getCurrentFiberStackAddendum:jc},lc=kc,mc={getHostProps:function(a,b){var c=b.value,d=b.checked;return n({type:void 0,step:void 0,min:void 0,max:void 0},b,{defaultChecked:void 0,defaultValue:void 0,value:null!=c?c:a._wrapperState.initialValue,checked:null!=d?\nd:a._wrapperState.initialChecked})},initWrapperState:function(a,b){var c=b.defaultValue;a._wrapperState={initialChecked:null!=b.checked?b.checked:b.defaultChecked,initialValue:null!=b.value?b.value:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}},updateWrapper:function(a,b){var c=b.checked;null!=c&&hc.setValueForProperty(a,\"checked\",c||!1);c=b.value;if(null!=c)if(0===c&&\"\"===a.value)a.value=\"0\";else if(\"number\"===b.type){if(b=parseFloat(a.value)||0,c!=b||c==b&&a.value!=\nc)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else null==b.value&&null!=b.defaultValue&&a.defaultValue!==\"\"+b.defaultValue&&(a.defaultValue=\"\"+b.defaultValue),null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)},postMountWrapper:function(a,b){switch(b.type){case \"submit\":case \"reset\":break;case \"color\":case \"date\":case \"datetime\":case \"datetime-local\":case \"month\":case \"time\":case \"week\":a.value=\"\";a.value=a.defaultValue;break;default:a.value=a.value}b=a.name;\"\"!==\nb&&(a.name=\"\");a.defaultChecked=!a.defaultChecked;a.defaultChecked=!a.defaultChecked;\"\"!==b&&(a.name=b)},restoreControlledState:function(a,b){mc.updateWrapper(a,b);var c=b.name;if(\"radio\"===b.type&&null!=c){for(b=a;b.parentNode;)b=b.parentNode;c=b.querySelectorAll(\"input[name\\x3d\"+JSON.stringify(\"\"+c)+'][type\\x3d\"radio\"]');for(b=0;b=b.length?void 0:w(\"93\"),b=b[0]),c=\"\"+b),null==c&&(c=\"\"),d=c);a._wrapperState={initialValue:\"\"+d}},updateWrapper:function(a,b){var c=b.value;null!=c&&(c=\"\"+c,c!==a.value&&(a.value=c),null==b.defaultValue&&(a.defaultValue=c));null!=b.defaultValue&&(a.defaultValue=b.defaultValue)},postMountWrapper:function(a){var b=a.textContent;b===a._wrapperState.initialValue&&(a.value=b)},restoreControlledState:function(a,b){vc.updateWrapper(a,b)}},wc=vc,xc=n({menuitem:!0},{area:!0,\nbase:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function yc(a,b){b&&(xc[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML?w(\"137\",a,\"\"):void 0),null!=b.dangerouslySetInnerHTML&&(null!=b.children?w(\"60\"):void 0,\"object\"===typeof b.dangerouslySetInnerHTML&&\"__html\"in b.dangerouslySetInnerHTML?void 0:w(\"61\")),null!=b.style&&\"object\"!==typeof b.style?w(\"62\",\"\"):void 0)}\nfunction zc(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ac(a){var b=zc(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"function\"===typeof c.get&&\"function\"===typeof c.set)return Object.defineProperty(a,b,{enumerable:c.enumerable,configurable:!0,get:function(){return c.get.call(this)},set:function(a){d=\"\"+a;c.set.call(this,a)}}),{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=null;delete a[b]}}}\nvar Bc={_getTrackerFromNode:function(a){return a._valueTracker},track:function(a){a._valueTracker||(a._valueTracker=Ac(a))},updateValueIfChanged:function(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=zc(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1},stopTracking:function(a){(a=a._valueTracker)&&a.stopTracking()}};\nfunction Cc(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}\nvar Dc=ka.Namespaces,Ec,Fc=function(a){return\"undefined\"!==typeof MSApp&&MSApp.execUnsafeLocalFunction?function(b,c,d,e){MSApp.execUnsafeLocalFunction(function(){return a(b,c,d,e)})}:a}(function(a,b){if(a.namespaceURI!==Dc.svg||\"innerHTML\"in a)a.innerHTML=b;else for(Ec=Ec||document.createElement(\"div\"),Ec.innerHTML=\"\\x3csvg\\x3e\"+b+\"\\x3c/svg\\x3e\",b=Ec.firstChild;b.firstChild;)a.appendChild(b.firstChild)}),Gc=/[\"'&<>]/,Hc=F.TEXT_NODE;\nfunction Ic(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&c.nodeType===Hc){c.nodeValue=b;return}}a.textContent=b}\nl.canUseDOM&&(\"textContent\"in document.documentElement||(Ic=function(a,b){if(a.nodeType===Hc)a.nodeValue=b;else{if(\"boolean\"===typeof b||\"number\"===typeof b)b=\"\"+b;else{b=\"\"+b;var c=Gc.exec(b);if(c){var d=\"\",e,f=0;for(e=c.index;e\nb&&(b=8),$c=b=od(a.last.priorityLevel,b))c=a.last;else for(a=a.first;null!==a&&0>=od(a.priorityLevel,b);)c=a,a=a.next;return c}\nfunction sd(a,b){var c=a.alternate,d=a.updateQueue;null===d&&(d=a.updateQueue=pd());null!==c?(a=c.updateQueue,null===a&&(a=c.updateQueue=pd())):a=null;md=d;nd=a!==d?a:null;var e=md;c=nd;var f=rd(e,b),g=null!==f?f.next:e.first;if(null===c)return qd(e,b,f,g),null;d=rd(c,b);a=null!==d?d.next:c.first;qd(e,b,f,g);if(g===a&&null!==g||f===d&&null!==f)return null===d&&(c.first=b),null===a&&(c.last=null),null;b={priorityLevel:b.priorityLevel,partialState:b.partialState,callback:b.callback,isReplace:b.isReplace,\nisForced:b.isForced,isTopLevelUnmount:b.isTopLevelUnmount,next:null};qd(c,b,d,a);return b}function td(a,b,c,d){a=a.partialState;return\"function\"===typeof a?a.call(b,c,d):a}\nvar ud={addUpdate:function(a,b,c,d){sd(a,{priorityLevel:d,partialState:b,callback:c,isReplace:!1,isForced:!1,isTopLevelUnmount:!1,next:null})},addReplaceUpdate:function(a,b,c,d){sd(a,{priorityLevel:d,partialState:b,callback:c,isReplace:!0,isForced:!1,isTopLevelUnmount:!1,next:null})},addForceUpdate:function(a,b,c){sd(a,{priorityLevel:c,partialState:null,callback:b,isReplace:!1,isForced:!0,isTopLevelUnmount:!1,next:null})},getUpdatePriority:function(a){var b=a.updateQueue;return null===b||a.tag!==\njd&&a.tag!==kd?gd:null!==b.first?b.first.priorityLevel:gd},addTopLevelUpdate:function(a,b,c,d){var e=null===b.element;b={priorityLevel:d,partialState:b,callback:c,isReplace:!1,isForced:!1,isTopLevelUnmount:e,next:null};a=sd(a,b);e&&(e=md,c=nd,null!==e&&null!==b.next&&(b.next=null,e.last=b),null!==c&&null!==a&&null!==a.next&&(a.next=null,c.last=b))},beginUpdateQueue:function(a,b,c,d,e,f,g){null!==a&&a.updateQueue===c&&(c=b.updateQueue={first:c.first,last:c.last,callbackList:null,hasForceUpdate:!1});\na=c.callbackList;for(var h=c.hasForceUpdate,k=!0,p=c.first;null!==p&&0>=od(p.priorityLevel,g);){c.first=p.next;null===c.first&&(c.last=null);var x;if(p.isReplace)e=td(p,d,e,f),k=!0;else if(x=td(p,d,e,f))e=k?n({},e,x):n(e,x),k=!1;p.isForced&&(h=!0);null===p.callback||p.isTopLevelUnmount&&null!==p.next||(a=null!==a?a:[],a.push(p.callback),b.effectTag|=fd);p=p.next}c.callbackList=a;c.hasForceUpdate=h;null!==c.first||null!==a||h||(b.updateQueue=null);return e},commitCallbacks:function(a,b,c){a=b.callbackList;\nif(null!==a)for(b.callbackList=null,b=0;bwd||(a.current=vd[wd],vd[wd]=null,wd--)},push:function(a,b){wd++;vd[wd]=a.current;a.current=b},reset:function(){for(;-1a)?a:b}},ee=de.createHostRootFiber,fe=E.IndeterminateComponent,ge=E.FunctionalComponent,he=E.ClassComponent,\nie=E.HostComponent,je,ke;\"function\"===typeof Symbol&&Symbol[\"for\"]?(je=Symbol[\"for\"](\"react.coroutine\"),ke=Symbol[\"for\"](\"react.yield\")):(je=60104,ke=60105);\nvar le={createCoroutine:function(a,b,c){var d=3r?(p=q,q=null):p=q.sibling;var v=H(a,q,h[r],k);if(null===v){null===q&&(q=p);break}b&&q&&null===v.alternate&&c(a,q);f=g(v,f,r);null===t?m=v:t.sibling=v;t=v;q=p}if(r===h.length)return d(a,q),m;if(null===q){for(;rk?(p=q,q=null):p=q.sibling;var V=H(a,q,v.value,r);if(null===V){q||(q=p);break}b&&\nq&&null===V.alternate&&c(a,q);f=g(V,f,k);null===t?m=V:t.sibling=V;t=V;q=p}if(v.done)return d(a,q),m;if(null===q){for(;!v.done;k++,v=h.next())v=B(a,v.value,r),null!==v&&(f=g(v,f,k),null===t?m=v:t.sibling=v,t=v);return m}for(q=e(a,q);!v.done;k++,v=h.next())if(v=C(q,a,k,v.value,r),null!==v){if(b&&null!==v.alternate)q[\"delete\"](null===v.key?k:v.key);f=g(v,f,k);null===t?m=v:t.sibling=v;t=v}b&&q.forEach(function(b){return c(a,b)});return m}return function(a,b,e,g){var m=\"object\"===typeof e&&null!==e;if(m)switch(e.$$typeof){case Ke:a:{var C=\ne.key;for(m=b;null!==m;){if(m.key===C)if(m.type===e.type){d(a,m.sibling);b=f(m,g);b.ref=Me(m,e);b.pendingProps=e.props;b[\"return\"]=a;a=b;break a}else{d(a,m);break}else c(a,m);m=m.sibling}g=se(e,a.internalContextTag,g);g.ref=Me(b,e);g[\"return\"]=a;a=g}return h(a);case oe:a:{for(m=e.key;null!==b;){if(b.key===m)if(b.tag===De){d(a,b.sibling);b=f(b,g);b.pendingProps=e;b[\"return\"]=a;a=b;break a}else{d(a,b);break}else c(a,b);b=b.sibling}e=ve(e,a.internalContextTag,g);e[\"return\"]=a;a=e}return h(a);case pe:a:{if(null!==\nb)if(b.tag===Ee){d(a,b.sibling);b=f(b,g);b.type=e.value;b[\"return\"]=a;a=b;break a}else d(a,b);b=we(e,a.internalContextTag,g);b.type=e.value;b[\"return\"]=a;a=b}return h(a);case qe:a:{for(m=e.key;null!==b;){if(b.key===m)if(b.tag===Ce&&b.stateNode.containerInfo===e.containerInfo&&b.stateNode.implementation===e.implementation){d(a,b.sibling);b=f(b,g);b.pendingProps=e.children||[];b[\"return\"]=a;a=b;break a}else{d(a,b);break}else c(a,b);b=b.sibling}e=xe(e,a.internalContextTag,g);e[\"return\"]=a;a=e}return h(a)}if(\"string\"===\ntypeof e||\"number\"===typeof e)return e=\"\"+e,null!==b&&b.tag===Be?(d(a,b.sibling),b=f(b,g),b.pendingProps=e,b[\"return\"]=a,a=b):(d(a,b),e=ue(e,a.internalContextTag,g),e[\"return\"]=a,a=e),h(a);if(ye(e))return Ca(a,b,e,g);if(Le(e))return r(a,b,e,g);m&&Ne(a,e);if(\"undefined\"===typeof e)switch(a.tag){case Ae:case ze:e=a.type,w(\"152\",e.displayName||e.name||\"Component\")}return d(a,b)}}\nvar Pe=Oe(!0,!0),Qe=Oe(!1,!0),Re=Oe(!1,!1),Se={reconcileChildFibers:Pe,reconcileChildFibersInPlace:Qe,mountChildFibersInPlace:Re,cloneChildFibers:function(a,b){null!==a&&b.child!==a.child?w(\"153\"):void 0;if(null!==b.child){a=b.child;var c=re(a,a.pendingWorkPriority);c.pendingProps=a.pendingProps;b.child=c;for(c[\"return\"]=b;null!==a.sibling;)a=a.sibling,c=c.sibling=re(a,a.pendingWorkPriority),c.pendingProps=a.pendingProps,c[\"return\"]=b;c.sibling=null}}},Te=J.Update,Ue=Pd.AsyncUpdates,Ve=R.cacheContext,\nWe=R.getMaskedContext,Xe=R.getUnmaskedContext,Ye=R.isContextConsumer,Ze=ud.addUpdate,$e=ud.addReplaceUpdate,af=ud.addForceUpdate,bf=ud.beginUpdateQueue,cf=R.hasContextChanged,df=bb.isMounted;\nfunction ef(a,b,c,d){function e(a,b){b.updater=f;a.stateNode=b;Pa.set(b,a)}var f={isMounted:df,enqueueSetState:function(c,d,e){c=Pa.get(c);var f=b(c,!1);Ze(c,d,void 0===e?null:e,f);a(c,f)},enqueueReplaceState:function(c,d,e){c=Pa.get(c);var f=b(c,!1);$e(c,d,void 0===e?null:e,f);a(c,f)},enqueueForceUpdate:function(c,d){c=Pa.get(c);var e=b(c,!1);af(c,void 0===d?null:d,e);a(c,e)}};return{adoptClassInstance:e,constructClassInstance:function(a,b){var c=a.type,d=Xe(a),f=Ye(a),g=f?We(a,d):da;b=new c(b,g);\ne(a,b);f&&Ve(a,d,g);return b},mountClassInstance:function(a,b){var c=a.alternate,d=a.stateNode,e=d.state||null,g=a.pendingProps;g?void 0:w(\"158\");var h=Xe(a);d.props=g;d.state=e;d.refs=da;d.context=We(a,h);ed.enableAsyncSubtreeAPI&&null!=a.type&&null!=a.type.prototype&&!0===a.type.prototype.unstable_isAsyncReactComponent&&(a.internalContextTag|=Ue);\"function\"===typeof d.componentWillMount&&(h=d.state,d.componentWillMount(),h!==d.state&&f.enqueueReplaceState(d,d.state,null),h=a.updateQueue,null!==\nh&&(d.state=bf(c,a,h,d,e,g,b)));\"function\"===typeof d.componentDidMount&&(a.effectTag|=Te)},updateClassInstance:function(a,b,e){var g=b.stateNode;g.props=b.memoizedProps;g.state=b.memoizedState;var h=b.memoizedProps,k=b.pendingProps;k||(k=h,null==k?w(\"159\"):void 0);var D=g.context,y=Xe(b);y=We(b,y);\"function\"!==typeof g.componentWillReceiveProps||h===k&&D===y||(D=g.state,g.componentWillReceiveProps(k,y),g.state!==D&&f.enqueueReplaceState(g,g.state,null));D=b.memoizedState;e=null!==b.updateQueue?bf(a,\nb,b.updateQueue,g,D,k,e):D;if(!(h!==k||D!==e||cf()||null!==b.updateQueue&&b.updateQueue.hasForceUpdate))return\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&D===a.memoizedState||(b.effectTag|=Te),!1;var B=k;if(null===h||null!==b.updateQueue&&b.updateQueue.hasForceUpdate)B=!0;else{var H=b.stateNode,C=b.type;B=\"function\"===typeof H.shouldComponentUpdate?H.shouldComponentUpdate(B,e,y):C.prototype&&C.prototype.isPureReactComponent?!ea(h,B)||!ea(D,e):!0}B?(\"function\"===typeof g.componentWillUpdate&&\ng.componentWillUpdate(k,e,y),\"function\"===typeof g.componentDidUpdate&&(b.effectTag|=Te)):(\"function\"!==typeof g.componentDidUpdate||h===a.memoizedProps&&D===a.memoizedState||(b.effectTag|=Te),c(b,k),d(b,e));g.props=k;g.state=e;g.context=y;return B}}}\nvar ff=Se.mountChildFibersInPlace,gf=Se.reconcileChildFibers,hf=Se.reconcileChildFibersInPlace,jf=Se.cloneChildFibers,kf=ud.beginUpdateQueue,lf=R.getMaskedContext,mf=R.getUnmaskedContext,nf=R.hasContextChanged,of=R.pushContextProvider,pf=R.pushTopLevelContextObject,qf=R.invalidateContextProvider,rf=E.IndeterminateComponent,sf=E.FunctionalComponent,tf=E.ClassComponent,uf=E.HostRoot,wf=E.HostComponent,xf=E.HostText,yf=E.HostPortal,zf=E.CoroutineComponent,Af=E.CoroutineHandlerPhase,Bf=E.YieldComponent,\nCf=E.Fragment,Df=Q.NoWork,Ef=Q.OffscreenPriority,Ff=J.PerformedWork,Gf=J.Placement,Hf=J.ContentReset,If=J.Err,Jf=J.Ref,Kf=Qa.ReactCurrentOwner;\nfunction Lf(a,b,c,d,e){function f(a,b,c){g(a,b,c,b.pendingWorkPriority)}function g(a,b,c,d){b.child=null===a?ff(b,b.child,c,d):a.child===b.child?gf(b,b.child,c,d):hf(b,b.child,c,d)}function h(a,b){var c=b.ref;null===c||a&&a.ref===c||(b.effectTag|=Jf)}function k(a,b,c,d){h(a,b);if(!c)return d&&qf(b,!1),x(a,b);c=b.stateNode;Kf.current=b;var e=c.render();b.effectTag|=Ff;f(a,b,e);b.memoizedState=c.state;b.memoizedProps=c.props;d&&qf(b,!0);return b.child}function p(a){var b=a.stateNode;b.pendingContext?\npf(a,b.pendingContext,b.pendingContext!==b.context):b.context&&pf(a,b.context,!1);C(a,b.containerInfo)}function x(a,b){jf(a,b);return b.child}function S(a,b){switch(b.tag){case uf:p(b);break;case tf:of(b);break;case yf:C(b,b.stateNode.containerInfo)}return null}var D=a.shouldSetTextContent,y=a.useSyncScheduling,B=a.shouldDeprioritizeSubtree,H=b.pushHostContext,C=b.pushHostContainer,Ca=c.enterHydrationState,r=c.resetHydrationState,m=c.tryToClaimNextHydratableInstance;a=ef(d,e,function(a,b){a.memoizedProps=\nb},function(a,b){a.memoizedState=b});var t=a.adoptClassInstance,v=a.constructClassInstance,V=a.mountClassInstance,ld=a.updateClassInstance;return{beginWork:function(a,b,c){if(b.pendingWorkPriority===Df||b.pendingWorkPriority>c)return S(a,b);switch(b.tag){case rf:null!==a?w(\"155\"):void 0;var d=b.type,e=b.pendingProps,g=mf(b);g=lf(b,g);d=d(e,g);b.effectTag|=Ff;\"object\"===typeof d&&null!==d&&\"function\"===typeof d.render?(b.tag=tf,e=of(b),t(b,d),V(b,c),b=k(a,b,!0,e)):(b.tag=sf,f(a,b,d),b.memoizedProps=\ne,b=b.child);return b;case sf:a:{e=b.type;c=b.pendingProps;d=b.memoizedProps;if(nf())null===c&&(c=d);else if(null===c||d===c){b=x(a,b);break a}d=mf(b);d=lf(b,d);e=e(c,d);b.effectTag|=Ff;f(a,b,e);b.memoizedProps=c;b=b.child}return b;case tf:return e=of(b),d=void 0,null===a?b.stateNode?w(\"153\"):(v(b,b.pendingProps),V(b,c),d=!0):d=ld(a,b,c),k(a,b,d,e);case uf:return p(b),d=b.updateQueue,null!==d?(e=b.memoizedState,d=kf(a,b,d,null,e,null,c),e===d?(r(),b=x(a,b)):(e=d.element,null!==a&&null!==a.child||\n!Ca(b)?(r(),f(a,b,e)):(b.effectTag|=Gf,b.child=ff(b,b.child,e,c)),b.memoizedState=d,b=b.child)):(r(),b=x(a,b)),b;case wf:H(b);null===a&&m(b);e=b.type;var q=b.memoizedProps;d=b.pendingProps;null===d&&(d=q,null===d?w(\"154\"):void 0);g=null!==a?a.memoizedProps:null;nf()||null!==d&&q!==d?(q=d.children,D(e,d)?q=null:g&&D(e,g)&&(b.effectTag|=Hf),h(a,b),c!==Ef&&!y&&B(e,d)?(b.pendingWorkPriority=Ef,b=null):(f(a,b,q),b.memoizedProps=d,b=b.child)):b=x(a,b);return b;case xf:return null===a&&m(b),a=b.pendingProps,\nnull===a&&(a=b.memoizedProps),b.memoizedProps=a,null;case Af:b.tag=zf;case zf:c=b.pendingProps;if(nf())null===c&&(c=a&&a.memoizedProps,null===c?w(\"154\"):void 0);else if(null===c||b.memoizedProps===c)c=b.memoizedProps;e=c.children;d=b.pendingWorkPriority;b.stateNode=null===a?ff(b,b.stateNode,e,d):a.child===b.child?gf(b,b.stateNode,e,d):hf(b,b.stateNode,e,d);b.memoizedProps=c;return b.stateNode;case Bf:return null;case yf:a:{C(b,b.stateNode.containerInfo);c=b.pendingWorkPriority;e=b.pendingProps;if(nf())null===\ne&&(e=a&&a.memoizedProps,null==e?w(\"154\"):void 0);else if(null===e||b.memoizedProps===e){b=x(a,b);break a}null===a?b.child=hf(b,b.child,e,c):f(a,b,e);b.memoizedProps=e;b=b.child}return b;case Cf:a:{c=b.pendingProps;if(nf())null===c&&(c=b.memoizedProps);else if(null===c||b.memoizedProps===c){b=x(a,b);break a}f(a,b,c);b.memoizedProps=c;b=b.child}return b;default:w(\"156\")}},beginFailedWork:function(a,b,c){switch(b.tag){case tf:of(b);break;case uf:p(b);break;default:w(\"157\")}b.effectTag|=If;null===a?\nb.child=null:b.child!==a.child&&(b.child=a.child);if(b.pendingWorkPriority===Df||b.pendingWorkPriority>c)return S(a,b);b.firstEffect=null;b.lastEffect=null;g(a,b,null,c);b.tag===tf&&(a=b.stateNode,b.memoizedProps=a.props,b.memoizedState=a.state);return b.child}}}\nvar Mf=Se.reconcileChildFibers,Nf=R.popContextProvider,Of=R.popTopLevelContextObject,Pf=E.IndeterminateComponent,Qf=E.FunctionalComponent,Rf=E.ClassComponent,Sf=E.HostRoot,Tf=E.HostComponent,Uf=E.HostText,Vf=E.HostPortal,Wf=E.CoroutineComponent,Xf=E.CoroutineHandlerPhase,Yf=E.YieldComponent,Zf=E.Fragment,ag=J.Placement,bg=J.Ref,cg=J.Update,dg=Q.OffscreenPriority;\nfunction eg(a,b,c){var d=a.createInstance,e=a.createTextInstance,f=a.appendInitialChild,g=a.finalizeInitialChildren,h=a.prepareUpdate,k=b.getRootHostContainer,p=b.popHostContext,x=b.getHostContext,S=b.popHostContainer,D=c.prepareToHydrateHostInstance,y=c.prepareToHydrateHostTextInstance,B=c.popHydrationState;return{completeWork:function(a,b,c){var r=b.pendingProps;if(null===r)r=b.memoizedProps;else if(b.pendingWorkPriority!==dg||c===dg)b.pendingProps=null;switch(b.tag){case Qf:return null;case Rf:return Nf(b),\nnull;case Sf:S(b);Of(b);r=b.stateNode;r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null);if(null===a||null===a.child)B(b),b.effectTag&=~ag;return null;case Tf:p(b);c=k();var m=b.type;if(null!==a&&null!=b.stateNode){var t=a.memoizedProps,C=b.stateNode,V=x();r=h(C,m,t,r,c,V);if(b.updateQueue=r)b.effectTag|=cg;a.ref!==b.ref&&(b.effectTag|=bg)}else{if(!r)return null===b.stateNode?w(\"166\"):void 0,null;a=x();if(B(b))D(b,c,a)&&(b.effectTag|=cg);else{a=d(m,r,c,a,b);a:for(t=b.child;null!==\nt;){if(t.tag===Tf||t.tag===Uf)f(a,t.stateNode);else if(t.tag!==Vf&&null!==t.child){t=t.child;continue}if(t===b)break a;for(;null===t.sibling;){if(null===t[\"return\"]||t[\"return\"]===b)break a;t=t[\"return\"]}t=t.sibling}g(a,m,r,c)&&(b.effectTag|=cg);b.stateNode=a}null!==b.ref&&(b.effectTag|=bg)}return null;case Uf:if(a&&null!=b.stateNode)a.memoizedProps!==r&&(b.effectTag|=cg);else{if(\"string\"!==typeof r)return null===b.stateNode?w(\"166\"):void 0,null;a=k();c=x();B(b)?y(b)&&(b.effectTag|=cg):b.stateNode=\ne(r,a,c,b)}return null;case Wf:(r=b.memoizedProps)?void 0:w(\"165\");b.tag=Xf;c=[];a:for((m=b.stateNode)&&(m[\"return\"]=b);null!==m;){if(m.tag===Tf||m.tag===Uf||m.tag===Vf)w(\"164\");else if(m.tag===Yf)c.push(m.type);else if(null!==m.child){m.child[\"return\"]=m;m=m.child;continue}for(;null===m.sibling;){if(null===m[\"return\"]||m[\"return\"]===b)break a;m=m[\"return\"]}m.sibling[\"return\"]=m[\"return\"];m=m.sibling}m=r.handler;r=m(r.props,c);b.child=Mf(b,null!==a?a.child:null,r,b.pendingWorkPriority);return b.child;\ncase Xf:return b.tag=Wf,null;case Yf:return null;case Zf:return null;case Vf:return b.effectTag|=cg,S(b),null;case Pf:w(\"167\");default:w(\"156\")}}}}var fg=null,gg=null;function hg(a){return function(b){try{return a(b)}catch(c){}}}\nvar ig={injectInternals:function(a){if(\"undefined\"===typeof __REACT_DEVTOOLS_GLOBAL_HOOK__)return!1;var b=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!b.supportsFiber)return!0;try{var c=b.inject(a);fg=hg(function(a){return b.onCommitFiberRoot(c,a)});gg=hg(function(a){return b.onCommitFiberUnmount(c,a)})}catch(d){}return!0},onCommitRoot:function(a){\"function\"===typeof fg&&fg(a)},onCommitUnmount:function(a){\"function\"===typeof gg&&gg(a)}},jg=E.ClassComponent,kg=E.HostRoot,lg=E.HostComponent,mg=E.HostText,ng=\nE.HostPortal,og=E.CoroutineComponent,pg=ud.commitCallbacks,qg=ig.onCommitUnmount,rg=J.Placement,sg=J.Update,tg=J.Callback,ug=J.ContentReset;\nfunction vg(a,b){function c(a){var c=a.ref;if(null!==c)try{c(null)}catch(t){b(a,t)}}function d(a){return a.tag===lg||a.tag===kg||a.tag===ng}function e(a){for(var b=a;;)if(g(b),null!==b.child&&b.tag!==ng)b.child[\"return\"]=b,b=b.child;else{if(b===a)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"]}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}function f(a){for(var b=a,c=!1,d=void 0,f=void 0;;){if(!c){c=b[\"return\"];a:for(;;){null===c?w(\"160\"):void 0;switch(c.tag){case lg:d=\nc.stateNode;f=!1;break a;case kg:d=c.stateNode.containerInfo;f=!0;break a;case ng:d=c.stateNode.containerInfo;f=!0;break a}c=c[\"return\"]}c=!0}if(b.tag===lg||b.tag===mg)e(b),f?C(d,b.stateNode):H(d,b.stateNode);else if(b.tag===ng?d=b.stateNode.containerInfo:g(b),null!==b.child){b.child[\"return\"]=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b[\"return\"]||b[\"return\"]===a)return;b=b[\"return\"];b.tag===ng&&(c=!1)}b.sibling[\"return\"]=b[\"return\"];b=b.sibling}}function g(a){\"function\"===\ntypeof qg&&qg(a);switch(a.tag){case jg:c(a);var d=a.stateNode;if(\"function\"===typeof d.componentWillUnmount)try{d.props=a.memoizedProps,d.state=a.memoizedState,d.componentWillUnmount()}catch(t){b(a,t)}break;case lg:c(a);break;case og:e(a.stateNode);break;case ng:f(a)}}var h=a.commitMount,k=a.commitUpdate,p=a.resetTextContent,x=a.commitTextUpdate,S=a.appendChild,D=a.appendChildToContainer,y=a.insertBefore,B=a.insertInContainerBefore,H=a.removeChild,C=a.removeChildFromContainer,Ca=a.getPublicInstance;\nreturn{commitPlacement:function(a){a:{for(var b=a[\"return\"];null!==b;){if(d(b)){var c=b;break a}b=b[\"return\"]}w(\"160\");c=void 0}var e=b=void 0;switch(c.tag){case lg:b=c.stateNode;e=!1;break;case kg:b=c.stateNode.containerInfo;e=!0;break;case ng:b=c.stateNode.containerInfo;e=!0;break;default:w(\"161\")}c.effectTag&ug&&(p(b),c.effectTag&=~ug);a:b:for(c=a;;){for(;null===c.sibling;){if(null===c[\"return\"]||d(c[\"return\"])){c=null;break a}c=c[\"return\"]}c.sibling[\"return\"]=c[\"return\"];for(c=c.sibling;c.tag!==\nlg&&c.tag!==mg;){if(c.effectTag&rg)continue b;if(null===c.child||c.tag===ng)continue b;else c.child[\"return\"]=c,c=c.child}if(!(c.effectTag&rg)){c=c.stateNode;break a}}for(var f=a;;){if(f.tag===lg||f.tag===mg)c?e?B(b,f.stateNode,c):y(b,f.stateNode,c):e?D(b,f.stateNode):S(b,f.stateNode);else if(f.tag!==ng&&null!==f.child){f.child[\"return\"]=f;f=f.child;continue}if(f===a)break;for(;null===f.sibling;){if(null===f[\"return\"]||f[\"return\"]===a)return;f=f[\"return\"]}f.sibling[\"return\"]=f[\"return\"];f=f.sibling}},\ncommitDeletion:function(a){f(a);a[\"return\"]=null;a.child=null;a.alternate&&(a.alternate.child=null,a.alternate[\"return\"]=null)},commitWork:function(a,b){switch(b.tag){case jg:break;case lg:var c=b.stateNode;if(null!=c){var d=b.memoizedProps;a=null!==a?a.memoizedProps:d;var e=b.type,f=b.updateQueue;b.updateQueue=null;null!==f&&k(c,f,e,a,d,b)}break;case mg:null===b.stateNode?w(\"162\"):void 0;c=b.memoizedProps;x(b.stateNode,null!==a?a.memoizedProps:c,c);break;case kg:break;case ng:break;default:w(\"163\")}},\ncommitLifeCycles:function(a,b){switch(b.tag){case jg:var c=b.stateNode;if(b.effectTag&sg)if(null===a)c.props=b.memoizedProps,c.state=b.memoizedState,c.componentDidMount();else{var d=a.memoizedProps;a=a.memoizedState;c.props=b.memoizedProps;c.state=b.memoizedState;c.componentDidUpdate(d,a)}b.effectTag&tg&&null!==b.updateQueue&&pg(b,b.updateQueue,c);break;case kg:a=b.updateQueue;null!==a&&pg(b,a,b.child&&b.child.stateNode);break;case lg:c=b.stateNode;null===a&&b.effectTag&sg&&h(c,b.type,b.memoizedProps,\nb);break;case mg:break;case ng:break;default:w(\"163\")}},commitAttachRef:function(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case lg:b(Ca(c));break;default:b(c)}}},commitDetachRef:function(a){a=a.ref;null!==a&&a(null)}}}var wg=xd.createCursor,xg=xd.pop,yg=xd.push,zg={};\nfunction Ag(a){function b(a){a===zg?w(\"174\"):void 0;return a}var c=a.getChildHostContext,d=a.getRootHostContext,e=wg(zg),f=wg(zg),g=wg(zg);return{getHostContext:function(){return b(e.current)},getRootHostContainer:function(){return b(g.current)},popHostContainer:function(a){xg(e,a);xg(f,a);xg(g,a)},popHostContext:function(a){f.current===a&&(xg(e,a),xg(f,a))},pushHostContainer:function(a,b){yg(g,b,a);b=d(b);yg(f,a,a);yg(e,b,a)},pushHostContext:function(a){var d=b(g.current),h=b(e.current);d=c(h,a.type,\nd);h!==d&&(yg(f,a,a),yg(e,d,a))},resetHostContainer:function(){e.current=zg;g.current=zg}}}var Bg=E.HostComponent,Cg=E.HostText,Dg=E.HostRoot,Eg=J.Deletion,Fg=J.Placement,Gg=de.createFiberFromHostInstanceForDeletion;\nfunction Hg(a){function b(a,b){var c=Gg();c.stateNode=b;c[\"return\"]=a;c.effectTag=Eg;null!==a.lastEffect?(a.lastEffect.nextEffect=c,a.lastEffect=c):a.firstEffect=a.lastEffect=c}function c(a,b){switch(a.tag){case Bg:return f(b,a.type,a.pendingProps);case Cg:return g(b,a.pendingProps);default:return!1}}function d(a){for(a=a[\"return\"];null!==a&&a.tag!==Bg&&a.tag!==Dg;)a=a[\"return\"];y=a}var e=a.shouldSetTextContent,f=a.canHydrateInstance,g=a.canHydrateTextInstance,h=a.getNextHydratableSibling,k=a.getFirstHydratableChild,\np=a.hydrateInstance,x=a.hydrateTextInstance,S=a.didNotHydrateInstance,D=a.didNotFindHydratableInstance;a=a.didNotFindHydratableTextInstance;if(!(f&&g&&h&&k&&p&&x&&S&&D&&a))return{enterHydrationState:function(){return!1},resetHydrationState:function(){},tryToClaimNextHydratableInstance:function(){},prepareToHydrateHostInstance:function(){w(\"175\")},prepareToHydrateHostTextInstance:function(){w(\"176\")},popHydrationState:function(){return!1}};var y=null,B=null,H=!1;return{enterHydrationState:function(a){B=\nk(a.stateNode.containerInfo);y=a;return H=!0},resetHydrationState:function(){B=y=null;H=!1},tryToClaimNextHydratableInstance:function(a){if(H){var d=B;if(d){if(!c(a,d)){d=h(d);if(!d||!c(a,d)){a.effectTag|=Fg;H=!1;y=a;return}b(y,B)}a.stateNode=d;y=a;B=k(d)}else a.effectTag|=Fg,H=!1,y=a}},prepareToHydrateHostInstance:function(a,b,c){b=p(a.stateNode,a.type,a.memoizedProps,b,c,a);a.updateQueue=b;return null!==b?!0:!1},prepareToHydrateHostTextInstance:function(a){return x(a.stateNode,a.memoizedProps,a)},\npopHydrationState:function(a){if(a!==y)return!1;if(!H)return d(a),H=!0,!1;var c=a.type;if(a.tag!==Bg||\"head\"!==c&&\"body\"!==c&&!e(c,a.memoizedProps))for(c=B;c;)b(a,c),c=h(c);d(a);B=y?h(a.stateNode):null;return!0}}}\nvar Ig=R.popContextProvider,Jg=xd.reset,Kg=Qa.ReactCurrentOwner,Lg=de.createWorkInProgress,Mg=de.largerPriority,Ng=ig.onCommitRoot,T=Q.NoWork,Og=Q.SynchronousPriority,U=Q.TaskPriority,Pg=Q.HighPriority,Qg=Q.LowPriority,Rg=Q.OffscreenPriority,Sg=Pd.AsyncUpdates,Tg=J.PerformedWork,Ug=J.Placement,Vg=J.Update,Wg=J.PlacementAndUpdate,Xg=J.Deletion,Yg=J.ContentReset,Zg=J.Callback,$g=J.Err,ah=J.Ref,bh=E.HostRoot,ch=E.HostComponent,dh=E.HostPortal,eh=E.ClassComponent,fh=ud.getUpdatePriority,gh=R.resetContext;\nfunction hh(a){function b(){for(;null!==ma&&ma.current.pendingWorkPriority===T;){ma.isScheduled=!1;var a=ma.nextScheduledRoot;ma.nextScheduledRoot=null;if(ma===zb)return zb=ma=null,z=T,null;ma=a}a=ma;for(var b=null,c=T;null!==a;)a.current.pendingWorkPriority!==T&&(c===T||c>a.current.pendingWorkPriority)&&(c=a.current.pendingWorkPriority,b=a),a=a.nextScheduledRoot;null!==b?(z=c,Jg(),gh(),t(),I=Lg(b.current,c),b!==nc&&(oc=0,nc=b)):(z=T,nc=I=null)}function c(c){Hd=!0;na=null;var d=c.stateNode;d.current===\nc?w(\"177\"):void 0;z!==Og&&z!==U||oc++;Kg.current=null;if(c.effectTag>Tg)if(null!==c.lastEffect){c.lastEffect.nextEffect=c;var e=c.firstEffect}else e=c;else e=c.firstEffect;Ui();for(u=e;null!==u;){var f=!1,g=void 0;try{for(;null!==u;){var h=u.effectTag;h&Yg&&a.resetTextContent(u.stateNode);if(h&ah){var k=u.alternate;null!==k&&Ph(k)}switch(h&~(Zg|$g|Yg|ah|Tg)){case Ug:q(u);u.effectTag&=~Ug;break;case Wg:q(u);u.effectTag&=~Ug;vf(u.alternate,u);break;case Vg:vf(u.alternate,u);break;case Xg:Id=!0,Mh(u),\nId=!1}u=u.nextEffect}}catch(Jd){f=!0,g=Jd}f&&(null===u?w(\"178\"):void 0,x(u,g),null!==u&&(u=u.nextEffect))}Vi();d.current=c;for(u=e;null!==u;){d=!1;e=void 0;try{for(;null!==u;){var Gd=u.effectTag;Gd&(Vg|Zg)&&Nh(u.alternate,u);Gd&ah&&Oh(u);if(Gd&$g)switch(f=u,g=void 0,null!==P&&(g=P.get(f),P[\"delete\"](f),null==g&&null!==f.alternate&&(f=f.alternate,g=P.get(f),P[\"delete\"](f))),null==g?w(\"184\"):void 0,f.tag){case eh:f.stateNode.componentDidCatch(g.error,{componentStack:g.componentStack});break;case bh:null===\nJa&&(Ja=g.error);break;default:w(\"157\")}var m=u.nextEffect;u.nextEffect=null;u=m}}catch(Jd){d=!0,e=Jd}d&&(null===u?w(\"178\"):void 0,x(u,e),null!==u&&(u=u.nextEffect))}Hd=!1;\"function\"===typeof Ng&&Ng(c.stateNode);va&&(va.forEach(H),va=null);b()}function d(a){for(;;){var b=Lh(a.alternate,a,z),c=a[\"return\"],d=a.sibling;var e=a;if(!(e.pendingWorkPriority!==T&&e.pendingWorkPriority>z)){for(var f=fh(e),g=e.child;null!==g;)f=Mg(f,g.pendingWorkPriority),g=g.sibling;e.pendingWorkPriority=f}if(null!==b)return b;\nnull!==c&&(null===c.firstEffect&&(c.firstEffect=a.firstEffect),null!==a.lastEffect&&(null!==c.lastEffect&&(c.lastEffect.nextEffect=a.firstEffect),c.lastEffect=a.lastEffect),a.effectTag>Tg&&(null!==c.lastEffect?c.lastEffect.nextEffect=a:c.firstEffect=a,c.lastEffect=a));if(null!==d)return d;if(null!==c)a=c;else{na=a;break}}return null}function e(a){var b=V(a.alternate,a,z);null===b&&(b=d(a));Kg.current=null;return b}function f(a){var b=ld(a.alternate,a,z);null===b&&(b=d(a));Kg.current=null;return b}\nfunction g(a){p(Rg,a)}function h(){if(null!==P&&0a)){O=z;a:do{if(z<=U)for(;null!==I&&!(I=e(I),null===I&&(null===na?w(\"179\"):void 0,O=U,c(na),O=z,h(),z===T||z>a||z>U)););else if(null!==d)for(;null!==I&&!Ab;)if(1a||zU&&!Bb&&($f(g),Bb=!0);a=Ja;Ya=Ab=Da=!1;nc=Ka=P=Ja=null;oc=0;if(null!==a)throw a;}function x(a,b){var c=Kg.current=null,d=!1,e=!1,f=null;if(a.tag===bh)c=a,S(a)&&(Ya=!0);else for(var g=a[\"return\"];null!==g&&null===c;){g.tag===eh?\"function\"===typeof g.stateNode.componentDidCatch&&\n(d=!0,f=Ra(g),c=g,e=!0):g.tag===bh&&(c=g);if(S(g)){if(Id||null!==va&&(va.has(g)||null!==g.alternate&&va.has(g.alternate)))return null;c=null;e=!1}g=g[\"return\"]}if(null!==c){null===Ka&&(Ka=new Set);Ka.add(c);var h=\"\";g=a;do{a:switch(g.tag){case fe:case ge:case he:case ie:var k=g._debugOwner,m=g._debugSource;var p=Ra(g);var q=null;k&&(q=Ra(k));k=m;p=\"\\n in \"+(p||\"Unknown\")+(k?\" (at \"+k.fileName.replace(/^.*[\\\\\\/]/,\"\")+\":\"+k.lineNumber+\")\":q?\" (created by \"+q+\")\":\"\");break a;default:p=\"\"}h+=p;g=g[\"return\"]}while(g);\ng=h;a=Ra(a);null===P&&(P=new Map);b={componentName:a,componentStack:g,error:b,errorBoundary:d?c.stateNode:null,errorBoundaryFound:d,errorBoundaryName:f,willRetry:e};P.set(c,b);try{console.error(b.error)}catch(Wi){console.error(Wi)}Hd?(null===va&&(va=new Set),va.add(c)):H(c);return c}null===Ja&&(Ja=b);return null}function S(a){return null!==Ka&&(Ka.has(a)||null!==a.alternate&&Ka.has(a.alternate))}function D(a,b){return y(a,b,!1)}function y(a,b){oc>Xi&&(Ya=!0,w(\"185\"));!Da&&b<=z&&(I=null);for(var c=\n!0;null!==a&&c;){c=!1;if(a.pendingWorkPriority===T||a.pendingWorkPriority>b)c=!0,a.pendingWorkPriority=b;null!==a.alternate&&(a.alternate.pendingWorkPriority===T||a.alternate.pendingWorkPriority>b)&&(c=!0,a.alternate.pendingWorkPriority=b);if(null===a[\"return\"])if(a.tag===bh){var d=a.stateNode;b===T||d.isScheduled||(d.isScheduled=!0,zb?zb.nextScheduledRoot=d:ma=d,zb=d);if(!Da)switch(b){case Og:pc?p(Og,null):p(U,null);break;case U:W?void 0:w(\"186\");break;default:Bb||($f(g),Bb=!0)}}else break;a=a[\"return\"]}}\nfunction B(a,b){var c=O;c===T&&(c=!Yi||a.internalContextTag&Sg||b?Qg:Og);return c===Og&&(Da||W)?U:c}function H(a){y(a,U,!0)}var C=Ag(a),Ca=Hg(a),r=C.popHostContainer,m=C.popHostContext,t=C.resetHostContainer,v=Lf(a,C,Ca,D,B),V=v.beginWork,ld=v.beginFailedWork,Lh=eg(a,C,Ca).completeWork;C=vg(a,x);var q=C.commitPlacement,Mh=C.commitDeletion,vf=C.commitWork,Nh=C.commitLifeCycles,Oh=C.commitAttachRef,Ph=C.commitDetachRef,$f=a.scheduleDeferredCallback,Yi=a.useSyncScheduling,Ui=a.prepareForCommit,Vi=a.resetAfterCommit,\nO=T,Da=!1,Ab=!1,W=!1,pc=!1,I=null,z=T,u=null,na=null,ma=null,zb=null,Bb=!1,P=null,Ka=null,va=null,Ja=null,Ya=!1,Hd=!1,Id=!1,Xi=1E3,oc=0,nc=null;return{scheduleUpdate:D,getPriorityContext:B,batchedUpdates:function(a,b){var c=W;W=!0;try{return a(b)}finally{W=c,Da||W||p(U,null)}},unbatchedUpdates:function(a){var b=pc,c=W;pc=W;W=!1;try{return a()}finally{W=c,pc=b}},flushSync:function(a){var b=W,c=O;W=!0;O=Og;try{return a()}finally{W=b,O=c,Da?w(\"187\"):void 0,p(U,null)}},deferredUpdates:function(a){var b=\nO;O=Qg;try{return a()}finally{O=b}}}}function ih(){w(\"196\")}function jh(a){if(!a)return da;a=Pa.get(a);return\"number\"===typeof a.tag?ih(a):a._processChildContext(a._context)}jh._injectFiber=function(a){ih=a};var kh=ud.addTopLevelUpdate,lh=R.findCurrentUnmaskedContext,mh=R.isContextProvider,nh=R.processChildContext,oh=E.HostComponent,ph=bb.findCurrentHostFiber,qh=bb.findCurrentHostFiberWithNoPortals;jh._injectFiber(function(a){var b=lh(a);return mh(a)?nh(a,b,!1):b});var rh=F.TEXT_NODE;\nfunction sh(a){for(;a&&a.firstChild;)a=a.firstChild;return a}function th(a,b){var c=sh(a);a=0;for(var d;c;){if(c.nodeType===rh){d=a+c.textContent.length;if(a<=b&&d>=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=sh(c)}}var uh=null;function vh(){!uh&&l.canUseDOM&&(uh=\"textContent\"in document.documentElement?\"textContent\":\"innerText\");return uh}\nvar wh={getOffsets:function(a){var b=window.getSelection&&window.getSelection();if(!b||0===b.rangeCount)return null;var c=b.anchorNode,d=b.anchorOffset,e=b.focusNode,f=b.focusOffset,g=b.getRangeAt(0);try{g.startContainer.nodeType,g.endContainer.nodeType}catch(k){return null}b=b.anchorNode===b.focusNode&&b.anchorOffset===b.focusOffset?0:g.toString().length;var h=g.cloneRange();h.selectNodeContents(a);h.setEnd(g.startContainer,g.startOffset);a=h.startContainer===h.endContainer&&h.startOffset===h.endOffset?\n0:h.toString().length;g=a+b;b=document.createRange();b.setStart(c,d);b.setEnd(e,f);c=b.collapsed;return{start:c?g:a,end:c?a:g}},setOffsets:function(a,b){if(window.getSelection){var c=window.getSelection(),d=a[vh()].length,e=Math.min(b.start,d);b=void 0===b.end?e:Math.min(b.end,d);!c.extend&&e>b&&(d=b,b=e,e=d);d=th(a,e);a=th(a,b);if(d&&a){var f=document.createRange();f.setStart(d.node,d.offset);c.removeAllRanges();e>b?(c.addRange(f),c.extend(a.node,a.offset)):(f.setEnd(a.node,a.offset),c.addRange(f))}}}},\nxh=F.ELEMENT_NODE,yh={hasSelectionCapabilities:function(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&\"text\"===a.type||\"textarea\"===b||\"true\"===a.contentEditable)},getSelectionInformation:function(){var a=ia();return{focusedElem:a,selectionRange:yh.hasSelectionCapabilities(a)?yh.getSelection(a):null}},restoreSelection:function(a){var b=ia(),c=a.focusedElem;a=a.selectionRange;if(b!==c&&fa(document.documentElement,c)){yh.hasSelectionCapabilities(c)&&yh.setSelection(c,a);b=\n[];for(a=c;a=a.parentNode;)a.nodeType===xh&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});ha(c);for(c=0;cthis.eventPool.length&&this.eventPool.push(a)}function Yh(a){a.eventPool=[];a.getPooled=Zh;a.release=$h}function ai(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(ai,{data:null});function bi(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(bi,{data:null});var ci=[9,13,27,32],di=l.canUseDOM&&\"CompositionEvent\"in window,ei=null;l.canUseDOM&&\"documentMode\"in document&&(ei=document.documentMode);var fi;\nif(fi=l.canUseDOM&&\"TextEvent\"in window&&!ei){var gi=window.opera;fi=!(\"object\"===typeof gi&&\"function\"===typeof gi.version&&12>=parseInt(gi.version(),10))}\nvar hi=fi,ii=l.canUseDOM&&(!di||ei&&8=ei),ji=String.fromCharCode(32),ki={beforeInput:{phasedRegistrationNames:{bubbled:\"onBeforeInput\",captured:\"onBeforeInputCapture\"},dependencies:[\"topCompositionEnd\",\"topKeyPress\",\"topTextInput\",\"topPaste\"]},compositionEnd:{phasedRegistrationNames:{bubbled:\"onCompositionEnd\",captured:\"onCompositionEndCapture\"},dependencies:\"topBlur topCompositionEnd topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionStart:{phasedRegistrationNames:{bubbled:\"onCompositionStart\",\ncaptured:\"onCompositionStartCapture\"},dependencies:\"topBlur topCompositionStart topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")},compositionUpdate:{phasedRegistrationNames:{bubbled:\"onCompositionUpdate\",captured:\"onCompositionUpdateCapture\"},dependencies:\"topBlur topCompositionUpdate topKeyDown topKeyPress topKeyUp topMouseDown\".split(\" \")}},li=!1;\nfunction mi(a,b){switch(a){case \"topKeyUp\":return-1!==ci.indexOf(b.keyCode);case \"topKeyDown\":return 229!==b.keyCode;case \"topKeyPress\":case \"topMouseDown\":case \"topBlur\":return!0;default:return!1}}function ni(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var oi=!1;function pi(a,b){switch(a){case \"topCompositionEnd\":return ni(b);case \"topKeyPress\":if(32!==b.which)return null;li=!0;return ji;case \"topTextInput\":return a=b.data,a===ji&&li?null:a;default:return null}}\nfunction qi(a,b){if(oi)return\"topCompositionEnd\"===a||!di&&mi(a,b)?(a=Vh.getData(),Vh.reset(),oi=!1,a):null;switch(a){case \"topPaste\":return null;case \"topKeyPress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=document.documentMode,Si={select:{phasedRegistrationNames:{bubbled:\"onSelect\",captured:\"onSelectCapture\"},\ndependencies:\"topBlur topContextMenu topFocus topKeyDown topKeyUp topMouseDown topMouseUp topSelectionChange\".split(\" \")}},Ti=null,Zi=null,$i=null,aj=!1,bj=M.isListeningToAllDependencies;\nfunction cj(a,b){if(aj||null==Ti||Ti!==ia())return null;var c=Ti;\"selectionStart\"in c&&zh.hasSelectionCapabilities(c)?c={start:c.selectionStart,end:c.selectionEnd}:window.getSelection?(c=window.getSelection(),c={anchorNode:c.anchorNode,anchorOffset:c.anchorOffset,focusNode:c.focusNode,focusOffset:c.focusOffset}):c=void 0;return $i&&ea($i,c)?null:($i=c,a=Y.getPooled(Si.select,Zi,a,b),a.type=\"select\",a.target=Ti,Th.accumulateTwoPhaseDispatches(a),a)}\nvar dj={eventTypes:Si,extractEvents:function(a,b,c,d){var e=d.window===d?d.document:d.nodeType===Qi?d:d.ownerDocument;if(!e||!bj(\"onSelect\",e))return null;e=b?G.getNodeFromInstance(b):window;switch(a){case \"topFocus\":if(ti(e)||\"true\"===e.contentEditable)Ti=e,Zi=b,$i=null;break;case \"topBlur\":$i=Zi=Ti=null;break;case \"topMouseDown\":aj=!0;break;case \"topContextMenu\":case \"topMouseUp\":return aj=!1,cj(c,d);case \"topSelectionChange\":if(Ri)break;case \"topKeyDown\":case \"topKeyUp\":return cj(c,d)}return null}};\nfunction ej(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(ej,{animationName:null,elapsedTime:null,pseudoElement:null});function fj(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(fj,{clipboardData:function(a){return\"clipboardData\"in a?a.clipboardData:window.clipboardData}});function gj(a,b,c,d){return Y.call(this,a,b,c,d)}Ji.augmentClass(gj,{relatedTarget:null});function hj(a){var b=a.keyCode;\"charCode\"in a?(a=a.charCode,0===a&&13===b&&(a=13)):a=b;return 32<=a||13===a?a:0}\nvar ij={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},jj={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",\n116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"};function kj(a,b,c,d){return Y.call(this,a,b,c,d)}\nJi.augmentClass(kj,{key:function(a){if(a.key){var b=ij[a.key]||a.key;if(\"Unidentified\"!==b)return b}return\"keypress\"===a.type?(a=hj(a),13===a?\"Enter\":String.fromCharCode(a)):\"keydown\"===a.type||\"keyup\"===a.type?jj[a.keyCode]||\"Unidentified\":\"\"},location:null,ctrlKey:null,shiftKey:null,altKey:null,metaKey:null,repeat:null,locale:null,getModifierState:Mi,charCode:function(a){return\"keypress\"===a.type?hj(a):0},keyCode:function(a){return\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0},which:function(a){return\"keypress\"===\na.type?hj(a):\"keydown\"===a.type||\"keyup\"===a.type?a.keyCode:0}});function lj(a,b,c,d){return Y.call(this,a,b,c,d)}Ni.augmentClass(lj,{dataTransfer:null});function mj(a,b,c,d){return Y.call(this,a,b,c,d)}Ji.augmentClass(mj,{touches:null,targetTouches:null,changedTouches:null,altKey:null,metaKey:null,ctrlKey:null,shiftKey:null,getModifierState:Mi});function nj(a,b,c,d){return Y.call(this,a,b,c,d)}Y.augmentClass(nj,{propertyName:null,elapsedTime:null,pseudoElement:null});\nfunction oj(a,b,c,d){return Y.call(this,a,b,c,d)}Ni.augmentClass(oj,{deltaX:function(a){return\"deltaX\"in a?a.deltaX:\"wheelDeltaX\"in a?-a.wheelDeltaX:0},deltaY:function(a){return\"deltaY\"in a?a.deltaY:\"wheelDeltaY\"in a?-a.wheelDeltaY:\"wheelDelta\"in a?-a.wheelDelta:0},deltaZ:null,deltaMode:null});var pj={},qj={};\n\"abort animationEnd animationIteration animationStart blur cancel canPlay canPlayThrough click close contextMenu copy cut doubleClick drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error focus input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing progress rateChange reset scroll seeked seeking stalled submit suspend timeUpdate toggle touchCancel touchEnd touchMove touchStart transitionEnd volumeChange waiting wheel\".split(\" \").forEach(function(a){var b=a[0].toUpperCase()+\na.slice(1),c=\"on\"+b;b=\"top\"+b;c={phasedRegistrationNames:{bubbled:c,captured:c+\"Capture\"},dependencies:[b]};pj[a]=c;qj[b]=c});\nvar rj={eventTypes:pj,extractEvents:function(a,b,c,d){var e=qj[a];if(!e)return null;switch(a){case \"topAbort\":case \"topCancel\":case \"topCanPlay\":case \"topCanPlayThrough\":case \"topClose\":case \"topDurationChange\":case \"topEmptied\":case \"topEncrypted\":case \"topEnded\":case \"topError\":case \"topInput\":case \"topInvalid\":case \"topLoad\":case \"topLoadedData\":case \"topLoadedMetadata\":case \"topLoadStart\":case \"topPause\":case \"topPlay\":case \"topPlaying\":case \"topProgress\":case \"topRateChange\":case \"topReset\":case \"topSeeked\":case \"topSeeking\":case \"topStalled\":case \"topSubmit\":case \"topSuspend\":case \"topTimeUpdate\":case \"topToggle\":case \"topVolumeChange\":case \"topWaiting\":var f=Y;\nbreak;case \"topKeyPress\":if(0===hj(c))return null;case \"topKeyDown\":case \"topKeyUp\":f=kj;break;case \"topBlur\":case \"topFocus\":f=gj;break;case \"topClick\":if(2===c.button)return null;case \"topDoubleClick\":case \"topMouseDown\":case \"topMouseMove\":case \"topMouseUp\":case \"topMouseOut\":case \"topMouseOver\":case \"topContextMenu\":f=Ni;break;case \"topDrag\":case \"topDragEnd\":case \"topDragEnter\":case \"topDragExit\":case \"topDragLeave\":case \"topDragOver\":case \"topDragStart\":case \"topDrop\":f=lj;break;case \"topTouchCancel\":case \"topTouchEnd\":case \"topTouchMove\":case \"topTouchStart\":f=\nmj;break;case \"topAnimationEnd\":case \"topAnimationIteration\":case \"topAnimationStart\":f=ej;break;case \"topTransitionEnd\":f=nj;break;case \"topScroll\":f=Ji;break;case \"topWheel\":f=oj;break;case \"topCopy\":case \"topCut\":case \"topPaste\":f=fj}f?void 0:w(\"86\",a);a=f.getPooled(e,b,c,d);Th.accumulateTwoPhaseDispatches(a);return a}};L.setHandleTopLevel(M.handleTopLevel);Jb.injection.injectEventPluginOrder(\"ResponderEventPlugin SimpleEventPlugin TapEventPlugin EnterLeaveEventPlugin ChangeEventPlugin SelectEventPlugin BeforeInputEventPlugin\".split(\" \"));\nib.injection.injectComponentTree(G);Jb.injection.injectEventPluginsByName({SimpleEventPlugin:rj,EnterLeaveEventPlugin:Pi,ChangeEventPlugin:Ii,SelectEventPlugin:dj,BeforeInputEventPlugin:ri});\nvar sj=A.injection.MUST_USE_PROPERTY,Z=A.injection.HAS_BOOLEAN_VALUE,tj=A.injection.HAS_NUMERIC_VALUE,uj=A.injection.HAS_POSITIVE_NUMERIC_VALUE,vj=A.injection.HAS_STRING_BOOLEAN_VALUE,wj={Properties:{allowFullScreen:Z,allowTransparency:vj,async:Z,autoPlay:Z,capture:Z,checked:sj|Z,cols:uj,contentEditable:vj,controls:Z,\"default\":Z,defer:Z,disabled:Z,download:A.injection.HAS_OVERLOADED_BOOLEAN_VALUE,draggable:vj,formNoValidate:Z,hidden:Z,loop:Z,multiple:sj|Z,muted:sj|Z,noValidate:Z,open:Z,playsInline:Z,\nreadOnly:Z,required:Z,reversed:Z,rows:uj,rowSpan:tj,scoped:Z,seamless:Z,selected:sj|Z,size:uj,start:tj,span:uj,spellCheck:vj,style:0,itemScope:Z,acceptCharset:0,className:0,htmlFor:0,httpEquiv:0,value:vj},DOMAttributeNames:{acceptCharset:\"accept-charset\",className:\"class\",htmlFor:\"for\",httpEquiv:\"http-equiv\"},DOMMutationMethods:{value:function(a,b){if(null==b)return a.removeAttribute(\"value\");\"number\"!==a.type||!1===a.hasAttribute(\"value\")?a.setAttribute(\"value\",\"\"+b):a.validity&&!a.validity.badInput&&\na.ownerDocument.activeElement!==a&&a.setAttribute(\"value\",\"\"+b)}}},xj=A.injection.HAS_STRING_BOOLEAN_VALUE,yj={xlink:\"http://www.w3.org/1999/xlink\",xml:\"http://www.w3.org/XML/1998/namespace\"},zj={Properties:{autoReverse:xj,externalResourcesRequired:xj,preserveAlpha:xj},DOMAttributeNames:{autoReverse:\"autoReverse\",externalResourcesRequired:\"externalResourcesRequired\",preserveAlpha:\"preserveAlpha\"},DOMAttributeNamespaces:{xlinkActuate:yj.xlink,xlinkArcrole:yj.xlink,xlinkHref:yj.xlink,xlinkRole:yj.xlink,\nxlinkShow:yj.xlink,xlinkTitle:yj.xlink,xlinkType:yj.xlink,xmlBase:yj.xml,xmlLang:yj.xml,xmlSpace:yj.xml}},Aj=/[\\-\\:]([a-z])/g;function Bj(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode x-height xlink:actuate xlink:arcrole xlink:href xlink:role xlink:show xlink:title xlink:type xml:base xmlns:xlink xml:lang xml:space\".split(\" \").forEach(function(a){var b=a.replace(Aj,\nBj);zj.Properties[b]=0;zj.DOMAttributeNames[b]=a});A.injection.injectDOMPropertyConfig(wj);A.injection.injectDOMPropertyConfig(zj);\nvar Cj=ig.injectInternals,Dj=F.ELEMENT_NODE,Ej=F.TEXT_NODE,Fj=F.COMMENT_NODE,Gj=F.DOCUMENT_NODE,Hj=F.DOCUMENT_FRAGMENT_NODE,Ij=A.ROOT_ATTRIBUTE_NAME,Jj=ka.getChildNamespace,Kj=N.createElement,Lj=N.createTextNode,Mj=N.setInitialProperties,Nj=N.diffProperties,Oj=N.updateProperties,Pj=N.diffHydratedProperties,Qj=N.diffHydratedText,Rj=N.warnForDeletedHydratableElement,Sj=N.warnForDeletedHydratableText,Tj=N.warnForInsertedHydratedElement,Uj=N.warnForInsertedHydratedText,Vj=G.precacheFiberNode,Wj=G.updateFiberProps;\nnb.injection.injectFiberControlledHostComponent(N);Dh._injectFiber(function(a){return Xj.findHostInstance(a)});var Yj=null,Zj=null;function ak(a){return!(!a||a.nodeType!==Dj&&a.nodeType!==Gj&&a.nodeType!==Hj&&(a.nodeType!==Fj||\" react-mount-point-unstable \"!==a.nodeValue))}function bk(a){a=a?a.nodeType===Gj?a.documentElement:a.firstChild:null;return!(!a||a.nodeType!==Dj||!a.hasAttribute(Ij))}\nvar Xj=function(a){var b=a.getPublicInstance;a=hh(a);var c=a.scheduleUpdate,d=a.getPriorityContext;return{createContainer:function(a){var b=ee();a={current:b,containerInfo:a,isScheduled:!1,nextScheduledRoot:null,context:null,pendingContext:null};return b.stateNode=a},updateContainer:function(a,b,g,h){var e=b.current;g=jh(g);null===b.context?b.context=g:b.pendingContext=g;b=h;h=d(e,ed.enableAsyncSubtreeAPI&&null!=a&&null!=a.type&&null!=a.type.prototype&&!0===a.type.prototype.unstable_isAsyncReactComponent);\na={element:a};kh(e,a,void 0===b?null:b,h);c(e,h)},batchedUpdates:a.batchedUpdates,unbatchedUpdates:a.unbatchedUpdates,deferredUpdates:a.deferredUpdates,flushSync:a.flushSync,getPublicRootInstance:function(a){a=a.current;if(!a.child)return null;switch(a.child.tag){case oh:return b(a.child.stateNode);default:return a.child.stateNode}},findHostInstance:function(a){a=ph(a);return null===a?null:a.stateNode},findHostInstanceWithNoPortals:function(a){a=qh(a);return null===a?null:a.stateNode}}}({getRootHostContext:function(a){if(a.nodeType===\nGj)a=(a=a.documentElement)?a.namespaceURI:Jj(null,\"\");else{var b=a.nodeType===Fj?a.parentNode:a;a=b.namespaceURI||null;b=b.tagName;a=Jj(a,b)}return a},getChildHostContext:function(a,b){return Jj(a,b)},getPublicInstance:function(a){return a},prepareForCommit:function(){Yj=M.isEnabled();Zj=zh.getSelectionInformation();M.setEnabled(!1)},resetAfterCommit:function(){zh.restoreSelection(Zj);Zj=null;M.setEnabled(Yj);Yj=null},createInstance:function(a,b,c,d,e){a=Kj(a,b,c,d);Vj(e,a);Wj(a,b);return a},appendInitialChild:function(a,\nb){a.appendChild(b)},finalizeInitialChildren:function(a,b,c,d){Mj(a,b,c,d);a:{switch(b){case \"button\":case \"input\":case \"select\":case \"textarea\":a=!!c.autoFocus;break a}a=!1}return a},prepareUpdate:function(a,b,c,d,e){return Nj(a,b,c,d,e)},commitMount:function(a){a.focus()},commitUpdate:function(a,b,c,d,e){Wj(a,e);Oj(a,b,c,d,e)},shouldSetTextContent:function(a,b){return\"textarea\"===a||\"string\"===typeof b.children||\"number\"===typeof b.children||\"object\"===typeof b.dangerouslySetInnerHTML&&null!==b.dangerouslySetInnerHTML&&\n\"string\"===typeof b.dangerouslySetInnerHTML.__html},resetTextContent:function(a){a.textContent=\"\"},shouldDeprioritizeSubtree:function(a,b){return!!b.hidden},createTextInstance:function(a,b,c,d){a=Lj(a,b);Vj(d,a);return a},commitTextUpdate:function(a,b,c){a.nodeValue=c},appendChild:function(a,b){a.appendChild(b)},appendChildToContainer:function(a,b){a.nodeType===Fj?a.parentNode.insertBefore(b,a):a.appendChild(b)},insertBefore:function(a,b,c){a.insertBefore(b,c)},insertInContainerBefore:function(a,\nb,c){a.nodeType===Fj?a.parentNode.insertBefore(b,c):a.insertBefore(b,c)},removeChild:function(a,b){a.removeChild(b)},removeChildFromContainer:function(a,b){a.nodeType===Fj?a.parentNode.removeChild(b):a.removeChild(b)},canHydrateInstance:function(a,b){return a.nodeType===Dj&&b===a.nodeName.toLowerCase()},canHydrateTextInstance:function(a,b){return\"\"===b?!1:a.nodeType===Ej},getNextHydratableSibling:function(a){for(a=a.nextSibling;a&&a.nodeType!==Dj&&a.nodeType!==Ej;)a=a.nextSibling;return a},getFirstHydratableChild:function(a){for(a=\na.firstChild;a&&a.nodeType!==Dj&&a.nodeType!==Ej;)a=a.nextSibling;return a},hydrateInstance:function(a,b,c,d,e,f){Vj(f,a);Wj(a,c);return Pj(a,b,c,e,d)},hydrateTextInstance:function(a,b,c){Vj(c,a);return Qj(a,b)},didNotHydrateInstance:function(a,b){1===b.nodeType?Rj(a,b):Sj(a,b)},didNotFindHydratableInstance:function(a,b,c){Tj(a,b,c)},didNotFindHydratableTextInstance:function(a,b){Uj(a,b)},scheduleDeferredCallback:dd.rIC,useSyncScheduling:!0});sb.injection.injectFiberBatchedUpdates(Xj.batchedUpdates);\nfunction ck(a,b,c,d,e){ak(c)?void 0:w(\"200\");var f=c._reactRootContainer;if(f)Xj.updateContainer(b,f,a,e);else{if(!d&&!bk(c))for(d=void 0;d=c.lastChild;)c.removeChild(d);var g=Xj.createContainer(c);f=c._reactRootContainer=g;Xj.unbatchedUpdates(function(){Xj.updateContainer(b,g,a,e)})}return Xj.getPublicRootInstance(f)}function dk(a,b){var c=2K.length&&K.push(a)}\nfunction N(a,b,d,e){var c=typeof a;if(\"undefined\"===c||\"boolean\"===c)a=null;if(null===a||\"string\"===c||\"number\"===c||\"object\"===c&&a.$$typeof===I)return d(e,a,\"\"===b?\".\"+O(a,0):b),1;var g=0;b=\"\"===b?\".\":b+\":\";if(Array.isArray(a))for(var k=0;k - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - -

tradfri adapter settings

- - - - - - - - - - - - -
- - - - - -
- - - - - -
- -

on save adapter restarts with new config immediately

- -
- - + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + +

tradfri adapter settings

+ + + + + + + + + + + + +
+ + + + + +
+ + + + + +
+ +

on save adapter restarts with new config immediately

+ +
+ + + + + + + \ No newline at end of file diff --git a/admin/src/index.test.tsx b/admin/src/index.test.tsx new file mode 100644 index 00000000..f1026c19 --- /dev/null +++ b/admin/src/index.test.tsx @@ -0,0 +1,20 @@ +// React component test +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +// Setup Enzyme adapter +import {configure, shallow} from "enzyme"; +import * as Adapter from "enzyme-adapter-react-16"; +configure({ adapter: new Adapter() }); + +// tslint:disable:no-unused-expression +import { assert, expect } from "chai"; +import sinon from "sinon"; + +describe("tsx dummy test", () => { + + it("renders without crashing", () => { + expect(shallow(
)).to.have.length(1); + }); + +}); diff --git a/admin/src/index.tsx b/admin/src/index.tsx new file mode 100644 index 00000000..6bd6fd0e --- /dev/null +++ b/admin/src/index.tsx @@ -0,0 +1,7 @@ +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +ReactDOM.render( +

Hello, World!

, + document.getElementById("adapter-container"), +); diff --git a/package.json b/package.json index 2e253686..7c24fa4d 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,8 @@ "@types/mocha": "^2.2.43", "@types/node": "^6.0.88", "@types/reflect-metadata": "0.0.5", + "@types/react": "^16.0.10", + "@types/react-dom": "^16.0.1", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", "mocha": "^4.0.0", @@ -33,7 +35,17 @@ "ts-node": "^3.3.0", "tslint": "^5.7.0", "typescript": "^2.5.3", - "node-ssh": "^5.0.0" + "node-ssh": "^5.0.0", + "enzyme": "^3.1.0", + "enzyme-adapter-react-16": "^1.0.1", + "html-webpack-plugin": "^2.30.1", + "react": "^16.0.0", + "react-dom": "^16.0.0", + "react-test-renderer": "^16.0.0", + "sinon": "^4.0.1", + "ts-loader": "^2.3.7", + "tslint-react": "^3.2.0", + "webpack": "^3.6.0" }, "homepage": "https://github.com/AlCalzone/ioBroker.tradfri", "keywords": [ @@ -50,25 +62,32 @@ "url": "https://github.com/AlCalzone/ioBroker.tradfri" }, "scripts": { - "test_js": "node node_modules/mocha/bin/mocha test/*.js", - "test_ts": "node node_modules/mocha/bin/mocha --require ts-node/register --require source-map-support/register src/**/*.test.ts", - "test_package": "node node_modules/mocha/bin/mocha test/testPackageFiles.js", - "prepublishOnly": "npm run test_package", - "test": "npm run test_ts && npm run test_js", - "coverage": "node node_modules/nyc/bin/nyc npm run test_ts", - "lint": "npm run tslint \"src/**/*.ts\"", - "tslint": "tslint", + "build:webpack": "webpack --config webpack.config.js", + "build": "npm run build:webpack", + "watch": "webpack --config webpack.config.js --watch --progress", + "test:js": "node node_modules/mocha/bin/mocha test/*.js", + "test:ts": "node node_modules/mocha/bin/mocha --require ts-node/register --require source-map-support/register src/**/*.test.ts", + "test:tsx": "node node_modules/mocha/bin/mocha --require ts-node/register --require source-map-support/register **/src/**/*.test.tsx", + "test:package": "node node_modules/mocha/bin/mocha test/testPackageFiles.js", + "test": "npm run test:ts && npm run test:tsx", + "prepublishOnly": "npm run test:package", + "coverage": "node node_modules/nyc/bin/nyc npm run test", + "lint:ts": "tslint", + "lint": "npm run lint:ts \"src/**/*.{ts|tsx}\"", "deploy_local": "node build/deploy_local.js" }, "nyc": { "include": [ - "src/**/*.ts" + "src/**/*.ts", + "admin/src/**/*.ts*" ], "exclude": [ - "src/**/*.test.ts" + "src/**/*.test.ts*", + "admin/src/**/*.test.ts*" ], "extension": [ - ".ts" + ".ts", + ".tsx" ], "require": [ "ts-node/register" diff --git a/tsconfig.json b/tsconfig.json index 470fa155..06faf6e9 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,6 +12,8 @@ // "noUnusedLocals": true, // "noUnusedParameters": true, + "jsx": "react", + // enable the new reflection API "experimentalDecorators": true, "emitDecoratorMetadata": true, diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..cfbf1d8b --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,51 @@ +const path = require("path"); +const webpack = require("webpack"); +const HtmlWebpackPlugin = require('html-webpack-plugin'); + +module.exports = { + cache: true, + devtool: "cheap-module-source-map", + entry: { + main: "./admin/src/index.tsx", + vendor: ["react", "react-dom"], + }, + output: { + filename: "./admin/build/[name].bundle.js", + }, + resolve: { + extensions: [".tsx", ".ts", ".jsx", ".js"], + }, + plugins: [ + new webpack.DefinePlugin({ + 'process.env': { + 'NODE_ENV': JSON.stringify('production') + } + }), + new webpack.NamedModulesPlugin(), + new webpack.NamedChunksPlugin((chunk) => { + if (chunk.name) { + return chunk.name; + } + return chunk.modules.map(m => path.relative(m.context, m.request)).join("_"); + }), + new webpack.optimize.CommonsChunkPlugin({ + name: 'vendor', + minChunks: Infinity + }), + new webpack.optimize.CommonsChunkPlugin({ + name: 'runtime' + }), + ], + module: { + rules: [ + // all files with a `.ts` or `.tsx` extension will be handled by `ts-loader` + { + test: /\.tsx?$/, + loader: "ts-loader", + options: { + configFile: "webpack.tsconfig.json", + } + }, + ], + }, +} \ No newline at end of file diff --git a/webpack.tsconfig.json b/webpack.tsconfig.json new file mode 100644 index 00000000..94bf48d3 --- /dev/null +++ b/webpack.tsconfig.json @@ -0,0 +1,26 @@ +{ + "compileOnSave": true, // Automatically build files in Visual Studio (Code), in combination with the watch option + "compilerOptions": { + "declaration": false, + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, // dont compile faulty code + "noImplicitAny": false, // set to true for stricter type checking + "outDir": "admin/build/", + "removeComments": false, + + "jsx": "react", + + // enable the new reflection API + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + + "sourceMap": true, + "sourceRoot": "admin/src/", + "target": "es2015" + //"watch": true + }, + "include": [ + "admin/**/*.ts*" + ] +} From f739612d4e0c356ce25200a9cf9dbdf63fce3734 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 11 Oct 2017 15:46:35 +0200 Subject: [PATCH 12/51] added getGroups hook for the frontend --- build/lib/virtual-group.d.ts | 1 + build/lib/virtual-group.js.map | 2 +- build/main.js | 34 ++++++++++++++++++++++++++++++- build/main.js.map | 2 +- src/lib/virtual-group.ts | 1 + src/main.ts | 37 +++++++++++++++++++++++++++++++++- tsconfig.json | 8 +++++++- 7 files changed, 80 insertions(+), 5 deletions(-) diff --git a/build/lib/virtual-group.d.ts b/build/lib/virtual-group.d.ts index 5f615de4..3f2489ef 100644 --- a/build/lib/virtual-group.d.ts +++ b/build/lib/virtual-group.d.ts @@ -2,6 +2,7 @@ import { LightOperation } from "../ipso/light"; export declare class VirtualGroup { readonly instanceId: number; constructor(instanceId: number); + name: string; onOff: boolean; dimmer: number; colorX: number; diff --git a/build/lib/virtual-group.js.map b/build/lib/virtual-group.js.map index b7943248..ad587919 100644 --- a/build/lib/virtual-group.js.map +++ b/build/lib/virtual-group.js.map @@ -1 +1 @@ -{"version":3,"file":"virtual-group.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["lib/virtual-group.ts"],"names":[],"mappings":";;AACA,uDAA4C;AAE5C;IAEC,YAA4B,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAGvC,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QACjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QACrC,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAC1B,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAL7C,CAAC;IAYD;;OAEG;IACI,KAAK,CAAC,SAAyB;QACrC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,yBAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACjD,CAAC;IACF,CAAC;CACD;AAvBD,oCAuBC"} \ No newline at end of file +{"version":3,"file":"virtual-group.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["lib/virtual-group.ts"],"names":[],"mappings":";;AACA,uDAA4C;AAE5C;IAEC,YAA4B,UAAkB;QAAlB,eAAU,GAAV,UAAU,CAAQ;QAIvC,UAAK,GAAY,KAAK,CAAC,CAAC,SAAS;QACjC,WAAM,GAAW,CAAC,CAAC,CAAC,iBAAiB;QACrC,WAAM,GAAW,CAAC,CAAC,CAAC,MAAM;QAC1B,mBAAc,GAAW,CAAC,CAAC,CAAC,UAAU;IAN7C,CAAC;IAaD;;OAEG;IACI,KAAK,CAAC,SAAyB;QACrC,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,yBAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YAC9C,EAAE,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;gBAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;QACjD,CAAC;IACF,CAAC;CACD;AAxBD,oCAwBC"} \ No newline at end of file diff --git a/build/main.js b/build/main.js index 7e86638d..471a80a7 100644 --- a/build/main.js +++ b/build/main.js @@ -140,7 +140,7 @@ let adapter = utils_1.default.adapter({ // handle the message if (obj) { switch (obj.command) { - case "request": + case "request": { // require the path to be given if (!requireParams("path")) return; @@ -168,6 +168,37 @@ let adapter = utils_1.default.adapter({ }, }); return; + } + case "getGroups": { + // check the given params + const params = obj.message; + // group type must be "real", "virtual" or "both" + const groupType = params.type || "real"; + if (["real", "virtual", "both"].indexOf(groupType) === -1) { + respond({ error: `group type must be "real", "virtual" or "both"` }); + return; + } + const ret = {}; + if (groupType === "real" || groupType === "both") { + for (const [id, group] of object_polyfill_1.entries(groups)) { + ret[id] = { + name: group.group.name, + deviceIDs: group.group.deviceIDs, + type: "real", + }; + } + } + if (groupType === "virtual" || groupType === "both") { + for (const [id, group] of object_polyfill_1.entries(virtualGroups)) { + ret[id] = { + name: group.name, + deviceIDs: group.deviceIDs, + type: "virtual", + }; + } + } + return; + } default: respond(predefinedResponses.ERROR_UNKNOWN_COMMAND); return; @@ -1454,6 +1485,7 @@ function loadVirtualGroups() { const instanceIDs = g.native.instanceIDs; const ret = new virtual_group_1.VirtualGroup(id); ret.deviceIDs = instanceIDs; + ret.name = g.common.name; return [`${id}`, ret]; }))); }); diff --git a/build/main.js.map b/build/main.js.map index c3889073..063dd53f 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index 78a15f1d..09ef7df6 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -6,6 +6,7 @@ export class VirtualGroup { constructor(public readonly instanceId: number) { } + public name: string; public onOff: boolean = false; // public dimmer: number = 0; // [0..254] public colorX: number = 0; // int diff --git a/src/main.ts b/src/main.ts index 383e79ce..8f4cf1ae 100644 --- a/src/main.ts +++ b/src/main.ts @@ -167,7 +167,7 @@ let adapter: ExtendedAdapter = utils.adapter({ // handle the message if (obj) { switch (obj.command) { - case "request": + case "request": {// custom CoAP request // require the path to be given if (!requireParams("path")) return; @@ -198,6 +198,40 @@ let adapter: ExtendedAdapter = utils.adapter({ }, }); return; + } + + case "getGroups": { // get all groups defined on the gateway + // check the given params + const params = obj.message as any; + // group type must be "real", "virtual" or "both" + const groupType = params.type || "real"; + if (["real", "virtual", "both"].indexOf(groupType) === -1) { + respond({ error: `group type must be "real", "virtual" or "both"` }); + return; + } + + const ret = {}; + if (groupType === "real" || groupType === "both") { + for (const [id, group] of entries(groups)) { + ret[id] = { + name: group.group.name, + deviceIDs: group.group.deviceIDs, + type: "real", + }; + } + } + if (groupType === "virtual" || groupType === "both") { + for (const [id, group] of entries(virtualGroups)) { + ret[id] = { + name: group.name, + deviceIDs: group.deviceIDs, + type: "virtual", + }; + } + } + return; + } + default: respond(predefinedResponses.ERROR_UNKNOWN_COMMAND); return; @@ -1601,6 +1635,7 @@ async function loadVirtualGroups(): Promise { const instanceIDs: number[] = g.native.instanceIDs; const ret = new VirtualGroup(id); ret.deviceIDs = instanceIDs; + ret.name = g.common.name; return [`${id}`, ret] as [string, VirtualGroup]; }), )); diff --git a/tsconfig.json b/tsconfig.json index 06faf6e9..85f19d8a 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,5 +23,11 @@ "sourceRoot": "src/", "target": "es2015" //"watch": true - } + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "admin/**/*.ts" + ] } From f57cd66ae50971a52aff7a03d0fb55608a4308b4 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 11 Oct 2017 16:00:42 +0200 Subject: [PATCH 13/51] add getDevice hook for the frontend --- build/main.js | 38 +++++++++++++++++++++++++++++--------- build/main.js.map | 2 +- src/main.ts | 43 +++++++++++++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 20 deletions(-) diff --git a/build/main.js b/build/main.js index 471a80a7..f1250996 100644 --- a/build/main.js +++ b/build/main.js @@ -116,7 +116,7 @@ let adapter = utils_1.default.adapter({ adapter.sendTo(obj.from, obj.command, response, obj.callback); } // some predefined responses so we only have to define them once - const predefinedResponses = { + const responses = { ACK: { error: null }, OK: { error: null, result: "ok" }, ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, @@ -124,6 +124,8 @@ let adapter = utils_1.default.adapter({ return { error: 'missing parameter "' + paramName + '"!' }; }, COMMAND_RUNNING: { error: "command running" }, + RESULT: (result) => ({ error: null, result }), + ERROR: (error) => ({ error }), }; // make required parameters easier function requireParams(...params) { @@ -131,7 +133,7 @@ let adapter = utils_1.default.adapter({ return true; for (const param of params) { if (!(obj.message && obj.message.hasOwnProperty(param))) { - respond(predefinedResponses.MISSING_PARAMETER(param)); + respond(responses.MISSING_PARAMETER(param)); return false; } } @@ -161,12 +163,10 @@ let adapter = utils_1.default.adapter({ } // wait for the CoAP response and respond to the message const resp = yield node_coap_client_1.CoapClient.request(`${requestBase}${params.path}`, params.method, payload); - respond({ - error: null, result: { - code: resp.code.toString(), - payload: parsePayload(resp), - }, - }); + respond(responses.RESULT({ + code: resp.code.toString(), + payload: parsePayload(resp), + })); return; } case "getGroups": { @@ -197,10 +197,30 @@ let adapter = utils_1.default.adapter({ }; } } + respond(responses.RESULT(ret)); + return; + } + case "getDevice": { + // require the id to be given + if (!requireParams("id")) + return; + // check the given params + const params = obj.message; + if (!(params.id in devices)) { + respond(responses.ERROR(`device with id ${params.id} not found`)); + return; + } + const device = devices[params.id]; + // TODO: Do we need more? + const ret = { + name: device.name, + type: accessory_1.AccessoryTypes[device.type], + }; + respond(responses.RESULT(ret)); return; } default: - respond(predefinedResponses.ERROR_UNKNOWN_COMMAND); + respond(responses.ERROR_UNKNOWN_COMMAND); return; } } diff --git a/build/main.js.map b/build/main.js.map index 063dd53f..5f06901a 100644 --- a/build/main.js.map +++ b/build/main.js.map @@ -1 +1 @@ -{"version":3,"file":"main.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"main.js","sourceRoot":"D:/ioBroker.tradfri/src/","sources":["main.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index 8f4cf1ae..0341d1ce 100644 --- a/src/main.ts +++ b/src/main.ts @@ -143,7 +143,7 @@ let adapter: ExtendedAdapter = utils.adapter({ if (obj.callback) adapter.sendTo(obj.from, obj.command, response, obj.callback); } // some predefined responses so we only have to define them once - const predefinedResponses = { + const responses = { ACK: { error: null }, OK: { error: null, result: "ok" }, ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, @@ -151,13 +151,15 @@ let adapter: ExtendedAdapter = utils.adapter({ return { error: 'missing parameter "' + paramName + '"!' }; }, COMMAND_RUNNING: { error: "command running" }, + RESULT: (result) => ({ error: null, result }), + ERROR: (error: string) => ({ error }), }; // make required parameters easier function requireParams(...params: string[]) { if (!(params && params.length)) return true; for (const param of params) { if (!(obj.message && obj.message.hasOwnProperty(param))) { - respond(predefinedResponses.MISSING_PARAMETER(param)); + respond(responses.MISSING_PARAMETER(param)); return false; } } @@ -191,12 +193,10 @@ let adapter: ExtendedAdapter = utils.adapter({ // wait for the CoAP response and respond to the message const resp = await coap.request(`${requestBase}${params.path}`, params.method, payload as Buffer); - respond({ - error: null, result: { - code: resp.code.toString(), - payload: parsePayload(resp), - }, - }); + respond(responses.RESULT({ + code: resp.code.toString(), + payload: parsePayload(resp), + })); return; } @@ -206,7 +206,7 @@ let adapter: ExtendedAdapter = utils.adapter({ // group type must be "real", "virtual" or "both" const groupType = params.type || "real"; if (["real", "virtual", "both"].indexOf(groupType) === -1) { - respond({ error: `group type must be "real", "virtual" or "both"` }); + respond(responses.ERROR(`group type must be "real", "virtual" or "both"`)); return; } @@ -229,11 +229,34 @@ let adapter: ExtendedAdapter = utils.adapter({ }; } } + + respond(responses.RESULT(ret)); + return; + } + + case "getDevice": { // get preprocessed information about a device + // require the id to be given + if (!requireParams("id")) return; + + // check the given params + const params = obj.message as any; + if (!(params.id in devices)) { + respond(responses.ERROR(`device with id ${params.id} not found`)); + return; + } + + const device = devices[params.id]; + // TODO: Do we need more? + const ret = { + name: device.name, + type: AccessoryTypes[device.type], // type as string + }; + respond(responses.RESULT(ret)); return; } default: - respond(predefinedResponses.ERROR_UNKNOWN_COMMAND); + respond(responses.ERROR_UNKNOWN_COMMAND); return; } } From 1e5448a621e4f2589a7294368ad841cdbfa20bbf Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Wed, 11 Oct 2017 23:39:39 +0200 Subject: [PATCH 14/51] rebuilt old admin menu in React --- admin/build/main.bundle.js | 132 +- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/index.html | 62 +- admin/src/fragment.tsx | 3 + admin/src/index.tsx | 55 +- admin/src/settings.tsx | 102 + admin/style.css | 46 + admin/words.js | 8 +- ioBroker.tradfri.njsproj | 26 +- package-lock.json | 6173 +++++++++++++++++++++++++++++ package.json | 20 +- src/deploy_local.ts | 29 +- tslint.json | 5 +- webpack.config.js | 5 + 15 files changed, 6584 insertions(+), 86 deletions(-) create mode 100644 admin/src/fragment.tsx create mode 100644 admin/src/settings.tsx create mode 100644 admin/style.css create mode 100644 package-lock.json diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index f3f803d0..ecf7be0d 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -1,5 +1,19 @@ webpackJsonp(["main"],{ +/***/ "./admin/src/fragment.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +function Fragment(props) { + return props.children; +} +exports.default = Fragment; + + +/***/ }), + /***/ "./admin/src/index.tsx": /***/ (function(module, exports, __webpack_require__) { @@ -8,8 +22,122 @@ webpackJsonp(["main"],{ Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); -ReactDOM.render(React.createElement("h1", null, "Hello, World!"), document.getElementById("adapter-container")); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiRDovaW9Ccm9rZXIudHJhZGZyaS9hZG1pbi9zcmMvIiwic291cmNlcyI6WyJpbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxNQUFNLENBQ2QsZ0RBQXNCLEVBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQyJ9 +// components +const fragment_1 = __webpack_require__("./admin/src/fragment.tsx"); +const settings_1 = __webpack_require__("./admin/src/settings.tsx"); +const $window = window; +const namespace = `tradfri.${$window.instance}`; +// layout components +function Header() { + return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, "Tradfri adapter settings")); +} +function Root(props) { + return (React.createElement(fragment_1.default, null, + React.createElement(Header, null), + React.createElement(settings_1.Settings, { settings: props.settings, onChange: props.onChange }))); +} +let curSettings; +// the function loadSettings has to exist ... +$window.load = (settings, onChange) => { + const settingsChanged = (newSettings, hasChanges) => { + curSettings = newSettings; + onChange(hasChanges); + console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); + }; + ReactDOM.render(React.createElement(Root, { settings: settings, onChange: settingsChanged }), document.getElementById("adapter-container")); + // Signal to admin, that no changes yet + onChange(false); +}; +// ... and the function save has to exist. +// you have to make sure the callback is called with the settings object as first param! +$window.save = (callback) => { + // save the settings + callback(curSettings); +}; + + +/***/ }), + +/***/ "./admin/src/settings.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const $window = window; +const fragment_1 = __webpack_require__("./admin/src/fragment.tsx"); +/** Helper component for a settings label */ +function Label(props) { + return React.createElement("label", { htmlFor: props.for, className: ["translate"].concat(...(props.class || [])).join(" ") }, + props.text, + " "); +} +/** Helper component for a tooltip */ +function Tooltip(props) { + return React.createElement("img", { className: "admin-tooltip-icon", src: "../../img/info.png", title: props.text }); +} +class Settings extends React.Component { + constructor(props) { + super(props); + // settings are our state + this.state = Object.assign({}, props.settings); + // remember the original settings + this.originalSettings = Object.assign({}, props.settings); + // setup change handlers + this.handleChange = this.handleChange.bind(this); + } + // gets called when the form elements are changed by the user + handleChange(event) { + const target = event.target; // TODO: more types + // store the setting + this.putSetting(target.id, target.value, () => { + // and notify the admin UI about changes + this.props.onChange(this.state, this.hasChanges()); + }); + } + /** + * Reads a setting from the state object and transforms the value into the correct format + * @param key The setting key to lookup + */ + getSetting(key) { + return this.state[key]; + } + /** + * Saves a setting in the state object and transforms the value into the correct format + * @param key The setting key to store at + */ + putSetting(key, value, callback) { + this.setState({ [key]: value }, callback); + } + /** + * Checks if any setting was changed + */ + hasChanges() { + for (const key of Object.keys(this.originalSettings)) { + if (this.originalSettings[key] !== this.state[key]) + return true; + } + return false; + } + onSave() { + return this.state; + } + render() { + return (React.createElement(fragment_1.default, null, + React.createElement("h4", { key: "header", className: "translate" }, "Settings"), + React.createElement("p", { key: "content", className: "settings-table" }, + React.createElement(Label, { for: "host", text: "Gateway IP/Hostname:" }), + React.createElement(Tooltip, { text: "Der Hostname ist \"gw-\" gefolgt von der MAC-Adresse bzw. Seriennummer des Gateways, ohne Sonderzeichen, z.B. gw-a0b1c2d3e4f5. Er findet sich auf der Unterseite des Gateways" }), + React.createElement("input", { className: "value", id: "host", value: this.getSetting("host"), onChange: this.handleChange }), + React.createElement("br", null), + React.createElement(Label, { for: "securityCode", text: "Security-Code:" }), + React.createElement(Tooltip, { text: "Der Security-Code findet sich auf der Unterseite des Gateways" }), + React.createElement("input", { className: "value", id: "securityCode", value: this.getSetting("securityCode"), onChange: this.handleChange })))); + } +} +exports.Settings = Settings; + /***/ }) diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 36dfeb01..e9d376e1 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/index.tsx"],"sourcesContent":["\"use strict\";\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nconst React = require(\"react\");\r\nconst ReactDOM = require(\"react-dom\");\r\nReactDOM.render(React.createElement(\"h1\", null, \"Hello, World!\"), document.getElementById(\"adapter-container\"));\r\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiRDovaW9Ccm9rZXIudHJhZGZyaS9hZG1pbi9zcmMvIiwic291cmNlcyI6WyJpbmRleC50c3giXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwrQkFBK0I7QUFDL0Isc0NBQXNDO0FBRXRDLFFBQVEsQ0FBQyxNQUFNLENBQ2QsZ0RBQXNCLEVBQ3RCLFFBQVEsQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FDNUMsQ0FBQyJ9\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./admin/src/index.tsx\n// module id = ./admin/src/index.tsx\n// module chunks = main"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/fragment.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/fragment.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./fragment\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./settings\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nconst $window = window as any;\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrDA;AAGA;AAEA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index e3c4efb6..31d62ed0 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 0080a4a9c615b1aac533"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 0080a4a9c615b1aac533"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap e80e2e342a4a968bf8e4"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e80e2e342a4a968bf8e4"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/index.html b/admin/index.html index 346631d4..2b16b463 100644 --- a/admin/index.html +++ b/admin/index.html @@ -1,5 +1,7 @@ + + @@ -21,55 +23,19 @@ + + + - - - - - -
- + @@ -110,4 +74,6 @@ + + \ No newline at end of file diff --git a/admin/src/fragment.tsx b/admin/src/fragment.tsx new file mode 100644 index 00000000..25b89f43 --- /dev/null +++ b/admin/src/fragment.tsx @@ -0,0 +1,3 @@ +export default function Fragment(props) { + return props.children; +} diff --git a/admin/src/index.tsx b/admin/src/index.tsx index 6bd6fd0e..fd4fda1c 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -1,7 +1,54 @@ +// root objects +import * as $ from "jquery"; import * as React from "react"; import * as ReactDOM from "react-dom"; -ReactDOM.render( -

Hello, World!

, - document.getElementById("adapter-container"), -); +// components +import Fragment from "./fragment"; +import { OnSettingsChangedCallback, Settings } from "./settings"; + +const $window = window as any; +const namespace = `tradfri.${$window.instance}`; + +// layout components +function Header() { + return ( +

Tradfri adapter settings

+ ); +} + +function Root(props) { + return ( + +
+ + + ); +} + +let curSettings: any; + +// the function loadSettings has to exist ... +$window.load = (settings, onChange) => { + + const settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => { + curSettings = newSettings; + onChange(hasChanges); + console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); + }; + + ReactDOM.render( + , + document.getElementById("adapter-container"), + ); + + // Signal to admin, that no changes yet + onChange(false); +}; + +// ... and the function save has to exist. +// you have to make sure the callback is called with the settings object as first param! +$window.save = (callback) => { + // save the settings + callback(curSettings); +}; diff --git a/admin/src/settings.tsx b/admin/src/settings.tsx new file mode 100644 index 00000000..5834f8a2 --- /dev/null +++ b/admin/src/settings.tsx @@ -0,0 +1,102 @@ +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +const $window = window as any; + +import Fragment from "./fragment"; + +export type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void; + +interface SettingsProps { + onChange: OnSettingsChangedCallback; + settings: DictionaryLike; +} + +interface DictionaryLike { + [key: string]: T; +} + +/** Helper component for a settings label */ +function Label(props) { + return ; +} +/** Helper component for a tooltip */ +function Tooltip(props) { + return ; +} + +export class Settings extends React.Component> { + + constructor(props: SettingsProps) { + super(props); + // settings are our state + this.state = { + ...props.settings, + }; + // remember the original settings + this.originalSettings = {...props.settings}; + + // setup change handlers + this.handleChange = this.handleChange.bind(this); + } + + private onChange: OnSettingsChangedCallback; + private originalSettings: DictionaryLike; + + // gets called when the form elements are changed by the user + private handleChange(event: React.FormEvent) { + const target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types + + // store the setting + this.putSetting(target.id, target.value, () => { + // and notify the admin UI about changes + this.props.onChange(this.state, this.hasChanges()); + }); + } + + /** + * Reads a setting from the state object and transforms the value into the correct format + * @param key The setting key to lookup + */ + private getSetting(key: string): string | number | string[] { + return this.state[key] as any; + } + /** + * Saves a setting in the state object and transforms the value into the correct format + * @param key The setting key to store at + */ + private putSetting(key: string, value: string | number | string[], callback?: () => void): void { + this.setState({[key]: value as any}, callback); + } + + /** + * Checks if any setting was changed + */ + private hasChanges(): boolean { + for (const key of Object.keys(this.originalSettings)) { + if (this.originalSettings[key] !== this.state[key]) return true; + } + return false; + } + + public onSave(): any { + return this.state; + } + + public render() { + return ( + +

Settings

+

+

+
+ ); + } +} diff --git a/admin/style.css b/admin/style.css new file mode 100644 index 00000000..8e0350f6 --- /dev/null +++ b/admin/style.css @@ -0,0 +1,46 @@ +* { + box-sizing: border-box +} +#adapter-container { + font-size: initial; + padding: 0 0.5em; +} +#adapter-container > * { + width: 100%; +} +div.loading:first-child { + margin-top: 2em; +} +div.loading { + text-align: center; +} + +[data-role="adapter-name"] { + min-height: 64px; + padding-left: 80px; + vertical-align: middle; + background-image: url(tradfri.png); + background-size: 64px auto; + background-position: left center; + background-repeat: no-repeat; +} +[data-role="adapter-name"]::before { + content: ""; + display: inline-block; + height: 64px; + vertical-align: middle; +} +.settings-table > * { + display: inline-block; +} +.settings-table > label { + min-width: 25%; + white-space: nowrap; +} +.settings-table > .admin-tooltip-icon { + margin-right: 0.25em; +} +.settings-table > label ~ span { + font-size: 80%; + padding-left: 1em; +} diff --git a/admin/words.js b/admin/words.js index 52168fb2..f0a23fe3 100644 --- a/admin/words.js +++ b/admin/words.js @@ -1,5 +1,9 @@ // Dictionary (systemDictionary is global variable from adapter-settings.js) systemDictionary = { + "loading...": { + "de": "Lade Einstellungen...", + "en": "loading settings..." + }, "tradfri adapter settings": { "de": "Einstellungen für Trådfri-Adapter", "en": "Trådfri adapter settings" @@ -12,8 +16,4 @@ systemDictionary = { "de": "Der Security-Code findet sich auf der Unterseite des Gateways", "en": "The security code can be found on the bottom of the gateway" }, - "on save adapter restarts with new config immediately": { - "de": "Beim Speichern von Einstellungen der Adapter wird sofort neu gestartet.", - "ru": "Ñðàçó ïîñëå ñîõðàíåíèÿ íàñòðîåê äðàéâåð ïåðåçàïóñòèòüñÿ ñ íîâûìè çíà÷åíèÿìè" - } }; \ No newline at end of file diff --git a/ioBroker.tradfri.njsproj b/ioBroker.tradfri.njsproj index 349510e2..6c0fd16d 100644 --- a/ioBroker.tradfri.njsproj +++ b/ioBroker.tradfri.njsproj @@ -5,7 +5,7 @@ 2.0 {53e51c2f-73aa-4803-9a77-5431efc98998} - ProjectFiles + ShowAllFiles . . @@ -20,9 +20,17 @@ + + + + + + + + @@ -30,17 +38,27 @@ + + + + + + + + + + @@ -64,7 +82,10 @@ + + + @@ -75,7 +96,6 @@ - @@ -89,6 +109,8 @@ + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..ff0788ef --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6173 @@ +{ + "name": "iobroker.tradfri", + "version": "0.5.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/chai": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.4.tgz", + "integrity": "sha512-cvU0HomQ7/aGDQJZsbtJXqBQ7w4J4TqLB0Z/h8mKrpRjfeZEvTbygkfJEb7fWdmwpIeDeFmIVwAEqS0OYuUv3Q==", + "dev": true + }, + "@types/chai-as-promised": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", + "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "dev": true, + "requires": { + "@types/chai": "4.0.4" + } + }, + "@types/mocha": { + "version": "2.2.43", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.43.tgz", + "integrity": "sha512-xNlAmH+lRJdUMXClMTI9Y0pRqIojdxfm7DHsIxoB2iTzu3fnPmSMEN8SsSx0cdwV36d02PWCWaDUoZPDSln+xw==", + "dev": true + }, + "@types/node": { + "version": "6.0.88", + "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz", + "integrity": "sha512-bYDPZTX0/s1aihdjLuAgogUAT5M+TpoWChEMea2p0yOcfn5bu3k6cJb9cp6nw268XeSNIGGr+4+/8V5K6BGzLQ==", + "dev": true + }, + "@types/react": { + "version": "16.0.10", + "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.10.tgz", + "integrity": "sha512-2/Qd50RYot1536DXqIyAtxiWRhFErArHRLZgshrrj28lTJsWdvSL/gumB60YqZ3yLbdnAOkbFOE/hOLy6SPjnw==", + "dev": true + }, + "@types/react-dom": { + "version": "16.0.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.1.tgz", + "integrity": "sha512-O5dIzvPKbOfm8OLH5my7hKWzL6zw45p63QinEQo7XuLKcr1zmD+A4wrOAkefMRfjfnCn08PRQT/MNF/4nkMP/Q==", + "dev": true, + "requires": { + "@types/node": "6.0.88", + "@types/react": "16.0.10" + } + }, + "@types/reflect-metadata": { + "version": "https://registry.npmjs.org/@types/reflect-metadata/-/reflect-metadata-0.0.5.tgz", + "integrity": "sha1-nAQr+pgD1Xeq1PV9+8pLfK5Chv4=", + "dev": true + }, + "acorn": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", + "dev": true + }, + "acorn-dynamic-import": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", + "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "dev": true, + "requires": { + "acorn": "4.0.13" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", + "dev": true + } + } + }, + "ajv": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", + "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "json-schema-traverse": "0.3.1", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", + "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "asn1.js": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", + "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "assert": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", + "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "dev": true, + "requires": { + "util": "0.10.3" + } + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", + "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", + "dev": true + }, + "big.js": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", + "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "dev": true + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "bn.js": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", + "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", + "dev": true + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "browserify-aes": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.0.8.tgz", + "integrity": "sha512-WYCMOT/PtGTlpOKFht0YJFYcPy6pLCR98CtWfzK13zoynLlBMvAdEMSRGmgnJCw2M2j/5qxBkinZQFobieM8dQ==", + "dev": true, + "requires": { + "buffer-xor": "1.0.3", + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "browserify-cipher": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", + "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "dev": true, + "requires": { + "browserify-aes": "1.0.8", + "browserify-des": "1.0.0", + "evp_bytestokey": "1.0.3" + } + }, + "browserify-des": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", + "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "des.js": "1.0.0", + "inherits": "2.0.3" + } + }, + "browserify-rsa": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", + "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "randombytes": "2.0.5" + } + }, + "browserify-sign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", + "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "elliptic": "6.4.0", + "inherits": "2.0.3", + "parse-asn1": "5.1.0" + } + }, + "browserify-zlib": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", + "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", + "dev": true, + "requires": { + "pako": "0.2.9" + } + }, + "buffer": { + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", + "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", + "dev": true, + "requires": { + "base64-js": "1.2.1", + "ieee754": "1.1.8", + "isarray": "1.0.0" + } + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "dev": true, + "requires": { + "no-case": "2.3.2", + "upper-case": "1.1.3" + } + }, + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + } + }, + "chai": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", + "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", + "dev": true, + "requires": { + "assertion-error": "1.0.2", + "check-error": "1.0.2", + "deep-eql": "3.0.1", + "get-func-name": "2.0.0", + "pathval": "1.1.0", + "type-detect": "4.0.3" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "dev": true, + "requires": { + "check-error": "1.0.2" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + }, + "dependencies": { + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + } + } + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "cheerio": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", + "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-serializer": "0.1.0", + "entities": "1.1.1", + "htmlparser2": "3.9.2", + "lodash": "4.17.4", + "parse5": "3.0.2" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "clean-css": { + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", + "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "dev": true, + "requires": { + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "color-convert": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", + "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "create-ecdh": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", + "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "elliptic": "6.4.0" + } + }, + "create-hash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", + "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "sha.js": "2.4.9" + } + }, + "create-hmac": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", + "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "dev": true, + "requires": { + "cipher-base": "1.0.4", + "create-hash": "1.1.3", + "inherits": "2.0.3", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + } + }, + "crypto-browserify": { + "version": "3.11.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", + "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", + "dev": true, + "requires": { + "browserify-cipher": "1.0.0", + "browserify-sign": "4.0.4", + "create-ecdh": "4.0.0", + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "diffie-hellman": "5.0.2", + "inherits": "2.0.3", + "pbkdf2": "3.0.14", + "public-encrypt": "4.0.0", + "randombytes": "2.0.5" + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.31" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "dev": true, + "requires": { + "type-detect": "4.0.3" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "des.js": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", + "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "diffie-hellman": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", + "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "miller-rabin": "4.0.1", + "randombytes": "2.0.5" + } + }, + "discontinuous-range": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", + "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", + "dev": true + }, + "dom-converter": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", + "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", + "dev": true, + "requires": { + "utila": "0.3.3" + }, + "dependencies": { + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domain-browser": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", + "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "dev": true + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", + "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "elliptic": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", + "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0", + "hash.js": "1.1.3", + "hmac-drbg": "1.0.1", + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "dev": true, + "requires": { + "iconv-lite": "0.4.19" + } + }, + "enhanced-resolve": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", + "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "memory-fs": "0.4.1", + "object-assign": "4.1.1", + "tapable": "0.2.8" + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "enzyme": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.1.0.tgz", + "integrity": "sha1-2MqECFeQ+87G7UC63RRHj67kwlo=", + "dev": true, + "requires": { + "cheerio": "1.0.0-rc.2", + "function.prototype.name": "1.0.3", + "is-subset": "0.1.1", + "lodash": "4.17.4", + "object-is": "1.0.1", + "object.assign": "4.0.4", + "object.entries": "1.0.4", + "object.values": "1.0.4", + "raf": "3.4.0", + "rst-selector-parser": "2.2.2" + } + }, + "enzyme-adapter-react-16": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.1.tgz", + "integrity": "sha1-Bmyxc15l2NlYQaAj+U2rPOYQnhc=", + "dev": true, + "requires": { + "enzyme-adapter-utils": "1.0.1", + "lodash": "4.17.4", + "object.assign": "4.0.4", + "object.values": "1.0.4", + "prop-types": "15.6.0" + } + }, + "enzyme-adapter-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz", + "integrity": "sha1-/NgSIzOaVaMS91UmQeBFxAQIQAk=", + "dev": true, + "requires": { + "lodash": "4.17.4", + "object.assign": "4.0.4", + "prop-types": "15.6.0" + } + }, + "errno": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", + "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "dev": true, + "requires": { + "prr": "0.0.0" + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", + "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "es5-ext": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.31.tgz", + "integrity": "sha1-e7k4yVp/G59ygJLcCcQe3MOY7v4=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-plugin-node": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz", + "integrity": "sha512-N9FLFwknT5LhRhjz1lmHguNss/MCwkrLCS4CjqqTZZTJaUhLRfDNK3zxSHL/Il3Aa0Mw+xY3T1gtsJrUNoJy8Q==", + "dev": true, + "requires": { + "ignore": "3.3.5", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "semver": "5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.31" + } + }, + "events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", + "dev": true + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "1.3.4", + "safe-buffer": "5.1.1" + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fbjs": { + "version": "0.8.16", + "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", + "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", + "dev": true, + "requires": { + "core-js": "1.2.7", + "isomorphic-fetch": "2.2.1", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "promise": "7.3.1", + "setimmediate": "1.0.5", + "ua-parser-js": "0.7.14" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", + "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "is-callable": "1.1.3" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "github": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", + "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", + "requires": { + "mime": "1.4.1" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.2.tgz", + "integrity": "sha512-nidsnaoWVZIBLwA3sUIp3dA2DP2rT3dwEqINVacQ0+rZmc6UOwj2D729HTEjQYUKb+3wL9MeDbxpZtEiEJoUHQ==", + "dev": true, + "requires": { + "eslint-plugin-node": "5.2.0" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "hash-base": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", + "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "hash.js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", + "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimalistic-assert": "1.0.0" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "1.1.3", + "minimalistic-assert": "1.0.0", + "minimalistic-crypto-utils": "1.0.1" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "html-minifier": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.5.tgz", + "integrity": "sha512-g+1+NBycQI0fGnggd52JM8TRUweG7+9W2wrtjGitMAqc4G7maweAHvVAAjz9veHseIH3tYKE2lk2USGSoewIrQ==", + "dev": true, + "requires": { + "camel-case": "3.0.0", + "clean-css": "4.1.9", + "commander": "2.11.0", + "he": "1.1.1", + "ncname": "1.0.0", + "param-case": "2.1.1", + "relateurl": "0.2.7", + "uglify-js": "3.1.3" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + } + } + }, + "html-webpack-plugin": { + "version": "2.30.1", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", + "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", + "dev": true, + "requires": { + "bluebird": "3.5.1", + "html-minifier": "3.5.5", + "loader-utils": "0.2.17", + "lodash": "4.17.4", + "pretty-error": "2.1.1", + "toposort": "1.0.6" + } + }, + "htmlparser2": { + "version": "3.9.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", + "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.4.1", + "domutils": "1.5.1", + "entities": "1.1.1", + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "https-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", + "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ieee754": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", + "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", + "dev": true + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "dev": true + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isomorphic-fetch": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", + "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", + "dev": true, + "requires": { + "node-fetch": "1.7.3", + "whatwg-fetch": "2.0.3" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "json-loader": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", + "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "just-extend": { + "version": "1.1.22", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", + "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "loader-runner": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", + "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "dev": true + }, + "loader-utils": { + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", + "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1", + "object-assign": "4.1.1" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", + "dev": true + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lolex": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.3.tgz", + "integrity": "sha512-BdHq78SeI+6PAUtl4atDuCt7L6E4fab3mSRtqxm4ywaXe4uP7jZ0TTcFNuU20syUjxZc2l7jFqKVMJ+AX0LnpQ==", + "dev": true + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", + "dev": true + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + }, + "make-error": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", + "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", + "dev": true + }, + "md5.js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", + "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "dev": true, + "requires": { + "hash-base": "3.0.4", + "inherits": "2.0.3" + }, + "dependencies": { + "hash-base": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + } + } + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.1.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "0.1.4", + "readable-stream": "2.3.3" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "brorand": "1.1.0" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "mimic-fn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimalistic-assert": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", + "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.0.tgz", + "integrity": "sha512-83e2QQWKbcBiPb1TuS80i4DxkpqQoOC9Y0TxOuML8NkzZWUkJJqWHAslhUS7x5nQcYMqnMwZDp5v3ABzV+ivCA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.2", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "nan": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", + "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=" + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, + "ncname": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", + "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", + "dev": true, + "requires": { + "xml-char-classes": "1.0.0" + } + }, + "nearley": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.11.0.tgz", + "integrity": "sha512-clqqhEuP0ZCJQ85Xv2I/4o2Gs/fvSR6fCg5ZHVE2c8evWyNk2G++ih4JOO3lMb/k/09x6ihQ2nzKUlB/APCWjg==", + "dev": true, + "requires": { + "nomnom": "1.6.2", + "railroad-diagrams": "1.0.0", + "randexp": "0.4.6" + } + }, + "nise": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.1.1.tgz", + "integrity": "sha512-f5DMJB0MqBaSuP2NAwPx7HyVKPdaozds0KsNe9XIP3npKWt/QUg73l5TTLRTSwfG/Y3AB0ktacuxX4QNcg6vVw==", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.22", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" + }, + "dependencies": { + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + } + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "dev": true, + "requires": { + "lower-case": "1.1.4" + } + }, + "node-aead-crypto": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/node-aead-crypto/-/node-aead-crypto-1.0.2.tgz", + "integrity": "sha1-+2EIvDCNUQAWg1RYO5fRJGh37RY=", + "requires": { + "nan": "2.4.0", + "node-pre-gyp": "0.6.36", + "node-pre-gyp-github": "1.3.1" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true + }, + "aproba": { + "version": "1.1.2", + "bundled": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "asn1": { + "version": "0.2.3", + "bundled": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.8", + "bundled": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "caseless": { + "version": "0.12.0", + "bundled": true + }, + "co": { + "version": "4.6.0", + "bundled": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "bundled": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "bundled": true + }, + "extsprintf": { + "version": "1.3.0", + "bundled": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.16" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "requires": { + "aproba": "1.1.2", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "bundled": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true + }, + "ini": { + "version": "1.3.4", + "bundled": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true + }, + "jsprim": { + "version": "1.4.1", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "mime-db": { + "version": "1.29.0", + "bundled": true + }, + "mime-types": { + "version": "2.1.16", + "bundled": true, + "requires": { + "mime-db": "1.29.0" + } + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "bundled": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.2", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.4.1", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.2", + "bundled": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true + }, + "qs": { + "version": "6.4.0", + "bundled": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true + } + } + }, + "readable-stream": { + "version": "2.3.3", + "bundled": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "bundled": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.16", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true + }, + "semver": { + "version": "5.4.1", + "bundled": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.1", + "bundled": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "string_decoder": { + "version": "1.0.3", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "bundled": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.3.3", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true + }, + "uuid": { + "version": "3.1.0", + "bundled": true + }, + "verror": { + "version": "1.10.0", + "bundled": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true + } + } + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "bundled": true + } + } + }, + "node-coap-client": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/node-coap-client/-/node-coap-client-0.4.7.tgz", + "integrity": "sha512-cc5yGlcoHbPbzS0WvrCqadO0My/J/B6fZE+P4DGVT3VgEZ44aXqLniRj2ozXDbNnYozRrWUi9f+YkXrxhBc5kw==", + "requires": { + "debug": "3.1.0", + "node-dtls-client": "0.2.2" + } + }, + "node-dtls-client": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/node-dtls-client/-/node-dtls-client-0.2.2.tgz", + "integrity": "sha512-HX86+JkebS4/aLHyHplaTIsXkrTwEyG8u8SF2c2GI2pQNKX/hUH4qCC1WkSt2hUhe32VG458Gvmn2gIOmVfheQ==", + "requires": { + "debug": "3.1.0", + "node-aead-crypto": "1.0.2" + } + }, + "node-fetch": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", + "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", + "dev": true, + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node-libs-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", + "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", + "dev": true, + "requires": { + "assert": "1.4.1", + "browserify-zlib": "0.1.4", + "buffer": "4.9.1", + "console-browserify": "1.1.0", + "constants-browserify": "1.0.0", + "crypto-browserify": "3.11.1", + "domain-browser": "1.1.7", + "events": "1.1.1", + "https-browserify": "0.0.1", + "os-browserify": "0.2.1", + "path-browserify": "0.0.0", + "process": "0.11.10", + "punycode": "1.4.1", + "querystring-es3": "0.2.1", + "readable-stream": "2.3.3", + "stream-browserify": "2.0.1", + "stream-http": "2.7.2", + "string_decoder": "0.10.31", + "timers-browserify": "2.0.4", + "tty-browserify": "0.0.0", + "url": "0.11.0", + "util": "0.10.3", + "vm-browserify": "0.0.4" + }, + "dependencies": { + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "node-pre-gyp-github": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.3.1.tgz", + "integrity": "sha1-xpZTA5lbWwg+ymShqjX9K1Edy7M=", + "requires": { + "commander": "2.9.0", + "github": "0.2.4" + } + }, + "node-ssh": { + "version": "https://registry.npmjs.org/node-ssh/-/node-ssh-5.0.0.tgz", + "integrity": "sha1-/wn0WcxrKnnVVC9SPXJVWyqExf0=", + "dev": true, + "requires": { + "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "sb-promisify": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", + "sb-scandir": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-2.0.0.tgz", + "shell-escape": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", + "ssh2": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.5.tgz" + } + }, + "nomnom": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", + "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", + "dev": true, + "requires": { + "colors": "0.5.1", + "underscore": "1.4.4" + }, + "dependencies": { + "colors": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", + "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", + "dev": true + } + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nyc": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.2.1.tgz", + "integrity": "sha1-rYUK/p261/SXByi0suR/7Rw4chw=", + "dev": true, + "requires": { + "archy": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "caching-transform": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "debug-log": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", + "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "merge-source-map": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "spawn-wrap": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", + "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz" + }, + "dependencies": { + "align-text": { + "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "amdefine": { + "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "append-transform": { + "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz" + } + }, + "archy": { + "version": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "arr-diff": { + "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" + } + }, + "arr-flatten": { + "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "array-unique": { + "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "async": { + "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "babel-code-frame": { + "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, + "babel-generator": { + "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "dev": true, + "requires": { + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" + } + }, + "babel-messages": { + "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" + } + }, + "babel-runtime": { + "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz" + } + }, + "babel-template": { + "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-traverse": { + "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" + } + }, + "babel-types": { + "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" + } + }, + "babylon": { + "version": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", + "dev": true + }, + "balanced-match": { + "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" + } + }, + "builtin-modules": { + "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caching-transform": { + "version": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", + "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", + "dev": true, + "requires": { + "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz" + } + }, + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "center-align": { + "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + } + }, + "chalk": { + "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" + } + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" + }, + "dependencies": { + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "code-point-at": { + "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "commondir": { + "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "concat-map": { + "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "convert-source-map": { + "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-js": { + "version": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", + "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "dev": true + }, + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "debug": { + "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + } + }, + "debug-log": { + "version": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", + "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", + "dev": true + }, + "decamelize": { + "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "default-require-extensions": { + "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", + "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", + "dev": true, + "requires": { + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "detect-indent": { + "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" + } + }, + "error-ex": { + "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + } + }, + "escape-string-regexp": { + "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esutils": { + "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "execa": { + "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" + }, + "dependencies": { + "cross-spawn": { + "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + } + } + }, + "expand-brackets": { + "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" + } + }, + "expand-range": { + "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" + } + }, + "extglob": { + "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "filename-regex": { + "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" + } + }, + "find-cache-dir": { + "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", + "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", + "dev": true, + "requires": { + "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" + } + }, + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" + } + }, + "for-in": { + "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + } + }, + "foreground-child": { + "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", + "dev": true, + "requires": { + "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" + } + }, + "fs.realpath": { + "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "get-caller-file": { + "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-stream": { + "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-base": { + "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "glob-parent": { + "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "globals": { + "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "graceful-fs": { + "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "handlebars": { + "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", + "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", + "dev": true, + "requires": { + "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" + }, + "dependencies": { + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" + } + } + } + }, + "has-ansi": { + "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "has-flag": { + "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hosted-git-info": { + "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", + "dev": true + }, + "imurmurhash": { + "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "invariant": { + "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" + } + }, + "invert-kv": { + "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is-arrayish": { + "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-buffer": { + "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" + } + }, + "is-dotfile": { + "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" + } + }, + "is-extendable": { + "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" + } + }, + "is-glob": { + "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" + } + }, + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + } + }, + "is-posix-bracket": { + "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-stream": { + "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-utf8": { + "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + } + }, + "istanbul-lib-coverage": { + "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", + "dev": true + }, + "istanbul-lib-hook": { + "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", + "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", + "dev": true, + "requires": { + "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz" + } + }, + "istanbul-lib-instrument": { + "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", + "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", + "dev": true, + "requires": { + "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", + "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + } + }, + "istanbul-lib-report": { + "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", + "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", + "dev": true, + "requires": { + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" + }, + "dependencies": { + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", + "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", + "dev": true, + "requires": { + "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + }, + "istanbul-reports": { + "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", + "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", + "dev": true, + "requires": { + "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz" + } + }, + "js-tokens": { + "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "jsesc": { + "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + }, + "lazy-cache": { + "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + }, + "lcid": { + "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" + } + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" + } + }, + "locate-path": { + "version": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + }, + "dependencies": { + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "longest": { + "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" + } + }, + "lru-cache": { + "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "dev": true, + "requires": { + "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + } + }, + "md5-hex": { + "version": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", + "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", + "dev": true, + "requires": { + "md5-o-matic": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz" + } + }, + "md5-o-matic": { + "version": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", + "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", + "dev": true + }, + "mem": { + "version": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz" + } + }, + "merge-source-map": { + "version": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "dev": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + } + }, + "micromatch": { + "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" + } + }, + "mimic-fn": { + "version": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", + "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", + "dev": true + }, + "minimatch": { + "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" + } + }, + "ms": { + "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "normalize-package-data": { + "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", + "dev": true, + "requires": { + "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" + } + }, + "normalize-path": { + "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" + } + }, + "npm-run-path": { + "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" + } + }, + "number-is-nan": { + "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + } + }, + "once": { + "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "optimist": { + "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" + } + }, + "os-homedir": { + "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", + "dev": true, + "requires": { + "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "mem": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz" + } + }, + "p-finally": { + "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz" + } + }, + "parse-glob": { + "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" + } + }, + "parse-json": { + "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" + } + }, + "path-exists": { + "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "path-is-absolute": { + "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + }, + "pify": { + "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + } + }, + "pkg-dir": { + "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", + "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" + }, + "dependencies": { + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "preserve": { + "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pseudomap": { + "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "randomatic": { + "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" + }, + "dependencies": { + "is-number": { + "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + }, + "dependencies": { + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + } + } + }, + "kind-of": { + "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" + } + } + } + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" + } + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" + }, + "dependencies": { + "find-up": { + "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + } + } + } + }, + "regenerator-runtime": { + "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", + "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=", + "dev": true + }, + "regex-cache": { + "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" + } + }, + "remove-trailing-separator": { + "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" + } + }, + "require-directory": { + "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve-from": { + "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", + "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", + "dev": true + }, + "right-align": { + "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" + } + }, + "rimraf": { + "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "set-blocking": { + "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "shebang-command": { + "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + } + }, + "shebang-regex": { + "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "signal-exit": { + "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "slide": { + "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "source-map": { + "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "spawn-wrap": { + "version": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", + "integrity": "sha1-+ip5uZDLsLsAGNymdI2INnsZ7DE=", + "dev": true, + "requires": { + "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" + } + }, + "spdx-correct": { + "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" + } + }, + "spdx-expression-parse": { + "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" + }, + "dependencies": { + "ansi-regex": { + "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" + } + } + } + }, + "strip-ansi": { + "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" + } + }, + "strip-eof": { + "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "supports-color": { + "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "test-exclude": { + "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", + "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", + "dev": true, + "requires": { + "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" + } + }, + "to-fast-properties": { + "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "trim-right": { + "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "uglify-js": { + "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" + }, + "dependencies": { + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" + } + } + } + }, + "uglify-to-browserify": { + "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "validate-npm-package-license": { + "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" + } + }, + "which": { + "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "dev": true, + "requires": { + "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + } + }, + "which-module": { + "version": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + }, + "dependencies": { + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + } + } + }, + "wrappy": { + "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", + "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" + } + }, + "y18n": { + "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "which-module": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" + }, + "dependencies": { + "string-width": { + "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" + } + } + } + }, + "load-json-file": { + "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + } + }, + "path-type": { + "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + } + }, + "read-pkg": { + "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "path-type": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" + } + }, + "read-pkg-up": { + "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" + } + }, + "strip-bom": { + "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" + } + } + } + }, + "yargs-parser": { + "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", + "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", + "dev": true, + "requires": { + "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" + }, + "dependencies": { + "camelcase": { + "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", + "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", + "dev": true + } + } + } + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-is": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", + "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", + "dev": true + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object.assign": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", + "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "function-bind": "1.1.1", + "object-keys": "1.0.11" + } + }, + "object.entries": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", + "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.9.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-browserify": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", + "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", + "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "dev": true + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.1.0" + } + }, + "p-map": { + "version": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "param-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", + "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", + "dev": true, + "requires": { + "no-case": "2.3.2" + } + }, + "parse-asn1": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", + "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "dev": true, + "requires": { + "asn1.js": "4.9.1", + "browserify-aes": "1.0.8", + "create-hash": "1.1.3", + "evp_bytestokey": "1.0.3", + "pbkdf2": "3.0.14" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "parse5": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", + "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", + "dev": true, + "requires": { + "@types/node": "6.0.88" + } + }, + "path-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", + "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "dev": true + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pbkdf2": { + "version": "3.0.14", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", + "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "dev": true, + "requires": { + "create-hash": "1.1.3", + "create-hmac": "1.1.6", + "ripemd160": "2.0.1", + "safe-buffer": "5.1.1", + "sha.js": "2.4.9" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", + "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", + "dev": true, + "requires": { + "renderkid": "2.0.1", + "utila": "0.4.0" + } + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "requires": { + "asap": "2.0.6" + } + }, + "prop-types": { + "version": "15.6.0", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", + "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1" + } + }, + "prr": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", + "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "public-encrypt": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", + "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "dev": true, + "requires": { + "bn.js": "4.11.8", + "browserify-rsa": "4.0.1", + "create-hash": "1.1.3", + "parse-asn1": "5.1.0", + "randombytes": "2.0.5" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "raf": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", + "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", + "dev": true, + "requires": { + "performance-now": "2.1.0" + } + }, + "railroad-diagrams": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", + "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", + "dev": true + }, + "randexp": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", + "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", + "dev": true, + "requires": { + "discontinuous-range": "1.0.0", + "ret": "0.1.15" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "randombytes": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", + "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "react": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react/-/react-16.0.0.tgz", + "integrity": "sha1-zn348ZQbA28Cssyp29DLHw6FXi0=", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-dom": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.0.0.tgz", + "integrity": "sha1-nMMHnD3NcNTG4BuEqrKn40wwP1g=", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "loose-envify": "1.3.1", + "object-assign": "4.1.1", + "prop-types": "15.6.0" + } + }, + "react-test-renderer": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0.tgz", + "integrity": "sha1-n+e4MI8vcfKfw1bUECCG8THJyxU=", + "dev": true, + "requires": { + "fbjs": "0.8.16", + "object-assign": "4.1.1" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "reflect-metadata": { + "version": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "renderkid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", + "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", + "dev": true, + "requires": { + "css-select": "1.2.0", + "dom-converter": "0.1.4", + "htmlparser2": "3.3.0", + "strip-ansi": "3.0.1", + "utila": "0.3.3" + }, + "dependencies": { + "domhandler": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", + "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", + "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "htmlparser2": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", + "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.1.0", + "domutils": "1.1.6", + "readable-stream": "1.0.34" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "utila": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", + "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", + "dev": true + } + } + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "resolve": { + "version": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "requires": { + "align-text": "0.1.4" + } + }, + "ripemd160": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", + "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "dev": true, + "requires": { + "hash-base": "2.0.2", + "inherits": "2.0.3" + } + }, + "rst-selector-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.2.tgz", + "integrity": "sha512-T5yd2bsA+FVQ5xP8Ga62gXjOnEaMsYhbbslVB+Fe4R9lAZiF7DfTHRyBpV9xEZ772LwstCdDdkHkvkWIr47X8g==", + "dev": true, + "requires": { + "lodash.flattendeep": "4.4.0", + "nearley": "2.11.0" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sb-promisify": { + "version": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", + "integrity": "sha1-QnelR1RIiqlnXYhuNU24lMm9yYE=", + "dev": true + }, + "sb-scandir": { + "version": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-2.0.0.tgz", + "integrity": "sha1-oCrR+kSovSv68wGT0U0jwvNatrI=", + "dev": true, + "requires": { + "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", + "sb-promisify": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz" + } + }, + "semver": { + "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "sha.js": { + "version": "2.4.9", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", + "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "dev": true, + "requires": { + "inherits": "2.0.3", + "safe-buffer": "5.1.1" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-escape": { + "version": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", + "integrity": "sha1-aP0CXrBJC09WegJ/C/IkgLX4QTM=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sinon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.1.tgz", + "integrity": "sha512-4qIY0pCWCvGCJpV/1JkFu9kbsNEZ9O34cG1oru/c7OCDtrEs50Gq/VjkA2ID5ZwLyoNx1i1ws118oh/p6fVeDg==", + "dev": true, + "requires": { + "diff": "3.2.0", + "formatio": "1.2.0", + "lodash.get": "4.4.2", + "lolex": "2.1.3", + "native-promise-only": "0.8.1", + "nise": "1.1.1", + "path-to-regexp": "1.7.0", + "samsam": "1.3.0", + "text-encoding": "0.6.4", + "type-detect": "4.0.3" + } + }, + "source-list-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", + "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", + "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "ssh2": { + "version": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.5.tgz", + "integrity": "sha1-x3gezS7OcwSiU89iD6taXCK7IjU=", + "dev": true, + "requires": { + "ssh2-streams": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.19.tgz" + } + }, + "ssh2-streams": { + "version": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.19.tgz", + "integrity": "sha1-+A7OzC3ho54apkRphR7DK8lrg/k=", + "dev": true, + "requires": { + "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "streamsearch": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" + } + }, + "stream-browserify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", + "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3" + } + }, + "stream-http": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", + "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "dev": true, + "requires": { + "builtin-status-codes": "3.0.0", + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "to-arraybuffer": "1.0.1", + "xtend": "4.0.1" + } + }, + "streamsearch": { + "version": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", + "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + }, + "tapable": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", + "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", + "dev": true + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "timers-browserify": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", + "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "dev": true, + "requires": { + "setimmediate": "1.0.5" + } + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "toposort": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", + "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", + "dev": true + }, + "ts-loader": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.7.tgz", + "integrity": "sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==", + "dev": true, + "requires": { + "chalk": "2.1.0", + "enhanced-resolve": "3.4.1", + "loader-utils": "1.1.0", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + } + }, + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + } + } + }, + "ts-node": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", + "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", + "dev": true, + "requires": { + "arrify": "1.0.1", + "chalk": "2.1.0", + "diff": "3.2.0", + "make-error": "1.3.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18", + "tsconfig": "6.0.0", + "v8flags": "3.0.1", + "yn": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.0" + } + }, + "chalk": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", + "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "4.4.0" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + } + } + }, + "tsconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", + "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", + "dev": true, + "requires": { + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1" + } + }, + "tslib": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", + "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", + "dev": true + }, + "tslint": { + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", + "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "colors": "1.1.2", + "commander": "2.9.0", + "diff": "3.2.0", + "glob": "7.1.1", + "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", + "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "tslib": "1.7.1", + "tsutils": "2.11.2" + } + }, + "tslint-react": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.2.0.tgz", + "integrity": "sha1-hR+1BSAcY9A0PFFybmNk9+mtLpk=", + "dev": true, + "requires": { + "tsutils": "2.11.2" + } + }, + "tsutils": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.11.2.tgz", + "integrity": "sha1-YBNgHjb6FP+VhBPlQdQn+4xqw0E=", + "dev": true, + "requires": { + "tslib": "1.7.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "typescript": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", + "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.14", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.14.tgz", + "integrity": "sha1-EQ1T+kw/MmwSEpK76skE0uAzh8o=", + "dev": true + }, + "uglify-js": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.3.tgz", + "integrity": "sha512-5ZUOgufCHjN2mBBLfz63UtWTP6va2sSzBpNCM+/iqI6RnPzEhANmB0EKiKBYdQbc3v7KeomXJ2DJx0Xq9gvUvA==", + "dev": true, + "requires": { + "commander": "2.11.0", + "source-map": "0.5.7" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "uglifyjs-webpack-plugin": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", + "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-js": "2.8.29", + "webpack-sources": "1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + } + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", + "dev": true + }, + "v8flags": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", + "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "vm-browserify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", + "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", + "dev": true, + "requires": { + "indexof": "0.0.1" + } + }, + "watchpack": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", + "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "dev": true, + "requires": { + "async": "2.5.0", + "chokidar": "1.7.0", + "graceful-fs": "4.1.11" + } + }, + "webpack": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.6.0.tgz", + "integrity": "sha512-OsHT3D0W0KmPPh60tC7asNnOmST6bKTiR90UyEdT9QYoaJ4OYN4Gg7WK1k3VxHK07ZoiYWPsKvlS/gAjwL/vRA==", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-dynamic-import": "2.0.2", + "ajv": "5.2.3", + "ajv-keywords": "2.1.0", + "async": "2.5.0", + "enhanced-resolve": "3.4.1", + "escope": "3.6.0", + "interpret": "1.0.4", + "json-loader": "0.5.7", + "json5": "0.5.1", + "loader-runner": "2.3.0", + "loader-utils": "1.1.0", + "memory-fs": "0.4.1", + "mkdirp": "0.5.1", + "node-libs-browser": "2.0.0", + "source-map": "0.5.7", + "supports-color": "4.4.0", + "tapable": "0.2.8", + "uglifyjs-webpack-plugin": "0.4.6", + "watchpack": "1.4.0", + "webpack-sources": "1.0.1", + "yargs": "8.0.2" + }, + "dependencies": { + "loader-utils": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", + "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "dev": true, + "requires": { + "big.js": "3.2.0", + "emojis-list": "2.1.0", + "json5": "0.5.1" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "webpack-sources": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", + "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", + "dev": true, + "requires": { + "source-list-map": "2.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "whatwg-fetch": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", + "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", + "dev": true + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "xml-char-classes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", + "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yn": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", + "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 7c24fa4d..7c963e6c 100644 --- a/package.json +++ b/package.json @@ -24,27 +24,27 @@ "@types/chai-as-promised": "^7.1.0", "@types/mocha": "^2.2.43", "@types/node": "^6.0.88", - "@types/reflect-metadata": "0.0.5", "@types/react": "^16.0.10", "@types/react-dom": "^16.0.1", + "@types/reflect-metadata": "0.0.5", "chai": "^4.1.2", "chai-as-promised": "^7.1.1", - "mocha": "^4.0.0", - "nyc": "^11.2.1", - "source-map-support": "^0.5.0", - "ts-node": "^3.3.0", - "tslint": "^5.7.0", - "typescript": "^2.5.3", - "node-ssh": "^5.0.0", "enzyme": "^3.1.0", "enzyme-adapter-react-16": "^1.0.1", "html-webpack-plugin": "^2.30.1", + "mocha": "^4.0.0", + "node-ssh": "^5.0.0", + "nyc": "^11.2.1", "react": "^16.0.0", "react-dom": "^16.0.0", "react-test-renderer": "^16.0.0", "sinon": "^4.0.1", + "source-map-support": "^0.5.0", "ts-loader": "^2.3.7", + "ts-node": "^3.3.0", + "tslint": "^5.7.0", "tslint-react": "^3.2.0", + "typescript": "^2.5.3", "webpack": "^3.6.0" }, "homepage": "https://github.com/AlCalzone/ioBroker.tradfri", @@ -74,7 +74,7 @@ "coverage": "node node_modules/nyc/bin/nyc npm run test", "lint:ts": "tslint", "lint": "npm run lint:ts \"src/**/*.{ts|tsx}\"", - "deploy_local": "node build/deploy_local.js" + "deploy_local": "node --require ts-node/register src/deploy_local.ts" }, "nyc": { "include": [ @@ -86,7 +86,7 @@ "admin/src/**/*.test.ts*" ], "extension": [ - ".ts", + ".ts", ".tsx" ], "require": [ diff --git a/src/deploy_local.ts b/src/deploy_local.ts index 533bfc06..a47e3e9f 100644 --- a/src/deploy_local.ts +++ b/src/deploy_local.ts @@ -41,17 +41,26 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; await ssh.connect(sshConfig); for (const dir of uploadDirs) { + console.log(`cleaning ${dir} dir...`); + await ssh.execCommand(`rm -rf ${path.join(remoteRoot, dir)}`); console.log(`uploading ${dir} dir...`); - await ssh.putDirectory(path.join(localRoot, dir), path.join(remoteRoot, dir), { - recursive: true, - concurrency: 10, - validate: (pathname) => { - const basename = path.basename(pathname); - if (basename.startsWith("deploy_")) return false; - if (basename.endsWith("Thumbs.db")) return false; - return true; - }, - }); + try { + await ssh.putDirectory(path.join(localRoot, dir), path.join(remoteRoot, dir), { + recursive: true, + concurrency: 10, + validate: (pathname) => { + const basename = path.basename(pathname); + if (basename.startsWith("deploy_")) return false; + if (basename.endsWith("Thumbs.db")) return false; + if (basename.endsWith(".map")) return false; + if (basename.indexOf(".test.") > -1) return false; + if (basename === "src") return false; + return true; + }, + }); + } catch (e) { + console.error(e); + } } for (const file of uploadFiles) { console.log(`uploading ${file}...`); diff --git a/tslint.json b/tslint.json index a58587df..cbcf8606 100644 --- a/tslint.json +++ b/tslint.json @@ -20,10 +20,7 @@ "triple-equals": [true, "allow-undefined-check", "allow-null-check"], "arrow-parens": false, "no-bitwise": false, - "quotemark": [true, "double", "avoid-escape"], // change "double" to "single" if you prefer ' over " - // development: + "quotemark": [true, "double", "avoid-escape"], "no-console": [false] - // production: - // "no-console": [true, "log", "error"] } } diff --git a/webpack.config.js b/webpack.config.js index cfbf1d8b..b0dc31d0 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -48,4 +48,9 @@ module.exports = { }, ], }, + externals: { + jquery: 'jQuery', + socketio: 'socket', + sendTo: 'sendTo', + } } \ No newline at end of file From 9b9ab8297705bcdc1f8c33e580f7a63681faa3ff Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Thu, 12 Oct 2017 13:43:14 +0200 Subject: [PATCH 15/51] added component for jquery-ui tabs with tests --- admin/build/main.bundle.js | 39 ++++++++++++++++++++++++++++ admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/index.tsx | 6 +++++ admin/src/tabs.test.tsx | 35 ++++++++++++++++++++++++++ admin/src/tabs.tsx | 42 +++++++++++++++++++++++++++++++ package.json | 7 ++++-- test/setupJSDom.js | 23 +++++++++++++++++ 8 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 admin/src/tabs.test.tsx create mode 100644 admin/src/tabs.tsx create mode 100644 test/setupJSDom.js diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index ecf7be0d..93ae1d89 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -25,6 +25,7 @@ const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); // components const fragment_1 = __webpack_require__("./admin/src/fragment.tsx"); const settings_1 = __webpack_require__("./admin/src/settings.tsx"); +const tabs_1 = __webpack_require__("./admin/src/tabs.tsx"); const $window = window; const namespace = `tradfri.${$window.instance}`; // layout components @@ -54,6 +55,7 @@ $window.save = (callback) => { // save the settings callback(curSettings); }; +ReactDOM.render(React.createElement(tabs_1.Tabs, { tabs: { Test: React.createElement("b", null, "1"), Test2: React.createElement("i", null, "2") } }), document.getElementById("adapter-container")); /***/ }), @@ -139,6 +141,43 @@ class Settings extends React.Component { exports.Settings = Settings; +/***/ }), + +/***/ "./admin/src/tabs.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// Renders some components in jQuery UI tabs +const React = __webpack_require__("./node_modules/react/index.js"); +// fix missing property errors/warnings +const $window = window; +const $ = $window.jQuery; +const $$ = $; +class Tabs extends React.Component { + constructor(props) { + super(props); + this.state = { + tabs: props.tabs, + }; + this.containerId = this.props.id || "tabs"; + } + componentDidMount() { + if (!$) + return; // we're in a test environment without jQuery + $$(`#${this.containerId}`).tabs(); + } + render() { + return (React.createElement("div", { id: this.containerId }, + React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, + React.createElement("a", { href: `#${this.containerId}-${i}` }, k)))), + Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `#${this.containerId}-${i}` }, this.state.tabs[k])))); + } +} +exports.Tabs = Tabs; + + /***/ }) },["./admin/src/index.tsx"]); diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index e9d376e1..acf143ab 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/fragment.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/fragment.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./fragment\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./settings\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nconst $window = window as any;\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrDA;AAGA;AAEA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/fragment.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/settings.tsx","webpack:///./admin/src/tabs.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/fragment.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./fragment\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./settings\";\r\nimport { Tabs } from \"./tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\r\nReactDOM.render(\r\n\t1, Test2: 2}} />,\r\n\tdocument.getElementById(\"adapter-container\"),\r\n);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nconst $window = window as any;\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/tabs.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;ACxDA;AAGA;AAEA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;;;;;;;AC3BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 31d62ed0..0b988618 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap e80e2e342a4a968bf8e4"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap e80e2e342a4a968bf8e4"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 430c4bf5e1f768c916be"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 430c4bf5e1f768c916be"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/index.tsx b/admin/src/index.tsx index fd4fda1c..cbd3c2e8 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -6,6 +6,7 @@ import * as ReactDOM from "react-dom"; // components import Fragment from "./fragment"; import { OnSettingsChangedCallback, Settings } from "./settings"; +import { Tabs } from "./tabs"; const $window = window as any; const namespace = `tradfri.${$window.instance}`; @@ -52,3 +53,8 @@ $window.save = (callback) => { // save the settings callback(curSettings); }; + +ReactDOM.render( + 1, Test2: 2}} />, + document.getElementById("adapter-container"), +); diff --git a/admin/src/tabs.test.tsx b/admin/src/tabs.test.tsx new file mode 100644 index 00000000..b8b820ce --- /dev/null +++ b/admin/src/tabs.test.tsx @@ -0,0 +1,35 @@ +// React component test +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +// Setup Enzyme adapter +import {configure, shallow} from "enzyme"; +import * as Adapter from "enzyme-adapter-react-16"; +configure({ adapter: new (Adapter as any)() }); + +// tslint:disable:no-unused-expression +import { assert, expect } from "chai"; +import sinon from "sinon"; + +// import components +import { Tabs } from "./tabs"; + +describe.only("jQuery-UI tabs", () => { + + const definition = { + "Tab 1": "Hallo", + "Tab 2":
Test
, + "Tab 3": null, + }; + const tabCount = Object.keys(definition).length; + + const tab = ; + + it(`renders the correct amount (${tabCount}) of headers`, () => { + expect(shallow(tab).find("li")).to.have.length(tabCount); + }); + it(`renders the correct amount (${tabCount}) of tab divs`, () => { + expect(shallow(tab).find("div#tabs > div")).to.have.length(tabCount); + }); + +}); diff --git a/admin/src/tabs.tsx b/admin/src/tabs.tsx new file mode 100644 index 00000000..2b928f8e --- /dev/null +++ b/admin/src/tabs.tsx @@ -0,0 +1,42 @@ +// Renders some components in jQuery UI tabs +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +// fix missing property errors/warnings +const $window = window as any; +const $ = $window.jQuery as JQuery; +const $$ = $ as any; + +export class Tabs extends React.Component { + + constructor(props) { + super(props); + this.state = { + tabs: props.tabs, + }; + this.containerId = this.props.id || "tabs"; + } + + private containerId: string; + + public componentDidMount() { + if (!$) return; // we're in a test environment without jQuery + + $$(`#${this.containerId}`).tabs(); + } + + public render() { + return ( +
+
    + {Object.keys(this.state.tabs).map( + (k, i) =>
  • {k}
  • , + )} +
+ {Object.keys(this.state.tabs).map( + (k, i) =>
{this.state.tabs[k]}
, + )} +
+ ); + } +} diff --git a/package.json b/package.json index 7c963e6c..c372a010 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,7 @@ "devDependencies": { "@types/chai": "^4.0.4", "@types/chai-as-promised": "^7.1.0", + "@types/jquery": "^1.10.33", "@types/mocha": "^2.2.43", "@types/node": "^6.0.88", "@types/react": "^16.0.10", @@ -32,6 +33,8 @@ "enzyme": "^3.1.0", "enzyme-adapter-react-16": "^1.0.1", "html-webpack-plugin": "^2.30.1", + "jquery": "1.11.1", + "jsdom": "^11.3.0", "mocha": "^4.0.0", "node-ssh": "^5.0.0", "nyc": "^11.2.1", @@ -65,9 +68,9 @@ "build:webpack": "webpack --config webpack.config.js", "build": "npm run build:webpack", "watch": "webpack --config webpack.config.js --watch --progress", - "test:js": "node node_modules/mocha/bin/mocha test/*.js", + "test:js": "node node_modules/mocha/bin/mocha test/test*.js", "test:ts": "node node_modules/mocha/bin/mocha --require ts-node/register --require source-map-support/register src/**/*.test.ts", - "test:tsx": "node node_modules/mocha/bin/mocha --require ts-node/register --require source-map-support/register **/src/**/*.test.tsx", + "test:tsx": "node node_modules/mocha/bin/mocha --require test/setupJSDom.js --require ts-node/register --require source-map-support/register **/src/**/*.test.tsx", "test:package": "node node_modules/mocha/bin/mocha test/testPackageFiles.js", "test": "npm run test:ts && npm run test:tsx", "prepublishOnly": "npm run test:package", diff --git a/test/setupJSDom.js b/test/setupJSDom.js new file mode 100644 index 00000000..667c630f --- /dev/null +++ b/test/setupJSDom.js @@ -0,0 +1,23 @@ +/** + * Sets up a DOM for react component tests + */ + +const { JSDOM } = require('jsdom'); + +const jsdom = new JSDOM(''); +const { window } = jsdom; + +function copyProps(src, target) { + const props = Object.getOwnPropertyNames(src) + .filter(prop => typeof target[prop] === 'undefined') + .map(prop => Object.getOwnPropertyDescriptor(src, prop)); + Object.defineProperties(target, props); +} + +global.window = window; +global.document = window.document; +global.navigator = { + userAgent: 'node.js', +}; +copyProps(window, global); +window.TESTING = true; \ No newline at end of file From 428ae3592e6d786e61606fa842411cdae3550d2a Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Thu, 12 Oct 2017 14:06:41 +0200 Subject: [PATCH 16/51] moved components to sub directory, added placeholder for group management --- admin/build/main.bundle.js | 108 ++++++++++++++--------- admin/build/main.bundle.js.map | 2 +- admin/src/{ => components}/fragment.tsx | 0 admin/src/components/groups.tsx | 23 +++++ admin/src/{ => components}/settings.tsx | 7 +- admin/src/{ => components}/tabs.test.tsx | 2 +- admin/src/{ => components}/tabs.tsx | 2 +- admin/src/index.test.tsx | 2 +- admin/src/index.tsx | 19 ++-- 9 files changed, 109 insertions(+), 56 deletions(-) rename admin/src/{ => components}/fragment.tsx (100%) create mode 100644 admin/src/components/groups.tsx rename admin/src/{ => components}/settings.tsx (96%) rename admin/src/{ => components}/tabs.test.tsx (95%) rename admin/src/{ => components}/tabs.tsx (96%) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 93ae1d89..8b7f72f4 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -1,6 +1,6 @@ webpackJsonp(["main"],{ -/***/ "./admin/src/fragment.tsx": +/***/ "./admin/src/components/fragment.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -14,61 +14,40 @@ exports.default = Fragment; /***/ }), -/***/ "./admin/src/index.tsx": +/***/ "./admin/src/components/groups.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); -const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); -// components -const fragment_1 = __webpack_require__("./admin/src/fragment.tsx"); -const settings_1 = __webpack_require__("./admin/src/settings.tsx"); -const tabs_1 = __webpack_require__("./admin/src/tabs.tsx"); const $window = window; -const namespace = `tradfri.${$window.instance}`; -// layout components -function Header() { - return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, "Tradfri adapter settings")); -} -function Root(props) { - return (React.createElement(fragment_1.default, null, - React.createElement(Header, null), - React.createElement(settings_1.Settings, { settings: props.settings, onChange: props.onChange }))); +/** Translates text */ +const _ = $window._; +class Groups extends React.Component { + constructor(props) { + super(props); + } + render() { + return (React.createElement("div", null, "Placeholder for group management functions")); + } } -let curSettings; -// the function loadSettings has to exist ... -$window.load = (settings, onChange) => { - const settingsChanged = (newSettings, hasChanges) => { - curSettings = newSettings; - onChange(hasChanges); - console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); - }; - ReactDOM.render(React.createElement(Root, { settings: settings, onChange: settingsChanged }), document.getElementById("adapter-container")); - // Signal to admin, that no changes yet - onChange(false); -}; -// ... and the function save has to exist. -// you have to make sure the callback is called with the settings object as first param! -$window.save = (callback) => { - // save the settings - callback(curSettings); -}; -ReactDOM.render(React.createElement(tabs_1.Tabs, { tabs: { Test: React.createElement("b", null, "1"), Test2: React.createElement("i", null, "2") } }), document.getElementById("adapter-container")); +exports.Groups = Groups; /***/ }), -/***/ "./admin/src/settings.tsx": +/***/ "./admin/src/components/settings.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); +const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); const $window = window; -const fragment_1 = __webpack_require__("./admin/src/fragment.tsx"); +/** Translates text */ +const _ = $window._; /** Helper component for a settings label */ function Label(props) { return React.createElement("label", { htmlFor: props.for, className: ["translate"].concat(...(props.class || [])).join(" ") }, @@ -77,7 +56,7 @@ function Label(props) { } /** Helper component for a tooltip */ function Tooltip(props) { - return React.createElement("img", { className: "admin-tooltip-icon", src: "../../img/info.png", title: props.text }); + return React.createElement("img", { className: "admin-tooltip-icon", src: "../../img/info.png", title: _(props.text) }); } class Settings extends React.Component { constructor(props) { @@ -143,7 +122,7 @@ exports.Settings = Settings; /***/ }), -/***/ "./admin/src/tabs.tsx": +/***/ "./admin/src/components/tabs.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -171,13 +150,62 @@ class Tabs extends React.Component { render() { return (React.createElement("div", { id: this.containerId }, React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, - React.createElement("a", { href: `#${this.containerId}-${i}` }, k)))), + React.createElement("a", { href: `#${this.containerId}-${i}`, className: "translate" }, k)))), Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `#${this.containerId}-${i}` }, this.state.tabs[k])))); } } exports.Tabs = Tabs; +/***/ }), + +/***/ "./admin/src/index.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); +// components +const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); +const groups_1 = __webpack_require__("./admin/src/components/groups.tsx"); +const settings_1 = __webpack_require__("./admin/src/components/settings.tsx"); +const tabs_1 = __webpack_require__("./admin/src/components/tabs.tsx"); +const $window = window; +const namespace = `tradfri.${$window.instance}`; +// layout components +function Header() { + return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, "Tradfri adapter settings")); +} +function Root(props) { + return (React.createElement(fragment_1.default, null, + React.createElement(Header, null), + React.createElement(tabs_1.Tabs, { tabs: { + Settings: React.createElement(settings_1.Settings, { settings: props.settings, onChange: props.onSettingsChanged }), + Groups: React.createElement(groups_1.Groups, null), + } }))); +} +let curSettings; +// the function loadSettings has to exist ... +$window.load = (settings, onChange) => { + const settingsChanged = (newSettings, hasChanges) => { + curSettings = newSettings; + onChange(hasChanges); + console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); + }; + ReactDOM.render(React.createElement(Root, { settings: settings, onSettingsChanged: settingsChanged }), document.getElementById("adapter-container")); + // Signal to admin, that no changes yet + onChange(false); +}; +// ... and the function save has to exist. +// you have to make sure the callback is called with the settings object as first param! +$window.save = (callback) => { + // save the settings + callback(curSettings); +}; + + /***/ }) },["./admin/src/index.tsx"]); diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index acf143ab..7befc9d8 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/fragment.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/settings.tsx","webpack:///./admin/src/tabs.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/fragment.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./fragment\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./settings\";\r\nimport { Tabs } from \"./tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\r\nReactDOM.render(\r\n\t1, Test2: 2}} />,\r\n\tdocument.getElementById(\"adapter-container\"),\r\n);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nconst $window = window as any;\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/tabs.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;;;;;;;;;ACxDA;AAGA;AAEA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;;;;;;;AC3BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACVA;AAGA;AAEA;AAEA;AACA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;;;;;;;AC9BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACPA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/fragment.tsx b/admin/src/components/fragment.tsx similarity index 100% rename from admin/src/fragment.tsx rename to admin/src/components/fragment.tsx diff --git a/admin/src/components/groups.tsx b/admin/src/components/groups.tsx new file mode 100644 index 00000000..64b27813 --- /dev/null +++ b/admin/src/components/groups.tsx @@ -0,0 +1,23 @@ +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +import Fragment from "./fragment"; + +const $window = window as any; + +/** Translates text */ +const _ = $window._ as (text: string) => string; + +export class Groups extends React.Component { + + constructor(props) { + super(props); + } + + public render() { + return ( +
Placeholder for group management functions
+ ); + } + +} diff --git a/admin/src/settings.tsx b/admin/src/components/settings.tsx similarity index 96% rename from admin/src/settings.tsx rename to admin/src/components/settings.tsx index 5834f8a2..4ed4c8f2 100644 --- a/admin/src/settings.tsx +++ b/admin/src/components/settings.tsx @@ -1,9 +1,12 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; +import Fragment from "./fragment"; + const $window = window as any; -import Fragment from "./fragment"; +/** Translates text */ +const _ = $window._ as (text: string) => string; export type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void; @@ -22,7 +25,7 @@ function Label(props) { } /** Helper component for a tooltip */ function Tooltip(props) { - return ; + return ; } export class Settings extends React.Component> { diff --git a/admin/src/tabs.test.tsx b/admin/src/components/tabs.test.tsx similarity index 95% rename from admin/src/tabs.test.tsx rename to admin/src/components/tabs.test.tsx index b8b820ce..25561be9 100644 --- a/admin/src/tabs.test.tsx +++ b/admin/src/components/tabs.test.tsx @@ -14,7 +14,7 @@ import sinon from "sinon"; // import components import { Tabs } from "./tabs"; -describe.only("jQuery-UI tabs", () => { +describe("jQuery-UI tabs", () => { const definition = { "Tab 1": "Hallo", diff --git a/admin/src/tabs.tsx b/admin/src/components/tabs.tsx similarity index 96% rename from admin/src/tabs.tsx rename to admin/src/components/tabs.tsx index 2b928f8e..00d7d956 100644 --- a/admin/src/tabs.tsx +++ b/admin/src/components/tabs.tsx @@ -30,7 +30,7 @@ export class Tabs extends React.Component {
    {Object.keys(this.state.tabs).map( - (k, i) =>
  • {k}
  • , + (k, i) =>
  • {k}
  • , )}
{Object.keys(this.state.tabs).map( diff --git a/admin/src/index.test.tsx b/admin/src/index.test.tsx index f1026c19..98d93708 100644 --- a/admin/src/index.test.tsx +++ b/admin/src/index.test.tsx @@ -5,7 +5,7 @@ import * as ReactDOM from "react-dom"; // Setup Enzyme adapter import {configure, shallow} from "enzyme"; import * as Adapter from "enzyme-adapter-react-16"; -configure({ adapter: new Adapter() }); +configure({ adapter: new (Adapter as any)() }); // tslint:disable:no-unused-expression import { assert, expect } from "chai"; diff --git a/admin/src/index.tsx b/admin/src/index.tsx index cbd3c2e8..d39456c3 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -4,9 +4,10 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; // components -import Fragment from "./fragment"; -import { OnSettingsChangedCallback, Settings } from "./settings"; -import { Tabs } from "./tabs"; +import Fragment from "./components/fragment"; +import { Groups } from "./components/groups"; +import { OnSettingsChangedCallback, Settings } from "./components/settings"; +import { Tabs } from "./components/tabs"; const $window = window as any; const namespace = `tradfri.${$window.instance}`; @@ -22,7 +23,10 @@ function Root(props) { return (
- + , + Groups: , + }} /> ); } @@ -39,7 +43,7 @@ $window.load = (settings, onChange) => { }; ReactDOM.render( - , + , document.getElementById("adapter-container"), ); @@ -53,8 +57,3 @@ $window.save = (callback) => { // save the settings callback(curSettings); }; - -ReactDOM.render( - 1, Test2: 2}} />, - document.getElementById("adapter-container"), -); From cfd5d804409f5e91f619f40144fce45443f6725d Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Fri, 20 Oct 2017 23:27:21 +0200 Subject: [PATCH 17/51] fixed sinon import --- admin/src/components/tabs.test.tsx | 2 +- admin/src/index.test.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/admin/src/components/tabs.test.tsx b/admin/src/components/tabs.test.tsx index 25561be9..a61b4890 100644 --- a/admin/src/components/tabs.test.tsx +++ b/admin/src/components/tabs.test.tsx @@ -9,7 +9,7 @@ configure({ adapter: new (Adapter as any)() }); // tslint:disable:no-unused-expression import { assert, expect } from "chai"; -import sinon from "sinon"; +import * as sinon from "sinon"; // import components import { Tabs } from "./tabs"; diff --git a/admin/src/index.test.tsx b/admin/src/index.test.tsx index 98d93708..77c78ffb 100644 --- a/admin/src/index.test.tsx +++ b/admin/src/index.test.tsx @@ -9,7 +9,7 @@ configure({ adapter: new (Adapter as any)() }); // tslint:disable:no-unused-expression import { assert, expect } from "chai"; -import sinon from "sinon"; +import * as sinon from "sinon"; describe("tsx dummy test", () => { From 9675bd743af9596f2bee1e63a8763ca0ae484a20 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 10:33:03 +0200 Subject: [PATCH 18/51] fixed layout and styles --- admin/build/main.bundle.js | 21 +++++++++------------ admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/settings.tsx | 21 +++++++++------------ admin/src/components/tabs.tsx | 2 +- admin/style.css | 17 ++++++++++++++--- 6 files changed, 35 insertions(+), 30 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 8b7f72f4..789aad7f 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -44,7 +44,6 @@ exports.Groups = Groups; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); -const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); const $window = window; /** Translates text */ const _ = $window._; @@ -105,16 +104,14 @@ class Settings extends React.Component { return this.state; } render() { - return (React.createElement(fragment_1.default, null, - React.createElement("h4", { key: "header", className: "translate" }, "Settings"), - React.createElement("p", { key: "content", className: "settings-table" }, - React.createElement(Label, { for: "host", text: "Gateway IP/Hostname:" }), - React.createElement(Tooltip, { text: "Der Hostname ist \"gw-\" gefolgt von der MAC-Adresse bzw. Seriennummer des Gateways, ohne Sonderzeichen, z.B. gw-a0b1c2d3e4f5. Er findet sich auf der Unterseite des Gateways" }), - React.createElement("input", { className: "value", id: "host", value: this.getSetting("host"), onChange: this.handleChange }), - React.createElement("br", null), - React.createElement(Label, { for: "securityCode", text: "Security-Code:" }), - React.createElement(Tooltip, { text: "Der Security-Code findet sich auf der Unterseite des Gateways" }), - React.createElement("input", { className: "value", id: "securityCode", value: this.getSetting("securityCode"), onChange: this.handleChange })))); + return (React.createElement("p", { key: "content", className: "settings-table" }, + React.createElement(Label, { for: "host", text: "Gateway IP/Hostname:" }), + React.createElement(Tooltip, { text: "Der Hostname ist \"gw-\" gefolgt von der MAC-Adresse bzw. Seriennummer des Gateways, ohne Sonderzeichen, z.B. gw-a0b1c2d3e4f5. Er findet sich auf der Unterseite des Gateways" }), + React.createElement("input", { className: "value", id: "host", value: this.getSetting("host"), onChange: this.handleChange }), + React.createElement("br", null), + React.createElement(Label, { for: "securityCode", text: "Security-Code:" }), + React.createElement(Tooltip, { text: "Der Security-Code findet sich auf der Unterseite des Gateways" }), + React.createElement("input", { className: "value", id: "securityCode", value: this.getSetting("securityCode"), onChange: this.handleChange }))); } } exports.Settings = Settings; @@ -151,7 +148,7 @@ class Tabs extends React.Component { return (React.createElement("div", { id: this.containerId }, React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, React.createElement("a", { href: `#${this.containerId}-${i}`, className: "translate" }, k)))), - Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `#${this.containerId}-${i}` }, this.state.tabs[k])))); + Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.state.tabs[k])))); } } exports.Tabs = Tabs; diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 7befc9d8..9a07daa4 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

Settings

\r\n\t\t\t\t

\r\n\t\t\t\t\t

\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACVA;AAGA;AAEA;AAEA;AACA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAIA;AACA;AA1EA;;;;;;;;;;;AC9BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACPA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACVA;AAKA;AAEA;AACA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;AC9BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACPA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 0b988618..00753ef8 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 430c4bf5e1f768c916be"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 430c4bf5e1f768c916be"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap b57d998202819d914563"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b57d998202819d914563"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/settings.tsx b/admin/src/components/settings.tsx index 4ed4c8f2..048e1a45 100644 --- a/admin/src/components/settings.tsx +++ b/admin/src/components/settings.tsx @@ -88,18 +88,15 @@ export class Settings extends React.Component public render() { return ( - -

Settings

-

-

-
+

+

); } } diff --git a/admin/src/components/tabs.tsx b/admin/src/components/tabs.tsx index 00d7d956..e63d423c 100644 --- a/admin/src/components/tabs.tsx +++ b/admin/src/components/tabs.tsx @@ -34,7 +34,7 @@ export class Tabs extends React.Component { )} {Object.keys(this.state.tabs).map( - (k, i) =>
{this.state.tabs[k]}
, + (k, i) =>
{this.state.tabs[k]}
, )}
); diff --git a/admin/style.css b/admin/style.css index 8e0350f6..df015576 100644 --- a/admin/style.css +++ b/admin/style.css @@ -2,11 +2,21 @@ box-sizing: border-box } #adapter-container { - font-size: initial; padding: 0 0.5em; } -#adapter-container > * { - width: 100%; +#adapter-container .ui-tabs-panel { + padding: 0; +} +#adapter-container, #adapter-container .ui-tabs { + font-size: initial; +} +#adapter-container .ui-tabs-nav { + margin: 0 -0.5em; +} +#adapter-container > *, +.ui-tabs > *, +.ui-tabs-panel > * { + width: auto; } div.loading:first-child { margin-top: 2em; @@ -23,6 +33,7 @@ div.loading { background-size: 64px auto; background-position: left center; background-repeat: no-repeat; + margin: 0.5em auto; } [data-role="adapter-name"]::before { content: ""; From 1345ec632180181aa50d03b31f1e0465019dc6ae Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 13:35:01 +0200 Subject: [PATCH 19/51] refactored global functions/variables --- admin/build/main.bundle.js | 50 +++++++++++++++++-------------- admin/build/main.bundle.js.map | 2 +- admin/src/components/groups.tsx | 5 ---- admin/src/components/settings.tsx | 9 ++---- admin/src/components/tabs.tsx | 10 +++---- admin/src/index.tsx | 7 +++-- admin/src/lib/adapter.ts | 15 ++++++++++ admin/words.js | 10 ++++++- 8 files changed, 64 insertions(+), 44 deletions(-) create mode 100644 admin/src/lib/adapter.ts diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 789aad7f..3f0ab203 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -21,9 +21,6 @@ exports.default = Fragment; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); -const $window = window; -/** Translates text */ -const _ = $window._; class Groups extends React.Component { constructor(props) { super(props); @@ -44,18 +41,16 @@ exports.Groups = Groups; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); -const $window = window; -/** Translates text */ -const _ = $window._; +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); /** Helper component for a settings label */ function Label(props) { - return React.createElement("label", { htmlFor: props.for, className: ["translate"].concat(...(props.class || [])).join(" ") }, - props.text, + return React.createElement("label", { htmlFor: props.for, className: (props.class || []).join(" ") }, + adapter_1._(props.text), " "); } /** Helper component for a tooltip */ function Tooltip(props) { - return React.createElement("img", { className: "admin-tooltip-icon", src: "../../img/info.png", title: _(props.text) }); + return React.createElement("img", { className: "admin-tooltip-icon", src: "../../img/info.png", title: adapter_1._(props.text) }); } class Settings extends React.Component { constructor(props) { @@ -125,12 +120,8 @@ exports.Settings = Settings; "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -// Renders some components in jQuery UI tabs const React = __webpack_require__("./node_modules/react/index.js"); -// fix missing property errors/warnings -const $window = window; -const $ = $window.jQuery; -const $$ = $; +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); class Tabs extends React.Component { constructor(props) { super(props); @@ -140,14 +131,14 @@ class Tabs extends React.Component { this.containerId = this.props.id || "tabs"; } componentDidMount() { - if (!$) + if (!adapter_1.$$) return; // we're in a test environment without jQuery - $$(`#${this.containerId}`).tabs(); + adapter_1.$$(`#${this.containerId}`).tabs(); } render() { return (React.createElement("div", { id: this.containerId }, React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, - React.createElement("a", { href: `#${this.containerId}-${i}`, className: "translate" }, k)))), + React.createElement("a", { href: `#${this.containerId}-${i}` }, adapter_1._(k))))), Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.state.tabs[k])))); } } @@ -164,16 +155,16 @@ exports.Tabs = Tabs; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); // components const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); const groups_1 = __webpack_require__("./admin/src/components/groups.tsx"); const settings_1 = __webpack_require__("./admin/src/components/settings.tsx"); const tabs_1 = __webpack_require__("./admin/src/components/tabs.tsx"); -const $window = window; -const namespace = `tradfri.${$window.instance}`; +const namespace = `tradfri.${adapter_1.instance}`; // layout components function Header() { - return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, "Tradfri adapter settings")); + return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, adapter_1._("Tradfri adapter settings"))); } function Root(props) { return (React.createElement(fragment_1.default, null, @@ -185,7 +176,7 @@ function Root(props) { } let curSettings; // the function loadSettings has to exist ... -$window.load = (settings, onChange) => { +adapter_1.$window.load = (settings, onChange) => { const settingsChanged = (newSettings, hasChanges) => { curSettings = newSettings; onChange(hasChanges); @@ -197,12 +188,27 @@ $window.load = (settings, onChange) => { }; // ... and the function save has to exist. // you have to make sure the callback is called with the settings object as first param! -$window.save = (callback) => { +adapter_1.$window.save = (callback) => { // save the settings callback(curSettings); }; +/***/ }), + +/***/ "./admin/src/lib/adapter.ts": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +// fix missing property errors/warnings +exports.$window = window; +exports.$$ = exports.$window.jQuery; +exports.instance = exports.$window.instance; +exports._ = exports.$window._; + + /***/ }) },["./admin/src/index.tsx"]); diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 9a07daa4..f201b586 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nconst $window = window as any;\r\n\r\n/** Translates text */\r\nconst _ = $window._ as (text: string) => string;\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// fix missing property errors/warnings\r\nconst $window = window as any;\r\nconst $ = $window.jQuery as JQuery;\r\nconst $$ = $ as any;\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {k}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst $window = window as any;\r\nconst namespace = `tradfri.${$window.instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

Tradfri adapter settings

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACVA;AAKA;AAEA;AACA;AAaA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;AC9BA;AACA;AAGA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACPA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance;\r\nexport const _ = $window._;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACLA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/groups.tsx b/admin/src/components/groups.tsx index 64b27813..c4230f2a 100644 --- a/admin/src/components/groups.tsx +++ b/admin/src/components/groups.tsx @@ -3,11 +3,6 @@ import * as ReactDOM from "react-dom"; import Fragment from "./fragment"; -const $window = window as any; - -/** Translates text */ -const _ = $window._ as (text: string) => string; - export class Groups extends React.Component { constructor(props) { diff --git a/admin/src/components/settings.tsx b/admin/src/components/settings.tsx index 048e1a45..9b03e9d8 100644 --- a/admin/src/components/settings.tsx +++ b/admin/src/components/settings.tsx @@ -1,12 +1,9 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; -import Fragment from "./fragment"; - -const $window = window as any; +import {$$, $window, _, instance} from "../lib/adapter"; -/** Translates text */ -const _ = $window._ as (text: string) => string; +import Fragment from "./fragment"; export type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void; @@ -21,7 +18,7 @@ interface DictionaryLike { /** Helper component for a settings label */ function Label(props) { - return ; + return ; } /** Helper component for a tooltip */ function Tooltip(props) { diff --git a/admin/src/components/tabs.tsx b/admin/src/components/tabs.tsx index e63d423c..809c9649 100644 --- a/admin/src/components/tabs.tsx +++ b/admin/src/components/tabs.tsx @@ -1,11 +1,9 @@ // Renders some components in jQuery UI tabs +import * as $ from "jquery"; import * as React from "react"; import * as ReactDOM from "react-dom"; -// fix missing property errors/warnings -const $window = window as any; -const $ = $window.jQuery as JQuery; -const $$ = $ as any; +import {$$, $window, _, instance} from "../lib/adapter"; export class Tabs extends React.Component { @@ -20,7 +18,7 @@ export class Tabs extends React.Component { private containerId: string; public componentDidMount() { - if (!$) return; // we're in a test environment without jQuery + if (!$$) return; // we're in a test environment without jQuery $$(`#${this.containerId}`).tabs(); } @@ -30,7 +28,7 @@ export class Tabs extends React.Component {
    {Object.keys(this.state.tabs).map( - (k, i) =>
  • {k}
  • , + (k, i) =>
  • {_(k)}
  • , )}
{Object.keys(this.state.tabs).map( diff --git a/admin/src/index.tsx b/admin/src/index.tsx index d39456c3..76f7dd1b 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -3,19 +3,20 @@ import * as $ from "jquery"; import * as React from "react"; import * as ReactDOM from "react-dom"; +import {$$, $window, _, instance} from "./lib/adapter"; + // components import Fragment from "./components/fragment"; import { Groups } from "./components/groups"; import { OnSettingsChangedCallback, Settings } from "./components/settings"; import { Tabs } from "./components/tabs"; -const $window = window as any; -const namespace = `tradfri.${$window.instance}`; +const namespace = `tradfri.${instance}`; // layout components function Header() { return ( -

Tradfri adapter settings

+

{_("Tradfri adapter settings")}

); } diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts new file mode 100644 index 00000000..38fe100b --- /dev/null +++ b/admin/src/lib/adapter.ts @@ -0,0 +1,15 @@ +// fix missing property errors/warnings +export const $window = window as any as { + load: (settings, onChange) => void; + save: (callback: (settings) => void) => void; + readonly instance: number; + /** Translates text */ + _: (text: string) => string; + jQuery: JQueryStatic; +}; +export interface JQueryWithTabs { + tabs: (selector?: any) => JQuery & JQueryWithTabs; +} +export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs; +export const instance = $window.instance; +export const _ = $window._; diff --git a/admin/words.js b/admin/words.js index f0a23fe3..fd7974ed 100644 --- a/admin/words.js +++ b/admin/words.js @@ -4,7 +4,7 @@ systemDictionary = { "de": "Lade Einstellungen...", "en": "loading settings..." }, - "tradfri adapter settings": { + "Tradfri adapter settings": { "de": "Einstellungen für Trådfri-Adapter", "en": "Trådfri adapter settings" }, @@ -16,4 +16,12 @@ systemDictionary = { "de": "Der Security-Code findet sich auf der Unterseite des Gateways", "en": "The security code can be found on the bottom of the gateway" }, + "Settings": { + "de": "Einstellungen", + "en": "Settings" + }, + "Groups": { + "de": "Virtuelle Gruppen", + "en": "Virtual groups" + }, }; \ No newline at end of file From 67f0d1c0d122b05e5fa697c06fa0c72f2603b3ca Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 14:45:36 +0200 Subject: [PATCH 20/51] refactored message handler into a seperate module --- build/adapter/gateway.d.ts | 23 ++++ build/adapter/gateway.js | 19 +++ build/adapter/message.d.ts | 1 + build/adapter/message.js | 140 ++++++++++++++++++++ build/lib/coap-payload.d.ts | 2 + build/lib/coap-payload.js | 18 +++ build/main.js | 246 ++++++++--------------------------- src/adapter/gateway.ts | 27 ++++ src/adapter/message.ts | 136 +++++++++++++++++++ src/lib/coap-payload.ts | 17 +++ src/main.ts | 252 ++++++++---------------------------- 11 files changed, 493 insertions(+), 388 deletions(-) create mode 100644 build/adapter/gateway.d.ts create mode 100644 build/adapter/gateway.js create mode 100644 build/adapter/message.d.ts create mode 100644 build/adapter/message.js create mode 100644 build/lib/coap-payload.d.ts create mode 100644 build/lib/coap-payload.js create mode 100644 src/adapter/gateway.ts create mode 100644 src/adapter/message.ts create mode 100644 src/lib/coap-payload.ts diff --git a/build/adapter/gateway.d.ts b/build/adapter/gateway.d.ts new file mode 100644 index 00000000..357bbc2b --- /dev/null +++ b/build/adapter/gateway.d.ts @@ -0,0 +1,23 @@ +import { Accessory } from "../ipso/accessory"; +import { Group } from "../ipso/group"; +import { Scene } from "../ipso/scene"; +import { DictionaryLike } from "../lib/object-polyfill"; +import { VirtualGroup } from "../lib/virtual-group"; +export interface GroupInfo { + group: Group; + scenes: DictionaryLike; +} +export declare class Gateway { + /** dictionary of COAP observers */ + observers: string[]; + /** dictionary of known devices */ + devices: DictionaryLike; + /** dictionary of known groups */ + groups: DictionaryLike; + /** dictionary of known virtual groups */ + virtualGroups: DictionaryLike; + private _requestBase; + /** Common URL for all requests */ + requestBase: string; +} +export declare const gateway: Gateway; diff --git a/build/adapter/gateway.js b/build/adapter/gateway.js new file mode 100644 index 00000000..a59cbd36 --- /dev/null +++ b/build/adapter/gateway.js @@ -0,0 +1,19 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +class Gateway { + constructor() { + /** dictionary of COAP observers */ + this.observers = []; + /** dictionary of known devices */ + this.devices = {}; + /** dictionary of known groups */ + this.groups = {}; + /** dictionary of known virtual groups */ + this.virtualGroups = {}; + } + /** Common URL for all requests */ + get requestBase() { return this._requestBase; } + set requestBase(value) { this._requestBase = value; } +} +exports.Gateway = Gateway; +exports.gateway = new Gateway(); diff --git a/build/adapter/message.d.ts b/build/adapter/message.d.ts new file mode 100644 index 00000000..295977e8 --- /dev/null +++ b/build/adapter/message.d.ts @@ -0,0 +1 @@ +export declare function onMessage(obj: any): Promise; diff --git a/build/adapter/message.js b/build/adapter/message.js new file mode 100644 index 00000000..50e95677 --- /dev/null +++ b/build/adapter/message.js @@ -0,0 +1,140 @@ +"use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_coap_client_1 = require("node-coap-client"); +const accessory_1 = require("../ipso/accessory"); +const coap_payload_1 = require("../lib/coap-payload"); +const global_1 = require("../lib/global"); +const object_polyfill_1 = require("../lib/object-polyfill"); +const gateway_1 = require("./gateway"); +function onMessage(obj) { + return __awaiter(this, void 0, void 0, function* () { + // responds to the adapter that sent the original message + function respond(response) { + if (obj.callback) + global_1.Global.adapter.sendTo(obj.from, obj.command, response, obj.callback); + } + // some predefined responses so we only have to define them once + const responses = { + ACK: { error: null }, + OK: { error: null, result: "ok" }, + ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, + MISSING_PARAMETER: (paramName) => { + return { error: 'missing parameter "' + paramName + '"!' }; + }, + COMMAND_RUNNING: { error: "command running" }, + RESULT: (result) => ({ error: null, result }), + ERROR: (error) => ({ error }), + }; + // make required parameters easier + function requireParams(...params) { + if (!(params && params.length)) + return true; + for (const param of params) { + if (!(obj.message && obj.message.hasOwnProperty(param))) { + respond(responses.MISSING_PARAMETER(param)); + return false; + } + } + return true; + } + // handle the message + if (obj) { + switch (obj.command) { + case "request": { + // require the path to be given + if (!requireParams("path")) + return; + // check the given params + const params = obj.message; + params.method = params.method || "get"; + if (["get", "post", "put", "delete"].indexOf(params.method) === -1) { + respond({ error: `unsupported request method "${params.method}"` }); + return; + } + global_1.Global.log(`custom coap request: ${params.method.toUpperCase()} "${gateway_1.gateway.requestBase}${params.path}"`); + // create payload + let payload; + if (params.payload) { + payload = JSON.stringify(params.payload); + global_1.Global.log("sending custom payload: " + payload); + payload = Buffer.from(payload); + } + // wait for the CoAP response and respond to the message + const resp = yield node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${params.path}`, params.method, payload); + respond(responses.RESULT({ + code: resp.code.toString(), + payload: coap_payload_1.parsePayload(resp), + })); + return; + } + case "getGroups": { + // check the given params + const params = obj.message; + // group type must be "real", "virtual" or "both" + const groupType = params.type || "real"; + if (["real", "virtual", "both"].indexOf(groupType) === -1) { + respond(responses.ERROR(`group type must be "real", "virtual" or "both"`)); + return; + } + const ret = {}; + if (groupType === "real" || groupType === "both") { + for (const [id, group] of object_polyfill_1.entries(gateway_1.gateway.groups)) { + ret[id] = { + id, + name: group.group.name, + deviceIDs: group.group.deviceIDs, + type: "real", + }; + } + } + if (groupType === "virtual" || groupType === "both") { + for (const [id, group] of object_polyfill_1.entries(gateway_1.gateway.virtualGroups)) { + ret[id] = { + id, + name: group.name, + deviceIDs: group.deviceIDs, + type: "virtual", + }; + } + } + respond(responses.RESULT(ret)); + return; + } + case "getDevice": { + // require the id to be given + if (!requireParams("id")) + return; + // check the given params + const params = obj.message; + if (!(params.id in gateway_1.gateway.devices)) { + respond(responses.ERROR(`device with id ${params.id} not found`)); + return; + } + const device = gateway_1.gateway.devices[params.id]; + // TODO: Do we need more? + const ret = { + name: device.name, + type: accessory_1.AccessoryTypes[device.type], + }; + if (ret.type === "lightbulb") { + ret.spectrum = device.lightList[0].spectrum; + } + respond(responses.RESULT(ret)); + return; + } + default: + respond(responses.ERROR_UNKNOWN_COMMAND); + return; + } + } + }); +} +exports.onMessage = onMessage; diff --git a/build/lib/coap-payload.d.ts b/build/lib/coap-payload.d.ts new file mode 100644 index 00000000..ebfbfb6a --- /dev/null +++ b/build/lib/coap-payload.d.ts @@ -0,0 +1,2 @@ +import { CoapResponse } from "node-coap-client"; +export declare function parsePayload(response: CoapResponse): any; diff --git a/build/lib/coap-payload.js b/build/lib/coap-payload.js new file mode 100644 index 00000000..33a2eff5 --- /dev/null +++ b/build/lib/coap-payload.js @@ -0,0 +1,18 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const global_1 = require("./global"); +function parsePayload(response) { + switch (response.format) { + case 0: // text/plain + case null:// assume text/plain + return response.payload.toString("utf-8"); + case 50:// application/json + const json = response.payload.toString("utf-8"); + return JSON.parse(json); + default: + // dunno how to parse this + global_1.Global.log(`unknown CoAP response format ${response.format}`, "warn"); + return response.payload; + } +} +exports.parsePayload = parsePayload; diff --git a/build/main.js b/build/main.js index 6ab858ce..91d4d74d 100644 --- a/build/main.js +++ b/build/main.js @@ -16,6 +16,7 @@ require("reflect-metadata"); const node_coap_client_1 = require("node-coap-client"); const endpoints_1 = require("./ipso/endpoints"); const array_extensions_1 = require("./lib/array-extensions"); +const coap_payload_1 = require("./lib/coap-payload"); const global_1 = require("./lib/global"); const object_polyfill_1 = require("./lib/object-polyfill"); const promises_1 = require("./lib/promises"); @@ -28,6 +29,11 @@ const scene_1 = require("./ipso/scene"); const virtual_group_1 = require("./lib/virtual-group"); // Adapter-Utils laden const utils_1 = require("./lib/utils"); +// Adapter-Module laden +const gateway_1 = require("./adapter/gateway"); +const message_1 = require("./adapter/message"); +// dictionary of ioBroker objects +const objects = {}; const customStateSubscriptions = { subscriptions: new Map(), counter: 0, @@ -36,16 +42,6 @@ const customObjectSubscriptions = { subscriptions: new Map(), counter: 0, }; -// dictionary of COAP observers -const observers = []; -// dictionary of known devices -const devices = {}; -const groups = {}; -const virtualGroups = {}; -// dictionary of ioBroker objects -const objects = {}; -// the base of all requests -let requestBase; // Adapter-Objekt erstellen let adapter = utils_1.default.adapter({ name: "tradfri", @@ -83,11 +79,11 @@ let adapter = utils_1.default.adapter({ node_coap_client_1.CoapClient.setSecurityParams(hostname, { psk: { "Client_identity": adapter.config.securityCode }, }); - requestBase = `coaps://${hostname}:5684/`; + gateway_1.gateway.requestBase = `coaps://${hostname}:5684/`; // Try a few times to setup a working connection const maxTries = 3; for (let i = 1; i <= maxTries; i++) { - if (yield node_coap_client_1.CoapClient.tryToConnect(requestBase)) { + if (yield node_coap_client_1.CoapClient.tryToConnect(gateway_1.gateway.requestBase)) { break; // it worked } else if (i < maxTries) { @@ -96,7 +92,7 @@ let adapter = utils_1.default.adapter({ } else if (i === maxTries) { // no working connection - global_1.Global.log(`Could not connect to the gateway ${requestBase} after ${maxTries} tries!`, "error"); + global_1.Global.log(`Could not connect to the gateway ${gateway_1.gateway.requestBase} after ${maxTries} tries!`, "error"); global_1.Global.log(`Please check your network and adapter settings and restart the adapter!`, "error"); return; } @@ -108,122 +104,8 @@ let adapter = utils_1.default.adapter({ // TODO: load known devices from ioBroker into & observeAll(); }), - message: (obj) => __awaiter(this, void 0, void 0, function* () { - // responds to the adapter that sent the original message - function respond(response) { - if (obj.callback) - adapter.sendTo(obj.from, obj.command, response, obj.callback); - } - // some predefined responses so we only have to define them once - const responses = { - ACK: { error: null }, - OK: { error: null, result: "ok" }, - ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, - MISSING_PARAMETER: (paramName) => { - return { error: 'missing parameter "' + paramName + '"!' }; - }, - COMMAND_RUNNING: { error: "command running" }, - RESULT: (result) => ({ error: null, result }), - ERROR: (error) => ({ error }), - }; - // make required parameters easier - function requireParams(...params) { - if (!(params && params.length)) - return true; - for (const param of params) { - if (!(obj.message && obj.message.hasOwnProperty(param))) { - respond(responses.MISSING_PARAMETER(param)); - return false; - } - } - return true; - } - // handle the message - if (obj) { - switch (obj.command) { - case "request": { - // require the path to be given - if (!requireParams("path")) - return; - // check the given params - const params = obj.message; - params.method = params.method || "get"; - if (["get", "post", "put", "delete"].indexOf(params.method) === -1) { - respond({ error: `unsupported request method "${params.method}"` }); - return; - } - global_1.Global.log(`custom coap request: ${params.method.toUpperCase()} "${requestBase}${params.path}"`); - // create payload - let payload; - if (params.payload) { - payload = JSON.stringify(params.payload); - global_1.Global.log("sending custom payload: " + payload); - payload = Buffer.from(payload); - } - // wait for the CoAP response and respond to the message - const resp = yield node_coap_client_1.CoapClient.request(`${requestBase}${params.path}`, params.method, payload); - respond(responses.RESULT({ - code: resp.code.toString(), - payload: parsePayload(resp), - })); - return; - } - case "getGroups": { - // check the given params - const params = obj.message; - // group type must be "real", "virtual" or "both" - const groupType = params.type || "real"; - if (["real", "virtual", "both"].indexOf(groupType) === -1) { - respond(responses.ERROR(`group type must be "real", "virtual" or "both"`)); - return; - } - const ret = {}; - if (groupType === "real" || groupType === "both") { - for (const [id, group] of object_polyfill_1.entries(groups)) { - ret[id] = { - name: group.group.name, - deviceIDs: group.group.deviceIDs, - type: "real", - }; - } - } - if (groupType === "virtual" || groupType === "both") { - for (const [id, group] of object_polyfill_1.entries(virtualGroups)) { - ret[id] = { - name: group.name, - deviceIDs: group.deviceIDs, - type: "virtual", - }; - } - } - respond(responses.RESULT(ret)); - return; - } - case "getDevice": { - // require the id to be given - if (!requireParams("id")) - return; - // check the given params - const params = obj.message; - if (!(params.id in devices)) { - respond(responses.ERROR(`device with id ${params.id} not found`)); - return; - } - const device = devices[params.id]; - // TODO: Do we need more? - const ret = { - name: device.name, - type: accessory_1.AccessoryTypes[device.type], - }; - respond(responses.RESULT(ret)); - return; - } - default: - respond(responses.ERROR_UNKNOWN_COMMAND); - return; - } - } - }), + // Handle sendTo-Messages + message: message_1.onMessage, objectChange: (id, obj) => { global_1.Global.log(`{{blue}} object with id ${id} ${obj ? "updated" : "deleted"}`, "debug"); if (id.startsWith(adapter.namespace)) { @@ -231,18 +113,18 @@ let adapter = utils_1.default.adapter({ if (obj) { // first check if we have to modify a device/group/whatever const instanceId = getInstanceId(id); - if (obj.type === "device" && instanceId in devices && devices[instanceId] != null) { + if (obj.type === "device" && instanceId in gateway_1.gateway.devices && gateway_1.gateway.devices[instanceId] != null) { // if this device is in the device list, check for changed properties - const acc = devices[instanceId]; + const acc = gateway_1.gateway.devices[instanceId]; if (obj.common && obj.common.name !== acc.name) { // the name has changed, notify the gateway global_1.Global.log(`the device ${id} was renamed to "${obj.common.name}"`); renameDevice(acc, obj.common.name); } } - else if (obj.type === "channel" && instanceId in groups && groups[instanceId] != null) { + else if (obj.type === "channel" && instanceId in gateway_1.gateway.groups && gateway_1.gateway.groups[instanceId] != null) { // if this group is in the groups list, check for changed properties - const grp = groups[instanceId].group; + const grp = gateway_1.gateway.groups[instanceId].group; if (obj.common && obj.common.name !== grp.name) { // the name has changed, notify the gateway global_1.Global.log(`the group ${id} was renamed to "${obj.common.name}"`); @@ -323,7 +205,7 @@ let adapter = utils_1.default.adapter({ switch (rootObj.native.type) { case "group": { // read the instanceId and get a reference value - const group = groups[rootObj.native.instanceId].group; + const group = gateway_1.gateway.groups[rootObj.native.instanceId].group; // if the change was acknowledged, update the state later let wasAcked; if (id.endsWith(".state")) { @@ -361,7 +243,7 @@ let adapter = utils_1.default.adapter({ } case "virtual group": { // find the virtual group instance - const vGroup = virtualGroups[rootObj.native.instanceId]; + const vGroup = gateway_1.gateway.virtualGroups[rootObj.native.instanceId]; let operation; if (id.endsWith(".state")) { operation = { @@ -395,7 +277,7 @@ let adapter = utils_1.default.adapter({ default: { if (id.indexOf(".lightbulb.") > -1) { // read the instanceId and get a reference value - const accessory = devices[rootObj.native.instanceId]; + const accessory = gateway_1.gateway.devices[rootObj.native.instanceId]; const light = accessory.lightList[0]; // if the change was acknowledged, update the state later let wasAcked; @@ -469,7 +351,7 @@ let adapter = utils_1.default.adapter({ if (pingTimer != null) clearInterval(pingTimer); // stop all observers - for (const url of observers) { + for (const url of gateway_1.gateway.observers) { node_coap_client_1.CoapClient.stopObserving(url); } // close all sockets @@ -493,7 +375,7 @@ function operateLight(accessory, operation) { throw new Error("The parameter accessory must be a lightbulb!"); } // the url to be requested - const url = `${requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`; + const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`; // create a copy to modify const newAccessory = accessory.clone(); // get the Light instance to modify @@ -521,7 +403,7 @@ function operateLight(accessory, operation) { function operateGroup(group, operation) { return __awaiter(this, void 0, void 0, function* () { // the url to be requested - const url = `${requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`; + const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`; // create a copy to modify const newGroup = group.clone(); newGroup.merge(operation); @@ -549,7 +431,7 @@ function operateVirtualGroup(group, operation) { return __awaiter(this, void 0, void 0, function* () { // find all lightbulbs belonging to this group const lightbulbAccessories = group.deviceIDs - .map(did => devices[did]) + .map(did => gateway_1.gateway.devices[did]) .filter(dev => dev != null && dev.type === accessory_1.AccessoryTypes.lightbulb); for (const acc of lightbulbAccessories) { yield operateLight(acc, operation); @@ -580,11 +462,11 @@ function observeResource(path, callback) { return __awaiter(this, void 0, void 0, function* () { path = normalizeResourcePath(path); // check if we are already observing this resource - const observerUrl = `${requestBase}${path}`; - if (observers.indexOf(observerUrl) > -1) + const observerUrl = `${gateway_1.gateway.requestBase}${path}`; + if (gateway_1.gateway.observers.indexOf(observerUrl) > -1) return; // start observing - observers.push(observerUrl); + gateway_1.gateway.observers.push(observerUrl); return node_coap_client_1.CoapClient.observe(observerUrl, "get", callback); }); } @@ -595,18 +477,18 @@ function observeResource(path, callback) { function stopObservingResource(path) { path = normalizeResourcePath(path); // remove observer - const observerUrl = `${requestBase}${path}`; - const index = observers.indexOf(observerUrl); + const observerUrl = `${gateway_1.gateway.requestBase}${path}`; + const index = gateway_1.gateway.observers.indexOf(observerUrl); if (index === -1) return; node_coap_client_1.CoapClient.stopObserving(observerUrl); - observers.splice(index, 1); + gateway_1.gateway.observers.splice(index, 1); } /** - * Clears the list of observers after a network reset + * Clears the list of gw.observers after a network reset */ function clearObservers() { - observers.splice(0, observers.length); + gateway_1.gateway.observers.splice(0, gateway_1.gateway.observers.length); } function observeAll() { observeDevices(); @@ -623,10 +505,10 @@ function coapCb_getAllDevices(response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getAllDevices.`, "error"); return; } - const newDevices = parsePayload(response); + const newDevices = coap_payload_1.parsePayload(response); global_1.Global.log(`got all devices: ${JSON.stringify(newDevices)}`); // get old keys as int array - const oldKeys = Object.keys(devices).map(k => +k).sort(); + const oldKeys = Object.keys(gateway_1.gateway.devices).map(k => +k).sort(); // get new keys as int array const newKeys = newDevices.sort(); // translate that into added and removed devices @@ -639,12 +521,12 @@ function coapCb_getAllDevices(response) { const removedKeys = array_extensions_1.except(oldKeys, newKeys); global_1.Global.log(`removing devices with keys ${JSON.stringify(removedKeys)}`, "debug"); removedKeys.forEach((id) => __awaiter(this, void 0, void 0, function* () { - if (id in devices) { + if (id in gateway_1.gateway.devices) { // delete ioBroker device - const deviceName = calcObjName(devices[id]); + const deviceName = calcObjName(gateway_1.gateway.devices[id]); yield adapter.$deleteDevice(deviceName); // remove device from dictionary - delete groups[id]; + delete gateway_1.gateway.groups[id]; } // remove observer stopObservingResource(`${endpoints_1.endpoints.devices}/${id}`); @@ -657,11 +539,11 @@ function coap_getDevice_cb(instanceId, response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getDevice(${instanceId}).`, "error"); return; } - const result = parsePayload(response); + const result = coap_payload_1.parsePayload(response); // parse device info const accessory = new accessory_1.Accessory().parse(result).createProxy(); // remember the device object, so we can later use it as a reference for updates - devices[instanceId] = accessory; + gateway_1.gateway.devices[instanceId] = accessory; // create ioBroker device extendDevice(accessory); } @@ -676,10 +558,10 @@ function coapCb_getAllGroups(response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getAllGroups.`, "error"); return; } - const newGroups = parsePayload(response); + const newGroups = coap_payload_1.parsePayload(response); global_1.Global.log(`got all groups: ${JSON.stringify(newGroups)}`); // get old keys as int array - const oldKeys = Object.keys(groups).map(k => +k).sort(); + const oldKeys = Object.keys(gateway_1.gateway.groups).map(k => +k).sort(); // get new keys as int array const newKeys = newGroups.sort(); // translate that into added and removed devices @@ -692,12 +574,12 @@ function coapCb_getAllGroups(response) { const removedKeys = array_extensions_1.except(oldKeys, newKeys); global_1.Global.log(`removing groups with keys ${JSON.stringify(removedKeys)}`, "debug"); removedKeys.forEach((id) => __awaiter(this, void 0, void 0, function* () { - if (id in groups) { + if (id in gateway_1.gateway.groups) { // delete ioBroker group - const groupName = calcGroupName(groups[id].group); + const groupName = calcGroupName(gateway_1.gateway.groups[id].group); yield adapter.$deleteChannel(groupName); // remove group from dictionary - delete groups[id]; + delete gateway_1.gateway.groups[id]; } // remove observer stopObservingResource(`${endpoints_1.endpoints.groups}/${id}`); @@ -718,19 +600,19 @@ function coap_getGroup_cb(instanceId, response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getGroup(${instanceId}).`, "error"); return; } - const result = parsePayload(response); + const result = coap_payload_1.parsePayload(response); // parse group info const group = (new group_1.Group()).parse(result).createProxy(); // remember the group object, so we can later use it as a reference for updates let groupInfo; - if (!(instanceId in groups)) { + if (!(instanceId in gateway_1.gateway.groups)) { // if there's none, create one - groups[instanceId] = { + gateway_1.gateway.groups[instanceId] = { group: null, scenes: {}, }; } - groupInfo = groups[instanceId]; + groupInfo = gateway_1.gateway.groups[instanceId]; groupInfo.group = group; // create ioBroker states extendGroup(group); @@ -744,8 +626,8 @@ function coap_getAllScenes_cb(groupId, response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getAllScenes(${groupId}).`, "error"); return; } - const groupInfo = groups[groupId]; - const newScenes = parsePayload(response); + const groupInfo = gateway_1.gateway.groups[groupId]; + const newScenes = coap_payload_1.parsePayload(response); global_1.Global.log(`got all scenes in group ${groupId}: ${JSON.stringify(newScenes)}`); // get old keys as int array const oldKeys = Object.keys(groupInfo.scenes).map(k => +k).sort(); @@ -785,13 +667,13 @@ function coap_getScene_cb(groupId, instanceId, response) { global_1.Global.log(`unexpected response (${response.code.toString()}) to getScene(${groupId}, ${instanceId}).`, "error"); return; } - const result = parsePayload(response); + const result = coap_payload_1.parsePayload(response); // parse scene info const scene = (new scene_1.Scene()).parse(result).createProxy(); // remember the scene object, so we can later use it as a reference for updates - groups[groupId].scenes[instanceId] = scene; + gateway_1.gateway.groups[groupId].scenes[instanceId] = scene; // Update the scene dropdown for the group - updatePossibleScenes(groups[groupId]); + updatePossibleScenes(gateway_1.gateway.groups[groupId]); } /** * Returns the ioBroker id of the root object for the given state @@ -1331,7 +1213,7 @@ function updatePossibleScenes(groupInfo) { return __awaiter(this, void 0, void 0, function* () { const group = groupInfo.group; // if this group is not in the dictionary, don't do anything - if (!(group.instanceId in groups)) + if (!(group.instanceId in gateway_1.gateway.groups)) return; // find out which is the root object id const objId = calcGroupId(group); @@ -1488,7 +1370,7 @@ function renameDevice(accessory, newName) { let payload = JSON.stringify(serializedObj); global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); payload = Buffer.from(payload); - node_coap_client_1.CoapClient.request(`${requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`, "put", payload); + node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`, "put", payload); } /** * Renames a group @@ -1510,7 +1392,7 @@ function renameGroup(group, newName) { let payload = JSON.stringify(serializedObj); global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); payload = Buffer.from(payload); - node_coap_client_1.CoapClient.request(`${requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`, "put", payload); + node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`, "put", payload); } // ================================== // Custom subscriptions @@ -1583,20 +1465,6 @@ function unsubscribeObjects(id) { customObjectSubscriptions.subscriptions.delete(id); } } -function parsePayload(response) { - switch (response.format) { - case 0: // text/plain - case null:// assume text/plain - return response.payload.toString("utf-8"); - case 50:// application/json - const json = response.payload.toString("utf-8"); - return JSON.parse(json); - default: - // dunno how to parse this - global_1.Global.log(`unknown CoAP response format ${response.format}`, "warn"); - return response.payload; - } -} /** * Loads defined virtual groups from the ioBroker objects DB */ @@ -1610,7 +1478,7 @@ function loadVirtualGroups() { g.native.type === "virtual group"; }); // load them into the virtualGroups dict - Object.assign(virtualGroups, object_polyfill_1.composeObject(groupObjects.map(g => { + Object.assign(gateway_1.gateway.virtualGroups, object_polyfill_1.composeObject(groupObjects.map(g => { const id = g.native.instanceId; const instanceIDs = g.native.instanceIDs; const ret = new virtual_group_1.VirtualGroup(id); @@ -1629,7 +1497,7 @@ let dead = false; function pingThread() { return __awaiter(this, void 0, void 0, function* () { const oldValue = connectionAlive; - connectionAlive = yield node_coap_client_1.CoapClient.ping(requestBase); + connectionAlive = yield node_coap_client_1.CoapClient.ping(gateway_1.gateway.requestBase); global_1.Global.log(`ping ${connectionAlive ? "" : "un"}successful...`, "debug"); yield adapter.$setStateChanged("info.connection", connectionAlive, true); // see if the connection state has changed @@ -1639,7 +1507,7 @@ function pingThread() { // connection is now alive again global_1.Global.log("Connection to gateway reestablished", "info"); // restart observing if neccessary - if (observers.length === 0) + if (gateway_1.gateway.observers.length === 0) observeAll(); // TODO: send buffered messages } diff --git a/src/adapter/gateway.ts b/src/adapter/gateway.ts new file mode 100644 index 00000000..55bdba5e --- /dev/null +++ b/src/adapter/gateway.ts @@ -0,0 +1,27 @@ +import { Accessory, AccessoryTypes } from "../ipso/accessory"; +import { Group } from "../ipso/group"; +import { Scene } from "../ipso/scene"; +import { DictionaryLike } from "../lib/object-polyfill"; +import { VirtualGroup } from "../lib/virtual-group"; + +export interface GroupInfo { + group: Group; + scenes: DictionaryLike; +} + +export class Gateway { + /** dictionary of COAP observers */ + public observers: string[] = []; + /** dictionary of known devices */ + public devices: DictionaryLike = {}; + /** dictionary of known groups */ + public groups: DictionaryLike = {}; + /** dictionary of known virtual groups */ + public virtualGroups: DictionaryLike = {}; + private _requestBase: string; + /** Common URL for all requests */ + public get requestBase(): string { return this._requestBase; } + public set requestBase(value: string) { this._requestBase = value; } +} + +export const gateway = new Gateway(); diff --git a/src/adapter/message.ts b/src/adapter/message.ts new file mode 100644 index 00000000..2650999b --- /dev/null +++ b/src/adapter/message.ts @@ -0,0 +1,136 @@ +import { CoapClient as coap, CoapResponse } from "node-coap-client"; +import { Accessory, AccessoryTypes } from "../ipso/accessory"; +import { parsePayload } from "../lib/coap-payload"; +import { ExtendedAdapter, Global as _ } from "../lib/global"; +import { entries } from "../lib/object-polyfill"; +import { gateway as gw } from "./gateway"; + +export async function onMessage(obj) { + // responds to the adapter that sent the original message + function respond(response) { + if (obj.callback) _.adapter.sendTo(obj.from, obj.command, response, obj.callback); + } + // some predefined responses so we only have to define them once + const responses = { + ACK: { error: null }, + OK: { error: null, result: "ok" }, + ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, + MISSING_PARAMETER: (paramName) => { + return { error: 'missing parameter "' + paramName + '"!' }; + }, + COMMAND_RUNNING: { error: "command running" }, + RESULT: (result) => ({ error: null, result }), + ERROR: (error: string) => ({ error }), + }; + // make required parameters easier + function requireParams(...params: string[]) { + if (!(params && params.length)) return true; + for (const param of params) { + if (!(obj.message && obj.message.hasOwnProperty(param))) { + respond(responses.MISSING_PARAMETER(param)); + return false; + } + } + return true; + } + + // handle the message + if (obj) { + switch (obj.command) { + case "request": {// custom CoAP request + // require the path to be given + if (!requireParams("path")) return; + + // check the given params + const params = obj.message as any; + params.method = params.method || "get"; + if (["get", "post", "put", "delete"].indexOf(params.method) === -1) { + respond({ error: `unsupported request method "${params.method}"` }); + return; + } + + _.log(`custom coap request: ${params.method.toUpperCase()} "${gw.requestBase}${params.path}"`); + + // create payload + let payload: string | Buffer; + if (params.payload) { + payload = JSON.stringify(params.payload); + _.log("sending custom payload: " + payload); + payload = Buffer.from(payload); + } + + // wait for the CoAP response and respond to the message + const resp = await coap.request(`${gw.requestBase}${params.path}`, params.method, payload as Buffer); + respond(responses.RESULT({ + code: resp.code.toString(), + payload: parsePayload(resp), + })); + return; + } + + case "getGroups": { // get all groups defined on the gateway + // check the given params + const params = obj.message as any; + // group type must be "real", "virtual" or "both" + const groupType = params.type || "real"; + if (["real", "virtual", "both"].indexOf(groupType) === -1) { + respond(responses.ERROR(`group type must be "real", "virtual" or "both"`)); + return; + } + + const ret = {}; + if (groupType === "real" || groupType === "both") { + for (const [id, group] of entries(gw.groups)) { + ret[id] = { + id, + name: group.group.name, + deviceIDs: group.group.deviceIDs, + type: "real", + }; + } + } + if (groupType === "virtual" || groupType === "both") { + for (const [id, group] of entries(gw.virtualGroups)) { + ret[id] = { + id, + name: group.name, + deviceIDs: group.deviceIDs, + type: "virtual", + }; + } + } + + respond(responses.RESULT(ret)); + return; + } + + case "getDevice": { // get preprocessed information about a device + // require the id to be given + if (!requireParams("id")) return; + + // check the given params + const params = obj.message as any; + if (!(params.id in gw.devices)) { + respond(responses.ERROR(`device with id ${params.id} not found`)); + return; + } + + const device = gw.devices[params.id]; + // TODO: Do we need more? + const ret = { + name: device.name, + type: AccessoryTypes[device.type], // type as string + } as any; + if (ret.type === "lightbulb") { + ret.spectrum = device.lightList[0].spectrum; + } + respond(responses.RESULT(ret)); + return; + } + + default: + respond(responses.ERROR_UNKNOWN_COMMAND); + return; + } + } +} diff --git a/src/lib/coap-payload.ts b/src/lib/coap-payload.ts new file mode 100644 index 00000000..d3a000e0 --- /dev/null +++ b/src/lib/coap-payload.ts @@ -0,0 +1,17 @@ +import { CoapResponse } from "node-coap-client"; +import { Global as _ } from "./global"; + +export function parsePayload(response: CoapResponse): any { + switch (response.format) { + case 0: // text/plain + case null: // assume text/plain + return response.payload.toString("utf-8"); + case 50: // application/json + const json = response.payload.toString("utf-8"); + return JSON.parse(json); + default: + // dunno how to parse this + _.log(`unknown CoAP response format ${response.format}`, "warn"); + return response.payload; + } +} diff --git a/src/main.ts b/src/main.ts index 111abdeb..f9f0cab7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -8,6 +8,7 @@ require("reflect-metadata"); import { CoapClient as coap, CoapResponse } from "node-coap-client"; import { endpoints as coapEndpoints} from "./ipso/endpoints"; import { except } from "./lib/array-extensions"; +import { parsePayload } from "./lib/coap-payload"; import { ExtendedAdapter, Global as _ } from "./lib/global"; import { composeObject, DictionaryLike, dig, entries, filter, values } from "./lib/object-polyfill"; import { wait } from "./lib/promises"; @@ -25,6 +26,13 @@ import { VirtualGroup } from "./lib/virtual-group"; // Adapter-Utils laden import utils from "./lib/utils"; +// Adapter-Module laden +import { gateway as gw, GroupInfo } from "./adapter/gateway"; +import { onMessage } from "./adapter/message"; + +// dictionary of ioBroker objects +const objects: DictionaryLike = {}; + interface CustomStateSubscription { pattern: RegExp; callback: (id: string, state: ioBroker.State) => void; @@ -48,23 +56,6 @@ const customObjectSubscriptions: { counter: 0, }; -// dictionary of COAP observers -const observers: string[] = []; -// dictionary of known devices -const devices: DictionaryLike = {}; -// dictionary of known groups -interface GroupInfo { - group: Group; - scenes: DictionaryLike; -} -const groups: DictionaryLike = {}; -const virtualGroups: DictionaryLike = {}; -// dictionary of ioBroker objects -const objects: DictionaryLike = {}; - -// the base of all requests -let requestBase: string; - // Adapter-Objekt erstellen let adapter: ExtendedAdapter = utils.adapter({ name: "tradfri", @@ -109,19 +100,19 @@ let adapter: ExtendedAdapter = utils.adapter({ coap.setSecurityParams(hostname, { psk: { "Client_identity": adapter.config.securityCode }, }); - requestBase = `coaps://${hostname}:5684/`; + gw.requestBase = `coaps://${hostname}:5684/`; // Try a few times to setup a working connection const maxTries = 3; for (let i = 1; i <= maxTries; i++) { - if (await coap.tryToConnect(requestBase)) { + if (await coap.tryToConnect(gw.requestBase)) { break; // it worked } else if (i < maxTries) { _.log(`Could not connect to gateway, try #${i}`, "warn"); await wait(1000); } else if (i === maxTries) { // no working connection - _.log(`Could not connect to the gateway ${requestBase} after ${maxTries} tries!`, "error"); + _.log(`Could not connect to the gateway ${gw.requestBase} after ${maxTries} tries!`, "error"); _.log(`Please check your network and adapter settings and restart the adapter!`, "error"); return; } @@ -136,130 +127,8 @@ let adapter: ExtendedAdapter = utils.adapter({ }, - message: async (obj) => { - // responds to the adapter that sent the original message - function respond(response) { - if (obj.callback) adapter.sendTo(obj.from, obj.command, response, obj.callback); - } - // some predefined responses so we only have to define them once - const responses = { - ACK: { error: null }, - OK: { error: null, result: "ok" }, - ERROR_UNKNOWN_COMMAND: { error: "Unknown command!" }, - MISSING_PARAMETER: (paramName) => { - return { error: 'missing parameter "' + paramName + '"!' }; - }, - COMMAND_RUNNING: { error: "command running" }, - RESULT: (result) => ({ error: null, result }), - ERROR: (error: string) => ({ error }), - }; - // make required parameters easier - function requireParams(...params: string[]) { - if (!(params && params.length)) return true; - for (const param of params) { - if (!(obj.message && obj.message.hasOwnProperty(param))) { - respond(responses.MISSING_PARAMETER(param)); - return false; - } - } - return true; - } - - // handle the message - if (obj) { - switch (obj.command) { - case "request": {// custom CoAP request - // require the path to be given - if (!requireParams("path")) return; - - // check the given params - const params = obj.message as any; - params.method = params.method || "get"; - if (["get", "post", "put", "delete"].indexOf(params.method) === -1) { - respond({ error: `unsupported request method "${params.method}"` }); - return; - } - - _.log(`custom coap request: ${params.method.toUpperCase()} "${requestBase}${params.path}"`); - - // create payload - let payload: string | Buffer; - if (params.payload) { - payload = JSON.stringify(params.payload); - _.log("sending custom payload: " + payload); - payload = Buffer.from(payload); - } - - // wait for the CoAP response and respond to the message - const resp = await coap.request(`${requestBase}${params.path}`, params.method, payload as Buffer); - respond(responses.RESULT({ - code: resp.code.toString(), - payload: parsePayload(resp), - })); - return; - } - - case "getGroups": { // get all groups defined on the gateway - // check the given params - const params = obj.message as any; - // group type must be "real", "virtual" or "both" - const groupType = params.type || "real"; - if (["real", "virtual", "both"].indexOf(groupType) === -1) { - respond(responses.ERROR(`group type must be "real", "virtual" or "both"`)); - return; - } - - const ret = {}; - if (groupType === "real" || groupType === "both") { - for (const [id, group] of entries(groups)) { - ret[id] = { - name: group.group.name, - deviceIDs: group.group.deviceIDs, - type: "real", - }; - } - } - if (groupType === "virtual" || groupType === "both") { - for (const [id, group] of entries(virtualGroups)) { - ret[id] = { - name: group.name, - deviceIDs: group.deviceIDs, - type: "virtual", - }; - } - } - - respond(responses.RESULT(ret)); - return; - } - - case "getDevice": { // get preprocessed information about a device - // require the id to be given - if (!requireParams("id")) return; - - // check the given params - const params = obj.message as any; - if (!(params.id in devices)) { - respond(responses.ERROR(`device with id ${params.id} not found`)); - return; - } - - const device = devices[params.id]; - // TODO: Do we need more? - const ret = { - name: device.name, - type: AccessoryTypes[device.type], // type as string - }; - respond(responses.RESULT(ret)); - return; - } - - default: - respond(responses.ERROR_UNKNOWN_COMMAND); - return; - } - } - }, + // Handle sendTo-Messages + message: onMessage, objectChange: (id, obj) => { _.log(`{{blue}} object with id ${id} ${obj ? "updated" : "deleted"}`, "debug"); @@ -269,17 +138,17 @@ let adapter: ExtendedAdapter = utils.adapter({ if (obj) { // first check if we have to modify a device/group/whatever const instanceId = getInstanceId(id); - if (obj.type === "device" && instanceId in devices && devices[instanceId] != null) { + if (obj.type === "device" && instanceId in gw.devices && gw.devices[instanceId] != null) { // if this device is in the device list, check for changed properties - const acc = devices[instanceId]; + const acc = gw.devices[instanceId]; if (obj.common && obj.common.name !== acc.name) { // the name has changed, notify the gateway _.log(`the device ${id} was renamed to "${obj.common.name}"`); renameDevice(acc, obj.common.name); } - } else if (obj.type === "channel" && instanceId in groups && groups[instanceId] != null) { + } else if (obj.type === "channel" && instanceId in gw.groups && gw.groups[instanceId] != null) { // if this group is in the groups list, check for changed properties - const grp = groups[instanceId].group; + const grp = gw.groups[instanceId].group; if (obj.common && obj.common.name !== grp.name) { // the name has changed, notify the gateway _.log(`the group ${id} was renamed to "${obj.common.name}"`); @@ -361,7 +230,7 @@ let adapter: ExtendedAdapter = utils.adapter({ switch (rootObj.native.type) { case "group": { // read the instanceId and get a reference value - const group = groups[rootObj.native.instanceId].group; + const group = gw.groups[rootObj.native.instanceId].group; // if the change was acknowledged, update the state later let wasAcked: boolean; @@ -398,7 +267,7 @@ let adapter: ExtendedAdapter = utils.adapter({ case "virtual group": { // find the virtual group instance - const vGroup = virtualGroups[rootObj.native.instanceId]; + const vGroup = gw.virtualGroups[rootObj.native.instanceId]; let operation: LightOperation; @@ -435,7 +304,7 @@ let adapter: ExtendedAdapter = utils.adapter({ if (id.indexOf(".lightbulb.") > -1) { // read the instanceId and get a reference value - const accessory = devices[rootObj.native.instanceId]; + const accessory = gw.devices[rootObj.native.instanceId]; const light = accessory.lightList[0]; // if the change was acknowledged, update the state later let wasAcked: boolean; @@ -504,7 +373,7 @@ let adapter: ExtendedAdapter = utils.adapter({ if (pingTimer != null) clearInterval(pingTimer); // stop all observers - for (const url of observers) { + for (const url of gw.observers) { coap.stopObserving(url); } // close all sockets @@ -528,7 +397,7 @@ async function operateLight(accessory: Accessory, operation: LightOperation): Pr } // the url to be requested - const url: string = `${requestBase}${coapEndpoints.devices}/${accessory.instanceId}`; + const url: string = `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`; // create a copy to modify const newAccessory = accessory.clone(); @@ -562,7 +431,7 @@ async function operateLight(accessory: Accessory, operation: LightOperation): Pr async function operateGroup(group: Group, operation: GroupOperation): Promise { // the url to be requested - const url: string = `${requestBase}${coapEndpoints.groups}/${group.instanceId}`; + const url: string = `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`; // create a copy to modify const newGroup = group.clone(); @@ -596,7 +465,7 @@ async function operateVirtualGroup(group: Group | VirtualGroup, operation: Light // find all lightbulbs belonging to this group const lightbulbAccessories = group.deviceIDs - .map(did => devices[did]) + .map(did => gw.devices[did]) .filter(dev => dev != null && dev.type === AccessoryTypes.lightbulb) ; @@ -630,11 +499,11 @@ async function observeResource(path: string, callback: (resp: CoapResponse) => v path = normalizeResourcePath(path); // check if we are already observing this resource - const observerUrl = `${requestBase}${path}`; - if (observers.indexOf(observerUrl) > -1) return; + const observerUrl = `${gw.requestBase}${path}`; + if (gw.observers.indexOf(observerUrl) > -1) return; // start observing - observers.push(observerUrl); + gw.observers.push(observerUrl); return coap.observe(observerUrl, "get", callback); } @@ -647,19 +516,19 @@ function stopObservingResource(path: string): void { path = normalizeResourcePath(path); // remove observer - const observerUrl = `${requestBase}${path}`; - const index = observers.indexOf(observerUrl); + const observerUrl = `${gw.requestBase}${path}`; + const index = gw.observers.indexOf(observerUrl); if (index === -1) return; coap.stopObserving(observerUrl); - observers.splice(index, 1); + gw.observers.splice(index, 1); } /** - * Clears the list of observers after a network reset + * Clears the list of gw.observers after a network reset */ function clearObservers(): void { - observers.splice(0, observers.length); + gw.observers.splice(0, gw.observers.length); } function observeAll(): void { @@ -686,7 +555,7 @@ async function coapCb_getAllDevices(response: CoapResponse) { _.log(`got all devices: ${JSON.stringify(newDevices)}`); // get old keys as int array - const oldKeys = Object.keys(devices).map(k => +k).sort(); + const oldKeys = Object.keys(gw.devices).map(k => +k).sort(); // get new keys as int array const newKeys = newDevices.sort(); // translate that into added and removed devices @@ -704,12 +573,12 @@ async function coapCb_getAllDevices(response: CoapResponse) { const removedKeys = except(oldKeys, newKeys); _.log(`removing devices with keys ${JSON.stringify(removedKeys)}`, "debug"); removedKeys.forEach(async (id) => { - if (id in devices) { + if (id in gw.devices) { // delete ioBroker device - const deviceName = calcObjName(devices[id]); + const deviceName = calcObjName(gw.devices[id]); await adapter.$deleteDevice(deviceName); // remove device from dictionary - delete groups[id]; + delete gw.groups[id]; } // remove observer @@ -728,7 +597,7 @@ function coap_getDevice_cb(instanceId: number, response: CoapResponse) { // parse device info const accessory = new Accessory().parse(result).createProxy(); // remember the device object, so we can later use it as a reference for updates - devices[instanceId] = accessory; + gw.devices[instanceId] = accessory; // create ioBroker device extendDevice(accessory); } @@ -752,7 +621,7 @@ async function coapCb_getAllGroups(response: CoapResponse) { _.log(`got all groups: ${JSON.stringify(newGroups)}`); // get old keys as int array - const oldKeys = Object.keys(groups).map(k => +k).sort(); + const oldKeys = Object.keys(gw.groups).map(k => +k).sort(); // get new keys as int array const newKeys = newGroups.sort(); // translate that into added and removed devices @@ -770,12 +639,12 @@ async function coapCb_getAllGroups(response: CoapResponse) { const removedKeys = except(oldKeys, newKeys); _.log(`removing groups with keys ${JSON.stringify(removedKeys)}`, "debug"); removedKeys.forEach(async (id) => { - if (id in groups) { + if (id in gw.groups) { // delete ioBroker group - const groupName = calcGroupName(groups[id].group); + const groupName = calcGroupName(gw.groups[id].group); await adapter.$deleteChannel(groupName); // remove group from dictionary - delete groups[id]; + delete gw.groups[id]; } // remove observer @@ -804,14 +673,14 @@ function coap_getGroup_cb(instanceId: number, response: CoapResponse) { const group = (new Group()).parse(result).createProxy(); // remember the group object, so we can later use it as a reference for updates let groupInfo: GroupInfo; - if (!(instanceId in groups)) { + if (!(instanceId in gw.groups)) { // if there's none, create one - groups[instanceId] = { + gw.groups[instanceId] = { group: null, scenes: {}, }; } - groupInfo = groups[instanceId]; + groupInfo = gw.groups[instanceId]; groupInfo.group = group; // create ioBroker states @@ -831,7 +700,7 @@ async function coap_getAllScenes_cb(groupId: number, response: CoapResponse) { return; } - const groupInfo = groups[groupId]; + const groupInfo = gw.groups[groupId]; const newScenes = parsePayload(response); _.log(`got all scenes in group ${groupId}: ${JSON.stringify(newScenes)}`); @@ -885,9 +754,9 @@ function coap_getScene_cb(groupId: number, instanceId: number, response: CoapRes // parse scene info const scene = (new Scene()).parse(result).createProxy(); // remember the scene object, so we can later use it as a reference for updates - groups[groupId].scenes[instanceId] = scene; + gw.groups[groupId].scenes[instanceId] = scene; // Update the scene dropdown for the group - updatePossibleScenes(groups[groupId]); + updatePossibleScenes(gw.groups[groupId]); } /** @@ -1444,7 +1313,7 @@ function extendGroup(group: Group) { async function updatePossibleScenes(groupInfo: GroupInfo): Promise { const group = groupInfo.group; // if this group is not in the dictionary, don't do anything - if (!(group.instanceId in groups)) return; + if (!(group.instanceId in gw.groups)) return; // find out which is the root object id const objId = calcGroupId(group); // scenes are stored under .activeScene @@ -1614,7 +1483,7 @@ function renameDevice(accessory: Accessory, newName: string): void { payload = Buffer.from(payload); coap.request( - `${requestBase}${coapEndpoints.devices}/${accessory.instanceId}`, "put", payload, + `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`, "put", payload, ); } @@ -1643,7 +1512,7 @@ function renameGroup(group: Group, newName: string): void { payload = Buffer.from(payload); coap.request( - `${requestBase}${coapEndpoints.groups}/${group.instanceId}`, "put", payload, + `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`, "put", payload, ); } @@ -1728,21 +1597,6 @@ function unsubscribeObjects(id: string) { } } -function parsePayload(response: CoapResponse): any { - switch (response.format) { - case 0: // text/plain - case null: // assume text/plain - return response.payload.toString("utf-8"); - case 50: // application/json - const json = response.payload.toString("utf-8"); - return JSON.parse(json); - default: - // dunno how to parse this - _.log(`unknown CoAP response format ${response.format}`, "warn"); - return response.payload; - } -} - /** * Loads defined virtual groups from the ioBroker objects DB */ @@ -1755,7 +1609,7 @@ async function loadVirtualGroups(): Promise { g.native.type === "virtual group"; }); // load them into the virtualGroups dict - Object.assign(virtualGroups, composeObject( + Object.assign(gw.virtualGroups, composeObject( groupObjects.map(g => { const id: number = g.native.instanceId; const instanceIDs: number[] = g.native.instanceIDs; @@ -1775,7 +1629,7 @@ let resetAttempts: number = 0; let dead: boolean = false; async function pingThread() { const oldValue = connectionAlive; - connectionAlive = await coap.ping(requestBase); + connectionAlive = await coap.ping(gw.requestBase); _.log(`ping ${connectionAlive ? "" : "un"}successful...`, "debug"); await adapter.$setStateChanged("info.connection", connectionAlive, true); @@ -1786,7 +1640,7 @@ async function pingThread() { // connection is now alive again _.log("Connection to gateway reestablished", "info"); // restart observing if neccessary - if (observers.length === 0) observeAll(); + if (gw.observers.length === 0) observeAll(); // TODO: send buffered messages } } else { From cfd2382c3b09b9319989578e4a005804ac772ba3 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 16:02:02 +0200 Subject: [PATCH 21/51] refactored group management functions --- build/adapter/gateway.d.ts | 1 + build/adapter/gateway.js | 2 + build/adapter/groups.d.ts | 22 +++ build/adapter/groups.js | 330 ++++++++++++++++++++++++++++++++++ build/adapter/message.js | 42 +++++ build/main.js | 352 +++--------------------------------- src/adapter/gateway.ts | 3 + src/adapter/groups.ts | 338 ++++++++++++++++++++++++++++++++++ src/adapter/message.ts | 48 +++++ src/lib/global.ts | 2 +- src/main.ts | 358 ++----------------------------------- 11 files changed, 824 insertions(+), 674 deletions(-) create mode 100644 build/adapter/groups.d.ts create mode 100644 build/adapter/groups.js create mode 100644 src/adapter/groups.ts diff --git a/build/adapter/gateway.d.ts b/build/adapter/gateway.d.ts index 357bbc2b..c01854b9 100644 --- a/build/adapter/gateway.d.ts +++ b/build/adapter/gateway.d.ts @@ -17,6 +17,7 @@ export declare class Gateway { /** dictionary of known virtual groups */ virtualGroups: DictionaryLike; private _requestBase; + objects: DictionaryLike; /** Common URL for all requests */ requestBase: string; } diff --git a/build/adapter/gateway.js b/build/adapter/gateway.js index a59cbd36..d050e47f 100644 --- a/build/adapter/gateway.js +++ b/build/adapter/gateway.js @@ -10,6 +10,8 @@ class Gateway { this.groups = {}; /** dictionary of known virtual groups */ this.virtualGroups = {}; + // dictionary of ioBroker objects + this.objects = {}; } /** Common URL for all requests */ get requestBase() { return this._requestBase; } diff --git a/build/adapter/groups.d.ts b/build/adapter/groups.d.ts new file mode 100644 index 00000000..ea8ba76d --- /dev/null +++ b/build/adapter/groups.d.ts @@ -0,0 +1,22 @@ +import { Group } from "../ipso/group"; +import { DictionaryLike } from "../lib/object-polyfill"; +import { VirtualGroup } from "../lib/virtual-group"; +/** + * Returns the common part of the ioBroker object representing the given group + */ +export declare function groupToCommon(group: Group | VirtualGroup): ioBroker.ObjectCommon; +/** + * Returns the native part of the ioBroker object representing the given group + */ +export declare function groupToNative(group: Group | VirtualGroup): DictionaryLike; +/** + * Determines the object ID under which the given group should be stored + */ +export declare function calcGroupId(group: Group | VirtualGroup): string; +/** + * Determines the object name under which the given group should be stored, + * excluding the adapter namespace + */ +export declare function calcGroupName(group: Group | VirtualGroup): string; +export declare function extendVirtualGroup(group: VirtualGroup): void; +export declare function extendGroup(group: Group): void; diff --git a/build/adapter/groups.js b/build/adapter/groups.js new file mode 100644 index 00000000..40ad8a01 --- /dev/null +++ b/build/adapter/groups.js @@ -0,0 +1,330 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const group_1 = require("../ipso/group"); +const global_1 = require("../lib/global"); +const object_polyfill_1 = require("../lib/object-polyfill"); +const strings_1 = require("../lib/strings"); +const virtual_group_1 = require("../lib/virtual-group"); +const gateway_1 = require("./gateway"); +/** + * Returns the common part of the ioBroker object representing the given group + */ +function groupToCommon(group) { + let name; + if (group instanceof group_1.Group) { + name = group.name; + } + else { + if (typeof group.name === "string" && group.name.length > 0) { + name = group.name; + } + else { + name = `virtual group ${group.instanceId}`; + } + } + return { name }; +} +exports.groupToCommon = groupToCommon; +/** + * Returns the native part of the ioBroker object representing the given group + */ +function groupToNative(group) { + return { + instanceId: group.instanceId, + deviceIDs: group.deviceIDs, + type: (group instanceof virtual_group_1.VirtualGroup ? "virtual " : "") + "group", + }; +} +exports.groupToNative = groupToNative; +/** + * Determines the object ID under which the given group should be stored + */ +function calcGroupId(group) { + return `${global_1.Global.adapter.namespace}.${calcGroupName(group)}`; +} +exports.calcGroupId = calcGroupId; +/** + * Determines the object name under which the given group should be stored, + * excluding the adapter namespace + */ +function calcGroupName(group) { + let prefix; + if (group instanceof group_1.Group) { + prefix = "G"; + } + else if (group instanceof virtual_group_1.VirtualGroup) { + prefix = "VG"; + } + const postfix = group.instanceId.toString(); + return `${prefix}-${strings_1.padStart(postfix, 5, "0")}`; +} +exports.calcGroupName = calcGroupName; +/* creates or edits an existing -object for a virtual group */ +function extendVirtualGroup(group) { + const objId = calcGroupId(group); + if (objId in gateway_1.gateway.objects) { + // check if we need to edit the existing object + const grpObj = gateway_1.gateway.objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) + global_1.Global.adapter.extendObject(objId, grpObj); + // TODO: Update group states where applicable. See extendGroup for the code + } + else { + // create new object + const devObj = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + global_1.Global.adapter.setObject(objId, devObj); + // also create state objects, depending on the accessory type + const stateObjs = { + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, + write: true, + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, + def: 0, + role: "light.dimmer", + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, + write: true, + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorX", + }, + }, + }; + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = object_polyfill_1.dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return global_1.Global.adapter.$createOwnStateEx(obj._id, obj, initialValue); + }); + Promise.all(createObjects); + } +} +exports.extendVirtualGroup = extendVirtualGroup; +/* creates or edits an existing -object for a group */ +function extendGroup(group) { + const objId = calcGroupId(group); + if (objId in gateway_1.gateway.objects) { + // check if we need to edit the existing object + const grpObj = gateway_1.gateway.objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) + global_1.Global.adapter.extendObject(objId, grpObj); + // ==== + // from here we can update the states + // filter out the ones belonging to this device with a property path + const stateObjs = object_polyfill_1.filter(gateway_1.gateway.objects, obj => obj._id.startsWith(objId) && obj.native && obj.native.path); + // for each property try to update the value + for (const [id, obj] of object_polyfill_1.entries(stateObjs)) { + try { + // Object could have a default value, find it + const newValue = object_polyfill_1.dig(group, obj.native.path); + global_1.Global.adapter.setState(id, newValue, true); + } + catch (e) { } + } + } + else { + // create new object + const devObj = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + global_1.Global.adapter.setObject(objId, devObj); + // also create state objects, depending on the accessory type + const stateObjs = { + activeScene: { + _id: `${objId}.activeScene`, + type: "state", + common: { + name: "active scene", + read: true, + write: true, + type: "number", + role: "value.id", + desc: "the instance id of the currently active scene", + }, + native: { + path: "sceneId", + }, + }, + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, + write: true, + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, + def: 0, + role: "light.dimmer", + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, + write: true, + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + }; + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = object_polyfill_1.dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return global_1.Global.adapter.$createOwnStateEx(obj._id, obj, initialValue); + }); + Promise.all(createObjects); + } +} +exports.extendGroup = extendGroup; diff --git a/build/adapter/message.js b/build/adapter/message.js index 50e95677..c4df536e 100644 --- a/build/adapter/message.js +++ b/build/adapter/message.js @@ -13,7 +13,9 @@ const accessory_1 = require("../ipso/accessory"); const coap_payload_1 = require("../lib/coap-payload"); const global_1 = require("../lib/global"); const object_polyfill_1 = require("../lib/object-polyfill"); +const virtual_group_1 = require("../lib/virtual-group"); const gateway_1 = require("./gateway"); +const groups_1 = require("./groups"); function onMessage(obj) { return __awaiter(this, void 0, void 0, function* () { // responds to the adapter that sent the original message @@ -75,6 +77,46 @@ function onMessage(obj) { })); return; } + case "addVirtualGroup": { + // check the given params + const params = obj.message; + // calculate the next ID + const nextID = Math.max(0, ...Object.keys(gateway_1.gateway.virtualGroups).map(k => +k)) + 1; + // create the group + const newGroup = new virtual_group_1.VirtualGroup(nextID); + newGroup.name = `virtual group ${nextID}`; + // create the ioBroker objects + gateway_1.gateway.virtualGroups[nextID] = newGroup; + groups_1.extendVirtualGroup(newGroup); + // and return the id + respond(responses.RESULT(nextID)); + return; + } + case "editVirtualGroup": { + // require the id to be given + if (!requireParams("id")) + return; + // check the given params + const params = obj.message; + const id = parseInt(params.id, 10); + if (!(id in gateway_1.gateway.virtualGroups)) { + respond({ error: `no virtual group with ID ${id} found!` }); + return; + } + const group = gateway_1.gateway.virtualGroups[id]; + // Update the device ids + if (params.deviceIDs != null && params.deviceIDs instanceof Array) { + group.deviceIDs = params.deviceIDs; + } + // Change the name + if (typeof params.name === "string" && params.name.length > 0) { + group.name = params.name; + } + // save the changes + groups_1.extendVirtualGroup(group); + respond(responses.OK); + return; + } case "getGroups": { // check the given params const params = obj.message; diff --git a/build/main.js b/build/main.js index 91d4d74d..f714c49d 100644 --- a/build/main.js +++ b/build/main.js @@ -21,7 +21,6 @@ const global_1 = require("./lib/global"); const object_polyfill_1 = require("./lib/object-polyfill"); const promises_1 = require("./lib/promises"); const str2regex_1 = require("./lib/str2regex"); -const strings_1 = require("./lib/strings"); // Datentypen laden const accessory_1 = require("./ipso/accessory"); const group_1 = require("./ipso/group"); @@ -31,9 +30,8 @@ const virtual_group_1 = require("./lib/virtual-group"); const utils_1 = require("./lib/utils"); // Adapter-Module laden const gateway_1 = require("./adapter/gateway"); +const groups_1 = require("./adapter/groups"); const message_1 = require("./adapter/message"); -// dictionary of ioBroker objects -const objects = {}; const customStateSubscriptions = { subscriptions: new Map(), counter: 0, @@ -132,12 +130,12 @@ let adapter = utils_1.default.adapter({ } } // remember the object - objects[id] = obj; + gateway_1.gateway.objects[id] = obj; } else { // object deleted, forget it - if (id in objects) - delete objects[id]; + if (id in gateway_1.gateway.objects) + delete gateway_1.gateway.objects[id]; } } // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen @@ -183,14 +181,14 @@ let adapter = utils_1.default.adapter({ // Eigene Handling-Logik zum Schluss, damit wir return benutzen können if (state && !state.ack && id.startsWith(adapter.namespace)) { // our own state was changed from within ioBroker, react to it - const stateObj = objects[id]; + const stateObj = gateway_1.gateway.objects[id]; if (!(stateObj && stateObj.type === "state" && stateObj.native && stateObj.native.path)) return; // get "official" value for the parent object const rootId = getRootId(id); if (rootId) { // get the ioBroker object - const rootObj = objects[rootId]; + const rootObj = gateway_1.gateway.objects[rootId]; // for now: handle changes on a case by case basis // everything else is too complicated for now let val = state.val; @@ -576,7 +574,7 @@ function coapCb_getAllGroups(response) { removedKeys.forEach((id) => __awaiter(this, void 0, void 0, function* () { if (id in gateway_1.gateway.groups) { // delete ioBroker group - const groupName = calcGroupName(gateway_1.gateway.groups[id].group); + const groupName = groups_1.calcGroupName(gateway_1.gateway.groups[id].group); yield adapter.$deleteChannel(groupName); // remove group from dictionary delete gateway_1.gateway.groups[id]; @@ -615,7 +613,7 @@ function coap_getGroup_cb(instanceId, response) { groupInfo = gateway_1.gateway.groups[instanceId]; groupInfo.group = group; // create ioBroker states - extendGroup(group); + groups_1.extendGroup(group); // and load scene information observeResource(`${endpoints_1.endpoints.scenes}/${instanceId}`, (resp) => coap_getAllScenes_cb(instanceId, resp)); } @@ -718,27 +716,6 @@ function calcObjName(accessory) { } return `${prefix}-${accessory.instanceId}`; } -/** - * Determines the object ID under which the given group should be stored - */ -function calcGroupId(group) { - return `${adapter.namespace}.${calcGroupName(group)}`; -} -/** - * Determines the object name under which the given group should be stored, - * excluding the adapter namespace - */ -function calcGroupName(group) { - let prefix; - if (group instanceof group_1.Group) { - prefix = "G"; - } - else if (group instanceof virtual_group_1.VirtualGroup) { - prefix = "VG"; - } - const postfix = group.instanceId.toString(); - return `${prefix}-${strings_1.padStart(postfix, 5, "0")}`; -} /** * Determines the object ID under which the given scene should be stored */ @@ -765,7 +742,7 @@ function getTransitionDuration(accessoryOrGroup) { } } else if (accessoryOrGroup instanceof group_1.Group || accessoryOrGroup instanceof virtual_group_1.VirtualGroup) { - stateId = calcGroupId(accessoryOrGroup) + ".transitionDuration"; + stateId = groups_1.calcGroupId(accessoryOrGroup) + ".transitionDuration"; } const ret = yield adapter.$getState(stateId); if (ret != null) @@ -797,9 +774,9 @@ function accessoryToNative(accessory) { /* creates or edits an existing -object for an accessory */ function extendDevice(accessory) { const objId = calcObjId(accessory); - if (objId in objects) { + if (objId in gateway_1.gateway.objects) { // check if we need to edit the existing object - const devObj = objects[objId]; + const devObj = gateway_1.gateway.objects[objId]; let changed = false; // update common part if neccessary const newCommon = accessoryToCommon(accessory); @@ -820,7 +797,7 @@ function extendDevice(accessory) { // ==== // from here we can update the states // filter out the ones belonging to this device with a property path - const stateObjs = object_polyfill_1.filter(objects, obj => obj._id.startsWith(objId) && obj.native && obj.native.path); + const stateObjs = object_polyfill_1.filter(gateway_1.gateway.objects, obj => obj._id.startsWith(objId) && obj.native && obj.native.path); // for each property try to update the value for (const [id, obj] of object_polyfill_1.entries(stateObjs)) { try { @@ -1036,179 +1013,6 @@ function extendDevice(accessory) { Promise.all(createObjects); } } -/** - * Returns the common part of the ioBroker object representing the given group - */ -function groupToCommon(group) { - if (group instanceof group_1.Group) { - return { - name: group.name, - }; - } - else { - return { - name: `virtual group ${group.instanceId}`, - }; - } -} -/** - * Returns the native part of the ioBroker object representing the given group - */ -function groupToNative(group) { - return { - instanceId: group.instanceId, - deviceIDs: group.deviceIDs, - type: (group instanceof virtual_group_1.VirtualGroup ? "virtual " : "") + "group", - }; -} -/* creates or edits an existing -object for a group */ -function extendGroup(group) { - const objId = calcGroupId(group); - if (objId in objects) { - // check if we need to edit the existing object - const grpObj = objects[objId]; - let changed = false; - // update common part if neccessary - const newCommon = groupToCommon(group); - if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { - // merge the common objects - Object.assign(grpObj.common, newCommon); - changed = true; - } - const newNative = groupToNative(group); - // update native part if neccessary - if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { - // merge the native objects - Object.assign(grpObj.native, newNative); - changed = true; - } - if (changed) - adapter.extendObject(objId, grpObj); - // ==== - // from here we can update the states - // filter out the ones belonging to this device with a property path - const stateObjs = object_polyfill_1.filter(objects, obj => obj._id.startsWith(objId) && obj.native && obj.native.path); - // for each property try to update the value - for (const [id, obj] of object_polyfill_1.entries(stateObjs)) { - try { - // Object could have a default value, find it - const newValue = object_polyfill_1.dig(group, obj.native.path); - adapter.setState(id, newValue, true); - } - catch (e) { } - } - } - else { - // create new object - const devObj = { - _id: objId, - type: "channel", - common: groupToCommon(group), - native: groupToNative(group), - }; - adapter.setObject(objId, devObj); - // also create state objects, depending on the accessory type - const stateObjs = { - activeScene: { - _id: `${objId}.activeScene`, - type: "state", - common: { - name: "active scene", - read: true, - write: true, - type: "number", - role: "value.id", - desc: "the instance id of the currently active scene", - }, - native: { - path: "sceneId", - }, - }, - state: { - _id: `${objId}.state`, - type: "state", - common: { - name: "on/off", - read: true, - write: true, - type: "boolean", - role: "switch", - }, - native: { - path: "onOff", - }, - }, - transitionDuration: { - _id: `${objId}.transitionDuration`, - type: "state", - common: { - name: "Transition duration", - read: false, - write: true, - type: "number", - min: 0, - max: 100, - def: 0, - role: "light.dimmer", - desc: "Duration for brightness changes of this group's lightbulbs", - unit: "s", - }, - native: { - path: "transitionTime", - }, - }, - brightness: { - _id: `${objId}.brightness`, - type: "state", - common: { - name: "Brightness", - read: false, - write: true, - min: 0, - max: 254, - type: "number", - role: "light.dimmer", - desc: "Brightness of this group's lightbulbs", - }, - native: { - path: "dimmer", - }, - }, - color: { - _id: `${objId}.color`, - type: "state", - common: { - name: "Color temperature", - read: true, - write: true, - min: 0, - max: 100, - unit: "%", - type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", - }, - native: { - // virtual state, so no real path to an object exists - // we still have to give path a value, because other functions check for its existence - path: "__virtual__", - }, - }, - }; - const createObjects = Object.keys(stateObjs) - .map((key) => { - const obj = stateObjs[key]; - let initialValue = null; - if (obj.native.path != null) { - // Object could have a default value, find it - initialValue = object_polyfill_1.dig(group, obj.native.path); - } - // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(obj._id, obj, initialValue); - }); - Promise.all(createObjects); - } -} function updatePossibleScenes(groupInfo) { return __awaiter(this, void 0, void 0, function* () { const group = groupInfo.group; @@ -1216,11 +1020,11 @@ function updatePossibleScenes(groupInfo) { if (!(group.instanceId in gateway_1.gateway.groups)) return; // find out which is the root object id - const objId = calcGroupId(group); + const objId = groups_1.calcGroupId(group); // scenes are stored under .activeScene const scenesId = `${objId}.activeScene`; // only extend that object if it exists already - if (scenesId in objects) { + if (scenesId in gateway_1.gateway.objects) { global_1.Global.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); const scenes = groupInfo.scenes; // map scene ids and names to the dropdown @@ -1231,125 +1035,6 @@ function updatePossibleScenes(groupInfo) { } }); } -/* creates or edits an existing -object for a virtual group */ -function extendVirtualGroup(group) { - const objId = calcGroupId(group); - if (objId in objects) { - // check if we need to edit the existing object - const grpObj = objects[objId]; - let changed = false; - // update common part if neccessary - const newCommon = groupToCommon(group); - if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { - // merge the common objects - Object.assign(grpObj.common, newCommon); - changed = true; - } - const newNative = groupToNative(group); - // update native part if neccessary - if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { - // merge the native objects - Object.assign(grpObj.native, newNative); - changed = true; - } - if (changed) - adapter.extendObject(objId, grpObj); - // TODO: Update group states where applicable. See extendGroup for the code - } - else { - // create new object - const devObj = { - _id: objId, - type: "channel", - common: groupToCommon(group), - native: groupToNative(group), - }; - adapter.setObject(objId, devObj); - // also create state objects, depending on the accessory type - const stateObjs = { - state: { - _id: `${objId}.state`, - type: "state", - common: { - name: "on/off", - read: true, - write: true, - type: "boolean", - role: "switch", - }, - native: { - path: "onOff", - }, - }, - transitionDuration: { - _id: `${objId}.transitionDuration`, - type: "state", - common: { - name: "Transition duration", - read: false, - write: true, - type: "number", - min: 0, - max: 100, - def: 0, - role: "light.dimmer", - desc: "Duration for brightness changes of this group's lightbulbs", - unit: "s", - }, - native: { - path: "transitionTime", - }, - }, - brightness: { - _id: `${objId}.brightness`, - type: "state", - common: { - name: "Brightness", - read: false, - write: true, - min: 0, - max: 254, - type: "number", - role: "light.dimmer", - desc: "Brightness of this group's lightbulbs", - }, - native: { - path: "dimmer", - }, - }, - color: { - _id: `${objId}.color`, - type: "state", - common: { - name: "Color temperature", - read: true, - write: true, - min: 0, - max: 100, - unit: "%", - type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", - }, - native: { - path: "colorX", - }, - }, - }; - const createObjects = Object.keys(stateObjs) - .map((key) => { - const obj = stateObjs[key]; - let initialValue = null; - if (obj.native.path != null) { - // Object could have a default value, find it - initialValue = object_polyfill_1.dig(group, obj.native.path); - } - // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(obj._id, obj, initialValue); - }); - Promise.all(createObjects); - } -} /** * Renames a device * @param accessory The device to be renamed @@ -1471,8 +1156,8 @@ function unsubscribeObjects(id) { function loadVirtualGroups() { return __awaiter(this, void 0, void 0, function* () { // find all defined virtual groups - let groupObjects = object_polyfill_1.values(yield global_1.Global.$$("VG-*", "channel")); - groupObjects = groupObjects.filter(g => { + const iobObjects = yield global_1.Global.$$(`${adapter.namespace}.VG-*`, "channel"); + const groupObjects = object_polyfill_1.values(iobObjects).filter(g => { return g.native && g.native.instanceId != null && g.native.type === "virtual group"; @@ -1486,6 +1171,11 @@ function loadVirtualGroups() { ret.name = g.common.name; return [`${id}`, ret]; }))); + // remember the actual objects + for (const obj of object_polyfill_1.values(gateway_1.gateway.virtualGroups)) { + const id = groups_1.calcGroupId(obj); + gateway_1.gateway.objects[id] = iobObjects[id]; + } }); } // Connection check diff --git a/src/adapter/gateway.ts b/src/adapter/gateway.ts index 55bdba5e..117840ee 100644 --- a/src/adapter/gateway.ts +++ b/src/adapter/gateway.ts @@ -19,6 +19,9 @@ export class Gateway { /** dictionary of known virtual groups */ public virtualGroups: DictionaryLike = {}; private _requestBase: string; + // dictionary of ioBroker objects + public objects: DictionaryLike = {}; + /** Common URL for all requests */ public get requestBase(): string { return this._requestBase; } public set requestBase(value: string) { this._requestBase = value; } diff --git a/src/adapter/groups.ts b/src/adapter/groups.ts new file mode 100644 index 00000000..41056462 --- /dev/null +++ b/src/adapter/groups.ts @@ -0,0 +1,338 @@ +import { Group } from "../ipso/group"; +import { Scene } from "../ipso/scene"; +import { Global as _ } from "../lib/global"; +import { composeObject, DictionaryLike, dig, entries, filter, values } from "../lib/object-polyfill"; +import { padStart } from "../lib/strings"; +import { VirtualGroup } from "../lib/virtual-group"; +import { gateway as gw, GroupInfo } from "./gateway"; + +/** + * Returns the common part of the ioBroker object representing the given group + */ +export function groupToCommon(group: Group | VirtualGroup): ioBroker.ObjectCommon { + let name: string; + if (group instanceof Group) { + name = group.name; + } else /* group instanceof VirtualGroup */ { + if (typeof group.name === "string" && group.name.length > 0) { + name = group.name; + } else { + name = `virtual group ${group.instanceId}`; + } + } + return { name }; +} + +/** + * Returns the native part of the ioBroker object representing the given group + */ +export function groupToNative(group: Group | VirtualGroup): DictionaryLike { + return { + instanceId: group.instanceId, + deviceIDs: group.deviceIDs, + type: (group instanceof VirtualGroup ? "virtual " : "") + "group", + }; +} + +/** + * Determines the object ID under which the given group should be stored + */ +export function calcGroupId(group: Group | VirtualGroup): string { + return `${_.adapter.namespace}.${calcGroupName(group)}`; +} +/** + * Determines the object name under which the given group should be stored, + * excluding the adapter namespace + */ +export function calcGroupName(group: Group | VirtualGroup): string { + let prefix: string; + if (group instanceof Group) { + prefix = "G"; + } else if (group instanceof VirtualGroup) { + prefix = "VG"; + } + const postfix: string = group.instanceId.toString(); + return `${prefix}-${padStart(postfix, 5, "0")}`; +} + +/* creates or edits an existing -object for a virtual group */ +export function extendVirtualGroup(group: VirtualGroup) { + const objId = calcGroupId(group); + + if (objId in gw.objects) { + // check if we need to edit the existing object + const grpObj = gw.objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) _.adapter.extendObject(objId, grpObj); + + // TODO: Update group states where applicable. See extendGroup for the code + + } else { + // create new object + const devObj: ioBroker.Object = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + _.adapter.setObject(objId, devObj); + + // also create state objects, depending on the accessory type + const stateObjs: DictionaryLike = { + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, // TODO: check + write: true, // TODO: check + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, // TODO: check + def: 0, + role: "light.dimmer", // TODO: better role? + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, // TODO: check + write: true, // TODO: check + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, // TODO: check + write: true, // TODO: check + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorX", + }, + }, + }; + + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return _.adapter.$createOwnStateEx(obj._id, obj, initialValue); + }) + ; + Promise.all(createObjects); + + } +} + +/* creates or edits an existing -object for a group */ +export function extendGroup(group: Group) { + const objId = calcGroupId(group); + + if (objId in gw.objects) { + // check if we need to edit the existing object + const grpObj = gw.objects[objId]; + let changed = false; + // update common part if neccessary + const newCommon = groupToCommon(group); + if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { + // merge the common objects + Object.assign(grpObj.common, newCommon); + changed = true; + } + const newNative = groupToNative(group); + // update native part if neccessary + if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { + // merge the native objects + Object.assign(grpObj.native, newNative); + changed = true; + } + if (changed) _.adapter.extendObject(objId, grpObj); + + // ==== + + // from here we can update the states + // filter out the ones belonging to this device with a property path + const stateObjs = filter( + gw.objects, + obj => obj._id.startsWith(objId) && obj.native && obj.native.path, + ); + // for each property try to update the value + for (const [id, obj] of entries(stateObjs)) { + try { + // Object could have a default value, find it + const newValue = dig(group, obj.native.path); + _.adapter.setState(id, newValue, true); + } catch (e) {/* skip this value */ } + } + + } else { + // create new object + const devObj: ioBroker.Object = { + _id: objId, + type: "channel", + common: groupToCommon(group), + native: groupToNative(group), + }; + _.adapter.setObject(objId, devObj); + + // also create state objects, depending on the accessory type + const stateObjs: DictionaryLike = { + activeScene: { // currently active scene + _id: `${objId}.activeScene`, + type: "state", + common: { + name: "active scene", + read: true, + write: true, + type: "number", + role: "value.id", + desc: "the instance id of the currently active scene", + }, + native: { + path: "sceneId", + }, + }, + state: { + _id: `${objId}.state`, + type: "state", + common: { + name: "on/off", + read: true, // TODO: check + write: true, // TODO: check + type: "boolean", + role: "switch", + }, + native: { + path: "onOff", + }, + }, + transitionDuration: { + _id: `${objId}.transitionDuration`, + type: "state", + common: { + name: "Transition duration", + read: false, + write: true, + type: "number", + min: 0, + max: 100, // TODO: check + def: 0, + role: "light.dimmer", // TODO: better role? + desc: "Duration for brightness changes of this group's lightbulbs", + unit: "s", + }, + native: { + path: "transitionTime", + }, + }, + brightness: { + _id: `${objId}.brightness`, + type: "state", + common: { + name: "Brightness", + read: false, // TODO: check + write: true, // TODO: check + min: 0, + max: 254, + type: "number", + role: "light.dimmer", + desc: "Brightness of this group's lightbulbs", + }, + native: { + path: "dimmer", + }, + }, + color: { + _id: `${objId}.color`, + type: "state", + common: { + name: "Color temperature", + read: true, // TODO: check + write: true, // TODO: check + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + }; + + const createObjects = Object.keys(stateObjs) + .map((key) => { + const obj = stateObjs[key]; + let initialValue = null; + if (obj.native.path != null) { + // Object could have a default value, find it + initialValue = dig(group, obj.native.path); + } + // create object and return the promise, so we can wait + return _.adapter.$createOwnStateEx(obj._id, obj, initialValue); + }) + ; + Promise.all(createObjects); + + } +} diff --git a/src/adapter/message.ts b/src/adapter/message.ts index 2650999b..0cd7271c 100644 --- a/src/adapter/message.ts +++ b/src/adapter/message.ts @@ -3,7 +3,9 @@ import { Accessory, AccessoryTypes } from "../ipso/accessory"; import { parsePayload } from "../lib/coap-payload"; import { ExtendedAdapter, Global as _ } from "../lib/global"; import { entries } from "../lib/object-polyfill"; +import { VirtualGroup } from "../lib/virtual-group"; import { gateway as gw } from "./gateway"; +import { extendVirtualGroup } from "./groups"; export async function onMessage(obj) { // responds to the adapter that sent the original message @@ -68,6 +70,52 @@ export async function onMessage(obj) { return; } + case "addVirtualGroup": { + // check the given params + const params = obj.message as any; + // calculate the next ID + const nextID = Math.max(0, ...Object.keys(gw.virtualGroups).map(k => +k)) + 1; + // create the group + const newGroup = new VirtualGroup(nextID); + newGroup.name = `virtual group ${nextID}`; + // create the ioBroker objects + gw.virtualGroups[nextID] = newGroup; + extendVirtualGroup(newGroup); + // and return the id + respond(responses.RESULT(nextID)); + + return; + } + + case "editVirtualGroup": { + // require the id to be given + if (!requireParams("id")) return; + + // check the given params + const params = obj.message as any; + const id = parseInt(params.id, 10); + + if (!(id in gw.virtualGroups)) { + respond({ error: `no virtual group with ID ${id} found!` }); + return; + } + + const group = gw.virtualGroups[id]; + // Update the device ids + if (params.deviceIDs != null && params.deviceIDs instanceof Array) { + group.deviceIDs = params.deviceIDs; + } + // Change the name + if (typeof params.name === "string" && params.name.length > 0) { + group.name = params.name; + } + // save the changes + extendVirtualGroup(group); + + respond(responses.OK); + return; + } + case "getGroups": { // get all groups defined on the gateway // check the given params const params = obj.message as any; diff --git a/src/lib/global.ts b/src/lib/global.ts index 4ee0f577..baa6cf3e 100644 --- a/src/lib/global.ts +++ b/src/lib/global.ts @@ -205,7 +205,7 @@ export class Global { * Kurzschreibweise für die Ermittlung mehrerer Objekte * @param id */ - public static async $$(pattern: string, type: ioBroker.ObjectType, role?: string) { + public static async $$(pattern: string, type: ioBroker.ObjectType, role?: string): Promise> { const objects = await Global._adapter.$getForeignObjects(pattern, type); if (role) { return objFilter(objects, o => (o.common as any).role === role); diff --git a/src/main.ts b/src/main.ts index f9f0cab7..9992e437 100644 --- a/src/main.ts +++ b/src/main.ts @@ -28,11 +28,9 @@ import utils from "./lib/utils"; // Adapter-Module laden import { gateway as gw, GroupInfo } from "./adapter/gateway"; +import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./adapter/groups"; import { onMessage } from "./adapter/message"; -// dictionary of ioBroker objects -const objects: DictionaryLike = {}; - interface CustomStateSubscription { pattern: RegExp; callback: (id: string, state: ioBroker.State) => void; @@ -156,10 +154,10 @@ let adapter: ExtendedAdapter = utils.adapter({ } } // remember the object - objects[id] = obj; + gw.objects[id] = obj; } else { // object deleted, forget it - if (id in objects) delete objects[id]; + if (id in gw.objects) delete gw.objects[id]; } } @@ -208,14 +206,14 @@ let adapter: ExtendedAdapter = utils.adapter({ if (state && !state.ack && id.startsWith(adapter.namespace)) { // our own state was changed from within ioBroker, react to it - const stateObj = objects[id]; + const stateObj = gw.objects[id]; if (!(stateObj && stateObj.type === "state" && stateObj.native && stateObj.native.path)) return; // get "official" value for the parent object const rootId = getRootId(id); if (rootId) { // get the ioBroker object - const rootObj = objects[rootId]; + const rootObj = gw.objects[rootId]; // for now: handle changes on a case by case basis // everything else is too complicated for now @@ -802,27 +800,6 @@ function calcObjName(accessory: Accessory): string { return `${prefix}-${accessory.instanceId}`; } -/** - * Determines the object ID under which the given group should be stored - */ -function calcGroupId(group: Group | VirtualGroup): string { - return `${adapter.namespace}.${calcGroupName(group)}`; -} -/** - * Determines the object name under which the given group should be stored, - * excluding the adapter namespace - */ -function calcGroupName(group: Group | VirtualGroup): string { - let prefix: string; - if (group instanceof Group) { - prefix = "G"; - } else if (group instanceof VirtualGroup) { - prefix = "VG"; - } - const postfix: string = group.instanceId.toString(); - return `${prefix}-${padStart(postfix, 5, "0")}`; -} - /** * Determines the object ID under which the given scene should be stored */ @@ -882,9 +859,9 @@ function accessoryToNative(accessory: Accessory): DictionaryLike { function extendDevice(accessory: Accessory) { const objId = calcObjId(accessory); - if (objId in objects) { + if (objId in gw.objects) { // check if we need to edit the existing object - const devObj = objects[objId]; + const devObj = gw.objects[objId]; let changed = false; // update common part if neccessary const newCommon = accessoryToCommon(accessory); @@ -907,7 +884,7 @@ function extendDevice(accessory: Accessory) { // from here we can update the states // filter out the ones belonging to this device with a property path const stateObjs = filter( - objects, + gw.objects, obj => obj._id.startsWith(objId) && obj.native && obj.native.path, ); // for each property try to update the value @@ -1127,189 +1104,6 @@ function extendDevice(accessory: Accessory) { } } -/** - * Returns the common part of the ioBroker object representing the given group - */ -function groupToCommon(group: Group | VirtualGroup): ioBroker.ObjectCommon { - if (group instanceof Group) { - return { - name: group.name, - }; - } else { - return { - name: `virtual group ${group.instanceId}`, - }; - } -} - -/** - * Returns the native part of the ioBroker object representing the given group - */ -function groupToNative(group: Group | VirtualGroup): DictionaryLike { - return { - instanceId: group.instanceId, - deviceIDs: group.deviceIDs, - type: (group instanceof VirtualGroup ? "virtual " : "") + "group", - }; -} - -/* creates or edits an existing -object for a group */ -function extendGroup(group: Group) { - const objId = calcGroupId(group); - - if (objId in objects) { - // check if we need to edit the existing object - const grpObj = objects[objId]; - let changed = false; - // update common part if neccessary - const newCommon = groupToCommon(group); - if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { - // merge the common objects - Object.assign(grpObj.common, newCommon); - changed = true; - } - const newNative = groupToNative(group); - // update native part if neccessary - if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { - // merge the native objects - Object.assign(grpObj.native, newNative); - changed = true; - } - if (changed) adapter.extendObject(objId, grpObj); - - // ==== - - // from here we can update the states - // filter out the ones belonging to this device with a property path - const stateObjs = filter( - objects, - obj => obj._id.startsWith(objId) && obj.native && obj.native.path, - ); - // for each property try to update the value - for (const [id, obj] of entries(stateObjs)) { - try { - // Object could have a default value, find it - const newValue = dig(group, obj.native.path); - adapter.setState(id, newValue, true); - } catch (e) {/* skip this value */ } - } - - } else { - // create new object - const devObj: ioBroker.Object = { - _id: objId, - type: "channel", - common: groupToCommon(group), - native: groupToNative(group), - }; - adapter.setObject(objId, devObj); - - // also create state objects, depending on the accessory type - const stateObjs: DictionaryLike = { - activeScene: { // currently active scene - _id: `${objId}.activeScene`, - type: "state", - common: { - name: "active scene", - read: true, - write: true, - type: "number", - role: "value.id", - desc: "the instance id of the currently active scene", - }, - native: { - path: "sceneId", - }, - }, - state: { - _id: `${objId}.state`, - type: "state", - common: { - name: "on/off", - read: true, // TODO: check - write: true, // TODO: check - type: "boolean", - role: "switch", - }, - native: { - path: "onOff", - }, - }, - transitionDuration: { - _id: `${objId}.transitionDuration`, - type: "state", - common: { - name: "Transition duration", - read: false, - write: true, - type: "number", - min: 0, - max: 100, // TODO: check - def: 0, - role: "light.dimmer", // TODO: better role? - desc: "Duration for brightness changes of this group's lightbulbs", - unit: "s", - }, - native: { - path: "transitionTime", - }, - }, - brightness: { - _id: `${objId}.brightness`, - type: "state", - common: { - name: "Brightness", - read: false, // TODO: check - write: true, // TODO: check - min: 0, - max: 254, - type: "number", - role: "light.dimmer", - desc: "Brightness of this group's lightbulbs", - }, - native: { - path: "dimmer", - }, - }, - color: { - _id: `${objId}.color`, - type: "state", - common: { - name: "Color temperature", - read: true, // TODO: check - write: true, // TODO: check - min: 0, - max: 100, - unit: "%", - type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", - }, - native: { - // virtual state, so no real path to an object exists - // we still have to give path a value, because other functions check for its existence - path: "__virtual__", - }, - }, - }; - - const createObjects = Object.keys(stateObjs) - .map((key) => { - const obj = stateObjs[key]; - let initialValue = null; - if (obj.native.path != null) { - // Object could have a default value, find it - initialValue = dig(group, obj.native.path); - } - // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(obj._id, obj, initialValue); - }) - ; - Promise.all(createObjects); - - } -} - async function updatePossibleScenes(groupInfo: GroupInfo): Promise { const group = groupInfo.group; // if this group is not in the dictionary, don't do anything @@ -1320,7 +1114,7 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { const scenesId = `${objId}.activeScene`; // only extend that object if it exists already - if (scenesId in objects) { + if (scenesId in gw.objects) { _.log(`updating possible scenes for group ${group.instanceId}: ${JSON.stringify(Object.keys(groupInfo.scenes))}`); const scenes = groupInfo.scenes; @@ -1334,131 +1128,6 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { } } -/* creates or edits an existing -object for a virtual group */ -function extendVirtualGroup(group: VirtualGroup) { - const objId = calcGroupId(group); - - if (objId in objects) { - // check if we need to edit the existing object - const grpObj = objects[objId]; - let changed = false; - // update common part if neccessary - const newCommon = groupToCommon(group); - if (JSON.stringify(grpObj.common) !== JSON.stringify(newCommon)) { - // merge the common objects - Object.assign(grpObj.common, newCommon); - changed = true; - } - const newNative = groupToNative(group); - // update native part if neccessary - if (JSON.stringify(grpObj.native) !== JSON.stringify(newNative)) { - // merge the native objects - Object.assign(grpObj.native, newNative); - changed = true; - } - if (changed) adapter.extendObject(objId, grpObj); - - // TODO: Update group states where applicable. See extendGroup for the code - - } else { - // create new object - const devObj: ioBroker.Object = { - _id: objId, - type: "channel", - common: groupToCommon(group), - native: groupToNative(group), - }; - adapter.setObject(objId, devObj); - - // also create state objects, depending on the accessory type - const stateObjs: DictionaryLike = { - state: { - _id: `${objId}.state`, - type: "state", - common: { - name: "on/off", - read: true, // TODO: check - write: true, // TODO: check - type: "boolean", - role: "switch", - }, - native: { - path: "onOff", - }, - }, - transitionDuration: { - _id: `${objId}.transitionDuration`, - type: "state", - common: { - name: "Transition duration", - read: false, - write: true, - type: "number", - min: 0, - max: 100, // TODO: check - def: 0, - role: "light.dimmer", // TODO: better role? - desc: "Duration for brightness changes of this group's lightbulbs", - unit: "s", - }, - native: { - path: "transitionTime", - }, - }, - brightness: { - _id: `${objId}.brightness`, - type: "state", - common: { - name: "Brightness", - read: false, // TODO: check - write: true, // TODO: check - min: 0, - max: 254, - type: "number", - role: "light.dimmer", - desc: "Brightness of this group's lightbulbs", - }, - native: { - path: "dimmer", - }, - }, - color: { - _id: `${objId}.color`, - type: "state", - common: { - name: "Color temperature", - read: true, // TODO: check - write: true, // TODO: check - min: 0, - max: 100, - unit: "%", - type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", - }, - native: { - path: "colorX", - }, - }, - }; - - const createObjects = Object.keys(stateObjs) - .map((key) => { - const obj = stateObjs[key]; - let initialValue = null; - if (obj.native.path != null) { - // Object could have a default value, find it - initialValue = dig(group, obj.native.path); - } - // create object and return the promise, so we can wait - return adapter.$createOwnStateEx(obj._id, obj, initialValue); - }) - ; - Promise.all(createObjects); - - } -} - /** * Renames a device * @param accessory The device to be renamed @@ -1602,8 +1271,8 @@ function unsubscribeObjects(id: string) { */ async function loadVirtualGroups(): Promise { // find all defined virtual groups - let groupObjects = values(await _.$$("VG-*", "channel")); - groupObjects = groupObjects.filter(g => { + const iobObjects = await _.$$(`${adapter.namespace}.VG-*`, "channel"); + const groupObjects: ioBroker.Object[] = values(iobObjects).filter(g => { return g.native && g.native.instanceId != null && g.native.type === "virtual group"; @@ -1619,6 +1288,11 @@ async function loadVirtualGroups(): Promise { return [`${id}`, ret] as [string, VirtualGroup]; }), )); + // remember the actual objects + for (const obj of values(gw.virtualGroups)) { + const id = calcGroupId(obj); + gw.objects[id] = iobObjects[id]; + } } // Connection check From af58ece2c2d3076c5939d7d36777022cfb554fc2 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 16:36:12 +0200 Subject: [PATCH 22/51] polyfill window properties for tests --- admin/build/main.bundle.js | 4 ++-- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/lib/adapter.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 3f0ab203..e0403653 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -205,8 +205,8 @@ Object.defineProperty(exports, "__esModule", { value: true }); // fix missing property errors/warnings exports.$window = window; exports.$$ = exports.$window.jQuery; -exports.instance = exports.$window.instance; -exports._ = exports.$window._; +exports.instance = exports.$window.instance || 0; +exports._ = exports.$window._ || ((text) => text); /***/ }) diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index f201b586..50a0b479 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance;\r\nexport const _ = $window._;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACLA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACLA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 00753ef8..d2a1e50a 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap b57d998202819d914563"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b57d998202819d914563"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 786c47aa601936ccaeac"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 786c47aa601936ccaeac"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts index 38fe100b..9ac97fa8 100644 --- a/admin/src/lib/adapter.ts +++ b/admin/src/lib/adapter.ts @@ -11,5 +11,5 @@ export interface JQueryWithTabs { tabs: (selector?: any) => JQuery & JQueryWithTabs; } export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs; -export const instance = $window.instance; -export const _ = $window._; +export const instance = $window.instance || 0; +export const _ = $window._ || ((text: string) => text); From 18c3fe777863110073357b33deea0ee691be1080 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Mon, 23 Oct 2017 18:07:41 +0200 Subject: [PATCH 23/51] try fix random build errors on nodejs 8 --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index ee22c8f6..c397cca6 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,8 @@ platform: clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%' install: - ps: 'Install-Product node $env:nodejs_version $env:platform' + # Fix random EPERM on NJS 8 when installing fsevents + - IF "%nodejs_version:~0,1%"=="8" npm install npm@5.3 -g - npm install - npm install winston@2.3.1 - 'npm install https://github.com/ioBroker/ioBroker.js-controller/tarball/master --production' From 280d0aed4f5cd8d53f3ada95360f2ac941f5ba37 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Tue, 24 Oct 2017 20:03:38 +0200 Subject: [PATCH 24/51] more work on the groups table --- admin/build/main.bundle.js | 21 ++++++++++++++++--- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/groups.tsx | 25 ++++++++++++++++++++++- admin/src/components/settings.tsx | 4 ++-- admin/style.css | 34 +++++++++++++++++++++++++++++++ admin/words.js | 12 +++++++++++ 7 files changed, 92 insertions(+), 8 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index e0403653..6455ded0 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -21,12 +21,27 @@ exports.default = Fragment; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); +const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); class Groups extends React.Component { constructor(props) { super(props); } render() { - return (React.createElement("div", null, "Placeholder for group management functions")); + return (React.createElement(fragment_1.default, null, + React.createElement("table", { id: "virtual-groups" }, + React.createElement("thead", null, + React.createElement("tr", { className: "ui-widget-header" }, + React.createElement("td", { className: "id" }, adapter_1._("ID")), + React.createElement("td", { className: "name" }, adapter_1._("Name")), + React.createElement("td", { className: "devices" }, adapter_1._("Devices")))), + React.createElement("tbody", null, + React.createElement("tr", null, + React.createElement("td", { colSpan: 3 }, "Placeholder")), + React.createElement("tr", null, + React.createElement("td", { colSpan: 3 }, "Placeholder")), + React.createElement("tr", null, + React.createElement("td", { colSpan: 3 }, "Placeholder")))))); } } exports.Groups = Groups; @@ -101,11 +116,11 @@ class Settings extends React.Component { render() { return (React.createElement("p", { key: "content", className: "settings-table" }, React.createElement(Label, { for: "host", text: "Gateway IP/Hostname:" }), - React.createElement(Tooltip, { text: "Der Hostname ist \"gw-\" gefolgt von der MAC-Adresse bzw. Seriennummer des Gateways, ohne Sonderzeichen, z.B. gw-a0b1c2d3e4f5. Er findet sich auf der Unterseite des Gateways" }), + React.createElement(Tooltip, { text: "hostname tooltip" }), React.createElement("input", { className: "value", id: "host", value: this.getSetting("host"), onChange: this.handleChange }), React.createElement("br", null), React.createElement(Label, { for: "securityCode", text: "Security-Code:" }), - React.createElement(Tooltip, { text: "Der Security-Code findet sich auf der Unterseite des Gateways" }), + React.createElement(Tooltip, { text: "security code tooltip" }), React.createElement("input", { className: "value", id: "securityCode", value: this.getSetting("securityCode"), onChange: this.handleChange }))); } } diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 50a0b479..2609965d 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
Placeholder for group management functions
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAKA;AAEA;AACA;AACA;AAEA;AACA;AAGA;AAEA;AAZA;;;;;;;;;;;ACLA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
Placeholder
Placeholder
Placeholder
\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAGA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAMA;AAEA;AAjCA;;;;;;;;;;;ACPA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index d2a1e50a..f1ad23dd 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 786c47aa601936ccaeac"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 786c47aa601936ccaeac"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 4db41982fb5c2480de1b"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4db41982fb5c2480de1b"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/groups.tsx b/admin/src/components/groups.tsx index c4230f2a..dfa190ea 100644 --- a/admin/src/components/groups.tsx +++ b/admin/src/components/groups.tsx @@ -1,6 +1,8 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; +import {$$, $window, _, instance} from "../lib/adapter"; + import Fragment from "./fragment"; export class Groups extends React.Component { @@ -11,7 +13,28 @@ export class Groups extends React.Component { public render() { return ( -
Placeholder for group management functions
+ + + + + + + + + + + + + + + + + + + + +
{_("ID")}{_("Name")}{_("Devices")}
Placeholder
Placeholder
Placeholder
+
); } diff --git a/admin/src/components/settings.tsx b/admin/src/components/settings.tsx index 9b03e9d8..90bc1dd1 100644 --- a/admin/src/components/settings.tsx +++ b/admin/src/components/settings.tsx @@ -87,11 +87,11 @@ export class Settings extends React.Component return (

); diff --git a/admin/style.css b/admin/style.css index df015576..5a63ca10 100644 --- a/admin/style.css +++ b/admin/style.css @@ -55,3 +55,37 @@ div.loading { font-size: 80%; padding-left: 1em; } + +#virtual-groups { + margin-top: 0.5em; + width: calc(100% - 20px); +} +#virtual-groups td { + padding: 0.2em 0.4em; +} +#virtual-groups thead .id { + width: 100px; +} +#virtual-groups thead .name { + width: 200px; +} +#virtual-groups thead .devices { + /* ? */ +} + +#virtual-groups tbody tr:nth-child(2n) { + background-color: lightgray; +} +#virtual-groups tbody td { + padding-top: 0.25em; + padding-bottom: 0.25em; +} +#virtual-groups tbody .id { + text-align: right; +} +#virtual-groups thead .name { + text-align: left; +} +#virtual-groups thead .devices { + text-align: left; +} diff --git a/admin/words.js b/admin/words.js index fd7974ed..2189ea8b 100644 --- a/admin/words.js +++ b/admin/words.js @@ -24,4 +24,16 @@ systemDictionary = { "de": "Virtuelle Gruppen", "en": "Virtual groups" }, + "ID": { + "de": "ID", + "en": "ID" + }, + "Name": { + "de": "Name", + "en": "Name" + }, + "Devices": { + "de": "Geräte", + "en": "Devices" + }, }; \ No newline at end of file From cb58d91074ac49aadfa894316b1fec304cf67a6b Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Wed, 25 Oct 2017 15:31:17 +0200 Subject: [PATCH 25/51] linked the admin groups tab to the adapter --- admin/build/main.bundle.js | 246 +++-- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/groups.tsx | 41 - admin/src/index.tsx | 61 +- admin/src/lib/adapter.ts | 8 + admin/src/pages/groups.tsx | 58 ++ admin/src/{components => pages}/settings.tsx | 2 +- admin/style.css | 8 +- build/adapter/communication.d.ts | 6 + build/adapter/communication.js | 2 + package-lock.json | 956 +------------------ package.json | 2 +- src/adapter/communication.ts | 6 + src/adapter/message.ts | 5 +- src/rgb_debug.test.ts | 2 +- 16 files changed, 310 insertions(+), 1097 deletions(-) delete mode 100644 admin/src/components/groups.tsx create mode 100644 admin/src/pages/groups.tsx rename admin/src/{components => pages}/settings.tsx (98%) create mode 100644 build/adapter/communication.d.ts create mode 100644 build/adapter/communication.js create mode 100644 src/adapter/communication.ts diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 6455ded0..69371793 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -14,7 +14,138 @@ exports.default = Fragment; /***/ }), -/***/ "./admin/src/components/groups.tsx": +/***/ "./admin/src/components/tabs.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); +class Tabs extends React.Component { + constructor(props) { + super(props); + this.state = { + tabs: props.tabs, + }; + this.containerId = this.props.id || "tabs"; + } + componentDidMount() { + if (!adapter_1.$$) + return; // we're in a test environment without jQuery + adapter_1.$$(`#${this.containerId}`).tabs(); + } + render() { + return (React.createElement("div", { id: this.containerId }, + React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, + React.createElement("a", { href: `#${this.containerId}-${i}` }, adapter_1._(k))))), + Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.state.tabs[k])))); + } +} +exports.Tabs = Tabs; + + +/***/ }), + +/***/ "./admin/src/index.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); +// components +const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); +const tabs_1 = __webpack_require__("./admin/src/components/tabs.tsx"); +const groups_1 = __webpack_require__("./admin/src/pages/groups.tsx"); +const settings_1 = __webpack_require__("./admin/src/pages/settings.tsx"); +const namespace = `tradfri.${adapter_1.instance}`; +// layout components +function Header() { + return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, adapter_1._("Tradfri adapter settings"))); +} +class Root extends React.Component { + constructor(props) { + super(props); + this.state = { + groups: {}, + }; + // subscribe to changes of virtual group objects + adapter_1.socket.emit("subscribeObjects", namespace + ".VG-*"); + adapter_1.socket.on("objectChange", (id, obj) => { + if (id.substring(0, namespace.length) !== namespace) + return; + if (id.match(/VG\-\d+$/)) + this.updateGroups(); + }); + } + get groups() { + return this.state.groups; + } + set groups(value) { + this.setState({ groups: value }); + } + updateGroups() { + adapter_1.sendTo(null, "getGroups", { type: "virtual" }, (result) => { + if (result && result.error) { + console.error(result.error); + } + else { + this.groups = result.result; + } + }); + } + render() { + return (React.createElement(fragment_1.default, null, + React.createElement(Header, null), + React.createElement(tabs_1.Tabs, { tabs: { + Settings: React.createElement(settings_1.Settings, { settings: this.props.settings, onChange: this.props.onSettingsChanged }), + Groups: React.createElement(groups_1.Groups, { groups: this.state.groups }), + } }))); + } +} +exports.Root = Root; +let curSettings; +// the function loadSettings has to exist ... +adapter_1.$window.load = (settings, onChange) => { + const settingsChanged = (newSettings, hasChanges) => { + curSettings = newSettings; + onChange(hasChanges); + console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); + }; + ReactDOM.render(React.createElement(Root, { settings: settings, onSettingsChanged: settingsChanged }), document.getElementById("adapter-container")); + // Signal to admin, that no changes yet + onChange(false); +}; +// ... and the function save has to exist. +// you have to make sure the callback is called with the settings object as first param! +adapter_1.$window.save = (callback) => { + // save the settings + callback(curSettings); +}; + + +/***/ }), + +/***/ "./admin/src/lib/adapter.ts": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +exports.$window = window; +exports.$$ = exports.$window.jQuery; +exports.instance = exports.$window.instance || 0; +exports._ = exports.$window._ || ((text) => text); +exports.socket = exports.$window.socket; +exports.sendTo = exports.$window.sendTo; + + +/***/ }), + +/***/ "./admin/src/pages/groups.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -35,13 +166,13 @@ class Groups extends React.Component { React.createElement("td", { className: "id" }, adapter_1._("ID")), React.createElement("td", { className: "name" }, adapter_1._("Name")), React.createElement("td", { className: "devices" }, adapter_1._("Devices")))), - React.createElement("tbody", null, - React.createElement("tr", null, - React.createElement("td", { colSpan: 3 }, "Placeholder")), - React.createElement("tr", null, - React.createElement("td", { colSpan: 3 }, "Placeholder")), - React.createElement("tr", null, - React.createElement("td", { colSpan: 3 }, "Placeholder")))))); + React.createElement("tbody", null, (this.props.groups && Object.keys(this.props.groups).length > 0 ? (Object.keys(this.props.groups) + .map(k => this.props.groups[k]) + .map(group => (React.createElement("tr", null, + React.createElement("td", null, group.id), + React.createElement("td", null, group.name), + React.createElement("td", null, group.deviceIDs.join(", ")))))) : (React.createElement("tr", null, + React.createElement("td", { className: "empty", colSpan: 3 }, adapter_1._("No virtual groups defined"))))))))); } } exports.Groups = Groups; @@ -49,7 +180,7 @@ exports.Groups = Groups; /***/ }), -/***/ "./admin/src/components/settings.tsx": +/***/ "./admin/src/pages/settings.tsx": /***/ (function(module, exports, __webpack_require__) { "use strict"; @@ -127,103 +258,6 @@ class Settings extends React.Component { exports.Settings = Settings; -/***/ }), - -/***/ "./admin/src/components/tabs.tsx": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __webpack_require__("./node_modules/react/index.js"); -const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); -class Tabs extends React.Component { - constructor(props) { - super(props); - this.state = { - tabs: props.tabs, - }; - this.containerId = this.props.id || "tabs"; - } - componentDidMount() { - if (!adapter_1.$$) - return; // we're in a test environment without jQuery - adapter_1.$$(`#${this.containerId}`).tabs(); - } - render() { - return (React.createElement("div", { id: this.containerId }, - React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, - React.createElement("a", { href: `#${this.containerId}-${i}` }, adapter_1._(k))))), - Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.state.tabs[k])))); - } -} -exports.Tabs = Tabs; - - -/***/ }), - -/***/ "./admin/src/index.tsx": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -const React = __webpack_require__("./node_modules/react/index.js"); -const ReactDOM = __webpack_require__("./node_modules/react-dom/index.js"); -const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); -// components -const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); -const groups_1 = __webpack_require__("./admin/src/components/groups.tsx"); -const settings_1 = __webpack_require__("./admin/src/components/settings.tsx"); -const tabs_1 = __webpack_require__("./admin/src/components/tabs.tsx"); -const namespace = `tradfri.${adapter_1.instance}`; -// layout components -function Header() { - return (React.createElement("h3", { className: "translate", "data-role": "adapter-name" }, adapter_1._("Tradfri adapter settings"))); -} -function Root(props) { - return (React.createElement(fragment_1.default, null, - React.createElement(Header, null), - React.createElement(tabs_1.Tabs, { tabs: { - Settings: React.createElement(settings_1.Settings, { settings: props.settings, onChange: props.onSettingsChanged }), - Groups: React.createElement(groups_1.Groups, null), - } }))); -} -let curSettings; -// the function loadSettings has to exist ... -adapter_1.$window.load = (settings, onChange) => { - const settingsChanged = (newSettings, hasChanges) => { - curSettings = newSettings; - onChange(hasChanges); - console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); - }; - ReactDOM.render(React.createElement(Root, { settings: settings, onSettingsChanged: settingsChanged }), document.getElementById("adapter-container")); - // Signal to admin, that no changes yet - onChange(false); -}; -// ... and the function save has to exist. -// you have to make sure the callback is called with the settings object as first param! -adapter_1.$window.save = (callback) => { - // save the settings - callback(curSettings); -}; - - -/***/ }), - -/***/ "./admin/src/lib/adapter.ts": -/***/ (function(module, exports, __webpack_require__) { - -"use strict"; - -Object.defineProperty(exports, "__esModule", { value: true }); -// fix missing property errors/warnings -exports.$window = window; -exports.$$ = exports.$window.jQuery; -exports.instance = exports.$window.instance || 0; -exports._ = exports.$window._ || ((text) => text); - - /***/ }) },["./admin/src/index.tsx"]); diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 2609965d..562b761f 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/groups.tsx","webpack:///./admin/src/components/settings.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
Placeholder
Placeholder
Placeholder
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"./fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/settings.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Groups } from \"./components/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./components/settings\";\r\nimport { Tabs } from \"./components/tabs\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nfunction Root(props) {\r\n\treturn (\r\n\t\t\r\n\t\t\t
\r\n\t\t\t,\r\n\t\t\t\tGroups: ,\r\n\t\t\t}} />\r\n\t\t\r\n\t);\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACAA;AAGA;AAEA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAMA;AAEA;AAjCA;;;;;;;;;;;ACPA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;;;;ACzBA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC3DA;AACA;AAWA;AACA;AACA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t,\r\n\t\t\t\t\tGroups: ,\r\n\t\t\t\t}} />\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs.join(\", \")}
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AA7CA;AA+CA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AAaA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA;AAGA;AAEA;AAYA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AAKA;AAOA;AAEA;AAxCA;;;;;;;;;;;ACjBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index f1ad23dd..89252171 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 4db41982fb5c2480de1b"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 4db41982fb5c2480de1b"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap cd89c970a96a47ff4849"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap cd89c970a96a47ff4849"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/groups.tsx b/admin/src/components/groups.tsx deleted file mode 100644 index dfa190ea..00000000 --- a/admin/src/components/groups.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import * as React from "react"; -import * as ReactDOM from "react-dom"; - -import {$$, $window, _, instance} from "../lib/adapter"; - -import Fragment from "./fragment"; - -export class Groups extends React.Component { - - constructor(props) { - super(props); - } - - public render() { - return ( - - - - - - - - - - - - - - - - - - - - -
{_("ID")}{_("Name")}{_("Devices")}
Placeholder
Placeholder
Placeholder
-
- ); - } - -} diff --git a/admin/src/index.tsx b/admin/src/index.tsx index 76f7dd1b..709f9ff0 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -3,13 +3,13 @@ import * as $ from "jquery"; import * as React from "react"; import * as ReactDOM from "react-dom"; -import {$$, $window, _, instance} from "./lib/adapter"; +import {$$, $window, _, instance, sendTo, socket} from "./lib/adapter"; // components import Fragment from "./components/fragment"; -import { Groups } from "./components/groups"; -import { OnSettingsChangedCallback, Settings } from "./components/settings"; import { Tabs } from "./components/tabs"; +import { GroupDictionary, Groups } from "./pages/groups"; +import { OnSettingsChangedCallback, Settings } from "./pages/settings"; const namespace = `tradfri.${instance}`; @@ -20,16 +20,51 @@ function Header() { ); } -function Root(props) { - return ( - -
- , - Groups: , - }} /> - - ); +export class Root extends React.Component { + + constructor(props) { + super(props); + this.state = { + groups: {}, + }; + + // subscribe to changes of virtual group objects + socket.emit("subscribeObjects", namespace + ".VG-*"); + socket.on("objectChange", (id: string, obj) => { + if (id.substring(0, namespace.length) !== namespace) return; + if (id.match(/VG\-\d+$/)) this.updateGroups(); + }); + } + + public get groups(): GroupDictionary { + return this.state.groups; + } + public set groups(value: GroupDictionary) { + this.setState({groups: value}); + } + + public updateGroups() { + sendTo(null, "getGroups", { type: "virtual" }, (result) => { + if (result && result.error) { + console.error(result.error); + } else { + this.groups = result.result as GroupDictionary; + } + }); + } + + public render() { + return ( + +
+ , + Groups: , + }} /> + + ); + } + } let curSettings: any; diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts index 9ac97fa8..6c9b06fd 100644 --- a/admin/src/lib/adapter.ts +++ b/admin/src/lib/adapter.ts @@ -1,4 +1,8 @@ // fix missing property errors/warnings +interface SendToResult { + error?: string | Error; + result?: any; +} export const $window = window as any as { load: (settings, onChange) => void; save: (callback: (settings) => void) => void; @@ -6,6 +10,8 @@ export const $window = window as any as { /** Translates text */ _: (text: string) => string; jQuery: JQueryStatic; + socket: any; + sendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void; }; export interface JQueryWithTabs { tabs: (selector?: any) => JQuery & JQueryWithTabs; @@ -13,3 +19,5 @@ export interface JQueryWithTabs { export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs; export const instance = $window.instance || 0; export const _ = $window._ || ((text: string) => text); +export const socket = $window.socket; +export const sendTo = $window.sendTo; diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx new file mode 100644 index 00000000..ecb8ebf2 --- /dev/null +++ b/admin/src/pages/groups.tsx @@ -0,0 +1,58 @@ +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +import {$$, $window, _, instance} from "../lib/adapter"; + +import Fragment from "../components/fragment"; + +// Load communication objects as defined in the message module +import { Group } from "../../../src/adapter/communication"; + +export interface GroupDictionary { + [id: string]: Group; +} +interface GroupsProps { + groups: GroupDictionary; +} + +export class Groups extends React.Component { + + constructor(props) { + super(props); + } + + public render() { + return ( + + + + + + + + + + + {(this.props.groups && Object.keys(this.props.groups).length > 0 ? ( + Object.keys(this.props.groups) + .map(k => this.props.groups[k]) + .map(group => ( + + + + {/* TODO: Turn this into a multiselect dropdown */} + + + )) + ) : ( + + + + ))} + +
{_("ID")}{_("Name")}{_("Devices")}
{group.id}{group.name}{group.deviceIDs.join(", ")}
{_("No virtual groups defined")}
+
+ ); + } + +} diff --git a/admin/src/components/settings.tsx b/admin/src/pages/settings.tsx similarity index 98% rename from admin/src/components/settings.tsx rename to admin/src/pages/settings.tsx index 90bc1dd1..c54d43b1 100644 --- a/admin/src/components/settings.tsx +++ b/admin/src/pages/settings.tsx @@ -3,7 +3,7 @@ import * as ReactDOM from "react-dom"; import {$$, $window, _, instance} from "../lib/adapter"; -import Fragment from "./fragment"; +import Fragment from "../components/fragment"; export type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void; diff --git a/admin/style.css b/admin/style.css index 5a63ca10..c8a091cd 100644 --- a/admin/style.css +++ b/admin/style.css @@ -83,9 +83,13 @@ div.loading { #virtual-groups tbody .id { text-align: right; } -#virtual-groups thead .name { +#virtual-groups tbody .name { text-align: left; } -#virtual-groups thead .devices { +#virtual-groups tbody .devices { text-align: left; } + +#virtual-groups tbody .empty { + text-align: center; +} \ No newline at end of file diff --git a/build/adapter/communication.d.ts b/build/adapter/communication.d.ts new file mode 100644 index 00000000..9167dbeb --- /dev/null +++ b/build/adapter/communication.d.ts @@ -0,0 +1,6 @@ +export interface Group { + id: string; + name: string; + deviceIDs: number[]; + type: "real" | "virtual"; +} diff --git a/build/adapter/communication.js b/build/adapter/communication.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/build/adapter/communication.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/package-lock.json b/package-lock.json index 882db097..f0fe4038 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,13 +7,13 @@ "@types/chai": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.4.tgz", - "integrity": "sha512-cvU0HomQ7/aGDQJZsbtJXqBQ7w4J4TqLB0Z/h8mKrpRjfeZEvTbygkfJEb7fWdmwpIeDeFmIVwAEqS0OYuUv3Q==", + "integrity": "sha1-/oYxXZpmgn/usW9zvJVGiOyVDhg=", "dev": true }, "@types/chai-as-promised": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha512-MFiW54UOSt+f2bRw8J7LgQeIvE/9b4oGvwU7XW30S9QGAiHGnU/fmiOprsyMkdmH2rl8xSPc0/yrQw8juXU6bQ==", + "integrity": "sha1-AQsEzeeOrPtucr/ds+WP4jwueLk=", "dev": true, "requires": { "@types/chai": "4.0.4" @@ -28,13 +28,13 @@ "@types/mocha": { "version": "2.2.43", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.43.tgz", - "integrity": "sha512-xNlAmH+lRJdUMXClMTI9Y0pRqIojdxfm7DHsIxoB2iTzu3fnPmSMEN8SsSx0cdwV36d02PWCWaDUoZPDSln+xw==", + "integrity": "sha1-A8VFicQ60EjLy/1jmZtV0EJO7Cc=", "dev": true }, "@types/node": { "version": "6.0.88", "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz", - "integrity": "sha512-bYDPZTX0/s1aihdjLuAgogUAT5M+TpoWChEMea2p0yOcfn5bu3k6cJb9cp6nw268XeSNIGGr+4+/8V5K6BGzLQ==", + "integrity": "sha1-9hjxGpRPahjZK1xHIChyij49S2Y=", "dev": true }, "@types/react": { @@ -528,7 +528,7 @@ "chai-as-promised": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "integrity": "sha1-CGRdgl3rhpbuYXJdv1kMAS6wDKA=", "dev": true, "requires": { "check-error": "1.0.2" @@ -583,7 +583,6 @@ "requires": { "anymatch": "1.3.2", "async-each": "1.0.1", - "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -880,7 +879,7 @@ "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", "dev": true, "requires": { "type-detect": "4.0.3" @@ -1277,7 +1276,7 @@ "eslint-plugin-node": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz", - "integrity": "sha512-N9FLFwknT5LhRhjz1lmHguNss/MCwkrLCS4CjqqTZZTJaUhLRfDNK3zxSHL/Il3Aa0Mw+xY3T1gtsJrUNoJy8Q==", + "integrity": "sha1-4e/KBKOFUWz/Py8EAnzoxa5tt0k=", "dev": true, "requires": { "ignore": "3.3.5", @@ -1505,905 +1504,6 @@ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, - "fsevents": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", - "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", - "dev": true, - "optional": true, - "requires": { - "nan": "2.4.0", - "node-pre-gyp": "0.6.36" - }, - "dependencies": { - "abbrev": { - "version": "1.1.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "bundled": true, - "dev": true - }, - "aproba": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "are-we-there-yet": { - "version": "1.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" - } - }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", - "bundled": true, - "dev": true, - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.7", - "bundled": true, - "dev": true, - "requires": { - "balanced-match": "0.4.2", - "concat-map": "0.0.1" - } - }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "code-point-at": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "bundled": true, - "dev": true - }, - "console-control-strings": { - "version": "1.1.0", - "bundled": true, - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "debug": { - "version": "2.6.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ms": "2.0.0" - } - }, - "deep-extend": { - "version": "0.4.2", - "bundled": true, - "dev": true, - "optional": true - }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "delegates": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "bundled": true, - "dev": true, - "optional": true - }, - "form-data": { - "version": "2.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" - } - }, - "fs.realpath": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } - }, - "gauge": { - "version": "2.7.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has-unicode": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "hawk": { - "version": "3.1.3", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" - } - }, - "inflight": { - "version": "1.0.6", - "bundled": true, - "dev": true, - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "bundled": true, - "dev": true - }, - "ini": { - "version": "1.3.4", - "bundled": true, - "dev": true, - "optional": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "isarray": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, - "dev": true, - "optional": true - }, - "jodid25519": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "jsonify": { - "version": "0.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "jsprim": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", - "bundled": true, - "dev": true, - "requires": { - "mime-db": "1.27.0" - } - }, - "minimatch": { - "version": "3.0.4", - "bundled": true, - "dev": true, - "requires": { - "brace-expansion": "1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", - "bundled": true, - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "node-pre-gyp": { - "version": "0.6.36", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" - } - }, - "npmlog": { - "version": "4.1.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, - "dev": true, - "optional": true - }, - "object-assign": { - "version": "4.1.1", - "bundled": true, - "dev": true, - "optional": true - }, - "once": { - "version": "1.4.0", - "bundled": true, - "dev": true, - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "os-tmpdir": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "osenv": { - "version": "0.1.4", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "path-is-absolute": { - "version": "1.0.1", - "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "rc": { - "version": "1.2.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" - } - }, - "rimraf": { - "version": "2.6.1", - "bundled": true, - "dev": true, - "requires": { - "glob": "7.1.2" - } - }, - "safe-buffer": { - "version": "5.0.1", - "bundled": true, - "dev": true - }, - "semver": { - "version": "5.3.0", - "bundled": true, - "dev": true, - "optional": true - }, - "set-blocking": { - "version": "2.0.0", - "bundled": true, - "dev": true, - "optional": true - }, - "signal-exit": { - "version": "3.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "sntp": { - "version": "1.0.9", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "hoek": "2.16.3" - } - }, - "sshpk": { - "version": "1.13.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } - }, - "string_decoder": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "string-width": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "strip-ansi": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-json-comments": { - "version": "2.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "safe-buffer": "5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, - "util-deprecate": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, - "wide-align": { - "version": "1.1.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "string-width": "1.0.2" - } - }, - "wrappy": { - "version": "1.0.2", - "bundled": true, - "dev": true - } - } - }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -2543,7 +1643,7 @@ "growl": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.2.tgz", - "integrity": "sha512-nidsnaoWVZIBLwA3sUIp3dA2DP2rT3dwEqINVacQ0+rZmc6UOwj2D729HTEjQYUKb+3wL9MeDbxpZtEiEJoUHQ==", + "integrity": "sha1-jxbfzY+3wEz8H04AEuDqhYcml5o=", "dev": true, "requires": { "eslint-plugin-node": "5.2.0" @@ -2751,7 +1851,7 @@ "ignore": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha512-JLH93mL8amZQhh/p6mfQgVBH3M6epNq3DfsXsTSuSrInVjwyYlFE1nv2AgfRCC8PoOhM0jwQ5v8s9LgbK7yGDw==", + "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", "dev": true }, "indexof": { @@ -3341,7 +2441,7 @@ "lolex": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.3.tgz", - "integrity": "sha512-BdHq78SeI+6PAUtl4atDuCt7L6E4fab3mSRtqxm4ywaXe4uP7jZ0TTcFNuU20syUjxZc2l7jFqKVMJ+AX0LnpQ==", + "integrity": "sha1-U/iTu+iMgDeBViQOEnEmuQXIMIc=", "dev": true }, "longest": { @@ -3512,7 +2612,7 @@ "mocha": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.0.tgz", - "integrity": "sha512-83e2QQWKbcBiPb1TuS80i4DxkpqQoOC9Y0TxOuML8NkzZWUkJJqWHAslhUS7x5nQcYMqnMwZDp5v3ABzV+ivCA==", + "integrity": "sha1-PacYzNduk7nYKvsGXhcIa9vjUr8=", "dev": true, "requires": { "browser-stdout": "1.3.0", @@ -3594,7 +2694,7 @@ "nise": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/nise/-/nise-1.1.1.tgz", - "integrity": "sha512-f5DMJB0MqBaSuP2NAwPx7HyVKPdaozds0KsNe9XIP3npKWt/QUg73l5TTLRTSwfG/Y3AB0ktacuxX4QNcg6vVw==", + "integrity": "sha1-H6oHFH878kZdTb7cDkqEBI8IEEE=", "dev": true, "requires": { "formatio": "1.2.0", @@ -6285,7 +5385,7 @@ "samsam": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "integrity": "sha1-jR2TUOJWItow3j5EumkrUiGrfFA=", "dev": true }, "sax": { @@ -6399,13 +5499,13 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", "dev": true }, "source-map-support": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", - "integrity": "sha512-vUoN3I7fHQe0R/SJLKRdKYuEdRGogsviXFkHHo17AWaTGv17VLnxw+CFXvqy+y4ORZ3doWLQcxRYfwKrsd/H7Q==", + "integrity": "sha1-IBinrSvfj68mkeX92rJr7VorrKs=", "dev": true, "requires": { "source-map": "0.6.1" @@ -6506,14 +5606,6 @@ "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", @@ -6524,6 +5616,14 @@ "strip-ansi": "3.0.1" } }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, "stringstream": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", @@ -6557,7 +5657,7 @@ "supports-color": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", "dev": true, "requires": { "has-flag": "2.0.0" @@ -6728,7 +5828,7 @@ "ansi-styles": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", "dev": true, "requires": { "color-convert": "1.9.0" @@ -6737,7 +5837,7 @@ "chalk": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha512-LUHGS/dge4ujbXMJrnihYMcL4AoOweGnw9Tp3kQuqy1Kx5c1qKjqvMJZ6nVJPMWJtKCTN72ZogH3oeSO9g9rXQ==", + "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", "dev": true, "requires": { "ansi-styles": "3.2.0", @@ -6760,7 +5860,7 @@ "source-map-support": { "version": "0.4.18", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", "dev": true, "requires": { "source-map": "0.5.7" @@ -6858,7 +5958,7 @@ "typescript": { "version": "2.5.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha512-ptLSQs2S4QuS6/OD1eAKG+S5G8QQtrU5RT32JULdZQtM1L3WTi34Wsu48Yndzi8xsObRAB9RPt/KhA9wlpEF6w==", + "integrity": "sha1-3z3Nw48764ANS8MiZGsEo/bKfw0=", "dev": true }, "ua-parser-js": { diff --git a/package.json b/package.json index 027329b9..1b9b0c0f 100644 --- a/package.json +++ b/package.json @@ -77,7 +77,7 @@ "prepublishOnly": "npm run test:package", "coverage": "node node_modules/nyc/bin/nyc npm run test", "lint:ts": "tslint", - "lint": "npm run lint:ts \"src/**/*.{ts|tsx}\"", + "lint": "npm run lint:ts \"src/**/*.ts\"", "deploy_local": "node --require ts-node/register src/deploy_local.ts" }, "nyc": { diff --git a/src/adapter/communication.ts b/src/adapter/communication.ts new file mode 100644 index 00000000..2305ba46 --- /dev/null +++ b/src/adapter/communication.ts @@ -0,0 +1,6 @@ +export interface Group { + id: string; + name: string; + deviceIDs: number[]; + type: "real" | "virtual"; +} diff --git a/src/adapter/message.ts b/src/adapter/message.ts index 0cd7271c..83f66fd9 100644 --- a/src/adapter/message.ts +++ b/src/adapter/message.ts @@ -2,8 +2,9 @@ import { CoapClient as coap, CoapResponse } from "node-coap-client"; import { Accessory, AccessoryTypes } from "../ipso/accessory"; import { parsePayload } from "../lib/coap-payload"; import { ExtendedAdapter, Global as _ } from "../lib/global"; -import { entries } from "../lib/object-polyfill"; +import { DictionaryLike, entries } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; +import { Group as SendToGroup} from "./communication"; import { gateway as gw } from "./gateway"; import { extendVirtualGroup } from "./groups"; @@ -126,7 +127,7 @@ export async function onMessage(obj) { return; } - const ret = {}; + const ret: DictionaryLike = {}; if (groupType === "real" || groupType === "both") { for (const [id, group] of entries(gw.groups)) { ret[id] = { diff --git a/src/rgb_debug.test.ts b/src/rgb_debug.test.ts index 41eec4f2..482608a7 100644 --- a/src/rgb_debug.test.ts +++ b/src/rgb_debug.test.ts @@ -22,7 +22,7 @@ describe("RGB debug =>", () => { it("debugs", () => { let {r, g, b} = conversions.rgbFromString("bada55"); console.log({r, g, b}); - let {x, y, Y} = conversions.rgbToCIExyY(r, g, b); + const {x, y, Y} = conversions.rgbToCIExyY(r, g, b); console.log({_x: x * 65279, _y: y * 65279}); console.log({x, y, Y}); ({r, g, b} = conversions.rgbFromCIExyY(x, y)); From 9625cfa5cad169f27bdf222768764ff87b0f0b5d Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Wed, 25 Oct 2017 18:33:17 +0200 Subject: [PATCH 26/51] fixed groups and tabs in admin --- admin/build/main.bundle.js | 27 +++++++++++++++++---------- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/tabs.tsx | 13 +++++++------ admin/src/index.tsx | 14 ++++++++++---- admin/src/pages/groups.tsx | 3 ++- admin/style.css | 4 ++-- build/deploy_local.js | 10 ++++++---- build/main.js | 4 ++-- src/deploy_local.ts | 10 ++++++---- src/main.ts | 4 ++-- 11 files changed, 56 insertions(+), 37 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 69371793..5e89a498 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -25,9 +25,9 @@ const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); class Tabs extends React.Component { constructor(props) { super(props); - this.state = { - tabs: props.tabs, - }; + // this.state = { + // tabs: props.tabs, + // }; this.containerId = this.props.id || "tabs"; } componentDidMount() { @@ -36,10 +36,11 @@ class Tabs extends React.Component { adapter_1.$$(`#${this.containerId}`).tabs(); } render() { + console.log("Tabs rendering"); return (React.createElement("div", { id: this.containerId }, - React.createElement("ul", null, Object.keys(this.state.tabs).map((k, i) => React.createElement("li", { key: i }, + React.createElement("ul", null, this.props.labels.map((k, i) => React.createElement("li", { key: i }, React.createElement("a", { href: `#${this.containerId}-${i}` }, adapter_1._(k))))), - Object.keys(this.state.tabs).map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.state.tabs[k])))); + this.props.labels.map((k, i) => React.createElement("div", { key: i, id: `${this.containerId}-${i}` }, this.props.children[i])))); } } exports.Tabs = Tabs; @@ -72,6 +73,8 @@ class Root extends React.Component { this.state = { groups: {}, }; + } + componentDidMount() { // subscribe to changes of virtual group objects adapter_1.socket.emit("subscribeObjects", namespace + ".VG-*"); adapter_1.socket.on("objectChange", (id, obj) => { @@ -80,6 +83,8 @@ class Root extends React.Component { if (id.match(/VG\-\d+$/)) this.updateGroups(); }); + // and update once on start + this.updateGroups(); } get groups() { return this.state.groups; @@ -93,17 +98,18 @@ class Root extends React.Component { console.error(result.error); } else { + console.log("updated groups"); this.groups = result.result; } }); } render() { + console.log("Root rendering"); return (React.createElement(fragment_1.default, null, React.createElement(Header, null), - React.createElement(tabs_1.Tabs, { tabs: { - Settings: React.createElement(settings_1.Settings, { settings: this.props.settings, onChange: this.props.onSettingsChanged }), - Groups: React.createElement(groups_1.Groups, { groups: this.state.groups }), - } }))); + React.createElement(tabs_1.Tabs, { labels: ["Settings", "Groups"] }, + React.createElement(settings_1.Settings, { settings: this.props.settings, onChange: this.props.onSettingsChanged }), + React.createElement(groups_1.Groups, { groups: this.state.groups })))); } } exports.Root = Root; @@ -159,6 +165,7 @@ class Groups extends React.Component { super(props); } render() { + console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return (React.createElement(fragment_1.default, null, React.createElement("table", { id: "virtual-groups" }, React.createElement("thead", null, @@ -171,7 +178,7 @@ class Groups extends React.Component { .map(group => (React.createElement("tr", null, React.createElement("td", null, group.id), React.createElement("td", null, group.name), - React.createElement("td", null, group.deviceIDs.join(", ")))))) : (React.createElement("tr", null, + React.createElement("td", null, group.deviceIDs ? group.deviceIDs.join(", ") : ""))))) : (React.createElement("tr", null, React.createElement("td", { className: "empty", colSpan: 3 }, adapter_1._("No virtual groups defined"))))))))); } } diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 562b761f..5aee6f2e 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\ttabs: props.tabs,\r\n\t\t};\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{Object.keys(this.state.tabs).map(\r\n\t\t\t\t\t(k, i) =>
{this.state.tabs[k]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t,\r\n\t\t\t\t\tGroups: ,\r\n\t\t\t\t}} />\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs.join(\", \")}
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAhCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAGA;AAEA;AA7CA;AA+CA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzFA;AAaA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA;AAGA;AAEA;AAYA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AAKA;AAOA;AAEA;AAxCA;;;;;;;;;;;ACjBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Tabs rendering\");\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
{this.props.children[i]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(\"updated groups\");\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Root rendering\");\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(`rendering groups (length=${Object.keys(this.props.groups).length})`);\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAjCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAnDA;AAqDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/FA;AAaA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA;AAGA;AAEA;AAYA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AAKA;AAOA;AAEA;AAzCA;;;;;;;;;;;ACjBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 89252171..c6441bf7 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap cd89c970a96a47ff4849"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap cd89c970a96a47ff4849"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap b27edbd846568464620b"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b27edbd846568464620b"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/tabs.tsx b/admin/src/components/tabs.tsx index 809c9649..816fac6a 100644 --- a/admin/src/components/tabs.tsx +++ b/admin/src/components/tabs.tsx @@ -9,9 +9,9 @@ export class Tabs extends React.Component { constructor(props) { super(props); - this.state = { - tabs: props.tabs, - }; + // this.state = { + // tabs: props.tabs, + // }; this.containerId = this.props.id || "tabs"; } @@ -24,15 +24,16 @@ export class Tabs extends React.Component { } public render() { + console.log("Tabs rendering"); return (
    - {Object.keys(this.state.tabs).map( + {this.props.labels.map( (k, i) =>
  • {_(k)}
  • , )}
- {Object.keys(this.state.tabs).map( - (k, i) =>
{this.state.tabs[k]}
, + {this.props.labels.map( + (k, i) =>
{this.props.children[i]}
, )}
); diff --git a/admin/src/index.tsx b/admin/src/index.tsx index 709f9ff0..50163c5e 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -27,13 +27,17 @@ export class Root extends React.Component { this.state = { groups: {}, }; + } + public componentDidMount() { // subscribe to changes of virtual group objects socket.emit("subscribeObjects", namespace + ".VG-*"); socket.on("objectChange", (id: string, obj) => { if (id.substring(0, namespace.length) !== namespace) return; if (id.match(/VG\-\d+$/)) this.updateGroups(); }); + // and update once on start + this.updateGroups(); } public get groups(): GroupDictionary { @@ -48,19 +52,21 @@ export class Root extends React.Component { if (result && result.error) { console.error(result.error); } else { + console.log("updated groups"); this.groups = result.result as GroupDictionary; } }); } public render() { + console.log("Root rendering"); return (
- , - Groups: , - }} /> + + + + ); } diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index ecb8ebf2..be1b4355 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -22,6 +22,7 @@ export class Groups extends React.Component { } public render() { + console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return ( @@ -41,7 +42,7 @@ export class Groups extends React.Component { {/* TODO: Turn this into a multiselect dropdown */} - + )) ) : ( diff --git a/admin/style.css b/admin/style.css index c8a091cd..e375b310 100644 --- a/admin/style.css +++ b/admin/style.css @@ -67,10 +67,10 @@ div.loading { width: 100px; } #virtual-groups thead .name { - width: 200px; + width: auto; } #virtual-groups thead .devices { - /* ? */ + width: 200px; } #virtual-groups tbody tr:nth-child(2n) { diff --git a/build/deploy_local.js b/build/deploy_local.js index 87dff166..1acde8ef 100644 --- a/build/deploy_local.js +++ b/build/deploy_local.js @@ -56,7 +56,7 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; return false; if (basename.endsWith("Thumbs.db")) return false; - if (basename.endsWith(".map")) + if (basename.endsWith(".map") && basename.indexOf(".bundle.") === -1) return false; if (basename.indexOf(".test.") > -1) return false; @@ -80,9 +80,11 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; execResult = yield ssh.execCommand(`iobroker upload ${ADAPTER_NAME}`); console.log(execResult.stdout); console.log(execResult.stderr); - execResult = yield ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); - console.log(execResult.stdout); - console.log(execResult.stderr); + if (process.argv.indexOf("--restart") > -1) { + execResult = yield ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); + console.log(execResult.stdout); + console.log(execResult.stderr); + } console.log("done"); process.exit(0); }); diff --git a/build/main.js b/build/main.js index f714c49d..728f0036 100644 --- a/build/main.js +++ b/build/main.js @@ -1165,9 +1165,9 @@ function loadVirtualGroups() { // load them into the virtualGroups dict Object.assign(gateway_1.gateway.virtualGroups, object_polyfill_1.composeObject(groupObjects.map(g => { const id = g.native.instanceId; - const instanceIDs = g.native.instanceIDs; + const deviceIDs = g.native.deviceIDs; const ret = new virtual_group_1.VirtualGroup(id); - ret.deviceIDs = instanceIDs; + ret.deviceIDs = deviceIDs; ret.name = g.common.name; return [`${id}`, ret]; }))); diff --git a/src/deploy_local.ts b/src/deploy_local.ts index a47e3e9f..2e1c9509 100644 --- a/src/deploy_local.ts +++ b/src/deploy_local.ts @@ -52,7 +52,7 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; const basename = path.basename(pathname); if (basename.startsWith("deploy_")) return false; if (basename.endsWith("Thumbs.db")) return false; - if (basename.endsWith(".map")) return false; + if (basename.endsWith(".map") && basename.indexOf(".bundle.") === -1) return false; if (basename.indexOf(".test.") > -1) return false; if (basename === "src") return false; return true; @@ -73,9 +73,11 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; execResult = await ssh.execCommand(`iobroker upload ${ADAPTER_NAME}`); console.log(execResult.stdout); console.log(execResult.stderr); - execResult = await ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); - console.log(execResult.stdout); - console.log(execResult.stderr); + if (process.argv.indexOf("--restart") > -1) { + execResult = await ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); + console.log(execResult.stdout); + console.log(execResult.stderr); + } console.log("done"); process.exit(0); diff --git a/src/main.ts b/src/main.ts index 9992e437..eff49002 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1281,9 +1281,9 @@ async function loadVirtualGroups(): Promise { Object.assign(gw.virtualGroups, composeObject( groupObjects.map(g => { const id: number = g.native.instanceId; - const instanceIDs: number[] = g.native.instanceIDs; + const deviceIDs: number[] = g.native.deviceIDs; const ret = new VirtualGroup(id); - ret.deviceIDs = instanceIDs; + ret.deviceIDs = deviceIDs; ret.name = g.common.name; return [`${id}`, ret] as [string, VirtualGroup]; }), From ceaabfc9669a0f552962c168b49bf796ac512ca5 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Wed, 25 Oct 2017 18:36:09 +0200 Subject: [PATCH 27/51] updated tabs test to reflect the changed component --- admin/src/components/tabs.test.tsx | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/admin/src/components/tabs.test.tsx b/admin/src/components/tabs.test.tsx index a61b4890..ef127df5 100644 --- a/admin/src/components/tabs.test.tsx +++ b/admin/src/components/tabs.test.tsx @@ -23,7 +23,9 @@ describe("jQuery-UI tabs", () => { }; const tabCount = Object.keys(definition).length; - const tab = ; + const tab = { + Object.keys(definition).map(k => definition[k]) + }; it(`renders the correct amount (${tabCount}) of headers`, () => { expect(shallow(tab).find("li")).to.have.length(tabCount); @@ -31,5 +33,8 @@ describe("jQuery-UI tabs", () => { it(`renders the correct amount (${tabCount}) of tab divs`, () => { expect(shallow(tab).find("div#tabs > div")).to.have.length(tabCount); }); + it(`renders the defined tabs`, () => { + expect(shallow(tab).find("div#test")).to.have.length(1); + }); }); From fcca9224ecc1f4eb99c89f0f294c29b6ba652ddf Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Wed, 25 Oct 2017 22:48:34 +0200 Subject: [PATCH 28/51] added add and delete buttons for virtual groups --- admin/build/main.bundle.js | 47 +++++++++++++++++++++++++--- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/lib/adapter.ts | 7 +++-- admin/src/pages/groups.tsx | 52 +++++++++++++++++++++++++++++-- admin/style.css | 10 ++++++ build/adapter/message.js | 18 +++++++++++ src/adapter/message.ts | 24 +++++++++++++- 8 files changed, 149 insertions(+), 13 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 5e89a498..5ea6e8fb 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -160,26 +160,65 @@ Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); +const ADD_GROUP_BUTTON_ID = "btnAddGroup"; class Groups extends React.Component { constructor(props) { super(props); } + componentDidMount() { + if (!adapter_1.$$) + return; // we're in a test environment without jQuery + adapter_1.$$(`#${ADD_GROUP_BUTTON_ID}`).button({ + icons: { primary: "ui-icon-plusthick" }, + }); + adapter_1.$$(`#virtual-groups .delete-group`).button({ + icons: { primary: "ui-icon-trash" }, + text: false, + }); + } + componentDidUpdate() { + if (!adapter_1.$$) + return; // we're in a test environment without jQuery + adapter_1.$$(`#virtual-groups .delete-group`).button({ + icons: { primary: "ui-icon-trash" }, + text: false, + }); + } + addGroup() { + adapter_1.sendTo(null, "addVirtualGroup", null, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + deleteGroup(id) { + adapter_1.sendTo(null, "deleteVirtualGroup", { id }, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } render() { console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return (React.createElement(fragment_1.default, null, + React.createElement("p", { className: "actions-panel" }, + React.createElement("button", { id: ADD_GROUP_BUTTON_ID, onClick: this.addGroup }, adapter_1._("add group"))), React.createElement("table", { id: "virtual-groups" }, React.createElement("thead", null, React.createElement("tr", { className: "ui-widget-header" }, React.createElement("td", { className: "id" }, adapter_1._("ID")), React.createElement("td", { className: "name" }, adapter_1._("Name")), - React.createElement("td", { className: "devices" }, adapter_1._("Devices")))), + React.createElement("td", { className: "devices" }, adapter_1._("Devices")), + React.createElement("td", { className: "delete" }))), React.createElement("tbody", null, (this.props.groups && Object.keys(this.props.groups).length > 0 ? (Object.keys(this.props.groups) .map(k => this.props.groups[k]) - .map(group => (React.createElement("tr", null, + .map(group => (React.createElement("tr", { key: group.id }, React.createElement("td", null, group.id), React.createElement("td", null, group.name), - React.createElement("td", null, group.deviceIDs ? group.deviceIDs.join(", ") : ""))))) : (React.createElement("tr", null, - React.createElement("td", { className: "empty", colSpan: 3 }, adapter_1._("No virtual groups defined"))))))))); + React.createElement("td", null, group.deviceIDs ? group.deviceIDs.join(", ") : ""), + React.createElement("td", null, + React.createElement("button", { title: adapter_1._("delete group"), className: "delete-group", onClick: () => this.deleteGroup(group.id) })))))) : (React.createElement("tr", null, + React.createElement("td", { className: "empty", colSpan: 4 }, adapter_1._("No virtual groups defined"))))))))); } } exports.Groups = Groups; diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 5aee6f2e..e4de85be 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Tabs rendering\");\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
{this.props.children[i]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(\"updated groups\");\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Root rendering\");\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryWithTabs {\r\n\ttabs: (selector?: any) => JQuery & JQueryWithTabs;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(`rendering groups (length=${Object.keys(this.props.groups).length})`);\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
{group.id} {group.name}{group.deviceIDs.join(", ")}{group.deviceIDs ? group.deviceIDs.join(", ") : ""}
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAjCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAnDA;AAqDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/FA;AAaA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACtBA;AAGA;AAEA;AAYA;AAEA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AAKA;AAOA;AAEA;AAzCA;;;;;;;;;;;ACjBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Tabs rendering\");\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
{this.props.children[i]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(\"updated groups\");\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Root rendering\");\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(`rendering groups (length=${Object.keys(this.props.groups).length})`);\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAjCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAnDA;AAqDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/FA;AAcA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvBA;AAGA;AAEA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAMA;AAOA;AAEA;AArFA;;;;;;;;;;;ACnBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index c6441bf7..3260b55b 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap b27edbd846568464620b"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap b27edbd846568464620b"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap de362d3effba95210280"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap de362d3effba95210280"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts index 6c9b06fd..2317c315 100644 --- a/admin/src/lib/adapter.ts +++ b/admin/src/lib/adapter.ts @@ -13,10 +13,11 @@ export const $window = window as any as { socket: any; sendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void; }; -export interface JQueryWithTabs { - tabs: (selector?: any) => JQuery & JQueryWithTabs; +export interface JQueryUI { + tabs: (selector?: any) => JQuery & JQueryUI; + button: (selector?: any) => JQuery & JQueryUI; } -export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryWithTabs; +export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI; export const instance = $window.instance || 0; export const _ = $window._ || ((text: string) => text); export const socket = $window.socket; diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index be1b4355..e4e0f874 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -1,7 +1,7 @@ import * as React from "react"; import * as ReactDOM from "react-dom"; -import {$$, $window, _, instance} from "../lib/adapter"; +import {$$, $window, _, instance, sendTo, socket} from "../lib/adapter"; import Fragment from "../components/fragment"; @@ -15,22 +15,65 @@ interface GroupsProps { groups: GroupDictionary; } +const ADD_GROUP_BUTTON_ID = "btnAddGroup"; + export class Groups extends React.Component { constructor(props) { super(props); } + public componentDidMount() { + if (!$$) return; // we're in a test environment without jQuery + + $$(`#${ADD_GROUP_BUTTON_ID}`).button({ + icons: { primary: "ui-icon-plusthick" }, + }); + $$(`#virtual-groups .delete-group`).button({ + icons: { primary: "ui-icon-trash" }, + text: false, + }); + } + + public componentDidUpdate() { + if (!$$) return; // we're in a test environment without jQuery + + $$(`#virtual-groups .delete-group`).button({ + icons: { primary: "ui-icon-trash" }, + text: false, + }); + } + + private addGroup() { + sendTo(null, "addVirtualGroup", null, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + + private deleteGroup(id: string) { + sendTo(null, "deleteVirtualGroup", {id}, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + public render() { console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return ( +

+ +

+ @@ -38,16 +81,19 @@ export class Groups extends React.Component { Object.keys(this.props.groups) .map(k => this.props.groups[k]) .map(group => ( - + {/* TODO: Turn this into a multiselect dropdown */} + )) ) : ( - + ))} diff --git a/admin/style.css b/admin/style.css index e375b310..0337c5da 100644 --- a/admin/style.css +++ b/admin/style.css @@ -72,6 +72,9 @@ div.loading { #virtual-groups thead .devices { width: 200px; } +#virtual-groups thead .delete { + width: 30px; +} #virtual-groups tbody tr:nth-child(2n) { background-color: lightgray; @@ -92,4 +95,11 @@ div.loading { #virtual-groups tbody .empty { text-align: center; +} + +#virtual-groups .delete-group { + margin-top: -0.25em; + margin-bottom: -0.25em; + width: 24px; + height: 20px; } \ No newline at end of file diff --git a/build/adapter/message.js b/build/adapter/message.js index c4df536e..0e94244b 100644 --- a/build/adapter/message.js +++ b/build/adapter/message.js @@ -117,6 +117,24 @@ function onMessage(obj) { respond(responses.OK); return; } + case "deleteVirtualGroup": { + // require the id to be given + if (!requireParams("id")) + return; + // check the given params + const params = obj.message; + const id = parseInt(params.id, 10); + if (!(id in gateway_1.gateway.virtualGroups)) { + respond({ error: `no virtual group with ID ${id} found!` }); + return; + } + const group = gateway_1.gateway.virtualGroups[id]; + const channel = groups_1.calcGroupName(group); + yield global_1.Global.adapter.deleteChannel(channel); + delete gateway_1.gateway.virtualGroups[id]; + respond(responses.OK); + return; + } case "getGroups": { // check the given params const params = obj.message; diff --git a/src/adapter/message.ts b/src/adapter/message.ts index 83f66fd9..4b79be9d 100644 --- a/src/adapter/message.ts +++ b/src/adapter/message.ts @@ -6,7 +6,7 @@ import { DictionaryLike, entries } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; import { Group as SendToGroup} from "./communication"; import { gateway as gw } from "./gateway"; -import { extendVirtualGroup } from "./groups"; +import { calcGroupId, calcGroupName, extendVirtualGroup } from "./groups"; export async function onMessage(obj) { // responds to the adapter that sent the original message @@ -117,6 +117,28 @@ export async function onMessage(obj) { return; } + case "deleteVirtualGroup": { + // require the id to be given + if (!requireParams("id")) return; + + // check the given params + const params = obj.message as any; + const id = parseInt(params.id, 10); + + if (!(id in gw.virtualGroups)) { + respond({ error: `no virtual group with ID ${id} found!` }); + return; + } + + const group = gw.virtualGroups[id]; + const channel = calcGroupName(group); + await _.adapter.deleteChannel(channel); + delete gw.virtualGroups[id]; + + respond(responses.OK); + return; + } + case "getGroups": { // get all groups defined on the gateway // check the given params const params = obj.message as any; From 32349bbe2be72b586ef35c2d68f9f03c444ca431 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Thu, 26 Oct 2017 09:40:26 +0200 Subject: [PATCH 29/51] enabled jQuery in testing environment --- admin/build/main.bundle.js | 11 ----------- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/tabs.tsx | 3 --- admin/src/index.tsx | 3 --- admin/src/lib/adapter.ts | 1 + admin/src/pages/groups.tsx | 5 ----- package-lock.json | 6 ++++++ package.json | 1 + test/setupJSDom.js | 8 ++++++-- 10 files changed, 16 insertions(+), 26 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 5ea6e8fb..12171b5e 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -31,12 +31,9 @@ class Tabs extends React.Component { this.containerId = this.props.id || "tabs"; } componentDidMount() { - if (!adapter_1.$$) - return; // we're in a test environment without jQuery adapter_1.$$(`#${this.containerId}`).tabs(); } render() { - console.log("Tabs rendering"); return (React.createElement("div", { id: this.containerId }, React.createElement("ul", null, this.props.labels.map((k, i) => React.createElement("li", { key: i }, React.createElement("a", { href: `#${this.containerId}-${i}` }, adapter_1._(k))))), @@ -98,13 +95,11 @@ class Root extends React.Component { console.error(result.error); } else { - console.log("updated groups"); this.groups = result.result; } }); } render() { - console.log("Root rendering"); return (React.createElement(fragment_1.default, null, React.createElement(Header, null), React.createElement(tabs_1.Tabs, { labels: ["Settings", "Groups"] }, @@ -119,7 +114,6 @@ adapter_1.$window.load = (settings, onChange) => { const settingsChanged = (newSettings, hasChanges) => { curSettings = newSettings; onChange(hasChanges); - console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); }; ReactDOM.render(React.createElement(Root, { settings: settings, onSettingsChanged: settingsChanged }), document.getElementById("adapter-container")); // Signal to admin, that no changes yet @@ -166,8 +160,6 @@ class Groups extends React.Component { super(props); } componentDidMount() { - if (!adapter_1.$$) - return; // we're in a test environment without jQuery adapter_1.$$(`#${ADD_GROUP_BUTTON_ID}`).button({ icons: { primary: "ui-icon-plusthick" }, }); @@ -177,8 +169,6 @@ class Groups extends React.Component { }); } componentDidUpdate() { - if (!adapter_1.$$) - return; // we're in a test environment without jQuery adapter_1.$$(`#virtual-groups .delete-group`).button({ icons: { primary: "ui-icon-trash" }, text: false, @@ -199,7 +189,6 @@ class Groups extends React.Component { }); } render() { - console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return (React.createElement(fragment_1.default, null, React.createElement("p", { className: "actions-panel" }, React.createElement("button", { id: ADD_GROUP_BUTTON_ID, onClick: this.addGroup }, adapter_1._("add group"))), diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index e4de85be..da1e6901 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Tabs rendering\");\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
{this.props.children[i]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tconsole.log(\"updated groups\");\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(\"Root rendering\");\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t\tconsole.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\tif (!$$) return; // we're in a test environment without jQuery\r\n\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tconsole.log(`rendering groups (length=${Object.keys(this.props.groups).length})`);\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t
{_("ID")} {_("Name")} {_("Devices")}
{group.id} {group.name}{group.deviceIDs ? group.deviceIDs.join(", ") : ""} + +
{_("No virtual groups defined")}{_("No virtual groups defined")}
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AAAA;AAEA;AACA;AAEA;AACA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AAjCA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAnDA;AAqDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC/FA;AAcA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACvBA;AAGA;AAEA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAAA;AAEA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAMA;AAOA;AAEA;AArFA;;;;;;;;;;;ACnBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx","webpack:///(webpack)/buildin/global.js"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
    \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
  • {_(k)}
  • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
\r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
{this.props.children[i]}
,\r\n\t\t\t\t)}\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

{_(\"Tradfri adapter settings\")}

\r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nif (!$window.jQuery || !$window.$ && (global as any).$) {\r\n\t$window.jQuery = $window.$ = (global as any).$;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t\t\r\n\t\t\t\t

\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
{_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
{group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
{_(\"No virtual groups defined\")}
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

\r\n\t\t\t\t

\r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = main"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3BA;AAGA;AAEA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAMA;AAOA;AAEA;AAhFA;;;;;;;;;;;ACnBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 3260b55b..5a24602a 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap de362d3effba95210280"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap de362d3effba95210280"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 97dd937af3f6c343650e"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 97dd937af3f6c343650e"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/tabs.tsx b/admin/src/components/tabs.tsx index 816fac6a..b4b561b8 100644 --- a/admin/src/components/tabs.tsx +++ b/admin/src/components/tabs.tsx @@ -18,13 +18,10 @@ export class Tabs extends React.Component { private containerId: string; public componentDidMount() { - if (!$$) return; // we're in a test environment without jQuery - $$(`#${this.containerId}`).tabs(); } public render() { - console.log("Tabs rendering"); return (
    diff --git a/admin/src/index.tsx b/admin/src/index.tsx index 50163c5e..95ae7f67 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -52,14 +52,12 @@ export class Root extends React.Component { if (result && result.error) { console.error(result.error); } else { - console.log("updated groups"); this.groups = result.result as GroupDictionary; } }); } public render() { - console.log("Root rendering"); return (
    @@ -81,7 +79,6 @@ $window.load = (settings, onChange) => { const settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => { curSettings = newSettings; onChange(hasChanges); - console.log(`settings changed: ${JSON.stringify(curSettings)}, hasChanges=${hasChanges}`); }; ReactDOM.render( diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts index 2317c315..c91c7833 100644 --- a/admin/src/lib/adapter.ts +++ b/admin/src/lib/adapter.ts @@ -10,6 +10,7 @@ export const $window = window as any as { /** Translates text */ _: (text: string) => string; jQuery: JQueryStatic; + $: JQueryStatic; socket: any; sendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void; }; diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index e4e0f874..6d32a34e 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -24,8 +24,6 @@ export class Groups extends React.Component { } public componentDidMount() { - if (!$$) return; // we're in a test environment without jQuery - $$(`#${ADD_GROUP_BUTTON_ID}`).button({ icons: { primary: "ui-icon-plusthick" }, }); @@ -36,8 +34,6 @@ export class Groups extends React.Component { } public componentDidUpdate() { - if (!$$) return; // we're in a test environment without jQuery - $$(`#virtual-groups .delete-group`).button({ icons: { primary: "ui-icon-trash" }, text: false, @@ -61,7 +57,6 @@ export class Groups extends React.Component { } public render() { - console.log(`rendering groups (length=${Object.keys(this.props.groups).length})`); return (

    diff --git a/package-lock.json b/package-lock.json index f0fe4038..191a0314 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2071,6 +2071,12 @@ "integrity": "sha1-tuyShZARLr7Wnh5Jy/0AJczWDds=", "dev": true }, + "jquery-ui": { + "version": "1.10.4", + "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.10.4.tgz", + "integrity": "sha1-oJb+X04PKraaBYXPEEVYd/V1Br0=", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index 1b9b0c0f..6444e180 100644 --- a/package.json +++ b/package.json @@ -35,6 +35,7 @@ "enzyme-adapter-react-16": "^1.0.1", "html-webpack-plugin": "^2.30.1", "jquery": "1.11.1", + "jquery-ui": "1.10.4", "jsdom": "^11.3.0", "mocha": "^4.0.0", "node-ssh": "^5.0.0", diff --git a/test/setupJSDom.js b/test/setupJSDom.js index 667c630f..aac166db 100644 --- a/test/setupJSDom.js +++ b/test/setupJSDom.js @@ -1,7 +1,6 @@ /** * Sets up a DOM for react component tests */ - const { JSDOM } = require('jsdom'); const jsdom = new JSDOM(''); @@ -20,4 +19,9 @@ global.navigator = { userAgent: 'node.js', }; copyProps(window, global); -window.TESTING = true; \ No newline at end of file + +// after everything is set up, load jquery +const $ = require('jquery'); +const jQuery = $; +global.$ = global.jQuery = window.$ = window.jQuery = $; +require('jquery-ui'); From 27072fb67c9cf04190386ebf437261072fcccfce Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Thu, 26 Oct 2017 10:13:00 +0200 Subject: [PATCH 30/51] made virtual group names editable in admin untested! --- admin/build/main.bundle.js | 61 +++++++++++++++++++++++- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/editable-label.tsx | 63 +++++++++++++++++++++++++ admin/src/pages/groups.tsx | 21 ++++++++- 5 files changed, 145 insertions(+), 4 deletions(-) create mode 100644 admin/src/components/editable-label.tsx diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 12171b5e..0dbfcbe6 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -1,5 +1,50 @@ webpackJsonp(["main"],{ +/***/ "./admin/src/components/editable-label.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +class EditableLabel extends React.Component { + constructor(props) { + super(props); + this.beginEdit = () => { + this.setState({ editMode: true }); + }; + this.endEdit = () => { + this.setState({ + editMode: false, + text: this.txtEdit.value, + }); + this.props.textChanged(this.state.text); + }; + this.keyPressed = (e) => { + if (e.keyCode === 13) { + // Enter + this.endEdit(); + } + }; + this.state = { + editMode: false, + text: props.text, + }; + } + render() { + if (this.state.editMode) { + return (React.createElement("input", { type: "text", ref: (me) => this.txtEdit = me, onBlur: this.endEdit, onKeyPress: this.keyPressed, value: this.state.text })); + } + else { + return (React.createElement("span", { onClick: this.beginEdit }, this.state.text)); + } + } +} +exports.EditableLabel = EditableLabel; + + +/***/ }), + /***/ "./admin/src/components/fragment.tsx": /***/ (function(module, exports, __webpack_require__) { @@ -153,6 +198,7 @@ exports.sendTo = exports.$window.sendTo; Object.defineProperty(exports, "__esModule", { value: true }); const React = __webpack_require__("./node_modules/react/index.js"); const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); +const editable_label_1 = __webpack_require__("./admin/src/components/editable-label.tsx"); const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); const ADD_GROUP_BUTTON_ID = "btnAddGroup"; class Groups extends React.Component { @@ -188,6 +234,18 @@ class Groups extends React.Component { } }); } + renameGroup(id, newName) { + const group = this.props.groups[id]; + // if we have a valid name + if (typeof newName === "string" && newName.length > 0 && newName !== group.name) { + // update it on the server + adapter_1.sendTo(null, "editVirtualGroup", { id, name: newName }, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + } render() { return (React.createElement(fragment_1.default, null, React.createElement("p", { className: "actions-panel" }, @@ -203,7 +261,8 @@ class Groups extends React.Component { .map(k => this.props.groups[k]) .map(group => (React.createElement("tr", { key: group.id }, React.createElement("td", null, group.id), - React.createElement("td", null, group.name), + React.createElement("td", null, + React.createElement(editable_label_1.EditableLabel, { text: group.name, textChanged: (newText) => this.renameGroup(group.id, newText) })), React.createElement("td", null, group.deviceIDs ? group.deviceIDs.join(", ") : ""), React.createElement("td", null, React.createElement("button", { title: adapter_1._("delete group"), className: "delete-group", onClick: () => this.deleteGroup(group.id) })))))) : (React.createElement("tr", null, diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index da1e6901..45c2b0a3 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx","webpack:///(webpack)/buildin/global.js"],"sourcesContent":["export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nif (!$window.jQuery || !$window.$ && (global as any).$) {\r\n\t$window.jQuery = $window.$ = (global as any).$;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}{group.name}{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx","var g;\n\n// This works in non-strict mode\ng = (function() {\n\treturn this;\n})();\n\ntry {\n\t// This works if eval is allowed (see CSP)\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\n} catch(e) {\n\t// This works if the window reference is available\n\tif(typeof window === \"object\")\n\t\tg = window;\n}\n\n// g can still be undefined, but nothing to do about it...\n// We return undefined, instead of nothing here, so it's\n// easier to handle this case. if(!global) { ...}\n\nmodule.exports = g;\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// (webpack)/buildin/global.js\n// module id = ./node_modules/webpack/buildin/global.js\n// module chunks = main"],"mappings":";;;;;;;;AAAA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAeA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;;AC3BA;AAGA;AAEA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAMA;AAOA;AAEA;AAhFA;;;;;;;;;;;ACnBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;A","sourceRoot":""} +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: any;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t}\r\n\tprivate readonly endEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t\tthis.props.textChanged(this.state.text);\r\n\t}\r\n\r\n\tprivate readonly keyPressed = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\t// Enter\r\n\t\t\tthis.endEdit();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t this.txtEdit = me}\r\n\t\t\t\t\tonBlur={this.endEdit}\r\n\t\t\t\t\tonKeyPress={this.keyPressed}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAcA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAxBA;AACA;AACA;AACA;AACA;AAsBA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAhDA;;;;;;;;;;;ACdA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAeA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxBA;AAGA;AAEA;AACA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AACA;AACA;AAMA;AAOA;AAEA;AAlGA;;;;;;;;;;;ACpBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 5a24602a..3c535721 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 97dd937af3f6c343650e"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 97dd937af3f6c343650e"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 799a19038e0e7c3b8d01"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 799a19038e0e7c3b8d01"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/editable-label.tsx b/admin/src/components/editable-label.tsx new file mode 100644 index 00000000..ff149824 --- /dev/null +++ b/admin/src/components/editable-label.tsx @@ -0,0 +1,63 @@ +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +import {$$, $window, _, instance} from "../lib/adapter"; + +interface EditableLabelState { + editMode: boolean; + text: string; +} +interface EditableLabelProps { + text: string; + textChanged: (newText: string) => void; +} + +export class EditableLabel extends React.Component { + + constructor(props) { + super(props); + this.state = { + editMode: false, + text: props.text, + }; + } + + private txtEdit: any; + + private readonly beginEdit = () => { + this.setState({editMode: true}); + } + private readonly endEdit = () => { + this.setState({ + editMode: false, + text: this.txtEdit.value, + }); + this.props.textChanged(this.state.text); + } + + private readonly keyPressed = (e: React.KeyboardEvent) => { + if (e.keyCode === 13) { + // Enter + this.endEdit(); + } + } + + public render() { + if (this.state.editMode) { + return ( + this.txtEdit = me} + onBlur={this.endEdit} + onKeyPress={this.keyPressed} + value={this.state.text} + /> + ); + } else { + return ( + {this.state.text} + ); + } + } + +} diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index 6d32a34e..436f7a93 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -3,6 +3,7 @@ import * as ReactDOM from "react-dom"; import {$$, $window, _, instance, sendTo, socket} from "../lib/adapter"; +import { EditableLabel } from "../components/editable-label"; import Fragment from "../components/fragment"; // Load communication objects as defined in the message module @@ -56,6 +57,19 @@ export class Groups extends React.Component { }); } + private renameGroup(id: string, newName: string) { + const group = this.props.groups[id]; + // if we have a valid name + if (typeof newName === "string" && newName.length > 0 && newName !== group.name) { + // update it on the server + sendTo(null, "editVirtualGroup", {id, name: newName}, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + } + public render() { return ( @@ -78,7 +92,12 @@ export class Groups extends React.Component { .map(group => ( {group.id} - {group.name} + + this.renameGroup(group.id, newText)} + /> + {/* TODO: Turn this into a multiselect dropdown */} {group.deviceIDs ? group.deviceIDs.join(", ") : ""} From 5aba1a6d1691b63931722cccc68358075b585b43 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Thu, 26 Oct 2017 13:27:12 +0200 Subject: [PATCH 31/51] created a multiselect dropdown component for device selection --- admin/build/main.bundle.js.map | 2 +- admin/index.html | 4 +- admin/src/components/multi-dropdown.tsx | 89 +++++++++++++++++++++++++ admin/src/lib/adapter.ts | 1 + package-lock.json | 6 ++ package.json | 1 + test/setupJSDom.js | 1 + 7 files changed, 101 insertions(+), 3 deletions(-) create mode 100644 admin/src/components/multi-dropdown.tsx diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index 45c2b0a3..d8a16b0a 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: any;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t}\r\n\tprivate readonly endEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t\tthis.props.textChanged(this.state.text);\r\n\t}\r\n\r\n\tprivate readonly keyPressed = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\t// Enter\r\n\t\t\tthis.endEdit();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t this.txtEdit = me}\r\n\t\t\t\t\tonBlur={this.endEdit}\r\n\t\t\t\t\tonKeyPress={this.keyPressed}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAcA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAxBA;AACA;AACA;AACA;AACA;AAsBA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAhDA;;;;;;;;;;;ACdA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAeA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACxBA;AAGA;AAEA;AACA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AACA;AACA;AAMA;AAOA;AAEA;AAlGA;;;;;;;;;;;ACpBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: any;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t}\r\n\tprivate readonly endEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t\tthis.props.textChanged(this.state.text);\r\n\t}\r\n\r\n\tprivate readonly keyPressed = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\t// Enter\r\n\t\t\tthis.endEdit();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t this.txtEdit = me}\r\n\t\t\t\t\tonBlur={this.endEdit}\r\n\t\t\t\t\tonKeyPress={this.keyPressed}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n\tmultiselect: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAcA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAxBA;AACA;AACA;AACA;AACA;AAsBA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAhDA;;;;;;;;;;;ACdA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAgBA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA;AAGA;AAEA;AACA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AACA;AACA;AAMA;AAOA;AAEA;AAlGA;;;;;;;;;;;ACpBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/index.html b/admin/index.html index 2b16b463..31c2ed91 100644 --- a/admin/index.html +++ b/admin/index.html @@ -14,10 +14,10 @@ --> - + diff --git a/admin/src/components/multi-dropdown.tsx b/admin/src/components/multi-dropdown.tsx new file mode 100644 index 00000000..f4addb4b --- /dev/null +++ b/admin/src/components/multi-dropdown.tsx @@ -0,0 +1,89 @@ +// Renders some components in jQuery UI tabs +import * as $ from "jquery"; +import * as React from "react"; +import * as ReactDOM from "react-dom"; + +import {$$, $window, _, instance} from "../lib/adapter"; + +interface MultiDropdownProps { + options: {[key: string]: string}; + checkedOptions: string[]; + checkedChanged: (selected: string[]) => void; +} + +interface MultiDropdownState { + checkedOptions: string[]; +} + +export class MultiDropdown extends React.Component { + + constructor(props) { + super(props); + this.state = { + checkedOptions: props.checkedOptions, + }; + } + + private dropdown: any; + + public componentDidMount() { + this.doJQueryStuff(); + } + + public componentDidUpdate() { + this.doJQueryStuff(); + } + + private doJQueryStuff() { + $$(this.dropdown).multiselect({ + minWidth: 250, + classes: "ui-selectmenu-button", + click: this.optionClicked, + close: this.dropdownClosed, + }); + } + + private optionClicked = (event, ui) => { + const index = this.state.checkedOptions.indexOf(ui.value); + const checked = [...this.state.checkedOptions]; + if (ui.checked) { + if (index === -1) checked.push(ui.value); + } else { + if (index !== -1) checked.splice(index, 1); + } + this.setState({checkedOptions: checked}); + } + + private dropdownClosed = () => { + this.props.checkedChanged(this.state.checkedOptions); + } + + public render() { + return ( + + ); + } +} +// $('#assAssNodes').multiselect({ +// header: false, +// minWidth: 250, +// noneSelectedText: 'select nodes', +// selectedText: '# nodes selected', +// classes: 'ui-selectmenu-button', +// click: function(event, ui){ +// if (ui.checked) { +// } +// } +// }) diff --git a/admin/src/lib/adapter.ts b/admin/src/lib/adapter.ts index c91c7833..9cae5f6e 100644 --- a/admin/src/lib/adapter.ts +++ b/admin/src/lib/adapter.ts @@ -17,6 +17,7 @@ export const $window = window as any as { export interface JQueryUI { tabs: (selector?: any) => JQuery & JQueryUI; button: (selector?: any) => JQuery & JQueryUI; + multiselect: (selector?: any) => JQuery & JQueryUI; } export const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI; export const instance = $window.instance || 0; diff --git a/package-lock.json b/package-lock.json index 191a0314..1cee2bba 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2077,6 +2077,12 @@ "integrity": "sha1-oJb+X04PKraaBYXPEEVYd/V1Br0=", "dev": true }, + "jquery-ui-multiselect-widget": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/jquery-ui-multiselect-widget/-/jquery-ui-multiselect-widget-1.17.0.tgz", + "integrity": "sha1-WpxS5+Y431Dc7Q4Pds7xWhALJeI=", + "dev": true + }, "js-tokens": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", diff --git a/package.json b/package.json index 6444e180..3e35f183 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "html-webpack-plugin": "^2.30.1", "jquery": "1.11.1", "jquery-ui": "1.10.4", + "jquery-ui-multiselect-widget": "1.17.0", "jsdom": "^11.3.0", "mocha": "^4.0.0", "node-ssh": "^5.0.0", diff --git a/test/setupJSDom.js b/test/setupJSDom.js index aac166db..6ca4fa50 100644 --- a/test/setupJSDom.js +++ b/test/setupJSDom.js @@ -25,3 +25,4 @@ const $ = require('jquery'); const jQuery = $; global.$ = global.jQuery = window.$ = window.jQuery = $; require('jquery-ui'); +require("jquery-ui-multiselect-widget"); \ No newline at end of file From 77afb7a080a64ddbdd1347e6725f6b0f741e1cc9 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 26 Oct 2017 20:22:39 +0200 Subject: [PATCH 32/51] working version of the new admin gui --- admin/build/main.bundle.js | 156 +++++++++++++++++++++--- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/components/editable-label.tsx | 43 +++++-- admin/src/components/multi-dropdown.tsx | 30 +++-- admin/src/index.tsx | 29 +++-- admin/src/pages/groups.tsx | 36 +++++- admin/style.css | 4 + admin/words.js | 16 +++ build/adapter/communication.d.ts | 5 + build/adapter/message.js | 23 ++++ src/adapter/communication.ts | 6 + src/adapter/message.ts | 28 ++++- 13 files changed, 324 insertions(+), 56 deletions(-) diff --git a/admin/build/main.bundle.js b/admin/build/main.bundle.js index 0dbfcbe6..fd94a324 100644 --- a/admin/build/main.bundle.js +++ b/admin/build/main.bundle.js @@ -12,20 +12,34 @@ class EditableLabel extends React.Component { super(props); this.beginEdit = () => { this.setState({ editMode: true }); + this.selectPending = true; }; - this.endEdit = () => { + this.onEdit = () => { this.setState({ - editMode: false, text: this.txtEdit.value, }); - this.props.textChanged(this.state.text); }; - this.keyPressed = (e) => { - if (e.keyCode === 13) { - // Enter + this.endEdit = (save = true) => { + this.setState({ + editMode: false, + }); + this.selectPending = false; + if (save) { + this.props.textChanged(this.state.text); + } + else { + this.setState({ text: this.props.text }); + } + }; + this.keyDown = (e) => { + if (e.keyCode === 13 /* Enter */) { this.endEdit(); } + else if (e.keyCode === 27 /* Escape */) { + this.endEdit(false); + } }; + this.selectPending = false; this.state = { editMode: false, text: props.text, @@ -33,7 +47,13 @@ class EditableLabel extends React.Component { } render() { if (this.state.editMode) { - return (React.createElement("input", { type: "text", ref: (me) => this.txtEdit = me, onBlur: this.endEdit, onKeyPress: this.keyPressed, value: this.state.text })); + return (React.createElement("input", { type: "text", ref: (me) => { + this.txtEdit = me; + if (this.txtEdit != null && this.selectPending) { + this.txtEdit.select(); + this.selectPending = false; + } + }, onBlur: () => this.endEdit(), onKeyDown: this.keyDown, onChange: this.onEdit, value: this.state.text, maxLength: this.props.maxLength || 200, autoFocus: true })); } else { return (React.createElement("span", { onClick: this.beginEdit }, this.state.text)); @@ -57,6 +77,80 @@ function Fragment(props) { exports.default = Fragment; +/***/ }), + +/***/ "./admin/src/components/multi-dropdown.tsx": +/***/ (function(module, exports, __webpack_require__) { + +"use strict"; + +Object.defineProperty(exports, "__esModule", { value: true }); +const React = __webpack_require__("./node_modules/react/index.js"); +const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); +class MultiDropdown extends React.Component { + constructor(props) { + super(props); + this.optionClicked = (event, ui) => { + const index = this.state.checkedOptions.indexOf(ui.value); + const checked = [...this.state.checkedOptions]; + if (ui.checked) { + if (index === -1) + checked.push(ui.value); + } + else { + if (index !== -1) + checked.splice(index, 1); + } + this.setState({ checkedOptions: checked }); + }; + this.dropdownClosed = () => { + this.props.checkedChanged(this.state.checkedOptions); + }; + this.state = { + checkedOptions: props.checkedOptions, + }; + } + componentDidMount() { + adapter_1.$$(this.dropdown).multiselect({ + minWidth: 250, + header: false, + classes: "ui-selectmenu-button", + noneSelectedText: adapter_1._("select devices"), + selectedText: adapter_1._("# devices selected"), + click: this.optionClicked, + close: this.dropdownClosed, + }); + this.updateChecked(); + } + componentDidUpdate() { + this.updateChecked(); + } + updateChecked() { + const $dropdown = adapter_1.$$(this.dropdown); + $dropdown.find("option:selected").prop("selected", false); + this.state.checkedOptions.forEach(val => { + $dropdown.find(`option[value=${val}]`).prop("selected", true); + }); + $dropdown.multiselect("refresh"); + } + render() { + return (React.createElement("select", { multiple: true, ref: (me) => this.dropdown = me }, Object.keys(this.props.options).map(k => (React.createElement("option", { key: k, value: k }, this.props.options[k]))))); + } +} +exports.MultiDropdown = MultiDropdown; +// $('#assAssNodes').multiselect({ +// header: false, +// minWidth: 250, +// noneSelectedText: 'select nodes', +// selectedText: '# nodes selected', +// classes: 'ui-selectmenu-button', +// click: function(event, ui){ +// if (ui.checked) { +// } +// } +// }) + + /***/ }), /***/ "./admin/src/components/tabs.tsx": @@ -114,6 +208,7 @@ class Root extends React.Component { super(props); this.state = { groups: {}, + devices: {}, }; } componentDidMount() { @@ -122,17 +217,16 @@ class Root extends React.Component { adapter_1.socket.on("objectChange", (id, obj) => { if (id.substring(0, namespace.length) !== namespace) return; - if (id.match(/VG\-\d+$/)) + if (id.match(/VG\-\d+$/)) { this.updateGroups(); + } + else if (!obj || obj.common.type === "device") { + this.updateDevices(); + } }); // and update once on start this.updateGroups(); - } - get groups() { - return this.state.groups; - } - set groups(value) { - this.setState({ groups: value }); + this.updateDevices(); } updateGroups() { adapter_1.sendTo(null, "getGroups", { type: "virtual" }, (result) => { @@ -140,7 +234,17 @@ class Root extends React.Component { console.error(result.error); } else { - this.groups = result.result; + this.setState({ groups: result.result }); + } + }); + } + updateDevices() { + adapter_1.sendTo(null, "getDevices", { type: "lightbulb" }, (result) => { + if (result && result.error) { + console.error(result.error); + } + else { + this.setState({ devices: result.result }); } }); } @@ -149,7 +253,7 @@ class Root extends React.Component { React.createElement(Header, null), React.createElement(tabs_1.Tabs, { labels: ["Settings", "Groups"] }, React.createElement(settings_1.Settings, { settings: this.props.settings, onChange: this.props.onSettingsChanged }), - React.createElement(groups_1.Groups, { groups: this.state.groups })))); + React.createElement(groups_1.Groups, { groups: this.state.groups, devices: this.state.devices })))); } } exports.Root = Root; @@ -200,6 +304,7 @@ const React = __webpack_require__("./node_modules/react/index.js"); const adapter_1 = __webpack_require__("./admin/src/lib/adapter.ts"); const editable_label_1 = __webpack_require__("./admin/src/components/editable-label.tsx"); const fragment_1 = __webpack_require__("./admin/src/components/fragment.tsx"); +const multi_dropdown_1 = __webpack_require__("./admin/src/components/multi-dropdown.tsx"); const ADD_GROUP_BUTTON_ID = "btnAddGroup"; class Groups extends React.Component { constructor(props) { @@ -246,6 +351,21 @@ class Groups extends React.Component { }); } } + changeGroupDevices(id, deviceIDs) { + // update it on the server + adapter_1.sendTo(null, "editVirtualGroup", { id, deviceIDs }, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + devicesToDropdownSource(devices) { + const ret = {}; + for (const key of Object.keys(devices)) { + ret[key] = devices[key].name; + } + return ret; + } render() { return (React.createElement(fragment_1.default, null, React.createElement("p", { className: "actions-panel" }, @@ -262,8 +382,8 @@ class Groups extends React.Component { .map(group => (React.createElement("tr", { key: group.id }, React.createElement("td", null, group.id), React.createElement("td", null, - React.createElement(editable_label_1.EditableLabel, { text: group.name, textChanged: (newText) => this.renameGroup(group.id, newText) })), - React.createElement("td", null, group.deviceIDs ? group.deviceIDs.join(", ") : ""), + React.createElement(editable_label_1.EditableLabel, { text: group.name, maxLength: 100, textChanged: (newText) => this.renameGroup(group.id, newText) })), + React.createElement("td", null, (this.props.devices && Object.keys(this.props.devices).length > 0) ? (React.createElement(multi_dropdown_1.MultiDropdown, { options: this.devicesToDropdownSource(this.props.devices), checkedOptions: (group.deviceIDs || []).map(id => `${id}`), checkedChanged: (checked) => this.changeGroupDevices(group.id, checked) })) : adapter_1._("no devices")), React.createElement("td", null, React.createElement("button", { title: adapter_1._("delete group"), className: "delete-group", onClick: () => this.deleteGroup(group.id) })))))) : (React.createElement("tr", null, React.createElement("td", { className: "empty", colSpan: 4 }, adapter_1._("No virtual groups defined"))))))))); diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index d8a16b0a..e5796feb 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: any;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t}\r\n\tprivate readonly endEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t\tthis.props.textChanged(this.state.text);\r\n\t}\r\n\r\n\tprivate readonly keyPressed = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13) {\r\n\t\t\t// Enter\r\n\t\t\tthis.endEdit();\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t this.txtEdit = me}\r\n\t\t\t\t\tonBlur={this.endEdit}\r\n\t\t\t\t\tonKeyPress={this.keyPressed}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) this.updateGroups();\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t}\r\n\r\n\tpublic get groups(): GroupDictionary {\r\n\t\treturn this.state.groups;\r\n\t}\r\n\tpublic set groups(value: GroupDictionary) {\r\n\t\tthis.setState({groups: value});\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.groups = result.result as GroupDictionary;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n\tmultiselect: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t{/* TODO: Turn this into a multiselect dropdown */}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{group.deviceIDs ? group.deviceIDs.join(\", \") : \"\"}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAcA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAxBA;AACA;AACA;AACA;AACA;AAsBA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAhDA;;;;;;;;;;;ACdA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AAjDA;AAmDA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAgBA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA;AAGA;AAEA;AACA;AAYA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AACA;AACA;AAMA;AAOA;AAEA;AAlGA;;;;;;;;;;;ACpBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/multi-dropdown.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\tmaxLength?: number;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: HTMLInputElement;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t\tthis.selectPending = true;\r\n\t}\r\n\tprivate readonly onEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t}\r\n\tprivate readonly endEdit = (save: boolean = true) => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t});\r\n\t\tthis.selectPending = false;\r\n\t\tif (save) {\r\n\t\t\tthis.props.textChanged(this.state.text);\r\n\t\t} else {\r\n\t\t\tthis.setState({text: this.props.text});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly keyDown = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13 /* Enter */) {\r\n\t\t\tthis.endEdit();\r\n\t\t} else if (e.keyCode === 27 /* Escape */) {\r\n\t\t\tthis.endEdit(false);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate selectPending: boolean = false;\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t {\r\n\t\t\t\t\t\tthis.txtEdit = me;\r\n\t\t\t\t\t\tif (this.txtEdit != null && this.selectPending) {\r\n\t\t\t\t\t\t\tthis.txtEdit.select();\r\n\t\t\t\t\t\t\tthis.selectPending = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonBlur={() => this.endEdit()}\r\n\t\t\t\t\tonKeyDown={this.keyDown}\r\n\t\t\t\t\tonChange={this.onEdit}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t\tmaxLength={this.props.maxLength || 200}\r\n\t\t\t\t\tautoFocus\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface MultiDropdownProps {\r\n\toptions: {[key: string]: string};\r\n\tcheckedOptions: string[];\r\n\tcheckedChanged: (selected: string[]) => void;\r\n}\r\n\r\ninterface MultiDropdownState {\r\n\tcheckedOptions: string[];\r\n}\r\n\r\nexport class MultiDropdown extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tcheckedOptions: props.checkedOptions,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate dropdown: any;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(this.dropdown).multiselect({\r\n\t\t\tminWidth: 250,\r\n\t\t\theader: false,\r\n\t\t\tclasses: \"ui-selectmenu-button\",\r\n\t\t\tnoneSelectedText: _(\"select devices\"),\r\n\t\t\tselectedText: _(\"# devices selected\"),\r\n\t\t\tclick: this.optionClicked,\r\n\t\t\tclose: this.dropdownClosed,\r\n\t\t});\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tprivate updateChecked() {\r\n\t\tconst $dropdown = $$(this.dropdown);\r\n\t\t$dropdown.find(\"option:selected\").prop(\"selected\", false);\r\n\t\tthis.state.checkedOptions.forEach(val => {\r\n\t\t\t$dropdown.find(`option[value=${val}]`).prop(\"selected\", true);\r\n\t\t});\r\n\t\t$dropdown.multiselect(\"refresh\");\r\n\t}\r\n\r\n\tprivate optionClicked = (event, ui) => {\r\n\t\tconst index = this.state.checkedOptions.indexOf(ui.value);\r\n\t\tconst checked = [...this.state.checkedOptions];\r\n\t\tif (ui.checked) {\r\n\t\t\tif (index === -1) checked.push(ui.value);\r\n\t\t} else {\r\n\t\t\tif (index !== -1) checked.splice(index, 1);\r\n\t\t}\r\n\t\tthis.setState({checkedOptions: checked});\r\n\t}\r\n\r\n\tprivate dropdownClosed = () => {\r\n\t\tthis.props.checkedChanged(this.state.checkedOptions);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t this.dropdown = me}\r\n\t\t\t>\r\n\t\t\t{Object.keys(this.props.options).map(k => (\r\n\t\t\t\t\r\n\t\t\t))}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n// $('#assAssNodes').multiselect({\r\n// \theader: false,\r\n// \tminWidth: 250,\r\n// \tnoneSelectedText: 'select nodes',\r\n// \tselectedText: '# nodes selected',\r\n// \tclasses: 'ui-selectmenu-button',\r\n// \tclick: function(event, ui){\r\n// \t\tif (ui.checked) {\r\n// \t\t}\r\n// \t}\r\n// })\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/multi-dropdown.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t\tdevices: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) {\r\n\t\t\t\tthis.updateGroups();\r\n\t\t\t} else if (!obj || obj.common.type === \"device\") {\r\n\t\t\t\tthis.updateDevices();\r\n\t\t\t}\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t\tthis.updateDevices();\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({groups: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic updateDevices() {\r\n\t\tsendTo(null, \"getDevices\", { type: \"lightbulb\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({devices: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n\tmultiselect: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\nimport { MultiDropdown } from \"../components/multi-dropdown\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Device, Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\nexport interface DeviceDictionary {\r\n\t[id: string]: Device;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n\tdevices: DeviceDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate changeGroupDevices(id: string, deviceIDs: string[]) {\r\n\t\t// update it on the server\r\n\t\tsendTo(null, \"editVirtualGroup\", {id, deviceIDs}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate devicesToDropdownSource(devices: DeviceDictionary) {\r\n\t\tconst ret = {};\r\n\t\tfor (const key of Object.keys(devices)) {\r\n\t\t\tret[key] = devices[key].name;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t(this.props.devices && Object.keys(this.props.devices).length > 0) ? (\r\n\t\t\t\t\t\t\t\t\t\t `${id}`)}\r\n\t\t\t\t\t\t\t\t\t\t\tcheckedChanged={(checked) => this.changeGroupDevices(group.id, checked)}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : _(\"no devices\")\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAeA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AArCA;AACA;AACA;AACA;AACA;AAmCA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAtEA;;;;;;;;;;;ACfA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAYA;AAEA;AACA;AAkCA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AA9CA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAiBA;AACA;AAYA;AACA;AAlEA;AAmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AA1DA;AA4DA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrGA;AAgBA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA;AAGA;AAEA;AACA;AACA;AAgBA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AASA;AACA;AAMA;AAOA;AAEA;AA3HA;;;;;;;;;;;ACzBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index 3c535721..cfcb45e6 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 799a19038e0e7c3b8d01"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 799a19038e0e7c3b8d01"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 202d120dd37891e1e8ad"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 202d120dd37891e1e8ad"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/components/editable-label.tsx b/admin/src/components/editable-label.tsx index ff149824..69a3137f 100644 --- a/admin/src/components/editable-label.tsx +++ b/admin/src/components/editable-label.tsx @@ -9,6 +9,7 @@ interface EditableLabelState { } interface EditableLabelProps { text: string; + maxLength?: number; textChanged: (newText: string) => void; } @@ -22,35 +23,57 @@ export class EditableLabel extends React.Component { this.setState({editMode: true}); + this.selectPending = true; } - private readonly endEdit = () => { + private readonly onEdit = () => { this.setState({ - editMode: false, text: this.txtEdit.value, }); - this.props.textChanged(this.state.text); + } + private readonly endEdit = (save: boolean = true) => { + this.setState({ + editMode: false, + }); + this.selectPending = false; + if (save) { + this.props.textChanged(this.state.text); + } else { + this.setState({text: this.props.text}); + } } - private readonly keyPressed = (e: React.KeyboardEvent) => { - if (e.keyCode === 13) { - // Enter + private readonly keyDown = (e: React.KeyboardEvent) => { + if (e.keyCode === 13 /* Enter */) { this.endEdit(); + } else if (e.keyCode === 27 /* Escape */) { + this.endEdit(false); } } + private selectPending: boolean = false; + public render() { if (this.state.editMode) { return ( this.txtEdit = me} - onBlur={this.endEdit} - onKeyPress={this.keyPressed} + ref={(me) => { + this.txtEdit = me; + if (this.txtEdit != null && this.selectPending) { + this.txtEdit.select(); + this.selectPending = false; + } + }} + onBlur={() => this.endEdit()} + onKeyDown={this.keyDown} + onChange={this.onEdit} value={this.state.text} + maxLength={this.props.maxLength || 200} + autoFocus /> ); } else { diff --git a/admin/src/components/multi-dropdown.tsx b/admin/src/components/multi-dropdown.tsx index f4addb4b..694dd530 100644 --- a/admin/src/components/multi-dropdown.tsx +++ b/admin/src/components/multi-dropdown.tsx @@ -27,20 +27,29 @@ export class MultiDropdown extends React.Component { + $dropdown.find(`option[value=${val}]`).prop("selected", true); + }); + $dropdown.multiselect("refresh"); } private optionClicked = (event, ui) => { @@ -65,10 +74,7 @@ export class MultiDropdown extends React.Component this.dropdown = me} > {Object.keys(this.props.options).map(k => ( - ))} diff --git a/admin/src/index.tsx b/admin/src/index.tsx index 95ae7f67..f021e128 100644 --- a/admin/src/index.tsx +++ b/admin/src/index.tsx @@ -26,6 +26,7 @@ export class Root extends React.Component { super(props); this.state = { groups: {}, + devices: {}, }; } @@ -34,17 +35,15 @@ export class Root extends React.Component { socket.emit("subscribeObjects", namespace + ".VG-*"); socket.on("objectChange", (id: string, obj) => { if (id.substring(0, namespace.length) !== namespace) return; - if (id.match(/VG\-\d+$/)) this.updateGroups(); + if (id.match(/VG\-\d+$/)) { + this.updateGroups(); + } else if (!obj || obj.common.type === "device") { + this.updateDevices(); + } }); // and update once on start this.updateGroups(); - } - - public get groups(): GroupDictionary { - return this.state.groups; - } - public set groups(value: GroupDictionary) { - this.setState({groups: value}); + this.updateDevices(); } public updateGroups() { @@ -52,7 +51,17 @@ export class Root extends React.Component { if (result && result.error) { console.error(result.error); } else { - this.groups = result.result as GroupDictionary; + this.setState({groups: result.result as GroupDictionary}); + } + }); + } + + public updateDevices() { + sendTo(null, "getDevices", { type: "lightbulb" }, (result) => { + if (result && result.error) { + console.error(result.error); + } else { + this.setState({devices: result.result as GroupDictionary}); } }); } @@ -63,7 +72,7 @@ export class Root extends React.Component {
    - + ); diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index 436f7a93..4c76dae6 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -5,15 +5,20 @@ import {$$, $window, _, instance, sendTo, socket} from "../lib/adapter"; import { EditableLabel } from "../components/editable-label"; import Fragment from "../components/fragment"; +import { MultiDropdown } from "../components/multi-dropdown"; // Load communication objects as defined in the message module -import { Group } from "../../../src/adapter/communication"; +import { Device, Group } from "../../../src/adapter/communication"; export interface GroupDictionary { [id: string]: Group; } +export interface DeviceDictionary { + [id: string]: Device; +} interface GroupsProps { groups: GroupDictionary; + devices: DeviceDictionary; } const ADD_GROUP_BUTTON_ID = "btnAddGroup"; @@ -70,6 +75,23 @@ export class Groups extends React.Component { } } + private changeGroupDevices(id: string, deviceIDs: string[]) { + // update it on the server + sendTo(null, "editVirtualGroup", {id, deviceIDs}, (result) => { + if (result && result.error) { + console.error(result.error); + } + }); + } + + private devicesToDropdownSource(devices: DeviceDictionary) { + const ret = {}; + for (const key of Object.keys(devices)) { + ret[key] = devices[key].name; + } + return ret; + } + public render() { return ( @@ -95,11 +117,19 @@ export class Groups extends React.Component { this.renameGroup(group.id, newText)} /> - {/* TODO: Turn this into a multiselect dropdown */} - {group.deviceIDs ? group.deviceIDs.join(", ") : ""} + { + (this.props.devices && Object.keys(this.props.devices).length > 0) ? ( + `${id}`)} + checkedChanged={(checked) => this.changeGroupDevices(group.id, checked)} + /> + ) : _("no devices") + } diff --git a/admin/style.css b/admin/style.css index 0337c5da..362a2413 100644 --- a/admin/style.css +++ b/admin/style.css @@ -102,4 +102,8 @@ div.loading { margin-bottom: -0.25em; width: 24px; height: 20px; +} + +label[for^="ui-multiselect"].ui-state-hover { + font-weight: normal; } \ No newline at end of file diff --git a/admin/words.js b/admin/words.js index 2189ea8b..081cf232 100644 --- a/admin/words.js +++ b/admin/words.js @@ -36,4 +36,20 @@ systemDictionary = { "de": "Geräte", "en": "Devices" }, + "add group": { + "de": "Neue Gruppe", + "en": "Add group" + }, + "delete group": { + "de": "Gruppe löschen", + "en": "delete group" + }, + "select devices": { + "de": "Geräte auswählen", + "en": "select devices" + }, + "# devices selected": { + "de": "# Geräte ausgewählt", + "en": "# devices selected" + }, }; \ No newline at end of file diff --git a/build/adapter/communication.d.ts b/build/adapter/communication.d.ts index 9167dbeb..1d58b084 100644 --- a/build/adapter/communication.d.ts +++ b/build/adapter/communication.d.ts @@ -4,3 +4,8 @@ export interface Group { deviceIDs: number[]; type: "real" | "virtual"; } +export interface Device { + id: string; + name: string; + type: "lightbulb"; +} diff --git a/build/adapter/message.js b/build/adapter/message.js index 0e94244b..d80f8744 100644 --- a/build/adapter/message.js +++ b/build/adapter/message.js @@ -168,6 +168,29 @@ function onMessage(obj) { respond(responses.RESULT(ret)); return; } + case "getDevices": { + // check the given params + const params = obj.message; + // group type must be "real", "virtual" or "both" + const deviceType = params.type || "lightbulb"; + if (["lightbulb"].indexOf(deviceType) === -1) { + respond(responses.ERROR(`device type must be "lightbulb"`)); + return; + } + const ret = {}; + if (deviceType === "lightbulb") { + const lightbulbs = object_polyfill_1.entries(gateway_1.gateway.devices).filter(([id, device]) => device.type === accessory_1.AccessoryTypes.lightbulb); + for (const [id, bulb] of lightbulbs) { + ret[id] = { + id, + name: bulb.name, + type: deviceType, + }; + } + } + respond(responses.RESULT(ret)); + return; + } case "getDevice": { // require the id to be given if (!requireParams("id")) diff --git a/src/adapter/communication.ts b/src/adapter/communication.ts index 2305ba46..d944d8cd 100644 --- a/src/adapter/communication.ts +++ b/src/adapter/communication.ts @@ -4,3 +4,9 @@ export interface Group { deviceIDs: number[]; type: "real" | "virtual"; } + +export interface Device { + id: string; + name: string; + type: "lightbulb"; +} diff --git a/src/adapter/message.ts b/src/adapter/message.ts index 4b79be9d..a3288c45 100644 --- a/src/adapter/message.ts +++ b/src/adapter/message.ts @@ -4,7 +4,7 @@ import { parsePayload } from "../lib/coap-payload"; import { ExtendedAdapter, Global as _ } from "../lib/global"; import { DictionaryLike, entries } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; -import { Group as SendToGroup} from "./communication"; +import { Device as SendToDevice, Group as SendToGroup } from "./communication"; import { gateway as gw } from "./gateway"; import { calcGroupId, calcGroupName, extendVirtualGroup } from "./groups"; @@ -175,6 +175,32 @@ export async function onMessage(obj) { return; } + case "getDevices": { // get all devices defined on the gateway + // check the given params + const params = obj.message as any; + // group type must be "real", "virtual" or "both" + const deviceType = params.type || "lightbulb"; + if (["lightbulb"].indexOf(deviceType) === -1) { + respond(responses.ERROR(`device type must be "lightbulb"`)); + return; + } + + const ret: DictionaryLike = {}; + if (deviceType === "lightbulb") { + const lightbulbs = entries(gw.devices).filter(([id, device]) => device.type === AccessoryTypes.lightbulb); + for (const [id, bulb] of lightbulbs) { + ret[id] = { + id, + name: bulb.name, + type: deviceType, + }; + } + } + + respond(responses.RESULT(ret)); + return; + } + case "getDevice": { // get preprocessed information about a device // require the id to be given if (!requireParams("id")) return; From 1b9e7fdb3c66f4e418cf5da20f32225d39574992 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Thu, 26 Oct 2017 20:40:29 +0200 Subject: [PATCH 33/51] change version to beta --- io-package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/io-package.json b/io-package.json index 2f8af643..f8fe46ae 100644 --- a/io-package.json +++ b/io-package.json @@ -1,7 +1,7 @@ { "common": { "name": "tradfri", - "version": "0.5.0", + "version": "0.5.0-beta1", "news": { "0.5.0": { "en": "Support of virtual groups", diff --git a/package.json b/package.json index 3e35f183..69117520 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0", + "version": "0.5.0-beta1", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", From e22029b97deb90c78294b7b30d06607998330331 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 10:10:56 +0200 Subject: [PATCH 34/51] fix color temperature for (virtual) groups --- build/main.js | 6 ++---- src/main.ts | 6 ++---- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/build/main.js b/build/main.js index 728f0036..60e05430 100644 --- a/build/main.js +++ b/build/main.js @@ -228,8 +228,7 @@ let adapter = utils_1.default.adapter({ // color change is only supported manually, so we operate // the virtual state of this group yield operateVirtualGroup(group, { - colorX: val, - colorY: 27000, + colorTemperature: val, transitionTime: yield getTransitionDuration(group), }); wasAcked = true; @@ -256,8 +255,7 @@ let adapter = utils_1.default.adapter({ } else if (id.endsWith(".color")) { operation = { - colorX: val, - colorY: 27000, + colorTemperature: val, transitionTime: yield getTransitionDuration(vGroup), }; } diff --git a/src/main.ts b/src/main.ts index eff49002..f1670e09 100644 --- a/src/main.ts +++ b/src/main.ts @@ -251,8 +251,7 @@ let adapter: ExtendedAdapter = utils.adapter({ // color change is only supported manually, so we operate // the virtual state of this group await operateVirtualGroup(group, { - colorX: val, - colorY: 27000, + colorTemperature: val, transitionTime: await getTransitionDuration(group), }); wasAcked = true; @@ -280,8 +279,7 @@ let adapter: ExtendedAdapter = utils.adapter({ }; } else if (id.endsWith(".color")) { operation = { - colorX: val, - colorY: 27000, + colorTemperature: val, transitionTime: await getTransitionDuration(vGroup), }; } else if (id.endsWith(".transitionDuration")) { From a1daca26c1dd2a95ed8229bbfce9fcc505d3ce8a Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 10:40:52 +0200 Subject: [PATCH 35/51] added bump_version script --- io-package.json | 15 +++++----- maintenance/bump_version.ts | 41 ++++++++++++++++++++++++++++ {src => maintenance}/deploy_local.ts | 4 +-- package-lock.json | 17 ++++++------ package.json | 8 ++++-- 5 files changed, 65 insertions(+), 20 deletions(-) create mode 100644 maintenance/bump_version.ts rename {src => maintenance}/deploy_local.ts (94%) diff --git a/io-package.json b/io-package.json index f8fe46ae..883616c7 100644 --- a/io-package.json +++ b/io-package.json @@ -1,7 +1,7 @@ { "common": { "name": "tradfri", - "version": "0.5.0-beta1", + "version": "0.5.0-beta2", "news": { "0.5.0": { "en": "Support of virtual groups", @@ -49,19 +49,20 @@ "icon": "tradfri.png", "enabled": false, "extIcon": "https://raw.githubusercontent.com/AlCalzone/ioBroker.tradfri/master/admin/tradfri.png", - "keywords": [ "ikea", "tradfri" ], + "keywords": [ + "ikea", + "tradfri" + ], "readme": "https://github.com/AlCalzone/ioBroker.tradfri/blob/master/README.md", "loglevel": "info", "type": "lighting", "messagebox": true }, "native": { - "host": "", + "host": "", "securityCode": "" }, - "objects": [ - - ], + "objects": [], "instanceObjects": [ { "_id": "info", @@ -85,4 +86,4 @@ "native": {} } ] -} +} \ No newline at end of file diff --git a/maintenance/bump_version.ts b/maintenance/bump_version.ts new file mode 100644 index 00000000..f3ee3531 --- /dev/null +++ b/maintenance/bump_version.ts @@ -0,0 +1,41 @@ +// tslint:disable:no-var-requires +import * as fs from "fs"; +import * as path from "path"; +const semver = require("semver"); + +const rootDir = path.resolve(__dirname, "../"); + +const packPath = path.join(rootDir, "package.json"); +const pack = require(packPath); +const ioPackPath = path.join(rootDir, "io-package.json"); +const ioPack = require(ioPackPath); + +function fail(reason: string) { + console.error(""); + console.error(reason); + console.error(""); + process.exit(1); +} + +const newVersion = semver.clean(process.argv[2]); +if (newVersion == null) { + fail(`no valid version string "${process.argv[2]}"`); +} + +if (!semver.gt(newVersion, pack.version)) { + fail(`new version ${newVersion} is NOT > than package.json version ${pack.version}`); +} +if (!semver.gt(newVersion, ioPack.common.version)) { + fail(`new version ${newVersion} is NOT > than io-package.json version ${ioPack.common.version}`); +} + +console.log(`updating package.json from ${pack.version} to ${newVersion}`); +pack.version = newVersion; +fs.writeFileSync(packPath, JSON.stringify(pack, null, 2)); + +console.log(`updating io-package.json from ${ioPack.common.version} to ${newVersion}`); +ioPack.common.version = newVersion; +fs.writeFileSync(ioPackPath, JSON.stringify(ioPack, null, 4)); + +console.log("done!"); +process.exit(0); diff --git a/src/deploy_local.ts b/maintenance/deploy_local.ts similarity index 94% rename from src/deploy_local.ts rename to maintenance/deploy_local.ts index 2e1c9509..0c498594 100644 --- a/src/deploy_local.ts +++ b/maintenance/deploy_local.ts @@ -7,7 +7,7 @@ /* CONFIGURATION: - - provide a deploy_password.json file in the project root with contents + - provide a deploy_password.json file in the local dir with contents { "host": "", "username": "", @@ -33,7 +33,7 @@ const ioPack = require(path.join(rootDir, "io-package.json")); const ADAPTER_NAME = ioPack.common.name; const ssh = new nodeSSH(); -const sshConfig = require(path.join(rootDir, "deploy_password.json")); +const sshConfig = require(path.join(__dirname, "deploy_password.json")); const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; diff --git a/package-lock.json b/package-lock.json index 1cee2bba..b43a7a02 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0", + "version": "0.5.0-beta2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -2822,7 +2822,7 @@ "rc": "1.2.2", "request": "2.81.0", "rimraf": "2.6.2", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "semver": "5.4.1", "tar": "2.2.1", "tar-pack": "3.4.0" } @@ -2883,7 +2883,7 @@ "requires": { "hosted-git-info": "2.5.0", "is-builtin-module": "1.0.0", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "semver": "5.4.1", "validate-npm-package-license": "3.0.1" } }, @@ -5421,8 +5421,9 @@ } }, "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=" + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" }, "set-blocking": { "version": "2.0.0", @@ -5558,7 +5559,7 @@ "dev": true, "requires": { "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "semver": "5.4.1", "streamsearch": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" } }, @@ -5783,7 +5784,7 @@ "chalk": "2.2.0", "enhanced-resolve": "3.4.1", "loader-utils": "1.1.0", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" + "semver": "5.4.1" }, "dependencies": { "ansi-styles": { @@ -5909,7 +5910,7 @@ "glob": "7.1.1", "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "semver": "5.4.1", "tslib": "1.7.1", "tsutils": "2.11.2" } diff --git a/package.json b/package.json index 69117520..6b316bfb 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0-beta1", + "version": "0.5.0-beta2", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", @@ -44,6 +44,7 @@ "react": "^16.0.0", "react-dom": "^16.0.0", "react-test-renderer": "^16.0.0", + "semver": "^5.4.1", "sinon": "^4.0.1", "source-map-support": "^0.5.0", "ts-loader": "^2.3.7", @@ -80,7 +81,8 @@ "coverage": "node node_modules/nyc/bin/nyc npm run test", "lint:ts": "tslint", "lint": "npm run lint:ts \"src/**/*.ts\"", - "deploy_local": "node --require ts-node/register src/deploy_local.ts" + "deploy_local": "node --require ts-node/register maintenance/deploy_local.ts", + "bump": "node --require ts-node/register maintenance/bump_version.ts" }, "nyc": { "include": [ @@ -105,4 +107,4 @@ "sourceMap": true, "instrument": true } -} +} \ No newline at end of file From daa213e283414573210280efeb9aacf91d603248 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 12:42:05 +0200 Subject: [PATCH 36/51] renamed /adapter/ to /modules/ --- admin/build/main.bundle.js.map | 2 +- admin/build/runtime.bundle.js.map | 2 +- admin/src/pages/groups.tsx | 2 +- build/deploy_local.d.ts | 0 build/deploy_local.js | 91 ------------------- build/main.js | 6 +- build/{adapter => modules}/communication.d.ts | 0 build/{adapter => modules}/communication.js | 0 build/{adapter => modules}/gateway.d.ts | 0 build/{adapter => modules}/gateway.js | 0 build/{adapter => modules}/groups.d.ts | 0 build/{adapter => modules}/groups.js | 0 build/{adapter => modules}/message.d.ts | 0 build/{adapter => modules}/message.js | 0 src/main.ts | 6 +- src/{adapter => modules}/communication.ts | 0 src/{adapter => modules}/gateway.ts | 0 src/{adapter => modules}/groups.ts | 0 src/{adapter => modules}/message.ts | 0 19 files changed, 9 insertions(+), 100 deletions(-) delete mode 100644 build/deploy_local.d.ts delete mode 100644 build/deploy_local.js rename build/{adapter => modules}/communication.d.ts (100%) rename build/{adapter => modules}/communication.js (100%) rename build/{adapter => modules}/gateway.d.ts (100%) rename build/{adapter => modules}/gateway.js (100%) rename build/{adapter => modules}/groups.d.ts (100%) rename build/{adapter => modules}/groups.js (100%) rename build/{adapter => modules}/message.d.ts (100%) rename build/{adapter => modules}/message.js (100%) rename src/{adapter => modules}/communication.ts (100%) rename src/{adapter => modules}/gateway.ts (100%) rename src/{adapter => modules}/groups.ts (100%) rename src/{adapter => modules}/message.ts (100%) diff --git a/admin/build/main.bundle.js.map b/admin/build/main.bundle.js.map index e5796feb..a4870506 100644 --- a/admin/build/main.bundle.js.map +++ b/admin/build/main.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/multi-dropdown.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\tmaxLength?: number;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: HTMLInputElement;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t\tthis.selectPending = true;\r\n\t}\r\n\tprivate readonly onEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t}\r\n\tprivate readonly endEdit = (save: boolean = true) => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t});\r\n\t\tthis.selectPending = false;\r\n\t\tif (save) {\r\n\t\t\tthis.props.textChanged(this.state.text);\r\n\t\t} else {\r\n\t\t\tthis.setState({text: this.props.text});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly keyDown = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13 /* Enter */) {\r\n\t\t\tthis.endEdit();\r\n\t\t} else if (e.keyCode === 27 /* Escape */) {\r\n\t\t\tthis.endEdit(false);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate selectPending: boolean = false;\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t {\r\n\t\t\t\t\t\tthis.txtEdit = me;\r\n\t\t\t\t\t\tif (this.txtEdit != null && this.selectPending) {\r\n\t\t\t\t\t\t\tthis.txtEdit.select();\r\n\t\t\t\t\t\t\tthis.selectPending = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonBlur={() => this.endEdit()}\r\n\t\t\t\t\tonKeyDown={this.keyDown}\r\n\t\t\t\t\tonChange={this.onEdit}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t\tmaxLength={this.props.maxLength || 200}\r\n\t\t\t\t\tautoFocus\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface MultiDropdownProps {\r\n\toptions: {[key: string]: string};\r\n\tcheckedOptions: string[];\r\n\tcheckedChanged: (selected: string[]) => void;\r\n}\r\n\r\ninterface MultiDropdownState {\r\n\tcheckedOptions: string[];\r\n}\r\n\r\nexport class MultiDropdown extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tcheckedOptions: props.checkedOptions,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate dropdown: any;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(this.dropdown).multiselect({\r\n\t\t\tminWidth: 250,\r\n\t\t\theader: false,\r\n\t\t\tclasses: \"ui-selectmenu-button\",\r\n\t\t\tnoneSelectedText: _(\"select devices\"),\r\n\t\t\tselectedText: _(\"# devices selected\"),\r\n\t\t\tclick: this.optionClicked,\r\n\t\t\tclose: this.dropdownClosed,\r\n\t\t});\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tprivate updateChecked() {\r\n\t\tconst $dropdown = $$(this.dropdown);\r\n\t\t$dropdown.find(\"option:selected\").prop(\"selected\", false);\r\n\t\tthis.state.checkedOptions.forEach(val => {\r\n\t\t\t$dropdown.find(`option[value=${val}]`).prop(\"selected\", true);\r\n\t\t});\r\n\t\t$dropdown.multiselect(\"refresh\");\r\n\t}\r\n\r\n\tprivate optionClicked = (event, ui) => {\r\n\t\tconst index = this.state.checkedOptions.indexOf(ui.value);\r\n\t\tconst checked = [...this.state.checkedOptions];\r\n\t\tif (ui.checked) {\r\n\t\t\tif (index === -1) checked.push(ui.value);\r\n\t\t} else {\r\n\t\t\tif (index !== -1) checked.splice(index, 1);\r\n\t\t}\r\n\t\tthis.setState({checkedOptions: checked});\r\n\t}\r\n\r\n\tprivate dropdownClosed = () => {\r\n\t\tthis.props.checkedChanged(this.state.checkedOptions);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t this.dropdown = me}\r\n\t\t\t>\r\n\t\t\t{Object.keys(this.props.options).map(k => (\r\n\t\t\t\t\r\n\t\t\t))}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n// $('#assAssNodes').multiselect({\r\n// \theader: false,\r\n// \tminWidth: 250,\r\n// \tnoneSelectedText: 'select nodes',\r\n// \tselectedText: '# nodes selected',\r\n// \tclasses: 'ui-selectmenu-button',\r\n// \tclick: function(event, ui){\r\n// \t\tif (ui.checked) {\r\n// \t\t}\r\n// \t}\r\n// })\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/multi-dropdown.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t\tdevices: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) {\r\n\t\t\t\tthis.updateGroups();\r\n\t\t\t} else if (!obj || obj.common.type === \"device\") {\r\n\t\t\t\tthis.updateDevices();\r\n\t\t\t}\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t\tthis.updateDevices();\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({groups: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic updateDevices() {\r\n\t\tsendTo(null, \"getDevices\", { type: \"lightbulb\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({devices: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n\tmultiselect: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\nimport { MultiDropdown } from \"../components/multi-dropdown\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Device, Group } from \"../../../src/adapter/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\nexport interface DeviceDictionary {\r\n\t[id: string]: Device;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n\tdevices: DeviceDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate changeGroupDevices(id: string, deviceIDs: string[]) {\r\n\t\t// update it on the server\r\n\t\tsendTo(null, \"editVirtualGroup\", {id, deviceIDs}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate devicesToDropdownSource(devices: DeviceDictionary) {\r\n\t\tconst ret = {};\r\n\t\tfor (const key of Object.keys(devices)) {\r\n\t\t\tret[key] = devices[key].name;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t(this.props.devices && Object.keys(this.props.devices).length > 0) ? (\r\n\t\t\t\t\t\t\t\t\t\t `${id}`)}\r\n\t\t\t\t\t\t\t\t\t\t\tcheckedChanged={(checked) => this.changeGroupDevices(group.id, checked)}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : _(\"no devices\")\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAeA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AArCA;AACA;AACA;AACA;AACA;AAmCA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAtEA;;;;;;;;;;;ACfA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAYA;AAEA;AACA;AAkCA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AA9CA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAiBA;AACA;AAYA;AACA;AAlEA;AAmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AA1DA;AA4DA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrGA;AAgBA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA;AAGA;AAEA;AACA;AACA;AAgBA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AASA;AACA;AAMA;AAOA;AAEA;AA3HA;;;;;;;;;;;ACzBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/main.bundle.js","sources":["webpack:///./admin/src/components/editable-label.tsx","webpack:///./admin/src/components/fragment.tsx","webpack:///./admin/src/components/multi-dropdown.tsx","webpack:///./admin/src/components/tabs.tsx","webpack:///./admin/src/index.tsx","webpack:///./admin/src/lib/adapter.ts","webpack:///./admin/src/pages/groups.tsx","webpack:///./admin/src/pages/settings.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface EditableLabelState {\r\n\teditMode: boolean;\r\n\ttext: string;\r\n}\r\ninterface EditableLabelProps {\r\n\ttext: string;\r\n\tmaxLength?: number;\r\n\ttextChanged: (newText: string) => void;\r\n}\r\n\r\nexport class EditableLabel extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\teditMode: false,\r\n\t\t\ttext: props.text,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate txtEdit: HTMLInputElement;\r\n\r\n\tprivate readonly beginEdit = () => {\r\n\t\tthis.setState({editMode: true});\r\n\t\tthis.selectPending = true;\r\n\t}\r\n\tprivate readonly onEdit = () => {\r\n\t\tthis.setState({\r\n\t\t\ttext: this.txtEdit.value,\r\n\t\t});\r\n\t}\r\n\tprivate readonly endEdit = (save: boolean = true) => {\r\n\t\tthis.setState({\r\n\t\t\teditMode: false,\r\n\t\t});\r\n\t\tthis.selectPending = false;\r\n\t\tif (save) {\r\n\t\t\tthis.props.textChanged(this.state.text);\r\n\t\t} else {\r\n\t\t\tthis.setState({text: this.props.text});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate readonly keyDown = (e: React.KeyboardEvent) => {\r\n\t\tif (e.keyCode === 13 /* Enter */) {\r\n\t\t\tthis.endEdit();\r\n\t\t} else if (e.keyCode === 27 /* Escape */) {\r\n\t\t\tthis.endEdit(false);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate selectPending: boolean = false;\r\n\r\n\tpublic render() {\r\n\t\tif (this.state.editMode) {\r\n\t\t\treturn (\r\n\t\t\t\t {\r\n\t\t\t\t\t\tthis.txtEdit = me;\r\n\t\t\t\t\t\tif (this.txtEdit != null && this.selectPending) {\r\n\t\t\t\t\t\t\tthis.txtEdit.select();\r\n\t\t\t\t\t\t\tthis.selectPending = false;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tonBlur={() => this.endEdit()}\r\n\t\t\t\t\tonKeyDown={this.keyDown}\r\n\t\t\t\t\tonChange={this.onEdit}\r\n\t\t\t\t\tvalue={this.state.text}\r\n\t\t\t\t\tmaxLength={this.props.maxLength || 200}\r\n\t\t\t\t\tautoFocus\r\n\t\t\t\t/>\r\n\t\t\t);\r\n\t\t} else {\r\n\t\t\treturn (\r\n\t\t\t\t{this.state.text}\r\n\t\t\t);\r\n\t\t}\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/editable-label.tsx","export default function Fragment(props) {\r\n\treturn props.children;\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/fragment.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\ninterface MultiDropdownProps {\r\n\toptions: {[key: string]: string};\r\n\tcheckedOptions: string[];\r\n\tcheckedChanged: (selected: string[]) => void;\r\n}\r\n\r\ninterface MultiDropdownState {\r\n\tcheckedOptions: string[];\r\n}\r\n\r\nexport class MultiDropdown extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tcheckedOptions: props.checkedOptions,\r\n\t\t};\r\n\t}\r\n\r\n\tprivate dropdown: any;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(this.dropdown).multiselect({\r\n\t\t\tminWidth: 250,\r\n\t\t\theader: false,\r\n\t\t\tclasses: \"ui-selectmenu-button\",\r\n\t\t\tnoneSelectedText: _(\"select devices\"),\r\n\t\t\tselectedText: _(\"# devices selected\"),\r\n\t\t\tclick: this.optionClicked,\r\n\t\t\tclose: this.dropdownClosed,\r\n\t\t});\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\tthis.updateChecked();\r\n\t}\r\n\r\n\tprivate updateChecked() {\r\n\t\tconst $dropdown = $$(this.dropdown);\r\n\t\t$dropdown.find(\"option:selected\").prop(\"selected\", false);\r\n\t\tthis.state.checkedOptions.forEach(val => {\r\n\t\t\t$dropdown.find(`option[value=${val}]`).prop(\"selected\", true);\r\n\t\t});\r\n\t\t$dropdown.multiselect(\"refresh\");\r\n\t}\r\n\r\n\tprivate optionClicked = (event, ui) => {\r\n\t\tconst index = this.state.checkedOptions.indexOf(ui.value);\r\n\t\tconst checked = [...this.state.checkedOptions];\r\n\t\tif (ui.checked) {\r\n\t\t\tif (index === -1) checked.push(ui.value);\r\n\t\t} else {\r\n\t\t\tif (index !== -1) checked.splice(index, 1);\r\n\t\t}\r\n\t\tthis.setState({checkedOptions: checked});\r\n\t}\r\n\r\n\tprivate dropdownClosed = () => {\r\n\t\tthis.props.checkedChanged(this.state.checkedOptions);\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t this.dropdown = me}\r\n\t\t\t>\r\n\t\t\t{Object.keys(this.props.options).map(k => (\r\n\t\t\t\t\r\n\t\t\t))}\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n}\r\n// $('#assAssNodes').multiselect({\r\n// \theader: false,\r\n// \tminWidth: 250,\r\n// \tnoneSelectedText: 'select nodes',\r\n// \tselectedText: '# nodes selected',\r\n// \tclasses: 'ui-selectmenu-button',\r\n// \tclick: function(event, ui){\r\n// \t\tif (ui.checked) {\r\n// \t\t}\r\n// \t}\r\n// })\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/multi-dropdown.tsx","// Renders some components in jQuery UI tabs\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nexport class Tabs extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\t// this.state = {\r\n\t\t// \ttabs: props.tabs,\r\n\t\t// };\r\n\t\tthis.containerId = this.props.id || \"tabs\";\r\n\t}\r\n\r\n\tprivate containerId: string;\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${this.containerId}`).tabs();\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t
    \r\n\t\t\t\t
      \r\n\t\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t\t(k, i) =>
    • {_(k)}
    • ,\r\n\t\t\t\t\t)}\r\n\t\t\t\t
    \r\n\t\t\t\t{this.props.labels.map(\r\n\t\t\t\t\t(k, i) =>
    {this.props.children[i]}
    ,\r\n\t\t\t\t)}\r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/components/tabs.tsx","// root objects\r\nimport * as $ from \"jquery\";\r\nimport * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"./lib/adapter\";\r\n\r\n// components\r\nimport Fragment from \"./components/fragment\";\r\nimport { Tabs } from \"./components/tabs\";\r\nimport { GroupDictionary, Groups } from \"./pages/groups\";\r\nimport { OnSettingsChangedCallback, Settings } from \"./pages/settings\";\r\n\r\nconst namespace = `tradfri.${instance}`;\r\n\r\n// layout components\r\nfunction Header() {\r\n\treturn (\r\n\t\t

    {_(\"Tradfri adapter settings\")}

    \r\n\t);\r\n}\r\n\r\nexport class Root extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t\tthis.state = {\r\n\t\t\tgroups: {},\r\n\t\t\tdevices: {},\r\n\t\t};\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t// subscribe to changes of virtual group objects\r\n\t\tsocket.emit(\"subscribeObjects\", namespace + \".VG-*\");\r\n\t\tsocket.on(\"objectChange\", (id: string, obj) => {\r\n\t\t\tif (id.substring(0, namespace.length) !== namespace) return;\r\n\t\t\tif (id.match(/VG\\-\\d+$/)) {\r\n\t\t\t\tthis.updateGroups();\r\n\t\t\t} else if (!obj || obj.common.type === \"device\") {\r\n\t\t\t\tthis.updateDevices();\r\n\t\t\t}\r\n\t\t});\r\n\t\t// and update once on start\r\n\t\tthis.updateGroups();\r\n\t\tthis.updateDevices();\r\n\t}\r\n\r\n\tpublic updateGroups() {\r\n\t\tsendTo(null, \"getGroups\", { type: \"virtual\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({groups: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic updateDevices() {\r\n\t\tsendTo(null, \"getDevices\", { type: \"lightbulb\" }, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t} else {\r\n\t\t\t\tthis.setState({devices: result.result as GroupDictionary});\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n}\r\n\r\nlet curSettings: any;\r\n\r\n// the function loadSettings has to exist ...\r\n$window.load = (settings, onChange) => {\r\n\r\n\tconst settingsChanged: OnSettingsChangedCallback = (newSettings, hasChanges: boolean) => {\r\n\t\tcurSettings = newSettings;\r\n\t\tonChange(hasChanges);\r\n\t};\r\n\r\n\tReactDOM.render(\r\n\t\t,\r\n\t\tdocument.getElementById(\"adapter-container\"),\r\n\t);\r\n\r\n\t// Signal to admin, that no changes yet\r\n\tonChange(false);\r\n};\r\n\r\n// ... and the function save has to exist.\r\n// you have to make sure the callback is called with the settings object as first param!\r\n$window.save = (callback) => {\r\n\t// save the settings\r\n\tcallback(curSettings);\r\n};\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/index.tsx","// fix missing property errors/warnings\r\ninterface SendToResult {\r\n\terror?: string | Error;\r\n\tresult?: any;\r\n}\r\nexport const $window = window as any as {\r\n\tload: (settings, onChange) => void;\r\n\tsave: (callback: (settings) => void) => void;\r\n\treadonly instance: number;\r\n\t/** Translates text */\r\n\t_: (text: string) => string;\r\n\tjQuery: JQueryStatic;\r\n\t$: JQueryStatic;\r\n\tsocket: any;\r\n\tsendTo: (instance: any | null, command: string, message: any, callback: (result: SendToResult) => void) => void;\r\n};\r\nexport interface JQueryUI {\r\n\ttabs: (selector?: any) => JQuery & JQueryUI;\r\n\tbutton: (selector?: any) => JQuery & JQueryUI;\r\n\tmultiselect: (selector?: any) => JQuery & JQueryUI;\r\n}\r\nexport const $$ = $window.jQuery as any as (...args: any[]) => JQuery & JQueryUI;\r\nexport const instance = $window.instance || 0;\r\nexport const _ = $window._ || ((text: string) => text);\r\nexport const socket = $window.socket;\r\nexport const sendTo = $window.sendTo;\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/lib/adapter.ts","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance, sendTo, socket} from \"../lib/adapter\";\r\n\r\nimport { EditableLabel } from \"../components/editable-label\";\r\nimport Fragment from \"../components/fragment\";\r\nimport { MultiDropdown } from \"../components/multi-dropdown\";\r\n\r\n// Load communication objects as defined in the message module\r\nimport { Device, Group } from \"../../../src/modules/communication\";\r\n\r\nexport interface GroupDictionary {\r\n\t[id: string]: Group;\r\n}\r\nexport interface DeviceDictionary {\r\n\t[id: string]: Device;\r\n}\r\ninterface GroupsProps {\r\n\tgroups: GroupDictionary;\r\n\tdevices: DeviceDictionary;\r\n}\r\n\r\nconst ADD_GROUP_BUTTON_ID = \"btnAddGroup\";\r\n\r\nexport class Groups extends React.Component {\r\n\r\n\tconstructor(props) {\r\n\t\tsuper(props);\r\n\t}\r\n\r\n\tpublic componentDidMount() {\r\n\t\t$$(`#${ADD_GROUP_BUTTON_ID}`).button({\r\n\t\t\ticons: { primary: \"ui-icon-plusthick\" },\r\n\t\t});\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tpublic componentDidUpdate() {\r\n\t\t$$(`#virtual-groups .delete-group`).button({\r\n\t\t\ticons: { primary: \"ui-icon-trash\" },\r\n\t\t\ttext: false,\r\n\t\t});\r\n\t}\r\n\r\n\tprivate addGroup() {\r\n\t\tsendTo(null, \"addVirtualGroup\", null, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate deleteGroup(id: string) {\r\n\t\tsendTo(null, \"deleteVirtualGroup\", {id}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate renameGroup(id: string, newName: string) {\r\n\t\tconst group = this.props.groups[id];\r\n\t\t// if we have a valid name\r\n\t\tif (typeof newName === \"string\" && newName.length > 0 && newName !== group.name) {\r\n\t\t\t// update it on the server\r\n\t\t\tsendTo(null, \"editVirtualGroup\", {id, name: newName}, (result) => {\r\n\t\t\t\tif (result && result.error) {\r\n\t\t\t\t\tconsole.error(result.error);\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate changeGroupDevices(id: string, deviceIDs: string[]) {\r\n\t\t// update it on the server\r\n\t\tsendTo(null, \"editVirtualGroup\", {id, deviceIDs}, (result) => {\r\n\t\t\tif (result && result.error) {\r\n\t\t\t\tconsole.error(result.error);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tprivate devicesToDropdownSource(devices: DeviceDictionary) {\r\n\t\tconst ret = {};\r\n\t\tfor (const key of Object.keys(devices)) {\r\n\t\t\tret[key] = devices[key].name;\r\n\t\t}\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\t\r\n\t\t\t\t

    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(this.props.groups && Object.keys(this.props.groups).length > 0 ? (\r\n\t\t\t\t\t\t\tObject.keys(this.props.groups)\r\n\t\t\t\t\t\t\t.map(k => this.props.groups[k])\r\n\t\t\t\t\t\t\t.map(group => (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t))\r\n\t\t\t\t\t\t) : (\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t))}\r\n\t\t\t\t\t\r\n\t\t\t\t
    {_(\"ID\")}{_(\"Name\")}{_(\"Devices\")}
    {group.id}\r\n\t\t\t\t\t\t\t\t\t this.renameGroup(group.id, newText)}\r\n\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t(this.props.devices && Object.keys(this.props.devices).length > 0) ? (\r\n\t\t\t\t\t\t\t\t\t\t `${id}`)}\r\n\t\t\t\t\t\t\t\t\t\t\tcheckedChanged={(checked) => this.changeGroupDevices(group.id, checked)}\r\n\t\t\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t\t\t) : _(\"no devices\")\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t
    {_(\"No virtual groups defined\")}
    \r\n\t\t\t
    \r\n\t\t);\r\n\t}\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/groups.tsx","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom\";\r\n\r\nimport {$$, $window, _, instance} from \"../lib/adapter\";\r\n\r\nimport Fragment from \"../components/fragment\";\r\n\r\nexport type OnSettingsChangedCallback = (newSettings: DictionaryLike, hasChanges: boolean) => void;\r\n\r\ninterface SettingsProps {\r\n\tonChange: OnSettingsChangedCallback;\r\n\tsettings: DictionaryLike;\r\n}\r\n\r\ninterface DictionaryLike {\r\n\t[key: string]: T;\r\n}\r\n\r\n/** Helper component for a settings label */\r\nfunction Label(props) {\r\n\treturn ;\r\n}\r\n/** Helper component for a tooltip */\r\nfunction Tooltip(props) {\r\n\treturn ;\r\n}\r\n\r\nexport class Settings extends React.Component> {\r\n\r\n\tconstructor(props: SettingsProps) {\r\n\t\tsuper(props);\r\n\t\t// settings are our state\r\n\t\tthis.state = {\r\n\t\t\t...props.settings,\r\n\t\t};\r\n\t\t// remember the original settings\r\n\t\tthis.originalSettings = {...props.settings};\r\n\r\n\t\t// setup change handlers\r\n\t\tthis.handleChange = this.handleChange.bind(this);\r\n\t}\r\n\r\n\tprivate onChange: OnSettingsChangedCallback;\r\n\tprivate originalSettings: DictionaryLike;\r\n\r\n\t// gets called when the form elements are changed by the user\r\n\tprivate handleChange(event: React.FormEvent) {\r\n\t\tconst target = event.target as (HTMLInputElement | HTMLSelectElement); // TODO: more types\r\n\r\n\t\t// store the setting\r\n\t\tthis.putSetting(target.id, target.value, () => {\r\n\t\t\t// and notify the admin UI about changes\r\n\t\t\tthis.props.onChange(this.state, this.hasChanges());\r\n\t\t});\r\n\t}\r\n\r\n\t/**\r\n\t * Reads a setting from the state object and transforms the value into the correct format\r\n\t * @param key The setting key to lookup\r\n\t */\r\n\tprivate getSetting(key: string): string | number | string[] {\r\n\t\treturn this.state[key] as any;\r\n\t}\r\n\t/**\r\n\t * Saves a setting in the state object and transforms the value into the correct format\r\n\t * @param key The setting key to store at\r\n\t */\r\n\tprivate putSetting(key: string, value: string | number | string[], callback?: () => void): void {\r\n\t\tthis.setState({[key]: value as any}, callback);\r\n\t}\r\n\r\n\t/**\r\n\t * Checks if any setting was changed\r\n\t */\r\n\tprivate hasChanges(): boolean {\r\n\t\tfor (const key of Object.keys(this.originalSettings)) {\r\n\t\t\tif (this.originalSettings[key] !== this.state[key]) return true;\r\n\t\t}\r\n\t\treturn false;\r\n\t}\r\n\r\n\tpublic onSave(): any {\r\n\t\treturn this.state;\r\n\t}\r\n\r\n\tpublic render() {\r\n\t\treturn (\r\n\t\t\t

    \r\n\t\t\t\t

    \r\n\t\t);\r\n\t}\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./admin/src/pages/settings.tsx"],"mappings":";;;;;;;;AAAA;AAeA;AAEA;AACA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AArCA;AACA;AACA;AACA;AACA;AAmCA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AASA;AAAA;AACA;AAGA;AACA;AAEA;AAtEA;;;;;;;;;;;ACfA;AACA;AACA;AAFA;;;;;;;;;;;ACEA;AAGA;AAYA;AAEA;AACA;AAkCA;AACA;AACA;AACA;AACA;AAAA;AACA;AAAA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AA9CA;AACA;AACA;AACA;AAIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAiBA;AACA;AAYA;AACA;AAlEA;AAmEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;AC5FA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAIA;AACA;AACA;AAEA;AACA;AAEA;AAEA;AAGA;AAKA;AACA;AA9BA;;;;;;;;;;;ACLA;AACA;AAEA;AAEA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AAGA;AAEA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAIA;AAEA;AA1DA;AA4DA;AAEA;AACA;AAEA;AACA;AACA;AACA;AAEA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACrGA;AAgBA;AACA;AACA;AACA;AACA;;;;;;;;;;;ACzBA;AAGA;AAEA;AACA;AACA;AAgBA;AAEA;AAEA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AAEA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AAGA;AAGA;AACA;AAEA;AACA;AACA;AAMA;AASA;AACA;AAMA;AAOA;AAEA;AA3HA;;;;;;;;;;;ACzBA;AAGA;AAeA;AACA;AACA;AAAA;AAAA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AACA;AACA;AACA;AAGA;AACA;AAEA;AACA;AACA;AAKA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;;;AAGA;AACA;AACA;AACA;AACA;;;AAGA;AACA;AACA;AACA;AAEA;;AAEA;AACA;AACA;AACA;AAAA;AACA;AACA;AACA;AAEA;AACA;AACA;AAEA;AACA;AAEA;AACA;AACA;AAAA;AAEA;AACA;AACA;AAGA;AACA;AAvEA;;;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/build/runtime.bundle.js.map b/admin/build/runtime.bundle.js.map index cfcb45e6..ba3f2338 100644 --- a/admin/build/runtime.bundle.js.map +++ b/admin/build/runtime.bundle.js.map @@ -1 +1 @@ -{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap 202d120dd37891e1e8ad"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 202d120dd37891e1e8ad"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file +{"version":3,"file":"./admin/build/runtime.bundle.js","sources":["webpack:///webpack/bootstrap c4daf2dbdedb7e6520e9"],"sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t\"runtime\": 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n \t// This file contains only the entry chunk.\n \t// The chunk loading function for additional chunks\n \t__webpack_require__.e = function requireEnsure(chunkId) {\n \t\tvar installedChunkData = installedChunks[chunkId];\n \t\tif(installedChunkData === 0) {\n \t\t\treturn new Promise(function(resolve) { resolve(); });\n \t\t}\n\n \t\t// a Promise means \"currently loading\".\n \t\tif(installedChunkData) {\n \t\t\treturn installedChunkData[2];\n \t\t}\n\n \t\t// setup Promise in chunk cache\n \t\tvar promise = new Promise(function(resolve, reject) {\n \t\t\tinstalledChunkData = installedChunks[chunkId] = [resolve, reject];\n \t\t});\n \t\tinstalledChunkData[2] = promise;\n\n \t\t// start chunk loading\n \t\tvar head = document.getElementsByTagName('head')[0];\n \t\tvar script = document.createElement('script');\n \t\tscript.type = 'text/javascript';\n \t\tscript.charset = 'utf-8';\n \t\tscript.async = true;\n \t\tscript.timeout = 120000;\n\n \t\tif (__webpack_require__.nc) {\n \t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n \t\t}\n \t\tscript.src = __webpack_require__.p + \"./admin/build/\" + chunkId + \".bundle.js\";\n \t\tvar timeout = setTimeout(onScriptComplete, 120000);\n \t\tscript.onerror = script.onload = onScriptComplete;\n \t\tfunction onScriptComplete() {\n \t\t\t// avoid mem leaks in IE.\n \t\t\tscript.onerror = script.onload = null;\n \t\t\tclearTimeout(timeout);\n \t\t\tvar chunk = installedChunks[chunkId];\n \t\t\tif(chunk !== 0) {\n \t\t\t\tif(chunk) {\n \t\t\t\t\tchunk[1](new Error('Loading chunk ' + chunkId + ' failed.'));\n \t\t\t\t}\n \t\t\t\tinstalledChunks[chunkId] = undefined;\n \t\t\t}\n \t\t};\n \t\thead.appendChild(script);\n\n \t\treturn promise;\n \t};\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap c4daf2dbdedb7e6520e9"],"mappings":";AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;A","sourceRoot":""} \ No newline at end of file diff --git a/admin/src/pages/groups.tsx b/admin/src/pages/groups.tsx index 4c76dae6..8ce161ff 100644 --- a/admin/src/pages/groups.tsx +++ b/admin/src/pages/groups.tsx @@ -8,7 +8,7 @@ import Fragment from "../components/fragment"; import { MultiDropdown } from "../components/multi-dropdown"; // Load communication objects as defined in the message module -import { Device, Group } from "../../../src/adapter/communication"; +import { Device, Group } from "../../../src/modules/communication"; export interface GroupDictionary { [id: string]: Group; diff --git a/build/deploy_local.d.ts b/build/deploy_local.d.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/build/deploy_local.js b/build/deploy_local.js deleted file mode 100644 index 1acde8ef..00000000 --- a/build/deploy_local.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; -// tslint:disable:no-var-requires -/* - Allows easier local debugging over SSH. - Running `npm run deploy_local` updates remote adapter files - and restarts the instance -*/ -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -Object.defineProperty(exports, "__esModule", { value: true }); -/* - CONFIGURATION: - - provide a deploy_password.json file in the project root with contents - { - "host": "", - "username": "", - "password": "" - } - - specify which dirs and files should be uploaded - - specify where the root dir is relative to this script -*/ -const uploadDirs = ["admin", "build"]; -const uploadFiles = ["package.json", "io-package.json", "main.js"]; -const rootDir = "../"; -// ========================= -// CAN'T TOUCH THIS -// ========================= -const nodeSSH = require("node-ssh"); -const path = require("path"); -const localRoot = path.resolve(__dirname, rootDir); -const ioPack = require(path.join(rootDir, "io-package.json")); -const ADAPTER_NAME = ioPack.common.name; -const ssh = new nodeSSH(); -const sshConfig = require(path.join(rootDir, "deploy_password.json")); -const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; -(function main() { - return __awaiter(this, void 0, void 0, function* () { - yield ssh.connect(sshConfig); - for (const dir of uploadDirs) { - console.log(`cleaning ${dir} dir...`); - yield ssh.execCommand(`rm -rf ${path.join(remoteRoot, dir)}`); - console.log(`uploading ${dir} dir...`); - try { - yield ssh.putDirectory(path.join(localRoot, dir), path.join(remoteRoot, dir), { - recursive: true, - concurrency: 10, - validate: (pathname) => { - const basename = path.basename(pathname); - if (basename.startsWith("deploy_")) - return false; - if (basename.endsWith("Thumbs.db")) - return false; - if (basename.endsWith(".map") && basename.indexOf(".bundle.") === -1) - return false; - if (basename.indexOf(".test.") > -1) - return false; - if (basename === "src") - return false; - return true; - }, - }); - } - catch (e) { - console.error(e); - } - } - for (const file of uploadFiles) { - console.log(`uploading ${file}...`); - yield ssh.putFile(path.join(localRoot, file), path.join(remoteRoot, file)); - } - // update in-mem adapter - let execResult; - console.log("updating in-mem adapter"); - execResult = yield ssh.execCommand(`iobroker upload ${ADAPTER_NAME}`); - console.log(execResult.stdout); - console.log(execResult.stderr); - if (process.argv.indexOf("--restart") > -1) { - execResult = yield ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); - console.log(execResult.stdout); - console.log(execResult.stderr); - } - console.log("done"); - process.exit(0); - }); -})(); diff --git a/build/main.js b/build/main.js index 60e05430..4d028a0d 100644 --- a/build/main.js +++ b/build/main.js @@ -29,9 +29,9 @@ const virtual_group_1 = require("./lib/virtual-group"); // Adapter-Utils laden const utils_1 = require("./lib/utils"); // Adapter-Module laden -const gateway_1 = require("./adapter/gateway"); -const groups_1 = require("./adapter/groups"); -const message_1 = require("./adapter/message"); +const gateway_1 = require("./modules/gateway"); +const groups_1 = require("./modules/groups"); +const message_1 = require("./modules/message"); const customStateSubscriptions = { subscriptions: new Map(), counter: 0, diff --git a/build/adapter/communication.d.ts b/build/modules/communication.d.ts similarity index 100% rename from build/adapter/communication.d.ts rename to build/modules/communication.d.ts diff --git a/build/adapter/communication.js b/build/modules/communication.js similarity index 100% rename from build/adapter/communication.js rename to build/modules/communication.js diff --git a/build/adapter/gateway.d.ts b/build/modules/gateway.d.ts similarity index 100% rename from build/adapter/gateway.d.ts rename to build/modules/gateway.d.ts diff --git a/build/adapter/gateway.js b/build/modules/gateway.js similarity index 100% rename from build/adapter/gateway.js rename to build/modules/gateway.js diff --git a/build/adapter/groups.d.ts b/build/modules/groups.d.ts similarity index 100% rename from build/adapter/groups.d.ts rename to build/modules/groups.d.ts diff --git a/build/adapter/groups.js b/build/modules/groups.js similarity index 100% rename from build/adapter/groups.js rename to build/modules/groups.js diff --git a/build/adapter/message.d.ts b/build/modules/message.d.ts similarity index 100% rename from build/adapter/message.d.ts rename to build/modules/message.d.ts diff --git a/build/adapter/message.js b/build/modules/message.js similarity index 100% rename from build/adapter/message.js rename to build/modules/message.js diff --git a/src/main.ts b/src/main.ts index f1670e09..4eab6733 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,9 +27,9 @@ import { VirtualGroup } from "./lib/virtual-group"; import utils from "./lib/utils"; // Adapter-Module laden -import { gateway as gw, GroupInfo } from "./adapter/gateway"; -import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./adapter/groups"; -import { onMessage } from "./adapter/message"; +import { gateway as gw, GroupInfo } from "./modules/gateway"; +import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./modules/groups"; +import { onMessage } from "./modules/message"; interface CustomStateSubscription { pattern: RegExp; diff --git a/src/adapter/communication.ts b/src/modules/communication.ts similarity index 100% rename from src/adapter/communication.ts rename to src/modules/communication.ts diff --git a/src/adapter/gateway.ts b/src/modules/gateway.ts similarity index 100% rename from src/adapter/gateway.ts rename to src/modules/gateway.ts diff --git a/src/adapter/groups.ts b/src/modules/groups.ts similarity index 100% rename from src/adapter/groups.ts rename to src/modules/groups.ts diff --git a/src/adapter/message.ts b/src/modules/message.ts similarity index 100% rename from src/adapter/message.ts rename to src/modules/message.ts From f944bbd15080c71285fae41dcdf91872c58896fc Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 12:44:57 +0200 Subject: [PATCH 37/51] combined /tradfri and /modules folders --- build/ipso/group.js | 2 +- build/ipso/light.js | 4 ++-- build/{tradfri => modules}/conversions.d.ts | 0 build/{tradfri => modules}/conversions.js | 0 build/{tradfri => modules}/predefined-colors.d.ts | 0 build/{tradfri => modules}/predefined-colors.js | 0 src/ipso/group.ts | 2 +- src/ipso/light.test.ts | 2 +- src/ipso/light.ts | 6 +++--- src/ipso/plug.ts | 2 +- src/ipso/sensor.ts | 2 +- src/{tradfri => modules}/conversions.test.ts | 0 src/{tradfri => modules}/conversions.ts | 0 src/{tradfri => modules}/predefined-colors.ts | 0 src/rgb_debug.test.ts | 4 ++-- 15 files changed, 12 insertions(+), 12 deletions(-) rename build/{tradfri => modules}/conversions.d.ts (100%) rename build/{tradfri => modules}/conversions.js (100%) rename build/{tradfri => modules}/predefined-colors.d.ts (100%) rename build/{tradfri => modules}/predefined-colors.js (100%) rename src/{tradfri => modules}/conversions.test.ts (100%) rename src/{tradfri => modules}/conversions.ts (100%) rename src/{tradfri => modules}/predefined-colors.ts (100%) diff --git a/build/ipso/group.js b/build/ipso/group.js index f3fdb2ab..d6789327 100644 --- a/build/ipso/group.js +++ b/build/ipso/group.js @@ -9,7 +9,7 @@ var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); -const conversions_1 = require("../tradfri/conversions"); +const conversions_1 = require("../modules/conversions"); const ipsoDevice_1 = require("./ipsoDevice"); const ipsoObject_1 = require("./ipsoObject"); class Group extends ipsoDevice_1.IPSODevice { diff --git a/build/ipso/light.js b/build/ipso/light.js index 897933f5..7ce8b1e5 100644 --- a/build/ipso/light.js +++ b/build/ipso/light.js @@ -9,8 +9,8 @@ var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); -const conversions_1 = require("../tradfri/conversions"); -const predefined_colors_1 = require("../tradfri/predefined-colors"); +const conversions_1 = require("../modules/conversions"); +const predefined_colors_1 = require("../modules/predefined-colors"); const ipsoDevice_1 = require("./ipsoDevice"); const ipsoObject_1 = require("./ipsoObject"); class Light extends ipsoDevice_1.IPSODevice { diff --git a/build/tradfri/conversions.d.ts b/build/modules/conversions.d.ts similarity index 100% rename from build/tradfri/conversions.d.ts rename to build/modules/conversions.d.ts diff --git a/build/tradfri/conversions.js b/build/modules/conversions.js similarity index 100% rename from build/tradfri/conversions.js rename to build/modules/conversions.js diff --git a/build/tradfri/predefined-colors.d.ts b/build/modules/predefined-colors.d.ts similarity index 100% rename from build/tradfri/predefined-colors.d.ts rename to build/modules/predefined-colors.d.ts diff --git a/build/tradfri/predefined-colors.js b/build/modules/predefined-colors.js similarity index 100% rename from build/tradfri/predefined-colors.js rename to build/modules/predefined-colors.js diff --git a/src/ipso/group.ts b/src/ipso/group.ts index 8a9177ce..4d04995c 100644 --- a/src/ipso/group.ts +++ b/src/ipso/group.ts @@ -1,4 +1,4 @@ -import { deserializers, serializers } from "../tradfri/conversions"; +import { deserializers, serializers } from "../modules/conversions"; import { IPSODevice } from "./ipsoDevice"; import { deserializeWith, ipsoKey, IPSOObject, PropertyTransform, required, serializeWith } from "./ipsoObject"; diff --git a/src/ipso/light.test.ts b/src/ipso/light.test.ts index b6705573..81e0bb36 100644 --- a/src/ipso/light.test.ts +++ b/src/ipso/light.test.ts @@ -3,7 +3,7 @@ require("reflect-metadata"); import { expect } from "chai"; -import { predefinedColors, whiteSpectrumRange } from "../tradfri/predefined-colors"; +import { predefinedColors, whiteSpectrumRange } from "../modules/predefined-colors"; import { Accessory } from "./accessory"; import { Spectrum } from "./light"; diff --git a/src/ipso/light.ts b/src/ipso/light.ts index 17fd80ba..312ceb7b 100644 --- a/src/ipso/light.ts +++ b/src/ipso/light.ts @@ -1,11 +1,11 @@ -import { conversions, deserializers, serializers } from "../tradfri/conversions"; -import { MAX_COLOR, predefinedColors } from "../tradfri/predefined-colors"; +import { conversions, deserializers, serializers } from "../modules/conversions"; +import { MAX_COLOR, predefinedColors } from "../modules/predefined-colors"; import { Accessory } from "./accessory"; import { DeviceInfo } from "./deviceInfo"; import { IPSODevice } from "./ipsoDevice"; import { deserializeWith, doNotSerialize, ipsoKey, IPSOObject, PropertyTransform, required, serializeWith } from "./ipsoObject"; -// see https://github.com/hreichert/smarthome/blob/master/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/tradfri/internal/TradfriColor.java +// see https://github.com/hreichert/smarthome/blob/master/extensions/binding/org.eclipse.smarthome.binding.tradfri/src/main/java/org/eclipse/smarthome/binding/modules/internal/TradfriColor.java // for some color conversion export type LightOperation = Partial", () => { From 5c37816008df95d31de45a4b89f51ba586c75486 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 12:52:58 +0200 Subject: [PATCH 38/51] refactored CoAP operations into their own module --- build/main.js | 152 +++---------------------------- build/modules/operations.d.ts | 40 ++++++++ build/modules/operations.js | 155 +++++++++++++++++++++++++++++++ src/main.ts | 152 +------------------------------ src/modules/operations.ts | 167 ++++++++++++++++++++++++++++++++++ 5 files changed, 378 insertions(+), 288 deletions(-) create mode 100644 build/modules/operations.d.ts create mode 100644 build/modules/operations.js create mode 100644 src/modules/operations.ts diff --git a/build/main.js b/build/main.js index 4d028a0d..0ad9153c 100644 --- a/build/main.js +++ b/build/main.js @@ -32,6 +32,7 @@ const utils_1 = require("./lib/utils"); const gateway_1 = require("./modules/gateway"); const groups_1 = require("./modules/groups"); const message_1 = require("./modules/message"); +const operations_1 = require("./modules/operations"); const customStateSubscriptions = { subscriptions: new Map(), counter: 0, @@ -117,7 +118,7 @@ let adapter = utils_1.default.adapter({ if (obj.common && obj.common.name !== acc.name) { // the name has changed, notify the gateway global_1.Global.log(`the device ${id} was renamed to "${obj.common.name}"`); - renameDevice(acc, obj.common.name); + operations_1.renameDevice(acc, obj.common.name); } } else if (obj.type === "channel" && instanceId in gateway_1.gateway.groups && gateway_1.gateway.groups[instanceId] != null) { @@ -126,7 +127,7 @@ let adapter = utils_1.default.adapter({ if (obj.common && obj.common.name !== grp.name) { // the name has changed, notify the gateway global_1.Global.log(`the group ${id} was renamed to "${obj.common.name}"`); - renameGroup(grp, obj.common.name); + operations_1.renameGroup(grp, obj.common.name); } } // remember the object @@ -207,19 +208,19 @@ let adapter = utils_1.default.adapter({ // if the change was acknowledged, update the state later let wasAcked; if (id.endsWith(".state")) { - wasAcked = !(yield operateGroup(group, { + wasAcked = !(yield operations_1.operateGroup(group, { onOff: val, })); } else if (id.endsWith(".brightness")) { - wasAcked = !(yield operateGroup(group, { + wasAcked = !(yield operations_1.operateGroup(group, { dimmer: val, transitionTime: yield getTransitionDuration(group), })); } else if (id.endsWith(".activeScene")) { // turn on and activate a scene - wasAcked = !(yield operateGroup(group, { + wasAcked = !(yield operations_1.operateGroup(group, { onOff: true, sceneId: val, })); @@ -227,7 +228,7 @@ let adapter = utils_1.default.adapter({ else if (id.endsWith(".color")) { // color change is only supported manually, so we operate // the virtual state of this group - yield operateVirtualGroup(group, { + yield operations_1.operateVirtualGroup(group, { colorTemperature: val, transitionTime: yield getTransitionDuration(group), }); @@ -264,7 +265,7 @@ let adapter = utils_1.default.adapter({ } // update all lightbulbs in this group if (operation != null) { - operateVirtualGroup(vGroup, operation); + operations_1.operateVirtualGroup(vGroup, operation); } // and ack the state change adapter.$setState(id, state, true); @@ -280,45 +281,45 @@ let adapter = utils_1.default.adapter({ // operate the lights depending on the set state // if no request was sent, we can ack the state immediately if (id.endsWith(".state")) { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { onOff: val, })); } else if (id.endsWith(".brightness")) { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { dimmer: val, transitionTime: yield getTransitionDuration(accessory), })); } else if (id.endsWith(".color")) { if (light.spectrum === "rgb") { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { color: val, transitionTime: yield getTransitionDuration(accessory), })); } else if (light.spectrum === "white") { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { colorTemperature: val, transitionTime: yield getTransitionDuration(accessory), })); } } else if (id.endsWith(".colorTemperature")) { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { colorTemperature: val, transitionTime: yield getTransitionDuration(accessory), })); } else if (id.endsWith(".hue")) { // TODO: transform HSL to RGB - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { hue: val, transitionTime: yield getTransitionDuration(accessory), })); } else if (id.endsWith(".saturation")) { - wasAcked = !(yield operateLight(accessory, { + wasAcked = !(yield operations_1.operateLight(accessory, { saturation: val, transitionTime: yield getTransitionDuration(accessory), })); @@ -359,85 +360,6 @@ let adapter = utils_1.default.adapter({ } }, }); -/** - * Sets some properties on a lightbulb - * @param accessory The parent accessory of the lightbulb - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -function operateLight(accessory, operation) { - return __awaiter(this, void 0, void 0, function* () { - if (accessory.type !== accessory_1.AccessoryTypes.lightbulb) { - throw new Error("The parameter accessory must be a lightbulb!"); - } - // the url to be requested - const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`; - // create a copy to modify - const newAccessory = accessory.clone(); - // get the Light instance to modify - const light = newAccessory.lightList[0]; - light.merge(operation); - const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); - return false; // signal that no request was made - } - let payload = JSON.stringify(serializedObj); - global_1.Global.log("stateChange > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - yield node_coap_client_1.CoapClient.request(url, "put", payload); - return true; - }); -} -/** - * Sets some properties on a group - * @param group The group to be updated - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -function operateGroup(group, operation) { - return __awaiter(this, void 0, void 0, function* () { - // the url to be requested - const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`; - // create a copy to modify - const newGroup = group.clone(); - newGroup.merge(operation); - const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); - return false; // signal that no request was made - } - let payload = JSON.stringify(serializedObj); - global_1.Global.log("stateChange > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - yield node_coap_client_1.CoapClient.request(url, "put", payload); - return true; - }); -} -/** - * Sets some properties on virtual group or virtual properties on a real group. - * Can be used to manually update non-existing endpoints on real groups. - * @param group The group to be updated - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -function operateVirtualGroup(group, operation) { - return __awaiter(this, void 0, void 0, function* () { - // find all lightbulbs belonging to this group - const lightbulbAccessories = group.deviceIDs - .map(did => gateway_1.gateway.devices[did]) - .filter(dev => dev != null && dev.type === accessory_1.AccessoryTypes.lightbulb); - for (const acc of lightbulbAccessories) { - yield operateLight(acc, operation); - } - // and update the group - if (group instanceof virtual_group_1.VirtualGroup) { - group.merge(operation); - } - }); -} // ================================== // manage devices /** Normalizes the path to a resource, so it can be used for storing the observer */ @@ -1033,50 +955,6 @@ function updatePossibleScenes(groupInfo) { } }); } -/** - * Renames a device - * @param accessory The device to be renamed - * @param newName The new name to be given to the device - */ -function renameDevice(accessory, newName) { - // create a copy to modify - const newAccessory = accessory.clone(); - newAccessory.name = newName; - // serialize with the old object as a reference - const serializedObj = newAccessory.serialize(accessory); - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - global_1.Global.log("renameDevice > empty object, not sending any payload", "debug"); - return; - } - // get the payload - let payload = JSON.stringify(serializedObj); - global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`, "put", payload); -} -/** - * Renames a group - * @param group The group to be renamed - * @param newName The new name to be given to the group - */ -function renameGroup(group, newName) { - // create a copy to modify - const newGroup = group.clone(); - newGroup.name = newName; - // serialize with the old object as a reference - const serializedObj = newGroup.serialize(group); - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - global_1.Global.log("renameGroup > empty object, not sending any payload", "debug"); - return; - } - // get the payload - let payload = JSON.stringify(serializedObj); - global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`, "put", payload); -} // ================================== // Custom subscriptions /** diff --git a/build/modules/operations.d.ts b/build/modules/operations.d.ts new file mode 100644 index 00000000..31ebade3 --- /dev/null +++ b/build/modules/operations.d.ts @@ -0,0 +1,40 @@ +import { Accessory } from "../ipso/accessory"; +import { Group, GroupOperation } from "../ipso/group"; +import { LightOperation } from "../ipso/light"; +import { VirtualGroup } from "../lib/virtual-group"; +/** + * Sets some properties on a lightbulb + * @param accessory The parent accessory of the lightbulb + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export declare function operateLight(accessory: Accessory, operation: LightOperation): Promise; +/** + * Sets some properties on a group + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export declare function operateGroup(group: Group, operation: GroupOperation): Promise; +/** + * Sets some properties on virtual group or virtual properties on a real group. + * Can be used to manually update non-existing endpoints on real groups. + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export declare function operateVirtualGroup(group: Group | VirtualGroup, operation: LightOperation): Promise; +/** + * Renames a device + * @param accessory The device to be renamed + * @param newName The new name to be given to the device + * @returns true if a request was sent, false otherwise + */ +export declare function renameDevice(accessory: Accessory, newName: string): Promise; +/** + * Renames a group + * @param group The group to be renamed + * @param newName The new name to be given to the group + * @returns true if a request was sent, false otherwise + */ +export declare function renameGroup(group: Group, newName: string): Promise; diff --git a/build/modules/operations.js b/build/modules/operations.js new file mode 100644 index 00000000..3221a655 --- /dev/null +++ b/build/modules/operations.js @@ -0,0 +1,155 @@ +"use strict"; +/** + * Provides operations for Tradfri devices using the CoAP layer + */ +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const node_coap_client_1 = require("node-coap-client"); +const accessory_1 = require("../ipso/accessory"); +const endpoints_1 = require("../ipso/endpoints"); +const global_1 = require("../lib/global"); +const virtual_group_1 = require("../lib/virtual-group"); +const gateway_1 = require("./gateway"); +/** + * Sets some properties on a lightbulb + * @param accessory The parent accessory of the lightbulb + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateLight(accessory, operation) { + return __awaiter(this, void 0, void 0, function* () { + if (accessory.type !== accessory_1.AccessoryTypes.lightbulb) { + throw new Error("The parameter accessory must be a lightbulb!"); + } + // the url to be requested + const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`; + // create a copy to modify + const newAccessory = accessory.clone(); + // get the Light instance to modify + const light = newAccessory.lightList[0]; + light.merge(operation); + const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + let payload = JSON.stringify(serializedObj); + global_1.Global.log("stateChange > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(url, "put", payload); + return true; + }); +} +exports.operateLight = operateLight; +/** + * Sets some properties on a group + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateGroup(group, operation) { + return __awaiter(this, void 0, void 0, function* () { + // the url to be requested + const url = `${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`; + // create a copy to modify + const newGroup = group.clone(); + newGroup.merge(operation); + const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + let payload = JSON.stringify(serializedObj); + global_1.Global.log("stateChange > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(url, "put", payload); + return true; + }); +} +exports.operateGroup = operateGroup; +/** + * Sets some properties on virtual group or virtual properties on a real group. + * Can be used to manually update non-existing endpoints on real groups. + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +function operateVirtualGroup(group, operation) { + return __awaiter(this, void 0, void 0, function* () { + // find all lightbulbs belonging to this group + const lightbulbAccessories = group.deviceIDs + .map(did => gateway_1.gateway.devices[did]) + .filter(dev => dev != null && dev.type === accessory_1.AccessoryTypes.lightbulb); + for (const acc of lightbulbAccessories) { + yield operateLight(acc, operation); + } + // and update the group + if (group instanceof virtual_group_1.VirtualGroup) { + group.merge(operation); + } + }); +} +exports.operateVirtualGroup = operateVirtualGroup; +/** + * Renames a device + * @param accessory The device to be renamed + * @param newName The new name to be given to the device + * @returns true if a request was sent, false otherwise + */ +function renameDevice(accessory, newName) { + return __awaiter(this, void 0, void 0, function* () { + // create a copy to modify + const newAccessory = accessory.clone(); + newAccessory.name = newName; + // serialize with the old object as a reference + const serializedObj = newAccessory.serialize(accessory); + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("renameDevice > empty object, not sending any payload", "debug"); + return false; + } + // get the payload + let payload = JSON.stringify(serializedObj); + global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.devices}/${accessory.instanceId}`, "put", payload); + return true; + }); +} +exports.renameDevice = renameDevice; +/** + * Renames a group + * @param group The group to be renamed + * @param newName The new name to be given to the group + * @returns true if a request was sent, false otherwise + */ +function renameGroup(group, newName) { + return __awaiter(this, void 0, void 0, function* () { + // create a copy to modify + const newGroup = group.clone(); + newGroup.name = newName; + // serialize with the old object as a reference + const serializedObj = newGroup.serialize(group); + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + global_1.Global.log("renameGroup > empty object, not sending any payload", "debug"); + return false; + } + // get the payload + let payload = JSON.stringify(serializedObj); + global_1.Global.log("renameDevice > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + yield node_coap_client_1.CoapClient.request(`${gateway_1.gateway.requestBase}${endpoints_1.endpoints.groups}/${group.instanceId}`, "put", payload); + return true; + }); +} +exports.renameGroup = renameGroup; diff --git a/src/main.ts b/src/main.ts index 4eab6733..d42b1c14 100644 --- a/src/main.ts +++ b/src/main.ts @@ -30,6 +30,7 @@ import utils from "./lib/utils"; import { gateway as gw, GroupInfo } from "./modules/gateway"; import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./modules/groups"; import { onMessage } from "./modules/message"; +import { operateGroup, operateLight, operateVirtualGroup, renameDevice, renameGroup } from "./modules/operations"; interface CustomStateSubscription { pattern: RegExp; @@ -381,99 +382,6 @@ let adapter: ExtendedAdapter = utils.adapter({ }, }) as ExtendedAdapter; -/** - * Sets some properties on a lightbulb - * @param accessory The parent accessory of the lightbulb - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -async function operateLight(accessory: Accessory, operation: LightOperation): Promise { - if (accessory.type !== AccessoryTypes.lightbulb) { - throw new Error("The parameter accessory must be a lightbulb!"); - } - - // the url to be requested - const url: string = `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`; - - // create a copy to modify - const newAccessory = accessory.clone(); - // get the Light instance to modify - const light = newAccessory.lightList[0]; - light.merge(operation); - - const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference - - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - _.log("stateChange > empty object, not sending any payload", "debug"); - return false; // signal that no request was made - } - - let payload: string | Buffer = JSON.stringify(serializedObj); - _.log("stateChange > sending payload: " + payload, "debug"); - - payload = Buffer.from(payload); - await coap.request(url, "put", payload); - - return true; -} - -/** - * Sets some properties on a group - * @param group The group to be updated - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -async function operateGroup(group: Group, operation: GroupOperation): Promise { - - // the url to be requested - const url: string = `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`; - - // create a copy to modify - const newGroup = group.clone(); - newGroup.merge(operation); - - const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference - - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - _.log("stateChange > empty object, not sending any payload", "debug"); - return false; // signal that no request was made - } - - let payload: string | Buffer = JSON.stringify(serializedObj); - _.log("stateChange > sending payload: " + payload, "debug"); - - payload = Buffer.from(payload); - await coap.request(url, "put", payload); - - return true; -} - -/** - * Sets some properties on virtual group or virtual properties on a real group. - * Can be used to manually update non-existing endpoints on real groups. - * @param group The group to be updated - * @param operation The properties to be set - * @returns true if a request was sent, false otherwise - */ -async function operateVirtualGroup(group: Group | VirtualGroup, operation: LightOperation): Promise { - - // find all lightbulbs belonging to this group - const lightbulbAccessories = group.deviceIDs - .map(did => gw.devices[did]) - .filter(dev => dev != null && dev.type === AccessoryTypes.lightbulb) - ; - - for (const acc of lightbulbAccessories) { - await operateLight(acc, operation); - } - // and update the group - if (group instanceof VirtualGroup) { - group.merge(operation); - } -} - // ================================== // manage devices @@ -1126,64 +1034,6 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { } } -/** - * Renames a device - * @param accessory The device to be renamed - * @param newName The new name to be given to the device - */ -function renameDevice(accessory: Accessory, newName: string): void { - // create a copy to modify - const newAccessory = accessory.clone(); - newAccessory.name = newName; - - // serialize with the old object as a reference - const serializedObj = newAccessory.serialize(accessory); - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - _.log("renameDevice > empty object, not sending any payload", "debug"); - return; - } - - // get the payload - let payload: string | Buffer = JSON.stringify(serializedObj); - _.log("renameDevice > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - - coap.request( - `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`, "put", payload, - ); - -} - -/** - * Renames a group - * @param group The group to be renamed - * @param newName The new name to be given to the group - */ -function renameGroup(group: Group, newName: string): void { - // create a copy to modify - const newGroup = group.clone(); - newGroup.name = newName; - - // serialize with the old object as a reference - const serializedObj = newGroup.serialize(group); - // If the serialized object contains no properties, we don't need to send anything - if (!serializedObj || Object.keys(serializedObj).length === 0) { - _.log("renameGroup > empty object, not sending any payload", "debug"); - return; - } - - // get the payload - let payload: string | Buffer = JSON.stringify(serializedObj); - _.log("renameDevice > sending payload: " + payload, "debug"); - payload = Buffer.from(payload); - - coap.request( - `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`, "put", payload, - ); - -} - // ================================== // Custom subscriptions diff --git a/src/modules/operations.ts b/src/modules/operations.ts new file mode 100644 index 00000000..e90a8344 --- /dev/null +++ b/src/modules/operations.ts @@ -0,0 +1,167 @@ +/** + * Provides operations for Tradfri devices using the CoAP layer + */ + +import { CoapClient as coap, CoapResponse } from "node-coap-client"; +import { Accessory, AccessoryTypes } from "../ipso/accessory"; +import { endpoints as coapEndpoints} from "../ipso/endpoints"; +import { Group, GroupOperation } from "../ipso/group"; +import { LightOperation } from "../ipso/light"; +import { Global as _ } from "../lib/global"; +import { VirtualGroup } from "../lib/virtual-group"; +import { gateway as gw } from "./gateway"; + +/** + * Sets some properties on a lightbulb + * @param accessory The parent accessory of the lightbulb + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export async function operateLight(accessory: Accessory, operation: LightOperation): Promise { + if (accessory.type !== AccessoryTypes.lightbulb) { + throw new Error("The parameter accessory must be a lightbulb!"); + } + + // the url to be requested + const url: string = `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`; + + // create a copy to modify + const newAccessory = accessory.clone(); + // get the Light instance to modify + const light = newAccessory.lightList[0]; + light.merge(operation); + + const serializedObj = newAccessory.serialize(accessory); // serialize with the old object as a reference + + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("stateChange > sending payload: " + payload, "debug"); + + payload = Buffer.from(payload); + await coap.request(url, "put", payload); + + return true; +} + +/** + * Sets some properties on a group + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export async function operateGroup(group: Group, operation: GroupOperation): Promise { + + // the url to be requested + const url: string = `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`; + + // create a copy to modify + const newGroup = group.clone(); + newGroup.merge(operation); + + const serializedObj = newGroup.serialize(group); // serialize with the old object as a reference + + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("stateChange > empty object, not sending any payload", "debug"); + return false; // signal that no request was made + } + + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("stateChange > sending payload: " + payload, "debug"); + + payload = Buffer.from(payload); + await coap.request(url, "put", payload); + + return true; +} + +/** + * Sets some properties on virtual group or virtual properties on a real group. + * Can be used to manually update non-existing endpoints on real groups. + * @param group The group to be updated + * @param operation The properties to be set + * @returns true if a request was sent, false otherwise + */ +export async function operateVirtualGroup(group: Group | VirtualGroup, operation: LightOperation): Promise { + + // find all lightbulbs belonging to this group + const lightbulbAccessories = group.deviceIDs + .map(did => gw.devices[did]) + .filter(dev => dev != null && dev.type === AccessoryTypes.lightbulb) + ; + + for (const acc of lightbulbAccessories) { + await operateLight(acc, operation); + } + // and update the group + if (group instanceof VirtualGroup) { + group.merge(operation); + } +} + +/** + * Renames a device + * @param accessory The device to be renamed + * @param newName The new name to be given to the device + * @returns true if a request was sent, false otherwise + */ +export async function renameDevice(accessory: Accessory, newName: string): Promise { + // create a copy to modify + const newAccessory = accessory.clone(); + newAccessory.name = newName; + + // serialize with the old object as a reference + const serializedObj = newAccessory.serialize(accessory); + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("renameDevice > empty object, not sending any payload", "debug"); + return false; + } + + // get the payload + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("renameDevice > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + + await coap.request( + `${gw.requestBase}${coapEndpoints.devices}/${accessory.instanceId}`, "put", payload, + ); + return true; + +} + +/** + * Renames a group + * @param group The group to be renamed + * @param newName The new name to be given to the group + * @returns true if a request was sent, false otherwise + */ +export async function renameGroup(group: Group, newName: string): Promise { + // create a copy to modify + const newGroup = group.clone(); + newGroup.name = newName; + + // serialize with the old object as a reference + const serializedObj = newGroup.serialize(group); + // If the serialized object contains no properties, we don't need to send anything + if (!serializedObj || Object.keys(serializedObj).length === 0) { + _.log("renameGroup > empty object, not sending any payload", "debug"); + return false; + } + + // get the payload + let payload: string | Buffer = JSON.stringify(serializedObj); + _.log("renameDevice > sending payload: " + payload, "debug"); + payload = Buffer.from(payload); + + await coap.request( + `${gw.requestBase}${coapEndpoints.groups}/${group.instanceId}`, "put", payload, + ); + return true; + +} From 45e42336594e668f7e96acf01c3655d0a4ded0d5 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 14:27:21 +0200 Subject: [PATCH 39/51] refactored custom subscriptions into their own module --- build/lib/global.d.ts | 4 - build/main.js | 116 +------------------- build/modules/custom-subscriptions.d.ts | 34 ++++++ build/modules/custom-subscriptions.js | 115 ++++++++++++++++++++ src/lib/global.ts | 6 -- src/main.ts | 136 +----------------------- src/modules/custom-subscriptions.ts | 128 ++++++++++++++++++++++ 7 files changed, 287 insertions(+), 252 deletions(-) create mode 100644 build/modules/custom-subscriptions.d.ts create mode 100644 build/modules/custom-subscriptions.js create mode 100644 src/modules/custom-subscriptions.ts diff --git a/build/lib/global.d.ts b/build/lib/global.d.ts index e8f0a3b3..baac23cc 100644 --- a/build/lib/global.d.ts +++ b/build/lib/global.d.ts @@ -94,9 +94,5 @@ export declare class Global { * @param id */ static $$(pattern: string, type: ioBroker.ObjectType, role?: string): Promise>; - static subscribeStates: (pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void) => string; - static unsubscribeStates: (id: string) => void; - static subscribeObjects: (pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void) => string; - static unsubscribeObjects: (id: string) => void; static ensureInstanceObjects(): Promise; } diff --git a/build/main.js b/build/main.js index 0ad9153c..6d7d5fa8 100644 --- a/build/main.js +++ b/build/main.js @@ -20,7 +20,6 @@ const coap_payload_1 = require("./lib/coap-payload"); const global_1 = require("./lib/global"); const object_polyfill_1 = require("./lib/object-polyfill"); const promises_1 = require("./lib/promises"); -const str2regex_1 = require("./lib/str2regex"); // Datentypen laden const accessory_1 = require("./ipso/accessory"); const group_1 = require("./ipso/group"); @@ -29,18 +28,11 @@ const virtual_group_1 = require("./lib/virtual-group"); // Adapter-Utils laden const utils_1 = require("./lib/utils"); // Adapter-Module laden +const custom_subscriptions_1 = require("./modules/custom-subscriptions"); const gateway_1 = require("./modules/gateway"); const groups_1 = require("./modules/groups"); const message_1 = require("./modules/message"); const operations_1 = require("./modules/operations"); -const customStateSubscriptions = { - subscriptions: new Map(), - counter: 0, -}; -const customObjectSubscriptions = { - subscriptions: new Map(), - counter: 0, -}; // Adapter-Objekt erstellen let adapter = utils_1.default.adapter({ name: "tradfri", @@ -68,11 +60,6 @@ let adapter = utils_1.default.adapter({ // Eigene Objekte/States beobachten adapter.subscribeStates("*"); adapter.subscribeObjects("*"); - // Custom subscriptions erlauben - global_1.Global.subscribeStates = subscribeStates; - global_1.Global.unsubscribeStates = unsubscribeStates; - global_1.Global.subscribeObjects = subscribeObjects; - global_1.Global.unsubscribeObjects = unsubscribeObjects; // initialize CoAP client const hostname = adapter.config.host.toLowerCase(); node_coap_client_1.CoapClient.setSecurityParams(hostname, { @@ -139,19 +126,8 @@ let adapter = utils_1.default.adapter({ delete gateway_1.gateway.objects[id]; } } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customObjectSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) - sub.callback(id, obj); - } - } - } - catch (e) { - global_1.Global.log("error handling custom sub: " + e); - } + // apply additional subscriptions we've defined + custom_subscriptions_1.applyCustomObjectSubscriptions(id, obj); }, stateChange: (id, state) => __awaiter(this, void 0, void 0, function* () { if (state) { @@ -166,19 +142,8 @@ let adapter = utils_1.default.adapter({ global_1.Global.log("Please restart the adapter!", "error"); return; } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customStateSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) - sub.callback(id, state); - } - } - } - catch (e) { - global_1.Global.log("error handling custom sub: " + e); - } + // apply additional subscriptions we've defined + custom_subscriptions_1.applyCustomStateSubscriptions(id, state); // Eigene Handling-Logik zum Schluss, damit wir return benutzen können if (state && !state.ack && id.startsWith(adapter.namespace)) { // our own state was changed from within ioBroker, react to it @@ -955,77 +920,6 @@ function updatePossibleScenes(groupInfo) { } }); } -// ================================== -// Custom subscriptions -/** - * Ensures the subscription pattern is valid - */ -function checkPattern(pattern) { - try { - if (typeof pattern === "string") { - return str2regex_1.str2regex(pattern); - } - else if (pattern instanceof RegExp) { - return pattern; - } - else { - // NOPE - throw new Error("must be regex or string"); - } - } - catch (e) { - global_1.Global.log("cannot subscribe with this pattern. reason: " + e); - return null; - } -} -/** - * Subscribe to some ioBroker states - * @param pattern - * @param callback - * @returns a subscription ID - */ -function subscribeStates(pattern, callback) { - pattern = checkPattern(pattern); - if (!pattern) - return; - const newCounter = (++customStateSubscriptions.counter); - const id = "" + newCounter; - customStateSubscriptions.subscriptions.set(id, { pattern, callback }); - return id; -} -/** - * Release the custom subscription with the given id - * @param id The subscription ID returned by @link{subscribeStates} - */ -function unsubscribeStates(id) { - if (customStateSubscriptions.subscriptions.has(id)) { - customStateSubscriptions.subscriptions.delete(id); - } -} -/** - * Subscribe to some ioBroker objects - * @param pattern - * @param callback - * @returns a subscription ID - */ -function subscribeObjects(pattern, callback) { - pattern = checkPattern(pattern); - if (!pattern) - return; - const newCounter = (++customObjectSubscriptions.counter); - const id = "" + newCounter; - customObjectSubscriptions.subscriptions.set(id, { pattern, callback }); - return id; -} -/** - * Release the custom subscription with the given id - * @param id The subscription ID returned by @link{subscribeObjects} - */ -function unsubscribeObjects(id) { - if (customObjectSubscriptions.subscriptions.has(id)) { - customObjectSubscriptions.subscriptions.delete(id); - } -} /** * Loads defined virtual groups from the ioBroker objects DB */ diff --git a/build/modules/custom-subscriptions.d.ts b/build/modules/custom-subscriptions.d.ts new file mode 100644 index 00000000..01aef955 --- /dev/null +++ b/build/modules/custom-subscriptions.d.ts @@ -0,0 +1,34 @@ +export interface CustomStateSubscription { + pattern: RegExp; + callback: (id: string, state: ioBroker.State) => void; +} +export interface CustomObjectSubscription { + pattern: RegExp; + callback: (id: string, obj: ioBroker.Object) => void; +} +export declare function applyCustomStateSubscriptions(id: string, state: ioBroker.State | null): void; +export declare function applyCustomObjectSubscriptions(id: string, obj: ioBroker.Object | null): void; +/** + * Subscribe to some ioBroker states + * @param pattern + * @param callback + * @returns a subscription ID + */ +export declare function subscribeStates(pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void): string; +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeStates} + */ +export declare function unsubscribeStates(id: string): void; +/** + * Subscribe to some ioBroker objects + * @param pattern + * @param callback + * @returns a subscription ID + */ +export declare function subscribeObjects(pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void): string; +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeObjects} + */ +export declare function unsubscribeObjects(id: string): void; diff --git a/build/modules/custom-subscriptions.js b/build/modules/custom-subscriptions.js new file mode 100644 index 00000000..5c17db4f --- /dev/null +++ b/build/modules/custom-subscriptions.js @@ -0,0 +1,115 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +const global_1 = require("../lib/global"); +const str2regex_1 = require("../lib/str2regex"); +const customStateSubscriptions = { + subscriptions: new Map(), + counter: 0, +}; +const customObjectSubscriptions = { + subscriptions: new Map(), + counter: 0, +}; +/** + * Ensures the subscription pattern is valid + */ +function checkPattern(pattern) { + try { + if (typeof pattern === "string") { + return str2regex_1.str2regex(pattern); + } + else if (pattern instanceof RegExp) { + return pattern; + } + else { + // NOPE + throw new Error("must be regex or string"); + } + } + catch (e) { + global_1.Global.log("cannot subscribe with this pattern. reason: " + e); + return null; + } +} +function applyCustomStateSubscriptions(id, state) { + try { + for (const sub of customStateSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) + sub.callback(id, state); + } + } + } + catch (e) { + global_1.Global.log("error handling custom sub: " + e); + } +} +exports.applyCustomStateSubscriptions = applyCustomStateSubscriptions; +function applyCustomObjectSubscriptions(id, obj) { + try { + for (const sub of customObjectSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) + sub.callback(id, obj); + } + } + } + catch (e) { + global_1.Global.log("error handling custom sub: " + e); + } +} +exports.applyCustomObjectSubscriptions = applyCustomObjectSubscriptions; +/** + * Subscribe to some ioBroker states + * @param pattern + * @param callback + * @returns a subscription ID + */ +function subscribeStates(pattern, callback) { + pattern = checkPattern(pattern); + if (!pattern) + return; + const newCounter = (++customStateSubscriptions.counter); + const id = "" + newCounter; + customStateSubscriptions.subscriptions.set(id, { pattern, callback }); + return id; +} +exports.subscribeStates = subscribeStates; +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeStates} + */ +function unsubscribeStates(id) { + if (customStateSubscriptions.subscriptions.has(id)) { + customStateSubscriptions.subscriptions.delete(id); + } +} +exports.unsubscribeStates = unsubscribeStates; +/** + * Subscribe to some ioBroker objects + * @param pattern + * @param callback + * @returns a subscription ID + */ +function subscribeObjects(pattern, callback) { + pattern = checkPattern(pattern); + if (!pattern) + return; + const newCounter = (++customObjectSubscriptions.counter); + const id = "" + newCounter; + customObjectSubscriptions.subscriptions.set(id, { pattern, callback }); + return id; +} +exports.subscribeObjects = subscribeObjects; +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeObjects} + */ +function unsubscribeObjects(id) { + if (customObjectSubscriptions.subscriptions.has(id)) { + customObjectSubscriptions.subscriptions.delete(id); + } +} +exports.unsubscribeObjects = unsubscribeObjects; diff --git a/src/lib/global.ts b/src/lib/global.ts index baa6cf3e..ee0b3bc7 100644 --- a/src/lib/global.ts +++ b/src/lib/global.ts @@ -214,12 +214,6 @@ export class Global { } } - // custom subscriptions - public static subscribeStates: (pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void) => string; - public static unsubscribeStates: (id: string) => void; - public static subscribeObjects: (pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void) => string; - public static unsubscribeObjects: (id: string) => void; - // Workaround für unvollständige Adapter-Upgrades public static async ensureInstanceObjects(): Promise { // read io-package.json diff --git a/src/main.ts b/src/main.ts index d42b1c14..a73beb37 100644 --- a/src/main.ts +++ b/src/main.ts @@ -27,34 +27,12 @@ import { VirtualGroup } from "./lib/virtual-group"; import utils from "./lib/utils"; // Adapter-Module laden +import { applyCustomObjectSubscriptions, applyCustomStateSubscriptions } from "./modules/custom-subscriptions"; import { gateway as gw, GroupInfo } from "./modules/gateway"; import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./modules/groups"; import { onMessage } from "./modules/message"; import { operateGroup, operateLight, operateVirtualGroup, renameDevice, renameGroup } from "./modules/operations"; -interface CustomStateSubscription { - pattern: RegExp; - callback: (id: string, state: ioBroker.State) => void; -} -interface CustomObjectSubscription { - pattern: RegExp; - callback: (id: string, obj: ioBroker.Object) => void; -} -const customStateSubscriptions: { - subscriptions: Map, - counter: number, -} = { - subscriptions: new Map(), - counter: 0, - }; -const customObjectSubscriptions: { - subscriptions: Map, - counter: number, -} = { - subscriptions: new Map(), - counter: 0, - }; - // Adapter-Objekt erstellen let adapter: ExtendedAdapter = utils.adapter({ name: "tradfri", @@ -88,12 +66,6 @@ let adapter: ExtendedAdapter = utils.adapter({ adapter.subscribeStates("*"); adapter.subscribeObjects("*"); - // Custom subscriptions erlauben - _.subscribeStates = subscribeStates; - _.unsubscribeStates = unsubscribeStates; - _.subscribeObjects = subscribeObjects; - _.unsubscribeObjects = unsubscribeObjects; - // initialize CoAP client const hostname = (adapter.config.host as string).toLowerCase(); coap.setSecurityParams(hostname, { @@ -163,17 +135,8 @@ let adapter: ExtendedAdapter = utils.adapter({ } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customObjectSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) sub.callback(id, obj); - } - } - } catch (e) { - _.log("error handling custom sub: " + e); - } + // apply additional subscriptions we've defined + applyCustomObjectSubscriptions(id, obj); }, @@ -191,17 +154,8 @@ let adapter: ExtendedAdapter = utils.adapter({ return; } - // Custom subscriptions durchgehen, um die passenden Callbacks aufzurufen - try { - for (const sub of customStateSubscriptions.subscriptions.values()) { - if (sub && sub.pattern && sub.callback) { - // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen - if (sub.pattern.test(id)) sub.callback(id, state); - } - } - } catch (e) { - _.log("error handling custom sub: " + e); - } + // apply additional subscriptions we've defined + applyCustomStateSubscriptions(id, state); // Eigene Handling-Logik zum Schluss, damit wir return benutzen können if (state && !state.ack && id.startsWith(adapter.namespace)) { @@ -1034,86 +988,6 @@ async function updatePossibleScenes(groupInfo: GroupInfo): Promise { } } -// ================================== -// Custom subscriptions - -/** - * Ensures the subscription pattern is valid - */ -function checkPattern(pattern: string | RegExp): RegExp { - try { - if (typeof pattern === "string") { - return str2regex(pattern); - } else if (pattern instanceof RegExp) { - return pattern; - } else { - // NOPE - throw new Error("must be regex or string"); - } - } catch (e) { - _.log("cannot subscribe with this pattern. reason: " + e); - return null; - } -} - -/** - * Subscribe to some ioBroker states - * @param pattern - * @param callback - * @returns a subscription ID - */ -function subscribeStates(pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void): string { - - pattern = checkPattern(pattern); - if (!pattern) return; - - const newCounter = (++customStateSubscriptions.counter); - const id = "" + newCounter; - - customStateSubscriptions.subscriptions.set(id, { pattern, callback }); - - return id; -} - -/** - * Release the custom subscription with the given id - * @param id The subscription ID returned by @link{subscribeStates} - */ -function unsubscribeStates(id: string) { - if (customStateSubscriptions.subscriptions.has(id)) { - customStateSubscriptions.subscriptions.delete(id); - } -} - -/** - * Subscribe to some ioBroker objects - * @param pattern - * @param callback - * @returns a subscription ID - */ -function subscribeObjects(pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void): string { - - pattern = checkPattern(pattern); - if (!pattern) return; - - const newCounter = (++customObjectSubscriptions.counter); - const id = "" + newCounter; - - customObjectSubscriptions.subscriptions.set(id, { pattern, callback }); - - return id; -} - -/** - * Release the custom subscription with the given id - * @param id The subscription ID returned by @link{subscribeObjects} - */ -function unsubscribeObjects(id: string) { - if (customObjectSubscriptions.subscriptions.has(id)) { - customObjectSubscriptions.subscriptions.delete(id); - } -} - /** * Loads defined virtual groups from the ioBroker objects DB */ diff --git a/src/modules/custom-subscriptions.ts b/src/modules/custom-subscriptions.ts new file mode 100644 index 00000000..80ab9837 --- /dev/null +++ b/src/modules/custom-subscriptions.ts @@ -0,0 +1,128 @@ +import { Global as _ } from "../lib/global"; +import { str2regex } from "../lib/str2regex"; + +export interface CustomStateSubscription { + pattern: RegExp; + callback: (id: string, state: ioBroker.State) => void; +} +export interface CustomObjectSubscription { + pattern: RegExp; + callback: (id: string, obj: ioBroker.Object) => void; +} +const customStateSubscriptions: { + subscriptions: Map, + counter: number, +} = { + subscriptions: new Map(), + counter: 0, + }; +const customObjectSubscriptions: { + subscriptions: Map, + counter: number, +} = { + subscriptions: new Map(), + counter: 0, + }; + +/** + * Ensures the subscription pattern is valid + */ +function checkPattern(pattern: string | RegExp): RegExp { + try { + if (typeof pattern === "string") { + return str2regex(pattern); + } else if (pattern instanceof RegExp) { + return pattern; + } else { + // NOPE + throw new Error("must be regex or string"); + } + } catch (e) { + _.log("cannot subscribe with this pattern. reason: " + e); + return null; + } +} + +export function applyCustomStateSubscriptions(id: string, state: ioBroker.State | null) { + try { + for (const sub of customStateSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) sub.callback(id, state); + } + } + } catch (e) { + _.log("error handling custom sub: " + e); + } +} + +export function applyCustomObjectSubscriptions(id: string, obj: ioBroker.Object | null) { + try { + for (const sub of customObjectSubscriptions.subscriptions.values()) { + if (sub && sub.pattern && sub.callback) { + // Wenn die ID zum aktuellen Pattern passt, dann Callback aufrufen + if (sub.pattern.test(id)) sub.callback(id, obj); + } + } + } catch (e) { + _.log("error handling custom sub: " + e); + } +} + +/** + * Subscribe to some ioBroker states + * @param pattern + * @param callback + * @returns a subscription ID + */ +export function subscribeStates(pattern: string | RegExp, callback: (id: string, state: ioBroker.State) => void): string { + + pattern = checkPattern(pattern); + if (!pattern) return; + + const newCounter = (++customStateSubscriptions.counter); + const id = "" + newCounter; + + customStateSubscriptions.subscriptions.set(id, { pattern, callback }); + + return id; +} + +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeStates} + */ +export function unsubscribeStates(id: string) { + if (customStateSubscriptions.subscriptions.has(id)) { + customStateSubscriptions.subscriptions.delete(id); + } +} + +/** + * Subscribe to some ioBroker objects + * @param pattern + * @param callback + * @returns a subscription ID + */ +export function subscribeObjects(pattern: string | RegExp, callback: (id: string, object: ioBroker.Object) => void): string { + + pattern = checkPattern(pattern); + if (!pattern) return; + + const newCounter = (++customObjectSubscriptions.counter); + const id = "" + newCounter; + + customObjectSubscriptions.subscriptions.set(id, { pattern, callback }); + + return id; +} + +/** + * Release the custom subscription with the given id + * @param id The subscription ID returned by @link{subscribeObjects} + */ +export function unsubscribeObjects(id: string) { + if (customObjectSubscriptions.subscriptions.has(id)) { + customObjectSubscriptions.subscriptions.delete(id); + } +} From 062533f9868047f6403fe28e0106762ef71a205a Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 14:29:02 +0200 Subject: [PATCH 40/51] fix windows testing [skip ci] --- appveyor.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appveyor.yml b/appveyor.yml index c397cca6..5eab3ed2 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -10,7 +10,7 @@ clone_folder: 'c:\projects\%APPVEYOR_PROJECT_NAME%' install: - ps: 'Install-Product node $env:nodejs_version $env:platform' # Fix random EPERM on NJS 8 when installing fsevents - - IF "%nodejs_version:~0,1%"=="8" npm install npm@5.3 -g + - IF "%nodejs_version:~0,1%"=="8" npm install npm@3 -g - npm install - npm install winston@2.3.1 - 'npm install https://github.com/ioBroker/ioBroker.js-controller/tarball/master --production' From 44c9fc61b79c86a493572f2748372920a3cd0562 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 14:50:25 +0200 Subject: [PATCH 41/51] dump package_lock.json, we're using npm@3 now [skip ci] --- package-lock.json | 6483 --------------------------------------------- 1 file changed, 6483 deletions(-) delete mode 100644 package-lock.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b43a7a02..00000000 --- a/package-lock.json +++ /dev/null @@ -1,6483 +0,0 @@ -{ - "name": "iobroker.tradfri", - "version": "0.5.0-beta2", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@types/chai": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.4.tgz", - "integrity": "sha1-/oYxXZpmgn/usW9zvJVGiOyVDhg=", - "dev": true - }, - "@types/chai-as-promised": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@types/chai-as-promised/-/chai-as-promised-7.1.0.tgz", - "integrity": "sha1-AQsEzeeOrPtucr/ds+WP4jwueLk=", - "dev": true, - "requires": { - "@types/chai": "4.0.4" - } - }, - "@types/jquery": { - "version": "1.10.33", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-1.10.33.tgz", - "integrity": "sha512-na7VheaJZaPQs6jJx8Rn1E7mucDWdJSjXEaXKIAa5+RNtcHYPtckJseGx7w1L14EKzhmAZx3JDXKEGXMipZ57g==", - "dev": true - }, - "@types/mocha": { - "version": "2.2.43", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.43.tgz", - "integrity": "sha1-A8VFicQ60EjLy/1jmZtV0EJO7Cc=", - "dev": true - }, - "@types/node": { - "version": "6.0.88", - "resolved": "https://registry.npmjs.org/@types/node/-/node-6.0.88.tgz", - "integrity": "sha1-9hjxGpRPahjZK1xHIChyij49S2Y=", - "dev": true - }, - "@types/react": { - "version": "16.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-16.0.15.tgz", - "integrity": "sha512-xHdxEr96SZsoXDRH5jvqMFES2Hvdb1DFekbrlDD5yqHJ2oymbQzoh2qqQj+LB51OqnX+4rCcJ73jaiT+VOfgKA==", - "dev": true - }, - "@types/react-dom": { - "version": "16.0.2", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-16.0.2.tgz", - "integrity": "sha512-P+S4FYX49Rim9wSuKy+UoVgmWaUvl7fz4ut3GsWF2Fq93A0XpwYg+U0PTd+Zu8g7G2gPzOqWePgsElLxM4FJjQ==", - "dev": true, - "requires": { - "@types/node": "6.0.88", - "@types/react": "16.0.15" - } - }, - "@types/reflect-metadata": { - "version": "https://registry.npmjs.org/@types/reflect-metadata/-/reflect-metadata-0.0.5.tgz", - "integrity": "sha1-nAQr+pgD1Xeq1PV9+8pLfK5Chv4=", - "dev": true - }, - "@types/sinon": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.6.tgz", - "integrity": "sha512-4+8BQOU/siROrXyMliceCUvQ3dy719ctUBBMcTRjcrWJ5uiR/wccIVPsO3aLBB86j8JFQeF0FlQR6ZpSNsbA6Q==", - "dev": true - }, - "abab": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", - "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", - "dev": true - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "acorn": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.1.2.tgz", - "integrity": "sha512-o96FZLJBPY1lvTuJylGA9Bk3t/GKPPJG8H0ydQQl01crzwJgspa4AEIq/pVTXigmK0PHVQhiAtn8WMBLL9D2WA==", - "dev": true - }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", - "dev": true, - "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } - } - }, - "acorn-globals": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.0.0.tgz", - "integrity": "sha512-0ih/qJVrAalX7TjjAnQdz8u+I1QOnLvLq+9zkyqcczObOii07ukuUSd5mTgVDukhqikAs+gqTm6cMd8VFwTrwA==", - "dev": true, - "requires": { - "acorn": "5.1.2" - } - }, - "ajv": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", - "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, - "ajv-keywords": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.0.tgz", - "integrity": "sha1-opbhf3v658HOT34N5T0pyzIWLfA=", - "dev": true - }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" - } - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, - "requires": { - "micromatch": "2.3.11", - "normalize-path": "2.1.1" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "are-we-there-yet": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", - "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - } - }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "1.1.0" - } - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "array-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz", - "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=", - "dev": true - }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", - "dev": true - }, - "asn1": { - "version": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "asn1.js": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.1.tgz", - "integrity": "sha1-SLokC0WpKA6UdImQull9IWYX/UA=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", - "dev": true, - "requires": { - "util": "0.10.3" - } - }, - "assert-plus": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", - "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" - }, - "assertion-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", - "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", - "dev": true - }, - "async": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", - "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", - "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==", - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", - "dev": true - }, - "binary-extensions": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", - "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=", - "dev": true - }, - "block-stream": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", - "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", - "requires": { - "inherits": "2.0.3" - } - }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, - "bn.js": { - "version": "4.11.8", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", - "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==", - "dev": true - }, - "boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", - "dev": true - }, - "boom": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", - "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", - "requires": { - "hoek": "2.16.3" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" - } - }, - "brorand": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", - "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", - "dev": true - }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, - "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", - "dev": true, - "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", - "dev": true, - "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" - } - }, - "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" - } - }, - "browserify-rsa": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz", - "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" - } - }, - "browserify-sign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz", - "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" - } - }, - "browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha1-uzX4pRn2AOD6a4SFJByXnQFB+y0=", - "dev": true, - "requires": { - "pako": "0.2.9" - } - }, - "buffer": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", - "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", - "dev": true, - "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" - } - }, - "buffer-xor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", - "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", - "dev": true - }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "builtin-status-codes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", - "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", - "dev": true - }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, - "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" - } - }, - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, - "chai": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.2.tgz", - "integrity": "sha1-D2RYS6ZC8PKs4oBiefTwbKI61zw=", - "dev": true, - "requires": { - "assertion-error": "1.0.2", - "check-error": "1.0.2", - "deep-eql": "3.0.1", - "get-func-name": "2.0.0", - "pathval": "1.1.0", - "type-detect": "4.0.3" - } - }, - "chai-as-promised": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", - "integrity": "sha1-CGRdgl3rhpbuYXJdv1kMAS6wDKA=", - "dev": true, - "requires": { - "check-error": "1.0.2" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" - }, - "dependencies": { - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - } - } - }, - "check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", - "dev": true - }, - "cheerio": { - "version": "1.0.0-rc.2", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.2.tgz", - "integrity": "sha1-S59TqBsn5NXawxwP/Qz6A8xoMNs=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-serializer": "0.1.0", - "entities": "1.1.1", - "htmlparser2": "3.9.2", - "lodash": "4.17.4", - "parse5": "3.0.2" - } - }, - "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" - } - }, - "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", - "dev": true, - "requires": { - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - }, - "dependencies": { - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true - } - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "color-convert": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.0.tgz", - "integrity": "sha1-Gsz5fdc5uYO/mU1W/sj5WFNkG3o=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } - }, - "console-control-strings": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", - "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" - }, - "constants-browserify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", - "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", - "dev": true - }, - "content-type-parser": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-type-parser/-/content-type-parser-1.0.1.tgz", - "integrity": "sha1-w+VpiMU8ZRJ/tG1AMqOpACRv3JQ=", - "dev": true - }, - "core-js": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", - "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" - } - }, - "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" - } - }, - "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", - "dev": true, - "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" - } - }, - "cryptiles": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", - "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", - "requires": { - "boom": "2.10.1" - } - }, - "crypto-browserify": { - "version": "3.11.1", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.11.1.tgz", - "integrity": "sha512-Na7ZlwCOqoaW5RwUK1WpXws2kv8mNhWdTlzob0UXulk6G9BDbyiJaGTYBIX61Ozn9l1EPPJpICZb4DaOpT9NlQ==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5" - } - }, - "css-select": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz", - "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", - "dev": true, - "requires": { - "boolbase": "1.0.0", - "css-what": "2.1.0", - "domutils": "1.5.1", - "nth-check": "1.0.1" - } - }, - "css-what": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", - "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", - "dev": true - }, - "cssom": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", - "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", - "dev": true - }, - "cssstyle": { - "version": "0.2.37", - "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", - "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", - "dev": true, - "requires": { - "cssom": "0.3.2" - } - }, - "d": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, - "requires": { - "es5-ext": "0.10.35" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", - "dev": true - }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "deep-eql": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", - "integrity": "sha1-38lARACtHI/gI+faHfHBR8S0RN8=", - "dev": true, - "requires": { - "type-detect": "4.0.3" - } - }, - "deep-extend": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", - "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=" - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" - } - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", - "dev": true - }, - "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" - } - }, - "discontinuous-range": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/discontinuous-range/-/discontinuous-range-1.0.0.tgz", - "integrity": "sha1-44Mx8IRLukm5qctxx3FYWqsbxlo=", - "dev": true - }, - "dom-converter": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.1.4.tgz", - "integrity": "sha1-pF71cnuJDJv/5tfIduexnLDhfzs=", - "dev": true, - "requires": { - "utila": "0.3.3" - }, - "dependencies": { - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", - "dev": true, - "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" - }, - "dependencies": { - "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", - "dev": true - } - } - }, - "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", - "dev": true - }, - "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", - "dev": true - }, - "domexception": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.0.tgz", - "integrity": "sha512-WpwuBlZ2lQRFa4H/4w49deb9rJLot9KmqrKKjMc9qBl7CID+DdC2swoa34ccRl+anL2B6bLp6TjFdIdnzekMBQ==", - "dev": true - }, - "domhandler": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", - "dev": true, - "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" - } - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", - "dev": true - }, - "encoding": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", - "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", - "dev": true, - "requires": { - "iconv-lite": "0.4.19" - } - }, - "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" - } - }, - "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", - "dev": true - }, - "enzyme": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/enzyme/-/enzyme-3.1.0.tgz", - "integrity": "sha1-2MqECFeQ+87G7UC63RRHj67kwlo=", - "dev": true, - "requires": { - "cheerio": "1.0.0-rc.2", - "function.prototype.name": "1.0.3", - "is-subset": "0.1.1", - "lodash": "4.17.4", - "object-is": "1.0.1", - "object.assign": "4.0.4", - "object.entries": "1.0.4", - "object.values": "1.0.4", - "raf": "3.4.0", - "rst-selector-parser": "2.2.2" - } - }, - "enzyme-adapter-react-16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/enzyme-adapter-react-16/-/enzyme-adapter-react-16-1.0.2.tgz", - "integrity": "sha512-ePlf3ikzau4NatDCzBP1Y/rFgLhR6MnS1YQVrxD2KXFI31nE1HtL+6ciqALF8kHe5q7Y7lFAd1MYOLIriRqgcw==", - "dev": true, - "requires": { - "enzyme-adapter-utils": "1.0.1", - "lodash": "4.17.4", - "object.assign": "4.0.4", - "object.values": "1.0.4", - "prop-types": "15.6.0", - "react-test-renderer": "16.0.0" - } - }, - "enzyme-adapter-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/enzyme-adapter-utils/-/enzyme-adapter-utils-1.0.1.tgz", - "integrity": "sha1-/NgSIzOaVaMS91UmQeBFxAQIQAk=", - "dev": true, - "requires": { - "lodash": "4.17.4", - "object.assign": "4.0.4", - "prop-types": "15.6.0" - } - }, - "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", - "dev": true, - "requires": { - "prr": "0.0.0" - } - }, - "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "0.2.1" - } - }, - "es-abstract": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.9.0.tgz", - "integrity": "sha512-kk3IJoKo7A3pWJc0OV8yZ/VEX2oSUytfekrJiqoxBlKJMFAJVJVpGdHClCCTdv+Fn2zHfpDHHIelMFhZVfef3Q==", - "dev": true, - "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" - } - }, - "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.35", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.35.tgz", - "integrity": "sha1-GO6FjOajxFx9eekcFfzKnsVoSU8=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", - "dev": true, - "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, - "optional": true - } - } - }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, - "eslint-plugin-node": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.0.tgz", - "integrity": "sha1-4e/KBKOFUWz/Py8EAnzoxa5tt0k=", - "dev": true, - "requires": { - "ignore": "3.3.5", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, - "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", - "dev": true, - "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.35" - } - }, - "events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=", - "dev": true - }, - "evp_bytestokey": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", - "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", - "dev": true, - "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" - } - }, - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - }, - "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" - } - }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "2.2.3" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "fbjs": { - "version": "0.8.16", - "resolved": "https://registry.npmjs.org/fbjs/-/fbjs-0.8.16.tgz", - "integrity": "sha1-XmdDL1UNxBtXK/VYR7ispk5TN9s=", - "dev": true, - "requires": { - "core-js": "1.2.7", - "isomorphic-fetch": "2.2.1", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "promise": "7.3.1", - "setimmediate": "1.0.5", - "ua-parser-js": "0.7.17" - } - }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "2.0.0" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", - "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, - "requires": { - "samsam": "1.3.0" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", - "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", - "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "function.prototype.name": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.0.3.tgz", - "integrity": "sha512-5EblxZUdioXi2JiMZ9FUbwYj40eQ9MFHyzFLBSPdlRl3SO8l7SLWuAnQ/at/1Wi4hjJwME/C5WpF2ZfAc8nGNw==", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "is-callable": "1.1.3" - } - }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", - "requires": { - "aproba": "1.2.0", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", - "dev": true - }, - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "github": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/github/-/github-0.2.4.tgz", - "integrity": "sha1-JPp/DhP6EblGr5ETTFGYKpHOU4s=", - "requires": { - "mime": "1.4.1" - } - }, - "glob": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", - "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - } - }, - "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "2.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "growl": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.2.tgz", - "integrity": "sha1-jxbfzY+3wEz8H04AEuDqhYcml5o=", - "dev": true, - "requires": { - "eslint-plugin-node": "5.2.0" - } - }, - "har-schema": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", - "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=" - }, - "har-validator": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", - "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", - "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" - } - }, - "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", - "dev": true, - "requires": { - "function-bind": "1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "2.1.1" - } - }, - "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", - "dev": true - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" - } - }, - "hawk": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", - "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", - "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" - } - }, - "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", - "dev": true - }, - "hmac-drbg": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", - "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", - "dev": true, - "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" - } - }, - "hoek": { - "version": "2.16.3", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", - "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "1.0.0" - } - }, - "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", - "dev": true - }, - "html-encoding-sniffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.1.tgz", - "integrity": "sha1-eb96eF6klf5mFl5zQVPzY/9UN9o=", - "dev": true, - "requires": { - "whatwg-encoding": "1.0.1" - } - }, - "html-minifier": { - "version": "3.5.6", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.6.tgz", - "integrity": "sha512-88FjtKrlak2XjczhxrBomgzV4jmGzM3UnHRBScRkJcmcRum0kb+IwhVAETJ8AVp7j0p3xugjSaw9L+RmI5/QOA==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.11.0", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.1.4" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - } - } - }, - "html-webpack-plugin": { - "version": "2.30.1", - "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-2.30.1.tgz", - "integrity": "sha1-f5xCG36pHsRg9WUn1430hO51N9U=", - "dev": true, - "requires": { - "bluebird": "3.5.1", - "html-minifier": "3.5.6", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "pretty-error": "2.1.1", - "toposort": "1.0.6" - } - }, - "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.4.1", - "domutils": "1.5.1", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "http-signature": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", - "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", - "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "https-browserify": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-0.0.1.tgz", - "integrity": "sha1-P5E2XKvmC3ftDruiS0VOPgnZWoI=", - "dev": true - }, - "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", - "dev": true - }, - "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=", - "dev": true - }, - "ignore": { - "version": "3.3.5", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.5.tgz", - "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", - "dev": true - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "interpret": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.0.4.tgz", - "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", - "dev": true - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-binary-path": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", - "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", - "dev": true, - "requires": { - "binary-extensions": "1.10.0" - } - }, - "is-buffer": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "1.1.1" - } - }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", - "dev": true - }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - } - }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", - "dev": true, - "requires": { - "has": "1.0.1" - } - }, - "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-subset": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", - "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", - "dev": true - }, - "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - }, - "isomorphic-fetch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz", - "integrity": "sha1-YRrhrPFPXoH3KVB0coGf6XM1WKk=", - "dev": true, - "requires": { - "node-fetch": "1.7.3", - "whatwg-fetch": "2.0.3" - } - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jquery": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/jquery/-/jquery-1.11.1.tgz", - "integrity": "sha1-tuyShZARLr7Wnh5Jy/0AJczWDds=", - "dev": true - }, - "jquery-ui": { - "version": "1.10.4", - "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.10.4.tgz", - "integrity": "sha1-oJb+X04PKraaBYXPEEVYd/V1Br0=", - "dev": true - }, - "jquery-ui-multiselect-widget": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/jquery-ui-multiselect-widget/-/jquery-ui-multiselect-widget-1.17.0.tgz", - "integrity": "sha1-WpxS5+Y431Dc7Q4Pds7xWhALJeI=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "jsdom": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.3.0.tgz", - "integrity": "sha512-aPZTDl4MplzQhx5bLztk6nzjbEslmO3Q3+z0WpCMutL1XJDhZIRzir6R1Y8S84LgeT/7jhQvgtUMkY6oPwvlUw==", - "dev": true, - "requires": { - "abab": "1.0.4", - "acorn": "5.1.2", - "acorn-globals": "4.0.0", - "array-equal": "1.0.0", - "content-type-parser": "1.0.1", - "cssom": "0.3.2", - "cssstyle": "0.2.37", - "domexception": "1.0.0", - "escodegen": "1.9.0", - "html-encoding-sniffer": "1.0.1", - "nwmatcher": "1.4.3", - "parse5": "3.0.2", - "pn": "1.0.0", - "request": "2.83.0", - "request-promise-native": "1.0.5", - "sax": "1.2.4", - "symbol-tree": "3.2.2", - "tough-cookie": "2.3.3", - "webidl-conversions": "4.0.2", - "whatwg-encoding": "1.0.1", - "whatwg-url": "6.3.0", - "xml-name-validator": "2.0.1" - }, - "dependencies": { - "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", - "dev": true - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "dev": true, - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", - "dev": true - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "dev": true, - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - } - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "dev": true, - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", - "dev": true - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "dev": true, - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", - "dev": true - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "dev": true, - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "dev": true, - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", - "dev": true - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "just-extend": { - "version": "1.1.22", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.22.tgz", - "integrity": "sha1-MzCvdWyralQnAMZLLk5KoGLVL/8=", - "dev": true - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "1.0.0" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" - } - }, - "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", - "dev": true - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" - } - }, - "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "lodash.flattendeep": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", - "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", - "dev": true - }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, - "lodash.sortby": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", - "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=", - "dev": true - }, - "lolex": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.3.tgz", - "integrity": "sha1-U/iTu+iMgDeBViQOEnEmuQXIMIc=", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "3.0.2" - } - }, - "lower-case": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true - }, - "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", - "dev": true, - "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" - } - }, - "make-error": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.0.tgz", - "integrity": "sha1-Uq06M5zPEM5itAQLcI/nByRLi5Y=", - "dev": true - }, - "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", - "dev": true, - "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } - } - }, - "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "memory-fs": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", - "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", - "dev": true, - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - } - }, - "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - } - }, - "miller-rabin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", - "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" - } - }, - "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "mimic-fn": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", - "dev": true - }, - "minimalistic-crypto-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", - "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", - "dev": true - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "mocha": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.0.0.tgz", - "integrity": "sha1-PacYzNduk7nYKvsGXhcIa9vjUr8=", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.2", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - } - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.4.0.tgz", - "integrity": "sha1-+zxZ1F/k7/4hXwuJD4rfbrMtIjI=" - }, - "native-promise-only": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", - "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", - "dev": true - }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "1.0.0" - } - }, - "nearley": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/nearley/-/nearley-2.11.0.tgz", - "integrity": "sha512-clqqhEuP0ZCJQ85Xv2I/4o2Gs/fvSR6fCg5ZHVE2c8evWyNk2G++ih4JOO3lMb/k/09x6ihQ2nzKUlB/APCWjg==", - "dev": true, - "requires": { - "nomnom": "1.6.2", - "railroad-diagrams": "1.0.0", - "randexp": "0.4.6" - } - }, - "nise": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.1.1.tgz", - "integrity": "sha1-H6oHFH878kZdTb7cDkqEBI8IEEE=", - "dev": true, - "requires": { - "formatio": "1.2.0", - "just-extend": "1.1.22", - "lolex": "1.6.0", - "path-to-regexp": "1.7.0", - "text-encoding": "0.6.4" - }, - "dependencies": { - "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true - } - } - }, - "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", - "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, - "requires": { - "lower-case": "1.1.4" - } - }, - "node-aead-crypto": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/node-aead-crypto/-/node-aead-crypto-1.0.2.tgz", - "integrity": "sha1-+2EIvDCNUQAWg1RYO5fRJGh37RY=", - "requires": { - "nan": "2.4.0", - "node-pre-gyp": "0.6.38", - "node-pre-gyp-github": "1.3.1" - } - }, - "node-coap-client": { - "version": "0.4.8", - "resolved": "https://registry.npmjs.org/node-coap-client/-/node-coap-client-0.4.8.tgz", - "integrity": "sha512-ZqLllQz3dPwkOL4vwqhD/Uzxit05XYhvADZi3QxHGSNCMZfNdBwHPRCth8MXF2o4jQGWFoptyWI6mScIm0P0NA==", - "requires": { - "debug": "3.1.0", - "node-dtls-client": "0.2.2" - } - }, - "node-dtls-client": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/node-dtls-client/-/node-dtls-client-0.2.2.tgz", - "integrity": "sha512-HX86+JkebS4/aLHyHplaTIsXkrTwEyG8u8SF2c2GI2pQNKX/hUH4qCC1WkSt2hUhe32VG458Gvmn2gIOmVfheQ==", - "requires": { - "debug": "3.1.0", - "node-aead-crypto": "1.0.2" - } - }, - "node-fetch": { - "version": "1.7.3", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.7.3.tgz", - "integrity": "sha512-NhZ4CsKx7cYm2vSrBAr2PvFOe6sWDf0UYLRqA6svUYg7+/TSfVAu49jYC4BvQ4Sms9SZgdqGBgroqfDhJdTyKQ==", - "dev": true, - "requires": { - "encoding": "0.1.12", - "is-stream": "1.1.0" - } - }, - "node-libs-browser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.0.0.tgz", - "integrity": "sha1-o6WeyXAkmFtG6Vg3lkb5bEthZkY=", - "dev": true, - "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.1.4", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.11.1", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "0.0.1", - "os-browserify": "0.2.1", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.4.1", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "0.10.31", - "timers-browserify": "2.0.4", - "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" - }, - "dependencies": { - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - } - } - }, - "node-pre-gyp": { - "version": "0.6.38", - "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.38.tgz", - "integrity": "sha1-6Sog+DQWQVu0CG9tH7eLPac9ET0=", - "requires": { - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.2", - "rc": "1.2.2", - "request": "2.81.0", - "rimraf": "2.6.2", - "semver": "5.4.1", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "node-pre-gyp-github": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/node-pre-gyp-github/-/node-pre-gyp-github-1.3.1.tgz", - "integrity": "sha1-xpZTA5lbWwg+ymShqjX9K1Edy7M=", - "requires": { - "commander": "2.9.0", - "github": "0.2.4" - } - }, - "node-ssh": { - "version": "https://registry.npmjs.org/node-ssh/-/node-ssh-5.0.0.tgz", - "integrity": "sha1-/wn0WcxrKnnVVC9SPXJVWyqExf0=", - "dev": true, - "requires": { - "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "sb-promisify": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", - "sb-scandir": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-2.0.0.tgz", - "shell-escape": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", - "ssh2": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.5.tgz" - } - }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.1", - "underscore": "1.4.4" - }, - "dependencies": { - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - } - } - }, - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "requires": { - "abbrev": "1.1.1", - "osenv": "0.1.4" - } - }, - "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", - "dev": true, - "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - }, - "npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "2.0.1" - } - }, - "npmlog": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", - "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", - "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" - } - }, - "nth-check": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", - "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", - "dev": true, - "requires": { - "boolbase": "1.0.0" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "nwmatcher": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", - "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", - "dev": true - }, - "nyc": { - "version": "11.2.1", - "resolved": "https://registry.npmjs.org/nyc/-/nyc-11.2.1.tgz", - "integrity": "sha1-rYUK/p261/SXByi0suR/7Rw4chw=", - "dev": true, - "requires": { - "archy": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "caching-transform": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "convert-source-map": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "debug-log": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "find-cache-dir": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "istanbul-lib-hook": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "istanbul-lib-instrument": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "istanbul-lib-report": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "istanbul-lib-source-maps": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "istanbul-reports": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "merge-source-map": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "resolve-from": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "spawn-wrap": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", - "test-exclude": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz" - }, - "dependencies": { - "align-text": { - "version": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "longest": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - } - }, - "amdefine": { - "version": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", - "dev": true - }, - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "append-transform": { - "version": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", - "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", - "dev": true, - "requires": { - "default-require-extensions": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz" - } - }, - "archy": { - "version": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", - "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", - "dev": true - }, - "arr-diff": { - "version": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", - "dev": true, - "requires": { - "arr-flatten": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz" - } - }, - "arr-flatten": { - "version": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", - "dev": true - }, - "array-unique": { - "version": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true - }, - "arrify": { - "version": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - }, - "async": { - "version": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - }, - "babel-code-frame": { - "version": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - } - }, - "babel-generator": { - "version": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", - "dev": true, - "requires": { - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "detect-indent": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "jsesc": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "trim-right": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz" - } - }, - "babel-messages": { - "version": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz" - } - }, - "babel-runtime": { - "version": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", - "dev": true, - "requires": { - "core-js": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "regenerator-runtime": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz" - } - }, - "babel-template": { - "version": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - }, - "babel-traverse": { - "version": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", - "dev": true, - "requires": { - "babel-code-frame": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "babel-messages": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "globals": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "invariant": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz" - } - }, - "babel-types": { - "version": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", - "dev": true, - "requires": { - "babel-runtime": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "esutils": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "lodash": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "to-fast-properties": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz" - } - }, - "babylon": { - "version": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha1-ry87iPpvXB5MY00aD46sT1WzleM=", - "dev": true - }, - "balanced-match": { - "version": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "brace-expansion": { - "version": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "dev": true, - "requires": { - "balanced-match": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "concat-map": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" - } - }, - "braces": { - "version": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", - "dev": true, - "requires": { - "expand-range": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "preserve": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz" - } - }, - "builtin-modules": { - "version": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, - "caching-transform": { - "version": "https://registry.npmjs.org/caching-transform/-/caching-transform-1.0.1.tgz", - "integrity": "sha1-bb2y8g+Nj7znnz6U6dF0Lc31wKE=", - "dev": true, - "requires": { - "md5-hex": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "write-file-atomic": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz" - } - }, - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", - "dev": true, - "optional": true - }, - "center-align": { - "version": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "optional": true, - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "lazy-cache": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" - } - }, - "chalk": { - "version": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "escape-string-regexp": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "has-ansi": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - } - }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "optional": true, - "requires": { - "center-align": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "right-align": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz" - }, - "dependencies": { - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", - "dev": true, - "optional": true - } - } - }, - "code-point-at": { - "version": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", - "dev": true - }, - "commondir": { - "version": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", - "dev": true - }, - "concat-map": { - "version": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "convert-source-map": { - "version": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", - "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", - "dev": true - }, - "core-js": { - "version": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", - "dev": true - }, - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", - "dev": true, - "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" - } - }, - "debug": { - "version": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", - "dev": true, - "requires": { - "ms": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" - } - }, - "debug-log": { - "version": "https://registry.npmjs.org/debug-log/-/debug-log-1.0.1.tgz", - "integrity": "sha1-IwdjLUwEOCuN+KMvcLiVBG1SdF8=", - "dev": true - }, - "decamelize": { - "version": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", - "dev": true - }, - "default-require-extensions": { - "version": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", - "integrity": "sha1-836hXT4T/9m0N9M+GnW1+5eHTLg=", - "dev": true, - "requires": { - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "detect-indent": { - "version": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz" - } - }, - "error-ex": { - "version": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", - "dev": true, - "requires": { - "is-arrayish": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" - } - }, - "escape-string-regexp": { - "version": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "esutils": { - "version": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "execa": { - "version": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "get-stream": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "is-stream": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "npm-run-path": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "p-finally": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "strip-eof": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz" - }, - "dependencies": { - "cross-spawn": { - "version": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "shebang-command": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" - } - } - } - }, - "expand-brackets": { - "version": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz" - } - }, - "expand-range": { - "version": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", - "dev": true, - "requires": { - "fill-range": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz" - } - }, - "extglob": { - "version": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "filename-regex": { - "version": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true - }, - "fill-range": { - "version": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", - "dev": true, - "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "isobject": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "randomatic": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "repeat-element": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "repeat-string": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz" - } - }, - "find-cache-dir": { - "version": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-0.1.1.tgz", - "integrity": "sha1-yN765XyKUqinhPnjHFfHQumToLk=", - "dev": true, - "requires": { - "commondir": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "pkg-dir": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz" - } - }, - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz" - } - }, - "for-in": { - "version": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" - } - }, - "foreground-child": { - "version": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", - "dev": true, - "requires": { - "cross-spawn": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz" - } - }, - "fs.realpath": { - "version": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "get-caller-file": { - "version": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", - "dev": true - }, - "get-stream": { - "version": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", - "dev": true - }, - "glob": { - "version": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", - "dev": true, - "requires": { - "fs.realpath": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "inflight": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "inherits": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "path-is-absolute": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" - } - }, - "glob-base": { - "version": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", - "dev": true, - "requires": { - "glob-parent": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - } - }, - "glob-parent": { - "version": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", - "dev": true, - "requires": { - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - } - }, - "globals": { - "version": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", - "dev": true - }, - "graceful-fs": { - "version": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true - }, - "handlebars": { - "version": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz", - "integrity": "sha1-PTDHGLCaPZbyPqTMH0A8TTup/08=", - "dev": true, - "requires": { - "async": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "optimist": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "uglify-js": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz" - }, - "dependencies": { - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", - "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", - "dev": true, - "requires": { - "amdefine": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz" - } - } - } - }, - "has-ansi": { - "version": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "has-flag": { - "version": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "hosted-git-info": { - "version": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha1-bWDjSzq7yDEwYsO3mO+NkBoHrzw=", - "dev": true - }, - "imurmurhash": { - "version": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "inherits": { - "version": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "invariant": { - "version": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", - "dev": true, - "requires": { - "loose-envify": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz" - } - }, - "invert-kv": { - "version": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", - "dev": true - }, - "is-arrayish": { - "version": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", - "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", - "dev": true - }, - "is-builtin-module": { - "version": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", - "dev": true, - "requires": { - "builtin-modules": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz" - } - }, - "is-dotfile": { - "version": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-equal-shallow": { - "version": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz" - } - }, - "is-extendable": { - "version": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-finite": { - "version": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz" - } - }, - "is-glob": { - "version": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz" - } - }, - "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - } - }, - "is-posix-bracket": { - "version": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true - }, - "is-stream": { - "version": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-utf8": { - "version": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true - }, - "isarray": { - "version": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" - } - }, - "istanbul-lib-coverage": { - "version": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "integrity": "sha1-c7+5mIhSmUFck9OKPprfeEp3qdo=", - "dev": true - }, - "istanbul-lib-hook": { - "version": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz", - "integrity": "sha1-3WYH8DB2V4/n1vKmMM8UO0m6zdw=", - "dev": true, - "requires": { - "append-transform": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz" - } - }, - "istanbul-lib-instrument": { - "version": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.8.0.tgz", - "integrity": "sha1-ZvbJQhzJ7EcE928tsIS6kHiitTI=", - "dev": true, - "requires": { - "babel-generator": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "babel-template": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "babel-traverse": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "babel-types": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "babylon": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz" - } - }, - "istanbul-lib-report": { - "version": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz", - "integrity": "sha1-8OVfVmVf+jQiIIC3oM1HYOFAX8k=", - "dev": true, - "requires": { - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "path-parse": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "supports-color": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz" - }, - "dependencies": { - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz" - } - } - } - }, - "istanbul-lib-source-maps": { - "version": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz", - "integrity": "sha1-pv4ay6jOCO68Y45XLilNJnAIqgw=", - "dev": true, - "requires": { - "debug": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", - "istanbul-lib-coverage": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - } - }, - "istanbul-reports": { - "version": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.1.2.tgz", - "integrity": "sha1-D7Lj9qqZIr085F0F2KtNXo4HvU8=", - "dev": true, - "requires": { - "handlebars": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.10.tgz" - } - }, - "js-tokens": { - "version": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "jsesc": { - "version": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", - "dev": true - }, - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" - } - }, - "lazy-cache": { - "version": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", - "dev": true, - "optional": true - }, - "lcid": { - "version": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "dev": true, - "requires": { - "invert-kv": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz" - } - }, - "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz" - } - }, - "locate-path": { - "version": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" - }, - "dependencies": { - "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - } - } - }, - "lodash": { - "version": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", - "dev": true - }, - "longest": { - "version": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", - "dev": true - }, - "loose-envify": { - "version": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", - "dev": true, - "requires": { - "js-tokens": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz" - } - }, - "lru-cache": { - "version": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", - "dev": true, - "requires": { - "pseudomap": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "yallist": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" - } - }, - "md5-hex": { - "version": "https://registry.npmjs.org/md5-hex/-/md5-hex-1.3.0.tgz", - "integrity": "sha1-0sSv6YPENwZiF5uMrRRSGRNQRsQ=", - "dev": true, - "requires": { - "md5-o-matic": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz" - } - }, - "md5-o-matic": { - "version": "https://registry.npmjs.org/md5-o-matic/-/md5-o-matic-0.1.1.tgz", - "integrity": "sha1-givM1l4RfFFPqxdrJZRdVBAKA8M=", - "dev": true - }, - "mem": { - "version": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", - "dev": true, - "requires": { - "mimic-fn": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz" - } - }, - "merge-source-map": { - "version": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", - "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", - "dev": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" - } - }, - "micromatch": { - "version": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "array-unique": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "braces": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "expand-brackets": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "extglob": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "filename-regex": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "normalize-path": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "object.omit": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "parse-glob": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "regex-cache": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz" - } - }, - "mimic-fn": { - "version": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz", - "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg=", - "dev": true - }, - "minimatch": { - "version": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", - "dev": true, - "requires": { - "brace-expansion": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz" - } - }, - "minimist": { - "version": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mkdirp": { - "version": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz" - } - }, - "ms": { - "version": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - }, - "normalize-package-data": { - "version": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha1-EvlaMH1YNSB1oEkHuErIvpisAS8=", - "dev": true, - "requires": { - "hosted-git-info": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "is-builtin-module": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "semver": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "validate-npm-package-license": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz" - } - }, - "normalize-path": { - "version": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz" - } - }, - "npm-run-path": { - "version": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", - "dev": true, - "requires": { - "path-key": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz" - } - }, - "number-is-nan": { - "version": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object.omit": { - "version": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "is-extendable": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" - } - }, - "once": { - "version": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" - } - }, - "optimist": { - "version": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", - "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", - "dev": true, - "requires": { - "minimist": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "wordwrap": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - } - }, - "os-homedir": { - "version": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-locale": { - "version": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha1-QrwpAKa1uL0XN2yOiCtlr8zyS/I=", - "dev": true, - "requires": { - "execa": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "lcid": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "mem": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz" - } - }, - "p-finally": { - "version": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz" - } - }, - "parse-glob": { - "version": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "is-dotfile": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "is-extglob": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "is-glob": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz" - } - }, - "parse-json": { - "version": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz" - } - }, - "path-exists": { - "version": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "path-is-absolute": { - "version": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-key": { - "version": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - }, - "pify": { - "version": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pinkie": { - "version": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", - "dev": true - }, - "pinkie-promise": { - "version": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" - } - }, - "pkg-dir": { - "version": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz", - "integrity": "sha1-ektQio1bstYp1EcFb/TpyTFM89Q=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz" - }, - "dependencies": { - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - } - } - }, - "preserve": { - "version": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pseudomap": { - "version": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "randomatic": { - "version": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", - "dev": true, - "requires": { - "is-number": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz" - }, - "dependencies": { - "is-number": { - "version": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" - }, - "dependencies": { - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" - } - } - } - }, - "kind-of": { - "version": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz" - } - } - } - }, - "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "dev": true, - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz" - } - }, - "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz" - }, - "dependencies": { - "find-up": { - "version": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "pinkie-promise": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" - } - } - } - }, - "regenerator-runtime": { - "version": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha1-flT+W1zNXWYk6mJVw0c74JC4AuE=", - "dev": true - }, - "regex-cache": { - "version": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", - "dev": true, - "requires": { - "is-equal-shallow": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz" - } - }, - "remove-trailing-separator": { - "version": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "repeating": { - "version": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz" - } - }, - "require-directory": { - "version": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve-from": { - "version": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz", - "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c=", - "dev": true - }, - "right-align": { - "version": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "optional": true, - "requires": { - "align-text": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz" - } - }, - "rimraf": { - "version": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", - "dev": true, - "requires": { - "glob": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz" - } - }, - "semver": { - "version": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha1-4FnAnYVx8FQII3M0M1BdOi8AsY4=", - "dev": true - }, - "set-blocking": { - "version": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", - "dev": true - }, - "shebang-command": { - "version": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" - } - }, - "shebang-regex": { - "version": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "signal-exit": { - "version": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slide": { - "version": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", - "dev": true - }, - "source-map": { - "version": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "spawn-wrap": { - "version": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.3.8.tgz", - "integrity": "sha1-+ip5uZDLsLsAGNymdI2INnsZ7DE=", - "dev": true, - "requires": { - "foreground-child": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", - "mkdirp": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "os-homedir": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "rimraf": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", - "signal-exit": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "which": "https://registry.npmjs.org/which/-/which-1.3.0.tgz" - } - }, - "spdx-correct": { - "version": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz" - } - }, - "spdx-expression-parse": { - "version": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", - "dev": true, - "requires": { - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" - }, - "dependencies": { - "ansi-regex": { - "version": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "is-fullwidth-code-point": { - "version": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz" - } - } - } - }, - "strip-ansi": { - "version": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", - "dev": true, - "requires": { - "is-utf8": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz" - } - }, - "strip-eof": { - "version": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "supports-color": { - "version": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "test-exclude": { - "version": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.1.1.tgz", - "integrity": "sha1-TYSWSwlmsAh+zDNKLOAC09k0HiY=", - "dev": true, - "requires": { - "arrify": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "micromatch": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "object-assign": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz" - } - }, - "to-fast-properties": { - "version": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", - "dev": true - }, - "trim-right": { - "version": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", - "dev": true - }, - "uglify-js": { - "version": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "optional": true, - "requires": { - "source-map": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "uglify-to-browserify": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "yargs": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz" - }, - "dependencies": { - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "optional": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "window-size": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz" - } - } - } - }, - "uglify-to-browserify": { - "version": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "validate-npm-package-license": { - "version": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "spdx-expression-parse": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz" - } - }, - "which": { - "version": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", - "dev": true, - "requires": { - "isexe": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" - } - }, - "which-module": { - "version": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "window-size": { - "version": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true, - "optional": true - }, - "wordwrap": { - "version": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", - "dev": true - }, - "wrap-ansi": { - "version": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - }, - "dependencies": { - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } - } - } - }, - "wrappy": { - "version": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write-file-atomic": { - "version": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.4.tgz", - "integrity": "sha1-+Aek8LHZ6ROuekgRLmzDrxmRtF8=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "imurmurhash": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "slide": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz" - } - }, - "y18n": { - "version": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "cliui": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "decamelize": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "get-caller-file": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "os-locale": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "read-pkg-up": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "require-directory": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "require-main-filename": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "set-blocking": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "string-width": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "which-module": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "y18n": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "yargs-parser": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz" - }, - "dependencies": { - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "wrap-ansi": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz" - }, - "dependencies": { - "string-width": { - "version": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "is-fullwidth-code-point": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "strip-ansi": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - } - } - } - }, - "load-json-file": { - "version": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "parse-json": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "strip-bom": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" - } - }, - "path-type": { - "version": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - } - }, - "read-pkg": { - "version": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "normalize-package-data": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "path-type": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz" - } - }, - "read-pkg-up": { - "version": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "read-pkg": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz" - } - }, - "strip-bom": { - "version": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz" - } - } - } - }, - "yargs-parser": { - "version": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.0.tgz", - "integrity": "sha1-J17PDX/+Bcd+ZOfIbkzZS/DhIoo=", - "dev": true, - "requires": { - "camelcase": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz" - }, - "dependencies": { - "camelcase": { - "version": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - } - } - } - } - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" - }, - "object-is": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.0.1.tgz", - "integrity": "sha1-CqYOyZiaCz7Xlc9NBvYs8a1lObY=", - "dev": true - }, - "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", - "dev": true - }, - "object.assign": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.0.4.tgz", - "integrity": "sha1-scnMBE7xuf5jYG/BQau7MuFHMMw=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "function-bind": "1.1.1", - "object-keys": "1.0.11" - } - }, - "object.entries": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.0.4.tgz", - "integrity": "sha1-G/mk3SKI9bM/Opk9JXZh8F0WGl8=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "1.0.1" - } - }, - "object.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", - "dev": true, - "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" - } - }, - "object.values": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", - "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", - "dev": true, - "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.9.0", - "function-bind": "1.1.1", - "has": "1.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1.0.2" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } - }, - "os-browserify": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.2.1.tgz", - "integrity": "sha1-Y/xMzuXS13Y9Jrv4YBB45sLgBE8=", - "dev": true - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", - "dev": true, - "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", - "dev": true - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "1.1.0" - } - }, - "p-map": { - "version": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha1-5OlPMR6rvIYzoeeZCBZfyiYkG2s=", - "dev": true - }, - "pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", - "dev": true - }, - "param-case": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz", - "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", - "dev": true, - "requires": { - "no-case": "2.3.2" - } - }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", - "dev": true, - "requires": { - "asn1.js": "4.9.1", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" - } - }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", - "dev": true, - "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "1.3.1" - } - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "parse5": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.2.tgz", - "integrity": "sha1-Be/1fw70V3+xRKefi5qWemzERRA=", - "dev": true, - "requires": { - "@types/node": "6.0.88" - } - }, - "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true - }, - "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", - "dev": true - }, - "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", - "dev": true, - "requires": { - "isarray": "0.0.1" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - } - } - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "2.3.0" - } - }, - "pathval": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", - "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", - "dev": true - }, - "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", - "dev": true, - "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" - } - }, - "performance-now": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", - "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=" - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pn": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/pn/-/pn-1.0.0.tgz", - "integrity": "sha1-HPWjCw2AbNGPiPxBprXUrWFbO6k=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, - "pretty-error": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz", - "integrity": "sha1-X0+HyPkeWuPzuoerTPXgOxoX8aM=", - "dev": true, - "requires": { - "renderkid": "2.0.1", - "utila": "0.4.0" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", - "dev": true - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "promise": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", - "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", - "dev": true, - "requires": { - "asap": "2.0.6" - } - }, - "prop-types": { - "version": "15.6.0", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.6.0.tgz", - "integrity": "sha1-zq8IMCL8RrSjX2nhPvda7Q1jmFY=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1" - } - }, - "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", - "dev": true, - "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", - "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=" - }, - "querystring": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", - "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", - "dev": true - }, - "querystring-es3": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", - "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", - "dev": true - }, - "raf": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.0.tgz", - "integrity": "sha512-pDP/NMRAXoTfrhCfyfSEwJAKLaxBU9eApMeBPB1TkDouZmvPerIClV8lTAd+uF8ZiTaVl69e1FCxQrAd/VTjGw==", - "dev": true, - "requires": { - "performance-now": "2.1.0" - }, - "dependencies": { - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", - "dev": true - } - } - }, - "railroad-diagrams": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz", - "integrity": "sha1-635iZ1SN3t+4mcG5Dlc3RVnN234=", - "dev": true - }, - "randexp": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.4.6.tgz", - "integrity": "sha512-80WNmd9DA0tmZrw9qQa62GPPWfuXJknrmVmLcxvq4uZBdYqb1wYoKTmnlGUchvVWe0XiLupYkBoXVOxz3C8DYQ==", - "dev": true, - "requires": { - "discontinuous-range": "1.0.0", - "ret": "0.1.15" - } - }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": true, - "requires": { - "is-number": "3.0.0", - "kind-of": "4.0.0" - }, - "dependencies": { - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.5" - } - } - } - }, - "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - }, - "rc": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", - "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", - "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" - } - } - }, - "react": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react/-/react-16.0.0.tgz", - "integrity": "sha1-zn348ZQbA28Cssyp29DLHw6FXi0=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" - } - }, - "react-dom": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.0.0.tgz", - "integrity": "sha1-nMMHnD3NcNTG4BuEqrKn40wwP1g=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "loose-envify": "1.3.1", - "object-assign": "4.1.1", - "prop-types": "15.6.0" - } - }, - "react-test-renderer": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-16.0.0.tgz", - "integrity": "sha1-n+e4MI8vcfKfw1bUECCG8THJyxU=", - "dev": true, - "requires": { - "fbjs": "0.8.16", - "object-assign": "4.1.1" - } - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - } - }, - "reflect-metadata": { - "version": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", - "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" - }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", - "dev": true, - "requires": { - "is-equal-shallow": "0.1.3" - } - }, - "relateurl": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "renderkid": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-2.0.1.tgz", - "integrity": "sha1-iYyr/Ivt5Le5ETWj/9Mj5YwNsxk=", - "dev": true, - "requires": { - "css-select": "1.2.0", - "dom-converter": "0.1.4", - "htmlparser2": "3.3.0", - "strip-ansi": "3.0.1", - "utila": "0.3.3" - }, - "dependencies": { - "domhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz", - "integrity": "sha1-0mRvXlf2w7qxHPbLBdPArPdBJZQ=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "domutils": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz", - "integrity": "sha1-vdw94Jm5ou+sxRxiPyj0FuzFdIU=", - "dev": true, - "requires": { - "domelementtype": "1.3.0" - } - }, - "htmlparser2": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz", - "integrity": "sha1-zHDQWln2VC5D8OaFyYLhTJJKnv4=", - "dev": true, - "requires": { - "domelementtype": "1.3.0", - "domhandler": "2.1.0", - "domutils": "1.1.6", - "readable-stream": "1.0.34" - } - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", - "dev": true - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", - "dev": true - }, - "utila": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.3.3.tgz", - "integrity": "sha1-1+jn1+MJEHCSsF+NloiCTWM6QiY=", - "dev": true - } - } - }, - "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "request": { - "version": "2.81.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", - "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", - "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "request-promise-core": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.1.tgz", - "integrity": "sha1-Pu4AssWqgyOc+wTFcA2jb4HNCLY=", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - }, - "request-promise-native": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.5.tgz", - "integrity": "sha1-UoF3D2jgyXGeUWP9P6tIIhX0/aU=", - "dev": true, - "requires": { - "request-promise-core": "1.1.1", - "stealthy-require": "1.1.1", - "tough-cookie": "2.3.3" - } - }, - "require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", - "dev": true - }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, - "resolve": { - "version": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", - "dev": true, - "requires": { - "path-parse": "1.0.5" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, - "requires": { - "align-text": "0.1.4" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.1" - } - }, - "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", - "dev": true, - "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" - } - }, - "rst-selector-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/rst-selector-parser/-/rst-selector-parser-2.2.2.tgz", - "integrity": "sha512-T5yd2bsA+FVQ5xP8Ga62gXjOnEaMsYhbbslVB+Fe4R9lAZiF7DfTHRyBpV9xEZ772LwstCdDdkHkvkWIr47X8g==", - "dev": true, - "requires": { - "lodash.flattendeep": "4.4.0", - "nearley": "2.11.0" - } - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha1-jR2TUOJWItow3j5EumkrUiGrfFA=", - "dev": true - }, - "sax": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", - "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", - "dev": true - }, - "sb-promisify": { - "version": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz", - "integrity": "sha1-QnelR1RIiqlnXYhuNU24lMm9yYE=", - "dev": true - }, - "sb-scandir": { - "version": "https://registry.npmjs.org/sb-scandir/-/sb-scandir-2.0.0.tgz", - "integrity": "sha1-oCrR+kSovSv68wGT0U0jwvNatrI=", - "dev": true, - "requires": { - "p-map": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "sb-promisify": "https://registry.npmjs.org/sb-promisify/-/sb-promisify-2.0.2.tgz" - } - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "set-blocking": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", - "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" - }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "dev": true - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", - "dev": true - }, - "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "shell-escape": { - "version": "https://registry.npmjs.org/shell-escape/-/shell-escape-0.2.0.tgz", - "integrity": "sha1-aP0CXrBJC09WegJ/C/IkgLX4QTM=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" - }, - "sinon": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.1.tgz", - "integrity": "sha512-4qIY0pCWCvGCJpV/1JkFu9kbsNEZ9O34cG1oru/c7OCDtrEs50Gq/VjkA2ID5ZwLyoNx1i1ws118oh/p6fVeDg==", - "dev": true, - "requires": { - "diff": "3.2.0", - "formatio": "1.2.0", - "lodash.get": "4.4.2", - "lolex": "2.1.3", - "native-promise-only": "0.8.1", - "nise": "1.1.1", - "path-to-regexp": "1.7.0", - "samsam": "1.3.0", - "text-encoding": "0.6.4", - "type-detect": "4.0.3" - } - }, - "sntp": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", - "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", - "requires": { - "hoek": "2.16.3" - } - }, - "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=", - "dev": true - }, - "source-map-support": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.0.tgz", - "integrity": "sha1-IBinrSvfj68mkeX92rJr7VorrKs=", - "dev": true, - "requires": { - "source-map": "0.6.1" - } - }, - "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", - "dev": true, - "requires": { - "spdx-license-ids": "1.2.2" - } - }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", - "dev": true - }, - "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", - "dev": true - }, - "ssh2": { - "version": "https://registry.npmjs.org/ssh2/-/ssh2-0.5.5.tgz", - "integrity": "sha1-x3gezS7OcwSiU89iD6taXCK7IjU=", - "dev": true, - "requires": { - "ssh2-streams": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.19.tgz" - } - }, - "ssh2-streams": { - "version": "https://registry.npmjs.org/ssh2-streams/-/ssh2-streams-0.1.19.tgz", - "integrity": "sha1-+A7OzC3ho54apkRphR7DK8lrg/k=", - "dev": true, - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "semver": "5.4.1", - "streamsearch": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz" - } - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "stealthy-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz", - "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=", - "dev": true - }, - "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" - } - }, - "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", - "dev": true, - "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" - } - }, - "streamsearch": { - "version": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=", - "dev": true - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-eof": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=" - }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha1-iD992rwWUUKyphQn8zUt7RldGj4=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - }, - "symbol-tree": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", - "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", - "dev": true - }, - "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "tar": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", - "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", - "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", - "requires": { - "debug": "2.6.9", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.3.3", - "rimraf": "2.6.2", - "tar": "2.2.1", - "uid-number": "0.0.6" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - } - } - }, - "text-encoding": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", - "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", - "dev": true - }, - "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", - "dev": true, - "requires": { - "setimmediate": "1.0.5" - } - }, - "to-arraybuffer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", - "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", - "dev": true - }, - "toposort": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/toposort/-/toposort-1.0.6.tgz", - "integrity": "sha1-wxdI5V0hDv/AD9zcfW5o19e7nOw=", - "dev": true - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - }, - "tr46": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", - "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=", - "dev": true, - "requires": { - "punycode": "2.1.0" - }, - "dependencies": { - "punycode": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.0.tgz", - "integrity": "sha1-X4Y+3Im5bbCQdLrXlHvwkFbKTn0=", - "dev": true - } - } - }, - "ts-loader": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-2.3.7.tgz", - "integrity": "sha512-8t3bu2FcEkXb+D4L+Cn8qiK2E2C6Ms4/GQChvz6IMbVurcFHLXrhW4EMtfaol1a1ASQACZGDUGit4NHnX9g7hQ==", - "dev": true, - "requires": { - "chalk": "2.2.0", - "enhanced-resolve": "3.4.1", - "loader-utils": "1.1.0", - "semver": "5.4.1" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.2.0.tgz", - "integrity": "sha512-0BMM/2hG3ZaoPfR6F+h/oWpZtsh3b/s62TjSM6MGCJWEbJDN1acqCXvyhhZsDSVFklpebUoQ5O1kKC7lOzrn9g==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - } - } - }, - "ts-node": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-3.3.0.tgz", - "integrity": "sha1-wTxqMCTjC+EYDdUwOPwgkonUv2k=", - "dev": true, - "requires": { - "arrify": "1.0.1", - "chalk": "2.1.0", - "diff": "3.2.0", - "make-error": "1.3.0", - "minimist": "1.2.0", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18", - "tsconfig": "6.0.0", - "v8flags": "3.0.1", - "yn": "2.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", - "dev": true, - "requires": { - "color-convert": "1.9.0" - } - }, - "chalk": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.1.0.tgz", - "integrity": "sha1-rFvs8U+iG5nGySynp9fP1bF+dD4=", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.4.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-support": { - "version": "0.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", - "dev": true, - "requires": { - "source-map": "0.5.7" - } - } - } - }, - "tsconfig": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-6.0.0.tgz", - "integrity": "sha1-aw6DdgA9evGGT434+J3QBZ/80DI=", - "dev": true, - "requires": { - "strip-bom": "3.0.0", - "strip-json-comments": "2.0.1" - } - }, - "tslib": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", - "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=", - "dev": true - }, - "tslint": { - "version": "5.7.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.7.0.tgz", - "integrity": "sha1-wl4NDJL6EgHCvDDoROCOaCtPNVI=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "colors": "1.1.2", - "commander": "2.9.0", - "diff": "3.2.0", - "glob": "7.1.1", - "minimatch": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "resolve": "https://registry.npmjs.org/resolve/-/resolve-1.4.0.tgz", - "semver": "5.4.1", - "tslib": "1.7.1", - "tsutils": "2.11.2" - } - }, - "tslint-react": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/tslint-react/-/tslint-react-3.2.0.tgz", - "integrity": "sha1-hR+1BSAcY9A0PFFybmNk9+mtLpk=", - "dev": true, - "requires": { - "tsutils": "2.11.2" - } - }, - "tsutils": { - "version": "2.11.2", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.11.2.tgz", - "integrity": "sha1-YBNgHjb6FP+VhBPlQdQn+4xqw0E=", - "dev": true, - "requires": { - "tslib": "1.7.1" - } - }, - "tty-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", - "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", - "dev": true - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "1.1.2" - } - }, - "type-detect": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", - "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", - "dev": true - }, - "typescript": { - "version": "2.5.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.5.3.tgz", - "integrity": "sha1-3z3Nw48764ANS8MiZGsEo/bKfw0=", - "dev": true - }, - "ua-parser-js": { - "version": "0.7.17", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.17.tgz", - "integrity": "sha512-uRdSdu1oA1rncCQL7sCj8vSyZkgtL7faaw9Tc9rZ3mGgraQ7+Pdx7w5mnOSF3gw9ZNG6oc+KXfkon3bKuROm0g==", - "dev": true - }, - "uglify-js": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.1.4.tgz", - "integrity": "sha512-DcbkPg11Lw2lAWpwCmQDX+qoR4JiII6ypsQmF6tscZtlxGPFAmSRUGuMoVT3/0EHqypVik/TpkH4ITiMJeQqQA==", - "dev": true, - "requires": { - "commander": "2.11.0", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - } - } - }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true - }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } - } - } - }, - "uid-number": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", - "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" - }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", - "dev": true - }, - "upper-case": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", - "dev": true - }, - "url": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", - "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", - "dev": true, - "requires": { - "punycode": "1.3.2", - "querystring": "0.2.0" - }, - "dependencies": { - "punycode": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", - "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", - "dev": true - } - } - }, - "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", - "dev": true, - "requires": { - "inherits": "2.0.1" - }, - "dependencies": { - "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", - "dev": true - } - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "utila": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha1-ihagXURWV6Oupe7MWxKk+lN5dyw=", - "dev": true - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "v8flags": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.0.1.tgz", - "integrity": "sha1-3Oj8N5wX2fLJ6e142JzgAFKxt2s=", - "dev": true, - "requires": { - "homedir-polyfill": "1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", - "dev": true, - "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - } - } - }, - "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } - }, - "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", - "dev": true, - "requires": { - "async": "2.5.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - } - }, - "webidl-conversions": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", - "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==", - "dev": true - }, - "webpack": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.8.1.tgz", - "integrity": "sha512-5ZXLWWsMqHKFr5y0N3Eo5IIisxeEeRAajNq4mELb/WELOR7srdbQk2N5XiyNy2A/AgvlR3AmeBCZJW8lHrolbw==", - "dev": true, - "requires": { - "acorn": "5.1.2", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.2.3", - "ajv-keywords": "2.1.0", - "async": "2.5.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.0.4", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.0.0", - "source-map": "0.5.7", - "supports-color": "4.4.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.0.1", - "yargs": "8.0.2" - }, - "dependencies": { - "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", - "dev": true, - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", - "dev": true, - "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "webpack-sources": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.0.1.tgz", - "integrity": "sha512-05tMxipUCwHqYaVS8xc7sYPTly8PzXayRCB4dTxLhWTqlKUiwH6ezmEe0OSreL1c30LAuA3Zqmc+uEBUGFJDjw==", - "dev": true, - "requires": { - "source-list-map": "2.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } - }, - "whatwg-encoding": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.1.tgz", - "integrity": "sha1-PGxFGhmO567FWx7GHQkgxngBpfQ=", - "dev": true, - "requires": { - "iconv-lite": "0.4.13" - }, - "dependencies": { - "iconv-lite": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", - "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", - "dev": true - } - } - }, - "whatwg-fetch": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz", - "integrity": "sha1-nITsLc9oGH/wC8ZOEnS0QhduHIQ=", - "dev": true - }, - "whatwg-url": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.3.0.tgz", - "integrity": "sha512-rM+hE5iYKGPAOu05mIdJR47pYSR2vDzfrTEFRc/S8D3L60yW8BuXmUJ7Kog7x/DrokFN7JNaHKadpzjouKRRAw==", - "dev": true, - "requires": { - "lodash.sortby": "4.7.0", - "tr46": "1.0.1", - "webidl-conversions": "4.0.2" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, - "requires": { - "isexe": "2.0.0" - } - }, - "which-module": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", - "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", - "dev": true - }, - "wide-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", - "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", - "requires": { - "string-width": "1.0.2" - } - }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "dev": true - }, - "xml-name-validator": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", - "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", - "dev": true - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "dev": true, - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" - }, - "dependencies": { - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "3.0.0" - } - } - } - } - } - }, - "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", - "dev": true, - "requires": { - "camelcase": "4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", - "dev": true - } - } - }, - "yn": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yn/-/yn-2.0.0.tgz", - "integrity": "sha1-5a2ryKz0CPY4X8dklWhMiOavaJo=", - "dev": true - } - } -} From fd803da1f004ebb7c8b344b6959f6366ef3accb1 Mon Sep 17 00:00:00 2001 From: "dominic.griesel" Date: Fri, 27 Oct 2017 16:04:28 +0200 Subject: [PATCH 42/51] removed a bunch of unneccessary imports --- build/ipso/ipsoObject.js | 8 ++++---- build/ipso/light.js | 6 +++--- build/modules/conversions.js | 4 ++-- build/modules/message.js | 2 -- src/ipso/group.test.ts | 2 +- src/ipso/ipsoObject.ts | 8 ++++---- src/ipso/light.ts | 7 +++---- src/main.ts | 9 +++------ src/modules/conversions.test.ts | 2 +- src/modules/conversions.ts | 7 +++---- src/modules/gateway.ts | 2 +- src/modules/groups.ts | 5 ++--- src/modules/message.ts | 10 ++++------ src/modules/operations.ts | 2 +- 14 files changed, 32 insertions(+), 42 deletions(-) diff --git a/build/ipso/ipsoObject.js b/build/ipso/ipsoObject.js index 1034ba7d..95ebd52f 100644 --- a/build/ipso/ipsoObject.js +++ b/build/ipso/ipsoObject.js @@ -306,7 +306,7 @@ class IPSOObject { reference.isProxy) reference = reference.unproxy(); const ret = {}; - const serializeValue = (key, propName, value, refValue, transform) => { + const serializeValue = (propName, value, refValue, transform) => { const _required = isRequired(this, propName); let _ret = value; if (value instanceof IPSOObject) { @@ -359,11 +359,11 @@ class IPSOObject { throw new Error("cannot serialize arrays when the reference values don't match"); } // serialize each item with the matching reference value - value = value.map((v, i) => serializeValue(key, propName, v, refValue[i], serializer)); + value = value.map((v, i) => serializeValue(propName, v, refValue[i], serializer)); } else { // no reference value, makes things easier - value = value.map(v => serializeValue(key, propName, v, null, serializer)); + value = value.map(v => serializeValue(propName, v, null, serializer)); } // now remove null items value = value.filter(v => v != null); @@ -372,7 +372,7 @@ class IPSOObject { } else { // directly serialize the value - value = serializeValue(key, propName, value, refValue, serializer); + value = serializeValue(propName, value, refValue, serializer); } // only output the value if it's != null if (value != null) diff --git a/build/ipso/light.js b/build/ipso/light.js index 7ce8b1e5..99547c14 100644 --- a/build/ipso/light.js +++ b/build/ipso/light.js @@ -171,7 +171,7 @@ function createWhiteSpectrumProxy() { default: return me[key]; } }, - set: (me, key, value, receiver) => { + set: (me, key, value) => { switch (key) { case "colorTemperature": { me.colorX = conversions_1.conversions.whiteSpectrumToColorX(value); @@ -205,12 +205,12 @@ function createRGBProxy() { } case "hue": { const { r, g, b } = conversions_1.conversions.rgbFromString(get(me, "color")); - const { h, s, v } = conversions_1.conversions.rgbToHSV(r, g, b); + const { h } = conversions_1.conversions.rgbToHSV(r, g, b); return h; } case "saturation": { const { r, g, b } = conversions_1.conversions.rgbFromString(get(me, "color")); - const { h, s, v } = conversions_1.conversions.rgbToHSV(r, g, b); + const { s } = conversions_1.conversions.rgbToHSV(r, g, b); return Math.round(s * 100); } default: return me[key]; diff --git a/build/modules/conversions.js b/build/modules/conversions.js index 503e94ce..3c71a6e9 100644 --- a/build/modules/conversions.js +++ b/build/modules/conversions.js @@ -171,7 +171,7 @@ const hue_out = (value, light) => { return math_1.roundTo(value / 360 * predefined_colors_1.MAX_COLOR, 0); }; // interpolate hue from [0..COLOR_MAX] to [0..360] -const hue_in = (value, light) => { +const hue_in = (value /*, light: Light*/) => { value = math_1.clamp(value / predefined_colors_1.MAX_COLOR, 0, 1); return math_1.roundTo(value * 360, 0); }; @@ -183,7 +183,7 @@ const saturation_out = (value, light) => { return math_1.roundTo(value / 100 * predefined_colors_1.MAX_COLOR, 0); }; // interpolate saturation from [0..COLOR_MAX] to [0..100%] -const saturation_in = (value, light) => { +const saturation_in = (value /*, light: Light*/) => { value = math_1.clamp(value / predefined_colors_1.MAX_COLOR, 0, 1); return math_1.roundTo(value * 100, 0); }; diff --git a/build/modules/message.js b/build/modules/message.js index d80f8744..007ce0a5 100644 --- a/build/modules/message.js +++ b/build/modules/message.js @@ -78,8 +78,6 @@ function onMessage(obj) { return; } case "addVirtualGroup": { - // check the given params - const params = obj.message; // calculate the next ID const nextID = Math.max(0, ...Object.keys(gateway_1.gateway.virtualGroups).map(k => +k)) + 1; // create the group diff --git a/src/ipso/group.test.ts b/src/ipso/group.test.ts index 48a57930..20b8eff0 100644 --- a/src/ipso/group.test.ts +++ b/src/ipso/group.test.ts @@ -2,7 +2,7 @@ // tslint:disable-next-line:no-var-requires require("reflect-metadata"); -import { assert, expect } from "chai"; +import { expect } from "chai"; import { Group } from "./group"; // tslint:disable:no-unused-expression diff --git a/src/ipso/ipsoObject.ts b/src/ipso/ipsoObject.ts index 0a323b2c..b41fdb4f 100644 --- a/src/ipso/ipsoObject.ts +++ b/src/ipso/ipsoObject.ts @@ -324,7 +324,7 @@ export class IPSOObject { const ret = {}; - const serializeValue = (key, propName, value, refValue, transform?: PropertyTransform) => { + const serializeValue = (propName, value, refValue, transform?: PropertyTransform) => { const _required = isRequired(this, propName); let _ret = value; if (value instanceof IPSOObject) { @@ -376,17 +376,17 @@ export class IPSOObject { throw new Error("cannot serialize arrays when the reference values don't match"); } // serialize each item with the matching reference value - value = value.map((v, i) => serializeValue(key, propName, v, refValue[i], serializer)); + value = value.map((v, i) => serializeValue(propName, v, refValue[i], serializer)); } else { // no reference value, makes things easier - value = value.map(v => serializeValue(key, propName, v, null, serializer)); + value = value.map(v => serializeValue(propName, v, null, serializer)); } // now remove null items value = value.filter(v => v != null); if (value.length === 0) value = null; } else { // directly serialize the value - value = serializeValue(key, propName, value, refValue, serializer); + value = serializeValue(propName, value, refValue, serializer); } // only output the value if it's != null diff --git a/src/ipso/light.ts b/src/ipso/light.ts index 312ceb7b..90f0289f 100644 --- a/src/ipso/light.ts +++ b/src/ipso/light.ts @@ -1,7 +1,6 @@ import { conversions, deserializers, serializers } from "../modules/conversions"; import { MAX_COLOR, predefinedColors } from "../modules/predefined-colors"; import { Accessory } from "./accessory"; -import { DeviceInfo } from "./deviceInfo"; import { IPSODevice } from "./ipsoDevice"; import { deserializeWith, doNotSerialize, ipsoKey, IPSOObject, PropertyTransform, required, serializeWith } from "./ipsoObject"; @@ -156,7 +155,7 @@ function createWhiteSpectrumProxy() { default: return me[key]; } }, - set: (me: T, key: PropertyKey, value, receiver) => { + set: (me: T, key: PropertyKey, value) => { switch (key) { case "colorTemperature": { me.colorX = conversions.whiteSpectrumToColorX(value); @@ -191,12 +190,12 @@ function createRGBProxy() { } case "hue": { const {r, g, b} = conversions.rgbFromString(get(me, "color")); - const {h, s, v} = conversions.rgbToHSV(r, g, b); + const {h} = conversions.rgbToHSV(r, g, b); return h; } case "saturation": { const {r, g, b} = conversions.rgbFromString(get(me, "color")); - const {h, s, v} = conversions.rgbToHSV(r, g, b); + const {s} = conversions.rgbToHSV(r, g, b); return Math.round(s * 100); } default: return me[key]; diff --git a/src/main.ts b/src/main.ts index a73beb37..13f18dcd 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,14 +12,11 @@ import { parsePayload } from "./lib/coap-payload"; import { ExtendedAdapter, Global as _ } from "./lib/global"; import { composeObject, DictionaryLike, dig, entries, filter, values } from "./lib/object-polyfill"; import { wait } from "./lib/promises"; -import { str2regex } from "./lib/str2regex"; -import { padStart } from "./lib/strings"; // Datentypen laden import { Accessory, AccessoryTypes } from "./ipso/accessory"; -import { Group, GroupOperation } from "./ipso/group"; -import { LightOperation } from "./ipso/light"; -import { Light, Spectrum } from "./ipso/light"; +import { Group } from "./ipso/group"; +import { LightOperation, Spectrum } from "./ipso/light"; import { Scene } from "./ipso/scene"; import { VirtualGroup } from "./lib/virtual-group"; @@ -29,7 +26,7 @@ import utils from "./lib/utils"; // Adapter-Module laden import { applyCustomObjectSubscriptions, applyCustomStateSubscriptions } from "./modules/custom-subscriptions"; import { gateway as gw, GroupInfo } from "./modules/gateway"; -import { calcGroupId, calcGroupName, extendGroup, groupToCommon, groupToNative } from "./modules/groups"; +import { calcGroupId, calcGroupName, extendGroup } from "./modules/groups"; import { onMessage } from "./modules/message"; import { operateGroup, operateLight, operateVirtualGroup, renameDevice, renameGroup } from "./modules/operations"; diff --git a/src/modules/conversions.test.ts b/src/modules/conversions.test.ts index 9f5c46e1..8c9ba04e 100644 --- a/src/modules/conversions.test.ts +++ b/src/modules/conversions.test.ts @@ -1,6 +1,6 @@ import { expect } from "chai"; import { conversions, deserializers, serializers } from "./conversions"; -import { MAX_COLOR, predefinedColors, whiteSpectrumRange } from "./predefined-colors"; +import { whiteSpectrumRange } from "./predefined-colors"; // tslint:disable:no-unused-expression describe("tradfri/conversions => whiteSpectrum <=> colorX =>", () => { diff --git a/src/modules/conversions.ts b/src/modules/conversions.ts index 59f0282b..b39697e2 100644 --- a/src/modules/conversions.ts +++ b/src/modules/conversions.ts @@ -3,9 +3,8 @@ import { PropertyTransform } from "../ipso/ipsoObject"; import { Light } from "../ipso/light"; import { clamp, findClosestTriangleEdge, Point, pointInTriangle, projectPointOnEdge, roundTo } from "../lib/math"; -import { DictionaryLike } from "../lib/object-polyfill"; import { padStart } from "../lib/strings"; -import { MAX_COLOR, predefinedColors, whiteSpectrumRange, whiteSpectrumTemp } from "./predefined-colors"; +import { MAX_COLOR, whiteSpectrumRange } from "./predefined-colors"; // ========================== // WHITE SPECTRUM conversions @@ -177,7 +176,7 @@ const hue_out: PropertyTransform = (value, light: Light) => { return roundTo(value / 360 * MAX_COLOR, 0); }; // interpolate hue from [0..COLOR_MAX] to [0..360] -const hue_in: PropertyTransform = (value, light: Light) => { +const hue_in: PropertyTransform = (value /*, light: Light*/) => { value = clamp(value / MAX_COLOR, 0, 1); return roundTo(value * 360, 0); }; @@ -190,7 +189,7 @@ const saturation_out: PropertyTransform = (value, light: Light) => { return roundTo(value / 100 * MAX_COLOR, 0); }; // interpolate saturation from [0..COLOR_MAX] to [0..100%] -const saturation_in: PropertyTransform = (value, light: Light) => { +const saturation_in: PropertyTransform = (value /*, light: Light*/) => { value = clamp(value / MAX_COLOR, 0, 1); return roundTo(value * 100, 0); }; diff --git a/src/modules/gateway.ts b/src/modules/gateway.ts index 117840ee..a61bb54d 100644 --- a/src/modules/gateway.ts +++ b/src/modules/gateway.ts @@ -1,4 +1,4 @@ -import { Accessory, AccessoryTypes } from "../ipso/accessory"; +import { Accessory } from "../ipso/accessory"; import { Group } from "../ipso/group"; import { Scene } from "../ipso/scene"; import { DictionaryLike } from "../lib/object-polyfill"; diff --git a/src/modules/groups.ts b/src/modules/groups.ts index 41056462..0e7d290a 100644 --- a/src/modules/groups.ts +++ b/src/modules/groups.ts @@ -1,10 +1,9 @@ import { Group } from "../ipso/group"; -import { Scene } from "../ipso/scene"; import { Global as _ } from "../lib/global"; -import { composeObject, DictionaryLike, dig, entries, filter, values } from "../lib/object-polyfill"; +import { DictionaryLike, dig, entries, filter } from "../lib/object-polyfill"; import { padStart } from "../lib/strings"; import { VirtualGroup } from "../lib/virtual-group"; -import { gateway as gw, GroupInfo } from "./gateway"; +import { gateway as gw } from "./gateway"; /** * Returns the common part of the ioBroker object representing the given group diff --git a/src/modules/message.ts b/src/modules/message.ts index a3288c45..1a4c33b1 100644 --- a/src/modules/message.ts +++ b/src/modules/message.ts @@ -1,12 +1,12 @@ -import { CoapClient as coap, CoapResponse } from "node-coap-client"; -import { Accessory, AccessoryTypes } from "../ipso/accessory"; +import { CoapClient as coap } from "node-coap-client"; +import { AccessoryTypes } from "../ipso/accessory"; import { parsePayload } from "../lib/coap-payload"; -import { ExtendedAdapter, Global as _ } from "../lib/global"; +import { Global as _ } from "../lib/global"; import { DictionaryLike, entries } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; import { Device as SendToDevice, Group as SendToGroup } from "./communication"; import { gateway as gw } from "./gateway"; -import { calcGroupId, calcGroupName, extendVirtualGroup } from "./groups"; +import { calcGroupName, extendVirtualGroup } from "./groups"; export async function onMessage(obj) { // responds to the adapter that sent the original message @@ -72,8 +72,6 @@ export async function onMessage(obj) { } case "addVirtualGroup": { - // check the given params - const params = obj.message as any; // calculate the next ID const nextID = Math.max(0, ...Object.keys(gw.virtualGroups).map(k => +k)) + 1; // create the group diff --git a/src/modules/operations.ts b/src/modules/operations.ts index e90a8344..24ab3c72 100644 --- a/src/modules/operations.ts +++ b/src/modules/operations.ts @@ -2,7 +2,7 @@ * Provides operations for Tradfri devices using the CoAP layer */ -import { CoapClient as coap, CoapResponse } from "node-coap-client"; +import { CoapClient as coap } from "node-coap-client"; import { Accessory, AccessoryTypes } from "../ipso/accessory"; import { endpoints as coapEndpoints} from "../ipso/endpoints"; import { Group, GroupOperation } from "../ipso/group"; From 0c436d255497c636a3ab852da35743c885b43f25 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Fri, 27 Oct 2017 17:36:40 +0200 Subject: [PATCH 43/51] ack transition duration for groups --- build/main.js | 4 ++++ src/main.ts | 3 +++ 2 files changed, 7 insertions(+) diff --git a/build/main.js b/build/main.js index 6d7d5fa8..7bcdd45e 100644 --- a/build/main.js +++ b/build/main.js @@ -199,6 +199,10 @@ let adapter = utils_1.default.adapter({ }); wasAcked = true; } + else if (id.endsWith(".transitionDuration")) { + // this is part of another operation, just ack the state + wasAcked = true; + } // ack the state if neccessary and return if (wasAcked) adapter.$setState(id, state, true); diff --git a/src/main.ts b/src/main.ts index 13f18dcd..222f13fa 100644 --- a/src/main.ts +++ b/src/main.ts @@ -207,6 +207,9 @@ let adapter: ExtendedAdapter = utils.adapter({ transitionTime: await getTransitionDuration(group), }); wasAcked = true; + } else if (id.endsWith(".transitionDuration")) { + // this is part of another operation, just ack the state + wasAcked = true; } // ack the state if neccessary and return From c060e589dda5073b11b8459c64826d54c55e63a3 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Fri, 27 Oct 2017 20:35:12 +0200 Subject: [PATCH 44/51] fixed switching virtual groups --- build/main.js | 5 +++++ io-package.json | 2 +- maintenance/deploy_local.ts | 2 +- package.json | 2 +- src/main.ts | 6 ++++++ 5 files changed, 14 insertions(+), 3 deletions(-) diff --git a/build/main.js b/build/main.js index 7bcdd45e..17f3230d 100644 --- a/build/main.js +++ b/build/main.js @@ -949,6 +949,11 @@ function loadVirtualGroups() { for (const obj of object_polyfill_1.values(gateway_1.gateway.virtualGroups)) { const id = groups_1.calcGroupId(obj); gateway_1.gateway.objects[id] = iobObjects[id]; + // also remember all states + const stateObjs = yield global_1.Global.$$(`${id}.*`, "state"); + for (const [sid, sobj] of object_polyfill_1.entries(stateObjs)) { + gateway_1.gateway.objects[sid] = sobj; + } } }); } diff --git a/io-package.json b/io-package.json index 883616c7..c83a752c 100644 --- a/io-package.json +++ b/io-package.json @@ -1,7 +1,7 @@ { "common": { "name": "tradfri", - "version": "0.5.0-beta2", + "version": "0.5.0-beta3", "news": { "0.5.0": { "en": "Support of virtual groups", diff --git a/maintenance/deploy_local.ts b/maintenance/deploy_local.ts index 0c498594..803a4990 100644 --- a/maintenance/deploy_local.ts +++ b/maintenance/deploy_local.ts @@ -73,7 +73,7 @@ const remoteRoot = `/opt/iobroker/node_modules/iobroker.${ADAPTER_NAME}`; execResult = await ssh.execCommand(`iobroker upload ${ADAPTER_NAME}`); console.log(execResult.stdout); console.log(execResult.stderr); - if (process.argv.indexOf("--restart") > -1) { + if (process.argv.indexOf("--norestart") === -1) { execResult = await ssh.execCommand(`iobroker restart ${ADAPTER_NAME}`); console.log(execResult.stdout); console.log(execResult.stderr); diff --git a/package.json b/package.json index 6b316bfb..585a7cd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0-beta2", + "version": "0.5.0-beta3", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", diff --git a/src/main.ts b/src/main.ts index 222f13fa..76bb6644 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1014,7 +1014,13 @@ async function loadVirtualGroups(): Promise { for (const obj of values(gw.virtualGroups)) { const id = calcGroupId(obj); gw.objects[id] = iobObjects[id]; + // also remember all states + const stateObjs = await _.$$(`${id}.*`, "state"); + for (const [sid, sobj] of entries(stateObjs)) { + gw.objects[sid] = sobj; + } } + } // Connection check From 924e3b79f019fbc08a356f47bf58d494210ef76b Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 13:42:47 +0200 Subject: [PATCH 45/51] added PowerSources enum --- build/ipso/deviceInfo.d.ts | 12 +++++++++++- build/ipso/deviceInfo.js | 13 ++++++++++++- src/ipso/deviceInfo.ts | 13 ++++++++++++- 3 files changed, 35 insertions(+), 3 deletions(-) diff --git a/build/ipso/deviceInfo.d.ts b/build/ipso/deviceInfo.d.ts index ef7a22e2..c41ca936 100644 --- a/build/ipso/deviceInfo.d.ts +++ b/build/ipso/deviceInfo.d.ts @@ -1,9 +1,19 @@ import { IPSOObject } from "./ipsoObject"; +export declare enum PowerSources { + Unknown = 0, + InternalBattery = 1, + ExternalBattery = 2, + Battery = 3, + PowerOverEthernet = 4, + USB = 5, + AC_Power = 6, + Solar = 7, +} export declare class DeviceInfo extends IPSOObject { battery: number; firmwareVersion: string; manufacturer: string; modelNumber: string; - power: number; + power: PowerSources; serialNumber: string; } diff --git a/build/ipso/deviceInfo.js b/build/ipso/deviceInfo.js index 41cbc30d..2c7bbf58 100644 --- a/build/ipso/deviceInfo.js +++ b/build/ipso/deviceInfo.js @@ -10,6 +10,17 @@ var __metadata = (this && this.__metadata) || function (k, v) { }; Object.defineProperty(exports, "__esModule", { value: true }); const ipsoObject_1 = require("./ipsoObject"); +var PowerSources; +(function (PowerSources) { + PowerSources[PowerSources["Unknown"] = 0] = "Unknown"; + PowerSources[PowerSources["InternalBattery"] = 1] = "InternalBattery"; + PowerSources[PowerSources["ExternalBattery"] = 2] = "ExternalBattery"; + PowerSources[PowerSources["Battery"] = 3] = "Battery"; + PowerSources[PowerSources["PowerOverEthernet"] = 4] = "PowerOverEthernet"; + PowerSources[PowerSources["USB"] = 5] = "USB"; + PowerSources[PowerSources["AC_Power"] = 6] = "AC_Power"; + PowerSources[PowerSources["Solar"] = 7] = "Solar"; +})(PowerSources = exports.PowerSources || (exports.PowerSources = {})); // contains information about a specific device class DeviceInfo extends ipsoObject_1.IPSOObject { constructor() { @@ -17,7 +28,7 @@ class DeviceInfo extends ipsoObject_1.IPSOObject { this.firmwareVersion = ""; this.manufacturer = ""; this.modelNumber = ""; - this.power = 0; + this.power = PowerSources.Unknown; this.serialNumber = ""; } } diff --git a/src/ipso/deviceInfo.ts b/src/ipso/deviceInfo.ts index b9ced494..fb58992d 100644 --- a/src/ipso/deviceInfo.ts +++ b/src/ipso/deviceInfo.ts @@ -1,5 +1,16 @@ import { deserializeWith, ipsoKey, IPSOObject, PropertyTransform, required, serializeWith } from "./ipsoObject"; +export enum PowerSources { + Unknown = 0, + InternalBattery = 1, + ExternalBattery = 2, + Battery = 3, // apparently used by the remote (not in spec) + PowerOverEthernet = 4, + USB = 5, + AC_Power = 6, + Solar = 7, +} + // contains information about a specific device export class DeviceInfo extends IPSOObject { @@ -16,7 +27,7 @@ export class DeviceInfo extends IPSOObject { public modelNumber: string = ""; @ipsoKey("6") - public power: number = 0; + public power: PowerSources = PowerSources.Unknown; @ipsoKey("2") public serialNumber: string = ""; From 2e8e71eeec8b54b502e9b02b578bc37c78fb2469 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 14:29:19 +0200 Subject: [PATCH 46/51] added some more protocol info --- src/flow/discover.txt | 25 ++++++++++ src/flow/fw_update.txt | 111 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 src/flow/discover.txt create mode 100644 src/flow/fw_update.txt diff --git a/src/flow/discover.txt b/src/flow/discover.txt new file mode 100644 index 00000000..c495ac9e --- /dev/null +++ b/src/flow/discover.txt @@ -0,0 +1,25 @@ +GET /.well-known/core + +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0, +;ct=0;obs, +;ct=0;obs, +;ct=0;obs, +;ct=0, +;ct=0, +;ct=0;obs, +;ct=0;obs, +;ct=0, +;ct=0, +;ct=0, +;ct=0, +;ct=0, +;ct=0;obs \ No newline at end of file diff --git a/src/flow/fw_update.txt b/src/flow/fw_update.txt new file mode 100644 index 00000000..5993729d --- /dev/null +++ b/src/flow/fw_update.txt @@ -0,0 +1,111 @@ +http://fw.ota.homesmart.ikea.net/feed/version_info.json + +[ + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159693-TRADFRI-bulb-ws-1.2.217.ota.ota.signed", + "fw_file_version_LSB":30066, + "fw_file_version_MSB":4641, + "fw_filesize":173246, + "fw_image_type":8705, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/190579-ncp572b444.ebl.ota.ota.signed", + "fw_build_version":444, + "fw_file_version_LSB":444, + "fw_file_version_MSB":5720, + "fw_filesize":166270, + "fw_hotfix_version":2, + "fw_image_type":2, + "fw_major_version":5, + "fw_manufacturer_id":4476, + "fw_minor_version":7, + "fw_type":1 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159694-TRADFRI-bulb-ws-gu10-1.2.217.ota.ota.signed", + "fw_file_version_LSB":30066, + "fw_file_version_MSB":4641, + "fw_filesize":173246, + "fw_image_type":8707, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159695-TRADFRI-bulb-ws-1000lm-1.2.217.ota.ota.signed", + "fw_file_version_LSB":30066, + "fw_file_version_MSB":4641, + "fw_filesize":173246, + "fw_image_type":8706, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159696-TRADFRI-bulb-w-1000lm-1.2.214.ota.ota.signed", + "fw_file_version_LSB":17778, + "fw_file_version_MSB":4641, + "fw_filesize":168318, + "fw_image_type":8449, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159697-TRADFRI-driver-hp-1.2.217.ota.ota.signed", + "fw_file_version_LSB":30066, + "fw_file_version_MSB":4641, + "fw_filesize":173246, + "fw_image_type":16898, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159698-TRADFRI-driver-lp-1.2.217.ota.ota.signed", + "fw_file_version_LSB":30066, + "fw_file_version_MSB":4641, + "fw_filesize":173246, + "fw_image_type":16897, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159699-TRADFRI-remote-control-1.2.214.ota.ota.signed", + "fw_file_version_LSB":17778, + "fw_file_version_MSB":4641, + "fw_filesize":158590, + "fw_image_type":4545, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159700-TRADFRI-motion-sensor-1.2.214.ota.ota.signed", + "fw_file_version_LSB":17778, + "fw_file_version_MSB":4641, + "fw_filesize":157822, + "fw_image_type":4548, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/159701-TRADFRI-wireless-dimmer-1.2.248.ota.ota.signed", + "fw_file_version_LSB":34162, + "fw_file_version_MSB":4644, + "fw_filesize":172926, + "fw_image_type":4546, + "fw_manufacturer_id":4476, + "fw_type":2 + }, + { + "fw_binary_url":"http://fw.ota.homesmart.ikea.net/Tradfri_OTA_release_signed_2017_07_12_161101/bin/190578-TRADFRI-gateway-1.1.0015.p.elf.sig.ota.signed", + "fw_filesize":454588, + "fw_hotfix_version":15, + "fw_major_version":1, + "fw_minor_version":1, + "fw_type":0, + "fw_update_prio":5, + "fw_weblink_relnote":"https://ww8.ikea.com/ikeahomesmart/releasenotes/releasenotes.html", + "fw_req_hotfix_version":16, + "fw_req_major_version":9, + "fw_req_minor_version":9 + } +] \ No newline at end of file From f7c00d4e07998a0cc06c1362127b7fac6e01b1d1 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 15:16:10 +0200 Subject: [PATCH 47/51] added RGB support to (virtual) groups --- build/ipso/light.js | 6 ++ build/lib/virtual-group.d.ts | 5 +- build/lib/virtual-group.js | 4 +- build/main.js | 36 ++++----- build/modules/groups.js | 124 +++++++++++++++++++++++++++++-- build/modules/operations.js | 2 +- src/ipso/light.ts | 6 ++ src/lib/virtual-group.ts | 5 +- src/main.ts | 34 ++++----- src/modules/groups.ts | 138 +++++++++++++++++++++++++++++++---- src/modules/operations.ts | 2 +- 11 files changed, 290 insertions(+), 72 deletions(-) diff --git a/build/ipso/light.js b/build/ipso/light.js index 99547c14..5a2c5c0e 100644 --- a/build/ipso/light.js +++ b/build/ipso/light.js @@ -178,6 +178,12 @@ function createWhiteSpectrumProxy() { me.colorY = 27000; // magic number, but it works! break; } + case "hue": + case "saturation": + case "color": { + // don't update these properties, they are not supported in white spectrum lamps + break; + } default: me[key] = value; } return true; diff --git a/build/lib/virtual-group.d.ts b/build/lib/virtual-group.d.ts index 3f2489ef..4d61682b 100644 --- a/build/lib/virtual-group.d.ts +++ b/build/lib/virtual-group.d.ts @@ -5,8 +5,11 @@ export declare class VirtualGroup { name: string; onOff: boolean; dimmer: number; - colorX: number; + colorTemperature: number; transitionTime: number; + color: string; + hue: number; + saturation: number; /** * The instance ids of all devices combined in this group */ diff --git a/build/lib/virtual-group.js b/build/lib/virtual-group.js index a0c2b127..0bfbcd9e 100644 --- a/build/lib/virtual-group.js +++ b/build/lib/virtual-group.js @@ -6,8 +6,10 @@ class VirtualGroup { this.instanceId = instanceId; this.onOff = false; // this.dimmer = 0; // [0..254] - this.colorX = 0; // int + this.colorTemperature = 0; // int this.transitionTime = 0; // + this.hue = 0; // int + this.saturation = 0; // int } /** * Updates this virtual group's state with the changes contained in the given operation diff --git a/build/main.js b/build/main.js index 17f3230d..381b1f4c 100644 --- a/build/main.js +++ b/build/main.js @@ -190,11 +190,11 @@ let adapter = utils_1.default.adapter({ sceneId: val, })); } - else if (id.endsWith(".color")) { + else if (/\.(colorTemperature|color|hue|saturation)$/.test(id)) { // color change is only supported manually, so we operate // the virtual state of this group yield operations_1.operateVirtualGroup(group, { - colorTemperature: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: yield getTransitionDuration(group), }); wasAcked = true; @@ -223,9 +223,9 @@ let adapter = utils_1.default.adapter({ transitionTime: yield getTransitionDuration(vGroup), }; } - else if (id.endsWith(".color")) { + else if (/\.(colorTemperature|color|hue|saturation)$/.test(id)) { operation = { - colorTemperature: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: yield getTransitionDuration(vGroup), }; } @@ -261,6 +261,9 @@ let adapter = utils_1.default.adapter({ })); } else if (id.endsWith(".color")) { + // we need to differentiate here, because some ppl + // might already have "color" states for white spectrum bulbs + // in the future, we create different states for white and RGB bulbs if (light.spectrum === "rgb") { wasAcked = !(yield operations_1.operateLight(accessory, { color: val, @@ -274,22 +277,9 @@ let adapter = utils_1.default.adapter({ })); } } - else if (id.endsWith(".colorTemperature")) { + else if (/\.(colorTemperature|hue|saturation)$/.test(id)) { wasAcked = !(yield operations_1.operateLight(accessory, { - colorTemperature: val, - transitionTime: yield getTransitionDuration(accessory), - })); - } - else if (id.endsWith(".hue")) { - // TODO: transform HSL to RGB - wasAcked = !(yield operations_1.operateLight(accessory, { - hue: val, - transitionTime: yield getTransitionDuration(accessory), - })); - } - else if (id.endsWith(".saturation")) { - wasAcked = !(yield operations_1.operateLight(accessory, { - saturation: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: yield getTransitionDuration(accessory), })); } @@ -767,8 +757,8 @@ function extendDevice(accessory) { }, }; if (spectrum === "white") { - stateObjs["lightbulb.color"] = { - _id: `${objId}.lightbulb.color`, + stateObjs["lightbulb.colorTemperature"] = { + _id: `${objId}.lightbulb.colorTemperature`, type: "state", common: { name: "Color temperature", @@ -806,7 +796,7 @@ function extendDevice(accessory) { _id: `${objId}.lightbulb.hue`, type: "state", common: { - name: "Color hue", + name: "Hue", read: true, write: true, min: 0, @@ -823,7 +813,7 @@ function extendDevice(accessory) { _id: `${objId}.lightbulb.saturation`, type: "state", common: { - name: "Color saturation", + name: "Saturation", read: true, write: true, min: 0, diff --git a/build/modules/groups.js b/build/modules/groups.js index 40ad8a01..ec687033 100644 --- a/build/modules/groups.js +++ b/build/modules/groups.js @@ -133,7 +133,7 @@ function extendVirtualGroup(group) { type: "state", common: { name: "Brightness", - read: false, + read: true, write: true, min: 0, max: 254, @@ -145,22 +145,73 @@ function extendVirtualGroup(group) { path: "dimmer", }, }, + colorTemperature: { + _id: `${objId}.colorTemperature`, + type: "state", + common: { + name: "White spectrum color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's white spectrum lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorTemperature", + }, + }, color: { _id: `${objId}.color`, type: "state", common: { - name: "Color temperature", + name: "RGB color", + read: true, + write: true, + type: "string", + role: "level.color", + desc: "Color of this group's RGB lightbulbs as a 6-digit hex string.", + }, + native: { + path: "color", + }, + }, + hue: { + _id: `${objId}.hue`, + type: "state", + common: { + name: "Hue", + read: true, + write: true, + min: 0, + max: 360, + unit: "°", + type: "number", + role: "level.color.hue", + desc: "Hue of this group's RGB lightbulbs.", + }, + native: { + path: "hue", + }, + }, + saturation: { + _id: `${objId}.saturation`, + type: "state", + common: { + name: "Saturation", read: true, write: true, min: 0, max: 100, unit: "%", type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + role: "level.color.saturation", + desc: "Saturation of this group's RGB lightbulbs.", }, native: { - path: "colorX", + path: "saturation", }, }, }; @@ -292,19 +343,76 @@ function extendGroup(group) { path: "dimmer", }, }, + colorTemperature: { + _id: `${objId}.colorTemperature`, + type: "state", + common: { + name: "White spectrum color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's white spectrum lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, color: { _id: `${objId}.color`, type: "state", common: { - name: "Color temperature", + name: "RGB color", + read: true, + write: true, + type: "string", + role: "level.color", + desc: "Color of this group's RGB lightbulbs as a 6-digit hex string.", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + hue: { + _id: `${objId}.hue`, + type: "state", + common: { + name: "Hue", + read: true, + write: true, + min: 0, + max: 360, + unit: "°", + type: "number", + role: "level.color.hue", + desc: "Hue of this group's RGB lightbulbs.", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + saturation: { + _id: `${objId}.saturation`, + type: "state", + common: { + name: "Saturation", read: true, write: true, min: 0, max: 100, unit: "%", type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + role: "level.color.saturation", + desc: "Saturation of this group's RGB lightbulbs.", }, native: { // virtual state, so no real path to an object exists diff --git a/build/modules/operations.js b/build/modules/operations.js index 3221a655..92255e4a 100644 --- a/build/modules/operations.js +++ b/build/modules/operations.js @@ -87,7 +87,7 @@ function operateVirtualGroup(group, operation) { return __awaiter(this, void 0, void 0, function* () { // find all lightbulbs belonging to this group const lightbulbAccessories = group.deviceIDs - .map(did => gateway_1.gateway.devices[did]) + .map(id => gateway_1.gateway.devices[id]) .filter(dev => dev != null && dev.type === accessory_1.AccessoryTypes.lightbulb); for (const acc of lightbulbAccessories) { yield operateLight(acc, operation); diff --git a/src/ipso/light.ts b/src/ipso/light.ts index 90f0289f..45b4b5b0 100644 --- a/src/ipso/light.ts +++ b/src/ipso/light.ts @@ -162,6 +162,12 @@ function createWhiteSpectrumProxy() { me.colorY = 27000; // magic number, but it works! break; } + case "hue": + case "saturation": + case "color": { + // don't update these properties, they are not supported in white spectrum lamps + break; + } default: me[key] = value; } return true; diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index 09ef7df6..025eb5f8 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -9,8 +9,11 @@ export class VirtualGroup { public name: string; public onOff: boolean = false; // public dimmer: number = 0; // [0..254] - public colorX: number = 0; // int + public colorTemperature: number = 0; // int public transitionTime: number = 0; // + public color: string; // int + public hue: number = 0; // int + public saturation: number = 0; // int /** * The instance ids of all devices combined in this group diff --git a/src/main.ts b/src/main.ts index 76bb6644..087b986e 100644 --- a/src/main.ts +++ b/src/main.ts @@ -199,11 +199,11 @@ let adapter: ExtendedAdapter = utils.adapter({ onOff: true, sceneId: val, }); - } else if (id.endsWith(".color")) { + } else if (/\.(colorTemperature|color|hue|saturation)$/.test(id)) { // color change is only supported manually, so we operate // the virtual state of this group await operateVirtualGroup(group, { - colorTemperature: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: await getTransitionDuration(group), }); wasAcked = true; @@ -232,9 +232,9 @@ let adapter: ExtendedAdapter = utils.adapter({ dimmer: val, transitionTime: await getTransitionDuration(vGroup), }; - } else if (id.endsWith(".color")) { + } else if (/\.(colorTemperature|color|hue|saturation)$/.test(id)) { operation = { - colorTemperature: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: await getTransitionDuration(vGroup), }; } else if (id.endsWith(".transitionDuration")) { @@ -272,6 +272,9 @@ let adapter: ExtendedAdapter = utils.adapter({ transitionTime: await getTransitionDuration(accessory), }); } else if (id.endsWith(".color")) { + // we need to differentiate here, because some ppl + // might already have "color" states for white spectrum bulbs + // in the future, we create different states for white and RGB bulbs if (light.spectrum === "rgb") { wasAcked = !await operateLight(accessory, { color: val, @@ -283,20 +286,9 @@ let adapter: ExtendedAdapter = utils.adapter({ transitionTime: await getTransitionDuration(accessory), }); } - } else if (id.endsWith(".colorTemperature")) { + } else if (/\.(colorTemperature|hue|saturation)$/.test(id)) { wasAcked = !await operateLight(accessory, { - colorTemperature: val, - transitionTime: await getTransitionDuration(accessory), - }); - } else if (id.endsWith(".hue")) { - // TODO: transform HSL to RGB - wasAcked = !await operateLight(accessory, { - hue: val, - transitionTime: await getTransitionDuration(accessory), - }); - } else if (id.endsWith(".saturation")) { - wasAcked = !await operateLight(accessory, { - saturation: val, + [id.substr(id.lastIndexOf(".") + 1)]: val, transitionTime: await getTransitionDuration(accessory), }); } else if (id.endsWith(".transitionDuration")) { @@ -826,8 +818,8 @@ function extendDevice(accessory: Accessory) { }, }; if (spectrum === "white") { - stateObjs["lightbulb.color"] = { - _id: `${objId}.lightbulb.color`, + stateObjs["lightbulb.colorTemperature"] = { + _id: `${objId}.lightbulb.colorTemperature`, type: "state", common: { name: "Color temperature", @@ -864,7 +856,7 @@ function extendDevice(accessory: Accessory) { _id: `${objId}.lightbulb.hue`, type: "state", common: { - name: "Color hue", + name: "Hue", read: true, write: true, min: 0, @@ -881,7 +873,7 @@ function extendDevice(accessory: Accessory) { _id: `${objId}.lightbulb.saturation`, type: "state", common: { - name: "Color saturation", + name: "Saturation", read: true, write: true, min: 0, diff --git a/src/modules/groups.ts b/src/modules/groups.ts index 0e7d290a..99399706 100644 --- a/src/modules/groups.ts +++ b/src/modules/groups.ts @@ -97,8 +97,8 @@ export function extendVirtualGroup(group: VirtualGroup) { type: "state", common: { name: "on/off", - read: true, // TODO: check - write: true, // TODO: check + read: true, + write: true, type: "boolean", role: "switch", }, @@ -130,8 +130,8 @@ export function extendVirtualGroup(group: VirtualGroup) { type: "state", common: { name: "Brightness", - read: false, // TODO: check - write: true, // TODO: check + read: true, + write: true, min: 0, max: 254, type: "number", @@ -142,22 +142,73 @@ export function extendVirtualGroup(group: VirtualGroup) { path: "dimmer", }, }, + colorTemperature: { + _id: `${objId}.colorTemperature`, + type: "state", + common: { + name: "White spectrum color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's white spectrum lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + path: "colorTemperature", + }, + }, color: { _id: `${objId}.color`, type: "state", common: { - name: "Color temperature", - read: true, // TODO: check - write: true, // TODO: check + name: "RGB color", + read: true, + write: true, + type: "string", + role: "level.color", + desc: "Color of this group's RGB lightbulbs as a 6-digit hex string.", + }, + native: { + path: "color", + }, + }, + hue: { + _id: `${objId}.hue`, + type: "state", + common: { + name: "Hue", + read: true, + write: true, + min: 0, + max: 360, + unit: "°", + type: "number", + role: "level.color.hue", + desc: "Hue of this group's RGB lightbulbs.", + }, + native: { + path: "hue", + }, + }, + saturation: { + _id: `${objId}.saturation`, + type: "state", + common: { + name: "Saturation", + read: true, + write: true, min: 0, max: 100, unit: "%", type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + role: "level.color.saturation", + desc: "Saturation of this group's RGB lightbulbs.", }, native: { - path: "colorX", + path: "saturation", }, }, }; @@ -297,19 +348,76 @@ export function extendGroup(group: Group) { path: "dimmer", }, }, + colorTemperature: { + _id: `${objId}.colorTemperature`, + type: "state", + common: { + name: "White spectrum color temperature", + read: true, + write: true, + min: 0, + max: 100, + unit: "%", + type: "number", + role: "level.color.temperature", + desc: "Color temperature of this group's white spectrum lightbulbs. Range: 0% = cold, 100% = warm", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, color: { _id: `${objId}.color`, type: "state", common: { - name: "Color temperature", - read: true, // TODO: check - write: true, // TODO: check + name: "RGB color", + read: true, + write: true, + type: "string", + role: "level.color", + desc: "Color of this group's RGB lightbulbs as a 6-digit hex string.", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + hue: { + _id: `${objId}.hue`, + type: "state", + common: { + name: "Hue", + read: true, + write: true, + min: 0, + max: 360, + unit: "°", + type: "number", + role: "level.color.hue", + desc: "Hue of this group's RGB lightbulbs.", + }, + native: { + // virtual state, so no real path to an object exists + // we still have to give path a value, because other functions check for its existence + path: "__virtual__", + }, + }, + saturation: { + _id: `${objId}.saturation`, + type: "state", + common: { + name: "Saturation", + read: true, + write: true, min: 0, max: 100, unit: "%", type: "number", - role: "level.color.temperature", - desc: "Color temperature of this group's lightbulbs. Range: 0% = cold, 100% = warm", + role: "level.color.saturation", + desc: "Saturation of this group's RGB lightbulbs.", }, native: { // virtual state, so no real path to an object exists diff --git a/src/modules/operations.ts b/src/modules/operations.ts index 24ab3c72..2f8a6633 100644 --- a/src/modules/operations.ts +++ b/src/modules/operations.ts @@ -91,7 +91,7 @@ export async function operateVirtualGroup(group: Group | VirtualGroup, operation // find all lightbulbs belonging to this group const lightbulbAccessories = group.deviceIDs - .map(did => gw.devices[did]) + .map(id => gw.devices[id]) .filter(dev => dev != null && dev.type === AccessoryTypes.lightbulb) ; From 3b59e0953c4b20b1c64acbdaf3fd38f1c754c1b9 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 15:17:45 +0200 Subject: [PATCH 48/51] v0.5.0-beta4 --- README.md | 2 +- io-package.json | 2 +- package.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 91273bf5..f39a8f54 100644 --- a/README.md +++ b/README.md @@ -46,7 +46,7 @@ The result object `ret` looks as follows: ## Changelog -#### 0.5.0 (2017-10-XX) +#### 0.5.0 (2017-10-28) * (AlCalzone) Support virtual groups #### 0.4.5 (2017-10-20) diff --git a/io-package.json b/io-package.json index c83a752c..3b6e881c 100644 --- a/io-package.json +++ b/io-package.json @@ -1,7 +1,7 @@ { "common": { "name": "tradfri", - "version": "0.5.0-beta3", + "version": "0.5.0-beta4", "news": { "0.5.0": { "en": "Support of virtual groups", diff --git a/package.json b/package.json index 585a7cd8..1707b299 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0-beta3", + "version": "0.5.0-beta4", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", From 8214a7a4ed3a2b1a6fb91f66559a89b6ffcce992 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 18:28:04 +0200 Subject: [PATCH 49/51] update group states when lightbulbs change --- build/lib/global.d.ts | 2 + build/lib/global.js | 1 + build/lib/virtual-group.js | 6 -- build/main.js | 23 ++++++-- build/modules/groups.d.ts | 8 +++ build/modules/groups.js | 110 +++++++++++++++++++++++++++++++++++- build/modules/message.js | 3 +- src/lib/global.ts | 3 + src/lib/virtual-group.ts | 12 ++-- src/main.ts | 29 ++++++++-- src/modules/groups.ts | 113 +++++++++++++++++++++++++++++++++++-- src/modules/message.ts | 5 +- 12 files changed, 284 insertions(+), 31 deletions(-) diff --git a/build/lib/global.d.ts b/build/lib/global.d.ts index baac23cc..3e1aba34 100644 --- a/build/lib/global.d.ts +++ b/build/lib/global.d.ts @@ -62,6 +62,8 @@ export interface ExtendedAdapter extends ioBroker.Adapter { $deleteState(stateName: string, options?: any): Promise; $deleteState(parentChannel: string, stateName: string, options?: any): Promise; $deleteState(parentDevice: string, parentChannel: string, stateName: string, options?: any): Promise; + /** Deletes a state from the states DB, but not the associated object. Consider using @link{$deleteState} instead */ + $delState(id: string, options?: any): Promise; /** Read a value (which might not belong to this adapter) from the states DB. */ $getForeignState(id: string, options?: any): Promise; /** Writes a value (which might not belong to this adapter) into the states DB. */ diff --git a/build/lib/global.js b/build/lib/global.js index b2161ef3..2602fb12 100644 --- a/build/lib/global.js +++ b/build/lib/global.js @@ -68,6 +68,7 @@ class Global { $setStateChanged: promises_1.promisify(adapter.setStateChanged, adapter), $createState: promises_1.promisify(adapter.createState, adapter), $deleteState: promises_1.promisify(adapter.deleteState, adapter), + $delState: promises_1.promisify(adapter.delState, adapter), $getForeignState: promises_1.promisify(adapter.getForeignState, adapter), $setForeignState: promises_1.promisify(adapter.setForeignState, adapter), $sendTo: promises_1.promisifyNoError(adapter.sendTo, adapter), diff --git a/build/lib/virtual-group.js b/build/lib/virtual-group.js index 0bfbcd9e..14e6c2f8 100644 --- a/build/lib/virtual-group.js +++ b/build/lib/virtual-group.js @@ -4,12 +4,6 @@ const object_polyfill_1 = require("./object-polyfill"); class VirtualGroup { constructor(instanceId) { this.instanceId = instanceId; - this.onOff = false; // - this.dimmer = 0; // [0..254] - this.colorTemperature = 0; // int - this.transitionTime = 0; // - this.hue = 0; // int - this.saturation = 0; // int } /** * Updates this virtual group's state with the changes contained in the given operation diff --git a/build/main.js b/build/main.js index 381b1f4c..ac0282a8 100644 --- a/build/main.js +++ b/build/main.js @@ -57,9 +57,11 @@ let adapter = utils_1.default.adapter({ // console.log = (msg) => adapter.log.debug("STDOUT > " + msg); // console.error = (msg) => adapter.log.error("STDERR > " + msg); global_1.Global.log(`startfile = ${process.argv[1]}`); - // Eigene Objekte/States beobachten - adapter.subscribeStates("*"); - adapter.subscribeObjects("*"); + // watch own states + adapter.subscribeStates(`${adapter.namespace}.*`); + adapter.subscribeObjects(`${adapter.namespace}.*`); + // add special watch for lightbulb states, so we can later sync the group states + custom_subscriptions_1.subscribeStates(/L\-\d+\.lightbulb\./, syncGroupsWithState); // initialize CoAP client const hostname = adapter.config.host.toLowerCase(); node_coap_client_1.CoapClient.setSecurityParams(hostname, { @@ -321,6 +323,17 @@ let adapter = utils_1.default.adapter({ }); // ================================== // manage devices +// gets called when a lightbulb state gets updated +// we use this to sync group states because those are not advertised by the gateway +function syncGroupsWithState(id, state) { + if (state && state.ack) { + const instanceId = getInstanceId(id); + if (instanceId in gateway_1.gateway.devices && gateway_1.gateway.devices[instanceId] != null) { + const accessory = gateway_1.gateway.devices[instanceId]; + groups_1.updateMultipleGroupStates(accessory, id); + } + } +} /** Normalizes the path to a resource, so it can be used for storing the observer */ function normalizeResourcePath(path) { path = path || ""; @@ -493,6 +506,8 @@ function coap_getGroup_cb(instanceId, response) { groupInfo.group = group; // create ioBroker states groups_1.extendGroup(group); + // clean up any states that might be incorrectly defined + groups_1.updateGroupStates(group); // and load scene information observeResource(`${endpoints_1.endpoints.scenes}/${instanceId}`, (resp) => coap_getAllScenes_cb(instanceId, resp)); } @@ -929,7 +944,7 @@ function loadVirtualGroups() { // load them into the virtualGroups dict Object.assign(gateway_1.gateway.virtualGroups, object_polyfill_1.composeObject(groupObjects.map(g => { const id = g.native.instanceId; - const deviceIDs = g.native.deviceIDs; + const deviceIDs = g.native.deviceIDs.map(d => parseInt(d, 10)); const ret = new virtual_group_1.VirtualGroup(id); ret.deviceIDs = deviceIDs; ret.name = g.common.name; diff --git a/build/modules/groups.d.ts b/build/modules/groups.d.ts index ea8ba76d..8b39cee3 100644 --- a/build/modules/groups.d.ts +++ b/build/modules/groups.d.ts @@ -1,3 +1,4 @@ +import { Accessory } from "../ipso/accessory"; import { Group } from "../ipso/group"; import { DictionaryLike } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; @@ -20,3 +21,10 @@ export declare function calcGroupId(group: Group | VirtualGroup): string; export declare function calcGroupName(group: Group | VirtualGroup): string; export declare function extendVirtualGroup(group: VirtualGroup): void; export declare function extendGroup(group: Group): void; +/** + * Updates all group states that are equal for all its devices + * @param changedAccessory If defined, only update the groups this is a part of. + * @param changedStateId If defined, only update the corresponding states in the group. + */ +export declare function updateMultipleGroupStates(changedAccessory?: Accessory, changedStateId?: string): void; +export declare function updateGroupStates(group: Group | VirtualGroup, changedStateId?: string): void; diff --git a/build/modules/groups.js b/build/modules/groups.js index ec687033..cac05fd8 100644 --- a/build/modules/groups.js +++ b/build/modules/groups.js @@ -1,5 +1,14 @@ "use strict"; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; Object.defineProperty(exports, "__esModule", { value: true }); +const accessory_1 = require("../ipso/accessory"); const group_1 = require("../ipso/group"); const global_1 = require("../lib/global"); const object_polyfill_1 = require("../lib/object-polyfill"); @@ -331,7 +340,7 @@ function extendGroup(group) { type: "state", common: { name: "Brightness", - read: false, + read: true, write: true, min: 0, max: 254, @@ -436,3 +445,102 @@ function extendGroup(group) { } } exports.extendGroup = extendGroup; +/** Returns the only value in the given array if they are all the same, otherwise null */ +function getCommonValue(arr) { + for (let i = 1; i < arr.length; i++) { + if (arr[i] !== arr[i - 1]) + return null; + } + return arr[0]; +} +const updateTimers = {}; +function debounce(id, action, timeout) { + // clear existing timeouts + if (id in updateTimers) + clearTimeout(updateTimers[id]); + // set a new debounce timer + updateTimers[id] = setTimeout(() => { + delete updateTimers[id]; + action(); + }, timeout); +} +function updateGroupState(id, value) { + return __awaiter(this, void 0, void 0, function* () { + const curState = yield global_1.Global.adapter.$getState(id); + if (curState != null && value == null) { + yield global_1.Global.adapter.$delState(id); + } + else if (curState !== value) { + yield global_1.Global.adapter.$setState(id, value, true); + } + }); +} +/** + * Updates all group states that are equal for all its devices + * @param changedAccessory If defined, only update the groups this is a part of. + * @param changedStateId If defined, only update the corresponding states in the group. + */ +function updateMultipleGroupStates(changedAccessory, changedStateId) { + const groupsToUpdate = object_polyfill_1.values(gateway_1.gateway.groups).map(g => g.group) + .concat(object_polyfill_1.values(gateway_1.gateway.virtualGroups)) + .filter(g => changedAccessory == null || g.deviceIDs.indexOf(changedAccessory.instanceId) > -1); + for (const group of groupsToUpdate) { + updateGroupStates(group, changedStateId); + } +} +exports.updateMultipleGroupStates = updateMultipleGroupStates; +function updateGroupStates(group, changedStateId) { + // only works for lightbulbs right now + const groupBulbs = group.deviceIDs.map(id => gateway_1.gateway.devices[id]) + .filter(a => a.type === accessory_1.AccessoryTypes.lightbulb) + .map(a => a.lightList[0]); + if (groupBulbs.length === 0) + return; + const objId = calcGroupId(group); + // Seperate the bulbs into no spectrum/white spectrum/rgb bulbs + const noSpectrumBulbs = groupBulbs.filter(b => b.spectrum === "none"); + const whiteSpectrumBulbs = groupBulbs.filter(b => b.spectrum === "white"); + const rgbBulbs = groupBulbs.filter(b => b.spectrum === "rgb"); + // we're debouncing the state changes, so group or scene updates don't result in + // deleting and recreating states + const debounceTimeout = 250; + // Try to update the on/off state + if (changedStateId == null || changedStateId.endsWith("lightbulb.state")) { + const commonState = getCommonValue(groupBulbs.map(b => b.onOff)); + group.onOff = commonState; + const stateId = `${objId}.state`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the brightness state + if (changedStateId == null || changedStateId.endsWith("lightbulb.brightness")) { + const commonState = getCommonValue(groupBulbs.map(b => b.dimmer)); + group.dimmer = commonState; + const stateId = `${objId}.brightness`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the colorTemperature state + if (changedStateId == null || changedStateId.endsWith("lightbulb.colorTemperature")) { + const commonState = (whiteSpectrumBulbs.length > 0) ? getCommonValue(whiteSpectrumBulbs.map(b => b.colorTemperature)) : null; + const stateId = `${objId}.colorTemperature`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the color state + if (changedStateId == null || changedStateId.endsWith("lightbulb.color")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.color)) : null; + const stateId = `${objId}.color`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the hue state + if (changedStateId == null || changedStateId.endsWith("lightbulb.hue")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.hue)) : null; + const stateId = `${objId}.hue`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the saturation state + if (changedStateId == null || changedStateId.endsWith("lightbulb.saturation")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.saturation)) : null; + const stateId = `${objId}.saturation`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } +} +exports.updateGroupStates = updateGroupStates; diff --git a/build/modules/message.js b/build/modules/message.js index 007ce0a5..ebe0f33b 100644 --- a/build/modules/message.js +++ b/build/modules/message.js @@ -104,7 +104,7 @@ function onMessage(obj) { const group = gateway_1.gateway.virtualGroups[id]; // Update the device ids if (params.deviceIDs != null && params.deviceIDs instanceof Array) { - group.deviceIDs = params.deviceIDs; + group.deviceIDs = params.deviceIDs.map(d => parseInt(d, 10)).filter(d => !isNaN(d)); } // Change the name if (typeof params.name === "string" && params.name.length > 0) { @@ -112,6 +112,7 @@ function onMessage(obj) { } // save the changes groups_1.extendVirtualGroup(group); + groups_1.updateGroupStates(group); respond(responses.OK); return; } diff --git a/src/lib/global.ts b/src/lib/global.ts index ee0b3bc7..186266d6 100644 --- a/src/lib/global.ts +++ b/src/lib/global.ts @@ -81,6 +81,8 @@ export interface ExtendedAdapter extends ioBroker.Adapter { $deleteState(stateName: string, options?: any): Promise; $deleteState(parentChannel: string, stateName: string, options?: any): Promise; $deleteState(parentDevice: string, parentChannel: string, stateName: string, options?: any): Promise; + /** Deletes a state from the states DB, but not the associated object. Consider using @link{$deleteState} instead */ + $delState(id: string, options?: any): Promise; /** Read a value (which might not belong to this adapter) from the states DB. */ $getForeignState(id: string, options?: any): Promise; @@ -141,6 +143,7 @@ export class Global { $setStateChanged: promisify(adapter.setStateChanged, adapter), $createState: promisify<{ id: string }>(adapter.createState, adapter), $deleteState: promisify(adapter.deleteState, adapter), + $delState: promisify(adapter.delState, adapter), $getForeignState: promisify(adapter.getForeignState, adapter), $setForeignState: promisify(adapter.setForeignState, adapter), diff --git a/src/lib/virtual-group.ts b/src/lib/virtual-group.ts index 025eb5f8..27477d30 100644 --- a/src/lib/virtual-group.ts +++ b/src/lib/virtual-group.ts @@ -7,13 +7,13 @@ export class VirtualGroup { } public name: string; - public onOff: boolean = false; // - public dimmer: number = 0; // [0..254] - public colorTemperature: number = 0; // int - public transitionTime: number = 0; // + public onOff: boolean; // + public dimmer: number; // [0..254] + public colorTemperature: number; // int + public transitionTime: number; // public color: string; // int - public hue: number = 0; // int - public saturation: number = 0; // int + public hue: number; // int + public saturation: number; // int /** * The instance ids of all devices combined in this group diff --git a/src/main.ts b/src/main.ts index 087b986e..a156ca68 100644 --- a/src/main.ts +++ b/src/main.ts @@ -24,9 +24,9 @@ import { VirtualGroup } from "./lib/virtual-group"; import utils from "./lib/utils"; // Adapter-Module laden -import { applyCustomObjectSubscriptions, applyCustomStateSubscriptions } from "./modules/custom-subscriptions"; +import { applyCustomObjectSubscriptions, applyCustomStateSubscriptions, subscribeStates } from "./modules/custom-subscriptions"; import { gateway as gw, GroupInfo } from "./modules/gateway"; -import { calcGroupId, calcGroupName, extendGroup } from "./modules/groups"; +import { calcGroupId, calcGroupName, extendGroup, updateGroupStates, updateMultipleGroupStates } from "./modules/groups"; import { onMessage } from "./modules/message"; import { operateGroup, operateLight, operateVirtualGroup, renameDevice, renameGroup } from "./modules/operations"; @@ -59,9 +59,11 @@ let adapter: ExtendedAdapter = utils.adapter({ // console.error = (msg) => adapter.log.error("STDERR > " + msg); _.log(`startfile = ${process.argv[1]}`); - // Eigene Objekte/States beobachten - adapter.subscribeStates("*"); - adapter.subscribeObjects("*"); + // watch own states + adapter.subscribeStates(`${adapter.namespace}.*`); + adapter.subscribeObjects(`${adapter.namespace}.*`); + // add special watch for lightbulb states, so we can later sync the group states + subscribeStates(/L\-\d+\.lightbulb\./, syncGroupsWithState); // initialize CoAP client const hostname = (adapter.config.host as string).toLowerCase(); @@ -100,6 +102,7 @@ let adapter: ExtendedAdapter = utils.adapter({ objectChange: (id, obj) => { _.log(`{{blue}} object with id ${id} ${obj ? "updated" : "deleted"}`, "debug"); + if (id.startsWith(adapter.namespace)) { // this is our own object. @@ -331,6 +334,18 @@ let adapter: ExtendedAdapter = utils.adapter({ // ================================== // manage devices +// gets called when a lightbulb state gets updated +// we use this to sync group states because those are not advertised by the gateway +function syncGroupsWithState(id: string, state: ioBroker.State) { + if (state && state.ack) { + const instanceId = getInstanceId(id); + if (instanceId in gw.devices && gw.devices[instanceId] != null) { + const accessory = gw.devices[instanceId]; + updateMultipleGroupStates(accessory, id); + } + } +} + /** Normalizes the path to a resource, so it can be used for storing the observer */ function normalizeResourcePath(path: string): string { path = path || ""; @@ -535,6 +550,8 @@ function coap_getGroup_cb(instanceId: number, response: CoapResponse) { // create ioBroker states extendGroup(group); + // clean up any states that might be incorrectly defined + updateGroupStates(group); // and load scene information observeResource( `${coapEndpoints.scenes}/${instanceId}`, @@ -995,7 +1012,7 @@ async function loadVirtualGroups(): Promise { Object.assign(gw.virtualGroups, composeObject( groupObjects.map(g => { const id: number = g.native.instanceId; - const deviceIDs: number[] = g.native.deviceIDs; + const deviceIDs: number[] = g.native.deviceIDs.map(d => parseInt(d, 10)); const ret = new VirtualGroup(id); ret.deviceIDs = deviceIDs; ret.name = g.common.name; diff --git a/src/modules/groups.ts b/src/modules/groups.ts index 99399706..af600615 100644 --- a/src/modules/groups.ts +++ b/src/modules/groups.ts @@ -1,6 +1,7 @@ +import { Accessory, AccessoryTypes } from "../ipso/accessory"; import { Group } from "../ipso/group"; import { Global as _ } from "../lib/global"; -import { DictionaryLike, dig, entries, filter } from "../lib/object-polyfill"; +import { DictionaryLike, dig, entries, filter, values } from "../lib/object-polyfill"; import { padStart } from "../lib/strings"; import { VirtualGroup } from "../lib/virtual-group"; import { gateway as gw } from "./gateway"; @@ -303,8 +304,8 @@ export function extendGroup(group: Group) { type: "state", common: { name: "on/off", - read: true, // TODO: check - write: true, // TODO: check + read: true, + write: true, type: "boolean", role: "switch", }, @@ -336,8 +337,8 @@ export function extendGroup(group: Group) { type: "state", common: { name: "Brightness", - read: false, // TODO: check - write: true, // TODO: check + read: true, + write: true, min: 0, max: 254, type: "number", @@ -443,3 +444,105 @@ export function extendGroup(group: Group) { } } + +/** Returns the only value in the given array if they are all the same, otherwise null */ +function getCommonValue(arr: T[]): T { + for (let i = 1; i < arr.length; i++) { + if (arr[i] !== arr[i - 1]) return null; + } + return arr[0]; +} + +const updateTimers: DictionaryLike = {}; +function debounce(id: string, action: () => void, timeout: number) { + // clear existing timeouts + if (id in updateTimers) clearTimeout(updateTimers[id]); + // set a new debounce timer + updateTimers[id] = setTimeout(() => { + delete updateTimers[id]; + action(); + }, timeout); +} + +async function updateGroupState(id: string, value: string | number | boolean | ioBroker.State): Promise { + const curState = await _.adapter.$getState(id); + if (curState != null && value == null) { + await _.adapter.$delState(id); + } else if (curState !== value) { + await _.adapter.$setState(id, value, true); + } +} + +/** + * Updates all group states that are equal for all its devices + * @param changedAccessory If defined, only update the groups this is a part of. + * @param changedStateId If defined, only update the corresponding states in the group. + */ +export function updateMultipleGroupStates(changedAccessory?: Accessory, changedStateId?: string) { + const groupsToUpdate: (Group | VirtualGroup)[] = + values(gw.groups).map(g => g.group as (Group | VirtualGroup)) + .concat(values(gw.virtualGroups)) + .filter(g => changedAccessory == null || g.deviceIDs.indexOf(changedAccessory.instanceId) > -1) + ; + for (const group of groupsToUpdate) { + updateGroupStates(group, changedStateId); + } +} + +export function updateGroupStates(group: Group | VirtualGroup, changedStateId?: string) { + // only works for lightbulbs right now + const groupBulbs = group.deviceIDs.map(id => gw.devices[id]) + .filter(a => a.type === AccessoryTypes.lightbulb) + .map(a => a.lightList[0]) + ; + if (groupBulbs.length === 0) return; + const objId = calcGroupId(group); + + // Seperate the bulbs into no spectrum/white spectrum/rgb bulbs + const noSpectrumBulbs = groupBulbs.filter(b => b.spectrum === "none"); + const whiteSpectrumBulbs = groupBulbs.filter(b => b.spectrum === "white"); + const rgbBulbs = groupBulbs.filter(b => b.spectrum === "rgb"); + + // we're debouncing the state changes, so group or scene updates don't result in + // deleting and recreating states + const debounceTimeout = 250; + + // Try to update the on/off state + if (changedStateId == null || changedStateId.endsWith("lightbulb.state")) { + const commonState = getCommonValue(groupBulbs.map(b => b.onOff)); + group.onOff = commonState; + const stateId = `${objId}.state`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the brightness state + if (changedStateId == null || changedStateId.endsWith("lightbulb.brightness")) { + const commonState = getCommonValue(groupBulbs.map(b => b.dimmer)); + group.dimmer = commonState; + const stateId = `${objId}.brightness`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the colorTemperature state + if (changedStateId == null || changedStateId.endsWith("lightbulb.colorTemperature")) { + const commonState = (whiteSpectrumBulbs.length > 0) ? getCommonValue(whiteSpectrumBulbs.map(b => b.colorTemperature)) : null; + const stateId = `${objId}.colorTemperature`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the color state + if (changedStateId == null || changedStateId.endsWith("lightbulb.color")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.color)) : null; + const stateId = `${objId}.color`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the hue state + if (changedStateId == null || changedStateId.endsWith("lightbulb.hue")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.hue)) : null; + const stateId = `${objId}.hue`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } + // Try to update the saturation state + if (changedStateId == null || changedStateId.endsWith("lightbulb.saturation")) { + const commonState = (rgbBulbs.length > 0) ? getCommonValue(rgbBulbs.map(b => b.saturation)) : null; + const stateId = `${objId}.saturation`; + debounce(stateId, () => updateGroupState(stateId, commonState), debounceTimeout); + } +} diff --git a/src/modules/message.ts b/src/modules/message.ts index 1a4c33b1..2c59033a 100644 --- a/src/modules/message.ts +++ b/src/modules/message.ts @@ -6,7 +6,7 @@ import { DictionaryLike, entries } from "../lib/object-polyfill"; import { VirtualGroup } from "../lib/virtual-group"; import { Device as SendToDevice, Group as SendToGroup } from "./communication"; import { gateway as gw } from "./gateway"; -import { calcGroupName, extendVirtualGroup } from "./groups"; +import { calcGroupName, extendVirtualGroup, updateGroupStates } from "./groups"; export async function onMessage(obj) { // responds to the adapter that sent the original message @@ -102,7 +102,7 @@ export async function onMessage(obj) { const group = gw.virtualGroups[id]; // Update the device ids if (params.deviceIDs != null && params.deviceIDs instanceof Array) { - group.deviceIDs = params.deviceIDs; + group.deviceIDs = params.deviceIDs.map(d => parseInt(d, 10)).filter(d => !isNaN(d)); } // Change the name if (typeof params.name === "string" && params.name.length > 0) { @@ -110,6 +110,7 @@ export async function onMessage(obj) { } // save the changes extendVirtualGroup(group); + updateGroupStates(group); respond(responses.OK); return; From 6eb6460732f72e3bcb9b95255f5ad83874ec9eb8 Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 19:10:51 +0200 Subject: [PATCH 50/51] release v0.5.0 --- io-package.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/io-package.json b/io-package.json index 3b6e881c..ab830421 100644 --- a/io-package.json +++ b/io-package.json @@ -1,7 +1,7 @@ { "common": { "name": "tradfri", - "version": "0.5.0-beta4", + "version": "0.5.0", "news": { "0.5.0": { "en": "Support of virtual groups", diff --git a/package.json b/package.json index 1707b299..1aacc328 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "iobroker.tradfri", - "version": "0.5.0-beta4", + "version": "0.5.0", "description": "ioBroker tradfri Adapter", "author": { "name": "AlCalzone", From 6319a6135dfd22323edd5696bdb474b6b83fcb8a Mon Sep 17 00:00:00 2001 From: Dominic Griesel Date: Sat, 28 Oct 2017 19:14:28 +0200 Subject: [PATCH 51/51] exclude maintenance scripts from npm --- .npmignore | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.npmignore b/.npmignore index 73966896..29103338 100644 --- a/.npmignore +++ b/.npmignore @@ -47,4 +47,7 @@ coverage # react sources admin/src/**/*.* # no clue why those are generated -build/admin/**/*.d.ts \ No newline at end of file +build/admin/**/*.d.ts + +# maintenance scripts +maintenance/** \ No newline at end of file