Blob Blame History Raw
commit 3c8be5e707a0d5424859028dc81d1242b50ba6bf
Author: Tom Hughes <tom@compton.nu>
Date:   Sun Jun 16 15:33:08 2019 +0100

    Update for Node.js 12.x support

diff --git a/.travis.yml b/.travis.yml
index 6f0a64b..014b4b0 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -14,6 +14,7 @@ node_js:
 - 8
 - 9
 - 10
+- 12
 
 addons:
   apt:
diff --git a/package.json b/package.json
index 930f1b2..c8dacab 100644
--- a/package.json
+++ b/package.json
@@ -31,7 +31,7 @@
   },
   "dependencies": {
     "bindings": "~1.3.0",
-    "nan": "~2.10.0",
+    "nan": "~2.14.0",
     "node-pre-gyp": "~0.11.0"
   },
   "devDependencies": {
diff --git a/src/html_document.cc b/src/html_document.cc
index 13139ac..dd5ebcc 100644
--- a/src/html_document.cc
+++ b/src/html_document.cc
@@ -4,6 +4,6 @@
 namespace libxmljs {
 
 void
-HtmlDocument::Initialize(v8::Handle<v8::Object> target) {
+HtmlDocument::Initialize(v8::Local<v8::Object> target) {
 }
 }  // namespcae libxmljs
diff --git a/src/html_document.h b/src/html_document.h
index 91553ad..3a17ff4 100644
--- a/src/html_document.h
+++ b/src/html_document.h
@@ -11,7 +11,7 @@ class HtmlDocument : public XmlDocument {
   public:
 
   explicit HtmlDocument(xmlDoc* doc) : XmlDocument(doc) {}
-  static void Initialize(v8::Handle<v8::Object> target);
+  static void Initialize(v8::Local<v8::Object> target);
 };
 
 }  // namespace libxmljs
diff --git a/src/libxmljs.cc b/src/libxmljs.cc
index cf40a36..afa6b86 100644
--- a/src/libxmljs.cc
+++ b/src/libxmljs.cc
@@ -274,6 +274,6 @@ NAN_MODULE_INIT(init)
       Nan::SetMethod(target, "xmlNodeCount", XmlNodeCount);
 }
 
-NODE_MODULE(xmljs, init)
+NAN_MODULE_WORKER_ENABLED(xmljs, init)
 
 }  // namespace libxmljs
diff --git a/src/xml_attribute.cc b/src/xml_attribute.cc
index 1c2bae7..c71f567 100644
--- a/src/xml_attribute.cc
+++ b/src/xml_attribute.cc
@@ -23,7 +23,7 @@ XmlAttribute::New(xmlNode* xml_obj, const xmlChar* name, const xmlChar* value)
     }
 
     XmlAttribute* attribute = new XmlAttribute(attr);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     attribute->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -39,7 +39,7 @@ XmlAttribute::New(xmlAttr* attr)
     }
 
     XmlAttribute* attribute = new XmlAttribute(attr);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     attribute->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -59,7 +59,7 @@ NAN_METHOD(XmlAttribute::Value) {
 
   // attr.value('new value');
   if (info.Length() > 0) {
-    attr->set_value(*v8::String::Utf8Value(info[0]));
+    attr->set_value(*Nan::Utf8String(info[0]));
     return info.GetReturnValue().Set(info.Holder());
   }
 
@@ -153,7 +153,7 @@ XmlAttribute::get_namespace() {
 }
 
 void
-XmlAttribute::Initialize(v8::Handle<v8::Object> target) {
+XmlAttribute::Initialize(v8::Local<v8::Object> target) {
   Nan::HandleScope scope;
   v8::Local<v8::FunctionTemplate> tmpl =
    Nan::New<v8::FunctionTemplate>(XmlAttribute::New);
@@ -167,7 +167,7 @@ XmlAttribute::Initialize(v8::Handle<v8::Object> target) {
   Nan::SetPrototypeMethod(tmpl, "namespace", XmlAttribute::Namespace);
 
   Nan::Set(target, Nan::New<v8::String>("Attribute").ToLocalChecked(),
-              tmpl->GetFunction());
+              Nan::GetFunction(tmpl).ToLocalChecked());
 }
 
 }  // namespace libxmljs
diff --git a/src/xml_attribute.h b/src/xml_attribute.h
index 6367469..787c2be 100644
--- a/src/xml_attribute.h
+++ b/src/xml_attribute.h
@@ -14,7 +14,7 @@ public:
     explicit XmlAttribute(xmlAttr* node) :
         XmlNode(reinterpret_cast<xmlNode*>(node)) {}
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
     static v8::Local<v8::Object> New(xmlNode* xml_obj,
diff --git a/src/xml_comment.cc b/src/xml_comment.cc
index 704b2fe..f832781 100644
--- a/src/xml_comment.cc
+++ b/src/xml_comment.cc
@@ -23,14 +23,14 @@ NAN_METHOD(XmlComment::New) {
       return info.GetReturnValue().Set(info.Holder());
   }
 
-  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(document);
 
   v8::Local<v8::Value> contentOpt;
   if (info[1]->IsString()) {
       contentOpt = info[1];
   }
-  v8::String::Utf8Value contentRaw(contentOpt);
+  Nan::Utf8String contentRaw(contentOpt);
   const char* content = (contentRaw.length()) ? *contentRaw : NULL;
 
   xmlNode* comm = xmlNewDocComment(document->xml_obj, (xmlChar *) content);
@@ -40,7 +40,7 @@ NAN_METHOD(XmlComment::New) {
   comment->Wrap(info.Holder());
 
   // this prevents the document from going away
-  info.Holder()->Set(Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
+  Nan::Set(info.Holder(), Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
 
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -53,7 +53,7 @@ NAN_METHOD(XmlComment::Text) {
   if (info.Length() == 0) {
     return info.GetReturnValue().Set(comment->get_content());
   } else {
-    comment->set_content(*v8::String::Utf8Value(info[0]));
+    comment->set_content(*Nan::Utf8String(info[0]));
   }
 
   return info.GetReturnValue().Set(info.Holder());
@@ -87,7 +87,7 @@ XmlComment::New(xmlNode* node)
     }
 
     XmlComment* comment = new XmlComment(node);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     comment->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -98,7 +98,7 @@ XmlComment::XmlComment(xmlNode* node)
 }
 
 void
-XmlComment::Initialize(v8::Handle<v8::Object> target)
+XmlComment::Initialize(v8::Local<v8::Object> target)
 {
     Nan::HandleScope scope;
     v8::Local<v8::FunctionTemplate> t = Nan::New<v8::FunctionTemplate>(static_cast<NAN_METHOD((*))>(New));
@@ -111,7 +111,7 @@ XmlComment::Initialize(v8::Handle<v8::Object> target)
             XmlComment::Text);
 
     Nan::Set(target, Nan::New<v8::String>("Comment").ToLocalChecked(),
-            t->GetFunction());
+            Nan::GetFunction(t).ToLocalChecked());
 }
 
 }  // namespace libxmljs
diff --git a/src/xml_comment.h b/src/xml_comment.h
index 5eed4a6..0eecb70 100644
--- a/src/xml_comment.h
+++ b/src/xml_comment.h
@@ -11,7 +11,7 @@ public:
 
     explicit XmlComment(xmlNode* node);
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
 
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
diff --git a/src/xml_document.cc b/src/xml_document.cc
index 46e68b4..cb281e2 100644
--- a/src/xml_document.cc
+++ b/src/xml_document.cc
@@ -38,7 +38,7 @@ NAN_METHOD(XmlDocument::Encoding)
     }
 
     // set the encoding otherwise
-    v8::String::Utf8Value encoding(info[0]->ToString());
+    Nan::Utf8String encoding(Nan::To<v8::String>(info[0]).ToLocalChecked());
     if(document->xml_obj->encoding != NULL) {
         xmlFree((xmlChar*)document->xml_obj->encoding);
     }
@@ -82,7 +82,7 @@ NAN_METHOD(XmlDocument::Root)
 
     // set the element as the root element for the document
     // allows for proper retrieval of root later
-    XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(info[0]->ToObject());
+    XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
     assert(element);
     xmlDocSetRootElement(document->xml_obj, element->xml_obj);
     element->ref_wrapped_ancestor();
@@ -140,7 +140,7 @@ NAN_METHOD(XmlDocument::SetDtd)
     XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info.Holder());
     assert(document);
 
-    v8::String::Utf8Value name(info[0]);
+    Nan::Utf8String name(info[0]);
 
     v8::Local<v8::Value> extIdOpt;
     v8::Local<v8::Value> sysIdOpt;
@@ -151,8 +151,8 @@ NAN_METHOD(XmlDocument::SetDtd)
       sysIdOpt = info[2];
     }
 
-    v8::String::Utf8Value extIdRaw(extIdOpt);
-    v8::String::Utf8Value sysIdRaw(sysIdOpt);
+    Nan::Utf8String extIdRaw(extIdOpt);
+    Nan::Utf8String sysIdRaw(sysIdOpt);
 
     //must be set to null in order for xmlCreateIntSubset to ignore them
     const char* extId = (extIdRaw.length()) ? *extIdRaw : NULL;
@@ -180,38 +180,38 @@ NAN_METHOD(XmlDocument::ToString)
 
     if (info.Length() > 0) {
     if (info[0]->IsBoolean()) {
-        if (info[0]->ToBoolean()->BooleanValue() == true) {
+        if (Nan::To<v8::Boolean>(info[0]).ToLocalChecked()->Value() == true) {
             options |= XML_SAVE_FORMAT;
         }
     } else if (info[0]->IsObject()) {
-        v8::Local<v8::Object> obj = info[0]->ToObject();
+        v8::Local<v8::Object> obj = Nan::To<v8::Object>(info[0]).ToLocalChecked();
 
         // drop the xml declaration
-        if (obj->Get(Nan::New<v8::String>("declaration").ToLocalChecked())->IsFalse()) {
+        if (Nan::Get(obj, Nan::New<v8::String>("declaration").ToLocalChecked()).ToLocalChecked()->IsFalse()) {
             options |= XML_SAVE_NO_DECL;
         }
 
         // format save output
-        if (obj->Get(Nan::New<v8::String>("format").ToLocalChecked())->IsTrue()) {
+        if (Nan::Get(obj, Nan::New<v8::String>("format").ToLocalChecked()).ToLocalChecked()->IsTrue()) {
             options |= XML_SAVE_FORMAT;
         }
 
         // no empty tags (only works with XML) ex: <title></title> becomes <title/>
-        if (obj->Get(Nan::New<v8::String>("selfCloseEmpty").ToLocalChecked())->IsFalse()) {
+        if (Nan::Get(obj, Nan::New<v8::String>("selfCloseEmpty").ToLocalChecked()).ToLocalChecked()->IsFalse()) {
             options |= XML_SAVE_NO_EMPTY;
         }
 
         // format with non-significant whitespace
-        if (obj->Get(Nan::New<v8::String>("whitespace").ToLocalChecked())->IsTrue()) {
+        if (Nan::Get(obj, Nan::New<v8::String>("whitespace").ToLocalChecked()).ToLocalChecked()->IsTrue()) {
             options |= XML_SAVE_WSNONSIG;
         }
 
-        v8::Local<v8::Value> type = obj->Get(Nan::New<v8::String>("type").ToLocalChecked());
-        if (type->Equals(Nan::New<v8::String>("XML").ToLocalChecked()) ||
-            type->Equals(Nan::New<v8::String>("xml").ToLocalChecked())) {
+        v8::Local<v8::Value> type = Nan::Get(obj, Nan::New<v8::String>("type").ToLocalChecked()).ToLocalChecked();
+        if (Nan::Equals(type, Nan::New<v8::String>("XML").ToLocalChecked()).ToChecked() ||
+            Nan::Equals(type, Nan::New<v8::String>("xml").ToLocalChecked()).ToChecked()) {
             options |= XML_SAVE_AS_XML;    // force XML serialization on HTML doc
-        } else if (type->Equals(Nan::New<v8::String>("HTML").ToLocalChecked()) ||
-                 type->Equals(Nan::New<v8::String>("html").ToLocalChecked())) {
+        } else if (Nan::Equals(type, Nan::New<v8::String>("HTML").ToLocalChecked()).ToChecked() ||
+                 Nan::Equals(type, Nan::New<v8::String>("html").ToLocalChecked()).ToChecked()) {
             options |= XML_SAVE_AS_HTML;   // force HTML serialization on XML doc
             // if the document is XML and we want formatted HTML output
             // we must use the XHTML serializer because the default HTML
@@ -219,8 +219,8 @@ NAN_METHOD(XmlDocument::ToString)
             if ((options & XML_SAVE_FORMAT) && (options & XML_SAVE_XHTML) == false) {
               options |= XML_SAVE_XHTML;
             }
-        } else if (type->Equals(Nan::New<v8::String>("XHTML").ToLocalChecked()) ||
-                 type->Equals(Nan::New<v8::String>("xhtml").ToLocalChecked())) {
+        } else if (Nan::Equals(type, Nan::New<v8::String>("XHTML").ToLocalChecked()).ToChecked() ||
+                 Nan::Equals(type, Nan::New<v8::String>("xhtml").ToLocalChecked()).ToChecked()) {
                 options |= XML_SAVE_XHTML;    // force XHTML serialization
             }
         }
@@ -250,7 +250,7 @@ XmlDocument::New(xmlDoc* doc)
         return scope.Escape(static_cast<XmlDocument*>(doc->_private)->handle());
     }
 
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
 
     XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(obj);
 
@@ -268,8 +268,8 @@ XmlDocument::New(xmlDoc* doc)
 
 int getParserOption(v8::Local<v8::Object> props, const char *key, int value, bool defaultValue = true) {
     Nan::HandleScope scope;
-    v8::Local<v8::Value> prop = props->Get(Nan::New<v8::String>(key).ToLocalChecked());
-    return !prop->IsUndefined() && prop->ToBoolean()->BooleanValue() == defaultValue ? value : 0;
+    v8::Local<v8::Value> prop = Nan::Get(props, Nan::New<v8::String>(key).ToLocalChecked()).ToLocalChecked();
+    return !prop->IsUndefined() && Nan::To<v8::Boolean>(prop).ToLocalChecked()->Value() == defaultValue ? value : 0;
 }
 
 xmlParserOption getParserOptions(v8::Local<v8::Object> props) {
@@ -342,16 +342,16 @@ NAN_METHOD(XmlDocument::FromHtml)
 {
     Nan::HandleScope scope;
 
-    v8::Local<v8::Object> options = info[1]->ToObject();
-    v8::Local<v8::Value>  baseUrlOpt  = options->Get(
-        Nan::New<v8::String>("baseUrl").ToLocalChecked());
-    v8::Local<v8::Value>  encodingOpt = options->Get(
-        Nan::New<v8::String>("encoding").ToLocalChecked());
-    v8::Local<v8::Value> excludeImpliedElementsOpt = options->Get(
-        Nan::New<v8::String>("excludeImpliedElements").ToLocalChecked());
+    v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+    v8::Local<v8::Value>  baseUrlOpt  = Nan::Get(options,
+        Nan::New<v8::String>("baseUrl").ToLocalChecked()).ToLocalChecked();
+    v8::Local<v8::Value>  encodingOpt = Nan::Get(options,
+        Nan::New<v8::String>("encoding").ToLocalChecked()).ToLocalChecked();
+    v8::Local<v8::Value> excludeImpliedElementsOpt = Nan::Get(options,
+        Nan::New<v8::String>("excludeImpliedElements").ToLocalChecked()).ToLocalChecked();
 
     // the base URL that will be used for this HTML parsed document
-    v8::String::Utf8Value baseUrl_(baseUrlOpt->ToString());
+    Nan::Utf8String baseUrl_(Nan::To<v8::String>(baseUrlOpt).ToLocalChecked());
     const char * baseUrl = *baseUrl_;
     if (!baseUrlOpt->IsString()) {
         baseUrl = NULL;
@@ -359,7 +359,7 @@ NAN_METHOD(XmlDocument::FromHtml)
 
     // the encoding to be used for this document
     // (leave NULL for libxml to autodetect)
-    v8::String::Utf8Value encoding_(encodingOpt->ToString());
+    Nan::Utf8String encoding_(Nan::To<v8::String>(encodingOpt).ToLocalChecked());
     const char * encoding = *encoding_;
 
     if (!encodingOpt->IsString()) {
@@ -371,18 +371,18 @@ NAN_METHOD(XmlDocument::FromHtml)
     xmlSetStructuredErrorFunc(reinterpret_cast<void*>(&errors), XmlSyntaxError::PushToArray);
 
     int opts = (int)getParserOptions(options);
-    if (excludeImpliedElementsOpt->ToBoolean()->Value())
+    if (Nan::To<v8::Boolean>(excludeImpliedElementsOpt).ToLocalChecked()->Value())
         opts |= HTML_PARSE_NOIMPLIED | HTML_PARSE_NODEFDTD;
 
     htmlDocPtr doc;
     if (!node::Buffer::HasInstance(info[0])) {
         // Parse a string
-        v8::String::Utf8Value str(info[0]->ToString());
+        Nan::Utf8String str(Nan::To<v8::String>(info[0]).ToLocalChecked());
         doc = htmlReadMemory(*str, str.length(), baseUrl, encoding, opts);
     }
     else {
         // Parse a buffer
-        v8::Local<v8::Object> buf = info[0]->ToObject();
+        v8::Local<v8::Object> buf = Nan::To<v8::Object>(info[0]).ToLocalChecked();
         doc = htmlReadMemory(node::Buffer::Data(buf), node::Buffer::Length(buf),
                             baseUrl, encoding, opts);
     }
@@ -416,14 +416,14 @@ NAN_METHOD(XmlDocument::FromXml)
     xmlSetStructuredErrorFunc(reinterpret_cast<void *>(&errors),
             XmlSyntaxError::PushToArray);
 
-    v8::Local<v8::Object> options = info[1]->ToObject();
-    v8::Local<v8::Value>  baseUrlOpt  = options->Get(
-        Nan::New<v8::String>("baseUrl").ToLocalChecked());
-    v8::Local<v8::Value>  encodingOpt = options->Get(
-        Nan::New<v8::String>("encoding").ToLocalChecked());
+    v8::Local<v8::Object> options = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+    v8::Local<v8::Value>  baseUrlOpt  = Nan::Get(options,
+        Nan::New<v8::String>("baseUrl").ToLocalChecked()).ToLocalChecked();
+    v8::Local<v8::Value>  encodingOpt = Nan::Get(options,
+        Nan::New<v8::String>("encoding").ToLocalChecked()).ToLocalChecked();
 
     // the base URL that will be used for this document
-    v8::String::Utf8Value baseUrl_(baseUrlOpt->ToString());
+    Nan::Utf8String baseUrl_(Nan::To<v8::String>(baseUrlOpt).ToLocalChecked());
     const char * baseUrl = *baseUrl_;
     if (!baseUrlOpt->IsString()) {
         baseUrl = NULL;
@@ -431,7 +431,7 @@ NAN_METHOD(XmlDocument::FromXml)
 
     // the encoding to be used for this document
     // (leave NULL for libxml to autodetect)
-    v8::String::Utf8Value encoding_(encodingOpt->ToString());
+    Nan::Utf8String encoding_(Nan::To<v8::String>(encodingOpt).ToLocalChecked());
     const char * encoding = *encoding_;
     if (!encodingOpt->IsString()) {
         encoding = NULL;
@@ -441,12 +441,12 @@ NAN_METHOD(XmlDocument::FromXml)
     xmlDocPtr doc;
     if (!node::Buffer::HasInstance(info[0])) {
       // Parse a string
-      v8::String::Utf8Value str(info[0]->ToString());
+      Nan::Utf8String str(Nan::To<v8::String>(info[0]).ToLocalChecked());
       doc = xmlReadMemory(*str, str.length(), baseUrl, "UTF-8", opts);
     }
     else {
       // Parse a buffer
-      v8::Local<v8::Object> buf = info[0]->ToObject();
+      v8::Local<v8::Object> buf = Nan::To<v8::Object>(info[0]).ToLocalChecked();
       doc = xmlReadMemory(node::Buffer::Data(buf), node::Buffer::Length(buf),
                           baseUrl, encoding, opts);
     }
@@ -483,7 +483,7 @@ NAN_METHOD(XmlDocument::Validate)
             XmlSyntaxError::PushToArray);
 
     XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info.Holder());
-    XmlDocument* documentSchema = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+    XmlDocument* documentSchema = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
 
     xmlSchemaParserCtxtPtr parser_ctxt = xmlSchemaNewDocParserCtxt(documentSchema->xml_obj);
     if (parser_ctxt == NULL) {
@@ -500,7 +500,7 @@ NAN_METHOD(XmlDocument::Validate)
     bool valid = xmlSchemaValidateDoc(valid_ctxt, document->xml_obj) == 0;
 
     xmlSetStructuredErrorFunc(NULL, NULL);
-    info.Holder()->Set(Nan::New<v8::String>("validationErrors").ToLocalChecked(), errors);
+    Nan::Set(info.Holder(), Nan::New<v8::String>("validationErrors").ToLocalChecked(), errors);
 
     xmlSchemaFreeValidCtxt(valid_ctxt);
     xmlSchemaFree(schema);
@@ -519,7 +519,7 @@ NAN_METHOD(XmlDocument::RngValidate)
             XmlSyntaxError::PushToArray);
 
     XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info.Holder());
-    XmlDocument* documentSchema = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+    XmlDocument* documentSchema = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
 
     xmlRelaxNGParserCtxtPtr parser_ctxt = xmlRelaxNGNewDocParserCtxt(documentSchema->xml_obj);
     if (parser_ctxt == NULL) {
@@ -538,7 +538,7 @@ NAN_METHOD(XmlDocument::RngValidate)
     bool valid = xmlRelaxNGValidateDoc(valid_ctxt, document->xml_obj) == 0;
 
     xmlSetStructuredErrorFunc(NULL, NULL);
-    info.Holder()->Set(Nan::New<v8::String>("validationErrors").ToLocalChecked(), errors);
+    Nan::Set(info.Holder(), Nan::New<v8::String>("validationErrors").ToLocalChecked(), errors);
 
     xmlRelaxNGFreeValidCtxt(valid_ctxt);
     xmlRelaxNGFree(schema);
@@ -553,7 +553,7 @@ NAN_METHOD(XmlDocument::New)
 {
     Nan::HandleScope scope;
 
-    v8::String::Utf8Value version(info[0]->ToString());
+    Nan::Utf8String version(Nan::To<v8::String>(info[0]).ToLocalChecked());
     xmlDoc* doc = xmlNewDoc((const xmlChar*)(*version));
 
     XmlDocument* document = new XmlDocument(doc);
@@ -575,7 +575,7 @@ XmlDocument::~XmlDocument()
 }
 
 void
-XmlDocument::Initialize(v8::Handle<v8::Object> target)
+XmlDocument::Initialize(v8::Local<v8::Object> target)
 {
     Nan::HandleScope scope;
 
@@ -621,7 +621,7 @@ XmlDocument::Initialize(v8::Handle<v8::Object> target)
     Nan::SetMethod(target, "fromHtml", XmlDocument::FromHtml);
 
     // used to create new document handles
-    Nan::Set(target, Nan::New<v8::String>("Document").ToLocalChecked(), tmpl->GetFunction());
+    Nan::Set(target, Nan::New<v8::String>("Document").ToLocalChecked(), Nan::GetFunction(tmpl).ToLocalChecked());
 
     XmlNode::Initialize(target);
     XmlNamespace::Initialize(target);
diff --git a/src/xml_document.h b/src/xml_document.h
index 5958db2..0e2872e 100644
--- a/src/xml_document.h
+++ b/src/xml_document.h
@@ -20,7 +20,7 @@ public:
     virtual ~XmlDocument();
 
     // setup the document handle bindings and internal constructor
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
 
     // create a new document handle initialized with the
     // given xmlDoc object, intended for use in c++ space
diff --git a/src/xml_element.cc b/src/xml_element.cc
index 9e7ddeb..3d147ba 100644
--- a/src/xml_element.cc
+++ b/src/xml_element.cc
@@ -26,16 +26,16 @@ NAN_METHOD(XmlElement::New) {
       return info.GetReturnValue().Set(info.Holder());
   }
 
-  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(document);
 
-  v8::String::Utf8Value name(info[1]);
+  Nan::Utf8String name(info[1]);
 
   v8::Local<v8::Value> contentOpt;
   if(info[2]->IsString()) {
       contentOpt = info[2];
   }
-  v8::String::Utf8Value contentRaw(contentOpt);
+  Nan::Utf8String contentRaw(contentOpt);
   const char* content = (contentRaw.length()) ? *contentRaw : NULL;
 
   xmlChar* encodedContent = content ? xmlEncodeSpecialChars(document->xml_obj, (const xmlChar*)content) : NULL;
@@ -51,7 +51,7 @@ NAN_METHOD(XmlElement::New) {
   element->Wrap(info.Holder());
 
   // this prevents the document from going away
-  info.Holder()->Set(Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
+  Nan::Set(info.Holder(), Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
 
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -64,7 +64,7 @@ NAN_METHOD(XmlElement::Name) {
   if (info.Length() == 0)
       return info.GetReturnValue().Set(element->get_name());
 
-  v8::String::Utf8Value name(info[0]->ToString());
+  Nan::Utf8String name(Nan::To<v8::String>(info[0]).ToLocalChecked());
   element->set_name(*name);
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -77,13 +77,13 @@ NAN_METHOD(XmlElement::Attr) {
   // getter
   if (info.Length() == 1)
   {
-      v8::String::Utf8Value name(info[0]);
+      Nan::Utf8String name(info[0]);
       return info.GetReturnValue().Set(element->get_attr(*name));
   }
 
   // setter
-  v8::String::Utf8Value name(info[0]->ToString());
-  v8::String::Utf8Value value(info[1]->ToString());
+  Nan::Utf8String name(Nan::To<v8::String>(info[0]).ToLocalChecked());
+  Nan::Utf8String value(Nan::To<v8::String>(info[1]).ToLocalChecked());
   element->set_attr(*name, *value);
 
   return info.GetReturnValue().Set(info.Holder());
@@ -101,7 +101,7 @@ NAN_METHOD(XmlElement::AddChild) {
   XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(info.Holder());
   assert(element);
 
-  XmlNode* child = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* child = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(child);
 
   xmlNode *imported_child = element->import_node(child->xml_obj);
@@ -133,7 +133,7 @@ NAN_METHOD(XmlElement::AddCData) {
   if(info[0]->IsString()) {
       contentOpt = info[0];
   }
-  v8::String::Utf8Value contentRaw(contentOpt);
+  Nan::Utf8String contentRaw(contentOpt);
   const char* content = (contentRaw.length()) ? *contentRaw : NULL;
 
   xmlNode* elem = xmlNewCDataBlock(element->xml_obj->doc,
@@ -149,23 +149,23 @@ NAN_METHOD(XmlElement::Find) {
   XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(info.Holder());
   assert(element);
 
-  v8::String::Utf8Value xpath(info[0]);
+  Nan::Utf8String xpath(info[0]);
 
   XmlXpathContext ctxt(element->xml_obj);
 
   if (info.Length() == 2) {
     if (info[1]->IsString()) {
-      v8::String::Utf8Value uri(info[1]);
+      Nan::Utf8String uri(info[1]);
       ctxt.register_ns((const xmlChar*)"xmlns", (const xmlChar*)*uri);
 
     } else if (info[1]->IsObject()) {
-      v8::Local<v8::Object> namespaces = info[1]->ToObject();
-      v8::Local<v8::Array> properties = namespaces->GetPropertyNames();
+      v8::Local<v8::Object> namespaces = Nan::To<v8::Object>(info[1]).ToLocalChecked();
+      v8::Local<v8::Array> properties = Nan::GetPropertyNames(namespaces).ToLocalChecked();
       for (unsigned int i = 0; i < properties->Length(); i++) {
-        v8::Local<v8::String> prop_name = properties->Get(
-          Nan::New<v8::Number>(i))->ToString();
-        v8::String::Utf8Value prefix(prop_name);
-        v8::String::Utf8Value uri(namespaces->Get(prop_name));
+          v8::Local<v8::String> prop_name = Nan::To<v8::String>(Nan::Get(properties,
+          Nan::New<v8::Number>(i)).ToLocalChecked()).ToLocalChecked();
+        Nan::Utf8String prefix(prop_name);
+        Nan::Utf8String uri(Nan::Get(namespaces, prop_name).ToLocalChecked());
         ctxt.register_ns((const xmlChar*)*prefix, (const xmlChar*)*uri);
       }
     }
@@ -198,7 +198,7 @@ NAN_METHOD(XmlElement::Text) {
   if (info.Length() == 0) {
     return info.GetReturnValue().Set(element->get_content());
   } else {
-    element->set_content(*v8::String::Utf8Value(info[0]));
+    element->set_content(*Nan::Utf8String(info[0]));
   }
 
   return info.GetReturnValue().Set(info.Holder());
@@ -214,7 +214,7 @@ NAN_METHOD(XmlElement::Child) {
       return Nan::ThrowError("Bad argument: must provide #child() with a number");
   }
 
-  const int32_t idx = info[0]->Int32Value();
+  const int32_t idx = Nan::To<v8::Int32>(info[0]).ToLocalChecked()->Value();
   return info.GetReturnValue().Set(element->get_child(idx));
 }
 
@@ -224,7 +224,7 @@ NAN_METHOD(XmlElement::ChildNodes) {
   assert(element);
 
   if (info[0]->IsInt32())
-      return info.GetReturnValue().Set(element->get_child(info[0]->Int32Value()));
+      return info.GetReturnValue().Set(element->get_child(Nan::To<v8::Int32>(info[0]).ToLocalChecked()->Value()));
 
   return info.GetReturnValue().Set(element->get_child_nodes());
 }
@@ -241,7 +241,7 @@ NAN_METHOD(XmlElement::AddPrevSibling) {
   XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(info.Holder());
   assert(element);
 
-  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(new_sibling);
 
   xmlNode *imported_sibling = element->import_node(new_sibling->xml_obj);
@@ -266,7 +266,7 @@ NAN_METHOD(XmlElement::AddNextSibling) {
   XmlElement* element = Nan::ObjectWrap::Unwrap<XmlElement>(info.Holder());
   assert(element);
 
-  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(new_sibling);
 
   xmlNode *imported_sibling = element->import_node(new_sibling->xml_obj);
@@ -292,9 +292,9 @@ NAN_METHOD(XmlElement::Replace) {
   assert(element);
 
   if (info[0]->IsString()) {
-    element->replace_text(*v8::String::Utf8Value(info[0]));
+    element->replace_text(*Nan::Utf8String(info[0]));
   } else {
-    XmlElement* new_sibling = Nan::ObjectWrap::Unwrap<XmlElement>(info[0]->ToObject());
+    XmlElement* new_sibling = Nan::ObjectWrap::Unwrap<XmlElement>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
     assert(new_sibling);
 
     xmlNode *imported_sibling = element->import_node(new_sibling->xml_obj);
@@ -352,11 +352,11 @@ XmlElement::get_attrs() {
 
   v8::Local<v8::Array> attributes = Nan::New<v8::Array>();
   v8::Local<v8::Function> push = v8::Local<v8::Function>::Cast(
-    attributes->Get(Nan::New<v8::String>("push").ToLocalChecked()));
+    Nan::Get(attributes, Nan::New<v8::String>("push").ToLocalChecked()).ToLocalChecked());
   v8::Local<v8::Value> argv[1];
   do {
       argv[0] = XmlAttribute::New(attr);
-      push->Call(attributes, 1, argv);
+      Nan::Call(push, attributes, 1, argv);
   } while ((attr = attr->next));
 
   return scope.Escape(attributes);
@@ -500,7 +500,7 @@ XmlElement::New(xmlNode* node)
     }
 
     XmlElement* element = new XmlElement(node);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     element->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -553,7 +553,7 @@ XmlElement::prev_sibling_will_merge(xmlNode *child) {
 }
 
 void
-XmlElement::Initialize(v8::Handle<v8::Object> target)
+XmlElement::Initialize(v8::Local<v8::Object> target)
 {
     Nan::HandleScope scope;
     v8::Local<v8::FunctionTemplate> tmpl =
@@ -623,7 +623,7 @@ XmlElement::Initialize(v8::Handle<v8::Object> target)
             XmlElement::Replace);
 
     Nan::Set(target, Nan::New<v8::String>("Element").ToLocalChecked(),
-            tmpl->GetFunction());
+            Nan::GetFunction(tmpl).ToLocalChecked());
 
 }
 
diff --git a/src/xml_element.h b/src/xml_element.h
index 808b0a2..43e82e3 100644
--- a/src/xml_element.h
+++ b/src/xml_element.h
@@ -12,7 +12,7 @@ public:
 
     explicit XmlElement(xmlNode* node);
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
 
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
diff --git a/src/xml_namespace.cc b/src/xml_namespace.cc
index 89e9bc6..fc45557 100644
--- a/src/xml_namespace.cc
+++ b/src/xml_namespace.cc
@@ -23,17 +23,17 @@ NAN_METHOD(XmlNamespace::New) {
   if (!info[0]->IsObject())
     return Nan::ThrowError("You must provide a node to attach this namespace to");
 
-  XmlNode* node = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* node = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
 
-  v8::String::Utf8Value* prefix = 0;
-  v8::String::Utf8Value* href = 0;
+  Nan::Utf8String* prefix = 0;
+  Nan::Utf8String* href = 0;
 
   if (info[1]->IsString())
   {
-      prefix = new v8::String::Utf8Value(info[1]);
+      prefix = new Nan::Utf8String(info[1]);
   }
 
-  href = new v8::String::Utf8Value(info[2]);
+  href = new Nan::Utf8String(info[2]);
 
   xmlNs* ns = xmlNewNs(node->xml_obj,
           (const xmlChar*)(href->operator*()),
@@ -57,7 +57,7 @@ XmlNamespace::New(xmlNs* node)
     }
 
     XmlNamespace* ns = new XmlNamespace(node);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     ns->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -146,7 +146,7 @@ XmlNamespace::get_prefix() {
 }
 
 void
-XmlNamespace::Initialize(v8::Handle<v8::Object> target) {
+XmlNamespace::Initialize(v8::Local<v8::Object> target) {
   Nan::HandleScope scope;
   v8::Local<v8::FunctionTemplate> tmpl =
     Nan::New<v8::FunctionTemplate>(New);
@@ -162,6 +162,6 @@ XmlNamespace::Initialize(v8::Handle<v8::Object> target) {
                         XmlNamespace::Prefix);
 
   Nan::Set(target, Nan::New<v8::String>("Namespace").ToLocalChecked(),
-              tmpl->GetFunction());
+              Nan::GetFunction(tmpl).ToLocalChecked());
 }
 }  // namespace libxmljs
diff --git a/src/xml_namespace.h b/src/xml_namespace.h
index 59b0a29..2b31ebe 100644
--- a/src/xml_namespace.h
+++ b/src/xml_namespace.h
@@ -16,7 +16,7 @@ public:
 
     xmlDoc* context; // reference-managed context
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
     explicit XmlNamespace(xmlNs* ns);
diff --git a/src/xml_node.cc b/src/xml_node.cc
index 52321e2..e84846c 100644
--- a/src/xml_node.cc
+++ b/src/xml_node.cc
@@ -43,12 +43,12 @@ NAN_METHOD(XmlNode::Namespace) {
   // #namespace(ns) libxml.Namespace object was provided
   // TODO(sprsquish): check that it was actually given a namespace obj
   if (info[0]->IsObject())
-    ns = Nan::ObjectWrap::Unwrap<XmlNamespace>(info[0]->ToObject());
+    ns = Nan::ObjectWrap::Unwrap<XmlNamespace>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
 
   // #namespace(href) or #namespace(prefix, href)
   // if the namespace has already been defined on the node, just set it
   if (info[0]->IsString()) {
-    v8::String::Utf8Value ns_to_find(info[0]->ToString());
+    Nan::Utf8String ns_to_find(Nan::To<v8::String>(info[0]).ToLocalChecked());
     xmlNs* found_ns = node->find_namespace(*ns_to_find);
     if (found_ns) {
         // maybe build
@@ -72,13 +72,13 @@ NAN_METHOD(XmlNode::Namespace) {
       }
 
       v8::Local<v8::Function> define_namespace =
-          Nan::New(XmlNamespace::constructor_template)->GetFunction();
+          Nan::GetFunction(Nan::New(XmlNamespace::constructor_template)).ToLocalChecked();
 
       // will create a new namespace attached to this node
       // since we keep the document around, the namespace, like the node, won't be
       // garbage collected
       v8::Local<v8::Value> new_ns = Nan::NewInstance(define_namespace, argc, argv).ToLocalChecked();
-      ns = Nan::ObjectWrap::Unwrap<XmlNamespace>(new_ns->ToObject());
+      ns = Nan::ObjectWrap::Unwrap<XmlNamespace>(Nan::To<v8::Object>(new_ns).ToLocalChecked());
   }
 
   node->set_namespace(ns->xml_obj);
@@ -147,38 +147,38 @@ NAN_METHOD(XmlNode::ToString) {
 
   if (info.Length() > 0) {
       if (info[0]->IsBoolean()) {
-          if (info[0]->ToBoolean()->BooleanValue() == true) {
+          if (Nan::To<v8::Boolean>(info[0]).ToLocalChecked()->Value() == true) {
               options |= XML_SAVE_FORMAT;
           }
       } else if (info[0]->IsObject()) {
-          v8::Local<v8::Object> obj = info[0]->ToObject();
+          v8::Local<v8::Object> obj = Nan::To<v8::Object>(info[0]).ToLocalChecked();
 
           // drop the xml declaration
-          if (obj->Get(Nan::New<v8::String>("declaration").ToLocalChecked())->IsFalse()) {
+          if (Nan::Get(obj, Nan::New<v8::String>("declaration").ToLocalChecked()).ToLocalChecked()->IsFalse()) {
               options |= XML_SAVE_NO_DECL;
           }
 
           // format save output
-          if (obj->Get(Nan::New<v8::String>("format").ToLocalChecked())->IsTrue()) {
+          if (Nan::Get(obj, Nan::New<v8::String>("format").ToLocalChecked()).ToLocalChecked()->IsTrue()) {
               options |= XML_SAVE_FORMAT;
           }
 
           // no empty tags (only works with XML) ex: <title></title> becomes <title/>
-          if (obj->Get(Nan::New<v8::String>("selfCloseEmpty").ToLocalChecked())->IsFalse()) {
+          if (Nan::Get(obj, Nan::New<v8::String>("selfCloseEmpty").ToLocalChecked()).ToLocalChecked()->IsFalse()) {
               options |= XML_SAVE_NO_EMPTY;
           }
 
           // format with non-significant whitespace
-          if (obj->Get(Nan::New<v8::String>("whitespace").ToLocalChecked())->IsTrue()) {
+          if (Nan::Get(obj, Nan::New<v8::String>("whitespace").ToLocalChecked()).ToLocalChecked()->IsTrue()) {
               options |= XML_SAVE_WSNONSIG;
           }
 
-          v8::Local<v8::Value> type = obj->Get(Nan::New<v8::String>("type").ToLocalChecked());
-          if (type->Equals(Nan::New<v8::String>("XML").ToLocalChecked()) ||
-              type->Equals(Nan::New<v8::String>("xml").ToLocalChecked())) {
+          v8::Local<v8::Value> type = Nan::Get(obj, Nan::New<v8::String>("type").ToLocalChecked()).ToLocalChecked();
+          if (Nan::Equals(type, Nan::New<v8::String>("XML").ToLocalChecked()).ToChecked() ||
+              Nan::Equals(type, Nan::New<v8::String>("xml").ToLocalChecked()).ToChecked()) {
               options |= XML_SAVE_AS_XML;    // force XML serialization on HTML doc
-          } else if (type->Equals(Nan::New<v8::String>("HTML").ToLocalChecked()) ||
-                     type->Equals(Nan::New<v8::String>("html").ToLocalChecked())) {
+          } else if (Nan::Equals(type, Nan::New<v8::String>("HTML").ToLocalChecked()).ToChecked() ||
+                     Nan::Equals(type, Nan::New<v8::String>("html").ToLocalChecked()).ToChecked()) {
               options |= XML_SAVE_AS_HTML;   // force HTML serialization on XML doc
               // if the document is XML and we want formatted HTML output
               // we must use the XHTML serializer because the default HTML
@@ -186,8 +186,8 @@ NAN_METHOD(XmlNode::ToString) {
               if ((options & XML_SAVE_FORMAT) && (options & XML_SAVE_XHTML) == false) {
                   options |= XML_SAVE_XHTML;
               }
-          } else if (type->Equals(Nan::New<v8::String>("XHTML").ToLocalChecked()) ||
-                     type->Equals(Nan::New<v8::String>("xhtml").ToLocalChecked())) {
+          } else if (Nan::Equals(type, Nan::New<v8::String>("XHTML").ToLocalChecked()).ToChecked() ||
+                     Nan::Equals(type, Nan::New<v8::String>("xhtml").ToLocalChecked()).ToChecked()) {
               options |= XML_SAVE_XHTML;    // force XHTML serialization
           }
       }
@@ -213,7 +213,7 @@ NAN_METHOD(XmlNode::Clone) {
   bool recurse = true;
 
   if (info.Length() == 1 && info[0]->IsBoolean())
-      recurse = info[0]->ToBoolean()->BooleanValue();
+      recurse = Nan::To<v8::Boolean>(info[0]).ToLocalChecked()->Value();
 
   return info.GetReturnValue().Set(node->clone(recurse));
 }
@@ -729,7 +729,7 @@ XmlNode::get_type() {
 }
 
 void
-XmlNode::Initialize(v8::Handle<v8::Object> target) {
+XmlNode::Initialize(v8::Local<v8::Object> target) {
   Nan::HandleScope scope;
   v8::Local<v8::FunctionTemplate> tmpl = Nan::New<v8::FunctionTemplate>();
   constructor_template.Reset( tmpl);
diff --git a/src/xml_node.h b/src/xml_node.h
index e5c873d..e447ffa 100644
--- a/src/xml_node.h
+++ b/src/xml_node.h
@@ -29,7 +29,7 @@ public:
     explicit XmlNode(xmlNode* node);
     virtual ~XmlNode();
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
     // create new XmlElement, XmlAttribute, etc. to wrap a libxml xmlNode
diff --git a/src/xml_pi.cc b/src/xml_pi.cc
index 1f8f200..788f176 100644
--- a/src/xml_pi.cc
+++ b/src/xml_pi.cc
@@ -23,16 +23,16 @@ NAN_METHOD(XmlProcessingInstruction::New) {
       return info.GetReturnValue().Set(info.Holder());
   }
 
-  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(document);
 
-  v8::String::Utf8Value name(info[1]);
+  Nan::Utf8String name(info[1]);
 
   v8::Local<v8::Value> contentOpt;
   if (info[2]->IsString()) {
       contentOpt = info[2];
   }
-  v8::String::Utf8Value contentRaw(contentOpt);
+  Nan::Utf8String contentRaw(contentOpt);
   const char* content = (contentRaw.length()) ? *contentRaw : NULL;
 
   xmlNode* pi = xmlNewDocPI(document->xml_obj, (const xmlChar *) *name, (xmlChar *) content);
@@ -42,7 +42,7 @@ NAN_METHOD(XmlProcessingInstruction::New) {
   processing_instruction->Wrap(info.Holder());
 
   // this prevents the document from going away
-  info.Holder()->Set(Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
+  Nan::Set(info.Holder(), Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
 
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -55,7 +55,7 @@ NAN_METHOD(XmlProcessingInstruction::Name) {
   if (info.Length() == 0)
       return info.GetReturnValue().Set(processing_instruction->get_name());
 
-  v8::String::Utf8Value name(info[0]->ToString());
+  Nan::Utf8String name(Nan::To<v8::String>(info[0]).ToLocalChecked());
   processing_instruction->set_name(*name);
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -68,7 +68,7 @@ NAN_METHOD(XmlProcessingInstruction::Text) {
   if (info.Length() == 0) {
     return info.GetReturnValue().Set(processing_instruction->get_content());
   } else {
-    processing_instruction->set_content(*v8::String::Utf8Value(info[0]));
+    processing_instruction->set_content(*Nan::Utf8String(info[0]));
   }
 
   return info.GetReturnValue().Set(info.Holder());
@@ -114,7 +114,7 @@ XmlProcessingInstruction::New(xmlNode* node)
     }
 
     XmlProcessingInstruction* processing_instruction = new XmlProcessingInstruction(node);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     processing_instruction->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -125,7 +125,7 @@ XmlProcessingInstruction::XmlProcessingInstruction(xmlNode* node)
 }
 
 void
-XmlProcessingInstruction::Initialize(v8::Handle<v8::Object> target)
+XmlProcessingInstruction::Initialize(v8::Local<v8::Object> target)
 {
     Nan::HandleScope scope;
     v8::Local<v8::FunctionTemplate> t = Nan::New<v8::FunctionTemplate>(static_cast<NAN_METHOD((*))>(New));
@@ -142,7 +142,7 @@ XmlProcessingInstruction::Initialize(v8::Handle<v8::Object> target)
             XmlProcessingInstruction::Text);
 
     Nan::Set(target, Nan::New<v8::String>("ProcessingInstruction").ToLocalChecked(),
-            t->GetFunction());
+            Nan::GetFunction(t).ToLocalChecked());
 }
 
 }  // namespace libxmljs
diff --git a/src/xml_pi.h b/src/xml_pi.h
index 91deb9a..754e84b 100644
--- a/src/xml_pi.h
+++ b/src/xml_pi.h
@@ -11,7 +11,7 @@ public:
 
     explicit XmlProcessingInstruction(xmlNode* node);
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
 
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
diff --git a/src/xml_sax_parser.cc b/src/xml_sax_parser.cc
index be8402f..ac76829 100644
--- a/src/xml_sax_parser.cc
+++ b/src/xml_sax_parser.cc
@@ -123,7 +123,7 @@ XmlSaxParser::Callback(const char* what,
     }
 
     // get the 'emit' function from ourselves
-    v8::Local<v8::Value> emit_v = this->handle()->Get(Nan::New(emit_symbol));
+    v8::Local<v8::Value> emit_v = Nan::Get(this->handle(), Nan::New(emit_symbol)).ToLocalChecked();
     assert(emit_v->IsFunction());
 
     // trigger the event
@@ -140,9 +140,9 @@ NAN_METHOD(XmlSaxParser::Push) {
 
   XmlSaxParser *parser = Nan::ObjectWrap::Unwrap<XmlSaxParser>(info.Holder());
 
-  v8::String::Utf8Value parsable(info[0]->ToString());
+  Nan::Utf8String parsable(Nan::To<v8::String>(info[0]).ToLocalChecked());
 
-  bool terminate = info.Length() > 1 ? info[1]->ToBoolean()->Value() : false;
+  bool terminate = info.Length() > 1 ? Nan::To<v8::Boolean>(info[1]).ToLocalChecked()->Value() : false;
 
   parser->push(*parsable, parsable.length(), terminate);
 
@@ -171,7 +171,7 @@ NAN_METHOD(XmlSaxParser::ParseString) {
 
   XmlSaxParser *parser = Nan::ObjectWrap::Unwrap<XmlSaxParser>(info.Holder());
 
-  v8::String::Utf8Value parsable(info[0]->ToString());
+  Nan::Utf8String parsable(Nan::To<v8::String>(info[0]).ToLocalChecked());
   parser->parse_string(*parsable, parsable.length());
 
   // TODO(sprsquish): return based on the parser
@@ -425,7 +425,7 @@ XmlSaxParser::error(void* context, const char* msg, ...)
 }
 
 void
-XmlSaxParser::Initialize(v8::Handle<v8::Object> target) {
+XmlSaxParser::Initialize(v8::Local<v8::Object> target) {
   Nan::HandleScope scope;
 
   emit_symbol.Reset(Nan::New<v8::String>(EMIT_SYMBOL_STRING).ToLocalChecked());
@@ -445,7 +445,7 @@ XmlSaxParser::Initialize(v8::Handle<v8::Object> target) {
                         XmlSaxParser::ParseString);
 
   Nan::Set(target, Nan::New<v8::String>("SaxParser").ToLocalChecked(),
-              parser_t->GetFunction());
+              Nan::GetFunction(parser_t).ToLocalChecked());
 
   v8::Local<v8::FunctionTemplate> push_parser_t =
     Nan::New<v8::FunctionTemplate>(NewPushParser);
@@ -461,6 +461,6 @@ XmlSaxParser::Initialize(v8::Handle<v8::Object> target) {
                         XmlSaxParser::Push);
 
   Nan::Set(target, Nan::New<v8::String>("SaxPushParser").ToLocalChecked(),
-              push_parser_t->GetFunction());
+              Nan::GetFunction(push_parser_t).ToLocalChecked());
 }
 }  // namespace libxmljs
diff --git a/src/xml_sax_parser.h b/src/xml_sax_parser.h
index 6e1d457..88111c2 100644
--- a/src/xml_sax_parser.h
+++ b/src/xml_sax_parser.h
@@ -13,7 +13,7 @@ class XmlSaxParser : public Nan::ObjectWrap {
   virtual ~XmlSaxParser();
 
   static void
-  Initialize(v8::Handle<v8::Object> target);
+  Initialize(v8::Local<v8::Object> target);
 
   static NAN_METHOD(NewParser);
 
diff --git a/src/xml_syntax_error.cc b/src/xml_syntax_error.cc
index d1f1b8c..8fb82ac 100644
--- a/src/xml_syntax_error.cc
+++ b/src/xml_syntax_error.cc
@@ -56,10 +56,10 @@ XmlSyntaxError::PushToArray(void* errs, xmlError* error) {
     Nan::HandleScope scope;
     v8::Local<v8::Array> errors = *reinterpret_cast<v8::Local<v8::Array>*>(errs);
     // push method for array
-    v8::Local<v8::Function> push = v8::Local<v8::Function>::Cast(errors->Get(Nan::New<v8::String>("push").ToLocalChecked()));
+    v8::Local<v8::Function> push = v8::Local<v8::Function>::Cast(Nan::Get(errors, Nan::New<v8::String>("push").ToLocalChecked()).ToLocalChecked());
 
     v8::Local<v8::Value> argv[1] = { XmlSyntaxError::BuildSyntaxError(error) };
-    push->Call(errors, 1, argv);
+    Nan::Call(push, errors, 1, argv);
 }
 
 }  // namespace libxmljs
diff --git a/src/xml_text.cc b/src/xml_text.cc
index 9dc0662..84c7672 100644
--- a/src/xml_text.cc
+++ b/src/xml_text.cc
@@ -25,14 +25,14 @@ NAN_METHOD(XmlText::New) {
       return info.GetReturnValue().Set(info.Holder());
   }
 
-  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(info[0]->ToObject());
+  XmlDocument* document = Nan::ObjectWrap::Unwrap<XmlDocument>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(document);
 
   v8::Local<v8::Value> contentOpt;
   if (info[1]->IsString()) {
       contentOpt = info[1];
   }
-  v8::String::Utf8Value contentRaw(contentOpt);
+  Nan::Utf8String contentRaw(contentOpt);
   const char* content = (contentRaw.length()) ? *contentRaw : NULL;
 
   xmlChar* encodedContent = content ? xmlEncodeSpecialChars(document->xml_obj, (const xmlChar*) content) : NULL;
@@ -47,7 +47,7 @@ NAN_METHOD(XmlText::New) {
   element->Wrap(info.Holder());
 
   // this prevents the document from going away
-  info.Holder()->Set(Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
+  Nan::Set(info.Holder(), Nan::New<v8::String>("document").ToLocalChecked(), info[0]);
 
   return info.GetReturnValue().Set(info.Holder());
 }
@@ -76,7 +76,7 @@ NAN_METHOD(XmlText::Text) {
   if (info.Length() == 0) {
     return info.GetReturnValue().Set(element->get_content());
   } else {
-    element->set_content(*v8::String::Utf8Value(info[0]));
+    element->set_content(*Nan::Utf8String(info[0]));
   }
 
   return info.GetReturnValue().Set(info.Holder());
@@ -86,7 +86,7 @@ NAN_METHOD(XmlText::AddPrevSibling) {
   XmlText* text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
   assert(text);
 
-  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(new_sibling);
 
   xmlNode *imported_sibling = text->import_node(new_sibling->xml_obj);
@@ -105,7 +105,7 @@ NAN_METHOD(XmlText::AddNextSibling) {
   XmlText* text = Nan::ObjectWrap::Unwrap<XmlText>(info.Holder());
   assert(text);
 
-  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(info[0]->ToObject());
+  XmlNode* new_sibling = Nan::ObjectWrap::Unwrap<XmlNode>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
   assert(new_sibling);
 
   xmlNode *imported_sibling = text->import_node(new_sibling->xml_obj);
@@ -125,9 +125,9 @@ NAN_METHOD(XmlText::Replace) {
   assert(element);
 
   if (info[0]->IsString()) {
-    element->replace_text(*v8::String::Utf8Value(info[0]));
+    element->replace_text(*Nan::Utf8String(info[0]));
   } else {
-    XmlText* new_sibling = Nan::ObjectWrap::Unwrap<XmlText>(info[0]->ToObject());
+    XmlText* new_sibling = Nan::ObjectWrap::Unwrap<XmlText>(Nan::To<v8::Object>(info[0]).ToLocalChecked());
     assert(new_sibling);
 
     xmlNode *imported_sibling = element->import_node(new_sibling->xml_obj);
@@ -207,7 +207,7 @@ XmlText::New(xmlNode* node)
     }
 
     XmlText* element = new XmlText(node);
-    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::New(constructor_template)->GetFunction()).ToLocalChecked();
+    v8::Local<v8::Object> obj = Nan::NewInstance(Nan::GetFunction(Nan::New(constructor_template)).ToLocalChecked()).ToLocalChecked();
     element->Wrap(obj);
     return scope.Escape(obj);
 }
@@ -249,7 +249,7 @@ XmlText::prev_sibling_will_merge(xmlNode *child) {
 }
 
 void
-XmlText::Initialize(v8::Handle<v8::Object> target)
+XmlText::Initialize(v8::Local<v8::Object> target)
 {
     Nan::HandleScope scope;
     v8::Local<v8::FunctionTemplate> tmpl =
@@ -277,7 +277,7 @@ XmlText::Initialize(v8::Handle<v8::Object> target)
             XmlText::Replace);
 
     Nan::Set(target, Nan::New<v8::String>("Text").ToLocalChecked(),
-            tmpl->GetFunction());
+            Nan::GetFunction(tmpl).ToLocalChecked());
 
 }
 
diff --git a/src/xml_text.h b/src/xml_text.h
index d03b008..cc258f2 100644
--- a/src/xml_text.h
+++ b/src/xml_text.h
@@ -11,7 +11,7 @@ public:
 
     explicit XmlText(xmlNode* node);
 
-    static void Initialize(v8::Handle<v8::Object> target);
+    static void Initialize(v8::Local<v8::Object> target);
 
     static Nan::Persistent<v8::FunctionTemplate> constructor_template;
 
diff --git a/test/memory_management.js b/test/memory_management.js
index 2378d10..8b7d1f9 100644
--- a/test/memory_management.js
+++ b/test/memory_management.js
@@ -6,7 +6,7 @@ if (!global.gc) {
 }
 
 var nodeVersion = process.versions.node
-var shouldSkip = semver.satisfies(nodeVersion, '8.x || 9.x || 10.x')
+var shouldSkip = semver.satisfies(nodeVersion, '8.x || 9.x || 10.x || 11.x || 12.x')
 
 module.exports.setUp = function(done) {
     collectGarbage();