Update dependencies, npm install fails with node v13.3.0
iby opened this issue · 4 comments
It starts with the following and the list goes on and on:
> deasync@0.1.13 install /Users/ianbytchek/Downloads/okta-node-express-typescript-vue-example-master/node_modules/deasync
> node ./build.js
CXX(target) Release/obj.target/deasync/src/deasync.o
In file included from ../src/deasync.cc:3:
In file included from ../../nan/nan.h:221:
In file included from ../../nan/nan_converters.h:67:
../../nan/nan_converters_43_inl.h:22:1: error: no viable conversion from 'Local<v8::Context>' to 'v8::Isolate *'
X(Boolean)
^~~~~~~~~~
../../nan/nan_converters_43_inl.h:18:23: note: expanded from macro 'X'
val->To ## TYPE(isolate->GetCurrentContext()) \
^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/Users/ianbytchek/Library/Caches/node-gyp/13.3.0/include/node/v8.h:2762:37: note: passing argument to parameter 'isolate' here
Local<Boolean> ToBoolean(Isolate* isolate) const;
Looks like deasync v0.1.16 takes care of the latest node, but I can't see in the dependency tree what module pulls it.
Hi, did you solve the problem somehow? I'm currently facing the same issue..
Don't think I did. My overall discovery while getting up to speed with Vue was that there is a lot of really cool examples, like this one, and majority of them are outdated, some beyond the point of building and running.
I hated it to guts, but forced myself to move away from managing webpacking of the app in favor of the Vue CLI, which uses it behind the scenes anyway. What's funny, I also managed to get it working with webpack, but the build time and size were significantly longer and larger compared to Vue CLI. I obviously did something wrong, but was left with feeling that the invested time and further maintenance are not worse it.
+1
Full log is:
npm install
> deasync@0.1.13 install /data/espa/Projects/exps/vue-ts-exps/reps/okta/okta-node-express-typescript-vue-example/node_modules/deasync
> node ./build.js
make: Entering directory '/data/espa/Projects/exps/vue-ts-exps/reps/okta/okta-node-express-typescript-vue-example/node_modules/deasync/build'
CXX(target) Release/obj.target/deasync/src/deasync.o
In file included from ../../nan/nan_converters.h:67,
from ../../nan/nan.h:221,
from ../src/deasync.cc:3:
../../nan/nan_converters_43_inl.h: In static member function ‘static Nan::imp::ToFactoryBase<v8::Boolean>::return_t Nan::imp::ToFactory<v8::Boolean>::convert(v8::Local<v8::Value>)’:
../../nan/nan_converters_43_inl.h:18:49: error: cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Isolate*’
18 | val->To ## TYPE(isolate->GetCurrentContext()) \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~
| |
| v8::Local<v8::Context>
../../nan/nan_converters_43_inl.h:22:1: note: in expansion of macro ‘X’
22 | X(Boolean)
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:2762:37: note: initializing argument 1 of ‘v8::Local<v8::Boolean> v8::Value::ToBoolean(v8::Isolate*) const’
2762 | Local<Boolean> ToBoolean(Isolate* isolate) const;
| ~~~~~~~~~^~~~~~~
In file included from ../../nan/nan_converters.h:67,
from ../../nan/nan.h:221,
from ../src/deasync.cc:3:
../../nan/nan_converters_43_inl.h: In static member function ‘static Nan::imp::ValueFactoryBase<bool>::return_t Nan::imp::ToFactory<bool>::convert(v8::Local<v8::Value>)’:
../../nan/nan_converters_43_inl.h:37:55: error: cannot convert ‘v8::Local<v8::Context>’ to ‘v8::Isolate*’
37 | return val->NAME ## Value(isolate->GetCurrentContext()); \
| ~~~~~~~~~~~~~~~~~~~~~~~~~~^~
| |
| v8::Local<v8::Context>
../../nan/nan_converters_43_inl.h:40:1: note: in expansion of macro ‘X’
40 | X(bool, Boolean)
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:2771:30: note: initializing argument 1 of ‘bool v8::Value::BooleanValue(v8::Isolate*) const’
2771 | bool BooleanValue(Isolate* isolate) const;
| ~~~~~~~~~^~~~~~~
In file included from ../../nan/nan_new.h:189,
from ../../nan/nan.h:222,
from ../src/deasync.cc:3:
../../nan/nan_implementation_12_inl.h: In static member function ‘static Nan::imp::FactoryBase<v8::Function>::return_t Nan::imp::Factory<v8::Function>::New(Nan::FunctionCallback, v8::Local<v8::Value>)’:
../../nan/nan_implementation_12_inl.h:103:42: error: cannot convert ‘v8::Isolate*’ to ‘v8::Local<v8::Context>’
103 | return scope.Escape(v8::Function::New( isolate
| ^~~~~~~
| |
| v8::Isolate*
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:4313:22: note: initializing argument 1 of ‘static v8::MaybeLocal<v8::Function> v8::Function::New(v8::Local<v8::Context>, v8::FunctionCallback, v8::Local<v8::Value>, int, v8::ConstructorBehavior, v8::SideEffectType)’
4313 | Local<Context> context, FunctionCallback callback,
| ~~~~~~~~~~~~~~~^~~~~~~
In file included from ../../nan/nan_new.h:189,
from ../../nan/nan.h:222,
from ../src/deasync.cc:3:
../../nan/nan_implementation_12_inl.h: In static member function ‘static Nan::imp::FactoryBase<v8::StringObject>::return_t Nan::imp::Factory<v8::StringObject>::New(v8::Local<v8::String>)’:
../../nan/nan_implementation_12_inl.h:337:37: error: no matching function for call to ‘v8::StringObject::New(v8::Local<v8::String>&)’
337 | return v8::StringObject::New(value).As<v8::StringObject>();
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:5688:23: note: candidate: ‘static v8::Local<v8::Value> v8::StringObject::New(v8::Isolate*, v8::Local<v8::String>)’
5688 | static Local<Value> New(Isolate* isolate, Local<String> value);
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:5688:23: note: candidate expects 2 arguments, 1 provided
In file included from ../../nan/nan_new.h:189,
from ../../nan/nan.h:222,
from ../src/deasync.cc:3:
../../nan/nan_implementation_12_inl.h:337:58: error: expected primary-expression before ‘>’ token
337 | return v8::StringObject::New(value).As<v8::StringObject>();
| ^
../../nan/nan_implementation_12_inl.h:337:60: error: expected primary-expression before ‘)’ token
337 | return v8::StringObject::New(value).As<v8::StringObject>();
| ^
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In constructor ‘Nan::Utf8String::Utf8String(v8::Local<v8::Value>)’:
../../nan/nan.h:1063:53: error: no matching function for call to ‘v8::Value::ToString()’
1063 | v8::Local<v8::String> string = from->ToString();
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:2750:44: note: candidate: ‘v8::MaybeLocal<v8::String> v8::Value::ToString(v8::Local<v8::Context>) const’
2750 | V8_WARN_UNUSED_RESULT MaybeLocal<String> ToString(
| ^~~~~~~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:2750:44: note: candidate expects 1 argument, 0 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h:1073:37: error: cannot convert ‘char*’ to ‘v8::Isolate*’
1073 | length_ = string->WriteUtf8(str_, static_cast<int>(len), 0, flags);
| ^~~~
| |
| char*
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:2947:26: note: initializing argument 1 of ‘int v8::String::WriteUtf8(v8::Isolate*, char*, int, int*, int) const’
2947 | int WriteUtf8(Isolate* isolate, char* buffer, int length = -1,
| ~~~~~~~~~^~~~~~~
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(const char*, const v8::Local<v8::Value>&)’:
../../nan/nan.h:1847:64: error: no matching function for call to ‘v8::Object::Set(v8::Local<v8::String>, const v8::Local<v8::Value>&)’
1847 | New(persistentHandle)->Set(New(key).ToLocalChecked(), value);
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
3547 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate expects 3 arguments, 2 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
3550 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate expects 3 arguments, 2 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(const v8::Local<v8::String>&, const v8::Local<v8::Value>&)’:
../../nan/nan.h:1853:42: error: no matching function for call to ‘v8::Object::Set(const v8::Local<v8::String>&, const v8::Local<v8::Value>&)’
1853 | New(persistentHandle)->Set(key, value);
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
3547 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate expects 3 arguments, 2 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
3550 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate expects 3 arguments, 2 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘void Nan::AsyncWorker::SaveToPersistent(uint32_t, const v8::Local<v8::Value>&)’:
../../nan/nan.h:1859:44: error: no matching function for call to ‘v8::Object::Set(uint32_t&, const v8::Local<v8::Value>&)’
1859 | New(persistentHandle)->Set(index, value);
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, v8::Local<v8::Value>, v8::Local<v8::Value>)’
3547 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3547:37: note: candidate expects 3 arguments, 2 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate: ‘v8::Maybe<bool> v8::Object::Set(v8::Local<v8::Context>, uint32_t, v8::Local<v8::Value>)’
3550 | V8_WARN_UNUSED_RESULT Maybe<bool> Set(Local<Context> context, uint32_t index,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3550:37: note: candidate expects 3 arguments, 2 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(const char*) const’:
../../nan/nan.h:1865:61: error: no matching function for call to ‘v8::Object::Get(v8::Local<v8::String>)’
1865 | New(persistentHandle)->Get(New(key).ToLocalChecked()));
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
3594 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate expects 2 arguments, 1 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
3597 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate expects 2 arguments, 1 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(const v8::Local<v8::String>&) const’:
../../nan/nan.h:1871:55: error: no matching function for call to ‘v8::Object::Get(const v8::Local<v8::String>&)’
1871 | return scope.Escape(New(persistentHandle)->Get(key));
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
3594 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate expects 2 arguments, 1 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
3597 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate expects 2 arguments, 1 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In member function ‘v8::Local<v8::Value> Nan::AsyncWorker::GetFromPersistent(uint32_t) const’:
../../nan/nan.h:1876:57: error: no matching function for call to ‘v8::Object::Get(uint32_t&)’
1876 | return scope.Escape(New(persistentHandle)->Get(index));
| ^
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, v8::Local<v8::Value>)’
3594 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3594:43: note: candidate expects 2 arguments, 1 provided
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate: ‘v8::MaybeLocal<v8::Value> v8::Object::Get(v8::Local<v8::Context>, uint32_t)’
3597 | V8_WARN_UNUSED_RESULT MaybeLocal<Value> Get(Local<Context> context,
| ^~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:3597:43: note: candidate expects 2 arguments, 1 provided
In file included from ../src/deasync.cc:3:
../../nan/nan.h: In function ‘void Nan::AsyncQueueWorker(Nan::AsyncWorker*)’:
../../nan/nan.h:2200:62: warning: cast between incompatible function types from ‘void (*)(uv_work_t*)’ {aka ‘void (*)(uv_work_s*)’} to ‘uv_after_work_cb’ {aka ‘void (*)(uv_work_s*, int)’} [-Wcast-function-type]
2200 | , reinterpret_cast<uv_after_work_cb>(AsyncExecuteComplete)
| ^
In file included from /usr/include/c++/9.2.1/cassert:44,
from /home/w495/.cache/node-gyp/13.10.1/include/node/node_object_wrap.h:26,
from ../../nan/nan.h:54,
from ../src/deasync.cc:3:
../../nan/nan_object_wrap.h: In destructor ‘virtual Nan::ObjectWrap::~ObjectWrap()’:
../../nan/nan_object_wrap.h:24:25: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘IsNearDeath’
24 | assert(persistent().IsNearDeath());
| ^~~~~~~~~~~
In file included from ../../nan/nan.h:2690,
from ../src/deasync.cc:3:
../../nan/nan_object_wrap.h: In member function ‘void Nan::ObjectWrap::MakeWeak()’:
../../nan/nan_object_wrap.h:67:18: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘MarkIndependent’
67 | persistent().MarkIndependent();
| ^~~~~~~~~~~~~~~
In file included from /usr/include/c++/9.2.1/cassert:44,
from /home/w495/.cache/node-gyp/13.10.1/include/node/node_object_wrap.h:26,
from ../../nan/nan.h:54,
from ../src/deasync.cc:3:
../../nan/nan_object_wrap.h: In static member function ‘static void Nan::ObjectWrap::WeakCallback(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)’:
../../nan/nan_object_wrap.h:124:26: error: ‘class Nan::Persistent<v8::Object>’ has no member named ‘IsNearDeath’
124 | assert(wrap->handle_.IsNearDeath());
| ^~~~~~~~~~~
In file included from ../../nan/nan.h:52,
from ../src/deasync.cc:3:
../src/deasync.cc: At global scope:
/home/w495/.cache/node-gyp/13.10.1/include/node/node.h:618:43: warning: cast between incompatible function types from ‘void (*)(Nan::ADDON_REGISTER_FUNCTION_ARGS_TYPE)’ {aka ‘void (*)(v8::Local<v8::Object>)’} to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
618 | (node::addon_register_func) (regfunc), \
| ^
/home/w495/.cache/node-gyp/13.10.1/include/node/node.h:652:3: note: in expansion of macro ‘NODE_MODULE_X’
652 | NODE_MODULE_X(modname, regfunc, NULL, 0) // NOLINT (readability/null_usage)
| ^~~~~~~~~~~~~
../src/deasync.cc:17:1: note: in expansion of macro ‘NODE_MODULE’
17 | NODE_MODULE(deasync, init)
| ^~~~~~~~~~~
In file included from ../src/deasync.cc:2:
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h: In instantiation of ‘void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)]’:
/home/w495/.cache/node-gyp/13.10.1/include/node/node_object_wrap.h:85:78: required from here
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:10400:16: warning: cast between incompatible function types from ‘v8::WeakCallbackInfo<node::ObjectWrap>::Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<node::ObjectWrap>&)’} to ‘Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<void>&)’} [-Wcast-function-type]
10400 | reinterpret_cast<Callback>(callback), type);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h: In instantiation of ‘void v8::PersistentBase<T>::SetWeak(P*, typename v8::WeakCallbackInfo<P>::Callback, v8::WeakCallbackType) [with P = Nan::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo<P>::Callback = void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)]’:
../../nan/nan_object_wrap.h:66:61: required from here
/home/w495/.cache/node-gyp/13.10.1/include/node/v8.h:10400:16: warning: cast between incompatible function types from ‘v8::WeakCallbackInfo<Nan::ObjectWrap>::Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<Nan::ObjectWrap>&)’} to ‘Callback’ {aka ‘void (*)(const v8::WeakCallbackInfo<void>&)’} [-Wcast-function-type]
make: *** [deasync.target.mk:107: Release/obj.target/deasync/src/deasync.o] Error 1
make: Leaving directory '/data/espa/Projects/exps/vue-ts-exps/reps/okta/okta-node-express-typescript-vue-example/node_modules/deasync/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:316:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
gyp ERR! System Linux 5.5.8-1-MANJARO
gyp ERR! command "/usr/bin/node" "/usr/lib/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /data/espa/Projects/exps/vue-ts-exps/reps/okta/okta-node-express-typescript-vue-example/node_modules/deasync
gyp ERR! node -v v13.10.1
gyp ERR! node-gyp -v v6.1.0
gyp ERR! not ok
Build failed
npm WARN guitar-inventory@1.0.0 No repository field.
npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@1.2.4 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.4: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! deasync@0.1.13 install: `node ./build.js`
npm ERR! Exit status 1
npm ERR!
npm ERR! Failed at the deasync@0.1.13 install script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm ERR! A complete log of this run can be found in:
npm ERR! /home/w495/.npm/_logs/2020-03-14T20_37_21_829Z-debug.log
Thanks for filing this and alerting us to the troubles you faced. The post & code sample has been updated with new deps and works on Node v14.18. I agree with you, using Vue CLI will be the way to go going forward.
Closing as #11 gets the app working again.