From 1693d863d3f312e0419bb272a00d0dd2197e5b3b Mon Sep 17 00:00:00 2001 From: Florian Rival Date: Tue, 23 Apr 2019 15:06:32 +0100 Subject: [PATCH] Integrate GDevelop.js (emscripten bindings of Core/Extensions to JS) inside the repository --- .clang_complete | 14 +- .gitignore | 2 - .travis.yml | 45 +- GDevelop.js/.gitignore | 11 + GDevelop.js/.prettierrc | 4 + .../Bindings/BehaviorJsImplementation.cpp | 94 + .../Bindings/BehaviorJsImplementation.h | 38 + .../BehaviorSharedDataJsImplementation.cpp | 101 + .../BehaviorSharedDataJsImplementation.h | 38 + GDevelop.js/Bindings/Bindings.idl | 2318 +++++ .../Bindings/ObjectJsImplementation.cpp | 162 + GDevelop.js/Bindings/ObjectJsImplementation.h | 48 + GDevelop.js/Bindings/ProjectHelper.h | 215 + GDevelop.js/Bindings/Wrapper.cpp | 560 ++ GDevelop.js/Bindings/postjs.js | 175 + GDevelop.js/Bindings/prejs.js | 19 + GDevelop.js/CMakeLists.txt | 101 + GDevelop.js/Gruntfile.js | 172 + GDevelop.js/Readme.md | 74 + GDevelop.js/__tests__/Core.js | 2593 ++++++ GDevelop.js/__tests__/GDJS.js | 308 + GDevelop.js/__tests__/Serializer.js | 97 + GDevelop.js/__tests__/Stress.js | 23 + GDevelop.js/__tests__/Vector.js | 65 + GDevelop.js/license.txt | 21 + GDevelop.js/package-lock.json | 7505 +++++++++++++++++ GDevelop.js/package.json | 39 + GDevelop.js/update-bindings.js | 193 + 28 files changed, 15014 insertions(+), 21 deletions(-) create mode 100644 GDevelop.js/.gitignore create mode 100644 GDevelop.js/.prettierrc create mode 100644 GDevelop.js/Bindings/BehaviorJsImplementation.cpp create mode 100644 GDevelop.js/Bindings/BehaviorJsImplementation.h create mode 100644 GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.cpp create mode 100644 GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.h create mode 100644 GDevelop.js/Bindings/Bindings.idl create mode 100644 GDevelop.js/Bindings/ObjectJsImplementation.cpp create mode 100644 GDevelop.js/Bindings/ObjectJsImplementation.h create mode 100644 GDevelop.js/Bindings/ProjectHelper.h create mode 100644 GDevelop.js/Bindings/Wrapper.cpp create mode 100644 GDevelop.js/Bindings/postjs.js create mode 100644 GDevelop.js/Bindings/prejs.js create mode 100644 GDevelop.js/CMakeLists.txt create mode 100644 GDevelop.js/Gruntfile.js create mode 100644 GDevelop.js/Readme.md create mode 100644 GDevelop.js/__tests__/Core.js create mode 100644 GDevelop.js/__tests__/GDJS.js create mode 100644 GDevelop.js/__tests__/Serializer.js create mode 100644 GDevelop.js/__tests__/Stress.js create mode 100644 GDevelop.js/__tests__/Vector.js create mode 100644 GDevelop.js/license.txt create mode 100644 GDevelop.js/package-lock.json create mode 100644 GDevelop.js/package.json create mode 100644 GDevelop.js/update-bindings.js diff --git a/.clang_complete b/.clang_complete index 6330aaa69..3be508a9a 100644 --- a/.clang_complete +++ b/.clang_complete @@ -6,17 +6,13 @@ -DMACOS -DRELEASE -D_FILE_OFFSET_BITS=64 --DwxDEBUG_LEVEL=0 -D_WCHAR_H_CPLUSPLUS_98_CONFORMANCE_ -Wno-potentially-evaluated-expression -std=gnu++11 --I/usr/local/Cellar/wxmac/3.0.2/include/wx-3.0 -DNDEBUG -fPIC --I/Users/florian/Projects/F/GD/ExtLibs/SFML/include --I/Users/florian/Projects/F/GD/Core --I/usr/local/Cellar/wxmac/3.0.2/lib/wx/include/osx_cocoa-unicode-3.0 --I/usr/local/Cellar/wxmac/3.0.2/include/wx-3.0 --I/Users/florian/Projects/F/GD/GDCpp/. --I/Users/florian/Projects/F/GD/GDJS/. --F/Users/florian/Projects/F/GD/ExtLibs/SFML/extlibs/libs-osx/Frameworks +-I./ExtLibs/SFML/include +-I./Core +-I./GDCpp/. +-I./GDJS/. +-F./ExtLibs/SFML/extlibs/libs-osx/Frameworks diff --git a/.gitignore b/.gitignore index ee149ed2b..d487e1492 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,6 @@ /Binaries/Releases/**/*.tar.lzma /Binaries/Releases/**/*.zip /Binaries/Releases/**/*.deb -/GDevelop.js *.depend *.layout *.xgdwe @@ -37,7 +36,6 @@ /Binaries/Output/Release_Linux/** /Binaries/Output/Debug_Darwin/** /Binaries/Output/Release_Darwin/** -/Binaries/Output/Frameworks/ !/Binaries/Output/Release_Linux/StartGDevelop.sh !/Binaries/Output/Release_Linux/CppPlatform/ /Binaries/**/MinGW32 diff --git a/.travis.yml b/.travis.yml index 126b1183c..84bfa109f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -17,15 +17,20 @@ env: - GCC_VERSION="4.8" addons: + artifacts: + s3_region: "us-east-1" + paths: + - Binaries/Output/libGD.js/Release apt: sources: - ubuntu-toolchain-r-test packages: - #Build dependencies: - - cmake + # Build dependencies: + # (Cmake 3+ is required by Emscripten) + - cmake3 - p7zip-full - g++-4.8 - #SFML dependencies: + # SFML dependencies: - libopenal-dev - libjpeg-dev - libglew-dev @@ -35,11 +40,14 @@ addons: - libglu1-mesa-dev - libfreetype6-dev -#Activate X Virtual Framebuffer to allow tests to -#use SFML. before_install: + #Activate X Virtual Framebuffer to allow tests to + #use SFML. - "export DISPLAY=:99.0" - "sh -e /etc/init.d/xvfb start" + # This workaround is required to avoid libstdc++ errors (Emscripten requires a recent version of libstdc++) + - wget -q -O libstdc++6 http://security.ubuntu.com/ubuntu/pool/main/g/gcc-5/libstdc++6_5.4.0-6ubuntu1~16.04.10_amd64.deb + - sudo dpkg --force-all -i libstdc++6 install: #Install newIDE tests dependencies @@ -50,28 +58,45 @@ install: - cd ../.. #Get the correct version of gcc/g++ - if [ "$CXX" = "g++" ]; then export CXX="g++-${GCC_VERSION}" CC="gcc-${GCC_VERSION}"; fi -#Compile the tests only +#Compile the tests only for GDCore and GDCpp - mkdir .build-tests - cd .build-tests - cmake -DBUILD_GDJS=FALSE -DBUILD_TESTS=TRUE -DCMAKE_CXX_COMPILER=$(which $CXX) -DCMAKE_C_COMPILER=$(which $CC) .. - make -j 4 - cd .. +# Install Emscripten (for GDevelop.js) + - git clone https://github.com/juj/emsdk.git + - cd emsdk + - ./emsdk install sdk-1.37.37-64bit + - ./emsdk activate sdk-1.37.37-64bit + - source ./emsdk_env.sh + - cd .. +# Install GDevelop.js dependencies + - cd GDevelop.js + - npm install -g grunt-cli + - npm install + - npm run build + - cd .. script: -#GDCore and GDCpp game engine tests: +# GDCore and GDCpp game engine tests: - cd .build-tests - Core/GDCore_tests - GDCpp/GDCpp_tests - Extensions/PathfindingBehavior/PathfindingBehavior_Runtime_tests - Extensions/LinkedObjects/LinkedObjects_Runtime_tests - cd .. -#newIDE tests: +# GDevelop.js tests + - cd GDevelop.js + - npm test + - cd .. +# newIDE tests: - cd newIDE/app - npm test - npm run flow - npm run check-format - cd ../.. -#GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started. -#See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd +# GDJS game engine tests, disabled on Travis CI because ChromeHeadless can't be started. +# See them running on Semaphore-CI instead: https://semaphoreci.com/4ian/gd # - cd GDJS/tests && npm test # - cd ../.. diff --git a/GDevelop.js/.gitignore b/GDevelop.js/.gitignore new file mode 100644 index 000000000..8a55d39a1 --- /dev/null +++ b/GDevelop.js/.gitignore @@ -0,0 +1,11 @@ +/node_modules +Bindings/parser.out +Bindings/WebIDLGrammar.pkl +Bindings/glue.cpp +Bindings/glue.js +parser.out +WebIDLGrammar.pkl +.cpp.old +examples/demo-generated-code.js +examples/demo-generated-game.json +**/.DS_Store diff --git a/GDevelop.js/.prettierrc b/GDevelop.js/.prettierrc new file mode 100644 index 000000000..c1a6f6671 --- /dev/null +++ b/GDevelop.js/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "es5" +} diff --git a/GDevelop.js/Bindings/BehaviorJsImplementation.cpp b/GDevelop.js/Bindings/BehaviorJsImplementation.cpp new file mode 100644 index 000000000..196c9074a --- /dev/null +++ b/GDevelop.js/Bindings/BehaviorJsImplementation.cpp @@ -0,0 +1,94 @@ +#include "BehaviorJsImplementation.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace gd; + +BehaviorJsImplementation* BehaviorJsImplementation::Clone() const { + BehaviorJsImplementation* clone = new BehaviorJsImplementation(*this); + + // Copy the references to the JS implementations of the functions (because we + // want an object cloned from C++ to retain the functions implemented in JS). + EM_ASM_INT( + { + var clone = + Module['wrapPointer']($0, Module['BehaviorJsImplementation']); + var self = + Module['wrapPointer']($1, Module['BehaviorJsImplementation']); + + clone['getProperties'] = self['getProperties']; + clone['updateProperty'] = self['updateProperty']; + }, + (int)clone, + (int)this); + + return clone; +} +std::map +BehaviorJsImplementation::GetProperties(gd::Project&) const { + std::map* jsCreatedProperties = nullptr; + std::map copiedProperties; + + jsCreatedProperties = (std::map*)EM_ASM_INT( + { + var self = Module['getCache'](Module['BehaviorJsImplementation'])[$0]; + if (!self.hasOwnProperty('getProperties')) + throw 'getProperties is not defined on a BehaviorJsImplementation.'; + + var objectContent = JSON.parse(Pointer_stringify($1)); + var newProperties = self['getProperties'](objectContent); + if (!newProperties) + throw 'getProperties returned nothing in a gd::BehaviorJsImplementation.'; + + return getPointer(newProperties); + }, + (int)this, + jsonContent.c_str()); + + copiedProperties = *jsCreatedProperties; + delete jsCreatedProperties; + return copiedProperties; +} +bool BehaviorJsImplementation::UpdateProperty(const gd::String& arg0, + const gd::String& arg1, + Project&) { + jsonContent = (const char*)EM_ASM_INT( + { + var self = Module['getCache'](Module['BehaviorJsImplementation'])[$0]; + if (!self.hasOwnProperty('updateProperty')) + throw 'updateProperty is not defined on a BehaviorJsImplementation.'; + var objectContent = JSON.parse(Pointer_stringify($1)); + self['updateProperty']( + objectContent, Pointer_stringify($2), Pointer_stringify($3)); + return ensureString(JSON.stringify(objectContent)); + }, + (int)this, + jsonContent.c_str(), + arg0.c_str(), + arg1.c_str()); + + return true; +} + +void BehaviorJsImplementation::SerializeTo(SerializerElement& arg0) const { + arg0.AddChild("content") = gd::Serializer::FromJSON(jsonContent); +} +void BehaviorJsImplementation::UnserializeFrom(const SerializerElement& arg1) { + jsonContent = gd::Serializer::ToJSON(arg1.GetChild("content")); +} + +void BehaviorJsImplementation::__destroy__() { // Useless? + EM_ASM_INT( + { + var self = Module['getCache'](Module['BehaviorJsImplementation'])[$0]; + if (!self.hasOwnProperty('__destroy__')) + throw 'a JSImplementation must implement all functions, you forgot BehaviorJsImplementation::__destroy__.'; + self['__destroy__'](); + }, + (int)this); +} diff --git a/GDevelop.js/Bindings/BehaviorJsImplementation.h b/GDevelop.js/Bindings/BehaviorJsImplementation.h new file mode 100644 index 000000000..6c1bd7fb1 --- /dev/null +++ b/GDevelop.js/Bindings/BehaviorJsImplementation.h @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include + +using namespace gd; + +/** + * \brief A gd::Behavior that stores its content in JSON and forward the properties related + * functions to Javascript with Emscripten. + */ +class BehaviorJsImplementation : public Behavior { + public: + BehaviorJsImplementation() : Behavior(), jsonContent("{}") {} + virtual BehaviorJsImplementation* Clone() const override; + + virtual std::map GetProperties( + gd::Project& project) const override; + virtual bool UpdateProperty(const gd::String& name, + const gd::String& value, + gd::Project& project) override; + + void __destroy__(); + + virtual void SerializeTo(SerializerElement& arg0) const override; + virtual void UnserializeFrom(const SerializerElement& arg1) override; + + const gd::String& GetRawJSONContent() const { return jsonContent; }; + BehaviorJsImplementation& SetRawJSONContent(const gd::String& newContent) { + jsonContent = newContent; + return *this; + }; + + private: + gd::String jsonContent; +}; diff --git a/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.cpp b/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.cpp new file mode 100644 index 000000000..1d203020e --- /dev/null +++ b/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.cpp @@ -0,0 +1,101 @@ +#include "BehaviorSharedDataJsImplementation.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace gd; + +std::shared_ptr +BehaviorSharedDataJsImplementation::Clone() const { + BehaviorSharedDataJsImplementation* clone = + new BehaviorSharedDataJsImplementation(*this); + + // Copy the references to the JS implementations of the functions (because we + // want an object cloned from C++ to retain the functions implemented in JS). + EM_ASM_INT( + { + var clone = Module['wrapPointer']( + $0, Module['BehaviorSharedDataJsImplementation']); + var self = Module['wrapPointer']( + $1, Module['BehaviorSharedDataJsImplementation']); + + clone['getProperties'] = self['getProperties']; + clone['updateProperty'] = self['updateProperty']; + }, + (int)clone, + (int)this); + + return std::shared_ptr(clone); +} +std::map +BehaviorSharedDataJsImplementation::GetProperties(gd::Project&) const { + std::map* jsCreatedProperties = nullptr; + std::map copiedProperties; + + jsCreatedProperties = (std::map*)EM_ASM_INT( + { + var self = Module['getCache']( + Module['BehaviorSharedDataJsImplementation'])[$0]; + if (!self.hasOwnProperty('getProperties')) + throw 'getProperties is not defined on a BehaviorSharedDataJsImplementation.'; + + var objectContent = JSON.parse(Pointer_stringify($1)); + var newProperties = self['getProperties'](objectContent); + if (!newProperties) + throw 'getProperties returned nothing in a gd::BehaviorSharedDataJsImplementation.'; + + return getPointer(newProperties); + }, + (int)this, + jsonContent.c_str()); + + copiedProperties = *jsCreatedProperties; + delete jsCreatedProperties; + return copiedProperties; +} +bool BehaviorSharedDataJsImplementation::UpdateProperty(const gd::String& arg0, + const gd::String& arg1, + Project&) { + jsonContent = (const char*)EM_ASM_INT( + { + var self = Module['getCache']( + Module['BehaviorSharedDataJsImplementation'])[$0]; + if (!self.hasOwnProperty('updateProperty')) + throw 'updateProperty is not defined on a BehaviorSharedDataJsImplementation.'; + var objectContent = JSON.parse(Pointer_stringify($1)); + self['updateProperty']( + objectContent, Pointer_stringify($2), Pointer_stringify($3)); + return ensureString(JSON.stringify(objectContent)); + }, + (int)this, + jsonContent.c_str(), + arg0.c_str(), + arg1.c_str()); + + return true; +} + +void BehaviorSharedDataJsImplementation::SerializeTo( + SerializerElement& arg0) const { + arg0.AddChild("content") = gd::Serializer::FromJSON(jsonContent); +} +void BehaviorSharedDataJsImplementation::UnserializeFrom( + const SerializerElement& arg1) { + jsonContent = gd::Serializer::ToJSON(arg1.GetChild("content")); +} + +void BehaviorSharedDataJsImplementation::__destroy__() { // Useless? + EM_ASM_INT( + { + var self = Module['getCache']( + Module['BehaviorSharedDataJsImplementation'])[$0]; + if (!self.hasOwnProperty('__destroy__')) + throw 'a JSImplementation must implement all functions, you forgot BehaviorSharedDataJsImplementation::__destroy__.'; + self['__destroy__'](); + }, + (int)this); +} diff --git a/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.h b/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.h new file mode 100644 index 000000000..ebcd5f269 --- /dev/null +++ b/GDevelop.js/Bindings/BehaviorSharedDataJsImplementation.h @@ -0,0 +1,38 @@ +#include +#include +#include +#include +#include +#include + +using namespace gd; + +/** + * \brief A gd::BehaviorsSharedData that stores its content in JSON and forward the properties related + * functions to Javascript with Emscripten. + */ +class BehaviorSharedDataJsImplementation : public BehaviorsSharedData { + public: + BehaviorSharedDataJsImplementation() : BehaviorsSharedData(), jsonContent("{}") {} + virtual std::shared_ptr Clone() const override; + + virtual std::map GetProperties( + gd::Project& project) const override; + virtual bool UpdateProperty(const gd::String& name, + const gd::String& value, + gd::Project& project) override; + + void __destroy__(); + + virtual void SerializeTo(SerializerElement& arg0) const override; + virtual void UnserializeFrom(const SerializerElement& arg1) override; + + const gd::String& GetRawJSONContent() const { return jsonContent; }; + BehaviorSharedDataJsImplementation& SetRawJSONContent(const gd::String& newContent) { + jsonContent = newContent; + return *this; + }; + + private: + gd::String jsonContent; +}; diff --git a/GDevelop.js/Bindings/Bindings.idl b/GDevelop.js/Bindings/Bindings.idl new file mode 100644 index 000000000..df3b4b3dc --- /dev/null +++ b/GDevelop.js/Bindings/Bindings.idl @@ -0,0 +1,2318 @@ +/* + * GDevelop.js + * Copyright 2015 Florian Rival (Florian.Rival@gmail.com). All rights reserved. + * This project is released under the MIT License. + */ + +/** + * IDL file for GDevelop classes bindings. + * + * Notes: + * + * WRAPPED_* and STATIC_* functions are declared as such + * to allow the Wrapper.cpp file to use a macro to do special work on it. + * These functions are renamed in the final .js file (so that + * `WRAPPED_set` become `set` for example). + */ + +//Interfaces for some types from +//the C++ Standard Library: + +interface VectorString { + void VectorString(); + + void push_back([Const] DOMString str); + void resize(unsigned long size); + unsigned long size(); + [Const, Ref] DOMString at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const] DOMString str); + void clear(); +}; + +interface VectorPlatformExtension { + unsigned long size(); + [Const] PlatformExtension WRAPPED_at(unsigned long index); +}; + +interface MapStringString { + [Const, Ref] DOMString MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const] DOMString str); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface MapStringBoolean { + void MapStringBoolean(); + + boolean MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, boolean value); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface MapStringVariable { + [Ref] Variable MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const, Ref] Variable prop); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface MapStringExpressionMetadata { + [Ref] ExpressionMetadata MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const, Ref] ExpressionMetadata prop); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface MapStringInstructionMetadata { + [Ref] InstructionMetadata MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const, Ref] InstructionMetadata prop); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface MapStringEventMetadata { + [Ref] EventMetadata MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const, Ref] EventMetadata prop); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface SetString { + void SetString(); + [Value] VectorString FREE_toNewVectorString(); +}; + +interface ProjectHelper { + [Ref] Project STATIC_CreateNewGDJSProject(); + void STATIC_InitializePlatforms(); + [Const, Value] DOMString STATIC_SanityCheckBehaviorProperty(Behavior behavior, [Const] DOMString propertyName, [Const] DOMString newValue); + [Const, Value] DOMString STATIC_SanityCheckBehaviorsSharedDataProperty(BehaviorsSharedData behavior, [Const] DOMString propertyName, [Const] DOMString newValue); + [Const, Value] DOMString STATIC_SanityCheckObjectProperty(gdObject obj, [Const] DOMString propertyName, [Const] DOMString newValue); + [Const, Value] DOMString STATIC_SanityCheckObjectInitialInstanceProperty(gdObject obj, [Const] DOMString propertyName, [Const] DOMString newValue); +}; + +interface VersionWrapper { + long STATIC_Major(); + long STATIC_Minor(); + long STATIC_Build(); + long STATIC_Revision(); + + [Const, Value] DOMString STATIC_FullString(); + [Const, Value] DOMString STATIC_Status(); + [Const, Value] DOMString STATIC_Year(); + [Const, Value] DOMString STATIC_Month(); + [Const, Value] DOMString STATIC_Date(); +}; + +interface Platform { + [Const, Value] DOMString GetName(); + [Const, Value] DOMString GetFullName(); + [Const, Value] DOMString GetSubtitle(); + [Const, Value] DOMString GetDescription(); + boolean IsExtensionLoaded([Const] DOMString name); + void RemoveExtension([Const] DOMString name); + void ReloadBuiltinExtensions(); + + [Const, Ref] VectorPlatformExtension GetAllPlatformExtensions(); +}; + +interface JsPlatform { + [Ref] JsPlatform STATIC_Get(); + void AddNewExtension([Const, Ref] PlatformExtension extension); + + // Inherited from Platform: + [Const, Value] DOMString GetName(); + [Const, Value] DOMString GetFullName(); + [Const, Value] DOMString GetSubtitle(); + [Const, Value] DOMString GetDescription(); + boolean IsExtensionLoaded([Const] DOMString name); + void RemoveExtension([Const] DOMString name); + void ReloadBuiltinExtensions(); + + [Const, Ref] VectorPlatformExtension GetAllPlatformExtensions(); +}; + +interface PairStringVariable { + void PairStringVariable(); + + [Const, Ref] DOMString WRAPPED_GetName(); + [Ref] Variable WRAPPED_GetVariable(); +}; + +interface Variable { + void Variable(); + + void SetString([Const] DOMString str); + [Const, Ref] DOMString GetString(); + void SetValue([Const] double val); + double GetValue(); + + boolean HasChild([Const] DOMString str); + [Ref] Variable GetChild([Const] DOMString str); + void RemoveChild([Const] DOMString name); + boolean RenameChild([Const] DOMString oldName, [Const] DOMString newName); + [Value] VectorString GetAllChildrenNames(); + unsigned long GetChildrenCount(); + boolean IsNumber(); + boolean IsStructure(); + boolean Contains([Const, Ref] Variable variableToSearch, boolean recursive); + void RemoveRecursively([Const, Ref] Variable variableToRemove); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface VariablesContainer { + void VariablesContainer(); + + boolean Has([Const] DOMString name); + [Ref] Variable Get([Const] DOMString name); + [Ref] Variable GetAt(unsigned long index); + [Const, Ref] DOMString GetNameAt(unsigned long index); + [Ref] Variable Insert([Const] DOMString name, [Const, Ref] Variable var, unsigned long index); + [Ref] Variable InsertNew([Const] DOMString name, unsigned long index); + void Remove([Const] DOMString name); + boolean Rename([Const] DOMString oldName, [Const] DOMString newName); + void Swap(unsigned long firstIndex, unsigned long secondIndex); + void Move(unsigned long oldIndex, unsigned long newIndex); + unsigned long GetPosition([Const] DOMString name); + unsigned long Count(); + void Clear(); + void RemoveRecursively([Const, Ref] Variable variableToRemove); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface ObjectGroup { + void ObjectGroup(); + + [Const, Ref] DOMString GetName(); + void SetName([Const] DOMString name); + void AddObject([Const] DOMString obj); + void RemoveObject([Const] DOMString obj); + boolean Find([Const] DOMString obj); + + [Const, Ref] VectorString GetAllObjectsNames(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface ObjectGroupsContainer { + void ObjectGroupsContainer(); + + boolean Has([Const] DOMString name); + [Ref] ObjectGroup Insert([Const, Ref] ObjectGroup objectGroup, unsigned long position); + [Ref] ObjectGroup InsertNew([Const] DOMString name, unsigned long position); + unsigned long Count(); + [Ref] ObjectGroup Get([Const] DOMString name); + [Ref] ObjectGroup GetAt(unsigned long index); + void Clear(); + void Remove([Const] DOMString name); + unsigned long GetPosition([Const] DOMString name); + boolean Rename([Const] DOMString oldName, [Const] DOMString newName); + void Move(unsigned long oldIndex, unsigned long newIndex); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface PlatformSpecificAssets { + void PlatformSpecificAssets(); + + boolean Has([Const] DOMString platform, [Const] DOMString name); + [Const, Ref] DOMString Get([Const] DOMString platform, [Const] DOMString name); + void Remove([Const] DOMString platform, [Const] DOMString name); + void Set([Const] DOMString platform, [Const] DOMString name, [Const] DOMString resourceName); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface LoadingScreen { + void LoadingScreen(); + + void ShowGDevelopSplash(boolean show); + boolean IsGDevelopSplashShown(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface ObjectsContainer { + void ObjectsContainer(); + + [Ref] gdObject InsertNewObject([Ref] Project project, [Const] DOMString type, [Const] DOMString name, unsigned long pos); + [Ref] gdObject InsertObject([Const, Ref] gdObject obj, unsigned long pos); + boolean HasObjectNamed([Const] DOMString name); + [Ref] gdObject GetObject([Const] DOMString name); + [Ref] gdObject GetObjectAt(unsigned long pos); + unsigned long GetObjectPosition([Const] DOMString name); + void RemoveObject([Const] DOMString name); + void SwapObjects(unsigned long first, unsigned long second); + void MoveObject(unsigned long oldIndex, unsigned long newIndex); + unsigned long GetObjectsCount(); + + [Ref] ObjectGroupsContainer GetObjectGroups(); +}; + +interface Project { + void Project(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetVersion([Const] DOMString authorName); + [Const, Ref] DOMString GetVersion(); + void SetAuthor([Const] DOMString authorName); + [Const, Ref] DOMString GetAuthor(); + void SetPackageName([Const] DOMString packageName); + [Const, Ref] DOMString GetPackageName(); + void SetOrientation([Const] DOMString orientation); + [Const, Ref] DOMString GetOrientation(); + void SetAdMobAppId([Const] DOMString adMobAppId); + [Const, Ref] DOMString GetAdMobAppId(); + void SetProjectFile([Const] DOMString file); + [Const, Ref] DOMString GetProjectFile(); + void SetDefaultWidth(long width); + long GetMainWindowDefaultWidth(); + void SetDefaultHeight(long height); + long GetMainWindowDefaultHeight(); + void SetScaleMode([Const] DOMString scaleMode); + [Const, Ref] DOMString GetScaleMode(); + void SetSizeOnStartupMode([Const] DOMString orientation); + [Const, Ref] DOMString GetSizeOnStartupMode(); + long GetMaximumFPS(); + void SetMaximumFPS(long fps); + long GetMinimumFPS(); + void SetMinimumFPS(long fps); + + void SetLastCompilationDirectory([Const] DOMString path); + [Const, Ref] DOMString GetLastCompilationDirectory(); + + [Const, Ref] VectorString GetUsedExtensions(); + void AddPlatform([Ref] Platform platform); + [Ref] Platform GetCurrentPlatform(); + + [Ref] PlatformSpecificAssets GetPlatformSpecificAssets(); + [Ref] LoadingScreen GetLoadingScreen(); + + //createObject + //createEvent + + boolean HasLayoutNamed([Const] DOMString name); + [Ref] Layout GetLayout([Const] DOMString name); + [Ref] Layout GetLayoutAt(unsigned long index); + void SwapLayouts(unsigned long first, unsigned long second); + unsigned long GetLayoutsCount(); + [Ref] Layout InsertNewLayout([Const] DOMString name, unsigned long position); + void RemoveLayout([Const] DOMString name); + void SetFirstLayout([Const] DOMString name); + [Const, Ref] DOMString GetFirstLayout(); + + boolean HasExternalEventsNamed([Const] DOMString name); + [Ref] ExternalEvents GetExternalEvents([Const] DOMString name); + [Ref] ExternalEvents GetExternalEventsAt(unsigned long index); + void SwapExternalEvents(unsigned long first, unsigned long second); + unsigned long GetExternalEventsCount(); + [Ref] ExternalEvents InsertNewExternalEvents([Const] DOMString name, unsigned long position); + void RemoveExternalEvents([Const] DOMString name); + + boolean HasExternalLayoutNamed([Const] DOMString name); + [Ref] ExternalLayout GetExternalLayout([Const] DOMString name); + [Ref] ExternalLayout GetExternalLayoutAt(unsigned long index); + void SwapExternalLayouts(unsigned long first, unsigned long second); + unsigned long GetExternalLayoutsCount(); + [Ref] ExternalLayout InsertNewExternalLayout([Const] DOMString name, unsigned long position); + void RemoveExternalLayout([Const] DOMString name); + + boolean HasEventsFunctionsExtensionNamed([Const] DOMString name); + [Ref] EventsFunctionsExtension GetEventsFunctionsExtension([Const] DOMString name); + [Ref] EventsFunctionsExtension GetEventsFunctionsExtensionAt(unsigned long index); + void SwapEventsFunctionsExtensions(unsigned long first, unsigned long second); + unsigned long GetEventsFunctionsExtensionsCount(); + [Ref] EventsFunctionsExtension InsertNewEventsFunctionsExtension([Const] DOMString name, unsigned long position); + void RemoveEventsFunctionsExtension([Const] DOMString name); + + [Ref] VariablesContainer GetVariables(); + [Ref] ResourcesManager GetResourcesManager(); + void ExposeResources([Ref] ArbitraryResourceWorker worker); + boolean STATIC_ValidateObjectName([Const] DOMString name); + boolean IsDirty(); + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); + + [Const, Value] DOMString FREE_GetTypeOfBehavior([Const, Ref] Layout layout, [Const] DOMString name, boolean searchInGroups); + [Const, Value] DOMString FREE_GetTypeOfObject([Const, Ref] Layout layout, [Const] DOMString name, boolean searchInGroups); + [Value] VectorString FREE_GetBehaviorsOfObject([Const, Ref] Layout layout, [Const] DOMString name, boolean searchInGroups); + + //Inherited from gd::ObjectsContainer + [Ref] gdObject InsertNewObject([Ref] Project project, [Const] DOMString type, [Const] DOMString name, unsigned long pos); + [Ref] gdObject InsertObject([Const, Ref] gdObject obj, unsigned long pos); + boolean HasObjectNamed([Const] DOMString name); + [Ref] gdObject GetObject([Const] DOMString name); + [Ref] gdObject GetObjectAt(unsigned long pos); + unsigned long GetObjectPosition([Const] DOMString name); + void RemoveObject([Const] DOMString name); + void SwapObjects(unsigned long first, unsigned long second); + void MoveObject(unsigned long oldIndex, unsigned long newIndex); + unsigned long GetObjectsCount(); + + [Ref] ObjectGroupsContainer GetObjectGroups(); +}; + +interface Behavior { + void Behavior(); + + Behavior Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + [Const, Ref] DOMString GetTypeName(); + + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); +}; + +[JSImplementation="Behavior"] +interface BehaviorJsImplementation { + void BehaviorJsImplementation(); + // BehaviorJsImplementation Clone(); Not exposed + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); + + [Const, Ref] DOMString GetRawJSONContent(); + [Ref] BehaviorJsImplementation SetRawJSONContent([Const] DOMString newContent); +}; + +interface BehaviorsSharedData { + void BehaviorsSharedData(); + [Const, Ref] DOMString GetName(); + [Const, Ref] DOMString GetTypeName(); + + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +[JSImplementation="BehaviorsSharedData"] +interface BehaviorSharedDataJsImplementation { + void BehaviorSharedDataJsImplementation(); + // BehaviorSharedDataJsImplementation Clone(); Not exposed + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); + + [Const, Ref] DOMString GetRawJSONContent(); + [Ref] BehaviorSharedDataJsImplementation SetRawJSONContent([Const] DOMString newContent); +}; + +interface gdObject { + // /!\ We need to call it gdObject to avoid messing up with javascript Object + // global in glue.js! + void gdObject([Const] DOMString name); + // [Value] UniquePtrObject Clone(); Not exposed + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface UniquePtrObject { + gdObject get(); + gdObject release(); +}; + +[JSImplementation="gdObject"] +interface ObjectJsImplementation { + void ObjectJsImplementation([Const] DOMString name); + [Value] UniquePtrObject Clone(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + [Const, Ref] DOMString GetRawJSONContent(); + [Ref] ObjectJsImplementation SetRawJSONContent([Const] DOMString newContent); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); + + // Not exposed as protected: + // void DoSerializeTo([Ref] SerializerElement element); + // void DoUnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface Layout { + void Layout(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetBackgroundColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetBackgroundColorRed(); + unsigned long GetBackgroundColorGreen(); + unsigned long GetBackgroundColorBlue(); + void SetWindowDefaultTitle([Const] DOMString name); + [Const, Ref] DOMString GetWindowDefaultTitle(); + [Ref] InitialInstancesContainer GetInitialInstances(); + [Ref] VariablesContainer GetVariables(); + [Ref] EventsList GetEvents(); + + void UpdateBehaviorsSharedData([Ref] Project project); + [Value] VectorString GetAllBehaviorSharedDataNames(); + boolean HasBehaviorSharedData([Const] DOMString behaviorName); + [Ref] BehaviorsSharedData GetBehaviorSharedData([Const] DOMString behaviorName); + + void InsertNewLayer([Const] DOMString name, unsigned long position); + void InsertLayer([Const, Ref] Layer layer, unsigned long position); + [Ref] Layer GetLayer([Const] DOMString name); + [Ref] Layer GetLayerAt(unsigned long pos); + boolean HasLayerNamed([Const] DOMString name); + void RemoveLayer([Const] DOMString name); + unsigned long GetLayersCount(); + void SwapLayers(unsigned long firstLayerIndex, unsigned long secondLayerIndex); + void MoveLayer(unsigned long oldIndex, unsigned long newIndex); + void SerializeLayersTo([Ref] SerializerElement element); + void UnserializeLayersFrom([Const, Ref] SerializerElement element); + + [Ref] LayoutEditorCanvasOptions GetAssociatedSettings(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); + + void SetStopSoundsOnStartup(boolean enable); + boolean StopSoundsOnStartup(); + + //Inherited from gd::ObjectsContainer + [Ref] gdObject InsertNewObject([Ref] Project project, [Const] DOMString type, [Const] DOMString name, unsigned long pos); + [Ref] gdObject InsertObject([Const, Ref] gdObject obj, unsigned long pos); + boolean HasObjectNamed([Const] DOMString name); + [Ref] gdObject GetObject([Const] DOMString name); + [Ref] gdObject GetObjectAt(unsigned long pos); + unsigned long GetObjectPosition([Const] DOMString name); + void RemoveObject([Const] DOMString name); + void SwapObjects(unsigned long first, unsigned long second); + void MoveObject(unsigned long oldIndex, unsigned long newIndex); + unsigned long GetObjectsCount(); + + [Ref] ObjectGroupsContainer GetObjectGroups(); +}; + +interface ExternalEvents { + void ExternalEvents(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + + [Const, Ref] DOMString GetAssociatedLayout(); + void SetAssociatedLayout([Const] DOMString name); + + [Ref] EventsList GetEvents(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface ExternalLayout { + void ExternalLayout(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + + void SetAssociatedLayout([Const] DOMString name); + [Const, Ref] DOMString GetAssociatedLayout(); + + [Ref] InitialInstancesContainer GetInitialInstances(); + [Ref] LayoutEditorCanvasOptions GetAssociatedSettings(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface Layer { + void Layer(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetVisibility(boolean visible); + boolean GetVisibility(); +}; + +interface PropertyDescriptor { + void PropertyDescriptor([Const] DOMString propValue); + + [Ref] PropertyDescriptor SetValue([Const] DOMString value); + [Const, Ref] DOMString GetValue(); + [Ref] PropertyDescriptor SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + [Ref] PropertyDescriptor SetLabel([Const] DOMString label); + [Const, Ref] DOMString GetLabel(); + [Ref] PropertyDescriptor AddExtraInfo([Const] DOMString type); + [Value] VectorString GetExtraInfo(); +}; + +interface MapStringPropertyDescriptor { + void MapStringPropertyDescriptor(); + + [Ref] PropertyDescriptor MAP_get([Const] DOMString name); + void MAP_set([Const] DOMString name, [Const, Ref] PropertyDescriptor prop); + boolean MAP_has([Const] DOMString name); + [Value] VectorString MAP_keys(); +}; + +interface Resource { + void Resource(); + + Resource Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetKind([Const] DOMString kind); + [Const, Ref] DOMString GetKind(); + boolean IsUserAdded(); + void SetUserAdded(boolean yes); + boolean UseFile(); + void SetFile([Const] DOMString file); + [Const, Ref] DOMString GetFile(); + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface ResourcesManager { + void ResourcesManager(); + + [Value] VectorString GetAllResourceNames(); + boolean HasResource([Const] DOMString name); + [Const, Ref] Resource GetResource([Const] DOMString name); + boolean AddResource([Const, Ref] Resource res); + void RemoveResource([Const] DOMString name); + void RenameResource([Const] DOMString oldName, [Const] DOMString name); + unsigned long GetResourcePosition([Const] DOMString name); + boolean MoveResourceUpInList([Const] DOMString oldName); + boolean MoveResourceDownInList([Const] DOMString oldName); + void MoveResource(unsigned long oldIndex, unsigned long newIndex); +}; + +interface ImageResource { + void ImageResource(); + + boolean IsSmooth(); + void SetSmooth(boolean enable); + + //Inherited from Resource: + Resource Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetKind([Const] DOMString kind); + [Const, Ref] DOMString GetKind(); + boolean IsUserAdded(); + void SetUserAdded(boolean yes); + boolean UseFile(); + void SetFile([Const] DOMString file); + [Const, Ref] DOMString GetFile(); + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface AudioResource { + void AudioResource(); + + //Inherited from Resource: + Resource Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetKind([Const] DOMString kind); + [Const, Ref] DOMString GetKind(); + boolean IsUserAdded(); + void SetUserAdded(boolean yes); + boolean UseFile(); + void SetFile([Const] DOMString file); + [Const, Ref] DOMString GetFile(); + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface FontResource { + void FontResource(); + + //Inherited from Resource: + Resource Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetKind([Const] DOMString kind); + [Const, Ref] DOMString GetKind(); + boolean IsUserAdded(); + void SetUserAdded(boolean yes); + boolean UseFile(); + void SetFile([Const] DOMString file); + [Const, Ref] DOMString GetFile(); + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface VideoResource { + void VideoResource(); + + //Inherited from Resource: + Resource Clone(); + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetKind([Const] DOMString kind); + [Const, Ref] DOMString GetKind(); + boolean IsUserAdded(); + void SetUserAdded(boolean yes); + boolean UseFile(); + void SetFile([Const] DOMString file); + [Const, Ref] DOMString GetFile(); + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface InitialInstance { + void InitialInstance(); + + void SetObjectName([Const] DOMString name); + [Const, Ref] DOMString GetObjectName(); + + float GetX(); + void SetX(float x); + float GetY(); + void SetY(float y); + float GetAngle(); + void SetAngle(float angle); + boolean IsLocked(); + void SetLocked(boolean lock); + long GetZOrder(); + void SetZOrder(long zOrder); + [Const, Ref] DOMString GetLayer(); + void SetLayer([Const] DOMString layer); + + void SetHasCustomSize(boolean enable); + boolean HasCustomSize(); + + void SetCustomWidth(float width); + float GetCustomWidth(); + void SetCustomHeight(float height); + float GetCustomHeight(); + + void UpdateCustomProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout layout); + [Value] MapStringPropertyDescriptor GetCustomProperties([Ref] Project project, [Ref] Layout layout); + float GetRawFloatProperty([Const] DOMString name); + [Const, Ref] DOMString GetRawStringProperty([Const] DOMString name); + void SetRawFloatProperty([Const] DOMString name, float value); + void SetRawStringProperty([Const] DOMString name, [Const] DOMString value); + + [Ref] VariablesContainer GetVariables(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface InitialInstancesContainer { + void InitialInstancesContainer(); + InitialInstancesContainer Clone(); + + unsigned long GetInstancesCount(); + + void IterateOverInstances([Ref] InitialInstanceFunctor func); + void IterateOverInstancesWithZOrdering([Ref] InitialInstanceFunctor func, [Const] DOMString layer); + void MoveInstancesToLayer([Const] DOMString fromLayer, [Const] DOMString toLayer); + void RemoveAllInstancesOnLayer([Const] DOMString layer); + void RemoveInitialInstancesOfObject([Const] DOMString obj); + boolean HasInstancesOfObject([Const] DOMString objectName); + boolean SomeInstancesAreOnLayer([Const] DOMString layer); + void RenameInstancesOfObject([Const] DOMString oldName, [Const] DOMString newName); + void RemoveInstance([Const, Ref] InitialInstance inst); + + [Ref] InitialInstance InsertNewInitialInstance(); + [Ref] InitialInstance InsertInitialInstance([Const, Ref] InitialInstance inst); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +interface HighestZOrderFinder { + void HighestZOrderFinder(); + + void RestrictSearchToLayer([Const] DOMString layer); + long GetHighestZOrder(); + long GetLowestZOrder(); +}; + +interface InitialInstanceFunctor {}; +interface InitialInstanceJSFunctorWrapper {}; +[JSImplementation="InitialInstanceJSFunctorWrapper"] +interface InitialInstanceJSFunctor { + void InitialInstanceJSFunctor(); + + void invoke(InitialInstance instance); +}; + +interface SerializerValue { + boolean GetBool(); + [Const, Value] DOMString GetString(); + long GetInt(); + float GetDouble(); +}; + +interface SerializerElement { + void SerializerElement(); + + [Const, Ref] SerializerValue GetValue(); + void WRAPPED_SetBool(boolean value); + void WRAPPED_SetString([Const] DOMString value); + void WRAPPED_SetInt(long value); + void WRAPPED_SetDouble(float value); + + void ConsiderAsArray(); + boolean ConsideredAsArray(); + + [Ref] SerializerElement AddChild([Const] DOMString str); + [Ref] SerializerElement GetChild([Const] DOMString str); + void WRAPPED_SetChild([Const] DOMString str, [Const, Ref] SerializerElement element); + boolean HasChild([Const] DOMString str); +}; + +interface Serializer { + [Const, Value] DOMString STATIC_ToJSON([Const, Ref] SerializerElement element); + [Value] SerializerElement STATIC_FromJSON([Const] DOMString json); +}; + +interface InstructionsList { + void InstructionsList(); + + [Ref] Instruction Insert([Const, Ref] Instruction instr, unsigned long pos); + void InsertInstructions([Const, Ref] InstructionsList list, unsigned long begin, unsigned long end, unsigned long pos); + unsigned long size(); + void WRAPPED_set(unsigned long index, [Const, Ref] Instruction instr); + boolean Contains([Const, Ref] Instruction instr/*, boolean recursive*/); //TODO + [Ref] Instruction Get(unsigned long index); + void Remove([Const, Ref] Instruction instr); + void RemoveAt(unsigned long index); + void Clear(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface Instruction { + void Instruction(); + + Instruction CLONE_Instruction(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + void SetInverted(boolean inverted); + boolean IsInverted(); + void SetParameter(unsigned long id, [Const] DOMString value); + [Const, Ref] DOMString GetParameter(unsigned long id); + void SetParametersCount(unsigned long count); + unsigned long GetParametersCount(); + [Ref] InstructionsList GetSubInstructions(); +}; + +interface VectorPairStringTextFormatting { + unsigned long size(); + [Const, Ref] DOMString WRAPPED_GetString(unsigned long id); + [Ref] TextFormatting WRAPPED_GetTextFormatting(unsigned long id); +}; + +interface TextFormatting { + boolean IsBold(); + boolean IsItalic(); + unsigned long GetColorRed(); + unsigned long GetColorGreen(); + unsigned long GetColorBlue(); + unsigned long GetUserData(); +}; + +interface InstructionSentenceFormatter { + InstructionSentenceFormatter STATIC_Get(); + [Const, Value] DOMString Translate([Const, Ref] Instruction instr, [Const, Ref] InstructionMetadata metadat); + [Value] VectorPairStringTextFormatting GetAsFormattedText([Const, Ref] Instruction instr, [Const, Ref] InstructionMetadata metadat); + [Value] TextFormatting GetFormattingFromType([Const] DOMString type); + [Const, Value] DOMString LabelFromType([Const] DOMString type); + void LoadTypesFormattingFromConfig(); +}; + +//TODO: This should be renamed to InstructionCodeGenerationInformation +[Prefix="gd::InstructionMetadata::"] +interface ExtraInformation { + [Ref] ExtraInformation SetFunctionName([Const] DOMString functionName_); + [Ref] ExtraInformation SetManipulatedType([Const] DOMString type_); + [Ref] ExtraInformation SetGetter([Const] DOMString getter); + [Ref] ExtraInformation SetMutators([Const, Ref] MapStringString mutators); + [Ref] ExtraInformation SetIncludeFile([Const] DOMString includeFile); + [Ref] ExtraInformation AddIncludeFile([Const] DOMString includeFile); +}; + +interface ExpressionCodeGenerationInformation { + [Ref] ExpressionCodeGenerationInformation SetFunctionName([Const] DOMString functionName); + [Ref] ExpressionCodeGenerationInformation SetStatic(); + [Ref] ExpressionCodeGenerationInformation SetIncludeFile([Const] DOMString includeFile); + [Ref] ExpressionCodeGenerationInformation AddIncludeFile([Const] DOMString includeFile); +}; + +interface InstructionMetadata { + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetSentence(); + [Const, Ref] DOMString GetGroup(); + [Const, Ref] DOMString GetIconFilename(); + [Const, Ref] DOMString GetSmallIconFilename(); + [Const, Ref] DOMString GetHelpPath(); + boolean CanHaveSubInstructions(); + [Ref] ParameterMetadata GetParameter(unsigned long index); + unsigned long GetParametersCount(); + [Const, Ref] VectorParameterMetadata GetParameters(); + long GetUsageComplexity(); + boolean IsHidden(); + + [Ref] InstructionMetadata SetCanHaveSubInstructions(); + [Ref] InstructionMetadata SetHelpPath([Const] DOMString helpPath); + [Ref] InstructionMetadata SetHidden(); + [Ref] InstructionMetadata SetGroup([Const] DOMString group); //TODO: check if useful + [Ref] InstructionMetadata AddParameter([Const] DOMString type, + [Const] DOMString description, + [Const] DOMString optionalObjectType, + boolean parameterIsOptional); + [Ref] InstructionMetadata AddCodeOnlyParameter( + [Const] DOMString type, [Const] DOMString supplementaryInformation); + [Ref] InstructionMetadata SetDefaultValue([Const] DOMString defaultValue); + [Ref] InstructionMetadata MarkAsSimple(); + [Ref] InstructionMetadata MarkAsAdvanced(); + [Ref] InstructionMetadata MarkAsComplex(); + + [Ref] ExtraInformation GetCodeExtraInformation(); +}; + +interface ExpressionMetadata { + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetGroup(); + [Const, Ref] DOMString GetSmallIconFilename(); + boolean IsShown(); + [Ref] ParameterMetadata GetParameter(unsigned long id); + unsigned long GetParametersCount(); + [Const, Ref] VectorParameterMetadata GetParameters(); + + [Ref] ExpressionMetadata SetHidden(); + [Ref] ExpressionMetadata SetGroup([Const] DOMString str); //TODO: check if useful + [Ref] ExpressionMetadata AddParameter( + [Const] DOMString type, + [Const] DOMString description, + [Const] DOMString optionalObjectType, + boolean parameterIsOptional); + [Ref] ExpressionMetadata AddCodeOnlyParameter( + [Const] DOMString type, [Const] DOMString supplementaryInformation); + [Ref] ExpressionMetadata SetDefaultValue([Const] DOMString defaultValue); + + [Ref] ExpressionCodeGenerationInformation GetCodeExtraInformation(); +}; + +interface ParameterMetadata { + void ParameterMetadata(); + + [Const, Ref] DOMString GetType(); + [Ref] ParameterMetadata SetType([Const] DOMString type_); + [Const, Ref] DOMString GetName(); + [Ref] ParameterMetadata SetName([Const] DOMString name_); + [Const, Ref] DOMString GetExtraInfo(); + [Ref] ParameterMetadata SetExtraInfo([Const] DOMString extraInfo_); + boolean IsOptional(); + [Ref] ParameterMetadata SetOptional(boolean optional_); + [Const, Ref] DOMString GetDescription(); + [Ref] ParameterMetadata SetDescription([Const] DOMString description_); + boolean IsCodeOnly(); + [Ref] ParameterMetadata SetCodeOnly(boolean codeOnly_); + [Const, Ref] DOMString GetDefaultValue(); + [Ref] ParameterMetadata SetDefaultValue([Const] DOMString defaultValue_); + boolean STATIC_IsObject([Const] DOMString param); + boolean STATIC_IsBehavior([Const] DOMString param); +}; + +interface VectorParameterMetadata { + void VectorParameterMetadata(); + + void push_back([Const, Ref] ParameterMetadata parameterMetadata); + unsigned long size(); + [Ref] ParameterMetadata at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] ParameterMetadata parameterMetadata); + void FREE_removeFromVectorParameterMetadata(unsigned long index); + void clear(); +}; + +interface ParameterMetadataTools { + void STATIC_ParametersToObjectsContainer([Ref] Project project, [Const, Ref] VectorParameterMetadata parameters, [Ref] ObjectsContainer outputObjectsContainer); + unsigned long STATIC_GetObjectParameterIndexFor([Const, Ref] VectorParameterMetadata parameters, unsigned long parameterIndex); +}; + +interface EventsFunctionTools { + void STATIC_EventsFunctionToObjectsContainer([Ref] Project project, [Const, Ref] EventsFunction eventsFunction, [Ref] ObjectsContainer outputObjectsContainer); +}; + +interface ObjectMetadata { + [Const, Ref] DOMString GetName(); + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetIconFilename(); + + [Const, Ref] InstructionMetadata AddCondition([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] InstructionMetadata AddAction([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddStrExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Ref] ObjectMetadata SetIncludeFile([Const] DOMString includeFile); + [Ref] ObjectMetadata AddIncludeFile([Const] DOMString includeFile); +}; + +interface BehaviorMetadata { + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetDefaultName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetGroup(); + [Const, Ref] DOMString GetIconFilename(); + + [Const, Ref] InstructionMetadata AddCondition([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] InstructionMetadata AddAction([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddStrExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Ref] BehaviorMetadata SetIncludeFile([Const] DOMString includeFile); + [Ref] BehaviorMetadata AddIncludeFile([Const] DOMString includeFile); + + Behavior WRAPPED_Get(); + BehaviorsSharedData WRAPPED_GetSharedDataInstance(); +}; + +interface EventMetadata { + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetGroup(); +}; + +interface PlatformExtension { + void PlatformExtension(); + [Ref] PlatformExtension SetExtensionInformation([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString author, + [Const] DOMString license); + [Ref] PlatformExtension SetExtensionHelpPath([Const] DOMString helpPath); + void MarkAsDeprecated(); + + [Const, Ref] InstructionMetadata AddCondition([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] InstructionMetadata AddAction([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString sentence, + [Const] DOMString group, + [Const] DOMString icon, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Const, Ref] ExpressionMetadata AddStrExpression([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString smallicon); + + [Ref] BehaviorMetadata WRAPPED_AddBehavior([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString defaultName, + [Const] DOMString description, + [Const] DOMString group, + [Const] DOMString icon24x24, + [Const] DOMString className, + Behavior instance, + BehaviorsSharedData sharedDatasInstance); + + [Ref] ObjectMetadata WRAPPED_AddObject([Const] DOMString name, + [Const] DOMString fullname, + [Const] DOMString description, + [Const] DOMString icon24x24, + gdObject instance); + + [Const, Ref] DOMString GetFullName(); + [Const, Ref] DOMString GetName(); + [Const, Ref] DOMString GetDescription(); + [Const, Ref] DOMString GetAuthor(); + [Const, Ref] DOMString GetLicense(); + [Const, Ref] DOMString GetHelpPath(); + boolean IsBuiltin(); + [Const, Ref] DOMString GetNameSpace(); + + [Value] VectorString GetExtensionObjectsTypes(); + [Value] VectorString GetBehaviorsTypes(); + [Ref] ObjectMetadata GetObjectMetadata([Const] DOMString type); + [Ref] BehaviorMetadata GetBehaviorMetadata([Const] DOMString type); + [Ref] MapStringEventMetadata GetAllEvents(); + [Ref] MapStringInstructionMetadata GetAllActions(); + [Ref] MapStringInstructionMetadata GetAllConditions(); + [Ref] MapStringExpressionMetadata GetAllExpressions(); + [Ref] MapStringExpressionMetadata GetAllStrExpressions(); + [Ref] MapStringInstructionMetadata GetAllActionsForObject([Const] DOMString objectType); + [Ref] MapStringInstructionMetadata GetAllConditionsForObject([Const] DOMString objectType); + [Ref] MapStringExpressionMetadata GetAllExpressionsForObject([Const] DOMString objectType); + [Ref] MapStringExpressionMetadata GetAllStrExpressionsForObject([Const] DOMString objectType); + [Ref] MapStringInstructionMetadata GetAllActionsForBehavior([Const] DOMString autoType); + [Ref] MapStringInstructionMetadata GetAllConditionsForBehavior([Const] DOMString autoType); + [Ref] MapStringExpressionMetadata GetAllExpressionsForBehavior([Const] DOMString autoType); + [Ref] MapStringExpressionMetadata GetAllStrExpressionsForBehavior([Const] DOMString autoType); + + [Const, Value] DOMString STATIC_GetNamespaceSeparator(); +}; + +interface EventsList { + void EventsList(); + + [Ref] BaseEvent InsertEvent([Const, Ref] BaseEvent event, unsigned long pos); + [Ref] BaseEvent InsertNewEvent([Ref] Project project, [Const] DOMString type, unsigned long pos); + void InsertEvents([Const, Ref] EventsList list, unsigned long begin, unsigned long end, unsigned long pos); + [Ref] BaseEvent GetEventAt(unsigned long pos); + void RemoveEventAt(unsigned long pos); + void RemoveEvent([Const, Ref] BaseEvent event); + unsigned long GetEventsCount(); + boolean Contains([Const, Ref] BaseEvent event, boolean recursive); + boolean IsEmpty(); + void Clear(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + + +interface BaseEvent { + void BaseEvent(); + + BaseEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface StandardEvent { + void StandardEvent(); + + [Ref] InstructionsList GetConditions(); + [Ref] InstructionsList GetActions(); + + //Inherited from BaseEvent: + StandardEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface RepeatEvent { + void RepeatEvent(); + + [Ref] InstructionsList GetConditions(); + [Ref] InstructionsList GetActions(); + void SetRepeatExpression([Const] DOMString expr); + [Const, Ref] DOMString GetRepeatExpression(); + + //Inherited from BaseEvent: + RepeatEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface WhileEvent { + void WhileEvent(); + + [Ref] InstructionsList GetConditions(); + [Ref] InstructionsList GetWhileConditions(); + [Ref] InstructionsList GetActions(); + + //Inherited from BaseEvent: + WhileEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface ForEachEvent { + void ForEachEvent(); + + void SetObjectToPick([Const] DOMString objects); + [Const, Ref] DOMString GetObjectToPick(); + [Ref] InstructionsList GetConditions(); + [Ref] InstructionsList GetActions(); + + //Inherited from BaseEvent: + ForEachEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface CommentEvent { + void CommentEvent(); + + [Const, Ref] DOMString GetComment(); + void SetComment([Const] DOMString type); + + void SetBackgroundColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetBackgroundColorRed(); + unsigned long GetBackgroundColorGreen(); + unsigned long GetBackgroundColorBlue(); + + void SetTextColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetTextColorRed(); + unsigned long GetTextColorGreen(); + unsigned long GetTextColorBlue(); + + //Inherited from BaseEvent: + CommentEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface GroupEvent { + void GroupEvent(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetBackgroundColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetBackgroundColorR(); + unsigned long GetBackgroundColorG(); + unsigned long GetBackgroundColorB(); + void SetSource([Const] DOMString source); + [Const, Ref] DOMString GetSource(); + [Ref] VectorString GetCreationParameters(); + unsigned long GetCreationTimestamp(); + void SetCreationTimestamp(unsigned long ts); + + //Inherited from BaseEvent: + GroupEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface LinkEvent { + void LinkEvent(); + + void SetTarget([Const] DOMString name); + [Const, Ref] DOMString GetTarget(); + + long GetIncludeConfig(); + void SetIncludeAllEvents(); + void SetIncludeEventsGroup([Const] DOMString source); + [Const, Ref] DOMString GetEventsGroupName(); + void SetIncludeStartAndEnd(unsigned long start, unsigned long end); + unsigned long GetIncludeStart(); + unsigned long GetIncludeEnd(); + + //Inherited from BaseEvent: + LinkEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface EventsRemover { + void EventsRemover(); + + void AddEventToRemove([Ref] BaseEvent eventToRemove); + void AddInstructionToRemove([Ref] Instruction instructionToRemove); + void Launch([Ref] EventsList events); +}; + +interface EventsListUnfolder { + void STATIC_UnfoldWhenContaining([Ref] EventsList list, [Const, Ref] BaseEvent eventToContain); +}; + +interface EventsSearchResult { + boolean IsEventsListValid(); + [Const, Ref] EventsList GetEventsList(); + unsigned long GetPositionInList(); + boolean IsEventValid(); + [Const, Ref] BaseEvent GetEvent(); +}; + +interface VectorEventsSearchResult { + void VectorEventsSearchResult(); + + VectorEventsSearchResult CLONE_VectorEventsSearchResult(); + void push_back([Const, Ref] EventsSearchResult result); + void resize(unsigned long size); + unsigned long size(); + [Const, Ref] EventsSearchResult at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] EventsSearchResult result); + void clear(); +}; + +interface EventsRefactorer { + void STATIC_RenameObjectInEvents([Const, Ref] Platform platform, [Ref] ObjectsContainer project, [Ref] ObjectsContainer layout, [Ref] EventsList events, [Const] DOMString oldName, [Const] DOMString newName); + void STATIC_RemoveObjectInEvents([Const, Ref] Platform platform, [Ref] ObjectsContainer project, [Ref] ObjectsContainer layout, [Ref] EventsList events, [Const] DOMString name); + void STATIC_ReplaceStringInEvents([Ref] ObjectsContainer project, [Ref] ObjectsContainer layout, [Ref] EventsList events, [Const] DOMString toReplace, [Const] DOMString newString, boolean matchCase, boolean inConditions, boolean inActions); + [Value] VectorEventsSearchResult STATIC_SearchInEvents([Ref] ObjectsContainer project, [Ref] ObjectsContainer layout, [Ref] EventsList events, [Const] DOMString search, boolean matchCase, boolean inConditions, boolean inActions); +}; + +interface WholeProjectRefactorer { + void STATIC_ExposeProjectEvents([Ref] Project project, [Ref] ArbitraryEventsWorker worker); + void STATIC_RenameEventsFunctionsExtension( + [Ref] Project project, + [Const, Ref] EventsFunctionsExtension eventsFunctionsExtension, + [Const] DOMString oldName, + [Const] DOMString newName); + void STATIC_RenameEventsFunction( + [Ref] Project project, + [Const, Ref] EventsFunctionsExtension eventsFunctionsExtension, + [Const] DOMString oldName, + [Const] DOMString newName); + void STATIC_ObjectRenamedInLayout([Ref] Project project, [Ref] Layout layout, [Const] DOMString oldName, [Const] DOMString newName); + void STATIC_ObjectRemovedInLayout([Ref] Project project, [Ref] Layout layout, [Const] DOMString objectName, boolean removeEventsAndGroups); + void STATIC_GlobalObjectRenamed([Ref] Project project, [Const] DOMString oldName, [Const] DOMString newName); + void STATIC_GlobalObjectRemoved([Ref] Project project, [Const] DOMString objectName, boolean removeEventsAndGroups); +}; + +interface ExtensionAndBehaviorMetadata { + [Const, Ref] PlatformExtension GetExtension(); + [Const, Ref] BehaviorMetadata GetMetadata(); +}; + +interface ExtensionAndObjectMetadata { + [Const, Ref] PlatformExtension GetExtension(); + [Const, Ref] ObjectMetadata GetMetadata(); +}; + +interface ExtensionAndInstructionMetadata { + [Const, Ref] PlatformExtension GetExtension(); + [Const, Ref] InstructionMetadata GetMetadata(); +}; + +interface ExtensionAndExpressionMetadata { + [Const, Ref] PlatformExtension GetExtension(); + [Const, Ref] ExpressionMetadata GetMetadata(); +}; + +interface MetadataProvider { + + [Value] ExtensionAndBehaviorMetadata STATIC_GetExtensionAndBehaviorMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndObjectMetadata STATIC_GetExtensionAndObjectMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndInstructionMetadata STATIC_GetExtensionAndActionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndInstructionMetadata STATIC_GetExtensionAndConditionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndExpressionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndObjectExpressionMetadata([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndBehaviorExpressionMetadata([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndObjectStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + [Value] ExtensionAndExpressionMetadata STATIC_GetExtensionAndBehaviorStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + [Const, Ref] BehaviorMetadata STATIC_GetBehaviorMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] ObjectMetadata STATIC_GetObjectMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] InstructionMetadata STATIC_GetActionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] InstructionMetadata STATIC_GetConditionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetExpressionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetObjectExpressionMetadata([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetBehaviorExpressionMetadata([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetObjectStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + [Const, Ref] ExpressionMetadata STATIC_GetBehaviorStrExpressionMetadata([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + boolean STATIC_HasCondition([Const, Ref] Platform p, [Const] DOMString type); + boolean STATIC_HasAction([Const, Ref] Platform p, [Const] DOMString type); + boolean STATIC_HasObjectAction([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + boolean STATIC_HasObjectCondition([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + boolean STATIC_HasBehaviorAction([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + boolean STATIC_HasBehaviorCondition([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + boolean STATIC_HasExpression([Const, Ref] Platform p, [Const] DOMString type); + boolean STATIC_HasObjectExpression([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + boolean STATIC_HasBehaviorExpression([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); + boolean STATIC_HasStrExpression([Const, Ref] Platform p, [Const] DOMString type); + boolean STATIC_HasObjectStrExpression([Const, Ref] Platform p, [Const] DOMString objectType, [Const] DOMString type); + boolean STATIC_HasBehaviorStrExpression([Const, Ref] Platform p, [Const] DOMString autoType, [Const] DOMString type); +}; + +interface ParserCallbacks { + [Const, Ref] DOMString GetFirstError(); + unsigned long GetFirstErrorPosition(); +}; + +interface ExpressionParser { + void ExpressionParser([Const] DOMString expression); + + boolean ParseMathExpression([Const, Ref] Platform platform, [Const, Ref] Project project, [Const, Ref] Layout layout, [Ref] ParserCallbacks callbacks); + boolean ParseStringExpression([Const, Ref] Platform platform, [Const, Ref] Project project, [Const, Ref] Layout layout, [Ref] ParserCallbacks callbacks); + + [Const, Ref] DOMString GetFirstError(); + unsigned long GetFirstErrorPosition(); +}; + +interface CallbacksForExpressionCorrectnessTesting { + void CallbacksForExpressionCorrectnessTesting([Const, Ref] Project project, [Const, Ref] Layout layout); + + //Inherited from ParserCallbacks: + [Const, Ref] DOMString GetFirstError(); + unsigned long GetFirstErrorPosition(); +}; + +interface ExpressionParserDiagnostic { + boolean IsError(); + [Const, Ref] DOMString GetMessage(); + unsigned long GetStartPosition(); + unsigned long GetEndPosition(); +}; + +interface VectorExpressionParserDiagnostic { + unsigned long size(); + [Const] ExpressionParserDiagnostic at(unsigned long index); +}; + +interface ExpressionParser2NodeWorker { +}; + +interface ExpressionValidator { + void ExpressionValidator(); + + [Const, Ref] VectorExpressionParserDiagnostic GetErrors(); + + //Inherited from ExpressionParser2NodeWorker: +}; + +interface ExpressionNode { + void Visit([Ref] ExpressionParser2NodeWorker worker); +}; + +interface UniquePtrExpressionNode { + ExpressionNode get(); +}; + +interface ExpressionParser2 { + void ExpressionParser2([Const, Ref] Platform platform, [Const, Ref] ObjectsContainer globalObjectsContainer, [Const, Ref] ObjectsContainer objectsContainer); + + [Value] UniquePtrExpressionNode ParseExpression([Const] DOMString type, [Const] DOMString expression); +}; + +interface ExpressionCodeGenerator { + void STATIC_UseOldExpressionParser(boolean enable); + boolean STATIC_IsUsingOldExpressionParser(); +}; + +enum EventsFunction_FunctionType { + "EventsFunction::Action", + "EventsFunction::Condition", + "EventsFunction::Expression", + "EventsFunction::StringExpression" +}; + +interface EventsFunction { + void EventsFunction(); + + [Ref] EventsFunction SetDescription([Const] DOMString description); + [Const, Ref] DOMString GetDescription(); + [Ref] EventsFunction SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + [Ref] EventsFunction SetFullName([Const] DOMString fullName); + [Const, Ref] DOMString GetFullName(); + [Ref] EventsFunction SetSentence([Const] DOMString sentence); + [Const, Ref] DOMString GetSentence(); + [Ref] EventsFunction SetFunctionType(EventsFunction_FunctionType type); + EventsFunction_FunctionType GetFunctionType(); + + [Ref] EventsList GetEvents(); + [Ref] VectorParameterMetadata GetParameters(); + [Ref] ObjectGroupsContainer GetObjectGroups(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface VectorEventsFunction { + void VectorEventsFunction(); + + void push_back([Const, Ref] EventsFunction eventsFunction); + unsigned long size(); + [Ref] EventsFunction at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] EventsFunction eventsFunction); + void clear(); +}; + +interface EventsFunctionsExtension { + void EventsFunctionsExtension(); + + [Ref] EventsFunctionsExtension SetNamespace([Const] DOMString namespace); + [Const, Ref] DOMString GetNamespace(); + [Ref] EventsFunctionsExtension SetVersion([Const] DOMString version); + [Const, Ref] DOMString GetVersion(); + [Ref] EventsFunctionsExtension SetDescription([Const] DOMString description); + [Const, Ref] DOMString GetDescription(); + [Ref] EventsFunctionsExtension SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + [Ref] EventsFunctionsExtension SetFullName([Const] DOMString fullName); + [Const, Ref] DOMString GetFullName(); + + [Ref] EventsFunction InsertNewEventsFunction([Const] DOMString name, unsigned long pos); + [Ref] EventsFunction InsertEventsFunction([Const, Ref] EventsFunction eventsFunction, unsigned long pos); + boolean HasEventsFunctionNamed([Const] DOMString name); + [Ref] EventsFunction GetEventsFunction([Const] DOMString name); + [Ref] EventsFunction GetEventsFunctionAt(unsigned long pos); + void RemoveEventsFunction([Const] DOMString name); + void MoveEventsFunction(unsigned long oldIndex, unsigned long newIndex); + unsigned long GetEventsFunctionsCount(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface AbstractFileSystem { +}; + +[JSImplementation="AbstractFileSystem"] +interface AbstractFileSystemJS { + void AbstractFileSystemJS(); + + void MkDir([Const] DOMString dir); + void DirExists([Const] DOMString dir); + void ClearDir([Const] DOMString dir); + [Const, Ref] DOMString GetTempDir(); + [Const, Ref] DOMString FileNameFrom([Const] DOMString dir); + [Const, Ref] DOMString DirNameFrom([Const] DOMString dir); + //void MakeAbsolute([Const] DOMString dir); + //void MakeRelative([Const] DOMString dir); + boolean IsAbsolute([Const] DOMString fn); + void CopyFile([Const] DOMString src, [Const] DOMString dest); + void WriteToFile([Const] DOMString fn, [Const] DOMString content); + [Const, Ref] DOMString ReadFile([Const] DOMString fn); + [Value] VectorString ReadDir([Const] DOMString dir); + boolean FileExists([Const] DOMString fn); +}; + +interface ProjectResourcesAdder { + void STATIC_AddAllMissing([Ref] Project project, [Const] DOMString resourceType); + [Value] VectorString STATIC_GetAllUseless([Ref] Project project, [Const] DOMString resourceType); + void STATIC_RemoveAllUseless([Ref] Project project, [Const] DOMString resourceType); +}; + +interface ArbitraryEventsWorker { + void Launch([Ref] EventsList events); +}; + +interface EventsParametersLister { + void EventsParametersLister([Ref] Project project); + [Const, Ref] MapStringString GetParametersAndTypes(); + + //Inherited from ArbitraryEventsWorker + void Launch([Ref] EventsList events); +}; + +interface EventsTypesLister { + void EventsTypesLister([Const, Ref] Project project); + [Const, Ref] VectorString GetAllEventsTypes(); + [Const, Ref] VectorString GetAllConditionsTypes(); + [Const, Ref] VectorString GetAllActionsTypes(); + + //Inherited from ArbitraryEventsWorker + void Launch([Ref] EventsList events); +}; + +interface InstructionsTypeRenamer { + void InstructionsTypeRenamer([Const, Ref] Project project, [Const] DOMString oldType, [Const] DOMString newType); + + //Inherited from ArbitraryEventsWorker + void Launch([Ref] EventsList events); +}; + +interface EventsContext { + [Const, Ref] SetString GetReferencedObjectOrGroupNames(); + [Const, Ref] SetString GetObjectNames(); + [Const, Ref] SetString GetBehaviorNamesOfObjectOrGroup([Const] DOMString objectOrGroupName); +}; + +interface EventsContextAnalyzer { + void EventsContextAnalyzer([Const, Ref] Platform platform, [Ref] Project project, [Ref] Layout layout); + [Const, Ref] EventsContext GetEventsContext(); + + //Inherited from ArbitraryEventsWorker + void Launch([Ref] EventsList events); +}; + +interface ArbitraryResourceWorker { +}; +[JSImplementation="ArbitraryResourceWorker"] +interface ArbitraryResourceWorkerJS { + void ArbitraryResourceWorkerJS(); + + void ExposeImage([Ref] DOMString image); + void ExposeShader([Ref] DOMString shader); + void ExposeFile([Ref] DOMString file); +}; + +interface ResourcesMergingHelper { + void ResourcesMergingHelper([Ref] AbstractFileSystem fs); + + void SetBaseDirectory([Const] DOMString basePath); + [Ref] MapStringString GetAllResourcesOldAndNewFilename(); +}; + +interface ResourcesInUseHelper { + void ResourcesInUseHelper(); + + [Ref] SetString GetAllImages(); + [Ref] SetString GetAllAudios(); + [Ref] SetString GetAllFonts(); + [Ref] SetString GetAll([Const] DOMString resourceType); +}; + +interface LayoutEditorCanvasOptions { + void LayoutEditorCanvasOptions(); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Const, Ref] SerializerElement element); +}; + +//SpriteObject: + +interface Point { + void Point([Const] DOMString name); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetXY(float x, float y); + float GetX(); + void SetX(float x); + float GetY(); + void SetY(float y); +}; + +interface VectorPoint { + void VectorPoint(); + + void push_back([Const, Ref] Point pt); + unsigned long size(); + [Ref] Point at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] Point pt); + void clear(); +}; + +interface Polygon2d { + void Polygon2d(); + + [Ref] VectorVector2f GetVertices(); + void Move(float x, float y); + void Rotate(float angle); + boolean IsConvex(); + [Value] Vector2f ComputeCenter(); + + [Value] Polygon2d STATIC_CreateRectangle(float width, float height); +}; + +interface VectorPolygon2d { + void VectorPolygon2d(); + + void push_back([Const, Ref] Polygon2d polygon); + unsigned long size(); + [Ref] Polygon2d at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] Polygon2d polygon); + void FREE_removeFromVectorPolygon2d(unsigned long index); + void clear(); +}; + +interface Sprite { + void Sprite(); + + void SetImageName([Const] DOMString name); + [Const, Ref] DOMString GetImageName(); + + [Ref] Point GetOrigin(); + [Ref] Point GetCenter(); + boolean IsDefaultCenterPoint(); + void SetDefaultCenterPoint(boolean defaultPoint); + + [Ref] VectorPoint GetAllNonDefaultPoints(); + void AddPoint([Const, Ref] Point point); + void DelPoint([Const] DOMString name); + [Ref] Point GetPoint([Const] DOMString name); + boolean HasPoint([Const] DOMString name); + + boolean IsCollisionMaskAutomatic(); + void SetCollisionMaskAutomatic(boolean enabled); + + [Ref] VectorPolygon2d GetCustomCollisionMask(); + void SetCustomCollisionMask([Const, Ref] VectorPolygon2d collisionMask); +}; + +interface Direction { + void Direction(); + + void AddSprite([Const, Ref] Sprite sprite); + [Ref] Sprite GetSprite(unsigned long index); + unsigned long GetSpritesCount(); + boolean HasNoSprites(); + void RemoveSprite(unsigned long index); + void RemoveAllSprites(); + boolean IsLooping(); + void SetLoop(boolean enable); + float GetTimeBetweenFrames(); + void SetTimeBetweenFrames(float time); + void SwapSprites(unsigned long first, unsigned long second); + void MoveSprite(unsigned long oldIndex, unsigned long newIndex); + + void SetMetadata([Const] DOMString metadata); + [Const, Ref] DOMString GetMetadata(); +}; + +interface Animation { + void Animation(); + + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + + void SetDirectionsCount(unsigned long count); + unsigned long GetDirectionsCount(); + [Ref] Direction GetDirection(unsigned long index); + void SetDirection([Const, Ref] Direction direction, unsigned long index); + boolean HasNoDirections(); + + boolean UseMultipleDirections(); + void SetUseMultipleDirections(boolean enable); +}; + +interface SpriteObject { + void SpriteObject([Const] DOMString name); + + void AddAnimation([Const, Ref] Animation animation); + [Ref] Animation GetAnimation(unsigned long index); + unsigned long GetAnimationsCount(); + void RemoveAnimation(unsigned long index); + void RemoveAllAnimations(); + boolean HasNoAnimations(); + void SwapAnimations(unsigned long first, unsigned long second); + void MoveAnimation(unsigned long oldIndex, unsigned long newIndex); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +[Prefix="sf::"] +interface Vector2f { + void Vector2f(); + + attribute float x; + attribute float y; +}; + +interface VectorVector2f { + void VectorVector2f(); + + void push_back([Const, Ref] Vector2f pt); + unsigned long size(); + [Ref] Vector2f at(unsigned long index); + void WRAPPED_set(unsigned long index, [Const, Ref] Vector2f pt); + void FREE_removeFromVectorVector2f(unsigned long index); + void clear(); +}; + +//Extensions bindings: + +interface TextObject { + void TextObject([Const] DOMString name); + + void SetString([Const] DOMString string); + [Const, Ref] DOMString GetString(); + void SetCharacterSize(float size); + float GetCharacterSize(); + void SetFontName([Const] DOMString string); + [Const, Ref] DOMString GetFontName(); + boolean IsBold(); + void SetBold(boolean enable); + boolean IsItalic(); + void SetItalic(boolean enable); + boolean IsUnderlined(); + void SetUnderlined(boolean enable); + void SetColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetColorR(); + unsigned long GetColorG(); + unsigned long GetColorB(); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface TiledSpriteObject { + void TiledSpriteObject([Const] DOMString name); + + void SetTexture([Const] DOMString texture); + [Const, Ref] DOMString GetTexture(); + void SetWidth(float width); + float GetWidth(); + void SetHeight(float height); + float GetHeight(); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface PanelSpriteObject { + void PanelSpriteObject([Const] DOMString name); + + float GetLeftMargin(); + void SetLeftMargin(float newMargin); + + float GetTopMargin(); + void SetTopMargin(float newMargin); + + float GetRightMargin(); + void SetRightMargin(float newMargin); + + float GetBottomMargin(); + void SetBottomMargin(float newMargin); + + boolean IsTiled(); + void SetTiled(boolean enable); + + void SetTexture([Const] DOMString texture); + [Const, Ref] DOMString GetTexture(); + + void SetWidth(float width); + float GetWidth(); + void SetHeight(float height); + float GetHeight(); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface ShapePainterObject { + void ShapePainterObject([Const] DOMString name); + + void SetCoordinatesAbsolute(); + void SetCoordinatesRelative(); + boolean AreCoordinatesAbsolute(); + + void SetOutlineSize(float size); + float GetOutlineSize(); + + void SetOutlineOpacity(float val); + float GetOutlineOpacity(); + + void SetOutlineColor(unsigned long r, unsigned long g, unsigned long b); + unsigned long GetOutlineColorR(); + unsigned long GetOutlineColorG(); + unsigned long GetOutlineColorB(); + + void SetFillOpacity(float val); + float GetFillOpacity(); + + void SetFillColor(unsigned long r,unsigned long g, unsigned long b); + unsigned long GetFillColorR(); + unsigned long GetFillColorG(); + unsigned long GetFillColorB(); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +interface TextEntryObject { + void TextEntryObject([Const] DOMString name); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +enum ParticleEmitterObject_RendererType { + "ParticleEmitterObject::Point", + "ParticleEmitterObject::Line", + "ParticleEmitterObject::Quad" +}; + +interface ParticleEmitterObject { + void ParticleEmitterObject([Const] DOMString name); + + void SetRendererType(ParticleEmitterObject_RendererType type); + ParticleEmitterObject_RendererType GetRendererType(); + + void SetParticleTexture([Const] DOMString resourceName); + [Const, Ref] DOMString GetParticleTexture(); + void SetRendererParam1(float newValue); + float GetRendererParam1(); + void SetRendererParam2(float newValue); + float GetRendererParam2(); + + boolean IsRenderingAdditive(); + void SetRenderingAdditive(); + void SetRenderingAlpha(); + + void SetMaxParticleNb(float newValue); + float GetMaxParticleNb(); + void SetTank(float newValue); + float GetTank(); + void SetFlow(float newValue); + float GetFlow(); + void SetDestroyWhenNoParticles(boolean enable); + boolean GetDestroyWhenNoParticles(); + + void SetEmitterForceMin(float newValue); + float GetEmitterForceMin(); + void SetEmitterForceMax(float newValue); + float GetEmitterForceMax(); + + void SetConeSprayAngle(float newValue); + float GetConeSprayAngle(); + + void SetZoneRadius(float newValue); + float GetZoneRadius(); + + void SetParticleGravityX(float newValue); + float GetParticleGravityX(); + void SetParticleGravityY(float newValue); + float GetParticleGravityY(); + void SetParticleGravityZ(float newValue); + float GetParticleGravityZ(); + void SetParticleGravityAngle(float newValue); + float GetParticleGravityAngle(); + void SetParticleGravityLength(float newValue); + float GetParticleGravityLength(); + void SetFriction(float newValue); + float GetFriction(); + + void SetParticleLifeTimeMin(float newValue); + float GetParticleLifeTimeMin(); + void SetParticleLifeTimeMax(float newValue); + float GetParticleLifeTimeMax(); + + void SetParticleRed1(float newValue); + float GetParticleRed1(); + void SetParticleRed2(float newValue); + float GetParticleRed2(); + void SetParticleGreen1(float newValue); + float GetParticleGreen1(); + void SetParticleGreen2(float newValue); + float GetParticleGreen2(); + void SetParticleBlue1(float newValue); + float GetParticleBlue1(); + void SetParticleBlue2(float newValue); + float GetParticleBlue2(); + void SetParticleAlpha1(float newValue); + float GetParticleAlpha1(); + void SetParticleAlpha2(float newValue); + float GetParticleAlpha2(); + void SetParticleSize1(float newValue); + float GetParticleSize1(); + void SetParticleSize2(float newValue); + float GetParticleSize2(); + void SetParticleAngle1(float newValue); + float GetParticleAngle1(); + void SetParticleAngle2(float newValue); + float GetParticleAngle2(); + void SetParticleAlphaRandomness1(float newValue); + float GetParticleAlphaRandomness1(); + void SetParticleAlphaRandomness2(float newValue); + float GetParticleAlphaRandomness2(); + void SetParticleSizeRandomness1(float newValue); + float GetParticleSizeRandomness1(); + void SetParticleSizeRandomness2(float newValue); + float GetParticleSizeRandomness2(); + void SetParticleAngleRandomness1(float newValue); + float GetParticleAngleRandomness1(); + void SetParticleAngleRandomness2(float newValue); + float GetParticleAngleRandomness2(); + + //Inherited from gdObject: + void SetName([Const] DOMString name); + [Const, Ref] DOMString GetName(); + void SetType([Const] DOMString type); + [Const, Ref] DOMString GetType(); + + [Value] MapStringPropertyDescriptor GetProperties([Ref] Project project); + boolean UpdateProperty([Const] DOMString name, [Const] DOMString value, [Ref] Project project); + + [Value] MapStringPropertyDescriptor GetInitialInstanceProperties([Const, Ref] InitialInstance instance, [Ref] Project project, [Ref] Layout scene); + boolean UpdateInitialInstanceProperty([Ref] InitialInstance instance, [Const] DOMString name, [Const] DOMString value, [Ref] Project project, [Ref] Layout scene); + + void ExposeResources([Ref] ArbitraryResourceWorker worker); + + [Ref] VariablesContainer GetVariables(); + [Value] VectorString GetAllBehaviorNames(); + boolean HasBehaviorNamed([Const] DOMString name); + Behavior AddNewBehavior([Ref] Project project, [Const] DOMString type, [Const] DOMString name); + [Ref] Behavior GetBehavior([Const] DOMString name); + void RemoveBehavior([Const] DOMString name); + boolean RenameBehavior([Const] DOMString oldBame, [Const] DOMString name); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; + +//GDJS bindings: + +[NoDelete, Prefix="gdjs::"] +interface EventsCodeGenerator { + [Const, Value] DOMString STATIC_GenerateSceneEventsCompleteCode([Ref] Project project, [Ref] Layout layout, [Ref] EventsList events, [Ref] SetString includes, boolean compilationForRuntime); + [Const, Value] DOMString STATIC_GenerateEventsFunctionCode([Ref] Project project, [Const, Ref] EventsFunction eventsFunction, [Const] DOMString codeNamespace, [Ref] SetString includes, boolean compilationForRuntime); +}; + +[Prefix="gdjs::"] +interface Exporter { + void Exporter([Ref] AbstractFileSystem fs, [Const] DOMString gdjsRoot); + void SetCodeOutputDirectory([Const] DOMString path); + + boolean ExportLayoutForPixiPreview([Ref] Project project, [Ref] Layout layout, [Const] DOMString exportDir); + boolean ExportExternalLayoutForPixiPreview([Ref] Project project, [Ref] Layout layout, [Ref] ExternalLayout externalLayout, [Const] DOMString exportDir); + boolean ExportWholePixiProject([Ref] Project project, [Const] DOMString exportDir, [Ref] MapStringBoolean exportOptions); + + boolean ExportWholeCocos2dProject([Ref] Project project, boolean debugMode, [Const] DOMString exportDir); + + [Const, Ref] DOMString GetLastError(); +}; + +[Prefix="gdjs::"] +interface JsCodeEvent { + void JsCodeEvent(); + + [Const, Ref] DOMString GetInlineCode(); + void SetInlineCode([Const] DOMString type); + + [Const, Ref] DOMString GetParameterObjects(); + void SetParameterObjects([Const] DOMString type); + + //Inherited from BaseEvent: + JsCodeEvent Clone(); + [Const, Ref] DOMString GetType(); + void SetType([Const] DOMString type); + boolean IsExecutable(); + boolean CanHaveSubEvents(); + boolean HasSubEvents(); + [Ref] EventsList GetSubEvents(); + boolean IsDisabled(); + void SetDisabled(boolean disable); + boolean IsFolded(); + void SetFolded(boolean folded); + + void SerializeTo([Ref] SerializerElement element); + void UnserializeFrom([Ref] Project project, [Const, Ref] SerializerElement element); +}; diff --git a/GDevelop.js/Bindings/ObjectJsImplementation.cpp b/GDevelop.js/Bindings/ObjectJsImplementation.cpp new file mode 100644 index 000000000..e80b74928 --- /dev/null +++ b/GDevelop.js/Bindings/ObjectJsImplementation.cpp @@ -0,0 +1,162 @@ +#include "ObjectJsImplementation.h" +#include +#include +#include +#include +#include +#include +#include + +using namespace gd; + +std::unique_ptr ObjectJsImplementation::Clone() const { + ObjectJsImplementation* clone = new ObjectJsImplementation(*this); + + // Copy the references to the JS implementations of the functions (because we + // want an object cloned from C++ to retain the functions implemented in JS). + EM_ASM_INT( + { + var clone = Module['wrapPointer']($0, Module['ObjectJsImplementation']); + var self = Module['wrapPointer']($1, Module['ObjectJsImplementation']); + clone['getProperties'] = self['getProperties']; + clone['updateProperty'] = self['updateProperty']; + clone['getInitialInstanceProperties'] = + self['getInitialInstanceProperties']; + clone['updateInitialInstanceProperty'] = + self['updateInitialInstanceProperty']; + }, + (int)clone, + (int)this); + + return std::unique_ptr(clone); +} + +std::map +ObjectJsImplementation::GetProperties(gd::Project&) const { + std::map* jsCreatedProperties = nullptr; + std::map copiedProperties; + + jsCreatedProperties = (std::map*)EM_ASM_INT( + { + var self = Module['getCache'](Module['ObjectJsImplementation'])[$0]; + if (!self.hasOwnProperty('getProperties')) + throw 'getProperties is not defined on a ObjectJsImplementation.'; + + var objectContent = JSON.parse(Pointer_stringify($1)); + var newProperties = self['getProperties'](objectContent); + if (!newProperties) + throw 'getProperties returned nothing in a gd::ObjectJsImplementation.'; + + return getPointer(newProperties); + }, + (int)this, + jsonContent.c_str()); + + copiedProperties = *jsCreatedProperties; + delete jsCreatedProperties; + return copiedProperties; +} +bool ObjectJsImplementation::UpdateProperty(const gd::String& arg0, + const gd::String& arg1, + Project&) { + jsonContent = (const char*)EM_ASM_INT( + { + var self = Module['getCache'](Module['ObjectJsImplementation'])[$0]; + if (!self.hasOwnProperty('updateProperty')) + throw 'updateProperty is not defined on a ObjectJsImplementation.'; + var objectContent = JSON.parse(Pointer_stringify($1)); + self['updateProperty']( + objectContent, Pointer_stringify($2), Pointer_stringify($3)); + return ensureString(JSON.stringify(objectContent)); + }, + (int)this, + jsonContent.c_str(), + arg0.c_str(), + arg1.c_str()); + + return true; +} + +std::map +ObjectJsImplementation::GetInitialInstanceProperties( + const gd::InitialInstance& instance, + gd::Project& project, + gd::Layout& scene) { + std::map* jsCreatedProperties = nullptr; + std::map copiedProperties; + + jsCreatedProperties = (std::map*)EM_ASM_INT( + { + var self = Module['getCache'](Module['ObjectJsImplementation'])[$0]; + if (!self.hasOwnProperty('getInitialInstanceProperties')) + throw 'getInitialInstanceProperties is not defined on a ObjectJsImplementation.'; + + var objectContent = JSON.parse(Pointer_stringify($1)); + var newProperties = self['getInitialInstanceProperties']( + objectContent, + wrapPointer($2, Module['InitialInstance']), + wrapPointer($3, Module['Project']), + wrapPointer($4, Module['Layout'])); + if (!newProperties) + throw 'getInitialInstanceProperties returned nothing in a gd::ObjectJsImplementation.'; + + return getPointer(newProperties); + }, + (int)this, + jsonContent.c_str(), + (int)&instance, + (int)&project, + (int)&scene); + + copiedProperties = *jsCreatedProperties; + delete jsCreatedProperties; + return copiedProperties; +} + +bool ObjectJsImplementation::UpdateInitialInstanceProperty( + gd::InitialInstance& instance, + const gd::String& name, + const gd::String& value, + gd::Project& project, + gd::Layout& scene) { + return EM_ASM_INT( + { + var self = Module['getCache'](Module['ObjectJsImplementation'])[$0]; + if (!self.hasOwnProperty('updateInitialInstanceProperty')) + throw 'updateInitialInstanceProperty is not defined on a ObjectJsImplementation.'; + var objectContent = JSON.parse(Pointer_stringify($1)); + return self['updateInitialInstanceProperty']( + objectContent, + wrapPointer($2, Module['InitialInstance']), + Pointer_stringify($3), + Pointer_stringify($4), + wrapPointer($5, Module['Project']), + wrapPointer($6, Module['Layout'])); + }, + (int)this, + jsonContent.c_str(), + (int)&instance, + name.c_str(), + value.c_str(), + (int)&project, + (int)&scene); +} + +void ObjectJsImplementation::DoSerializeTo(SerializerElement& arg0) const { + arg0.AddChild("content") = gd::Serializer::FromJSON(jsonContent); +} +void ObjectJsImplementation::DoUnserializeFrom(Project& arg0, + const SerializerElement& arg1) { + jsonContent = gd::Serializer::ToJSON(arg1.GetChild("content")); +} + +void ObjectJsImplementation::__destroy__() { // Useless? + EM_ASM_INT( + { + var self = Module['getCache'](Module['ObjectJsImplementation'])[$0]; + if (!self.hasOwnProperty('__destroy__')) + throw 'a JSImplementation must implement all functions, you forgot ObjectJsImplementation::__destroy__.'; + self['__destroy__'](); + }, + (int)this); +} diff --git a/GDevelop.js/Bindings/ObjectJsImplementation.h b/GDevelop.js/Bindings/ObjectJsImplementation.h new file mode 100644 index 000000000..9526445e4 --- /dev/null +++ b/GDevelop.js/Bindings/ObjectJsImplementation.h @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include +#include + +using namespace gd; + +/** + * \brief A gd::Object that stores its content in JSON and forward the + * properties related functions to Javascript with Emscripten. + */ +class ObjectJsImplementation : public gd::Object { + public: + ObjectJsImplementation(gd::String name_) : Object(name_), jsonContent("{}") {} + virtual std::unique_ptr Clone() const override; + + virtual std::map GetProperties( + gd::Project& project) const override; + virtual bool UpdateProperty(const gd::String& name, + const gd::String& value, + gd::Project& project) override; + + std::map GetInitialInstanceProperties( + const gd::InitialInstance& instance, + gd::Project& project, + gd::Layout& scene) override; + bool UpdateInitialInstanceProperty(gd::InitialInstance& instance, + const gd::String& name, + const gd::String& value, + gd::Project& project, + gd::Layout& scene) override; + + void __destroy__(); + + const gd::String& GetRawJSONContent() const { return jsonContent; }; + ObjectJsImplementation& SetRawJSONContent(const gd::String& newContent) { + jsonContent = newContent; + return *this; + }; + + protected: + virtual void DoSerializeTo(SerializerElement& arg0) const override; + virtual void DoUnserializeFrom(Project& arg0, + const SerializerElement& arg1) override; + gd::String jsonContent; +}; diff --git a/GDevelop.js/Bindings/ProjectHelper.h b/GDevelop.js/Bindings/ProjectHelper.h new file mode 100644 index 000000000..d3852552e --- /dev/null +++ b/GDevelop.js/Bindings/ProjectHelper.h @@ -0,0 +1,215 @@ +#include "GDCore/Extensions/Platform.h" +#include "GDCore/IDE/PlatformManager.h" +#include "GDCore/Project/InitialInstancesContainer.h" +#include "GDCore/Project/Layout.h" +#include "GDCore/Project/Project.h" +#include "GDCore/TinyXml/tinyxml.h" +#include "GDCore/Tools/VersionWrapper.h" +#include "GDJS/Extensions/JsPlatform.h" + +using namespace gdjs; +using namespace gd; + +/** + * \brief Helper functions related to projects and initialization. + */ +class ProjectHelper { + public: + static gd::Project& CreateNewGDJSProject() { + Project* project = new Project; + project->AddPlatform(JsPlatform::Get()); + + return *project; + } + + /** + * \brief Initialize the JS platform. + */ + static void InitializePlatforms() { + static bool initialized = false; + if (!initialized) { + std::cout << "libGD.js based on GDevelop " << VersionWrapper::FullString() + << std::endl; + } else { + std::cout << "ERROR: You're calling initializePlatforms again, but " + "initialization was already done!" + << std::endl; + return; + } + + initialized = true; + std::cout << "Initializing GDJS platform..." << std::endl; + std::shared_ptr platform(&JsPlatform::Get()); + gd::PlatformManager::Get()->AddPlatform(platform); + std::cout << "Platform initialization ended." << std::endl; + } + + /** + * \brief This check that the given gd::Behavior can be properly cloned + * and have the given property updated. + */ + static gd::String SanityCheckBehaviorProperty(gd::Behavior* behavior, + const gd::String& propertyName, + const gd::String& newValue) { + if (!behavior) return "FAIL: behavior passed is null"; + gd::Project project; + project.AddPlatform(JsPlatform::Get()); + + gd::String originalValue = + behavior->GetProperties(project)[propertyName].GetValue(); + + gd::Behavior* copiedBehavior = behavior->Clone(); + if (copiedBehavior->GetProperties(project)[propertyName].GetValue() != + originalValue) { + return "FAIL: Cloning the behavior does not copy properly the property"; + } + + behavior->UpdateProperty(propertyName, newValue, project); + gd::String updatedValue = + behavior->GetProperties(project)[propertyName].GetValue(); + if (updatedValue != newValue) { + return "FAIL: expected the newValue to be set for the property, but " + "received:" + + updatedValue; + } + + gd::String copiedBehaviorValue = + copiedBehavior->GetProperties(project)[propertyName].GetValue(); + if (copiedBehaviorValue != originalValue) { + return "FAIL: Updating the property of the behavior will change the " + "property of the cloned behavior. Clone behavior property is " + "now: " + + copiedBehaviorValue + ". Should have been:" + originalValue; + } + + delete copiedBehavior; + return ""; + } + + /** + * \brief This check that the given gd::BehaviorsSharedData can be properly cloned + * and have the given property updated. + */ + static gd::String SanityCheckBehaviorsSharedDataProperty(gd::BehaviorsSharedData* sharedData, + const gd::String& propertyName, + const gd::String& newValue) { + if (!sharedData) return "FAIL: sharedData passed is null"; + gd::Project project; + project.AddPlatform(JsPlatform::Get()); + + gd::String originalValue = + sharedData->GetProperties(project)[propertyName].GetValue(); + + std::shared_ptr copiedSharedData = sharedData->Clone(); + if (copiedSharedData->GetProperties(project)[propertyName].GetValue() != + originalValue) { + return "FAIL: Cloning the sharedData does not copy properly the property"; + } + + sharedData->UpdateProperty(propertyName, newValue, project); + gd::String updatedValue = + sharedData->GetProperties(project)[propertyName].GetValue(); + if (updatedValue != newValue) { + return "FAIL: expected the newValue to be set for the property, but " + "received:" + + updatedValue; + } + + gd::String copiedSharedDataValue = + copiedSharedData->GetProperties(project)[propertyName].GetValue(); + if (copiedSharedDataValue != originalValue) { + return "FAIL: Updating the property of the sharedData will change the " + "property of the cloned sharedData. Clone sharedData property is " + "now: " + + copiedSharedDataValue + ". Should have been:" + originalValue; + } + + return ""; + } + + /** + * \brief This check that the given gd::Object can be properly cloned + * and have the given property updated. + */ + static gd::String SanityCheckObjectProperty(gd::Object* object, + const gd::String& propertyName, + const gd::String& newValue) { + if (!object) return "FAIL: object passed is null"; + gd::Project project; + project.AddPlatform(JsPlatform::Get()); + + gd::String originalValue = + object->GetProperties(project)[propertyName].GetValue(); + + std::unique_ptr copiedObject = object->Clone(); + if (copiedObject->GetProperties(project)[propertyName].GetValue() != + originalValue) { + return "FAIL: Cloning the object does not copy properly the property"; + } + + object->UpdateProperty(propertyName, newValue, project); + gd::String updatedValue = + object->GetProperties(project)[propertyName].GetValue(); + if (updatedValue != newValue) { + return "FAIL: expected the newValue to be set for the property, but " + "received:" + + updatedValue; + } + + gd::String copiedObjectValue = + copiedObject->GetProperties(project)[propertyName].GetValue(); + if (copiedObjectValue != originalValue) { + return "FAIL: Updating the property of the object will change the " + "property of the cloned object. Clone object property is " + "now: " + + copiedObjectValue + ". Should have been:" + originalValue; + } + + return ""; + } + + /** + * \brief This check that the given gd::Object can be properly cloned + * and return/set the properties of a gd::InitialInstance. + */ + static gd::String SanityCheckObjectInitialInstanceProperty( + gd::Object* object, + const gd::String& propertyName, + const gd::String& newValue) { + if (!object) return "FAIL: object passed is null"; + + gd::Project project; + project.AddPlatform(JsPlatform::Get()); + gd::Layout layout; + gd::InitialInstance instance; + + gd::String originalValue = object + ->GetInitialInstanceProperties( + instance, project, layout)[propertyName] + .GetValue(); + + std::unique_ptr copiedObject = object->Clone(); + if (copiedObject + ->GetInitialInstanceProperties( + instance, project, layout)[propertyName] + .GetValue() != originalValue) { + return "FAIL: Cloned object does not return the same initial value for " + "the instance property"; + } + + copiedObject->UpdateInitialInstanceProperty( + instance, propertyName, newValue, project, layout); + gd::String updatedValue = copiedObject + ->GetInitialInstanceProperties( + instance, project, layout)[propertyName] + .GetValue(); + if (updatedValue != newValue) { + return "FAIL: expected the newValue to be set for the instance property " + "using the copied object, but " + "received:" + + updatedValue; + } + + return ""; + } +}; diff --git a/GDevelop.js/Bindings/Wrapper.cpp b/GDevelop.js/Bindings/Wrapper.cpp new file mode 100644 index 000000000..6bf88bacb --- /dev/null +++ b/GDevelop.js/Bindings/Wrapper.cpp @@ -0,0 +1,560 @@ +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include + +#include "../../Extensions/PanelSpriteObject/PanelSpriteObject.h" +#include "../../Extensions/ParticleSystem/ParticleEmitterObject.h" +#include "../../Extensions/PrimitiveDrawing/ShapePainterObject.h" +#include "../../Extensions/TextEntryObject/TextEntryObject.h" +#include "../../Extensions/TextObject/TextObject.h" +#include "../../Extensions/TiledSpriteObject/TiledSpriteObject.h" + +#include +#include +#include + +#include +#include "ProjectHelper.h" + +#include "BehaviorJsImplementation.h" +#include "BehaviorSharedDataJsImplementation.h" +#include "ObjectJsImplementation.h" + +/** + * \brief Manual binding of gd::ArbitraryResourceWorker to allow overriding + * methods that are using std::string + */ +class ArbitraryResourceWorkerJS : public ArbitraryResourceWorker { + public: + void ExposeImage(gd::String &arg0) { + arg0 = (const char *)EM_ASM_INT( + { + var self = + Module['getCache'](Module['ArbitraryResourceWorkerJS'])[$0]; + if (!self.hasOwnProperty('exposeImage')) + throw 'a JSImplementation must implement all functions, you forgot ArbitraryResourceWorkerJS::exposeImage.'; + return ensureString(self.exposeImage(Pointer_stringify($1))); + }, + (int)this, + arg0.c_str()); + } + void ExposeShader(gd::String &arg0) { + arg0 = (const char *)EM_ASM_INT( + { + var self = + Module['getCache'](Module['ArbitraryResourceWorkerJS'])[$0]; + if (!self.hasOwnProperty('exposeShader')) + throw 'a JSImplementation must implement all functions, you forgot ArbitraryResourceWorkerJS::exposeShader.'; + return ensureString(self.exposeShader(Pointer_stringify($1))); + }, + (int)this, + arg0.c_str()); + } + void ExposeFile(gd::String &arg0) { + arg0 = (const char *)EM_ASM_INT( + { + var self = + Module['getCache'](Module['ArbitraryResourceWorkerJS'])[$0]; + if (!self.hasOwnProperty('exposeFile')) + throw 'a JSImplementation must implement all functions, you forgot ArbitraryResourceWorkerJS::exposeFile.'; + return ensureString(self.exposeFile(Pointer_stringify($1))); + }, + (int)this, + arg0.c_str()); + } +}; + +/** + * \brief Manual binding of gd::AbstractFileSystem to allow overriding methods + * that are using std::string + */ +class AbstractFileSystemJS : public AbstractFileSystem { + public: + virtual void MkDir(const gd::String &path) { + EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('mkDir')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::mkDir.'; + self.mkDir(Pointer_stringify($1)); + }, + (int)this, + path.c_str()); + } + virtual bool DirExists(const gd::String &path) { + return EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('dirExists')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::dirExists.'; + return self.dirExists(Pointer_stringify($1)); + }, + (int)this, + path.c_str()); + } + + virtual bool FileExists(const gd::String &path) { + return EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('fileExists')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::fileExists.'; + return self.fileExists(Pointer_stringify($1)); + }, + (int)this, + path.c_str()); + } + + virtual gd::String FileNameFrom(const gd::String &file) { + return (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('fileNameFrom')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::fileNameFrom.'; + return ensureString(self.fileNameFrom(Pointer_stringify($1))); + }, + (int)this, + file.c_str()); + } + + virtual gd::String DirNameFrom(const gd::String &file) { + return (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('dirNameFrom')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::dirNameFrom.'; + return ensureString(self.dirNameFrom(Pointer_stringify($1))); + }, + (int)this, + file.c_str()); + } + + virtual bool MakeAbsolute(gd::String &filename, + const gd::String &baseDirectory) { + filename = (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('makeAbsolute')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::makeAbsolute.'; + return ensureString( + self.makeAbsolute(Pointer_stringify($1), Pointer_stringify($2))); + }, + (int)this, + filename.c_str(), + baseDirectory.c_str()); + + return true; + } + + virtual bool MakeRelative(gd::String &filename, + const gd::String &baseDirectory) { + filename = (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('makeRelative')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::makeRelative.'; + return ensureString( + self.makeRelative(Pointer_stringify($1), Pointer_stringify($2))); + }, + (int)this, + filename.c_str(), + baseDirectory.c_str()); + + return true; + } + + virtual bool IsAbsolute(const gd::String &filename) { + return (bool)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('isAbsolute')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::isAbsolute.'; + return self.isAbsolute(Pointer_stringify($1)); + }, + (int)this, + filename.c_str()); + }; + + virtual bool CopyFile(const gd::String &file, const gd::String &destination) { + return (bool)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('copyFile')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::copyFile.'; + return self.copyFile(Pointer_stringify($1), Pointer_stringify($2)); + }, + (int)this, + file.c_str(), + destination.c_str()); + } + + virtual bool ClearDir(const gd::String &directory) { + return (bool)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('clearDir')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::clearDir.'; + return self.clearDir(Pointer_stringify($1)); + }, + (int)this, + directory.c_str()); + } + + virtual bool CopyDir(const gd::String &source, + const gd::String &destination) { + return (bool)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('copyDir')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::copyDir.'; + return self.copyDir(Pointer_stringify($1), Pointer_stringify($2)); + }, + (int)this, + source.c_str(), + destination.c_str()); + } + + virtual bool WriteToFile(const gd::String &file, const gd::String &content) { + return (bool)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('writeToFile')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::writeToFile.'; + return self.writeToFile(Pointer_stringify($1), Pointer_stringify($2)); + }, + (int)this, + file.c_str(), + content.c_str()); + } + + virtual gd::String ReadFile(const gd::String &file) { + return (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('readFile')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::readFile.'; + return ensureString(self.readFile(Pointer_stringify($1))); + }, + (int)this, + file.c_str()); + } + virtual gd::String GetTempDir() { + return (const char *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('getTempDir')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::getTempDir.'; + return ensureString(self.getTempDir()); + }, + (int)this); + } + + virtual std::vector ReadDir(const gd::String &path, + const gd::String &extension = "") { + std::vector directories = *(std::vector *)EM_ASM_INT( + { + var self = Module['getCache'](Module['AbstractFileSystemJS'])[$0]; + if (!self.hasOwnProperty('readDir')) + throw 'a JSImplementation must implement all functions, you forgot AbstractFileSystemJS::readDir.'; + return self.readDir(Pointer_stringify($1), Pointer_stringify($2)).ptr; + }, + (int)this, + path.c_str(), + extension.c_str()); + + return directories; + } + + AbstractFileSystemJS(){}; + virtual ~AbstractFileSystemJS(){}; +}; + +class InitialInstanceJSFunctorWrapper : public gd::InitialInstanceFunctor { + public: + InitialInstanceJSFunctorWrapper(){}; + + virtual void operator()(gd::InitialInstance &instance) { invoke(&instance); }; + + virtual void invoke(gd::InitialInstance *instance){}; +}; + +// Implement some std::vector<*> erase methods as free functions as there is no +// easy way to properly expose the erase method :'( +void removeFromVectorPolygon2d(std::vector &vec, size_t pos) { + vec.erase(vec.begin() + pos); +} + +void removeFromVectorVector2f(std::vector &vec, size_t pos) { + vec.erase(vec.begin() + pos); +} + +void removeFromVectorParameterMetadata(std::vector &vec, size_t pos) { + vec.erase(vec.begin() + pos); +} + +// Implement a conversion from std::set to std::vector +// as there is no easy way to properly expose iterators :/ +std::vector toNewVectorString(const std::set &set) { + std::vector output(set.begin(), set.end()); + return output; +} + +// Declares typedef for std::vector and templatized types +typedef std::vector VectorString; +typedef std::vector> + VectorPlatformExtension; +typedef std::pair PairStringVariable; +typedef std::pair PairStringTextFormatting; +typedef std::vector> + VectorPairStringTextFormatting; +typedef std::vector VectorObjectGroup; +typedef std::map MapStringString; +typedef std::map MapStringBoolean; +typedef std::map + MapStringExpressionMetadata; +typedef std::map + MapStringInstructionMetadata; +typedef std::map MapStringEventMetadata; +typedef std::map MapStringVariable; +typedef std::map + MapStringPropertyDescriptor; +typedef std::set SetString; +typedef std::vector VectorPoint; +typedef std::vector VectorPolygon2d; +typedef std::vector VectorVector2f; +typedef std::vector VectorEventsSearchResult; +typedef std::vector VectorParameterMetadata; +typedef std::vector VectorEventsFunction; +typedef gd::Object gdObject; // To avoid clashing javascript Object in glue.js +typedef ParticleEmitterObject::RendererType ParticleEmitterObject_RendererType; +typedef EventsFunction::FunctionType EventsFunction_FunctionType; +typedef std::unique_ptr UniquePtrObject; +typedef std::unique_ptr UniquePtrExpressionNode; +typedef std::vector VectorExpressionParserDiagnostic; + +typedef ExtensionAndMetadata ExtensionAndBehaviorMetadata; +typedef ExtensionAndMetadata ExtensionAndObjectMetadata; +typedef ExtensionAndMetadata ExtensionAndInstructionMetadata; +typedef ExtensionAndMetadata ExtensionAndInstructionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; +typedef ExtensionAndMetadata ExtensionAndExpressionMetadata; + +// Customize some functions implementation thanks to WRAPPED_* macros +// The original names will be reconstructed in the js file (see postjs.js) +#define WRAPPED_set(a, b) at(a) = b +#define WRAPPED_GetString(i) at(i).first +#define WRAPPED_GetComment() com1 +#define WRAPPED_SetComment(str) com1 = str +#define WRAPPED_GetTextFormatting(i) at(i).second +#define WRAPPED_GetName() first +#define WRAPPED_GetVariable() second +#define WRAPPED_SetBool(v) SetValue(v) +#define WRAPPED_SetString(v) SetValue(gd::String(v)) +#define WRAPPED_SetInt(v) SetValue(v) +#define WRAPPED_SetDouble(v) SetValue(v) +#define WRAPPED_SetChild(name, child) GetChild(name) = child + +// Wrappers to avoid dealing with shared_ptr in the methods interface: +#define WRAPPED_AddBehavior(name, \ + fullname, \ + defaultName, \ + description, \ + group, \ + icon24x24, \ + className, \ + instance, \ + sharedDatasInstance) \ + AddBehavior(name, \ + fullname, \ + defaultName, \ + description, \ + group, \ + icon24x24, \ + className, \ + std::shared_ptr(instance), \ + std::shared_ptr(sharedDatasInstance)) + +#define WRAPPED_AddObject(name, fullname, description, icon24x24, instance) \ + AddObject(name, \ + fullname, \ + description, \ + icon24x24, \ + std::shared_ptr(instance)) + +#define WRAPPED_Get() Get().get() +#define WRAPPED_GetSharedDataInstance() GetSharedDataInstance().get() +#define WRAPPED_at(a) at(a).get() + +#define MAP_get(a) find(a)->second +#define MAP_set(key, value) [key] = value +#define MAP_has(key) find(key) != self->end() + +#define STATIC_CreateNewGDJSProject CreateNewGDJSProject +#define STATIC_InitializePlatforms InitializePlatforms +#define STATIC_ValidateObjectName ValidateObjectName +#define STATIC_ToJSON ToJSON +#define STATIC_FromJSON(x) FromJSON(gd::String(x)) +#define STATIC_IsObject IsObject +#define STATIC_IsBehavior IsBehavior +#define STATIC_Get Get +#define STATIC_AddAllMissing AddAllMissing +#define STATIC_GetAllUseless GetAllUseless +#define STATIC_RemoveAllUseless RemoveAllUseless + +#define STATIC_GetExtensionAndBehaviorMetadata GetExtensionAndBehaviorMetadata +#define STATIC_GetExtensionAndObjectMetadata GetExtensionAndObjectMetadata +#define STATIC_GetExtensionAndActionMetadata GetExtensionAndActionMetadata +#define STATIC_GetExtensionAndConditionMetadata GetExtensionAndConditionMetadata +#define STATIC_GetExtensionAndExpressionMetadata GetExtensionAndExpressionMetadata +#define STATIC_GetExtensionAndObjectExpressionMetadata GetExtensionAndObjectExpressionMetadata +#define STATIC_GetExtensionAndBehaviorExpressionMetadata GetExtensionAndBehaviorExpressionMetadata +#define STATIC_GetExtensionAndStrExpressionMetadata GetExtensionAndStrExpressionMetadata +#define STATIC_GetExtensionAndObjectStrExpressionMetadata GetExtensionAndObjectStrExpressionMetadata +#define STATIC_GetExtensionAndBehaviorStrExpressionMetadata GetExtensionAndBehaviorStrExpressionMetadata +#define STATIC_HasCondition HasCondition +#define STATIC_HasAction HasAction +#define STATIC_HasObjectAction HasObjectAction +#define STATIC_HasObjectCondition HasObjectCondition +#define STATIC_HasBehaviorAction HasBehaviorAction +#define STATIC_HasBehaviorCondition HasBehaviorCondition +#define STATIC_HasExpression HasExpression +#define STATIC_HasObjectExpression HasObjectExpression +#define STATIC_HasBehaviorExpression HasBehaviorExpression +#define STATIC_HasStrExpression HasStrExpression +#define STATIC_HasObjectStrExpression HasObjectStrExpression +#define STATIC_HasBehaviorStrExpression HasBehaviorStrExpression + +#define STATIC_RenameObjectInEvents RenameObjectInEvents +#define STATIC_RemoveObjectInEvents RemoveObjectInEvents +#define STATIC_ReplaceStringInEvents ReplaceStringInEvents +#define STATIC_ExposeProjectEvents ExposeProjectEvents + +#define STATIC_GetBehaviorMetadata GetBehaviorMetadata +#define STATIC_GetObjectMetadata GetObjectMetadata +#define STATIC_GetActionMetadata GetActionMetadata +#define STATIC_GetConditionMetadata GetConditionMetadata +#define STATIC_GetExpressionMetadata GetExpressionMetadata +#define STATIC_GetObjectExpressionMetadata GetObjectExpressionMetadata +#define STATIC_GetBehaviorExpressionMetadata GetBehaviorExpressionMetadata +#define STATIC_GetStrExpressionMetadata GetStrExpressionMetadata +#define STATIC_GetObjectStrExpressionMetadata GetObjectStrExpressionMetadata +#define STATIC_GetBehaviorStrExpressionMetadata GetBehaviorStrExpressionMetadata + +#define STATIC_GenerateSceneEventsCompleteCode GenerateSceneEventsCompleteCode +#define STATIC_GenerateEventsFunctionCode GenerateEventsFunctionCode +#define STATIC_Major Major +#define STATIC_Minor Minor +#define STATIC_Build Build +#define STATIC_Revision Revision +#define STATIC_FullString FullString +#define STATIC_Status Status +#define STATIC_Year Year +#define STATIC_Month Month +#define STATIC_Date Date +#define STATIC_ObjectRenamedInLayout ObjectRenamedInLayout +#define STATIC_ObjectRemovedInLayout ObjectRemovedInLayout +#define STATIC_GlobalObjectRenamed GlobalObjectRenamed +#define STATIC_GlobalObjectRemoved GlobalObjectRemoved +#define STATIC_CreateRectangle CreateRectangle +#define STATIC_SanityCheckBehaviorProperty SanityCheckBehaviorProperty +#define STATIC_SanityCheckObjectProperty SanityCheckObjectProperty +#define STATIC_SanityCheckObjectInitialInstanceProperty \ + SanityCheckObjectInitialInstanceProperty +#define STATIC_SanityCheckBehaviorsSharedDataProperty \ + SanityCheckBehaviorsSharedDataProperty +#define STATIC_SearchInEvents SearchInEvents +#define STATIC_UnfoldWhenContaining UnfoldWhenContaining + +#define STATIC_EventsFunctionToObjectsContainer EventsFunctionToObjectsContainer +#define STATIC_ParametersToObjectsContainer ParametersToObjectsContainer +#define STATIC_GetObjectParameterIndexFor GetObjectParameterIndexFor + +#define STATIC_GetNamespaceSeparator GetNamespaceSeparator +#define STATIC_RenameEventsFunctionsExtension RenameEventsFunctionsExtension +#define STATIC_RenameEventsFunction RenameEventsFunction + +#define STATIC_UseOldExpressionParser UseOldExpressionParser +#define STATIC_IsUsingOldExpressionParser IsUsingOldExpressionParser + +// We postfix some methods with "At" as Javascript does not support overloading +#define GetLayoutAt GetLayout +#define GetExternalEventsAt GetExternalEvents +#define GetExternalLayoutAt GetExternalLayout +#define GetEventsFunctionsExtensionAt GetEventsFunctionsExtension +#define GetLayerAt GetLayer +#define GetObjectAt GetObject +#define GetAt Get +#define GetEventAt GetEvent +#define RemoveEventAt RemoveEvent +#define RemoveAt Remove +#define GetEventsFunctionAt GetEventsFunction + +// We don't use prefix in .idl file to workaround a webidl_binder.py bug +// that can't find in its list of interfaces a class which has a prefix. +using namespace gd; +using namespace std; + +#include "glue.cpp" diff --git a/GDevelop.js/Bindings/postjs.js b/GDevelop.js/Bindings/postjs.js new file mode 100644 index 000000000..ea9a25379 --- /dev/null +++ b/GDevelop.js/Bindings/postjs.js @@ -0,0 +1,175 @@ + /*Emscripten generated-code for Module will be inserted here*/ + + return Module; + }; + + // Make sure that the naming convention for methods of GDevelop + // classes is camelCase (instead of CamelCase) and rename methods + // with special names (like `WRAPPED_`, `STATIC_`...). + var adaptNamingConventions = function(gd) { + function uncapitalizeFirstLetter(method) { + return method.charAt(0).toLowerCase() + method.slice(1); + } + + function removePrefix(method, prefix) { + if (method.indexOf(prefix) !== 0) + return method; + + return method.replace(prefix, ""); + } + + function adaptClassMethods(object) { + var proto = object.prototype; + for (var method in proto) { + if (method && proto.hasOwnProperty(method)) { + var newName = method; + var addToModule = false; + var addToObject = false; + + //Detect static methods + if (method.indexOf("STATIC_") === 0) { + newName = removePrefix(newName, "STATIC_"); + addToObject = true; + } + + //Detect free functions + if (method.indexOf("FREE_") === 0) { + newName = removePrefix(newName, "FREE_"); + addToModule = true; + } + + //Remove prefix used for custom code generation + newName = removePrefix(newName, "MAP_"); + newName = removePrefix(newName, "WRAPPED_"); + if (newName.indexOf("CLONE_") === 0) { + newName = "clone"; + } + + //Normalize method name + newName = uncapitalizeFirstLetter(newName); + if (newName !== method) { + proto[newName] = proto[method]; + delete proto[method]; + } + + if (addToObject) { + object[newName] = proto[newName]; + } + + if (addToModule) { + gd[newName] = (function(fct) { + return function() { //Simulate a free function + if (arguments.length === 0) return fct(); + var args = []; + Array.prototype.push.apply(args, arguments); + args.shift(); + + return fct.apply(arguments[0], args); + }; + })(proto[newName]); + } + } + } + + //Offer a delete method that does what gd.destroy does. + proto.delete = function() { gd.destroy(this) }; + } + + for(var gdClass in gd) { + if (gd.hasOwnProperty(gdClass)) { + if (typeof gd[gdClass] !== "function") continue; + if (!gd[gdClass].prototype) continue; + if (!gd[gdClass].prototype.hasOwnProperty("__class__")) continue; + + adaptClassMethods(gd[gdClass]); + } + } + + gd.Object = gd.gdObject; //Renaming was done to avoid clashing with javascript Object. + gd.initializePlatforms = gd.ProjectHelper.prototype.initializePlatforms; + + //Provide shortcuts for casts: + gd.asStandardEvent = function(evt) { return gd.castObject(evt, gd.StandardEvent); } + gd.asRepeatEvent = function(evt) { return gd.castObject(evt, gd.RepeatEvent); } + gd.asWhileEvent = function(evt) { return gd.castObject(evt, gd.WhileEvent); } + gd.asForEachEvent = function(evt) { return gd.castObject(evt, gd.ForEachEvent); } + gd.asCommentEvent = function(evt) { return gd.castObject(evt, gd.CommentEvent); } + gd.asGroupEvent = function(evt) { return gd.castObject(evt, gd.GroupEvent); } + gd.asLinkEvent = function(evt) { return gd.castObject(evt, gd.LinkEvent); } + gd.asJsCodeEvent = function(evt) { return gd.castObject(evt, gd.JsCodeEvent); } + gd.asPlatform = function(evt) { return gd.castObject(evt, gd.Platform); } + + gd.asSpriteObject = function(evt) { return gd.castObject(evt, gd.SpriteObject); } + gd.asTiledSpriteObject = function(evt) { return gd.castObject(evt, gd.TiledSpriteObject); } + gd.asPanelSpriteObject = function(evt) { return gd.castObject(evt, gd.PanelSpriteObject); } + gd.asTextObject = function(evt) { return gd.castObject(evt, gd.TextObject); } + gd.asShapePainterObject = function(evt) { return gd.castObject(evt, gd.ShapePainterObject); } + gd.asAdMobObject = function(evt) { return gd.castObject(evt, gd.AdMobObject); } + gd.asTextEntryObject = function(evt) { return gd.castObject(evt, gd.TextEntryObject); } + gd.asParticleEmitterObject = function(evt) { return gd.castObject(evt, gd.ParticleEmitterObject); } + gd.asObjectJsImplementation = function(evt) { return gd.castObject(evt, gd.ObjectJsImplementation); } + + gd.asImageResource = function(evt) { return gd.castObject(evt, gd.ImageResource); } + + //Convenience methods: + gd.VectorString.prototype.toJSArray = function() { + var arr = []; + var size = this.size(); + for(var i = 0;i < size; ++i) { + arr.push(this.at(i)); + } + return arr; + } + + // Add gd.Serializer.fromJSObject which is much faster than manually parsing + // JSON with gd.Serializer.fromJSON. + gd.Serializer._fromJSObject = function(object, element) { + if (typeof object === 'number') { + element.setDouble(object); + } else if (typeof object === 'string') { + element.setString(object); + } else if (typeof object === 'boolean') { + element.setBool(object); + } else if (Array.isArray(object)) { + element.considerAsArray(); + for(var i = 0;i (gd = initGDevelopJS())); + + describe('gd.VersionWrapper', function() { + it('can return the version number of the library', function() { + expect(typeof gd.VersionWrapper.major()).toBe('number'); + expect(typeof gd.VersionWrapper.minor()).toBe('number'); + expect(typeof gd.VersionWrapper.build()).toBe('number'); + expect(typeof gd.VersionWrapper.revision()).toBe('number'); + expect(typeof gd.VersionWrapper.fullString()).toBe('string'); + }); + }); + + describe('gd.Project', function() { + let project = null; + beforeAll(() => (project = gd.ProjectHelper.createNewGDJSProject())); + + it('has properties that can be read and changed', function() { + project.setName('My super project'); + expect(project.getName()).toBe('My super project'); + project.setVersion('1.2.34'); + expect(project.getVersion()).toBe('1.2.34'); + project.setPackageName('com.test.package'); + expect(project.getPackageName()).toBe('com.test.package'); + project.setOrientation('portrait'); + expect(project.getOrientation()).toBe('portrait'); + project.setOrientation('landscape'); + expect(project.getOrientation()).toBe('landscape'); + project.setAuthor('Me'); + expect(project.getAuthor()).toBe('Me'); + project.setMaximumFPS(15); + expect(project.getMaximumFPS()).toBe(15); + project.setMinimumFPS(15); + expect(project.getMinimumFPS()).toBe(15); + }); + + it('can store loading screen setup', function() { + project.getLoadingScreen().showGDevelopSplash(true); + expect(project.getLoadingScreen().isGDevelopSplashShown()).toBe(true); + project.getLoadingScreen().showGDevelopSplash(false); + expect(project.getLoadingScreen().isGDevelopSplashShown()).toBe(false); + }); + + it('handles layouts', function() { + expect(project.hasLayoutNamed('Scene')).toBe(false); + + project.insertNewLayout('Scene', 0); + expect(project.hasLayoutNamed('Scene')).toBe(true); + expect(project.getLayout('Scene').getName()).toBe('Scene'); + + project.removeLayout('Scene'); + expect(project.hasLayoutNamed('Scene')).toBe(false); + }); + + it('handles external events', function() { + expect(project.hasExternalEventsNamed('My events')).toBe(false); + + project.insertNewExternalEvents('My events', 0); + expect(project.hasExternalEventsNamed('My events')).toBe(true); + expect(project.getExternalEvents('My events').getName()).toBe( + 'My events' + ); + + project.removeExternalEvents('My events'); + expect(project.hasExternalEventsNamed('My events')).toBe(false); + }); + + it('handles external layouts', function() { + expect(project.hasExternalLayoutNamed('My layout')).toBe(false); + + project.insertNewExternalLayout('My layout', 0); + expect(project.hasExternalLayoutNamed('My layout')).toBe(true); + expect(project.getExternalLayout('My layout').getName()).toBe( + 'My layout' + ); + + project.removeExternalLayout('My layout'); + expect(project.hasExternalLayoutNamed('My layout')).toBe(false); + }); + + it('should validate object names', function() { + expect(gd.Project.validateObjectName('ThisNameIs_Ok_123')).toBe(true); + expect(gd.Project.validateObjectName('ThisName IsNot_Ok_123')).toBe( + false + ); + expect(gd.Project.validateObjectName('ThisNameIsNot_Ok!')).toBe(false); + }); + + it('should have a list of extensions', function() { + expect(typeof project.getUsedExtensions().size()).toBe('number'); + project.getUsedExtensions().clear(); + expect(project.getUsedExtensions().size()).toBe(0); + }); + + it('handles events functions extensions', function() { + expect(project.hasEventsFunctionsExtensionNamed('Ext')).toBe(false); + + project.insertNewEventsFunctionsExtension('Ext', 0); + expect(project.hasEventsFunctionsExtensionNamed('Ext')).toBe(true); + expect(project.getEventsFunctionsExtension('Ext').getName()).toBe('Ext'); + + project.removeEventsFunctionsExtension('Ext'); + expect(project.hasEventsFunctionsExtensionNamed('Ext')).toBe(false); + }); + + afterAll(function() { + project.delete(); + }); + }); + + describe('gd.Layout', function() { + let project = null; + let layout = null; + beforeAll(() => { + project = gd.ProjectHelper.createNewGDJSProject(); + layout = project.insertNewLayout('Scene', 0); + }); + + it('can have a new name', function() { + expect(layout.getName()).toBe('Scene'); + layout.setName('My super layout'); + expect(layout.getName()).toBe('My super layout'); + }); + it('can have a name with UTF8 characters', function() { + layout.setName('Scene with a 官话 name'); + expect(layout.getName()).toBe('Scene with a 官话 name'); + }); + it('can store events', function() { + var evts = layout.getEvents(); + expect(evts.getEventsCount()).toBe(0); + var evt = evts.insertNewEvent( + project, + 'BuiltinCommonInstructions::Standard', + 0 + ); + expect(evts.getEventsCount()).toBe(1); + evt + .getSubEvents() + .insertNewEvent(project, 'BuiltinCommonInstructions::Standard', 0); + expect( + evts + .getEventAt(0) + .getSubEvents() + .getEventsCount() + ).toBe(1); + }); + it('can have objects', function() { + var object = layout.insertNewObject(project, 'Sprite', 'MyObject', 0); + var object2 = layout.insertNewObject( + project, + 'TextObject::Text', + 'MyObject2', + 1 + ); + + expect(layout.getObjectAt(0).ptr).toBe(object.ptr); + expect(layout.getObjectAt(1).ptr).toBe(object2.ptr); + expect(layout.getObjectAt(0).getType()).toBe('Sprite'); + expect(layout.getObjectAt(1).getType()).toBe('TextObject::Text'); + }); + + afterAll(function() { + project.delete(); + }); + }); + + describe('gd.ObjectsContainer (using gd.Layout)', function() { + let project = null; + beforeAll(() => (project = gd.ProjectHelper.createNewGDJSProject())); + + it('can move objects', function() { + var layout = project.insertNewLayout('Scene', 0); + var object = layout.insertNewObject(project, 'Sprite', 'MyObject', 0); + var object2 = layout.insertNewObject( + project, + 'TextObject::Text', + 'MyObject2', + 1 + ); + var object3 = layout.insertNewObject( + project, + 'TextObject::Text', + 'MyObject3', + 2 + ); + + expect(layout.getObjectAt(0).getName()).toBe('MyObject'); + expect(layout.getObjectAt(1).getName()).toBe('MyObject2'); + expect(layout.getObjectAt(2).getName()).toBe('MyObject3'); + layout.moveObject(0, 2); + expect(layout.getObjectAt(0).getName()).toBe('MyObject2'); + expect(layout.getObjectAt(1).getName()).toBe('MyObject3'); + expect(layout.getObjectAt(2).getName()).toBe('MyObject'); + layout.moveObject(0, 0); + expect(layout.getObjectAt(0).getName()).toBe('MyObject2'); + expect(layout.getObjectAt(1).getName()).toBe('MyObject3'); + expect(layout.getObjectAt(2).getName()).toBe('MyObject'); + layout.moveObject(1, 0); + expect(layout.getObjectAt(0).getName()).toBe('MyObject3'); + expect(layout.getObjectAt(1).getName()).toBe('MyObject2'); + expect(layout.getObjectAt(2).getName()).toBe('MyObject'); + layout.moveObject(0, 999); + expect(layout.getObjectAt(0).getName()).toBe('MyObject3'); + expect(layout.getObjectAt(1).getName()).toBe('MyObject2'); + expect(layout.getObjectAt(2).getName()).toBe('MyObject'); + }); + + it('can find position of objects', function() { + var layout = project.insertNewLayout('Scene2', 0); + var object = layout.insertNewObject(project, 'Sprite', 'MyObject', 0); + var object2 = layout.insertNewObject( + project, + 'TextObject::Text', + 'MyObject2', + 1 + ); + var object3 = layout.insertNewObject( + project, + 'TextObject::Text', + 'MyObject3', + 2 + ); + + expect(layout.getObjectPosition('MyObject')).toBe(0); + expect(layout.getObjectPosition('MyObject2')).toBe(1); + expect(layout.getObjectPosition('MyObject3')).toBe(2); + expect(layout.getObjectPosition('MyObject4')).toBe(-1); + }); + + afterAll(function() { + project.delete(); + }); + }); + + describe('gd.InitialInstancesContainer', function() { + let container = null; + let containerCopy = null; + beforeAll(() => { + container = new gd.InitialInstancesContainer(); + }); + + it('initial state', function() { + expect(container.getInstancesCount()).toBe(0); + }); + it('adding instances', function() { + var instance = container.insertNewInitialInstance(); + instance.setObjectName('MyObject1'); + instance.setZOrder(10); + + var instance2 = new gd.InitialInstance(); + instance2.setObjectName('MyObject2'); + instance2 = container.insertInitialInstance(instance2); + + var instance3 = container.insertNewInitialInstance(); + instance3.setObjectName('MyObject3'); + instance3.setZOrder(-1); + instance3.setLayer('OtherLayer'); + + expect(container.getInstancesCount()).toBe(3); + }); + it('iterating', function() { + var i = 0; + var functor = new gd.InitialInstanceJSFunctor(); + functor.invoke = function(instance) { + instance = gd.wrapPointer(instance, gd.InitialInstance); + expect( + (i === 0 && instance.getObjectName() === 'MyObject1') || + (i === 1 && instance.getObjectName() === 'MyObject2') || + (i === 2 && instance.getObjectName() === 'MyObject3') + ).toBe(true); + i++; + }; + container.iterateOverInstances(functor); + }); + it('can rename instances', function() { + container.renameInstancesOfObject('MyObject1', 'MyObject'); + + var i = 0; + var functor = new gd.InitialInstanceJSFunctor(); + functor.invoke = function(instance) { + instance = gd.wrapPointer(instance, gd.InitialInstance); + expect( + (i === 0 && instance.getObjectName() === 'MyObject') || + (i === 1 && instance.getObjectName() === 'MyObject2') || + (i === 2 && instance.getObjectName() === 'MyObject3') + ).toBe(true); + i++; + }; + container.iterateOverInstances(functor); + }); + it('iterating with z ordering', function() { + var i = 0; + var functor = new gd.InitialInstanceJSFunctor(); + functor.invoke = function(instance) { + instance = gd.wrapPointer(instance, gd.InitialInstance); + expect( + (i === 0 && instance.getObjectName() === 'MyObject2') || + (i === 1 && instance.getObjectName() === 'MyObject') + ).toBe(true); + i++; + }; + container.iterateOverInstancesWithZOrdering(functor, ''); + }); + it('moving from layers to another', function() { + container.moveInstancesToLayer('OtherLayer', 'YetAnotherLayer'); + + var functor = new gd.InitialInstanceJSFunctor(); + functor.invoke = function(instance) { + instance = gd.wrapPointer(instance, gd.InitialInstance); + expect(instance.getObjectName()).toBe('MyObject3'); + }; + container.iterateOverInstancesWithZOrdering(functor, 'YetAnotherLayer'); + }); + it('can be cloned', function() { + containerCopy = container.clone(); + expect(containerCopy.getInstancesCount()).toBe(3); + + var instance = containerCopy.insertNewInitialInstance(); + instance.setObjectName('MyObject4'); + expect(containerCopy.getInstancesCount()).toBe(4); + expect(container.getInstancesCount()).toBe(3); + + containerCopy.delete(); + containerCopy = null; + }); + it('removing instances', function() { + container.removeInitialInstancesOfObject('MyObject'); + expect(container.getInstancesCount()).toBe(2); + }); + it('removing instances on a layer', function() { + container.removeAllInstancesOnLayer('YetAnotherLayer'); + expect(container.getInstancesCount()).toBe(1); + }); + it('can be serialized', function() { + expect(container.serializeTo).not.toBe(undefined); + expect(container.unserializeFrom).not.toBe(undefined); + }); + + afterAll(function() { + container.delete(); + }); + }); + + describe('gd.InitialInstance', function() { + let project = null; + let layout = null; + let initialInstance = null; + beforeAll(() => { + project = gd.ProjectHelper.createNewGDJSProject(); + layout = project.insertNewLayout('Scene', 0); + layout.insertNewObject(project, 'Sprite', 'MySpriteObject', 0); + + initialInstance = layout.getInitialInstances().insertNewInitialInstance(); + }); + + it('properties', function() { + initialInstance.setObjectName('MySpriteObject'); + expect(initialInstance.getObjectName()).toBe('MySpriteObject'); + initialInstance.setX(150); + expect(initialInstance.getX()).toBe(150); + initialInstance.setY(140); + expect(initialInstance.getY()).toBe(140); + initialInstance.setAngle(45); + expect(initialInstance.getAngle()).toBe(45); + initialInstance.setZOrder(12); + expect(initialInstance.getZOrder()).toBe(12); + initialInstance.setLayer('MyLayer'); + expect(initialInstance.getLayer()).toBe('MyLayer'); + initialInstance.setLocked(true); + expect(initialInstance.isLocked()).toBe(true); + initialInstance.setHasCustomSize(true); + expect(initialInstance.hasCustomSize()).toBe(true); + initialInstance.setCustomWidth(34); + expect(initialInstance.getCustomWidth()).toBe(34); + initialInstance.setCustomHeight(30); + expect(initialInstance.getCustomHeight()).toBe(30); + }); + it('Sprite object custom properties', function() { + initialInstance.updateCustomProperty('Animation', '2', project, layout); + expect( + initialInstance + .getCustomProperties(project, layout) + .get('Animation') + .getValue() + ).toBe('2'); + expect(initialInstance.getRawFloatProperty('animation')).toBe(2); + }); + it('can be serialized', function() { + expect(initialInstance.serializeTo).not.toBe(undefined); + expect(initialInstance.unserializeFrom).not.toBe(undefined); + + var element = new gd.SerializerElement(); + initialInstance.serializeTo(element); + + var initialInstance2 = layout + .getInitialInstances() + .insertNewInitialInstance(); + initialInstance2.unserializeFrom(element); + expect(initialInstance2.getObjectName()).toBe('MySpriteObject'); + expect(initialInstance2.getX()).toBe(150); + expect(initialInstance2.getY()).toBe(140); + expect(initialInstance2.getAngle()).toBe(45); + expect(initialInstance2.getZOrder()).toBe(12); + expect(initialInstance2.getLayer()).toBe('MyLayer'); + expect(initialInstance2.isLocked()).toBe(true); + expect(initialInstance2.hasCustomSize()).toBe(true); + expect(initialInstance2.getCustomWidth()).toBe(34); + expect(initialInstance2.getCustomHeight()).toBe(30); + }); + + afterAll(function() { + project.delete(); + }); + }); + + describe('gd.VariablesContainer', function() { + it('container is empty after being created', function() { + var container = new gd.VariablesContainer(); + + expect(container.has('Variable')).toBe(false); + expect(container.count()).toBe(0); + container.delete(); + }); + it('can insert variables', function() { + var container = new gd.VariablesContainer(); + + container.insertNew('Variable', 0); + expect(container.has('Variable')).toBe(true); + expect(container.count()).toBe(1); + + container.insertNew('SecondVariable', 0); + expect(container.has('SecondVariable')).toBe(true); + expect(container.count()).toBe(2); + container.delete(); + }); + it('can rename variables', function() { + var container = new gd.VariablesContainer(); + + container.insertNew('Variable', 0); + container + .insertNew('SecondVariable', 0) + .setString('String of SecondVariable'); + container.insertNew('ThirdVariable', 0); + + expect(container.has('SecondVariable')).toBe(true); + expect(container.has('NewName')).toBe(false); + container.rename('SecondVariable', 'NewName'); + expect(container.has('SecondVariable')).toBe(false); + expect(container.has('NewName')).toBe(true); + + expect(container.get('NewName').getString()).toBe( + 'String of SecondVariable' + ); + container.delete(); + }); + it('can swap variables', function() { + var container = new gd.VariablesContainer(); + + container.insertNew('Variable', 0).setValue(4); + container + .insertNew('SecondVariable', 1) + .setString('String of SecondVariable'); + container + .insertNew('ThirdVariable', 2) + .getChild('Child1') + .setValue(7); + + expect(container.getNameAt(0)).toBe('Variable'); + expect(container.getNameAt(2)).toBe('ThirdVariable'); + + container.swap(0, 2); + expect(container.getNameAt(0)).toBe('ThirdVariable'); + expect(container.getNameAt(2)).toBe('Variable'); + expect(container.getAt(2).getValue()).toBe(4); + + container.delete(); + }); + it('can move variables', function() { + var container = new gd.VariablesContainer(); + + container.insertNew('Variable', 0).setValue(4); + container + .insertNew('SecondVariable', 1) + .setString('String of SecondVariable'); + container + .insertNew('ThirdVariable', 2) + .getChild('Child1') + .setValue(7); + + container.move(1, 2); + expect(container.getNameAt(0)).toBe('Variable'); + expect(container.getNameAt(1)).toBe('ThirdVariable'); + expect(container.getNameAt(2)).toBe('SecondVariable'); + + container.move(1, 9999); + expect(container.getNameAt(0)).toBe('Variable'); + expect(container.getNameAt(1)).toBe('ThirdVariable'); + expect(container.getNameAt(2)).toBe('SecondVariable'); + + container.move(2, 0); + expect(container.getNameAt(0)).toBe('SecondVariable'); + expect(container.getNameAt(1)).toBe('Variable'); + expect(container.getNameAt(2)).toBe('ThirdVariable'); + + container.delete(); + }); + }); + + describe('gd.Variable', function() { + let variable = null; + beforeAll(() => (variable = new gd.Variable())); + + it('should have initial value', function() { + expect(variable.getValue()).toBe(0); + expect(variable.isNumber()).toBe(true); + }); + it('can have a value', function() { + variable.setValue(5); + expect(variable.getValue()).toBe(5); + expect(variable.isNumber()).toBe(true); + }); + it('can have a string', function() { + variable.setString('Hello'); + expect(variable.getString()).toBe('Hello'); + expect(variable.isNumber()).toBe(false); + }); + it('can be a structure', function() { + variable.getChild('FirstChild').setValue(1); + variable.getChild('SecondChild').setString('two'); + expect(variable.hasChild('FirstChild')).toBe(true); + expect(variable.hasChild('SecondChild')).toBe(true); + expect(variable.hasChild('NotExisting')).toBe(false); + expect(variable.getChild('SecondChild').getString()).toBe('two'); + variable.removeChild('FirstChild'); + expect(variable.hasChild('FirstChild')).toBe(false); + }); + it('can expose its children', function() { + variable.getChild('FirstChild').setValue(1); + + var childrenNames = variable.getAllChildrenNames(); + expect(childrenNames.size()).toBe(2); + + variable.getChild(childrenNames.get(0)).setString('one'); + variable.getChild(childrenNames.get(1)).setValue(2); + + expect(variable.getChild('FirstChild').getString()).toBe('one'); + expect(variable.getChild('SecondChild').getValue()).toBe(2); + + expect(childrenNames.size()).toBe(2); + }); + it('can search inside children and remove them recursively', function() { + var parentVariable = new gd.Variable(); + + var child1 = parentVariable.getChild('Child1'); + var child2 = parentVariable.getChild('Child2'); + var grandChild = parentVariable.getChild('Child1').getChild('GrandChild'); + expect(parentVariable.contains(grandChild, true)).toBe(true); + expect(parentVariable.contains(grandChild, false)).toBe(false); + expect(parentVariable.contains(child1, true)).toBe(true); + expect(parentVariable.contains(child2, true)).toBe(true); + expect(parentVariable.contains(child1, false)).toBe(true); + expect(parentVariable.contains(child2, false)).toBe(true); + expect(child1.contains(grandChild, true)).toBe(true); + expect(child1.contains(grandChild, false)).toBe(true); + expect(child2.contains(grandChild, true)).toBe(false); + expect(child2.contains(grandChild, false)).toBe(false); + expect(grandChild.contains(grandChild, true)).toBe(false); + expect(grandChild.contains(grandChild, false)).toBe(false); + expect(grandChild.contains(child1, true)).toBe(false); + expect(grandChild.contains(child2, true)).toBe(false); + expect(grandChild.contains(parentVariable, true)).toBe(false); + expect(grandChild.contains(child1, false)).toBe(false); + expect(grandChild.contains(child2, false)).toBe(false); + expect(grandChild.contains(parentVariable, false)).toBe(false); + + parentVariable.removeRecursively(grandChild); + expect(child1.hasChild('GrandChild')).toBe(false); + expect(child1.getChildrenCount()).toBe(0); + expect(parentVariable.getChildrenCount()).toBe(2); + + parentVariable.removeRecursively(child2); + expect(parentVariable.getChildrenCount()).toBe(1); + expect(parentVariable.hasChild('Child1')).toBe(true); + expect(parentVariable.hasChild('Child2')).toBe(false); + + parentVariable.delete(); + }); + + afterAll(function() { + variable.delete(); + }); + }); + + describe('gd.ImageResource', function() { + it('should have name and file', function() { + const resource = new gd.ImageResource(); + resource.setName('MyResource'); + resource.setFile('MyFile'); + expect(resource.getName()).toBe('MyResource'); + expect(resource.getFile()).toBe('MyFile'); + resource.delete(); + }); + it('can have metadata', function() { + const resource = new gd.ImageResource(); + expect(resource.getMetadata()).toBe(''); + resource.setMetadata(JSON.stringify({ hello: 'world' })); + expect(resource.getMetadata()).toBe('{"hello":"world"}'); + resource.delete(); + }); + + it('has smooth and alreadyLoaded custom properties', function() { + const project = gd.ProjectHelper.createNewGDJSProject(); + const resource = new gd.ImageResource(); + + const properties = resource.getProperties(); + expect(properties.get('Smooth the image').getValue()).toBe('true'); + expect(properties.get('Always loaded in memory').getValue()).toBe( + 'false' + ); + + // Note: updateProperty expect the booleans in an usual "0" or "1" format. + resource.updateProperty('Smooth the image', '0', project); + resource.updateProperty('Always loaded in memory', '1', project); + + const updatedProperties = resource.getProperties(); + expect(updatedProperties.get('Smooth the image').getValue()).toBe( + 'false' + ); + expect(updatedProperties.get('Always loaded in memory').getValue()).toBe( + 'true' + ); + + resource.delete(); + project.delete(); + }); + }); + + describe('gd.AudioResource', function() { + it('should have name and file', function() { + const resource = new gd.AudioResource(); + resource.setName('MyAudioResource'); + resource.setFile('MyAudioFile'); + expect(resource.getName()).toBe('MyAudioResource'); + expect(resource.getFile()).toBe('MyAudioFile'); + resource.delete(); + }); + it('can have metadata', function() { + const resource = new gd.AudioResource(); + expect(resource.getMetadata()).toBe(''); + resource.setMetadata(JSON.stringify({ hello: 'world' })); + expect(resource.getMetadata()).toBe('{"hello":"world"}'); + resource.delete(); + }); + }); + + describe('gd.FontResource', function() { + it('should have name and file', function() { + const resource = new gd.FontResource(); + resource.setName('MyFontResource'); + resource.setFile('MyFontFile'); + expect(resource.getName()).toBe('MyFontResource'); + expect(resource.getFile()).toBe('MyFontFile'); + resource.delete(); + }); + it('can have metadata', function() { + const resource = new gd.FontResource(); + expect(resource.getMetadata()).toBe(''); + resource.setMetadata(JSON.stringify({ hello: 'world' })); + expect(resource.getMetadata()).toBe('{"hello":"world"}'); + resource.delete(); + }); + }); + + describe('gd.ResourcesManager', function() { + it('should support adding resources', function() { + var project = gd.ProjectHelper.createNewGDJSProject(); + var resource = new gd.Resource(); + var resource2 = new gd.Resource(); + resource.setName('MyResource'); + resource2.setName('MyResource2'); + project.getResourcesManager().addResource(resource); + project.getResourcesManager().addResource(resource2); + var allResources = project.getResourcesManager().getAllResourceNames(); + + expect(allResources.size()).toBe(2); + project.delete(); + }); + + it('should support finding resources', function() { + var project = gd.ProjectHelper.createNewGDJSProject(); + var resource = new gd.Resource(); + var resource2 = new gd.Resource(); + resource.setName('MyResource'); + resource2.setName('MyResource2'); + project.getResourcesManager().addResource(resource); + project.getResourcesManager().addResource(resource2); + + expect( + project.getResourcesManager().getResourcePosition('MyResource') + ).toBe(0); + expect( + project.getResourcesManager().getResourcePosition('MyResource2') + ).toBe(1); + expect( + project.getResourcesManager().getResourcePosition('MyResource3') + ).toBe(-1); + project.delete(); + }); + + it('should support removing resources', function() { + var project = gd.ProjectHelper.createNewGDJSProject(); + var resource = new gd.Resource(); + resource.setName('MyResource'); + project.getResourcesManager().addResource(resource); + project.getResourcesManager().removeResource('MyResource'); + + var allResources = project.getResourcesManager().getAllResourceNames(); + expect(allResources.size()).toBe(0); + project.delete(); + }); + }); + + describe('gd.ProjectResourcesAdder', function() { + it('should support removing useless resources', function() { + var project = gd.ProjectHelper.createNewGDJSProject(); + var resource1 = new gd.ImageResource(); + resource1.setName('Useless'); + var resource2 = new gd.ImageResource(); + resource2.setName('Used'); + project.getResourcesManager().addResource(resource1); + project.getResourcesManager().addResource(resource2); + + //Create an object using a resource + var obj = project.insertNewObject(project, 'Sprite', 'MyObject', 0); + var sprite1 = new gd.Sprite(); + sprite1.setImageName('Used'); + + var anim1 = new gd.Animation(); + anim1.setDirectionsCount(1); + anim1.getDirection(0).addSprite(sprite1); + + gd.castObject(obj, gd.SpriteObject).addAnimation(anim1); + + var allResources = project.getResourcesManager().getAllResourceNames(); + expect(allResources.size()).toBe(2); + + gd.ProjectResourcesAdder.removeAllUseless(project, 'image'); + + var allResources = project.getResourcesManager().getAllResourceNames(); + expect(allResources.size()).toBe(1); + expect(allResources.get(0)).toBe('Used'); + project.delete(); + }); + }); + + describe('gd.ArbitraryResourceWorker', function() { + it('should be called with resources of the project', function(done) { + var project = gd.ProjectHelper.createNewGDJSProject(); + var obj = project.insertNewObject(project, 'Sprite', 'MyObject', 0); + const spriteObject = gd.asSpriteObject(obj); + var sprite1 = new gd.Sprite(); + sprite1.setImageName('Used'); + const animation = new gd.Animation(); + animation.setDirectionsCount(1); + animation.getDirection(0).addSprite(sprite1); + spriteObject.addAnimation(animation); + + var worker = extend(new gd.ArbitraryResourceWorkerJS(), { + exposeImage: function(image) { + expect(image).toBe('Used'); + done(); + + return image; + }, + }); + + project.exposeResources(worker); + project.delete(); + }); + }); + + describe('gd.ResourcesInUseHelper', function() { + it('should find the images used by objects', function() { + var sprite1 = new gd.Sprite(); + sprite1.setImageName('Image1'); + var sprite2 = new gd.Sprite(); + sprite2.setImageName('Image2'); + var sprite3 = new gd.Sprite(); + sprite3.setImageName('Image3'); + + const spriteObject = new gd.SpriteObject('My sprite object'); + const animation = new gd.Animation(); + animation.setDirectionsCount(1); + animation.getDirection(0).addSprite(sprite1); + animation.getDirection(0).addSprite(sprite2); + animation.getDirection(0).addSprite(sprite1); + spriteObject.addAnimation(animation); + + const spriteObject2 = new gd.SpriteObject('My sprite object'); + const animation2 = new gd.Animation(); + animation2.setDirectionsCount(1); + animation2.getDirection(0).addSprite(sprite1); + animation2.getDirection(0).addSprite(sprite3); + animation2.getDirection(0).addSprite(sprite1); + spriteObject2.addAnimation(animation2); + + const resourcesInUse = new gd.ResourcesInUseHelper(); + + { + spriteObject.exposeResources(resourcesInUse); + const resourceNames = resourcesInUse + .getAllImages() + .toNewVectorString() + .toJSArray(); + expect(resourceNames).toHaveLength(2); + expect(resourceNames).toContain('Image1'); + expect(resourceNames).toContain('Image2'); + } + + { + spriteObject2.exposeResources(resourcesInUse); + const resourceNames = resourcesInUse + .getAllImages() + .toNewVectorString() + .toJSArray(); + expect(resourceNames).toHaveLength(3); + expect(resourceNames).toContain('Image1'); + expect(resourceNames).toContain('Image2'); + expect(resourceNames).toContain('Image3'); + } + + resourcesInUse.delete(); + + spriteObject.delete(); + spriteObject2.delete(); + }); + }); + + describe('gd.Behavior', function() { + var project = null; + var behavior = null; + beforeAll(() => { + project = gd.ProjectHelper.createNewGDJSProject(); + behavior = new gd.Behavior(); + }); + + it('properties and initial values', function() { + behavior.setName('MyBehavior'); + expect(behavior.getName()).toBe('MyBehavior'); + expect(behavior.getTypeName()).toBe(''); + }); + it('update a not existing property', function() { + expect( + behavior.updateProperty('PropertyThatDoesNotExist', 'MyValue', project) + ).toBe(false); + }); + + afterAll(function() { + behavior.delete(); + project.delete(); + }); + }); + + describe('gd.BehaviorsSharedData', function() { + it('can be created by gd.Layout.updateBehaviorsSharedData', function() { + var project = gd.ProjectHelper.createNewGDJSProject(); + var layout = project.insertNewLayout('Scene', 0); + var object = layout.insertNewObject(project, 'Sprite', 'MyObject', 0); + + layout.updateBehaviorsSharedData(project); + expect(layout.hasBehaviorSharedData('Physics')).toBe(false); + var behavior = object.addNewBehavior( + project, + 'PhysicsBehavior::PhysicsBehavior', + 'Physics' + ); + expect(layout.hasBehaviorSharedData('Physics')).toBe(false); + layout.updateBehaviorsSharedData(project); + expect(layout.hasBehaviorSharedData('Physics')).toBe(true); + layout.removeObject('MyObject'); + expect(layout.hasBehaviorSharedData('Physics')).toBe(true); + layout.updateBehaviorsSharedData(project); + expect(layout.hasBehaviorSharedData('Physics')).toBe(false); + + project.delete(); + }); + }); + + describe('gd.BehaviorSharedDataJsImplementation', function() { + it('can declare a gd.BehaviorSharedDataJsImplementation and pass sanity checks', function() { + var mySharedData = new gd.BehaviorSharedDataJsImplementation(); + mySharedData.updateProperty = function(content, propertyName, newValue) { + if (propertyName === 'My first property') { + content.property1 = newValue; + return true; + } + if (propertyName === 'My other property') { + content.property2 = newValue === '1'; + return true; + } + + return false; + }; + mySharedData.getProperties = function(content) { + var properties = new gd.MapStringPropertyDescriptor(); + + properties.set( + 'My first property', + new gd.PropertyDescriptor(content.property1) + ); + properties.set( + 'My other property', + new gd.PropertyDescriptor(content.property2 ? '1' : '0').setType( + 'Boolean' + ) + ); + + return properties; + }; + mySharedData.setRawJSONContent( + JSON.stringify({ + property1: 'Initial value 1', + property2: true, + }) + ); + + try { + expect( + gd.ProjectHelper.sanityCheckBehaviorsSharedDataProperty( + mySharedData, + 'My first property', + 'Value1' + ) + ).toBe(''); + expect( + gd.ProjectHelper.sanityCheckBehaviorsSharedDataProperty( + mySharedData, + 'My other property', + '0' + ) + ).toBe(''); + } catch (ex) { + console.error(ex); + + throw Error( + 'Exception caught while launching sanityCheckBehavior on a gd.BehaviorSharedDataJsImplementation.' + ); + } + }); + }); + + describe('gd.MapStringPropertyDescriptor', function() { + it('can be used to manipulate properties', function() { + var properties = new gd.MapStringPropertyDescriptor(); + expect(properties.has('Property0')).toBe(false); + + properties.set('Property1', new gd.PropertyDescriptor('Hello Property1')); + expect(properties.get('Property1').getValue()).toBe('Hello Property1'); + expect(properties.get('Property1').getType()).toBe('string'); + properties.get('Property1').setValue('Hello modified Property1'); + expect(properties.get('Property1').getValue()).toBe( + 'Hello modified Property1' + ); + expect(properties.keys().toJSArray()).not.toContain('Property0'); + expect(properties.keys().toJSArray()).toContain('Property1'); + + properties.set( + 'Property0', + new gd.PropertyDescriptor('Hello Property0') + .setType('another type') + .addExtraInfo('Info1') + .addExtraInfo('Info3') + ); + expect(properties.get('Property0').getValue()).toBe('Hello Property0'); + expect(properties.get('Property0').getType()).toBe('another type'); + expect( + properties + .get('Property0') + .getExtraInfo() + .toJSArray() + ).toContain('Info1'); + expect( + properties + .get('Property0') + .getExtraInfo() + .toJSArray() + ).not.toContain('Info2'); + expect( + properties + .get('Property0') + .getExtraInfo() + .toJSArray() + ).toContain('Info3'); + expect(properties.has('Property0')).toBe(true); + expect(properties.has('Property1')).toBe(true); + expect(properties.keys().toJSArray()).toContain('Property0'); + expect(properties.keys().toJSArray()).toContain('Property1'); + }); + }); + + describe('gd.BehaviorJsImplementation', function() { + it('can declare a gd.BehaviorJsImplementation and pass sanity checks', function() { + var myBehavior = new gd.BehaviorJsImplementation(); + myBehavior.updateProperty = function(content, propertyName, newValue) { + if (propertyName === 'My first property') { + content.property1 = newValue; + return true; + } + if (propertyName === 'My other property') { + content.property2 = newValue === '1'; + return true; + } + + return false; + }; + myBehavior.getProperties = function(content) { + var properties = new gd.MapStringPropertyDescriptor(); + + properties.set( + 'My first property', + new gd.PropertyDescriptor(content.property1) + ); + properties.set( + 'My other property', + new gd.PropertyDescriptor(content.property2 ? '1' : '0').setType( + 'Boolean' + ) + ); + + return properties; + }; + myBehavior.setRawJSONContent( + JSON.stringify({ + property1: 'Initial value 1', + property2: true, + }) + ); + + try { + expect( + gd.ProjectHelper.sanityCheckBehaviorProperty( + myBehavior, + 'My first property', + 'Value1' + ) + ).toBe(''); + expect( + gd.ProjectHelper.sanityCheckBehaviorProperty( + myBehavior, + 'My other property', + '0' + ) + ).toBe(''); + } catch (ex) { + console.error(ex); + + throw Error( + 'Exception caught while launching sanityCheckBehavior on a gd.BehaviorJsImplementation.' + ); + } + }); + }); + + describe('gd.Object', function() { + var project = null; + var layout = null; + var object = null; + var object2 = null; + + beforeAll(() => { + project = gd.ProjectHelper.createNewGDJSProject(); + layout = project.insertNewLayout('Scene', 0); + object = layout.insertNewObject(project, 'Sprite', 'MyObject', 0); + object2 = layout.insertNewObject(project, 'Sprite', 'MyObject2', 1); + }); + + it('has properties and initial values', function() { + object.setName('TheObject'); + expect(object.getName()).toBe('TheObject'); + expect(object.hasBehaviorNamed('DoNotExists')).toBe(false); + }); + + it('can have its type retrieved with gd.getTypeOfObject', function() { + expect(gd.getTypeOfObject(project, layout, 'TheObject', true)).toBe( + 'Sprite' + ); + }); + + it('can have behaviors', function() { + var behavior = object.addNewBehavior( + project, + 'DraggableBehavior::Draggable', + 'Draggable' + ); + expect(object.hasBehaviorNamed('Draggable')).toBe(true); + expect(object.getBehavior('Draggable')).toBe(behavior); + }); + + it('can have its behaviors retrieved with gd.getBehaviorsOfObject', function() { + var behaviors = gd.getBehaviorsOfObject( + project, + layout, + 'TheObject', + true + ); + expect(behaviors.size()).toBe(1); + expect(behaviors.get(0)).toBe('Draggable'); + }); + + it('can be un/serialized', function() { + var serializerElement = new gd.SerializerElement(); + object.serializeTo(serializerElement); + object2.unserializeFrom(project, serializerElement); + object2.unserializeFrom(project, serializerElement); // Also check that multiple + object2.unserializeFrom(project, serializerElement); // unserialization is idempotent + serializerElement.delete(); + + //Check that behaviors were persisted and restored + var behaviors = object2.getAllBehaviorNames(); + expect(behaviors.size()).toBe(1); + expect(behaviors.at(0)).toBe('Draggable'); + }); + + afterAll(function() { + project.delete(); + }); + }); + + describe('gd.ObjectJsImplementation', function() { + const createSampleObjectJsImplementation = () => { + var myObject = new gd.ObjectJsImplementation(); + myObject.updateProperty = function(content, propertyName, newValue) { + if (propertyName === 'My first property') { + content.property1 = newValue; + return true; + } + if (propertyName === 'My other property') { + content.property2 = newValue === '1'; + return true; + } + + return false; + }; + myObject.getProperties = function(content) { + var properties = new gd.MapStringPropertyDescriptor(); + + properties.set( + 'My first property', + new gd.PropertyDescriptor(content.property1) + ); + properties.set( + 'My other property', + new gd.PropertyDescriptor(content.property2 ? '1' : '0').setType( + 'Boolean' + ) + ); + + return properties; + }; + myObject.setRawJSONContent( + JSON.stringify({ + property1: 'Initial value 1', + property2: true, + }) + ); + + myObject.updateInitialInstanceProperty = function( + content, + instance, + propertyName, + newValue, + project, + layout + ) { + if (propertyName === 'My instance property') { + instance.setRawStringProperty('instanceprop1', newValue); + return true; + } + if (propertyName === 'My other instance property') { + instance.setRawFloatProperty('instanceprop2', parseFloat(newValue)); + return true; + } + + return false; + }; + myObject.getInitialInstanceProperties = function( + content, + instance, + project, + layout + ) { + var properties = new gd.MapStringPropertyDescriptor(); + + properties.set( + 'My instance property', + new gd.PropertyDescriptor( + instance.getRawStringProperty('instanceprop1') + ) + ); + properties.set( + 'My other instance property', + new gd.PropertyDescriptor( + instance.getRawFloatProperty('instanceprop2').toString() //TODO: How to avoid people forgetting toString? + ).setType('number') + ); + + return properties; + }; + + return myObject; + }; + + it('can create a gd.ObjectJsImplementation and pass sanity checks', function() { + const myObject = createSampleObjectJsImplementation(); + + try { + expect( + gd.ProjectHelper.sanityCheckObjectProperty( + myObject, + 'My first property', + 'Value1' + ) + ).toBe(''); + expect( + gd.ProjectHelper.sanityCheckObjectProperty( + myObject, + 'My other property', + '0' + ) + ).toBe(''); + expect( + gd.ProjectHelper.sanityCheckObjectInitialInstanceProperty( + myObject, + 'My instance property', + 'Value1' + ) + ).toBe(''); + expect( + gd.ProjectHelper.sanityCheckObjectInitialInstanceProperty( + myObject, + 'My other instance property', + '0' + ) + ).toBe(''); + } catch (ex) { + console.error(ex); + + throw Error( + 'Exception caught while launching sanityCheckObject on a gd.ObjectJsImplementation.' + ); + } + }); + + it('can clone a gd.ObjectJsImplementation', function() { + const project = gd.ProjectHelper.createNewGDJSProject(); + const object1 = createSampleObjectJsImplementation(); + object1.updateProperty('My first property', 'test1', project); + const object2 = object1.clone().release(); + const object3 = object1.clone().release(); + + { + const propertiesObject1 = object1.getProperties(project); + expect(propertiesObject1.has('My first property')); + expect( + propertiesObject1.get('My first property').getValue() == 'test1' + ); + const propertiesObject2 = object2.getProperties(project); + expect(propertiesObject2.has('My first property')); + expect( + propertiesObject2.get('My first property').getValue() == 'test1' + ); + } + + { + object1.updateProperty('My first property', 'updated value', project); + const propertiesObject1 = object1.getProperties(project); + expect(propertiesObject1.has('My first property')); + expect( + propertiesObject1.get('My first property').getValue() == + 'updated value' + ); + const propertiesObject2 = object2.getProperties(project); + expect(propertiesObject2.has('My first property')); + expect( + propertiesObject2.get('My first property').getValue() == 'test1' + ); + } + + { + object2.updateProperty( + 'My first property', + 'updated value object 2', + project + ); + const propertiesObject1 = object1.getProperties(project); + expect(propertiesObject1.has('My first property')); + expect( + propertiesObject1.get('My first property').getValue() == + 'updated value' + ); + const propertiesObject2 = object2.getProperties(project); + expect(propertiesObject2.has('My first property')); + expect( + propertiesObject2.get('My first property').getValue() == + 'updated value object 2' + ); + const propertiesObject3 = object3.getProperties(project); + expect(propertiesObject3.has('My first property')); + expect( + propertiesObject3.get('My first property').getValue() == 'test1' + ); + } + + project.delete(); + }); + }); + + describe('gd.ObjectGroupsContainer', function() { + var container = null; + var group1 = null; + var group2 = null; + var group3 = null; + + beforeAll(() => (container = new gd.ObjectGroupsContainer())); + + it('can have groups inserted', function() { + group1 = container.insertNew('Group1', 0); + group2 = container.insertNew('Group2', 1); + group3 = container.insertNew('Group3', 2); + + expect(container.getAt(0).getName()).toBe('Group1'); + expect(container.getAt(1).getName()).toBe('Group2'); + expect(container.getAt(2).getName()).toBe('Group3'); + expect(container.has('Group1')).toBe(true); + expect(container.has('Group2')).toBe(true); + expect(container.has('Group3')).toBe(true); + expect(container.has('Group4')).toBe(false); + expect(container.get('Group1').getName()).toBe('Group1'); + expect(container.get('Group2').getName()).toBe('Group2'); + expect(container.get('Group3').getName()).toBe('Group3'); + expect(container.count()).toBe(3); + }); + + it('can move groups', function() { + container.move(0, 1); + expect(container.getAt(0).getName()).toBe('Group2'); + expect(container.getAt(1).getName()).toBe('Group1'); + expect(container.getAt(2).getName()).toBe('Group3'); + }); + + it('can rename groups', function() { + container.rename('Inexisting', 'Whatever'); + container.rename('Group1', 'Group1Renamed'); + + expect(container.has('Group1')).toBe(false); + expect(container.has('Group1Renamed')).toBe(true); + }); + + it('can remove groups', function() { + container.remove('Group2'); + expect(container.has('Group2')).toBe(false); + expect(container.has('Group3')).toBe(true); + expect(container.count()).toBe(2); + }); + }); + + describe('gd.Instruction', function() { + it('initial values', function() { + var instr = new gd.Instruction(); + expect(instr.getParametersCount()).toBe(0); + expect(instr.getSubInstructions().size()).toBe(0); + instr.delete(); + }); + it('setting parameters', function() { + var instr = new gd.Instruction(); + instr.setParametersCount(3); + expect(instr.getParametersCount()).toBe(3); + expect(instr.getParameter(1)).toBe(''); + instr.setParameter(2, 'MyValue'); + expect(instr.getParameter(2)).toBe('MyValue'); + instr.delete(); + }); + it('can be cloned', function() { + var instr = new gd.Instruction(); + instr.setParametersCount(3); + instr.setParameter(2, 'MyValue'); + + var newInstr = instr.clone(); + expect(newInstr.getParametersCount()).toBe(3); + expect(newInstr.getParameter(1)).toBe(''); + expect(newInstr.getParameter(2)).toBe('MyValue'); + + newInstr.setParameter(2, 'MyChangedValue'); + expect(instr.getParameter(2)).toBe('MyValue'); + expect(newInstr.getParameter(2)).toBe('MyChangedValue'); + newInstr.delete(); + expect(instr.getParameter(2)).toBe('MyValue'); + + instr.delete(); + }); + }); + + describe('gd.InstructionsList', function() { + var list = null; + beforeAll(() => (list = new gd.InstructionsList())); + + it('can insert instructions', function() { + expect(list.size()).toBe(0); + list.insert(new gd.Instruction(), 0); + expect(list.size()).toBe(1); + }); + it('can modify its instructions', function() { + expect(list.get(0).getType()).toBe(''); + + var newInstr = new gd.Instruction(); + newInstr.setType('Type2'); + list.set(0, newInstr); + + expect(list.get(0).getType()).toBe('Type2'); + expect(list.size()).toBe(1); + }); + it('can remove its instructions', function() { + var newInstr = new gd.Instruction(); + newInstr.setType('Type3'); + var instruction = list.insert(newInstr, 1); + expect(list.get(1).getType()).toBe('Type3'); + expect(list.size()).toBe(2); + expect(list.contains(instruction)).toBe(true); + + list.remove(instruction); + expect(list.size()).toBe(1); + expect(list.get(0).getType()).toBe('Type2'); + }); + it('can clear its instructions', function() { + list.clear(); + expect(list.size()).toBe(0); + }); + it('can insert events from another list', function() { + var list1 = new gd.InstructionsList(); + var list2 = new gd.InstructionsList(); + + var newInstr = new gd.Instruction(); + newInstr.setType('Type1'); + list1.insert(newInstr, 0); + var newInstr2 = new gd.Instruction(); + newInstr2.setType('Type2'); + list1.insert(newInstr2, 1); + + list2.insertInstructions(list1, 0, list1.size(), 0); + expect(list2.size()).toBe(2); + expect(list2.get(0).getType()).toBe('Type1'); + expect(list2.get(1).getType()).toBe('Type2'); + + list2.insertInstructions(list1, 0, list1.size(), 1); + expect(list2.size()).toBe(4); + expect(list2.get(0).getType()).toBe('Type1'); + expect(list2.get(1).getType()).toBe('Type1'); + expect(list2.get(2).getType()).toBe('Type2'); + expect(list2.get(3).getType()).toBe('Type2'); + list1.delete(); + list2.delete(); + }); + it('can be un/serialized', function() { + var newInstr = new gd.Instruction(); + newInstr.setType('Type1'); + newInstr.setParametersCount(2); + newInstr.setParameter(0, 'Param1'); + newInstr.setParameter(1, 'Param2'); + var instruction = list.insert(newInstr, 1); + + var newInstr2 = new gd.Instruction(); + newInstr2.setType('Type2'); + newInstr2.setParametersCount(1); + newInstr2.setParameter(0, 'Param3'); + var instruction2 = list.insert(newInstr2, 1); + + var project = gd.ProjectHelper.createNewGDJSProject(); + var serializerElement = new gd.SerializerElement(); + list.serializeTo(serializerElement); + + var list2 = new gd.InstructionsList(); + list2.unserializeFrom(project, serializerElement); + + expect(list2.size()).toBe(2); + expect(list2.get(0).getType()).toBe('Type1'); + expect(list2.get(1).getType()).toBe('Type2'); + expect(list2.get(0).getParametersCount()).toBe(2); + expect(list2.get(1).getParametersCount()).toBe(1); + expect(list2.get(0).getParameter(0)).toBe('Param1'); + expect(list2.get(0).getParameter(1)).toBe('Param2'); + expect(list2.get(1).getParameter(0)).toBe('Param3'); + + list2.delete(); + project.delete(); + }); + + afterAll(function() { + list.delete(); + }); + }); + + describe('InstructionSentenceFormatter', function() { + it('should translate instructions (plain text or into a vector of text with formatting)', function() { + var instrFormatter = gd.InstructionSentenceFormatter.get(); + instrFormatter.loadTypesFormattingFromConfig(); + var action = new gd.Instruction(); //Create a simple instruction + action.setType('Delete'); + action.setParametersCount(2); + action.setParameter(0, 'MyCharacter'); + + var actionSentenceInEnglish = gd.InstructionSentenceFormatter.get().translate( + action, + gd.MetadataProvider.getActionMetadata(gd.JsPlatform.get(), 'Delete') + ); + expect(actionSentenceInEnglish).toBe('Delete object MyCharacter'); + + var formattedTexts = gd.InstructionSentenceFormatter.get().getAsFormattedText( + action, + gd.MetadataProvider.getActionMetadata(gd.JsPlatform.get(), 'Delete') + ); + + expect(formattedTexts.size()).toBe(2); + expect(formattedTexts.getString(0)).toBe('Delete object '); + expect(formattedTexts.getString(1)).toBe('MyCharacter'); + expect(formattedTexts.getTextFormatting(0).isBold()).toBe(false); + expect(formattedTexts.getTextFormatting(1).isBold()).toBe(true); + expect(formattedTexts.getTextFormatting(0).getUserData()).not.toBe(0); + expect(formattedTexts.getTextFormatting(1).getUserData()).toBe(0); + + instrFormatter.delete(); + action.delete(); + }); + }); + + describe('gd.EventsList', function() { + it('can have events', function() { + var list = new gd.EventsList(); + list.insertEvent(new gd.StandardEvent(), 0); + var lastEvent = list.insertEvent(new gd.StandardEvent(), 1); + list.insertEvent(new gd.StandardEvent(), 1); + expect(list.getEventsCount()).toBe(3); + expect(list.getEventAt(2).ptr).toBe(lastEvent.ptr); + list.delete(); + }); + + it('can create lots of new events', function() { + var project = new gd.ProjectHelper.createNewGDJSProject(); + var list = new gd.EventsList(); + for (var i = 0; i < 500; ++i) { + var evt = list.insertNewEvent( + project, + 'BuiltinCommonInstructions::Standard', + 0 + ); + expect(evt.getType()).toBe('BuiltinCommonInstructions::Standard'); + expect(gd.asStandardEvent(list.getEventAt(0)).getType()).toBe( + 'BuiltinCommonInstructions::Standard' + ); + expect(list.getEventAt(0).getType()).toBe( + 'BuiltinCommonInstructions::Standard' + ); + } + project.delete(); + list.delete(); + }); + + it('can tell if it contains an event', function() { + var list = new gd.EventsList(); + + var parentEvent = list.insertEvent(new gd.StandardEvent(), 0); + var subEvent = parentEvent + .getSubEvents() + .insertEvent(new gd.StandardEvent(), 0); + + expect(list.contains(parentEvent, false)).toBe(true); + expect(list.contains(subEvent, false)).toBe(false); + expect(list.contains(subEvent, true)).toBe(true); + + list.delete(); + }); + }); + + describe('gd.BaseEvent', function() { + it('can have a type', function() { + var event = new gd.BaseEvent(); + event.setType('Type1'); + var event2 = new gd.BaseEvent(); + event2.setType('Type2'); + + expect(event.getType()).toBe('Type1'); + expect(event2.getType()).toBe('Type2'); + + event.delete(); + event2.delete(); + }); + + it('can be cloned', function() { + var event = new gd.BaseEvent(); + event.setType('Type1'); + var event2 = event.clone(); + + expect(event.getType()).toBe('Type1'); + expect(event2.getType()).toBe('Type1'); + + event.delete(); + event2.delete(); + }); + + it('can be de/serialized', function() { + var event = new gd.BaseEvent(); + expect(typeof event.serializeTo).toBe('function'); + expect(typeof event.unserializeFrom).toBe('function'); + event.delete(); + }); + }); + + describe('gd.ArbitraryEventsWorker', function() { + describe('gd.EventsParametersLister', function() { + it('can list parameters and their types', function() { + var project = new gd.ProjectHelper.createNewGDJSProject(); + var list = new gd.EventsList(); + + var evt = new gd.StandardEvent(); + var actions = evt.getActions(); + var act = new gd.Instruction(); + act.setType('Delete'); + act.setParametersCount(1); + act.setParameter(0, 'MyObject'); + actions.push_back(act); + evt = list.insertEvent(evt, 0); + + var subEvt = new gd.StandardEvent(); + var conditions = subEvt.getConditions(); + var cnd = new gd.Instruction(); + cnd.setType('PosX'); + cnd.setParametersCount(3); + cnd.setParameter(0, 'MyObject'); + cnd.setParameter(1, '<'); + cnd.setParameter(2, '300'); + conditions.push_back(cnd); + evt.getSubEvents().insertEvent(subEvt, 0); + + var parametersLister = new gd.EventsParametersLister(project); + parametersLister.launch(list); + + expect( + parametersLister + .getParametersAndTypes() + .keys() + .size() + ).toBe(3); + expect(parametersLister.getParametersAndTypes().get('MyObject')).toBe( + 'object' + ); + expect(parametersLister.getParametersAndTypes().get('300')).toBe( + 'expression' + ); + + project.delete(); + list.delete(); + }); + }); + }); + + describe('gd.GroupEvent', function() { + it('handle basic properties', function() { + const evt = new gd.GroupEvent(); + evt.setName('MyName'); + evt.setSource('http://source.url'); + evt.setCreationTimestamp(150); + expect(evt.getName()).toBe('MyName'); + expect(evt.getSource()).toBe('http://source.url'); + expect(evt.getCreationTimestamp()).toBe(150); + }); + it('can be folded', function() { + const evt = new gd.GroupEvent(); + expect(evt.isFolded()).toBe(false); + evt.setFolded(true); + expect(evt.isFolded()).toBe(true); + }); + it('can remember parameters used to create the group from a template event', function() { + const evt = new gd.GroupEvent(); + var parameters = evt.getCreationParameters(); + parameters.push_back('Param1'); + parameters.push_back('Param2'); + + expect(evt.getCreationParameters().size()).toBe(2); + expect(evt.getCreationParameters().get(0)).toBe('Param1'); + expect(evt.getCreationParameters().get(1)).toBe('Param2'); + + parameters.clear(); + expect(evt.getCreationParameters().size()).toBe(0); + parameters.push_back('Param1'); + expect(evt.getCreationParameters().get(0)).toBe('Param1'); + }); + }); + + describe('gd.StandardEvent', function() { + it('initial values', function() { + const evt = new gd.StandardEvent(); + expect(evt.canHaveSubEvents()).toBe(true); + expect(evt.isExecutable()).toBe(true); + }); + it('conditions and actions', function() { + const evt = new gd.StandardEvent(); + var conditions = evt.getConditions(); + expect(evt.getConditions().size()).toBe(0); + var cnd = new gd.Instruction(); + conditions.push_back(cnd); + expect(evt.getConditions().size()).toBe(1); + + var actions = evt.getActions(); + expect(evt.getActions().size()).toBe(0); + var act = new gd.Instruction(); + actions.push_back(act); + expect(evt.getActions().size()).toBe(1); + }); + + afterAll(function() { + evt.delete(); + }); + }); + describe('gd.CommentEvent', function() { + it('initial values', function() { + const evt = new gd.CommentEvent(); + expect(evt.canHaveSubEvents()).toBe(false); + expect(evt.isExecutable()).toBe(false); + }); + it('can have a comment', function() { + const evt = new gd.CommentEvent(); + evt.setComment('My nice comment about my events!'); + expect(evt.getComment()).toBe('My nice comment about my events!'); + }); + it('can have a comment with UTF8 characters', function() { + const evt = new gd.CommentEvent(); + evt.setComment('Hello 官话 world!'); + expect(evt.getComment()).toBe('Hello 官话 world!'); + }); + it('can have a background color', function() { + const evt = new gd.CommentEvent(); + evt.setBackgroundColor(100, 200, 255); + expect(evt.getBackgroundColorRed()).toBe(100); + expect(evt.getBackgroundColorGreen()).toBe(200); + expect(evt.getBackgroundColorBlue()).toBe(255); + }); + it('can have a text color', function() { + const evt = new gd.CommentEvent(); + evt.setTextColor(101, 201, 254); + expect(evt.getTextColorRed()).toBe(101); + expect(evt.getTextColorGreen()).toBe(201); + expect(evt.getTextColorBlue()).toBe(254); + }); + }); + + describe('gd.SpriteObject', function() { + it('can have animations', function() { + var obj = new gd.SpriteObject('MySpriteObject'); + obj.addAnimation(new gd.Animation()); + obj.addAnimation(new gd.Animation()); + expect(obj.getAnimationsCount()).toBe(2); + obj.removeAnimation(1); + expect(obj.getAnimationsCount()).toBe(1); + }); + + it('can swap animations', function() { + var obj = new gd.SpriteObject('MySpriteObject'); + obj.removeAllAnimations(); + var anim1 = new gd.Animation(); + var anim2 = new gd.Animation(); + var sprite1 = new gd.Sprite(); + var sprite2 = new gd.Sprite(); + + sprite1.setImageName('image1'); + sprite2.setImageName('image2'); + + anim1.setDirectionsCount(1); + anim2.setDirectionsCount(1); + anim1.getDirection(0).addSprite(sprite1); + anim2.getDirection(0).addSprite(sprite2); + + obj.addAnimation(anim1); + obj.addAnimation(anim2); + expect( + obj + .getAnimation(0) + .getDirection(0) + .getSprite(0) + .getImageName() + ).toBe('image1'); + obj.swapAnimations(0, 1); + expect( + obj + .getAnimation(0) + .getDirection(0) + .getSprite(0) + .getImageName() + ).toBe('image2'); + }); + + describe('gd.Direction', function() { + it('can swap sprites', function() { + const direction = new gd.Direction(); + const sprite1 = new gd.Sprite(); + const sprite2 = new gd.Sprite(); + sprite1.setImageName('image1'); + sprite2.setImageName('image2'); + direction.addSprite(sprite1); + direction.addSprite(sprite2); + + expect(direction.getSprite(0).getImageName()).toBe('image1'); + direction.swapSprites(0, 1); + expect(direction.getSprite(0).getImageName()).toBe('image2'); + direction.swapSprites(1, 0); + expect(direction.getSprite(0).getImageName()).toBe('image1'); + direction.delete(); + }); + + it('can move sprites', function() { + const direction = new gd.Direction(); + const sprite1 = new gd.Sprite(); + const sprite2 = new gd.Sprite(); + const sprite3 = new gd.Sprite(); + sprite1.setImageName('image1'); + sprite2.setImageName('image2'); + sprite3.setImageName('image3'); + direction.addSprite(sprite1); + direction.addSprite(sprite2); + direction.addSprite(sprite3); + + expect(direction.getSprite(0).getImageName()).toBe('image1'); + direction.moveSprite(0, 2); + expect(direction.getSprite(0).getImageName()).toBe('image2'); + expect(direction.getSprite(1).getImageName()).toBe('image3'); + expect(direction.getSprite(2).getImageName()).toBe('image1'); + direction.swapSprites(1, 1); + expect(direction.getSprite(0).getImageName()).toBe('image2'); + expect(direction.getSprite(1).getImageName()).toBe('image3'); + expect(direction.getSprite(2).getImageName()).toBe('image1'); + direction.swapSprites(1, 0); + expect(direction.getSprite(0).getImageName()).toBe('image3'); + expect(direction.getSprite(1).getImageName()).toBe('image2'); + expect(direction.getSprite(2).getImageName()).toBe('image1'); + direction.swapSprites(999, 998); + expect(direction.getSprite(0).getImageName()).toBe('image3'); + expect(direction.getSprite(1).getImageName()).toBe('image2'); + expect(direction.getSprite(2).getImageName()).toBe('image1'); + direction.delete(); + }); + + it('can have metadata', function() { + const direction = new gd.Direction(); + expect(direction.getMetadata()).toBe(''); + direction.setMetadata('{test: 1}'); + expect(direction.getMetadata()).toBe('{test: 1}'); + direction.delete(); + }); + }); + + describe('gd.Sprite', function() { + it('can have default points', function() { + var sprite1 = new gd.Sprite(); + sprite1.getCenter().setX(2); + sprite1.getCenter().setY(3); + sprite1.getOrigin().setX(4); + sprite1.getOrigin().setY(5); + expect(sprite1.getCenter().getX()).toBe(2); + expect(sprite1.getCenter().getY()).toBe(3); + expect(sprite1.getOrigin().getX()).toBe(4); + expect(sprite1.getOrigin().getY()).toBe(5); + }); + + it('can have custom points', function() { + var sprite1 = new gd.Sprite(); + var point = new gd.Point('test'); + sprite1.addPoint(point); + point.delete(); + + expect(sprite1.hasPoint('test')).toBe(true); + sprite1.getPoint('test').setX(1); + sprite1.getPoint('test').setY(2); + expect(sprite1.getPoint('test').getX()).toBe(1); + expect(sprite1.getPoint('test').getY()).toBe(2); + }); + }); + }); + + describe('gd.MetadataProvider', function() { + it('can return metadata about expressions (even if they do not exist)', function() { + expect( + gd.MetadataProvider.hasExpression( + gd.JsPlatform.get(), + 'NotExistingExpression' + ) + ).toBe(false); + expect( + gd.MetadataProvider.getExpressionMetadata( + gd.JsPlatform.get(), + 'NotExistingExpression' + ).getFullName() + ).toBe(''); + }); + + describe('gd.ObjectMetadata', function() { + it('can return standard information about Sprite object', function() { + var objMetadata = gd.MetadataProvider.getObjectMetadata( + gd.JsPlatform.get(), + 'Sprite' + ); + + expect(objMetadata.getName()).toBe('Sprite'); + expect(objMetadata.getFullName()).toBe('Sprite'); + expect(objMetadata.getDescription().length).not.toBe(0); + expect(objMetadata.getIconFilename().length).not.toBe(0); + }); + }); + describe('gd.BehaviorMetadata', function() { + it('have standard methods to get information', function() { + var autoMetadata = gd.MetadataProvider.getBehaviorMetadata( + gd.JsPlatform.get(), + 'NotExistingBehavior' + ); + + expect(autoMetadata.getFullName).not.toBe(undefined); + expect(autoMetadata.getDefaultName).not.toBe(undefined); + expect(autoMetadata.getDescription).not.toBe(undefined); + expect(autoMetadata.getGroup).not.toBe(undefined); + expect(autoMetadata.getIconFilename).not.toBe(undefined); + }); + }); + }); + + describe('gd.ResourcesMergingHelper (and gd.AbstractFileSystemJS)', function() { + it('should export files of the project', function() { + const project = new gd.ProjectHelper.createNewGDJSProject(); + const layout = project.insertNewLayout('Scene', 0); + const resource = new gd.ImageResource(); + const resource2 = new gd.ImageResource(); + const resource3 = new gd.ImageResource(); + const resource4 = new gd.ImageResource(); + const resource5 = new gd.ImageResource(); + resource.setName('MyResource'); + resource.setFile('MyResource.png'); + resource2.setName('MyAudioResource'); + resource2.setFile('MyResource.wav'); + resource3.setName('test/MyResource.png'); + resource3.setFile('test/MyResource.png'); + resource4.setName('test/MyResourceWithExtension'); + resource4.setFile('test/MyResourceWithExtension'); + resource5.setName('test/sub/folder/MyResourceWithExtension'); + resource5.setFile('test/sub/folder/MyResourceWithExtension'); + project.getResourcesManager().addResource(resource); + project.getResourcesManager().addResource(resource2); + project.getResourcesManager().addResource(resource3); + project.getResourcesManager().addResource(resource4); + project.getResourcesManager().addResource(resource5); + + const fs = new gd.AbstractFileSystemJS(); + fs.mkDir = fs.clearDir = function() {}; + fs.getTempDir = function(path) { + return '/tmp/'; + }; + fs.fileNameFrom = function(fullpath) { + return path.basename(fullpath); + }; + fs.dirNameFrom = function(fullpath) { + return path.dirname(fullpath); + }; + fs.makeAbsolute = function(relativePath, baseDirectory) { + return path.resolve(baseDirectory, relativePath); + }; + fs.makeRelative = function(absolutePath, baseDirectory) { + return path.relative(baseDirectory, absolutePath); + }; + + const resourcesMergingHelper = new gd.ResourcesMergingHelper(fs); + resourcesMergingHelper.setBaseDirectory('/my/project/'); + project.exposeResources(resourcesMergingHelper); + + const oldAndNewFilenames = resourcesMergingHelper.getAllResourcesOldAndNewFilename(); + expect(oldAndNewFilenames.get('/my/project/MyResource.png')).toBe( + 'MyResource.png' + ); + expect(oldAndNewFilenames.get('/my/project/MyResource.wav')).toBe( + 'MyResource.wav' + ); + expect(oldAndNewFilenames.get('/my/project/test/MyResource.png')).toBe( + 'MyResource2.png' + ); + expect( + oldAndNewFilenames.get('/my/project/test/MyResourceWithExtension') + ).toBe('MyResourceWithExtension'); + expect( + oldAndNewFilenames.get( + '/my/project/test/sub/folder/MyResourceWithExtension' + ) + ).toBe('MyResourceWithExtension2'); + + resourcesMergingHelper.delete(); + project.delete(); + }); + }); + + describe('gd.Exporter (and gd.AbstractFileSystemJS)', function() { + it('should export a layout for preview', function(done) { + var fs = new gd.AbstractFileSystemJS(); + var project = new gd.ProjectHelper.createNewGDJSProject(); + var layout = project.insertNewLayout('Scene', 0); + + fs.mkDir = fs.clearDir = function() {}; + fs.getTempDir = function(path) { + return '/tmp/'; + }; + fs.fileNameFrom = function(fullpath) { + return path.basename(fullpath); + }; + fs.dirNameFrom = function(fullpath) { + return path.dirname(fullpath); + }; + fs.writeToFile = function(path, content) { + //Validate that some code have been generated: + expect(content).toMatch('runtimeScene.getOnceTriggers().startNewFrame'); + done(); + }; + + var exporter = new gd.Exporter(fs); + exporter.exportLayoutForPixiPreview(project, layout, '/path/for/export/'); + exporter.delete(); + }); + }); + + describe('gd.EventsRemover', function() { + it('should remove events', function() { + var list = new gd.EventsList(); + var event1 = list.insertEvent(new gd.StandardEvent(), 0); + var event2 = list.insertEvent(new gd.StandardEvent(), 1); + var event3 = list.insertEvent(new gd.StandardEvent(), 2); + + var remover = new gd.EventsRemover(); + remover.addEventToRemove(event1); + remover.addEventToRemove(event3); + remover.launch(list); + + expect(list.getEventsCount()).toBe(1); + expect(list.getEventAt(0)).toBe(event2); + }); + }); + + describe('gd.WholeProjectRefactorer', function() { + it('should rename and delete an object', function() { + var project = new gd.ProjectHelper.createNewGDJSProject(); + var layout = project.insertNewLayout('Scene', 0); + var instance1 = layout.getInitialInstances().insertNewInitialInstance(); + var instance2 = layout.getInitialInstances().insertNewInitialInstance(); + instance1.setObjectName('Object1'); + instance2.setObjectName('Object2'); + + gd.WholeProjectRefactorer.objectRenamedInLayout( + project, + layout, + 'Object1', + 'Object3' + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object1')).toBe( + false + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object2')).toBe( + true + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object3')).toBe( + true + ); + + gd.WholeProjectRefactorer.objectRemovedInLayout( + project, + layout, + 'Object3', + true + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object1')).toBe( + false + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object2')).toBe( + true + ); + expect(layout.getInitialInstances().hasInstancesOfObject('Object3')).toBe( + false + ); + }); + }); + + describe('gd.ExpressionParser and gd.CallbacksForExpressionCorrectnessTesting', function() { + let project = null; + let layout = null; + beforeAll(() => { + project = new gd.ProjectHelper.createNewGDJSProject(); + layout = project.insertNewLayout('Scene', 0); + layout.insertNewObject(project, 'Sprite', 'MySpriteObject', 0); + }); + + function testMathExpression( + expression, + expectedError, + expectedErrorPosition + ) { + var callbacks, parser; + + callbacks = new gd.CallbacksForExpressionCorrectnessTesting( + project, + layout + ); + parser = new gd.ExpressionParser(expression); + expect( + parser.parseMathExpression( + project.getCurrentPlatform(), + project, + layout, + callbacks + ) + ).toBe(!expectedError); + if (expectedError) expect(parser.getFirstError()).toBe(expectedError); + if (expectedErrorPosition) + expect(parser.getFirstErrorPosition()).toBe(expectedErrorPosition); + parser.delete(); + callbacks.delete(); + } + + it('can parse valid expressions', function() { + testMathExpression('1+1'); + testMathExpression('2-3'); + testMathExpression('4/5'); + testMathExpression('6*7'); + testMathExpression('8 + 9'); + testMathExpression('10 + 11'); + testMathExpression('12 + 13 - 14'); + testMathExpression(' 15 + 16 - 17 '); + }); + + it('report errors in invalid expressions', function() { + testMathExpression('1//2', 'Operators without any number between them'); + testMathExpression('bad expression', 'Syntax error'); + testMathExpression('1 + test()', 'Syntax error'); + }); + + it('can parse valid expressions with free functions', function() { + testMathExpression('1+sin(3.14)'); + testMathExpression('abs(-5)'); + testMathExpression('abs(-5) + cos(sin(3))'); + testMathExpression('atan2(-5, 3)'); + testMathExpression('MouseX("", 0) + 1'); + }); + + it('can report errors when using too much arguments', function() { + testMathExpression( + 'abs(-5, 3)', + 'Incorrect number of parameters Expected (maximum) :1' + ); + testMathExpression( + 'MouseX("", 0, 0) + 1', + 'Incorrect number of parameters Expected (maximum) :2' + ); + }); + + it('can parse valid expressions with free functions having optional parameters', function() { + testMathExpression('MouseX() + 1'); + testMathExpression('MouseX("") + 1'); + }); + + it('can parse expressions with objects functions', function() { + testMathExpression('MySpriteObject.X()'); + testMathExpression('MySpriteObject.X() + 1'); + testMathExpression('MySpriteObject.PointX("Point")'); + }); + + it('can report errors when using too much arguments in object functions', function() { + testMathExpression( + 'MySpriteObject.PointX("Point", 2)', + 'Incorrect number of parameters Expected (maximum) :2' + ); + }); + + it('can parse arguments being expressions', function() { + testMathExpression('MouseX(VariableString(myVariable), 0) + 1'); + }); + }); + + describe('gd.ExpressionParser2 and gd.ExpressionValidator', function() { + let project = null; + let layout = null; + beforeAll(() => { + project = new gd.ProjectHelper.createNewGDJSProject(); + layout = project.insertNewLayout('Scene', 0); + layout.insertNewObject(project, 'Sprite', 'MySpriteObject', 0); + }); + + function testExpression( + type, + expression, + expectedError, + expectedErrorPosition + ) { + const parser = new gd.ExpressionParser2( + gd.JsPlatform.get(), + project, + layout + ); + const expressionNode = parser.parseExpression(type, expression).get(); + + const expressionValidator = new gd.ExpressionValidator(); + expressionNode.visit(expressionValidator); + if (expectedError) { + expect(expressionValidator.getErrors().size()).toBe(1); + expect( + expressionValidator + .getErrors() + .at(0) + .getMessage() + ).toBe(expectedError); + if (expectedErrorPosition) + expect( + expressionValidator + .getErrors() + .at(0) + .getStartPosition() + ).toBe(expectedErrorPosition); + } else { + expect(expressionValidator.getErrors().size()).toBe(0); + } + + expressionValidator.delete(); + parser.delete(); + } + + it('can parse valid expressions', function() { + testExpression('number', '1+1'); + testExpression('number', '2-3'); + testExpression('number', '4/5'); + testExpression('number', '6*7'); + testExpression('number', '8 + 9'); + testExpression('number', '10 + 11'); + testExpression('number', '12 + 13 - 14'); + testExpression('number', ' 15 + 16 - 17 '); + testExpression('number', '.14'); + testExpression('number', '3.'); + }); + + it('report errors in invalid expressions', function() { + testExpression( + 'number', + '1//2', + 'You must enter a number or a valid expression call.', + 2 + ); + testExpression('number', 'bad expression', 'You must enter a number.', 0); + testExpression( + 'number', + '1 + test()', + "Cannot find an expression with this name: test\nDouble check that you've not made any typo in the name.", + 4 + ); + testExpression( + 'number', + '3..14', + 'No operator found. Did you forget to enter an operator (like +, -, * or /) between numbers or expressions?', + 2 + ); + testExpression( + 'string', + '="Mynewscene"', + 'You must enter a text (between quotes) or a valid expression call.', + 0 + ); + }); + + it('can parse valid expressions with free functions', function() { + testExpression('number', '1+sin(3.14)'); + testExpression('number', 'abs(-5)'); + testExpression('number', 'abs(-5) + cos(sin(3))'); + testExpression('number', 'atan2(-5, 3)'); + testExpression('number', 'MouseX("", 0) + 1'); + }); + + it('can report errors when using too much arguments', function() { + testExpression( + 'number', + 'abs(-5, 3)', + "This parameter was not expected by this expression. Remove it or verify that you've entered the proper expression name." + ); + testExpression( + 'number', + 'MouseX("", 0, 0) + 1', + "This parameter was not expected by this expression. Remove it or verify that you've entered the proper expression name." + ); + }); + + it('can parse valid expressions with free functions having optional parameters', function() { + testExpression('number', 'MouseX() + 1'); + testExpression('number', 'MouseX("") + 1'); + }); + + it('can parse expressions with objects functions', function() { + testExpression('number', 'MySpriteObject.X()'); + testExpression('number', 'MySpriteObject.X() + 1'); + testExpression('number', 'MySpriteObject.PointX("Point")'); + }); + + it('can report errors when using too much arguments in object functions', function() { + testExpression( + 'number', + 'MySpriteObject.PointX("Point", 2)', + "This parameter was not expected by this expression. Remove it or verify that you've entered the proper expression name." + ); + }); + + it('can parse arguments being expressions', function() { + testExpression('number', 'MouseX(VariableString(myVariable), 0) + 1'); + }); + }); + + describe('gd.Vector2f', function() { + describe('gd.VectorVector2f', function() { + it('can be used to manipulate a vector of gd.Vector2f', function() { + const vectorVector2f = new gd.VectorVector2f(); + const vector2f = new gd.Vector2f(); + + vectorVector2f.push_back(vector2f); + vectorVector2f.push_back(vector2f); + vectorVector2f.push_back(vector2f); + + expect(vectorVector2f.size()).toBe(3); + vectorVector2f.at(0).set_x(1); + vectorVector2f.at(1).set_x(2); + vectorVector2f.at(2).set_x(3); + + expect(vectorVector2f.at(0).get_x()).toBe(1); + expect(vectorVector2f.at(1).get_x()).toBe(2); + expect(vectorVector2f.at(2).get_x()).toBe(3); + + gd.removeFromVectorVector2f(vectorVector2f, 1); + expect(vectorVector2f.size()).toBe(2); + expect(vectorVector2f.at(0).get_x()).toBe(1); + expect(vectorVector2f.at(1).get_x()).toBe(3); + + vectorVector2f.clear(); + expect(vectorVector2f.size()).toBe(0); + }); + }); + }); + + describe('gd.PlatformExtension', function() { + it('can be created and have basic information filled', function() { + const extension = new gd.PlatformExtension(); + extension + .setExtensionInformation( + 'TestExtensionName', + 'Full name of test extension', + 'Description of test extension', + 'Author of test extension', + 'License of test extension' + ) + .setExtensionHelpPath('/path/to/extension/help'); + + expect(extension.getName()).toBe('TestExtensionName'); + expect(extension.getFullName()).toBe('Full name of test extension'); + expect(extension.getDescription()).toBe('Description of test extension'); + expect(extension.getAuthor()).toBe('Author of test extension'); + expect(extension.getLicense()).toBe('License of test extension'); + expect(extension.getHelpPath()).toBe('/path/to/extension/help'); + extension.delete(); + }); + }); + + describe('gd.Platform (using gd.JsPlatform)', function() { + it('can have extension added and removed', function() { + const extension = new gd.PlatformExtension(); + extension.setExtensionInformation( + 'MyNewExtension', + 'Full name of test extension', + 'Description of test extension', + 'Author of test extension', + 'License of test extension' + ); + + gd.JsPlatform.get().addNewExtension(extension); + expect(gd.JsPlatform.get().isExtensionLoaded('MyNewExtension')).toBe( + true + ); + gd.JsPlatform.get().removeExtension('MyNewExtension'); + expect(gd.JsPlatform.get().isExtensionLoaded('MyNewExtension')).toBe( + false + ); + gd.JsPlatform.get().addNewExtension(extension); + gd.JsPlatform.get().addNewExtension(extension); + expect(gd.JsPlatform.get().isExtensionLoaded('MyNewExtension')).toBe( + true + ); + gd.JsPlatform.get().removeExtension('MyNewExtension'); + expect(gd.JsPlatform.get().isExtensionLoaded('MyNewExtension')).toBe( + false + ); + extension.delete(); + }); + + it('has a namespace separator', function() { + expect(gd.PlatformExtension.getNamespaceSeparator()).toBe('::'); + }); + }); + + describe('gd.ParameterMetadataTools', function() { + it('can tell the type of a parameter', function() { + expect(gd.ParameterMetadata.isObject('object')).toBe(true); + expect(gd.ParameterMetadata.isObject('objectPtr')).toBe(true); + expect(gd.ParameterMetadata.isObject('123')).toBe(false); + expect(gd.ParameterMetadata.isBehavior('behavior')).toBe(true); + expect(gd.ParameterMetadata.isBehavior('behavior34234')).toBe(false); + }); + + it('can create an object container from parameters', function() { + const project = gd.ProjectHelper.createNewGDJSProject(); + + const parameters = new gd.VectorParameterMetadata(); + const parameter1 = new gd.ParameterMetadata(); + parameter1.setType('objectList'); + parameter1.setName('MyObjectWithoutType'); + parameter1.setDescription('The first object to be used'); + const parameter2 = new gd.ParameterMetadata(); + parameter2.setType('expression'); + parameter2.setName('MyNumber'); + parameter2.setDescription('Some number'); + const parameter3 = new gd.ParameterMetadata(); + parameter3.setType('objectList'); + // parameter3.setName(''); No name for this parameter + parameter3.setDescription( + 'This parameter will be skipped, as it has no name' + ); + parameter3.setExtraInfo('Sprite'); + const parameter4 = new gd.ParameterMetadata(); + parameter4.setType('string'); + parameter4.setName('MyString'); + parameter4.setDescription('Some string'); + const parameter5 = new gd.ParameterMetadata(); + parameter5.setType('objectList'); + parameter5.setName('MySpriteObject'); + parameter5.setDescription('The second object to be used, a sprite'); + parameter5.setExtraInfo('Sprite'); + + parameters.push_back(parameter1); + parameters.push_back(parameter2); + parameters.push_back(parameter3); + parameters.push_back(parameter4); + parameters.push_back(parameter5); + + parameters.push_back(parameter5); + expect(parameters.size()).toBe(6); + gd.removeFromVectorParameterMetadata(parameters, 5); + expect(parameters.size()).toBe(5); + + objectsContainer = new gd.ObjectsContainer(); + gd.ParameterMetadataTools.parametersToObjectsContainer( + project, + parameters, + objectsContainer + ); + + expect(objectsContainer.getObjectsCount()).toBe(2); + expect(objectsContainer.hasObjectNamed('MyObjectWithoutType')).toBe(true); + expect(objectsContainer.getObject('MyObjectWithoutType').getType()).toBe( + '' + ); + expect(objectsContainer.hasObjectNamed('MySpriteObject')).toBe(true); + expect(objectsContainer.getObject('MySpriteObject').getType()).toBe( + 'Sprite' + ); + + project.delete(); + }); + + it('can give the previous object parameter', function() { + const parameters = new gd.VectorParameterMetadata(); + const parameter1 = new gd.ParameterMetadata(); + parameter1.setType('objectList'); + const parameter2 = new gd.ParameterMetadata(); + parameter2.setType('behavior'); + const parameter3 = new gd.ParameterMetadata(); + parameter3.setType('objectList'); + const parameter4 = new gd.ParameterMetadata(); + parameter4.setType('string'); + const parameter5 = new gd.ParameterMetadata(); + parameter5.setType('objectvar'); + const parameter6 = new gd.ParameterMetadata(); + parameter6.setType('objectvar'); + + parameters.push_back(parameter1); + parameters.push_back(parameter2); + parameters.push_back(parameter3); + parameters.push_back(parameter4); + parameters.push_back(parameter5); + parameters.push_back(parameter6); + + objectsContainer = new gd.ObjectsContainer(); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 0) + ).toBe(-1); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 1) + ).toBe(0); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 2) + ).toBe(0); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 3) + ).toBe(2); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 4) + ).toBe(2); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 5) + ).toBe(2); + expect( + gd.ParameterMetadataTools.getObjectParameterIndexFor(parameters, 999) + ).toBe(-1); + }); + }); + + describe('gd.EventsFunction', () => { + it('can store events', function() { + const project = gd.ProjectHelper.createNewGDJSProject(); + const eventsFunction = new gd.EventsFunction(); + const events = eventsFunction.getEvents(); + expect(events.getEventsCount()).toBe(0); + var evt = events.insertNewEvent( + project, + 'BuiltinCommonInstructions::Standard', + 0 + ); + expect(events.getEventsCount()).toBe(1); + eventsFunction.delete(); + project.delete(); + }); + it('can have a name, fullname and description', function() { + const eventsFunction = new gd.EventsFunction(); + eventsFunction.setName('My name'); + eventsFunction.setFullName('My descriptive name'); + eventsFunction.setDescription('My description'); + expect(eventsFunction.getName()).toBe('My name'); + expect(eventsFunction.getFullName()).toBe('My descriptive name'); + expect(eventsFunction.getDescription()).toBe('My description'); + eventsFunction.delete(); + }); + }); + + describe('gd.EventsFunctionsExtension', () => { + it('can have a namespace, version, name, fullname, description', function() { + const eventsFunctionsExtension = new gd.EventsFunctionsExtension(); + eventsFunctionsExtension.setNamespace('MyExt'); + eventsFunctionsExtension.setVersion('1.1'); + eventsFunctionsExtension.setName('My name'); + eventsFunctionsExtension.setFullName('My descriptive name'); + eventsFunctionsExtension.setDescription('My description'); + expect(eventsFunctionsExtension.getNamespace()).toBe('MyExt'); + expect(eventsFunctionsExtension.getVersion()).toBe('1.1'); + expect(eventsFunctionsExtension.getName()).toBe('My name'); + expect(eventsFunctionsExtension.getFullName()).toBe( + 'My descriptive name' + ); + expect(eventsFunctionsExtension.getDescription()).toBe('My description'); + + const eventsFunction = eventsFunctionsExtension.insertNewEventsFunction( + 'MyFunction', + 0 + ); + expect( + eventsFunctionsExtension.hasEventsFunctionNamed('MyFunction') + ).toBe(true); + expect( + eventsFunctionsExtension.hasEventsFunctionNamed('MyNotExistingFunction') + ).toBe(false); + expect(eventsFunctionsExtension.getEventsFunctionsCount()).toBe(1); + expect(eventsFunctionsExtension.getEventsFunctionAt(0).getName()).toBe( + 'MyFunction' + ); + expect( + eventsFunctionsExtension.getEventsFunction('MyFunction').getName() + ).toBe('MyFunction'); + + eventsFunctionsExtension.delete(); + }); + }); +}); diff --git a/GDevelop.js/__tests__/GDJS.js b/GDevelop.js/__tests__/GDJS.js new file mode 100644 index 000000000..c3cfb4b30 --- /dev/null +++ b/GDevelop.js/__tests__/GDJS.js @@ -0,0 +1,308 @@ +const initGDevelopJS = require('../../Binaries/Output/libGD.js/Release/libGD.js'); + +describe('libGD.js - GDJS related tests', function() { + let gd = null; + beforeAll(() => (gd = initGDevelopJS())); + + describe('EventsCodeGenerator', function() { + it('can generate code for a layout with generateSceneEventsCompleteCode', function() { + const project = gd.ProjectHelper.createNewGDJSProject(); + const layout = project.insertNewLayout('Scene', 0); + + // Create a repeat event with a trigger once + const evt = layout + .getEvents() + .insertNewEvent(project, 'BuiltinCommonInstructions::Repeat', 0); + gd.asRepeatEvent(evt).setRepeatExpression('5+4+3+2+1'); + const condition = new gd.Instruction(); + condition.setType('BuiltinCommonInstructions::Once'); + gd.asRepeatEvent(evt) + .getConditions() + .insert(condition, 0); + + const code = gd.EventsCodeGenerator.generateSceneEventsCompleteCode( + project, + layout, + layout.getEvents(), + new gd.SetString(), + true + ); + + // The loop is using a counter somewhere + expect(code).toMatch('repeatCount'); + + // Trigger once is used in a condition + expect(code).toMatch('runtimeScene.getOnceTriggers().triggerOnce'); + + condition.delete(); + }); + + it('can generate code for a layout with generateEventsFunctionCode', function() { + const project = new gd.ProjectHelper.createNewGDJSProject(); + + const includeFiles = new gd.SetString(); + const eventsFunction = new gd.EventsFunction(); + + // Create a function accepting 4 parameters: + const parameters = eventsFunction.getParameters(); + const parameter1 = new gd.ParameterMetadata(); + parameter1.setType('objectList'); + parameter1.setName('MyObject'); + parameter1.setDescription('The first object to be used'); + const parameter2 = new gd.ParameterMetadata(); + parameter2.setType('expression'); + parameter2.setName('MyNumber'); + parameter2.setDescription('Some number'); + const parameter3 = new gd.ParameterMetadata(); + parameter3.setType('objectList'); + parameter3.setName('MySprite'); + parameter3.setDescription('The second object to be used, a sprite'); + parameter3.setExtraInfo('Sprite'); + const parameter4 = new gd.ParameterMetadata(); + parameter4.setType('string'); + parameter4.setName('MyString'); + parameter4.setDescription('Some string'); + parameters.push_back(parameter1); + parameters.push_back(parameter2); + parameters.push_back(parameter3); + parameters.push_back(parameter4); + + // Create a repeat event with... + const eventsList = eventsFunction.getEvents(); + + const evt = eventsList.insertNewEvent( + project, + 'BuiltinCommonInstructions::Repeat', + 0 + ); + gd.asRepeatEvent(evt).setRepeatExpression('5+4+3+2+1'); + + // ...a trigger once condition... + const condition = new gd.Instruction(); + condition.setType('BuiltinCommonInstructions::Once'); + gd.asRepeatEvent(evt) + .getConditions() + .insert(condition, 0); + + // ...and an action to update a variable of MyObject + const action = new gd.Instruction(); + action.setType('ModVarObjet'); + action.setParametersCount(4); + action.setParameter(0, 'MyObject'); + action.setParameter(1, 'ObjectVariable'); + action.setParameter(2, '+'); + action.setParameter(3, '42'); + gd.asRepeatEvent(evt) + .getActions() + .insert(action, 0); + + const action2 = new gd.Instruction(); + action2.setType('ModVarObjet'); + action2.setParametersCount(4); + action2.setParameter(0, 'MyObject'); + action2.setParameter(1, 'ObjectVariable2'); + action2.setParameter(2, '='); + action2.setParameter( + 3, + 'GetArgumentAsNumber("MyNumber") + ToNumber(GetArgumentAsString("MyString"))' + ); + gd.asRepeatEvent(evt) + .getActions() + .insert(action2, 1); + + const namespace = 'gdjs.eventsFunction.myTest'; + const code = gd.EventsCodeGenerator.generateEventsFunctionCode( + project, + eventsFunction, + namespace, + includeFiles, + true + ); + + // Check that the function name is properly generated + expect(code).toMatch(namespace + '.func = function('); + + // Check that the context for the events function is here... + expect(code).toMatch('function(runtimeScene, eventsFunctionContext)'); + expect(code).toMatch('var eventsFunctionContext ='); + + // Check that the parameters, with the (optional) context of the parent function, + // are all here + expect(code).toMatch( + 'function(runtimeScene, MyObject, MyNumber, MySprite, MyString, parentEventsFunctionContext)' + ); + + // ...and objects should be able to get queried... + expect(code).toMatch('\"MyObject\": MyObject'); + expect(code).toMatch('\"MySprite\": MySprite'); + + // ...and arguments should be able to get queried too: + expect(code).toMatch('if (argName === "MyNumber") return MyNumber;'); + expect(code).toMatch('if (argName === "MyString") return MyString;'); + + // GetArgumentAsString("MyString") should be generated code to query and cast as a string + // the argument + expect(code).toMatch( + '(typeof eventsFunctionContext !== \'undefined\' ? "" + eventsFunctionContext.getArgument("MyString") : "")' + ); + + // GetArgumentAsNumber("MyNumber") should be generated code to query and cast as a string + // the argument + expect(code).toMatch( + '(typeof eventsFunctionContext !== \'undefined\' ? Number(eventsFunctionContext.getArgument("MyNumber")) || 0 : 0)' + ); + + // The loop is using a counter somewhere + expect(code).toMatch('repeatCount'); + + // Trigger once is used in a condition + expect(code).toMatch('runtimeScene.getOnceTriggers().triggerOnce'); + + // A variable have 42 added to it + expect(code).toMatch('getVariables().get("ObjectVariable")).add(42)'); + + condition.delete(); + action.delete(); + }); + it('can generate code for a layout with generateEventsFunctionCode, with groups', function() { + const project = new gd.ProjectHelper.createNewGDJSProject(); + + const includeFiles = new gd.SetString(); + const eventsFunction = new gd.EventsFunction(); + + // Create a function accepting 2 parameters: + const parameters = eventsFunction.getParameters(); + const parameter1 = new gd.ParameterMetadata(); + parameter1.setType('objectList'); + parameter1.setName('MyObject'); + parameter1.setDescription('The first object to be used'); + const parameter2 = new gd.ParameterMetadata(); + parameter2.setType('objectList'); + parameter2.setName('MySprite'); + parameter2.setDescription('The second object to be used, a sprite'); + parameter2.setExtraInfo('Sprite'); + parameters.push_back(parameter1); + parameters.push_back(parameter2); + + // And with a group: + const group = eventsFunction.getObjectGroups().insertNew("MyGroup", 0); + group.addObject("MyObject"); + group.addObject("MySprite"); + + // Create a repeat event with... + const eventsList = eventsFunction.getEvents(); + + const evt = eventsList.insertNewEvent( + project, + 'BuiltinCommonInstructions::Repeat', + 0 + ); + gd.asRepeatEvent(evt).setRepeatExpression('5+4+3+2+1'); + + // ...an action to update a variable of the group of objects + const action = new gd.Instruction(); + action.setType('ModVarObjet'); + action.setParametersCount(4); + action.setParameter(0, 'MyGroup'); + action.setParameter(1, 'ObjectVariable'); + action.setParameter(2, '+'); + action.setParameter(3, '42'); + gd.asRepeatEvent(evt) + .getActions() + .insert(action, 0); + + + const namespace = 'gdjs.eventsFunction.myTest'; + const code = gd.EventsCodeGenerator.generateEventsFunctionCode( + project, + eventsFunction, + namespace, + includeFiles, + true + ); + + // Check that the function name is properly generated + expect(code).toMatch(namespace + '.func = function('); + + // Check that the context for the events function is here... + expect(code).toMatch('function(runtimeScene, eventsFunctionContext)'); + expect(code).toMatch('var eventsFunctionContext ='); + + // Check that the parameters, with the (optional) context of the parent function, + // are all here + expect(code).toMatch( + 'function(runtimeScene, MyObject, MySprite, parentEventsFunctionContext)' + ); + + // ...and objects should be able to get queried... + expect(code).toMatch('\"MyObject\": MyObject'); + expect(code).toMatch('\"MySprite\": MySprite'); + + // Variables of both MyObject and MySprite should have 42 added: + expect(code).toMatch('GDMyObjectObjects2[i].getVariables().get("ObjectVariable")).add(42)'); + expect(code).toMatch('GDMySpriteObjects2[i].getVariables().get("ObjectVariable")).add(42)'); + + action.delete(); + }); + }); + describe('TextObject', function() { + it('should expose TextObject specific methods', function() { + var object = new gd.TextObject('MyTextObject'); + object.setString('Hello'); + object.setFontName('Hello.ttf'); + object.setCharacterSize(10); + object.setBold(true); + object.setColor(1, 2, 3); + + expect(object.getString()).toBe('Hello'); + expect(object.getFontName()).toBe('Hello.ttf'); + expect(object.getCharacterSize()).toBe(10); + expect(object.isBold()).toBe(true); + expect(object.getColorR()).toBe(1); + expect(object.getColorG()).toBe(2); + expect(object.getColorB()).toBe(3); + }); + }); + describe('TiledSpriteObject', function() { + it('should expose TiledSpriteObject specific methods', function() { + var object = new gd.TiledSpriteObject('MyTiledSpriteObject'); + object.setTexture('MyImageName'); + expect(object.getTexture()).toBe('MyImageName'); + }); + }); + describe('ShapePainterObject', function() { + it('should expose ShapePainterObject specific methods', function() { + var object = new gd.ShapePainterObject('MyShapePainterObject'); + object.setCoordinatesAbsolute(); + expect(object.areCoordinatesAbsolute()).toBe(true); + object.setCoordinatesRelative(); + expect(object.areCoordinatesAbsolute()).toBe(false); + }); + }); + describe('TextEntryObject', function() { + it('should expose TextEntryObject', function() { + var object = new gd.TextEntryObject('MyTextEntryObject'); + }); + }); + describe('JsCodeEvent', function() { + it('can store its code', function() { + var event = new gd.JsCodeEvent(); + event.setInlineCode('console.log("Hello world");'); + expect(event.getInlineCode()).toBe('console.log("Hello world");'); + }); + it('can store the objects to pass as parameter', function() { + var event = new gd.JsCodeEvent(); + event.setParameterObjects('MyObject'); + expect(event.getParameterObjects()).toBe('MyObject'); + }); + it('can be cloned', function() { + var event = new gd.JsCodeEvent(); + event.setInlineCode('console.log("Hello world 2");'); + event.setParameterObjects('MyObject2'); + + var cloneEvent = event.clone(); + expect(cloneEvent.getParameterObjects()).toBe('MyObject2'); + expect(cloneEvent.getInlineCode()).toBe('console.log("Hello world 2");'); + }); + }); +}); diff --git a/GDevelop.js/__tests__/Serializer.js b/GDevelop.js/__tests__/Serializer.js new file mode 100644 index 000000000..056524127 --- /dev/null +++ b/GDevelop.js/__tests__/Serializer.js @@ -0,0 +1,97 @@ +const initGDevelopJS = require('../../Binaries/Output/libGD.js/Release/libGD.js'); + +describe('libGD.js object serialization', function() { + let gd = null; + beforeAll(() => (gd = initGDevelopJS())); + + describe('gd.SerializerElement', function() { + it('should support operations on its value', function() { + var element = new gd.SerializerElement(); + element.setString('aaa'); + expect(element.getValue().getString()).toBe('aaa'); + + element.setInt(123); + expect(element.getValue().getInt()).toBe(123); + + element.setDouble(123.456); + expect(element.getValue().getDouble()).toBe(123.456); + }); + it('should cast values from a type to another', function() { + var element = new gd.SerializerElement(); + element.setString('123'); + expect(element.getValue().getString()).toBe('123'); + expect(element.getValue().getInt()).toBe(123); + expect(element.getValue().getDouble()).toBe(123.0); + + element.setString('true'); + expect(element.getValue().getBool()).toBe(true); + element.setBool(false); + expect(element.getValue().getBool()).toBe(false); + }); + it('should support operations on its children', function() { + var element = new gd.SerializerElement(); + + expect(element.hasChild('Missing')).toBe(false); + var child1 = element.addChild('Child1'); + expect(element.hasChild('Child1')).toBe(true); + expect(element.getChild('Child1').ptr).toBe(child1.ptr); + + var child2 = new gd.SerializerElement(); + child2.addChild('subChild').setString('Hello world!'); + element.addChild('Child2'); + element.setChild('Child2', child2); + + expect( + element + .getChild('Child2') + .getChild('subChild') + .getValue() + .getString() + ).toBe('Hello world!'); + }); + }); + + describe('gd.Serializer', function() { + it('should serialize a Text Object', function() { + var obj = new gd.TextObject('testObject'); + obj.setType('TextObject::Text'); + obj.setName('testObject'); + obj.setString('Text of the object, with 官话 characters'); + + var serializedObject = new gd.SerializerElement(); + obj.serializeTo(serializedObject); + var jsonObject = gd.Serializer.toJSON(serializedObject); + serializedObject.delete(); + obj.delete(); + + expect(jsonObject).toBe( + '{"bold": false,"italic": false,"name": "testObject","smoothed": true,"type": "TextObject::Text","underlined": false,"variables": [],"behaviors": [],"string": "Text of the object, with 官话 characters","font": "","characterSize": 20,"color": {"b": 255,"g": 255,"r": 255}}' + ); + }); + }); + + describe('gd.Serializer.fromJSON', function() { + it('should unserialize and reserialize JSON', function() { + var json = + '{"a": {"a1": {"name": "","referenceTo": "/a/a1"}},"b": {"b1": "world"},"c": {"c1": 3},"things": {"0": {"name": "layout0","referenceTo": "/layouts/layout"},"1": {"name": "layout1","referenceTo": "/layouts/layout"},"2": {"name": "layout2","referenceTo": "/layouts/layout"},"3": {"name": "layout3","referenceTo": "/layouts/layout"},"4": {"name": "layout4","referenceTo": "/layouts/layout"}}}'; + + var element = gd.Serializer.fromJSON(json); + var outputJson = gd.Serializer.toJSON(element); + + expect(outputJson).toBe(json); + }); + }); + + describe('gd.Serializer.fromJSObject', function() { + it('should unserialize and reserialize JSON', function() { + var json = + '{"a": {"a1": {"name": "","referenceTo": "/a/a1"}},"b": {"b1": "world"},"c": {"c1": 3},"things": {"0": {"name": "layout0","referenceTo": "/layouts/layout"},"1": {"name": "layout1","referenceTo": "/layouts/layout"},"2": {"name": "layout2","referenceTo": "/layouts/layout"},"3": {"name": "layout3","referenceTo": "/layouts/layout"},"4": {"name": "layout4","referenceTo": "/layouts/layout"}}}'; + var object = JSON.parse(json); + + var element = gd.Serializer.fromJSObject(object); + var outputJson = gd.Serializer.toJSON(element); + + expect(outputJson).toBe(json); + }); + }); +}); diff --git a/GDevelop.js/__tests__/Stress.js b/GDevelop.js/__tests__/Stress.js new file mode 100644 index 000000000..1586341be --- /dev/null +++ b/GDevelop.js/__tests__/Stress.js @@ -0,0 +1,23 @@ +const initGDevelopJS = require('../../Binaries/Output/libGD.js/Release/libGD.js'); + +describe('libGD.js - stress tests', function() { + it('should support being required a lot', function() { + process.setMaxListeners(40); //Avoid Node.js warning. + for (var i = 0; i < 20; ++i) { + var gd = initGDevelopJS(); + var layout = new gd.Layout(); + layout.setName('Test #' + i); + expect(layout.getName()).toBe('Test #' + i); + layout.delete(); + } + }); + it('should support creates a lot of objects', function() { + var gd = initGDevelopJS(); + for (var i = 0; i < 100; ++i) { + var layout = new gd.Layout(); + layout.setName('Test #' + i); + expect(layout.getName()).toBe('Test #' + i); + layout.delete(); + } + }); +}); diff --git a/GDevelop.js/__tests__/Vector.js b/GDevelop.js/__tests__/Vector.js new file mode 100644 index 000000000..634eb17b7 --- /dev/null +++ b/GDevelop.js/__tests__/Vector.js @@ -0,0 +1,65 @@ +const initGDevelopJS = require('../../Binaries/Output/libGD.js/Release/libGD.js'); + +describe('libGD.js - gd.Vector* tests', function() { + let gd = null; + beforeAll(() => (gd = initGDevelopJS())); + + describe('gd.VectorString', function() { + let vector = null; + beforeAll(() => vector = new gd.VectorString()); + + it('should allow to add strings', function() { + expect(vector.size()).toBe(0); + vector.push_back('Hello world'); + expect(vector.size()).toBe(1); + expect(vector.get(0)).toBe('Hello world'); + }); + it('can be converted to a JS array', function() { + vector.push_back('Hello world 2'); + vector.push_back('Hello world 3'); + var array = vector.toJSArray(); + expect(Array.isArray(array)).toBe(true); + expect(array.length).toBe(3); + expect(array[0]).toBe('Hello world'); + expect(array[1]).toBe('Hello world 2'); + }); + it('can be cleared', function() { + vector.clear(); + expect(vector.size()).toBe(0); + }); + it('should allow to add lots of strings', function() { + expect(vector.size()).toBe(0); + for (var i = 0; i < 250; ++i) { + vector.push_back('Hello world #' + i); + } + expect(vector.size()).toBe(250); + expect(vector.get(34)).toBe('Hello world #34'); + }); + it('can change a string at a specified index', function() { + var vector2 = new gd.VectorString(); + vector2.push_back('foo'); + vector2.push_back('bar'); + expect(vector2.size()).toBe(2); + expect(vector2.get(1)).toBe('bar'); + + expect(vector.set(56, 'Modified hello world')); + expect(vector.get(34)).toBe('Hello world #34'); + expect(vector2.set(1, 'baz')); + expect(vector.get(56)).toBe('Modified hello world'); + expect(vector2.get(1)).toBe('baz'); + expect(vector2.get(0)).toBe('foo'); + expect(vector.size()).toBe(250); + }); + it('should allow to add UTF8 strings', function() { + vector.clear(); + expect(vector.size()).toBe(0); + vector.push_back('Bonjour à tous'); + vector.push_back('官话'); + expect(vector.size()).toBe(2); + expect(vector.get(0)).toBe('Bonjour à tous'); + expect(vector.get(1)).toBe('官话'); + }); + + afterAll(() => vector.delete()); + }); +}); diff --git a/GDevelop.js/license.txt b/GDevelop.js/license.txt new file mode 100644 index 000000000..2ce00a84b --- /dev/null +++ b/GDevelop.js/license.txt @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015-present Florian Rival + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/GDevelop.js/package-lock.json b/GDevelop.js/package-lock.json new file mode 100644 index 000000000..666cdc23e --- /dev/null +++ b/GDevelop.js/package-lock.json @@ -0,0 +1,7505 @@ +{ + "name": "GDevelop.js", + "version": "0.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@babel/code-frame": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz", + "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==", + "dev": true, + "requires": { + "@babel/highlight": "7.0.0" + } + }, + "@babel/highlight": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", + "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "esutils": "2.0.2", + "js-tokens": "4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "abab": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.0.tgz", + "integrity": "sha512-sY5AXXVZv4Y1VACTtR11UJCPHHudgY5i26Qj5TypE6DKlIApbwb5uqhXcJ5UUGbvZNRh7EeIoW+LrJumBsKp7w==", + "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==", + "dev": true + }, + "acorn": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.2.tgz", + "integrity": "sha512-cJrKCNcr2kv8dlDnbw+JPUGjHZzo4myaxOLmpOX8a+rgX94YeTcTMv/LFJUSByRpc+i4GgVnnhLxvMu/2Y+rqw==", + "dev": true + }, + "acorn-globals": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.1.0.tgz", + "integrity": "sha512-KjZwU26uG3u6eZcfGbTULzFcsoz6pegNKtHPksZPOUsiKo5bUmiBPa38FuHZ/Eun+XYh/JCCkS9AS3Lu4McQOQ==", + "dev": true, + "requires": { + "acorn": "5.7.2" + } + }, + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "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-escapes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.1.0.tgz", + "integrity": "sha512-UgAb8H9D41AQnu/PbWlCofQVcnV4Gs2bBJi9eZPxfU/hgglFh3SMDMENRIqdr7H6XFnXdoknctFByVsCOotTVw==", + "dev": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "3.1.10", + "normalize-path": "2.1.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "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.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "append-transform": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-0.4.0.tgz", + "integrity": "sha1-126/jKlNJ24keja61EpLdKthGZE=", + "dev": true, + "requires": { + "default-require-extensions": "1.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "archiver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", + "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "async": "2.6.0", + "buffer-crc32": "0.2.13", + "glob": "7.0.6", + "lodash": "4.17.4", + "readable-stream": "2.3.3", + "tar-stream": "1.5.5", + "walkdir": "0.0.11", + "zip-stream": "1.2.0" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "archiver-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", + "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", + "dev": true, + "requires": { + "glob": "7.0.6", + "graceful-fs": "4.1.11", + "lazystream": "1.0.0", + "lodash": "4.17.4", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "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=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.3" + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.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 + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "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-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "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 + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "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 + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": 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" + } + }, + "babel-core": { + "version": "6.26.3", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz", + "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.6.0", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.10", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.10", + "source-map": "0.5.7", + "trim-right": "1.0.1" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-jest": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-23.4.2.tgz", + "integrity": "sha512-wg1LJ2tzsafXqPFVgAsYsMCVD5U7kwJZAvbZIxVm27iOewsQw1BR7VZifDlMTEWVo3wasoPPyMdKXWCsfFPr3Q==", + "dev": true, + "requires": { + "babel-plugin-istanbul": "4.1.6", + "babel-preset-jest": "23.2.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-istanbul": { + "version": "4.1.6", + "resolved": "http://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-4.1.6.tgz", + "integrity": "sha512-PWP9FQ1AhZhS01T/4qLSKoHGY/xvkZdVBGlKM/HuxxS3+sC66HhTNR7+MpbO/so/cz/wY94MeSWJuP1hXIPfwQ==", + "dev": true, + "requires": { + "babel-plugin-syntax-object-rest-spread": "6.13.0", + "find-up": "2.1.0", + "istanbul-lib-instrument": "1.10.2", + "test-exclude": "4.2.3" + }, + "dependencies": { + "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" + } + } + } + }, + "babel-plugin-jest-hoist": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-23.2.0.tgz", + "integrity": "sha1-5h+uBaHKiAGq3uV6bWa4zvr0QWc=", + "dev": true + }, + "babel-plugin-syntax-object-rest-spread": { + "version": "6.13.0", + "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", + "dev": true + }, + "babel-preset-jest": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-23.2.0.tgz", + "integrity": "sha1-jsegOhOPABoaj7HoETZSvxpV2kY=", + "dev": true, + "requires": { + "babel-plugin-jest-hoist": "23.2.0", + "babel-plugin-syntax-object-rest-spread": "6.13.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-runtime": "6.26.0", + "core-js": "2.5.7", + "home-or-tmp": "2.0.0", + "lodash": "4.17.10", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "dev": true, + "requires": { + "core-js": "2.5.7", + "regenerator-runtime": "0.11.1" + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.4", + "lodash": "4.17.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.10", + "to-fast-properties": "1.0.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "bl": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.1.tgz", + "integrity": "sha1-ysMo977kVzDUBLaSID/LWQ4XLV4=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "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=", + "dev": true, + "optional": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "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.3" + } + }, + "browser-process-hrtime": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz", + "integrity": "sha1-Ql1opY00R/AqBKqJQYf86K+Le44=", + "dev": true + }, + "browser-resolve": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz", + "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==", + "dev": true, + "requires": { + "resolve": "1.1.7" + } + }, + "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" + } + }, + "bser": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.0.0.tgz", + "integrity": "sha1-mseNPtXZFYBP2HrLFYvHlxR6Fxk=", + "dev": true, + "requires": { + "node-int64": "0.4.0" + } + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", + "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 + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "capture-exit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/capture-exit/-/capture-exit-1.2.0.tgz", + "integrity": "sha1-HF/MSJ/QqwDU8ax64QcuMXP7q28=", + "dev": true, + "requires": { + "rsvp": "3.6.2" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "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" + } + }, + "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" + } + }, + "chownr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", + "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "dev": true, + "optional": true + }, + "ci-info": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.5.1.tgz", + "integrity": "sha512-fKFIKXaYiL1exImwJ0AhR/6jxFPSKQBk2ayV5NiNoruUs2+rxC2kNw0EG+1Z9dugZRdCrppskQ8DN2cyaUM1Hw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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 + }, + "coffee-script": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", + "integrity": "sha1-EpOLz5vhlI+gBvkuDEyegXBRCMA=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "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=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "compress-commons": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", + "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "crc32-stream": "2.0.0", + "normalize-path": "2.1.1", + "readable-stream": "2.3.3" + } + }, + "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 + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "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=", + "dev": true + }, + "convert-source-map": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz", + "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", + "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "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 + }, + "crc": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.5.0.tgz", + "integrity": "sha1-mLi6fUiWZbo5efWbITgTdBAaGWQ=", + "dev": true + }, + "crc32-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", + "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", + "dev": true, + "requires": { + "crc": "3.5.0", + "readable-stream": "2.3.3" + } + }, + "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.3", + "shebang-command": "1.2.0", + "which": "1.2.14" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", + "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + } + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "optional": 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, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "cssom": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz", + "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==", + "dev": true + }, + "cssstyle": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.1.1.tgz", + "integrity": "sha512-364AI1l/M5TYcFH83JnOH/pSqgaNnKmYgKrm0didZMGKWjQB60dymwWy1rKUgL3J1ffdq9xVi2yGLHdSjjSNog==", + "dev": true, + "requires": { + "cssom": "0.3.4" + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "data-urls": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.0.1.tgz", + "integrity": "sha512-0HdcMZzK6ubMUnsMmQmG0AcLQPvbvb47R0+7CCZQCYgcd8OUWG91CG7sM6GoXgjz+WLl4ArFzHtBMy/QqSF4eg==", + "dev": true, + "requires": { + "abab": "2.0.0", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "7.0.0" + }, + "dependencies": { + "whatwg-url": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.0.0.tgz", + "integrity": "sha512-37GeVSIJ3kn1JgKyjiYNmSLP1yzbpb29jdmwBSgkD9h40/hyrR/OifpVUndji3tmwGgD8qpw7iQu3RSbCrBpsQ==", + "dev": true, + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + } + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "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 + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "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 + }, + "default-require-extensions": { + "version": "1.0.0", + "resolved": "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": "2.0.0" + } + }, + "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" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "1.0.2", + "isobject": "3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "detect-libc": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-0.2.0.tgz", + "integrity": "sha1-R/31ZzSKF+wl/L8LnkRjSKdvn7U=", + "dev": true, + "optional": true + }, + "detect-newline": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz", + "integrity": "sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=", + "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 + }, + "domexception": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz", + "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==", + "dev": true, + "requires": { + "webidl-conversions": "4.0.2" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "end-of-stream": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.0.tgz", + "integrity": "sha1-epDYM+/abPpurA9JSduw+tOmMgY=", + "dev": true, + "requires": { + "once": "1.4.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.12.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz", + "integrity": "sha512-C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.3", + "is-callable": "1.1.4", + "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.4", + "is-date-object": "1.0.1", + "is-symbol": "1.0.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.11.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz", + "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.6.1" + }, + "dependencies": { + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "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, + "optional": true + } + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "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 + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exec-sh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/exec-sh/-/exec-sh-0.2.2.tgz", + "integrity": "sha512-FIUCJz1RbuS0FKTdaAafAByGS0CPvU3R0MeHxgtl+djzCc//F8HakL8GzmVNZanasTbTAY/3DRFA0KpVqj/eAw==", + "dev": true, + "requires": { + "merge": "1.2.0" + } + }, + "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" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "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.4" + } + }, + "expand-template": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-1.1.0.tgz", + "integrity": "sha512-kkjwkMqj0h4w/sb32ERCDxCQkREMCAgS39DscDnSwDsbxnwwM1BTZySdC3Bn1lhY7vL08n9GoO/fVTynjDgRyQ==", + "dev": true, + "optional": true + }, + "expect": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/expect/-/expect-23.5.0.tgz", + "integrity": "sha512-aG083W63tBloy8YgafWuC44EakjYe0Q6Mg35aujBPvyNU38DvLat9BVzOihNP2NZDLaCJiFNe0vejbtO6knnlA==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "jest-diff": "23.5.0", + "jest-get-type": "22.4.3", + "jest-matcher-utils": "23.5.0", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + } + } + }, + "extend": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-2.0.1.tgz", + "integrity": "sha1-HugBBonnOV/5RIJByYZSvHWagmA=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "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=", + "dev": true + }, + "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-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "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 + }, + "fb-watchman": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.0.tgz", + "integrity": "sha1-VOmr99+i8mzZsWNsWIwa/AXeXVg=", + "dev": true, + "requires": { + "bser": "2.0.0" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-sync-cmp": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", + "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", + "dev": true + }, + "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 + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "7.0.6", + "minimatch": "3.0.4" + } + }, + "fill-range": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.4.tgz", + "integrity": "sha512-cnrcCbj01+j2gTG921VZPnHbjmdAf8oQV/iGeV2kZxGSyfYjjTyY79ErsK1WJWMpw6DaApEX72binqJE+/d+5Q==", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "3.1.0", + "repeat-element": "1.1.3", + "repeat-string": "1.6.1" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + } + } + }, + "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=", + "dev": true + }, + "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, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz", + "integrity": "sha512-z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.11.0", + "node-pre-gyp": "0.10.0" + }, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.2.0", + "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.3.6" + } + }, + "balanced-match": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "bundled": true, + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "chownr": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "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, + "optional": true + }, + "debug": { + "version": "2.6.9", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.5.1", + "bundled": true, + "dev": true, + "optional": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "fs-minipass": { + "version": "1.2.5", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true, + "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" + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true, + "optional": 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" + } + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "iconv-lite": { + "version": "0.4.21", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safer-buffer": "2.1.2" + } + }, + "ignore-walk": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.5", + "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" + } + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "minipass": { + "version": "2.2.4", + "bundled": true, + "dev": true, + "requires": { + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "minizlib": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "minipass": "2.2.4" + } + }, + "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 + }, + "nan": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.11.0.tgz", + "integrity": "sha512-F4miItu2rGnV2ySkXOQoA8FKz/SR2Q2sWP0sbTxNxz/tuokeC8WxOhPMcwi0qIyGtVn/rrSeLbvVkznqCdwYnw==", + "dev": true, + "optional": true + }, + "needle": { + "version": "2.2.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.9", + "iconv-lite": "0.4.21", + "sax": "1.2.4" + } + }, + "node-pre-gyp": { + "version": "0.10.0", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.3", + "mkdirp": "0.5.1", + "needle": "2.2.0", + "nopt": "4.0.1", + "npm-packlist": "1.1.10", + "npmlog": "4.1.2", + "rc": "1.2.7", + "rimraf": "2.6.2", + "semver": "5.5.0", + "tar": "4.4.1" + } + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.1", + "osenv": "0.1.5" + } + }, + "npm-bundled": { + "version": "1.0.3", + "bundled": true, + "dev": true, + "optional": true + }, + "npm-packlist": { + "version": "1.1.10", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "ignore-walk": "3.0.1", + "npm-bundled": "1.0.3" + } + }, + "npmlog": { + "version": "4.1.2", + "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 + }, + "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.5", + "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, + "optional": true + }, + "process-nextick-args": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.7", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.5.1", + "ini": "1.3.5", + "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.3.6", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.1.1", + "util-deprecate": "1.0.2" + } + }, + "rimraf": { + "version": "2.6.2", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.1.1", + "bundled": true, + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sax": { + "version": "1.2.4", + "bundled": true, + "dev": true, + "optional": true + }, + "semver": { + "version": "5.5.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 + }, + "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" + } + }, + "string_decoder": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "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": "4.4.1", + "bundled": true, + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "fs-minipass": "1.2.5", + "minipass": "2.2.4", + "minizlib": "1.1.0", + "mkdirp": "0.5.1", + "safe-buffer": "5.1.1", + "yallist": "3.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "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 + }, + "yallist": { + "version": "3.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.2.8" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "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.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "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 + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=", + "dev": true, + "optional": true + }, + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "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" + } + }, + "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" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "grunt": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.1.tgz", + "integrity": "sha1-6HeHZOlEsY8yuw8QuQeEdcnftWs=", + "dev": true, + "requires": { + "coffee-script": "1.10.0", + "dateformat": "1.0.12", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.3.0", + "glob": "7.0.6", + "grunt-cli": "1.2.0", + "grunt-known-options": "1.1.0", + "grunt-legacy-log": "1.0.0", + "grunt-legacy-util": "1.0.0", + "iconv-lite": "0.4.19", + "js-yaml": "3.5.5", + "minimatch": "3.0.4", + "nopt": "3.0.6", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + }, + "dependencies": { + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "0.3.0", + "grunt-known-options": "1.1.0", + "nopt": "3.0.6", + "resolve": "1.1.7" + } + } + } + }, + "grunt-contrib-clean": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", + "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", + "dev": true, + "requires": { + "async": "1.5.2", + "rimraf": "2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.0.6" + } + } + } + }, + "grunt-contrib-compress": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/grunt-contrib-compress/-/grunt-contrib-compress-1.4.3.tgz", + "integrity": "sha1-Ac7/ucY39S5wgfRjdQmD0KOw+nM=", + "dev": true, + "requires": { + "archiver": "1.3.0", + "chalk": "1.1.3", + "iltorb": "1.3.10", + "lodash": "4.17.4", + "pretty-bytes": "4.0.2", + "stream-buffers": "2.2.0" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "grunt-contrib-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-1.0.1.tgz", + "integrity": "sha1-YVCYYwhOhx1+ht5IwBUlntl3Rb0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "source-map": "0.5.7" + } + }, + "grunt-contrib-copy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", + "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "file-sync-cmp": "0.1.1" + } + }, + "grunt-contrib-uglify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-2.3.0.tgz", + "integrity": "sha1-s9AmDr3WzvoS/y+Onh4ln33kIW8=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "maxmin": "1.1.0", + "object.assign": "4.0.4", + "uglify-js": "2.8.29", + "uri-path": "1.0.0" + } + }, + "grunt-known-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "dev": true + }, + "grunt-legacy-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", + "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "1.0.0", + "hooker": "0.2.3", + "lodash": "3.10.1", + "underscore.string": "3.2.3" + } + }, + "grunt-legacy-log-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", + "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", + "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "4.3.0", + "underscore.string": "3.2.3", + "which": "1.2.14" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-mkdir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-mkdir/-/grunt-mkdir-1.0.0.tgz", + "integrity": "sha1-c+GiasJKCFljY/TdlUsNMkheWOk=", + "dev": true + }, + "grunt-newer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/grunt-newer/-/grunt-newer-1.3.0.tgz", + "integrity": "sha1-g8y3od2ny9irI7BZAk6+YUrS80I=", + "dev": true, + "requires": { + "async": "1.5.2", + "rimraf": "2.6.2" + }, + "dependencies": { + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.0.6" + } + } + } + }, + "grunt-shell": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-2.1.0.tgz", + "integrity": "sha1-Q595FZ7RHmSmUaacyKPQK+v17MI=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "npm-run-path": "2.0.2" + } + }, + "grunt-string-replace": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/grunt-string-replace/-/grunt-string-replace-1.3.1.tgz", + "integrity": "sha1-YzoDvHhIKg4OH5339kWBH8H7sWI=", + "dev": true, + "requires": { + "async": "2.6.0", + "chalk": "1.1.3" + }, + "dependencies": { + "async": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", + "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "gzip-size": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-1.0.0.tgz", + "integrity": "sha1-Zs+LEBBHInuVus5uodoMF37Vwi8=", + "dev": true, + "requires": { + "browserify-zlib": "0.1.4", + "concat-stream": "1.6.0" + } + }, + "handlebars": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.12.tgz", + "integrity": "sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==", + "dev": true, + "requires": { + "async": "2.6.1", + "optimist": "0.6.1", + "source-map": "0.6.1", + "uglify-js": "3.4.9" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true, + "optional": true + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "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 + }, + "uglify-js": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", + "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", + "dev": true, + "optional": true, + "requires": { + "commander": "2.17.1", + "source-map": "0.6.1" + } + } + } + }, + "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, + "optional": true, + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "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.6" + } + } + } + }, + "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.6" + } + } + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "optional": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "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.2", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz", + "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==", + "dev": true, + "requires": { + "whatwg-encoding": "1.0.4" + } + }, + "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" + } + }, + "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 + }, + "iltorb": { + "version": "1.3.10", + "resolved": "https://registry.npmjs.org/iltorb/-/iltorb-1.3.10.tgz", + "integrity": "sha512-nyB4+ru1u8CQqQ6w7YjasboKN3NQTN8GH/V/eEssNRKhW6UbdxdWhB9fJ5EEdjJfezKY0qPrcwLyIcgjL8hHxA==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "0.2.0", + "nan": "2.8.0", + "node-gyp": "3.6.2", + "prebuild-install": "2.3.0" + } + }, + "import-local": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-1.0.0.tgz", + "integrity": "sha512-vAaZHieK9qjGo58agRBg+bhHX3hoTZU/Oa3GESWLz7t1U62fk63aHuDJJEteXoDeTCcPmUT+z38gkHPZkkmpmQ==", + "dev": true, + "requires": { + "pkg-dir": "2.0.0", + "resolve-cwd": "2.0.0" + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "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 + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "1.4.0" + } + }, + "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-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "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-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "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.4", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", + "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", + "dev": true + }, + "is-ci": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.2.1.tgz", + "integrity": "sha512-s6tfsaQaQi3JNciBH6shVqEDvhGut0SUXr31ag8Pd8BBbVVlcGfWhpPmEOoM6RJ5TFhbypvf5yyRw/VXW1IiWg==", + "dev": true, + "requires": { + "ci-info": "1.5.1" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "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-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "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-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "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-generator-fn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz", + "integrity": "sha1-lp1J4bszKfa7fwkIm+JleLLd1Go=", + "dev": true + }, + "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-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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.3" + } + }, + "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-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=", + "dev": true + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "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" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "istanbul-api": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-1.3.7.tgz", + "integrity": "sha512-4/ApBnMVeEPG3EkSzcw25wDe4N66wxwn+KKn6b47vyek8Xb3NBAcg4xfuQbS7BqcZuTX4wxfD5lVagdggR3gyA==", + "dev": true, + "requires": { + "async": "2.6.1", + "fileset": "2.0.3", + "istanbul-lib-coverage": "1.2.1", + "istanbul-lib-hook": "1.2.2", + "istanbul-lib-instrument": "1.10.2", + "istanbul-lib-report": "1.1.5", + "istanbul-lib-source-maps": "1.2.6", + "istanbul-reports": "1.5.1", + "js-yaml": "3.12.0", + "mkdirp": "0.5.1", + "once": "1.4.0" + }, + "dependencies": { + "async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", + "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", + "dev": true, + "requires": { + "lodash": "4.17.10" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "js-yaml": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.0.tgz", + "integrity": "sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.1" + } + }, + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-1.2.1.tgz", + "integrity": "sha512-PzITeunAgyGbtY1ibVIUiV679EFChHjoMNRibEIobvmrCRaIgwLxNucOSimtNWUhEib/oO7QY2imD75JVgCJWQ==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-1.2.2.tgz", + "integrity": "sha512-/Jmq7Y1VeHnZEQ3TL10VHyb564mn6VrQXHchON9Jf/AEcmQ3ZIiyD1BVzNOKTZf/G3gE+kiGK6SmpF9y3qGPLw==", + "dev": true, + "requires": { + "append-transform": "0.4.0" + } + }, + "istanbul-lib-instrument": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-1.10.2.tgz", + "integrity": "sha512-aWHxfxDqvh/ZlxR8BBaEPVSWDPUkGD63VjGQn3jcw8jCp7sHEMKcrj4xfJn/ABzdMEHiQNyvDQhqm5o8+SQg7A==", + "dev": true, + "requires": { + "babel-generator": "6.26.1", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "istanbul-lib-coverage": "1.2.1", + "semver": "5.4.1" + } + }, + "istanbul-lib-report": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-1.1.5.tgz", + "integrity": "sha512-UsYfRMoi6QO/doUshYNqcKJqVmFe9w51GZz8BS3WB0lYxAllQYklka2wP9+dGZeHYaWIdcXUx8JGdbqaoXRXzw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "1.2.1", + "mkdirp": "0.5.1", + "path-parse": "1.0.6", + "supports-color": "3.2.3" + }, + "dependencies": { + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.6.tgz", + "integrity": "sha512-TtbsY5GIHgbMsMiRw35YBHGpZ1DVFEO19vxxeiDMYaeOFOCzfnYVxvl6pOUIZR4dtPhAGpSMup8OyF8ubsaqEg==", + "dev": true, + "requires": { + "debug": "3.1.0", + "istanbul-lib-coverage": "1.2.1", + "mkdirp": "0.5.1", + "rimraf": "2.6.2", + "source-map": "0.5.7" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.0.6" + } + } + } + }, + "istanbul-reports": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-1.5.1.tgz", + "integrity": "sha512-+cfoZ0UXzWjhAdzosCPP3AN8vvef8XDkWtTfgaN+7L3YTpNYITnCaEkceo5SEYy644VkHka/P1FvkWvrG/rrJw==", + "dev": true, + "requires": { + "handlebars": "4.0.12" + } + }, + "jest": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest/-/jest-23.5.0.tgz", + "integrity": "sha512-+X3Fk4rD8dTnHoIxHJymZthbtYllvSOnXAApQltvyLkHsv+fqyC/SZptUJDbXkFsqZJyyIXMySkdzerz3fv4oQ==", + "dev": true, + "requires": { + "import-local": "1.0.0", + "jest-cli": "23.5.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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "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" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "jest-cli": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-23.5.0.tgz", + "integrity": "sha512-Kxi2QH8s6NkpPgboza/plpmQ2bjUQ+MwYv7vM5rDwJz/x+NB4YoLXFikPXLWNP0JuYpMvYwITKneFljnNKhq2Q==", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "exit": "0.1.2", + "glob": "7.1.3", + "graceful-fs": "4.1.11", + "import-local": "1.0.0", + "is-ci": "1.2.1", + "istanbul-api": "1.3.7", + "istanbul-lib-coverage": "1.2.1", + "istanbul-lib-instrument": "1.10.2", + "istanbul-lib-source-maps": "1.2.6", + "jest-changed-files": "23.4.2", + "jest-config": "23.5.0", + "jest-environment-jsdom": "23.4.0", + "jest-get-type": "22.4.3", + "jest-haste-map": "23.5.0", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0", + "jest-resolve-dependencies": "23.5.0", + "jest-runner": "23.5.0", + "jest-runtime": "23.5.0", + "jest-snapshot": "23.5.0", + "jest-util": "23.4.0", + "jest-validate": "23.5.0", + "jest-watcher": "23.4.0", + "jest-worker": "23.2.0", + "micromatch": "2.3.11", + "node-notifier": "5.2.1", + "prompts": "0.1.14", + "realpath-native": "1.0.2", + "rimraf": "2.6.2", + "slash": "1.0.0", + "string-length": "2.0.0", + "strip-ansi": "4.0.0", + "which": "1.2.14", + "yargs": "11.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.3" + } + }, + "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" + } + }, + "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" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "yargs": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.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": "9.0.2" + } + } + } + }, + "jest-changed-files": { + "version": "23.4.2", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-23.4.2.tgz", + "integrity": "sha512-EyNhTAUWEfwnK0Is/09LxoqNDOn7mU7S3EHskG52djOFS/z+IT0jT3h3Ql61+dklcG7bJJitIWEMB4Sp1piHmA==", + "dev": true, + "requires": { + "throat": "4.1.0" + } + }, + "jest-config": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-23.5.0.tgz", + "integrity": "sha512-JENhQpLaVwXWPLUkhPYgIfecHKsU8GR1vj79rS4n0LSRsHx/U2wItZKoKAd5vtt2J58JPxRq4XheG79jd4fI7Q==", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-jest": "23.4.2", + "chalk": "2.4.1", + "glob": "7.1.3", + "jest-environment-jsdom": "23.4.0", + "jest-environment-node": "23.4.0", + "jest-get-type": "22.4.3", + "jest-jasmine2": "23.5.0", + "jest-regex-util": "23.3.0", + "jest-resolve": "23.5.0", + "jest-util": "23.4.0", + "jest-validate": "23.5.0", + "micromatch": "2.3.11", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-diff": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-23.5.0.tgz", + "integrity": "sha512-Miz8GakJIz443HkGpVOAyHQgSYqcgs2zQmDJl4oV7DYrFotchdoQvxceF6LhfpRBV1LOUGcFk5Dd/ffSXVwMsA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "diff": "3.3.1", + "jest-get-type": "22.4.3", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-docblock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-23.2.0.tgz", + "integrity": "sha1-8IXh8YVI2Z/dabICB+b9VdkTg6c=", + "dev": true, + "requires": { + "detect-newline": "2.1.0" + } + }, + "jest-each": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-23.5.0.tgz", + "integrity": "sha512-8BgebQgAJmWXpYp4Qt9l3cn1Xei0kZ7JL4cs/NXh7750ATlPGzRRYbutFVJTk5B/Lt3mjHP3G3tLQLyBOCSHGA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-environment-jsdom": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-23.4.0.tgz", + "integrity": "sha1-BWp5UrP+pROsYqFAosNox52eYCM=", + "dev": true, + "requires": { + "jest-mock": "23.2.0", + "jest-util": "23.4.0", + "jsdom": "11.12.0" + } + }, + "jest-environment-node": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-23.4.0.tgz", + "integrity": "sha1-V+gO0IQd6jAxZ8zozXlSHeuv3hA=", + "dev": true, + "requires": { + "jest-mock": "23.2.0", + "jest-util": "23.4.0" + } + }, + "jest-get-type": { + "version": "22.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-22.4.3.tgz", + "integrity": "sha512-/jsz0Y+V29w1chdXVygEKSz2nBoHoYqNShPe+QgxSNjAuP1i8+k4LbQNrfoliKej0P45sivkSCh7yiD6ubHS3w==", + "dev": true + }, + "jest-haste-map": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-23.5.0.tgz", + "integrity": "sha512-bt9Swigb6KZ6ZQq/fQDUwdUeHenVvZ6G/lKwJjwRGp+Fap8D4B3bND3FaeJg7vXVsLX8hXshRArbVxLop/5wLw==", + "dev": true, + "requires": { + "fb-watchman": "2.0.0", + "graceful-fs": "4.1.11", + "invariant": "2.2.4", + "jest-docblock": "23.2.0", + "jest-serializer": "23.0.1", + "jest-worker": "23.2.0", + "micromatch": "2.3.11", + "sane": "2.5.2" + } + }, + "jest-jasmine2": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-23.5.0.tgz", + "integrity": "sha512-xMgvDUvgqKpilsGnneC9Qr+uIlROxKI3UoJcHZeUlu6AKpQyEkGh0hKbfM0NaEjX5sy7WeFQEhcp/AiWlHcc0A==", + "dev": true, + "requires": { + "babel-traverse": "6.26.0", + "chalk": "2.4.1", + "co": "4.6.0", + "expect": "23.5.0", + "is-generator-fn": "1.0.0", + "jest-diff": "23.5.0", + "jest-each": "23.5.0", + "jest-matcher-utils": "23.5.0", + "jest-message-util": "23.4.0", + "jest-snapshot": "23.5.0", + "jest-util": "23.4.0", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-leak-detector": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-23.5.0.tgz", + "integrity": "sha512-40VsHQCIEslxg91Zg5NiZGtPeWSBLXiD6Ww+lhHlIF6u8uSQ+xgiD6NbWHFOYs1VBRI+V/ym7Q1aOtVg9tqMzQ==", + "dev": true, + "requires": { + "pretty-format": "23.5.0" + } + }, + "jest-matcher-utils": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-23.5.0.tgz", + "integrity": "sha512-hmQUKUKYOExp3T8dNYK9A9copCFYKoRLcY4WDJJ0Z2u3oF6rmAhHuZtmpHBuGpASazobBxm3TXAfAXDvz2T7+Q==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "jest-get-type": "22.4.3", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-message-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-23.4.0.tgz", + "integrity": "sha1-F2EMUJQjSVCNAaPR4L2iwHkIap8=", + "dev": true, + "requires": { + "@babel/code-frame": "7.0.0", + "chalk": "2.4.1", + "micromatch": "2.3.11", + "slash": "1.0.0", + "stack-utils": "1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-mock": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-23.2.0.tgz", + "integrity": "sha1-rRxg8p6HGdR8JuETgJi20YsmETQ=", + "dev": true + }, + "jest-regex-util": { + "version": "23.3.0", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-23.3.0.tgz", + "integrity": "sha1-X4ZylUfCeFxAAs6qj4Sf6MpHG8U=", + "dev": true + }, + "jest-resolve": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-23.5.0.tgz", + "integrity": "sha512-CRPc0ebG3baNKz/QicIy5rGfzYpMNm8AjEl/tDQhehq/QC4ttyauZdvAXel3qo+4Gri9ljajnxW+hWyxZbbcnQ==", + "dev": true, + "requires": { + "browser-resolve": "1.11.3", + "chalk": "2.4.1", + "realpath-native": "1.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-resolve-dependencies": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-23.5.0.tgz", + "integrity": "sha512-APZc/CjfzL8rH/wr+Gh7XJJygYaDjMQsWaJy4ZR1WaHWKude4WcfdU8xjqaNbx5NsVF2P2tVvsLbumlPXCdJOw==", + "dev": true, + "requires": { + "jest-regex-util": "23.3.0", + "jest-snapshot": "23.5.0" + } + }, + "jest-runner": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-23.5.0.tgz", + "integrity": "sha512-cpBvkBTVmW1ab1thbtoh2m6VnnM0BYKhj3MEzbOTZjPfzoIjUVIxLUTDobVNOvEK7aTEb/2oiPlNoOTSNJx8mw==", + "dev": true, + "requires": { + "exit": "0.1.2", + "graceful-fs": "4.1.11", + "jest-config": "23.5.0", + "jest-docblock": "23.2.0", + "jest-haste-map": "23.5.0", + "jest-jasmine2": "23.5.0", + "jest-leak-detector": "23.5.0", + "jest-message-util": "23.4.0", + "jest-runtime": "23.5.0", + "jest-util": "23.4.0", + "jest-worker": "23.2.0", + "source-map-support": "0.5.9", + "throat": "4.1.0" + }, + "dependencies": { + "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.9", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.9.tgz", + "integrity": "sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==", + "dev": true, + "requires": { + "buffer-from": "1.1.1", + "source-map": "0.6.1" + } + } + } + }, + "jest-runtime": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-23.5.0.tgz", + "integrity": "sha512-WzzYxYtoU8S1MJns0G4E3BsuFUTFBiu1qsk3iC9OTugzNQcQKt0BoOGsT7wXCKqkw/09QdV77vvaeJXST2Efgg==", + "dev": true, + "requires": { + "babel-core": "6.26.3", + "babel-plugin-istanbul": "4.1.6", + "chalk": "2.4.1", + "convert-source-map": "1.6.0", + "exit": "0.1.2", + "fast-json-stable-stringify": "2.0.0", + "graceful-fs": "4.1.11", + "jest-config": "23.5.0", + "jest-haste-map": "23.5.0", + "jest-message-util": "23.4.0", + "jest-regex-util": "23.3.0", + "jest-resolve": "23.5.0", + "jest-snapshot": "23.5.0", + "jest-util": "23.4.0", + "jest-validate": "23.5.0", + "micromatch": "2.3.11", + "realpath-native": "1.0.2", + "slash": "1.0.0", + "strip-bom": "3.0.0", + "write-file-atomic": "2.3.0", + "yargs": "11.1.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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "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" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "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" + } + }, + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + }, + "yargs": { + "version": "11.1.0", + "resolved": "http://registry.npmjs.org/yargs/-/yargs-11.1.0.tgz", + "integrity": "sha512-NwW69J42EsCSanF8kyn5upxvjp5ds+t3+udGBeTbFnERA+lF541DDpMawzo4z6W/QrzNM18D+BPMiOBibnFV5A==", + "dev": true, + "requires": { + "cliui": "4.1.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.3", + "os-locale": "2.1.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": "9.0.2" + } + } + } + }, + "jest-serializer": { + "version": "23.0.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-23.0.1.tgz", + "integrity": "sha1-o3dq6zEekP6D+rnlM+hRAr0WQWU=", + "dev": true + }, + "jest-snapshot": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-23.5.0.tgz", + "integrity": "sha512-NYg8MFNVyPXmnnihiltasr4t1FJEXFbZFaw1vZCowcnezIQ9P1w+yxTwjWT564QP24Zbn5L9cjxLs8d6K+pNlw==", + "dev": true, + "requires": { + "babel-types": "6.26.0", + "chalk": "2.4.1", + "jest-diff": "23.5.0", + "jest-matcher-utils": "23.5.0", + "jest-message-util": "23.4.0", + "jest-resolve": "23.5.0", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "pretty-format": "23.5.0", + "semver": "5.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "semver": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz", + "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-util": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-23.4.0.tgz", + "integrity": "sha1-TQY8uSe68KI4Mf9hvsLLv0l5NWE=", + "dev": true, + "requires": { + "callsites": "2.0.0", + "chalk": "2.4.1", + "graceful-fs": "4.1.11", + "is-ci": "1.2.1", + "jest-message-util": "23.4.0", + "mkdirp": "0.5.1", + "slash": "1.0.0", + "source-map": "0.6.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "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 + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-validate": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-23.5.0.tgz", + "integrity": "sha512-XmStdYhfdiDKacXX5sNqEE61Zz4/yXaPcDsKvVA0429RBu2pkQyIltCVG7UitJIEAzSs3ociQTdyseAW8VGPiA==", + "dev": true, + "requires": { + "chalk": "2.4.1", + "jest-get-type": "22.4.3", + "leven": "2.1.0", + "pretty-format": "23.5.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-watcher": { + "version": "23.4.0", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-23.4.0.tgz", + "integrity": "sha1-0uKM50+NrWxq/JIrksq+9u0FyRw=", + "dev": true, + "requires": { + "ansi-escapes": "3.1.0", + "chalk": "2.4.1", + "string-length": "2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + }, + "chalk": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz", + "integrity": "sha512-ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==", + "dev": true, + "requires": { + "ansi-styles": "3.2.1", + "escape-string-regexp": "1.0.5", + "supports-color": "5.5.0" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "jest-worker": { + "version": "23.2.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-23.2.0.tgz", + "integrity": "sha1-+vcGqNo2+uYOsmlXJX+ntdjqArk=", + "dev": true, + "requires": { + "merge-stream": "1.0.1" + } + }, + "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 + }, + "js-yaml": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", + "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "2.7.3" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-11.12.0.tgz", + "integrity": "sha512-y8Px43oyiBM13Zc1z780FrfNLJCXTL40EWlty/LXUtcjykRBNgLlCjWXpfSPBl2iv+N7koQN+dvqszHZgT/Fjw==", + "dev": true, + "requires": { + "abab": "2.0.0", + "acorn": "5.7.2", + "acorn-globals": "4.1.0", + "array-equal": "1.0.0", + "cssom": "0.3.4", + "cssstyle": "1.1.1", + "data-urls": "1.0.1", + "domexception": "1.0.1", + "escodegen": "1.11.0", + "html-encoding-sniffer": "1.0.2", + "left-pad": "1.3.0", + "nwsapi": "2.0.9", + "parse5": "4.0.0", + "pn": "1.1.0", + "request": "2.88.0", + "request-promise-native": "1.0.5", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.4.3", + "w3c-hr-time": "1.0.1", + "webidl-conversions": "4.0.2", + "whatwg-encoding": "1.0.4", + "whatwg-mimetype": "2.1.0", + "whatwg-url": "6.5.0", + "ws": "5.2.2", + "xml-name-validator": "3.0.0" + }, + "dependencies": { + "aws4": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz", + "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.20" + } + }, + "har-validator": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz", + "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==", + "dev": true, + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "mime-db": { + "version": "1.36.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz", + "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==", + "dev": true + }, + "mime-types": { + "version": "2.1.20", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz", + "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==", + "dev": true, + "requires": { + "mime-db": "1.36.0" + } + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", + "dev": true + }, + "request": { + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.8.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.2", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.1.0", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.20", + "oauth-sign": "0.9.0", + "performance-now": "2.1.0", + "qs": "6.5.2", + "safe-buffer": "5.1.2", + "tough-cookie": "2.4.3", + "tunnel-agent": "0.6.0", + "uuid": "3.3.2" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "dev": true, + "requires": { + "psl": "1.1.29", + "punycode": "1.4.1" + } + }, + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==", + "dev": true + } + } + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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-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=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "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.6" + } + }, + "kleur": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-2.0.2.tgz", + "integrity": "sha512-77XF9iTllATmG9lSlIv0qdQ2BQ/h9t0bJllHlbvsQ0zUWfU7Yi0S8L5JXzPZgkefIiajLmBJJ4BsMJmqcf7oxQ==", + "dev": true + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.3" + } + }, + "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" + } + }, + "left-pad": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/left-pad/-/left-pad-1.3.0.tgz", + "integrity": "sha512-XI5MPzVNApjAyhQzphX8BkmKsKUxD4LdyK24iZeQGinBN9yTQT3bFlCBy/aVx2HrNcqQGsdot8ghrjyrvMCoEA==", + "dev": true + }, + "leven": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", + "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "dev": true + }, + "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": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "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" + }, + "dependencies": { + "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 + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "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 + }, + "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.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "makeerror": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", + "integrity": "sha1-4BpckQnyr3lmDk6LlYd5AYT1qWw=", + "dev": true, + "requires": { + "tmpl": "1.0.4" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "math-random": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/math-random/-/math-random-1.0.1.tgz", + "integrity": "sha1-izqsWIuKZuSXXjzepn97sylgH6w=", + "dev": true + }, + "maxmin": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-1.1.0.tgz", + "integrity": "sha1-cTZehKmd2Piz99X94vANHn9zvmE=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "figures": "1.7.0", + "gzip-size": "1.0.0", + "pretty-bytes": "1.0.4" + }, + "dependencies": { + "pretty-bytes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-1.0.4.tgz", + "integrity": "sha1-CiLoIQYJrTVUL4yNXSFZr/B1HIQ=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + } + } + }, + "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.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "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" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "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=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "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" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "fragment-cache": "0.2.1", + "is-windows": "1.0.2", + "kind-of": "6.0.2", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-abi": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.1.2.tgz", + "integrity": "sha512-hmUtb8m75RSi7N+zZLYqe75XDvZB+6LyTBPkj2DConvNgQet2e3BIqEwe1LLvqMrfyjabuT5ZOrTioLCH1HTdA==", + "dev": true, + "optional": true, + "requires": { + "semver": "5.4.1" + } + }, + "node-gyp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", + "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "glob": "7.0.6", + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "nopt": "3.0.6", + "npmlog": "4.1.2", + "osenv": "0.1.4", + "request": "2.83.0", + "rimraf": "2.2.8", + "semver": "5.3.0", + "tar": "2.2.1", + "which": "1.2.14" + }, + "dependencies": { + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + } + } + }, + "node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha1-h6kGXNs1XTGC2PlM4RGIuCXGijs=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.4.1", + "shellwords": "0.1.1", + "which": "1.3.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "noop-logger": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", + "integrity": "sha1-lKKxYzxPExdVMAfYlm/Q6EG2pMI=", + "dev": true, + "optional": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "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==", + "dev": 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", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "nwsapi": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.0.9.tgz", + "integrity": "sha512-nlWFSCTYQcHk/6A9FFnfhKc14c3aFhfdNBXgo8Qgi9QTBu/qg3Ww+Uiz9wMzXd1T8GFxPc2QIHB6Qtf2XFryFQ==", + "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=", + "dev": true, + "optional": 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-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "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-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "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.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.12.0" + } + }, + "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.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "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" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "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" + }, + "dependencies": { + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "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=", + "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" + } + }, + "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=", + "dev": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "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.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "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.3.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "pako": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", + "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=", + "dev": true + }, + "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" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "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.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.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 + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pkg-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", + "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", + "dev": true, + "requires": { + "find-up": "2.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "pn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz", + "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prebuild-install": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-2.3.0.tgz", + "integrity": "sha512-gzjq2oHB8oMbzJSsSh9MQ64zrXZGt092/uT4TLZlz2qnrPxpWqp4vYB7LZrDxnlxf5RfbCjkgDI/z0EIVuYzAw==", + "dev": true, + "optional": true, + "requires": { + "expand-template": "1.1.0", + "github-from-package": "0.0.0", + "minimist": "1.2.0", + "mkdirp": "0.5.1", + "node-abi": "2.1.2", + "noop-logger": "0.1.1", + "npmlog": "4.1.2", + "os-homedir": "1.0.2", + "pump": "1.0.3", + "rc": "1.2.2", + "simple-get": "1.4.3", + "tar-fs": "1.16.0", + "tunnel-agent": "0.6.0", + "xtend": "4.0.1" + } + }, + "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-bytes": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-4.0.2.tgz", + "integrity": "sha1-sr+C5zUNZcbDOqlaqlpPYyf2HNk=", + "dev": true + }, + "pretty-format": { + "version": "23.5.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-23.5.0.tgz", + "integrity": "sha512-iFLvYTXOn+C/s7eV+pr4E8DD7lYa2/klXMEz+lvH14qSDWAJ7S+kFmMe1SIWesATHQxopHTxRcB2nrpExhzaBA==", + "dev": true, + "requires": { + "ansi-regex": "3.0.0", + "ansi-styles": "3.2.1" + }, + "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 + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "1.9.3" + } + } + } + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "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 + }, + "prompts": { + "version": "0.1.14", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-0.1.14.tgz", + "integrity": "sha512-rxkyiE9YH6zAz/rZpywySLKkpaj0NMVyNw1qhsubdbjjSgcayjTShDreZGlFMcGSu5sab3bAKPfFk78PB90+8w==", + "dev": true, + "requires": { + "kleur": "2.0.2", + "sisteransi": "0.1.1" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "psl": { + "version": "1.1.29", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz", + "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==", + "dev": true + }, + "pump": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", + "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", + "dev": true, + "requires": { + "end-of-stream": "1.4.0", + "once": "1.4.0" + } + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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, + "optional": true + }, + "randomatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-3.1.0.tgz", + "integrity": "sha512-KnGPVE0lo2WoXxIZ7cPR8YBpiol4gsSuOwDSg410oHh80ZMp5EiypNqL2K4Z77vJn6lB5rap7IkAmcUlalcnBQ==", + "dev": true, + "requires": { + "is-number": "4.0.0", + "kind-of": "6.0.2", + "math-random": "1.0.1" + }, + "dependencies": { + "is-number": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz", + "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "rc": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.2.tgz", + "integrity": "sha1-2M6ctX6NZNnHut2YdsfDTL48cHc=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.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" + } + }, + "realpath-native": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.0.2.tgz", + "integrity": "sha512-+S3zTvVt9yTntFrBpm7TQmQ3tzpCrnA1a/y+3cUHAc9ZR6aIjG0WNLR+Rj79QpJktY+VeW/TQtFlQ1bzsehI8g==", + "dev": true, + "requires": { + "util.promisify": "1.0.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + }, + "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" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2", + "safe-regex": "1.1.0" + } + }, + "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 + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "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 + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "optional": 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" + }, + "dependencies": { + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + } + } + }, + "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.10" + }, + "dependencies": { + "lodash": { + "version": "4.17.10", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz", + "integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==", + "dev": true + } + } + }, + "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": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "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.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "rsvp": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", + "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==", + "dev": true + }, + "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 + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "0.1.15" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sane": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/sane/-/sane-2.5.2.tgz", + "integrity": "sha1-tNwYYcIbQn6SlQej51HiosuKs/o=", + "dev": true, + "requires": { + "anymatch": "2.0.0", + "capture-exit": "1.2.0", + "exec-sh": "0.2.2", + "fb-watchman": "2.0.0", + "fsevents": "1.2.4", + "micromatch": "3.1.10", + "minimist": "1.2.0", + "walker": "1.0.7", + "watch": "0.18.0" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.3", + "snapdragon": "0.8.2", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "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.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "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.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "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.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.2", + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.13", + "object.pick": "1.3.0", + "regex-not": "1.0.2", + "snapdragon": "0.8.2", + "to-regex": "3.0.2" + } + } + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", + "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "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-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.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 + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "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 + }, + "simple-get": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-1.4.3.tgz", + "integrity": "sha1-6XVe2kB+ltpAxeUVjJ6jezO+y+s=", + "dev": true, + "optional": true, + "requires": { + "once": "1.4.0", + "unzip-response": "1.0.2", + "xtend": "4.0.1" + } + }, + "sisteransi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-0.1.1.tgz", + "integrity": "sha512-PmGOd02bM9YO5ifxpw36nrNMBTptEtfRl4qUYl9SndkolplkrZZOW7PGHjrZL53QvMVj9nQ+TKqUnRsw4tJa4g==", + "dev": true + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.2", + "use": "3.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "optional": true, + "requires": { + "hoek": "4.2.0" + } + }, + "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-resolve": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", + "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", + "dev": true, + "requires": { + "atob": "2.1.2", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "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" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "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 + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": 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" + } + }, + "stack-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-1.0.1.tgz", + "integrity": "sha1-1PM6tU6OOHeLDKXP07OvsS22hiA=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "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-buffers": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-2.2.0.tgz", + "integrity": "sha1-kdX1Ew0c75bc+n9yaUUYh0HQnuQ=", + "dev": true + }, + "string-length": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-2.0.0.tgz", + "integrity": "sha1-1A27aGo6zpYMHP/KVivyxF+DY+0=", + "dev": true, + "requires": { + "astral-regex": "1.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 + }, + "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" + } + } + } + }, + "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_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" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "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": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "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-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "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, + "optional": true + }, + "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 + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "optional": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-fs": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-1.16.0.tgz", + "integrity": "sha512-I9rb6v7mjWLtOfCau9eH5L7sLJyU2BnxtEZRQ5Mt+eRKmf1F0ohXmT/Jc3fr52kDvjJ/HV5MH3soQfPL5bQ0Yg==", + "dev": true, + "optional": true, + "requires": { + "chownr": "1.0.1", + "mkdirp": "0.5.1", + "pump": "1.0.3", + "tar-stream": "1.5.5" + } + }, + "tar-stream": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.5.5.tgz", + "integrity": "sha512-mQdgLPc/Vjfr3VWqWbfxW8yQNiJCbAZ+Gf6GDu1Cy0bdb33ofyiNGBtAY96jHFhDuivCwgW1H9DgTON+INiXgg==", + "dev": true, + "requires": { + "bl": "1.2.1", + "end-of-stream": "1.4.0", + "readable-stream": "2.3.3", + "xtend": "4.0.1" + } + }, + "test-exclude": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-4.2.3.tgz", + "integrity": "sha512-SYbXgY64PT+4GAL2ocI3HwPa4Q4TBKm0cwAVeKOt/Aoc0gSpNRjJX8w0pA1LMKZ3LBmd8pYBqApFNQLII9kavA==", + "dev": true, + "requires": { + "arrify": "1.0.1", + "micromatch": "2.3.11", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "require-main-filename": "1.0.1" + } + }, + "throat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz", + "integrity": "sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=", + "dev": true + }, + "tmpl": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.4.tgz", + "integrity": "sha1-I2QN17QtAEM5ERQIIOXPRA5SHdE=", + "dev": true + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "2.0.2", + "extend-shallow": "3.0.2", + "regex-not": "1.0.2", + "safe-regex": "1.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "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" + } + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "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.1" + }, + "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "dev": true + } + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "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=", + "dev": true, + "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" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "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" + } + }, + "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 + }, + "underscore.string": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", + "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "unzip-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-1.0.2.tgz", + "integrity": "sha1-uYTwh3/AqJwsdzzB73tbIytbBv4=", + "dev": true, + "optional": true + }, + "uri-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", + "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", + "dev": true + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "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 + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "w3c-hr-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", + "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "dev": true, + "requires": { + "browser-process-hrtime": "0.1.2" + } + }, + "walkdir": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", + "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", + "dev": true + }, + "walker": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.7.tgz", + "integrity": "sha1-L3+bj9ENZ3JisYqITijRlhjgKPs=", + "dev": true, + "requires": { + "makeerror": "1.0.11" + } + }, + "watch": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.18.0.tgz", + "integrity": "sha1-KAlUdsbffJDJYxOJkMClQj60uYY=", + "dev": true, + "requires": { + "exec-sh": "0.2.2", + "minimist": "1.2.0" + } + }, + "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 + }, + "whatwg-encoding": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.4.tgz", + "integrity": "sha512-vM9KWN6MP2mIHZ86ytcyIv7e8Cj3KTfO2nd2c8PFDqcI4bxFmQp83ibq4wadq7rL9l9sZV6o9B0LTt8ygGAAXg==", + "dev": true, + "requires": { + "iconv-lite": "0.4.23" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", + "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", + "dev": true, + "requires": { + "safer-buffer": "2.1.2" + } + } + } + }, + "whatwg-mimetype": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.1.0.tgz", + "integrity": "sha512-FKxhYLytBQiUKjkYteN71fAUA3g6KpNXoho1isLiLSB3N1G4F35Q5vUxWfKFhBwi5IWF27VE6WxhrnnC+m0Mew==", + "dev": true + }, + "whatwg-url": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-6.5.0.tgz", + "integrity": "sha512-rhRZRqx/TLJQWUpQ6bmrt2UV4f0HCQ463yQuONJqC6fO2VoEb1pTYddbe59SkYq87aoM5A3bdhMZiUiVws+fzQ==", + "dev": true, + "requires": { + "lodash.sortby": "4.7.0", + "tr46": "1.0.1", + "webidl-conversions": "4.0.2" + } + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "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==", + "dev": true, + "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": "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": "http://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=", + "dev": true + }, + "write-file-atomic": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", + "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "imurmurhash": "0.1.4", + "signal-exit": "3.0.2" + } + }, + "ws": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz", + "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==", + "dev": true, + "requires": { + "async-limiter": "1.0.0" + } + }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "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": "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" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "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 + } + } + }, + "zip-stream": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", + "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", + "dev": true, + "requires": { + "archiver-utils": "1.3.0", + "compress-commons": "1.2.2", + "lodash": "4.17.4", + "readable-stream": "2.3.3" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + } + } +} diff --git a/GDevelop.js/package.json b/GDevelop.js/package.json new file mode 100644 index 000000000..e5b8144eb --- /dev/null +++ b/GDevelop.js/package.json @@ -0,0 +1,39 @@ +{ + "name": "GDevelop.js", + "version": "0.0.1", + "author": "Florian Rival (http://florianrival.com)", + "description": "Core of GDevelop, the open-source game creator requiring no programming skills, ported to Javascript", + "keywords": [ + "GDevelop", + "game", + "creator", + "events", + "programming", + "making", + "port" + ], + "scripts": { + "build": "grunt build", + "test": "jest" + }, + "license": "MIT", + "devDependencies": { + "extend": "^2.0.1", + "grunt": "^1.0.1", + "grunt-contrib-clean": "^1.0.0", + "grunt-contrib-compress": "^1.3.0", + "grunt-contrib-concat": "^1.0.1", + "grunt-contrib-copy": "^1.0.0", + "grunt-contrib-uglify": "^2.0.0", + "grunt-mkdir": "^1.0.0", + "grunt-newer": "^1.2.0", + "grunt-shell": "^2.1.0", + "grunt-string-replace": "^1.3.1", + "jest": "^23.5.0" + }, + "jest": { + "transformIgnorePatterns": [ + "../Binaries/Output/libGD.js/Release/libGD.js" + ] + } +} diff --git a/GDevelop.js/update-bindings.js b/GDevelop.js/update-bindings.js new file mode 100644 index 000000000..ece979ba6 --- /dev/null +++ b/GDevelop.js/update-bindings.js @@ -0,0 +1,193 @@ +#!/usr/bin/env node +/** + * This script launch Emscripten's WebIDL binder to generate + * the glue.cpp and glue.js file inside Bindings directory + * using Bindings.idl + */ + +var debug = false; //If true, add additional checks in bindings files. +var fs = require('fs'); +var exec = require('child_process').exec; + +if (!process.env.EMSCRIPTEN) { + console.error('EMSCRIPTEN env. variable is not set'); + console.log( + 'Please set Emscripten environment by launching `emsdk_env` script' + ); +} +var emscriptenPath = process.env.EMSCRIPTEN; +var webIdlBinderPath = emscriptenPath + '/tools/webidl_binder.py'; + +generateGlueFromBinding(function(err) { + if (err) return fatalError(err); + + patchGlueCppFile(function(err) { + if (err) return fatalError(err); + }); +}); + +/** + * Run Embind webidl_binder.py to generate glue.cpp and glue.js + * from Bindings.idl + */ +function generateGlueFromBinding(cb) { + fs.exists(webIdlBinderPath, function(exists) { + if (!exists) { + cb({ + message: 'Please check your Emscripten installation', + output: "Can't find " + webIdlBinderPath, + }); + return; + } + + exec( + 'python "' + webIdlBinderPath + '" Bindings/Bindings.idl Bindings/glue', + function(err, stdout, stderr) { + if (err) { + cb({ message: 'Error while running WebIDL binder:', output: err }); + } + + cb(null); + } + ); + }); +} + +/** + * A few modification needs to be made to glue.cpp because of limitations + * of the IDL language/binder. + */ +function patchGlueCppFile(cb) { + var file = 'Bindings/glue.cpp'; + var classesToErase = [ + 'ArbitraryResourceWorkerJS', + 'AbstractFileSystemJS', + 'BehaviorJsImplementation', + 'ObjectJsImplementation', + 'BehaviorSharedDataJsImplementation', + ]; + var functionsToErase = [ + 'emscripten_bind_ArbitraryResourceWorkerJS_ExposeImage_1', + 'emscripten_bind_ArbitraryResourceWorkerJS_ExposeShader_1', + 'emscripten_bind_ArbitraryResourceWorkerJS_ExposeFile_1', + ]; + fs.readFile(file, function(err, data) { + if (err) cb(err); + + var patchedFile = ''; + var insideReturnStringFunction = false; + var erasingClass = false; + var erasingFunction = false; + data + .toString() + .split('\n') + .forEach(function(line) { + //When declaring a function returning "[Const, Ref] DOMString" + //or "[Const, Value] DOMString" + //in the IDL file, the return type is const char*. We are using + //std::string in GDevelop and need to call c_str. + if (insideReturnStringFunction) { + //[Const, Value] DOMString + if (line.indexOf('static char*') !== -1) { + line = line.replace('static char*', 'static gd::String'); + } else if (line.indexOf(', &temp);') !== -1) { + line = line.replace(', &temp);', ', temp.c_str());'); + //[Const, Ref] DOMString + } else { + if (debug) { + //For debugging, use a temporary useless reference + //to check the return type is a reference and not a value. + //Could generate false positive. + line = line + .replace(';', '); return ref.c_str();') + .replace( + 'return &', + 'gd::String & ref = const_cast(' + ); + } else { + line = line.replace(';', '.c_str();').replace('&', ''); + } + } + } + + //Make sure free functions are called properly. + var freeCallPos = line.indexOf('self->FREE_'); + if (freeCallPos !== -1) { + var nameEndPos = line.indexOf('(', freeCallPos); + var name = line.substring(freeCallPos + 11, nameEndPos); + var startOfLine = line.substring(0, freeCallPos); + var endOfLine = line.substring(nameEndPos + 1, line.length); + var hasOtherParamers = endOfLine[0] !== ')'; + + line = + startOfLine + + name + + '(*self' + + (hasOtherParamers ? ', ' : '') + + endOfLine; + } + + //Fix calls to operator [] with pointers + line = line.replace('self->MAP_set', '(*self)MAP_set'); + + //Simulate copy operator with CLONE_type + var cloneCallPos = line.indexOf('self->CLONE_'); + if (cloneCallPos !== -1) { + line = line.replace('self->CLONE_', 'new '); + line = line.replace('()', '(*self)'); + } + + //Custom function MAPS_keys to get the keys of a map + var mapKeyCallPos = line.indexOf('self->MAP_keys'); + if (mapKeyCallPos !== -1) { + line = + 'temp.clear(); for(auto it = self->begin(); it != self->end();' + + '++it) { temp.push_back(it->first); } return &temp;'; + } + + if (line.indexOf('class') === 0) { + for (var i = 0; i < classesToErase.length; ++i) { + if (line.indexOf('class ' + classesToErase[i]) === 0) { + erasingClass = true; + } + } + } + if (line.indexOf('EMSCRIPTEN_KEEPALIVE') !== -1) { + for (var i = 0; i < functionsToErase.length; ++i) { + if ( + line.indexOf( + 'EMSCRIPTEN_KEEPALIVE ' + functionsToErase[i] + '(' + ) !== -1 + ) { + erasingFunction = true; + } + } + } + + if (!erasingClass && !erasingFunction) patchedFile += line + '\n'; + + if (line.indexOf('const char* EMSCRIPTEN_KEEPALIVE') == 0) { + insideReturnStringFunction = true; + } else if (line.indexOf('}') == 0) { + insideReturnStringFunction = false; + } + + if (erasingClass && line.indexOf('};') === 0) { + erasingClass = false; + } + if (erasingFunction && line.indexOf('}') === 0) { + erasingFunction = false; + } + }); + + fs.writeFile(file, patchedFile, function(err) { + cb(err); + }); + }); +} + +function fatalError(error) { + if (error.message) console.error(error.message); + if (error.output) console.log(error.output); + process.exit(1); +}