node-addon-api 6.0.0 → 7.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -70,7 +70,7 @@ and node-addon-api.
70
70
  - **[Contributors](#contributors)**
71
71
  - **[License](#license)**
72
72
 
73
- ## **Current version: 6.0.0**
73
+ ## **Current version: 7.0.0**
74
74
 
75
75
  (See [CHANGELOG.md](CHANGELOG.md) for complete Changelog)
76
76
 
@@ -83,7 +83,7 @@ This allows addons built with it to run with Node.js versions which support the
83
83
  **However** the node-addon-api support model is to support only the active LTS Node.js versions. This means that
84
84
  every year there will be a new major which drops support for the Node.js LTS version which has gone out of service.
85
85
 
86
- The oldest Node.js version supported by the current version of node-addon-api is Node.js 14.x.
86
+ The oldest Node.js version supported by the current version of node-addon-api is Node.js 16.x.
87
87
 
88
88
  ## Setup
89
89
  - [Installation and usage](doc/setup.md)
@@ -275,6 +275,7 @@ available:
275
275
  ![Node-API v6 Badge](https://github.com/nodejs/abi-stable-node/blob/doc/assets/Node-API%20v6%20Badge.svg)
276
276
  ![Node-API v7 Badge](https://github.com/nodejs/abi-stable-node/blob/doc/assets/Node-API%20v7%20Badge.svg)
277
277
  ![Node-API v8 Badge](https://github.com/nodejs/abi-stable-node/blob/doc/assets/Node-API%20v8%20Badge.svg)
278
+ ![Node-API v9 Badge](https://github.com/nodejs/abi-stable-node/blob/doc/assets/Node-API%20v9%20Badge.svg)
278
279
  ![Node-API Experimental Version Badge](https://github.com/nodejs/abi-stable-node/blob/doc/assets/Node-API%20Experimental%20Version%20Badge.svg)
279
280
 
280
281
  ## **Contributing**
package/napi-inl.h CHANGED
@@ -12,7 +12,9 @@
12
12
 
13
13
  #include <algorithm>
14
14
  #include <cstring>
15
+ #if NAPI_HAS_THREADS
15
16
  #include <mutex>
17
+ #endif // NAPI_HAS_THREADS
16
18
  #include <type_traits>
17
19
  #include <utility>
18
20
 
@@ -22,9 +24,13 @@ namespace Napi {
22
24
  namespace NAPI_CPP_CUSTOM_NAMESPACE {
23
25
  #endif
24
26
 
25
- // Helpers to handle functions exposed from C++.
27
+ // Helpers to handle functions exposed from C++ and internal constants.
26
28
  namespace details {
27
29
 
30
+ // New napi_status constants not yet available in all supported versions of
31
+ // Node.js releases. Only necessary when they are used in napi.h and napi-inl.h.
32
+ constexpr int napi_no_external_buffers_allowed = 22;
33
+
28
34
  // Attach a data item to an object and delete it when the object gets
29
35
  // garbage-collected.
30
36
  // TODO: Replace this code with `napi_add_finalizer()` whenever it becomes
@@ -159,7 +165,7 @@ napi_value TemplatedInstanceCallback(napi_env env,
159
165
  return details::WrapCallback([&] {
160
166
  CallbackInfo cbInfo(env, info);
161
167
  T* instance = T::Unwrap(cbInfo.This().As<Object>());
162
- return (instance->*UnwrapCallback)(cbInfo);
168
+ return instance ? (instance->*UnwrapCallback)(cbInfo) : Napi::Value();
163
169
  });
164
170
  }
165
171
 
@@ -169,7 +175,7 @@ napi_value TemplatedInstanceVoidCallback(napi_env env, napi_callback_info info)
169
175
  return details::WrapCallback([&] {
170
176
  CallbackInfo cbInfo(env, info);
171
177
  T* instance = T::Unwrap(cbInfo.This().As<Object>());
172
- (instance->*UnwrapCallback)(cbInfo);
178
+ if (instance) (instance->*UnwrapCallback)(cbInfo);
173
179
  return nullptr;
174
180
  });
175
181
  }
@@ -201,7 +207,7 @@ struct FinalizeData {
201
207
  Hint* hint;
202
208
  };
203
209
 
204
- #if (NAPI_VERSION > 3 && !defined(__wasm32__))
210
+ #if (NAPI_VERSION > 3 && NAPI_HAS_THREADS)
205
211
  template <typename ContextType = void,
206
212
  typename Finalizer = std::function<void(Env, void*, ContextType*)>,
207
213
  typename FinalizerDataType = void>
@@ -295,7 +301,7 @@ napi_value DefaultCallbackWrapper(napi_env env, Napi::Function cb) {
295
301
  return cb;
296
302
  }
297
303
  #endif // NAPI_VERSION > 4
298
- #endif // NAPI_VERSION > 3 && !defined(__wasm32__)
304
+ #endif // NAPI_VERSION > 3 && NAPI_HAS_THREADS
299
305
 
300
306
  template <typename Getter, typename Setter>
301
307
  struct AccessorCallbackData {
@@ -736,6 +742,9 @@ inline bool Value::IsExternal() const {
736
742
 
737
743
  template <typename T>
738
744
  inline T Value::As() const {
745
+ #ifdef NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS
746
+ T::CheckCast(_env, _value);
747
+ #endif
739
748
  return T(_env, _value);
740
749
  }
741
750
 
@@ -778,6 +787,16 @@ inline Boolean Boolean::New(napi_env env, bool val) {
778
787
  return Boolean(env, value);
779
788
  }
780
789
 
790
+ inline void Boolean::CheckCast(napi_env env, napi_value value) {
791
+ NAPI_CHECK(value != nullptr, "Boolean::CheckCast", "empty value");
792
+
793
+ napi_valuetype type;
794
+ napi_status status = napi_typeof(env, value, &type);
795
+ NAPI_CHECK(status == napi_ok, "Boolean::CheckCast", "napi_typeof failed");
796
+ NAPI_CHECK(
797
+ type == napi_boolean, "Boolean::CheckCast", "value is not napi_boolean");
798
+ }
799
+
781
800
  inline Boolean::Boolean() : Napi::Value() {}
782
801
 
783
802
  inline Boolean::Boolean(napi_env env, napi_value value)
@@ -805,6 +824,16 @@ inline Number Number::New(napi_env env, double val) {
805
824
  return Number(env, value);
806
825
  }
807
826
 
827
+ inline void Number::CheckCast(napi_env env, napi_value value) {
828
+ NAPI_CHECK(value != nullptr, "Number::CheckCast", "empty value");
829
+
830
+ napi_valuetype type;
831
+ napi_status status = napi_typeof(env, value, &type);
832
+ NAPI_CHECK(status == napi_ok, "Number::CheckCast", "napi_typeof failed");
833
+ NAPI_CHECK(
834
+ type == napi_number, "Number::CheckCast", "value is not napi_number");
835
+ }
836
+
808
837
  inline Number::Number() : Value() {}
809
838
 
810
839
  inline Number::Number(napi_env env, napi_value value) : Value(env, value) {}
@@ -891,6 +920,16 @@ inline BigInt BigInt::New(napi_env env,
891
920
  return BigInt(env, value);
892
921
  }
893
922
 
923
+ inline void BigInt::CheckCast(napi_env env, napi_value value) {
924
+ NAPI_CHECK(value != nullptr, "BigInt::CheckCast", "empty value");
925
+
926
+ napi_valuetype type;
927
+ napi_status status = napi_typeof(env, value, &type);
928
+ NAPI_CHECK(status == napi_ok, "BigInt::CheckCast", "napi_typeof failed");
929
+ NAPI_CHECK(
930
+ type == napi_bigint, "BigInt::CheckCast", "value is not napi_bigint");
931
+ }
932
+
894
933
  inline BigInt::BigInt() : Value() {}
895
934
 
896
935
  inline BigInt::BigInt(napi_env env, napi_value value) : Value(env, value) {}
@@ -940,6 +979,15 @@ inline Date Date::New(napi_env env, double val) {
940
979
  return Date(env, value);
941
980
  }
942
981
 
982
+ inline void Date::CheckCast(napi_env env, napi_value value) {
983
+ NAPI_CHECK(value != nullptr, "Date::CheckCast", "empty value");
984
+
985
+ bool result;
986
+ napi_status status = napi_is_date(env, value, &result);
987
+ NAPI_CHECK(status == napi_ok, "Date::CheckCast", "napi_is_date failed");
988
+ NAPI_CHECK(result, "Date::CheckCast", "value is not date");
989
+ }
990
+
943
991
  inline Date::Date() : Value() {}
944
992
 
945
993
  inline Date::Date(napi_env env, napi_value value) : Value(env, value) {}
@@ -959,6 +1007,16 @@ inline double Date::ValueOf() const {
959
1007
  ////////////////////////////////////////////////////////////////////////////////
960
1008
  // Name class
961
1009
  ////////////////////////////////////////////////////////////////////////////////
1010
+ inline void Name::CheckCast(napi_env env, napi_value value) {
1011
+ NAPI_CHECK(value != nullptr, "Name::CheckCast", "empty value");
1012
+
1013
+ napi_valuetype type;
1014
+ napi_status status = napi_typeof(env, value, &type);
1015
+ NAPI_CHECK(status == napi_ok, "Name::CheckCast", "napi_typeof failed");
1016
+ NAPI_CHECK(type == napi_string || type == napi_symbol,
1017
+ "Name::CheckCast",
1018
+ "value is not napi_string or napi_symbol");
1019
+ }
962
1020
 
963
1021
  inline Name::Name() : Value() {}
964
1022
 
@@ -1018,6 +1076,16 @@ inline String String::New(napi_env env, const char16_t* val, size_t length) {
1018
1076
  return String(env, value);
1019
1077
  }
1020
1078
 
1079
+ inline void String::CheckCast(napi_env env, napi_value value) {
1080
+ NAPI_CHECK(value != nullptr, "String::CheckCast", "empty value");
1081
+
1082
+ napi_valuetype type;
1083
+ napi_status status = napi_typeof(env, value, &type);
1084
+ NAPI_CHECK(status == napi_ok, "String::CheckCast", "napi_typeof failed");
1085
+ NAPI_CHECK(
1086
+ type == napi_string, "String::CheckCast", "value is not napi_string");
1087
+ }
1088
+
1021
1089
  inline String::String() : Name() {}
1022
1090
 
1023
1091
  inline String::String(napi_env env, napi_value value) : Name(env, value) {}
@@ -1145,6 +1213,16 @@ inline MaybeOrValue<Symbol> Symbol::For(napi_env env, napi_value description) {
1145
1213
  #endif
1146
1214
  }
1147
1215
 
1216
+ inline void Symbol::CheckCast(napi_env env, napi_value value) {
1217
+ NAPI_CHECK(value != nullptr, "Symbol::CheckCast", "empty value");
1218
+
1219
+ napi_valuetype type;
1220
+ napi_status status = napi_typeof(env, value, &type);
1221
+ NAPI_CHECK(status == napi_ok, "Symbol::CheckCast", "napi_typeof failed");
1222
+ NAPI_CHECK(
1223
+ type == napi_symbol, "Symbol::CheckCast", "value is not napi_symbol");
1224
+ }
1225
+
1148
1226
  inline Symbol::Symbol() : Name() {}
1149
1227
 
1150
1228
  inline Symbol::Symbol(napi_env env, napi_value value) : Name(env, value) {}
@@ -1242,6 +1320,32 @@ String String::From(napi_env env, const T& value) {
1242
1320
  return Helper::From(env, value);
1243
1321
  }
1244
1322
 
1323
+ ////////////////////////////////////////////////////////////////////////////////
1324
+ // TypeTaggable class
1325
+ ////////////////////////////////////////////////////////////////////////////////
1326
+
1327
+ inline TypeTaggable::TypeTaggable() : Value() {}
1328
+
1329
+ inline TypeTaggable::TypeTaggable(napi_env _env, napi_value _value)
1330
+ : Value(_env, _value) {}
1331
+
1332
+ #if NAPI_VERSION >= 8
1333
+
1334
+ inline void TypeTaggable::TypeTag(const napi_type_tag* type_tag) const {
1335
+ napi_status status = napi_type_tag_object(_env, _value, type_tag);
1336
+ NAPI_THROW_IF_FAILED_VOID(_env, status);
1337
+ }
1338
+
1339
+ inline bool TypeTaggable::CheckTypeTag(const napi_type_tag* type_tag) const {
1340
+ bool result;
1341
+ napi_status status =
1342
+ napi_check_object_type_tag(_env, _value, type_tag, &result);
1343
+ NAPI_THROW_IF_FAILED(_env, status, false);
1344
+ return result;
1345
+ }
1346
+
1347
+ #endif // NAPI_VERSION >= 8
1348
+
1245
1349
  ////////////////////////////////////////////////////////////////////////////////
1246
1350
  // Object class
1247
1351
  ////////////////////////////////////////////////////////////////////////////////
@@ -1281,9 +1385,20 @@ inline Object Object::New(napi_env env) {
1281
1385
  return Object(env, value);
1282
1386
  }
1283
1387
 
1284
- inline Object::Object() : Value() {}
1388
+ inline void Object::CheckCast(napi_env env, napi_value value) {
1389
+ NAPI_CHECK(value != nullptr, "Object::CheckCast", "empty value");
1390
+
1391
+ napi_valuetype type;
1392
+ napi_status status = napi_typeof(env, value, &type);
1393
+ NAPI_CHECK(status == napi_ok, "Object::CheckCast", "napi_typeof failed");
1394
+ NAPI_CHECK(
1395
+ type == napi_object, "Object::CheckCast", "value is not napi_object");
1396
+ }
1397
+
1398
+ inline Object::Object() : TypeTaggable() {}
1285
1399
 
1286
- inline Object::Object(napi_env env, napi_value value) : Value(env, value) {}
1400
+ inline Object::Object(napi_env env, napi_value value)
1401
+ : TypeTaggable(env, value) {}
1287
1402
 
1288
1403
  inline Object::PropertyLValue<std::string> Object::operator[](
1289
1404
  const char* utf8name) {
@@ -1626,19 +1741,6 @@ inline MaybeOrValue<bool> Object::Seal() const {
1626
1741
  napi_status status = napi_object_seal(_env, _value);
1627
1742
  NAPI_RETURN_OR_THROW_IF_FAILED(_env, status, status == napi_ok, bool);
1628
1743
  }
1629
-
1630
- inline void Object::TypeTag(const napi_type_tag* type_tag) const {
1631
- napi_status status = napi_type_tag_object(_env, _value, type_tag);
1632
- NAPI_THROW_IF_FAILED_VOID(_env, status);
1633
- }
1634
-
1635
- inline bool Object::CheckTypeTag(const napi_type_tag* type_tag) const {
1636
- bool result;
1637
- napi_status status =
1638
- napi_check_object_type_tag(_env, _value, type_tag, &result);
1639
- NAPI_THROW_IF_FAILED(_env, status, false);
1640
- return result;
1641
- }
1642
1744
  #endif // NAPI_VERSION >= 8
1643
1745
 
1644
1746
  ////////////////////////////////////////////////////////////////////////////////
@@ -1700,11 +1802,23 @@ inline External<T> External<T>::New(napi_env env,
1700
1802
  }
1701
1803
 
1702
1804
  template <typename T>
1703
- inline External<T>::External() : Value() {}
1805
+ inline void External<T>::CheckCast(napi_env env, napi_value value) {
1806
+ NAPI_CHECK(value != nullptr, "External::CheckCast", "empty value");
1807
+
1808
+ napi_valuetype type;
1809
+ napi_status status = napi_typeof(env, value, &type);
1810
+ NAPI_CHECK(status == napi_ok, "External::CheckCast", "napi_typeof failed");
1811
+ NAPI_CHECK(type == napi_external,
1812
+ "External::CheckCast",
1813
+ "value is not napi_external");
1814
+ }
1815
+
1816
+ template <typename T>
1817
+ inline External<T>::External() : TypeTaggable() {}
1704
1818
 
1705
1819
  template <typename T>
1706
1820
  inline External<T>::External(napi_env env, napi_value value)
1707
- : Value(env, value) {}
1821
+ : TypeTaggable(env, value) {}
1708
1822
 
1709
1823
  template <typename T>
1710
1824
  inline T* External<T>::Data() const {
@@ -1732,6 +1846,15 @@ inline Array Array::New(napi_env env, size_t length) {
1732
1846
  return Array(env, value);
1733
1847
  }
1734
1848
 
1849
+ inline void Array::CheckCast(napi_env env, napi_value value) {
1850
+ NAPI_CHECK(value != nullptr, "Array::CheckCast", "empty value");
1851
+
1852
+ bool result;
1853
+ napi_status status = napi_is_array(env, value, &result);
1854
+ NAPI_CHECK(status == napi_ok, "Array::CheckCast", "napi_is_array failed");
1855
+ NAPI_CHECK(result, "Array::CheckCast", "value is not array");
1856
+ }
1857
+
1735
1858
  inline Array::Array() : Object() {}
1736
1859
 
1737
1860
  inline Array::Array(napi_env env, napi_value value) : Object(env, value) {}
@@ -1756,6 +1879,7 @@ inline ArrayBuffer ArrayBuffer::New(napi_env env, size_t byteLength) {
1756
1879
  return ArrayBuffer(env, value);
1757
1880
  }
1758
1881
 
1882
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1759
1883
  inline ArrayBuffer ArrayBuffer::New(napi_env env,
1760
1884
  void* externalData,
1761
1885
  size_t byteLength) {
@@ -1815,6 +1939,18 @@ inline ArrayBuffer ArrayBuffer::New(napi_env env,
1815
1939
 
1816
1940
  return ArrayBuffer(env, value);
1817
1941
  }
1942
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1943
+
1944
+ inline void ArrayBuffer::CheckCast(napi_env env, napi_value value) {
1945
+ NAPI_CHECK(value != nullptr, "ArrayBuffer::CheckCast", "empty value");
1946
+
1947
+ bool result;
1948
+ napi_status status = napi_is_arraybuffer(env, value, &result);
1949
+ NAPI_CHECK(status == napi_ok,
1950
+ "ArrayBuffer::CheckCast",
1951
+ "napi_is_arraybuffer failed");
1952
+ NAPI_CHECK(result, "ArrayBuffer::CheckCast", "value is not arraybuffer");
1953
+ }
1818
1954
 
1819
1955
  inline ArrayBuffer::ArrayBuffer() : Object() {}
1820
1956
 
@@ -1883,6 +2019,16 @@ inline DataView DataView::New(napi_env env,
1883
2019
  return DataView(env, value);
1884
2020
  }
1885
2021
 
2022
+ inline void DataView::CheckCast(napi_env env, napi_value value) {
2023
+ NAPI_CHECK(value != nullptr, "DataView::CheckCast", "empty value");
2024
+
2025
+ bool result;
2026
+ napi_status status = napi_is_dataview(env, value, &result);
2027
+ NAPI_CHECK(
2028
+ status == napi_ok, "DataView::CheckCast", "napi_is_dataview failed");
2029
+ NAPI_CHECK(result, "DataView::CheckCast", "value is not dataview");
2030
+ }
2031
+
1886
2032
  inline DataView::DataView() : Object() {}
1887
2033
 
1888
2034
  inline DataView::DataView(napi_env env, napi_value value) : Object(env, value) {
@@ -2017,6 +2163,15 @@ inline void DataView::WriteData(size_t byteOffset, T value) const {
2017
2163
  ////////////////////////////////////////////////////////////////////////////////
2018
2164
  // TypedArray class
2019
2165
  ////////////////////////////////////////////////////////////////////////////////
2166
+ inline void TypedArray::CheckCast(napi_env env, napi_value value) {
2167
+ NAPI_CHECK(value != nullptr, "TypedArray::CheckCast", "empty value");
2168
+
2169
+ bool result;
2170
+ napi_status status = napi_is_typedarray(env, value, &result);
2171
+ NAPI_CHECK(
2172
+ status == napi_ok, "TypedArray::CheckCast", "napi_is_typedarray failed");
2173
+ NAPI_CHECK(result, "TypedArray::CheckCast", "value is not typedarray");
2174
+ }
2020
2175
 
2021
2176
  inline TypedArray::TypedArray()
2022
2177
  : Object(), _type(napi_typedarray_type::napi_int8_array), _length(0) {}
@@ -2099,6 +2254,23 @@ inline Napi::ArrayBuffer TypedArray::ArrayBuffer() const {
2099
2254
  ////////////////////////////////////////////////////////////////////////////////
2100
2255
  // TypedArrayOf<T> class
2101
2256
  ////////////////////////////////////////////////////////////////////////////////
2257
+ template <typename T>
2258
+ inline void TypedArrayOf<T>::CheckCast(napi_env env, napi_value value) {
2259
+ TypedArray::CheckCast(env, value);
2260
+ napi_typedarray_type type;
2261
+ napi_status status = napi_get_typedarray_info(
2262
+ env, value, &type, nullptr, nullptr, nullptr, nullptr);
2263
+ NAPI_CHECK(status == napi_ok,
2264
+ "TypedArrayOf::CheckCast",
2265
+ "napi_is_typedarray failed");
2266
+
2267
+ NAPI_CHECK(
2268
+ (type == TypedArrayTypeForPrimitiveType<T>() ||
2269
+ (type == napi_uint8_clamped_array && std::is_same<T, uint8_t>::value)),
2270
+ "TypedArrayOf::CheckCast",
2271
+ "Array type must match the template parameter. (Uint8 arrays may "
2272
+ "optionally have the \"clamped\" array type.)");
2273
+ }
2102
2274
 
2103
2275
  template <typename T>
2104
2276
  inline TypedArrayOf<T> TypedArrayOf<T>::New(napi_env env,
@@ -2272,6 +2444,17 @@ inline Function Function::New(napi_env env,
2272
2444
  return New(env, cb, utf8name.c_str(), data);
2273
2445
  }
2274
2446
 
2447
+ inline void Function::CheckCast(napi_env env, napi_value value) {
2448
+ NAPI_CHECK(value != nullptr, "Function::CheckCast", "empty value");
2449
+
2450
+ napi_valuetype type;
2451
+ napi_status status = napi_typeof(env, value, &type);
2452
+ NAPI_CHECK(status == napi_ok, "Function::CheckCast", "napi_typeof failed");
2453
+ NAPI_CHECK(type == napi_function,
2454
+ "Function::CheckCast",
2455
+ "value is not napi_function");
2456
+ }
2457
+
2275
2458
  inline Function::Function() : Object() {}
2276
2459
 
2277
2460
  inline Function::Function(napi_env env, napi_value value)
@@ -2418,6 +2601,15 @@ inline void Promise::Deferred::Reject(napi_value value) const {
2418
2601
  NAPI_THROW_IF_FAILED_VOID(_env, status);
2419
2602
  }
2420
2603
 
2604
+ inline void Promise::CheckCast(napi_env env, napi_value value) {
2605
+ NAPI_CHECK(value != nullptr, "Promise::CheckCast", "empty value");
2606
+
2607
+ bool result;
2608
+ napi_status status = napi_is_promise(env, value, &result);
2609
+ NAPI_CHECK(status == napi_ok, "Promise::CheckCast", "napi_is_promise failed");
2610
+ NAPI_CHECK(result, "Promise::CheckCast", "value is not promise");
2611
+ }
2612
+
2421
2613
  inline Promise::Promise(napi_env env, napi_value value) : Object(env, value) {}
2422
2614
 
2423
2615
  ////////////////////////////////////////////////////////////////////////////////
@@ -2434,6 +2626,7 @@ inline Buffer<T> Buffer<T>::New(napi_env env, size_t length) {
2434
2626
  return Buffer(env, value, length, static_cast<T*>(data));
2435
2627
  }
2436
2628
 
2629
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2437
2630
  template <typename T>
2438
2631
  inline Buffer<T> Buffer<T>::New(napi_env env, T* data, size_t length) {
2439
2632
  napi_value value;
@@ -2491,6 +2684,94 @@ inline Buffer<T> Buffer<T>::New(napi_env env,
2491
2684
  }
2492
2685
  return Buffer(env, value, length, data);
2493
2686
  }
2687
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2688
+
2689
+ template <typename T>
2690
+ inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env, T* data, size_t length) {
2691
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2692
+ napi_value value;
2693
+ napi_status status = napi_create_external_buffer(
2694
+ env, length * sizeof(T), data, nullptr, nullptr, &value);
2695
+ if (status == details::napi_no_external_buffers_allowed) {
2696
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2697
+ // If we can't create an external buffer, we'll just copy the data.
2698
+ return Buffer<T>::Copy(env, data, length);
2699
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2700
+ }
2701
+ NAPI_THROW_IF_FAILED(env, status, Buffer<T>());
2702
+ return Buffer(env, value, length, data);
2703
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2704
+ }
2705
+
2706
+ template <typename T>
2707
+ template <typename Finalizer>
2708
+ inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env,
2709
+ T* data,
2710
+ size_t length,
2711
+ Finalizer finalizeCallback) {
2712
+ details::FinalizeData<T, Finalizer>* finalizeData =
2713
+ new details::FinalizeData<T, Finalizer>(
2714
+ {std::move(finalizeCallback), nullptr});
2715
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2716
+ napi_value value;
2717
+ napi_status status =
2718
+ napi_create_external_buffer(env,
2719
+ length * sizeof(T),
2720
+ data,
2721
+ details::FinalizeData<T, Finalizer>::Wrapper,
2722
+ finalizeData,
2723
+ &value);
2724
+ if (status == details::napi_no_external_buffers_allowed) {
2725
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2726
+ // If we can't create an external buffer, we'll just copy the data.
2727
+ Buffer<T> ret = Buffer<T>::Copy(env, data, length);
2728
+ details::FinalizeData<T, Finalizer>::Wrapper(env, data, finalizeData);
2729
+ return ret;
2730
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2731
+ }
2732
+ if (status != napi_ok) {
2733
+ delete finalizeData;
2734
+ NAPI_THROW_IF_FAILED(env, status, Buffer());
2735
+ }
2736
+ return Buffer(env, value, length, data);
2737
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2738
+ }
2739
+
2740
+ template <typename T>
2741
+ template <typename Finalizer, typename Hint>
2742
+ inline Buffer<T> Buffer<T>::NewOrCopy(napi_env env,
2743
+ T* data,
2744
+ size_t length,
2745
+ Finalizer finalizeCallback,
2746
+ Hint* finalizeHint) {
2747
+ details::FinalizeData<T, Finalizer, Hint>* finalizeData =
2748
+ new details::FinalizeData<T, Finalizer, Hint>(
2749
+ {std::move(finalizeCallback), finalizeHint});
2750
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2751
+ napi_value value;
2752
+ napi_status status = napi_create_external_buffer(
2753
+ env,
2754
+ length * sizeof(T),
2755
+ data,
2756
+ details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint,
2757
+ finalizeData,
2758
+ &value);
2759
+ if (status == details::napi_no_external_buffers_allowed) {
2760
+ #endif
2761
+ // If we can't create an external buffer, we'll just copy the data.
2762
+ Buffer<T> ret = Buffer<T>::Copy(env, data, length);
2763
+ details::FinalizeData<T, Finalizer, Hint>::WrapperWithHint(
2764
+ env, data, finalizeData);
2765
+ return ret;
2766
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
2767
+ }
2768
+ if (status != napi_ok) {
2769
+ delete finalizeData;
2770
+ NAPI_THROW_IF_FAILED(env, status, Buffer());
2771
+ }
2772
+ return Buffer(env, value, length, data);
2773
+ #endif
2774
+ }
2494
2775
 
2495
2776
  template <typename T>
2496
2777
  inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
@@ -2501,6 +2782,16 @@ inline Buffer<T> Buffer<T>::Copy(napi_env env, const T* data, size_t length) {
2501
2782
  return Buffer<T>(env, value);
2502
2783
  }
2503
2784
 
2785
+ template <typename T>
2786
+ inline void Buffer<T>::CheckCast(napi_env env, napi_value value) {
2787
+ NAPI_CHECK(value != nullptr, "Buffer::CheckCast", "empty value");
2788
+
2789
+ bool result;
2790
+ napi_status status = napi_is_buffer(env, value, &result);
2791
+ NAPI_CHECK(status == napi_ok, "Buffer::CheckCast", "napi_is_buffer failed");
2792
+ NAPI_CHECK(result, "Buffer::CheckCast", "value is not buffer");
2793
+ }
2794
+
2504
2795
  template <typename T>
2505
2796
  inline Buffer<T>::Buffer() : Uint8Array(), _length(0), _data(nullptr) {}
2506
2797
 
@@ -2646,6 +2937,22 @@ inline Error::Error(napi_env env, napi_value value)
2646
2937
  nullptr};
2647
2938
 
2648
2939
  status = napi_define_properties(env, wrappedErrorObj, 1, &wrapObjFlag);
2940
+ #ifdef NODE_API_SWALLOW_UNTHROWABLE_EXCEPTIONS
2941
+ if (status == napi_pending_exception) {
2942
+ // Test if the pending exception was reported because the environment is
2943
+ // shutting down. We assume that a status of napi_pending_exception
2944
+ // coupled with the absence of an actual pending exception means that
2945
+ // the environment is shutting down. If so, we replace the
2946
+ // napi_pending_exception status with napi_ok.
2947
+ bool is_exception_pending = false;
2948
+ status = napi_is_exception_pending(env, &is_exception_pending);
2949
+ if (status == napi_ok && !is_exception_pending) {
2950
+ status = napi_ok;
2951
+ } else {
2952
+ status = napi_pending_exception;
2953
+ }
2954
+ }
2955
+ #endif // NODE_API_SWALLOW_UNTHROWABLE_EXCEPTIONS
2649
2956
  NAPI_FATAL_IF_FAILED(status, "Error::Error", "napi_define_properties");
2650
2957
 
2651
2958
  // Create a reference on the newly wrapped object
@@ -4049,7 +4356,7 @@ inline napi_value InstanceWrap<T>::InstanceVoidMethodCallbackWrapper(
4049
4356
  callbackInfo.SetData(callbackData->data);
4050
4357
  T* instance = T::Unwrap(callbackInfo.This().As<Object>());
4051
4358
  auto cb = callbackData->callback;
4052
- (instance->*cb)(callbackInfo);
4359
+ if (instance) (instance->*cb)(callbackInfo);
4053
4360
  return nullptr;
4054
4361
  });
4055
4362
  }
@@ -4064,7 +4371,7 @@ inline napi_value InstanceWrap<T>::InstanceMethodCallbackWrapper(
4064
4371
  callbackInfo.SetData(callbackData->data);
4065
4372
  T* instance = T::Unwrap(callbackInfo.This().As<Object>());
4066
4373
  auto cb = callbackData->callback;
4067
- return (instance->*cb)(callbackInfo);
4374
+ return instance ? (instance->*cb)(callbackInfo) : Napi::Value();
4068
4375
  });
4069
4376
  }
4070
4377
 
@@ -4078,7 +4385,7 @@ inline napi_value InstanceWrap<T>::InstanceGetterCallbackWrapper(
4078
4385
  callbackInfo.SetData(callbackData->data);
4079
4386
  T* instance = T::Unwrap(callbackInfo.This().As<Object>());
4080
4387
  auto cb = callbackData->getterCallback;
4081
- return (instance->*cb)(callbackInfo);
4388
+ return instance ? (instance->*cb)(callbackInfo) : Napi::Value();
4082
4389
  });
4083
4390
  }
4084
4391
 
@@ -4092,7 +4399,7 @@ inline napi_value InstanceWrap<T>::InstanceSetterCallbackWrapper(
4092
4399
  callbackInfo.SetData(callbackData->data);
4093
4400
  T* instance = T::Unwrap(callbackInfo.This().As<Object>());
4094
4401
  auto cb = callbackData->setterCallback;
4095
- (instance->*cb)(callbackInfo, callbackInfo[0]);
4402
+ if (instance) (instance->*cb)(callbackInfo, callbackInfo[0]);
4096
4403
  return nullptr;
4097
4404
  });
4098
4405
  }
@@ -4104,7 +4411,7 @@ inline napi_value InstanceWrap<T>::WrappedMethod(
4104
4411
  return details::WrapCallback([&] {
4105
4412
  const CallbackInfo cbInfo(env, info);
4106
4413
  T* instance = T::Unwrap(cbInfo.This().As<Object>());
4107
- (instance->*method)(cbInfo, cbInfo[0]);
4414
+ if (instance) (instance->*method)(cbInfo, cbInfo[0]);
4108
4415
  return nullptr;
4109
4416
  });
4110
4417
  }
@@ -4733,6 +5040,8 @@ inline Napi::Env AsyncContext::Env() const {
4733
5040
  // AsyncWorker class
4734
5041
  ////////////////////////////////////////////////////////////////////////////////
4735
5042
 
5043
+ #if NAPI_HAS_THREADS
5044
+
4736
5045
  inline AsyncWorker::AsyncWorker(const Function& callback)
4737
5046
  : AsyncWorker(callback, "generic") {}
4738
5047
 
@@ -4911,7 +5220,9 @@ inline void AsyncWorker::OnWorkComplete(Napi::Env /*env*/, napi_status status) {
4911
5220
  }
4912
5221
  }
4913
5222
 
4914
- #if (NAPI_VERSION > 3 && !defined(__wasm32__))
5223
+ #endif // NAPI_HAS_THREADS
5224
+
5225
+ #if (NAPI_VERSION > 3 && NAPI_HAS_THREADS)
4915
5226
  ////////////////////////////////////////////////////////////////////////////////
4916
5227
  // TypedThreadSafeFunction<ContextType,DataType,CallJs> class
4917
5228
  ////////////////////////////////////////////////////////////////////////////////
@@ -6160,7 +6471,7 @@ inline void AsyncProgressQueueWorker<T>::ExecutionProgress::Send(
6160
6471
  const T* data, size_t count) const {
6161
6472
  _worker->SendProgress_(data, count);
6162
6473
  }
6163
- #endif // NAPI_VERSION > 3 && !defined(__wasm32__)
6474
+ #endif // NAPI_VERSION > 3 && NAPI_HAS_THREADS
6164
6475
 
6165
6476
  ////////////////////////////////////////////////////////////////////////////////
6166
6477
  // Memory Management class
package/napi.h CHANGED
@@ -1,11 +1,22 @@
1
1
  #ifndef SRC_NAPI_H_
2
2
  #define SRC_NAPI_H_
3
3
 
4
+ #ifndef NAPI_HAS_THREADS
5
+ #if !defined(__wasm__) || (defined(__EMSCRIPTEN_PTHREADS__) || \
6
+ (defined(__wasi__) && defined(_REENTRANT)))
7
+ #define NAPI_HAS_THREADS 1
8
+ #else
9
+ #define NAPI_HAS_THREADS 0
10
+ #endif
11
+ #endif
12
+
4
13
  #include <node_api.h>
5
14
  #include <functional>
6
15
  #include <initializer_list>
7
16
  #include <memory>
17
+ #if NAPI_HAS_THREADS
8
18
  #include <mutex>
19
+ #endif // NAPI_HAS_THREADS
9
20
  #include <string>
10
21
  #include <vector>
11
22
 
@@ -452,6 +463,9 @@ class Value {
452
463
  ///
453
464
  /// This conversion does NOT coerce the type. Calling any methods
454
465
  /// inappropriate for the actual value type will throw `Napi::Error`.
466
+ ///
467
+ /// If `NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS` is defined, this method
468
+ /// asserts that the actual type is the expected type.
455
469
  template <typename T>
456
470
  T As() const;
457
471
 
@@ -478,6 +492,8 @@ class Boolean : public Value {
478
492
  bool value ///< Boolean value
479
493
  );
480
494
 
495
+ static void CheckCast(napi_env env, napi_value value);
496
+
481
497
  Boolean(); ///< Creates a new _empty_ Boolean instance.
482
498
  Boolean(napi_env env,
483
499
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -493,6 +509,8 @@ class Number : public Value {
493
509
  double value ///< Number value
494
510
  );
495
511
 
512
+ static void CheckCast(napi_env env, napi_value value);
513
+
496
514
  Number(); ///< Creates a new _empty_ Number instance.
497
515
  Number(napi_env env,
498
516
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -541,6 +559,8 @@ class BigInt : public Value {
541
559
  const uint64_t* words ///< Array of words
542
560
  );
543
561
 
562
+ static void CheckCast(napi_env env, napi_value value);
563
+
544
564
  BigInt(); ///< Creates a new _empty_ BigInt instance.
545
565
  BigInt(napi_env env,
546
566
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -572,6 +592,8 @@ class Date : public Value {
572
592
  double value ///< Number value
573
593
  );
574
594
 
595
+ static void CheckCast(napi_env env, napi_value value);
596
+
575
597
  Date(); ///< Creates a new _empty_ Date instance.
576
598
  Date(napi_env env, napi_value value); ///< Wraps a Node-API value primitive.
577
599
  operator double() const; ///< Converts a Date value to double primitive
@@ -583,6 +605,8 @@ class Date : public Value {
583
605
  /// A JavaScript string or symbol value (that can be used as a property name).
584
606
  class Name : public Value {
585
607
  public:
608
+ static void CheckCast(napi_env env, napi_value value);
609
+
586
610
  Name(); ///< Creates a new _empty_ Name instance.
587
611
  Name(napi_env env,
588
612
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -640,6 +664,8 @@ class String : public Name {
640
664
  template <typename T>
641
665
  static String From(napi_env env, const T& value);
642
666
 
667
+ static void CheckCast(napi_env env, napi_value value);
668
+
643
669
  String(); ///< Creates a new _empty_ String instance.
644
670
  String(napi_env env,
645
671
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -698,13 +724,26 @@ class Symbol : public Name {
698
724
  // Create a symbol in the global registry, napi_value describing the symbol
699
725
  static MaybeOrValue<Symbol> For(napi_env env, napi_value description);
700
726
 
727
+ static void CheckCast(napi_env env, napi_value value);
728
+
701
729
  Symbol(); ///< Creates a new _empty_ Symbol instance.
702
730
  Symbol(napi_env env,
703
731
  napi_value value); ///< Wraps a Node-API value primitive.
704
732
  };
705
733
 
734
+ class TypeTaggable : public Value {
735
+ public:
736
+ #if NAPI_VERSION >= 8
737
+ void TypeTag(const napi_type_tag* type_tag) const;
738
+ bool CheckTypeTag(const napi_type_tag* type_tag) const;
739
+ #endif // NAPI_VERSION >= 8
740
+ protected:
741
+ TypeTaggable();
742
+ TypeTaggable(napi_env env, napi_value value);
743
+ };
744
+
706
745
  /// A JavaScript object value.
707
- class Object : public Value {
746
+ class Object : public TypeTaggable {
708
747
  public:
709
748
  /// Enables property and element assignments using indexing syntax.
710
749
  ///
@@ -745,6 +784,8 @@ class Object : public Value {
745
784
  static Object New(napi_env env ///< Node-API environment
746
785
  );
747
786
 
787
+ static void CheckCast(napi_env env, napi_value value);
788
+
748
789
  Object(); ///< Creates a new _empty_ Object instance.
749
790
  Object(napi_env env,
750
791
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -980,14 +1021,11 @@ class Object : public Value {
980
1021
  /// See
981
1022
  /// https://tc39.es/ecma262/#sec-proxy-object-internal-methods-and-internal-slots-getprototypeof
982
1023
  MaybeOrValue<bool> Seal() const;
983
-
984
- void TypeTag(const napi_type_tag* type_tag) const;
985
- bool CheckTypeTag(const napi_type_tag* type_tag) const;
986
1024
  #endif // NAPI_VERSION >= 8
987
1025
  };
988
1026
 
989
1027
  template <typename T>
990
- class External : public Value {
1028
+ class External : public TypeTaggable {
991
1029
  public:
992
1030
  static External New(napi_env env, T* data);
993
1031
 
@@ -1001,6 +1039,8 @@ class External : public Value {
1001
1039
  Finalizer finalizeCallback,
1002
1040
  Hint* finalizeHint);
1003
1041
 
1042
+ static void CheckCast(napi_env env, napi_value value);
1043
+
1004
1044
  External();
1005
1045
  External(napi_env env, napi_value value);
1006
1046
 
@@ -1012,6 +1052,8 @@ class Array : public Object {
1012
1052
  static Array New(napi_env env);
1013
1053
  static Array New(napi_env env, size_t length);
1014
1054
 
1055
+ static void CheckCast(napi_env env, napi_value value);
1056
+
1015
1057
  Array();
1016
1058
  Array(napi_env env, napi_value value);
1017
1059
 
@@ -1077,6 +1119,7 @@ class ArrayBuffer : public Object {
1077
1119
  size_t byteLength ///< Length of the buffer to be allocated, in bytes
1078
1120
  );
1079
1121
 
1122
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1080
1123
  /// Creates a new ArrayBuffer instance, using an external buffer with
1081
1124
  /// specified byte length.
1082
1125
  static ArrayBuffer New(
@@ -1120,6 +1163,9 @@ class ArrayBuffer : public Object {
1120
1163
  Hint* finalizeHint ///< Hint (second parameter) to be passed to the
1121
1164
  ///< finalize callback
1122
1165
  );
1166
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1167
+
1168
+ static void CheckCast(napi_env env, napi_value value);
1123
1169
 
1124
1170
  ArrayBuffer(); ///< Creates a new _empty_ ArrayBuffer instance.
1125
1171
  ArrayBuffer(napi_env env,
@@ -1145,6 +1191,8 @@ class ArrayBuffer : public Object {
1145
1191
  /// }
1146
1192
  class TypedArray : public Object {
1147
1193
  public:
1194
+ static void CheckCast(napi_env env, napi_value value);
1195
+
1148
1196
  TypedArray(); ///< Creates a new _empty_ TypedArray instance.
1149
1197
  TypedArray(napi_env env,
1150
1198
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -1245,6 +1293,8 @@ class TypedArrayOf : public TypedArray {
1245
1293
  ///< template parameter T.
1246
1294
  );
1247
1295
 
1296
+ static void CheckCast(napi_env env, napi_value value);
1297
+
1248
1298
  TypedArrayOf(); ///< Creates a new _empty_ TypedArrayOf instance.
1249
1299
  TypedArrayOf(napi_env env,
1250
1300
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -1289,6 +1339,8 @@ class DataView : public Object {
1289
1339
  size_t byteOffset,
1290
1340
  size_t byteLength);
1291
1341
 
1342
+ static void CheckCast(napi_env env, napi_value value);
1343
+
1292
1344
  DataView(); ///< Creates a new _empty_ DataView instance.
1293
1345
  DataView(napi_env env,
1294
1346
  napi_value value); ///< Wraps a Node-API value primitive.
@@ -1369,6 +1421,8 @@ class Function : public Object {
1369
1421
  const std::string& utf8name,
1370
1422
  void* data = nullptr);
1371
1423
 
1424
+ static void CheckCast(napi_env env, napi_value value);
1425
+
1372
1426
  Function();
1373
1427
  Function(napi_env env, napi_value value);
1374
1428
 
@@ -1425,6 +1479,8 @@ class Promise : public Object {
1425
1479
  napi_value _promise;
1426
1480
  };
1427
1481
 
1482
+ static void CheckCast(napi_env env, napi_value value);
1483
+
1428
1484
  Promise(napi_env env, napi_value value);
1429
1485
  };
1430
1486
 
@@ -1432,6 +1488,7 @@ template <typename T>
1432
1488
  class Buffer : public Uint8Array {
1433
1489
  public:
1434
1490
  static Buffer<T> New(napi_env env, size_t length);
1491
+ #ifndef NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1435
1492
  static Buffer<T> New(napi_env env, T* data, size_t length);
1436
1493
 
1437
1494
  // Finalizer must implement `void operator()(Env env, T* data)`.
@@ -1447,9 +1504,27 @@ class Buffer : public Uint8Array {
1447
1504
  size_t length,
1448
1505
  Finalizer finalizeCallback,
1449
1506
  Hint* finalizeHint);
1507
+ #endif // NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED
1508
+
1509
+ static Buffer<T> NewOrCopy(napi_env env, T* data, size_t length);
1510
+ // Finalizer must implement `void operator()(Env env, T* data)`.
1511
+ template <typename Finalizer>
1512
+ static Buffer<T> NewOrCopy(napi_env env,
1513
+ T* data,
1514
+ size_t length,
1515
+ Finalizer finalizeCallback);
1516
+ // Finalizer must implement `void operator()(Env env, T* data, Hint* hint)`.
1517
+ template <typename Finalizer, typename Hint>
1518
+ static Buffer<T> NewOrCopy(napi_env env,
1519
+ T* data,
1520
+ size_t length,
1521
+ Finalizer finalizeCallback,
1522
+ Hint* finalizeHint);
1450
1523
 
1451
1524
  static Buffer<T> Copy(napi_env env, const T* data, size_t length);
1452
1525
 
1526
+ static void CheckCast(napi_env env, napi_value value);
1527
+
1453
1528
  Buffer();
1454
1529
  Buffer(napi_env env, napi_value value);
1455
1530
  size_t Length() const;
@@ -2435,6 +2510,7 @@ class AsyncContext {
2435
2510
  napi_async_context _context;
2436
2511
  };
2437
2512
 
2513
+ #if NAPI_HAS_THREADS
2438
2514
  class AsyncWorker {
2439
2515
  public:
2440
2516
  virtual ~AsyncWorker();
@@ -2497,8 +2573,9 @@ class AsyncWorker {
2497
2573
  std::string _error;
2498
2574
  bool _suppress_destruct;
2499
2575
  };
2576
+ #endif // NAPI_HAS_THREADS
2500
2577
 
2501
- #if (NAPI_VERSION > 3 && !defined(__wasm32__))
2578
+ #if (NAPI_VERSION > 3 && NAPI_HAS_THREADS)
2502
2579
  class ThreadSafeFunction {
2503
2580
  public:
2504
2581
  // This API may only be called from the main thread.
@@ -3068,7 +3145,7 @@ class AsyncProgressQueueWorker
3068
3145
  void Signal() const;
3069
3146
  void SendProgress_(const T* data, size_t count);
3070
3147
  };
3071
- #endif // NAPI_VERSION > 3 && !defined(__wasm32__)
3148
+ #endif // NAPI_VERSION > 3 && NAPI_HAS_THREADS
3072
3149
 
3073
3150
  // Memory management.
3074
3151
  class MemoryManagement {
package/package.json CHANGED
@@ -247,6 +247,10 @@
247
247
  "name": "Mathias Küsel",
248
248
  "url": "https://github.com/mathiask88"
249
249
  },
250
+ {
251
+ "name": "Mathias Stearn",
252
+ "url": "https://github.com/RedBeard0531"
253
+ },
250
254
  {
251
255
  "name": "Matteo Collina",
252
256
  "url": "https://github.com/mcollina"
@@ -355,6 +359,10 @@
355
359
  "name": "todoroff",
356
360
  "url": "https://github.com/todoroff"
357
361
  },
362
+ {
363
+ "name": "Toyo Li",
364
+ "url": "https://github.com/toyobayashi"
365
+ },
358
366
  {
359
367
  "name": "Tux3",
360
368
  "url": "https://github.com/tux3"
@@ -391,6 +399,14 @@
391
399
  {
392
400
  "name": "Feng Yu",
393
401
  "url": "https://github.com/F3n67u"
402
+ },
403
+ {
404
+ "name": "wanlu wang",
405
+ "url": "https://github.com/wanlu"
406
+ },
407
+ {
408
+ "name": "Caleb Hearon",
409
+ "url": "https://github.com/chearon"
394
410
  }
395
411
  ],
396
412
  "description": "Node.js API (Node-API)",
@@ -451,6 +467,6 @@
451
467
  "lint:fix": "node tools/clang-format --fix && node tools/eslint-format --fix"
452
468
  },
453
469
  "pre-commit": "lint",
454
- "version": "6.0.0",
470
+ "version": "7.0.0",
455
471
  "support": true
456
472
  }
@@ -23,7 +23,7 @@ function main (args) {
23
23
  // Check js files that change on unstaged file
24
24
  const fileUnStaged = spawn(
25
25
  'git',
26
- ['diff', '--name-only', FORMAT_START, filesToCheck],
26
+ ['diff', '--name-only', '--diff-filter=d', FORMAT_START, filesToCheck],
27
27
  {
28
28
  encoding: 'utf-8'
29
29
  }
@@ -32,7 +32,7 @@ function main (args) {
32
32
  // Check js files that change on staged file
33
33
  const fileStaged = spawn(
34
34
  'git',
35
- ['diff', '--name-only', '--cached', FORMAT_START, filesToCheck],
35
+ ['diff', '--name-only', '--cached', '--diff-filter=d', FORMAT_START, filesToCheck],
36
36
  {
37
37
  encoding: 'utf-8'
38
38
  }