koffi 2.12.1 → 2.12.3

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.
Files changed (186) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/LICENSE.txt +2 -2
  3. package/README.md +8 -8
  4. package/build/koffi/darwin_arm64/koffi.node +0 -0
  5. package/build/koffi/darwin_x64/koffi.node +0 -0
  6. package/build/koffi/freebsd_arm64/koffi.node +0 -0
  7. package/build/koffi/freebsd_ia32/koffi.node +0 -0
  8. package/build/koffi/freebsd_x64/koffi.node +0 -0
  9. package/build/koffi/linux_arm64/koffi.node +0 -0
  10. package/build/koffi/linux_armhf/koffi.node +0 -0
  11. package/build/koffi/linux_ia32/koffi.node +0 -0
  12. package/build/koffi/linux_loong64/koffi.node +0 -0
  13. package/build/koffi/linux_riscv64d/koffi.node +0 -0
  14. package/build/koffi/linux_x64/koffi.node +0 -0
  15. package/build/koffi/musl_arm64/koffi.node +0 -0
  16. package/build/koffi/musl_x64/koffi.node +0 -0
  17. package/build/koffi/openbsd_ia32/koffi.node +0 -0
  18. package/build/koffi/openbsd_x64/koffi.node +0 -0
  19. package/build/koffi/win32_arm64/koffi.exp +0 -0
  20. package/build/koffi/win32_arm64/koffi.node +0 -0
  21. package/build/koffi/win32_ia32/koffi.exp +0 -0
  22. package/build/koffi/win32_ia32/koffi.node +0 -0
  23. package/build/koffi/win32_x64/koffi.exp +0 -0
  24. package/build/koffi/win32_x64/koffi.node +0 -0
  25. package/doc/assets.ini +3 -3
  26. package/doc/develop.sh +4 -3
  27. package/doc/pages/platforms.md +1 -1
  28. package/doc/static/highlight.js +1 -1
  29. package/doc/static/koffi.css +3 -2
  30. package/doc/static/print.css +1 -1
  31. package/doc/templates/code.html +5 -5
  32. package/doc/templates/page.html +4 -4
  33. package/index.d.ts +228 -145
  34. package/index.js +25 -25
  35. package/indirect.js +25 -5
  36. package/package.json +2 -2
  37. package/src/cnoke/LICENSE.txt +2 -2
  38. package/src/cnoke/README.md +2 -0
  39. package/src/cnoke/assets/FindCNoke.cmake +12 -2
  40. package/src/cnoke/assets/win_delay_hook.c +4 -4
  41. package/src/cnoke/cnoke.js +4 -2
  42. package/src/cnoke/package.json +1 -1
  43. package/src/cnoke/src/builder.js +11 -14
  44. package/src/cnoke/src/index.js +2 -2
  45. package/src/cnoke/src/tools.js +34 -2
  46. package/src/core/{libcc/libcc.cc → base/base.cc} +3174 -1640
  47. package/src/core/{libcc/libcc.hh → base/base.hh} +3066 -2427
  48. package/src/core/{libcc → base}/mimetypes.inc +42 -4
  49. package/src/core/{libcc → base}/mimetypes_gen.py +3 -3
  50. package/src/core/base/unicode.inc +426 -0
  51. package/src/core/base/unicode_gen.py +189 -0
  52. package/src/koffi/CMakeLists.txt +7 -5
  53. package/src/koffi/cmake/raylib.cmake +6 -2
  54. package/src/koffi/cmake/{sqlite.cmake → sqlite3.cmake} +3 -3
  55. package/src/koffi/examples/electron-forge/forge.config.js +23 -3
  56. package/src/koffi/examples/electron-forge/package.json +18 -16
  57. package/src/koffi/src/abi_arm32.cc +7 -7
  58. package/src/koffi/src/abi_arm32_asm.S +2 -2
  59. package/src/koffi/src/abi_arm64.cc +45 -45
  60. package/src/koffi/src/abi_arm64_asm.S +4 -4
  61. package/src/koffi/src/abi_arm64_asm.asm +2 -2
  62. package/src/koffi/src/abi_loong64_asm.S +2 -2
  63. package/src/koffi/src/abi_riscv64.cc +5 -5
  64. package/src/koffi/src/abi_riscv64_asm.S +2 -2
  65. package/src/koffi/src/abi_x64_sysv.cc +3 -3
  66. package/src/koffi/src/abi_x64_sysv_asm.S +5 -5
  67. package/src/koffi/src/abi_x64_win.cc +3 -3
  68. package/src/koffi/src/abi_x64_win_asm.asm +2 -2
  69. package/src/koffi/src/abi_x86.cc +8 -8
  70. package/src/koffi/src/abi_x86_asm.S +2 -2
  71. package/src/koffi/src/abi_x86_asm.asm +2 -2
  72. package/src/koffi/src/call.cc +12 -12
  73. package/src/koffi/src/call.hh +8 -8
  74. package/src/koffi/src/errno.inc +152 -152
  75. package/src/koffi/src/ffi.cc +44 -39
  76. package/src/koffi/src/ffi.hh +6 -6
  77. package/src/koffi/src/init.js +1 -1
  78. package/src/koffi/src/parser.cc +5 -5
  79. package/src/koffi/src/parser.hh +3 -3
  80. package/src/koffi/src/trampolines/armasm.inc +2 -2
  81. package/src/koffi/src/trampolines/gnu.inc +2 -2
  82. package/src/koffi/src/trampolines/masm32.inc +2 -2
  83. package/src/koffi/src/trampolines/masm64.inc +2 -2
  84. package/src/koffi/src/trampolines/prototypes.inc +2 -2
  85. package/src/koffi/src/util.cc +9 -9
  86. package/src/koffi/src/util.hh +3 -3
  87. package/src/koffi/src/win32.cc +5 -5
  88. package/src/koffi/src/win32.hh +9 -9
  89. package/vendor/node-addon-api/CHANGELOG.md +97 -2
  90. package/vendor/node-addon-api/CONTRIBUTING.md +117 -7
  91. package/vendor/node-addon-api/README.md +25 -249
  92. package/vendor/node-addon-api/common.gypi +1 -0
  93. package/vendor/node-addon-api/doc/README.md +145 -0
  94. package/vendor/node-addon-api/doc/array_buffer.md +15 -15
  95. package/vendor/node-addon-api/doc/basic_env.md +200 -0
  96. package/vendor/node-addon-api/doc/buffer.md +24 -26
  97. package/vendor/node-addon-api/doc/cmake-js.md +19 -0
  98. package/vendor/node-addon-api/doc/{creating_a_release.md → contributing/creating_a_release.md} +16 -4
  99. package/vendor/node-addon-api/doc/env.md +11 -131
  100. package/vendor/node-addon-api/doc/error_handling.md +12 -0
  101. package/vendor/node-addon-api/doc/external.md +13 -4
  102. package/vendor/node-addon-api/doc/finalization.md +153 -0
  103. package/vendor/node-addon-api/doc/memory_management.md +1 -1
  104. package/vendor/node-addon-api/doc/object_wrap.md +19 -3
  105. package/vendor/node-addon-api/doc/promises.md +51 -0
  106. package/vendor/node-addon-api/doc/setup.md +29 -6
  107. package/vendor/node-addon-api/doc/value.md +13 -0
  108. package/vendor/node-addon-api/doc/version_management.md +2 -2
  109. package/vendor/node-addon-api/eslint.config.js +5 -0
  110. package/vendor/node-addon-api/index.js +2 -0
  111. package/vendor/node-addon-api/napi-inl.h +592 -166
  112. package/vendor/node-addon-api/napi.h +167 -59
  113. package/vendor/node-addon-api/node_addon_api.gyp +10 -0
  114. package/vendor/node-addon-api/noexcept.gypi +1 -1
  115. package/vendor/node-addon-api/package.json +10 -13
  116. package/vendor/node-addon-api/release-please-config.json +15 -0
  117. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +2 -1
  118. package/vendor/node-addon-api/test/array_buffer.js +1 -1
  119. package/vendor/node-addon-api/test/async_context.js +2 -2
  120. package/vendor/node-addon-api/test/async_progress_queue_worker.js +3 -3
  121. package/vendor/node-addon-api/test/async_progress_worker.js +3 -3
  122. package/vendor/node-addon-api/test/async_worker.cc +15 -13
  123. package/vendor/node-addon-api/test/async_worker.js +5 -5
  124. package/vendor/node-addon-api/test/basic_types/value.cc +6 -0
  125. package/vendor/node-addon-api/test/basic_types/value.js +17 -0
  126. package/vendor/node-addon-api/test/binding.cc +8 -0
  127. package/vendor/node-addon-api/test/binding.gyp +23 -1
  128. package/vendor/node-addon-api/test/buffer.js +1 -2
  129. package/vendor/node-addon-api/test/common/index.js +1 -1
  130. package/vendor/node-addon-api/test/except_all.cc +22 -0
  131. package/vendor/node-addon-api/test/except_all.js +14 -0
  132. package/vendor/node-addon-api/test/exports.js +19 -0
  133. package/vendor/node-addon-api/test/finalizer_order.cc +152 -0
  134. package/vendor/node-addon-api/test/finalizer_order.js +98 -0
  135. package/vendor/node-addon-api/test/function.js +2 -2
  136. package/vendor/node-addon-api/test/function_reference.js +2 -2
  137. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +4 -4
  138. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +4 -4
  139. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +3 -3
  140. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +5 -5
  141. package/vendor/node-addon-api/test/name.cc +10 -8
  142. package/vendor/node-addon-api/test/object/delete_property.cc +5 -5
  143. package/vendor/node-addon-api/test/object/get_property.cc +5 -5
  144. package/vendor/node-addon-api/test/object/has_own_property.cc +4 -4
  145. package/vendor/node-addon-api/test/object/has_property.cc +5 -5
  146. package/vendor/node-addon-api/test/object/object.cc +1 -1
  147. package/vendor/node-addon-api/test/object/set_property.cc +5 -5
  148. package/vendor/node-addon-api/test/object/subscript_operator.cc +3 -3
  149. package/vendor/node-addon-api/test/object_reference.cc +18 -18
  150. package/vendor/node-addon-api/test/promise.cc +75 -0
  151. package/vendor/node-addon-api/test/promise.js +23 -0
  152. package/vendor/node-addon-api/test/require_basic_finalizers/index.js +38 -0
  153. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/addon.cc +12 -0
  154. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/binding.gyp +48 -0
  155. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/index.js +3 -0
  156. package/vendor/node-addon-api/test/require_basic_finalizers/tpl/package.json +11 -0
  157. package/vendor/node-addon-api/test/run_script.cc +1 -1
  158. package/vendor/node-addon-api/test/type_taggable.cc +1 -1
  159. package/vendor/node-addon-api/test/type_taggable.js +3 -4
  160. package/vendor/node-addon-api/test/typedarray.cc +28 -24
  161. package/vendor/node-addon-api/tools/conversion.js +1 -1
  162. package/vendor/node-api-headers/CHANGELOG.md +29 -0
  163. package/vendor/node-api-headers/CREATING_A_RELEASE.md +12 -2
  164. package/vendor/node-api-headers/def/js_native_api.def +6 -1
  165. package/vendor/node-api-headers/def/node_api.def +7 -1
  166. package/vendor/node-api-headers/include/js_native_api.h +56 -24
  167. package/vendor/node-api-headers/include/js_native_api_types.h +27 -0
  168. package/vendor/node-api-headers/include/node_api.h +38 -29
  169. package/vendor/node-api-headers/lib/parse-utils.js +92 -0
  170. package/vendor/node-api-headers/package.json +7 -7
  171. package/vendor/node-api-headers/release-please-config.json +12 -0
  172. package/vendor/node-api-headers/scripts/update-headers.js +63 -12
  173. package/vendor/node-api-headers/scripts/write-symbols.js +1 -1
  174. package/vendor/node-api-headers/symbols.js +17 -1
  175. package/vendor/node-api-headers/test/parse-utils.js +21 -0
  176. package/doc/flat/flat.css +0 -27
  177. package/doc/flat/normal.css +0 -429
  178. package/doc/flat/print.css +0 -29
  179. package/doc/flat/reset.css +0 -41
  180. package/doc/flat/small.css +0 -104
  181. package/doc/flat/static.js +0 -161
  182. package/src/core/libcc/brotli.cc +0 -186
  183. package/src/core/libcc/lz4.cc +0 -197
  184. package/src/core/libcc/miniz.cc +0 -353
  185. package/vendor/node-addon-api/tools/eslint-format.js +0 -79
  186. /package/vendor/node-api-headers/{scripts → lib}/clang-utils.js +0 -0
@@ -20,14 +20,14 @@ class TestWorkerWithUserDefRecv : public AsyncWorker {
20
20
  static void DoWorkWithAsyncRes(const CallbackInfo& info) {
21
21
  Object recv = info[0].As<Object>();
22
22
  Function cb = info[1].As<Function>();
23
- Object resource = info[2].As<Object>();
23
+ Value resource = info[2];
24
24
 
25
25
  TestWorkerWithUserDefRecv* worker = nullptr;
26
26
  if (resource == info.Env().Null()) {
27
27
  worker = new TestWorkerWithUserDefRecv(recv, cb, "TestResource");
28
28
  } else {
29
- worker =
30
- new TestWorkerWithUserDefRecv(recv, cb, "TestResource", resource);
29
+ worker = new TestWorkerWithUserDefRecv(
30
+ recv, cb, "TestResource", resource.As<Object>());
31
31
  }
32
32
 
33
33
  worker->Queue();
@@ -51,15 +51,17 @@ class TestWorkerWithUserDefRecv : public AsyncWorker {
51
51
  };
52
52
 
53
53
  // Using default std::allocator impl, but assuming user can define their own
54
- // alloc/dealloc methods
54
+ // allocate/deallocate methods
55
55
  class CustomAllocWorker : public AsyncWorker {
56
+ using Allocator = std::allocator<CustomAllocWorker>;
57
+
56
58
  public:
57
59
  CustomAllocWorker(Function& cb) : AsyncWorker(cb){};
58
60
  static void DoWork(const CallbackInfo& info) {
59
61
  Function cb = info[0].As<Function>();
60
- std::allocator<CustomAllocWorker> create_alloc;
61
- CustomAllocWorker* newWorker = create_alloc.allocate(1);
62
- create_alloc.construct(newWorker, cb);
62
+ Allocator allocator;
63
+ CustomAllocWorker* newWorker = allocator.allocate(1);
64
+ std::allocator_traits<Allocator>::construct(allocator, newWorker, cb);
63
65
  newWorker->Queue();
64
66
  }
65
67
 
@@ -67,9 +69,9 @@ class CustomAllocWorker : public AsyncWorker {
67
69
  void Execute() override {}
68
70
  void Destroy() override {
69
71
  assert(this->_secretVal == 24);
70
- std::allocator<CustomAllocWorker> deallocer;
71
- deallocer.destroy(this);
72
- deallocer.deallocate(this, 1);
72
+ Allocator allocator;
73
+ std::allocator_traits<Allocator>::destroy(allocator, this);
74
+ allocator.deallocate(this, 1);
73
75
  }
74
76
 
75
77
  private:
@@ -108,7 +110,7 @@ class TestWorker : public AsyncWorker {
108
110
  : AsyncWorker(cb, resource_name, resource) {}
109
111
  TestWorker(Function cb, const char* resource_name)
110
112
  : AsyncWorker(cb, resource_name) {}
111
- bool _succeed;
113
+ bool _succeed{};
112
114
  };
113
115
 
114
116
  class TestWorkerWithResult : public AsyncWorker {
@@ -143,7 +145,7 @@ class TestWorkerWithResult : public AsyncWorker {
143
145
  const char* resource_name,
144
146
  const Object& resource)
145
147
  : AsyncWorker(cb, resource_name, resource) {}
146
- bool _succeed;
148
+ bool _succeed{};
147
149
  };
148
150
 
149
151
  class TestWorkerNoCallback : public AsyncWorker {
@@ -194,7 +196,7 @@ class TestWorkerNoCallback : public AsyncWorker {
194
196
  : AsyncWorker(env, resource_name, resource),
195
197
  _deferred(Napi::Promise::Deferred::New(env)) {}
196
198
  Promise::Deferred _deferred;
197
- bool _succeed;
199
+ bool _succeed{};
198
200
  };
199
201
 
200
202
  class EchoWorker : public AsyncWorker {
@@ -139,7 +139,7 @@ async function test (binding) {
139
139
  {
140
140
  eventName: 'init',
141
141
  type: 'TestResource',
142
- triggerAsyncId: triggerAsyncId,
142
+ triggerAsyncId,
143
143
  resource: { foo: 'fooBar' }
144
144
  },
145
145
  { eventName: 'before' },
@@ -167,7 +167,7 @@ async function test (binding) {
167
167
  {
168
168
  eventName: 'init',
169
169
  type: 'TestResource',
170
- triggerAsyncId: triggerAsyncId,
170
+ triggerAsyncId,
171
171
  resource: { }
172
172
  },
173
173
  { eventName: 'before' },
@@ -194,7 +194,7 @@ async function test (binding) {
194
194
  {
195
195
  eventName: 'init',
196
196
  type: 'TestResource',
197
- triggerAsyncId: triggerAsyncId,
197
+ triggerAsyncId,
198
198
  resource: { foo: 'foo' }
199
199
  },
200
200
  { eventName: 'before' },
@@ -224,7 +224,7 @@ async function test (binding) {
224
224
  {
225
225
  eventName: 'init',
226
226
  type: 'TestResource',
227
- triggerAsyncId: triggerAsyncId,
227
+ triggerAsyncId,
228
228
  resource: { foo: 'foo' }
229
229
  },
230
230
  { eventName: 'before' },
@@ -252,7 +252,7 @@ async function test (binding) {
252
252
  {
253
253
  eventName: 'init',
254
254
  type: 'TestResource',
255
- triggerAsyncId: triggerAsyncId,
255
+ triggerAsyncId,
256
256
  resource: { foo: 'foo' }
257
257
  },
258
258
  { eventName: 'before' },
@@ -128,6 +128,11 @@ static Value ToObject(const CallbackInfo& info) {
128
128
  return MaybeUnwrap(info[0].ToObject());
129
129
  }
130
130
 
131
+ static Value AccessProp(const CallbackInfo& info) {
132
+ Object obj = MaybeUnwrap(info[0].ToObject());
133
+ return obj[info[1]].AsValue();
134
+ }
135
+
131
136
  Object InitBasicTypesValue(Env env) {
132
137
  Object exports = Object::New(env);
133
138
 
@@ -150,6 +155,7 @@ Object InitBasicTypesValue(Env env) {
150
155
  exports["toNumber"] = Function::New(env, ToNumber);
151
156
  exports["toString"] = Function::New(env, ToString);
152
157
  exports["toObject"] = Function::New(env, ToObject);
158
+ exports["accessProp"] = Function::New(env, AccessProp);
153
159
 
154
160
  exports["strictlyEquals"] = Function::New(env, StrictlyEquals);
155
161
  exports["strictlyEqualsOverload"] = Function::New(env, StrictEqualsOverload);
@@ -117,6 +117,21 @@ function test (binding) {
117
117
  assert(value.assertNonEmptyReturnValOnCast());
118
118
  }
119
119
 
120
+ function accessPropTest (value) {
121
+ const testObject = { key: '123' };
122
+ const testSymbol = Symbol('123');
123
+ const testNumber = 123;
124
+ const destObj = {
125
+ testObject,
126
+ testSymbol,
127
+ [testNumber]: testNumber
128
+ };
129
+ assert.strictEqual(value.accessProp(destObj, 'testObject'), testObject);
130
+ assert.strictEqual(value.accessProp(destObj, 'testSymbol'), testSymbol);
131
+ assert.strictEqual(value.accessProp(destObj, testNumber), testNumber);
132
+ assert.strictEqual(value.accessProp(destObj, 'invalidKey'), undefined);
133
+ }
134
+
120
135
  const value = binding.basic_types_value;
121
136
 
122
137
  assertValueStrictlyEqual(value);
@@ -153,4 +168,6 @@ function test (binding) {
153
168
  assert.strictEqual(value.toString(null), 'null');
154
169
 
155
170
  typeConverterTest(value.toObject, Object);
171
+
172
+ accessPropTest(value);
156
173
  }
@@ -86,6 +86,7 @@ Object InitEnvMiscellaneous(Env env);
86
86
  #if defined(NODE_ADDON_API_ENABLE_MAYBE)
87
87
  Object InitMaybeCheck(Env env);
88
88
  #endif
89
+ Object InitFinalizerOrder(Env env);
89
90
 
90
91
  Object Init(Env env, Object exports) {
91
92
  #if (NAPI_VERSION > 5)
@@ -186,6 +187,13 @@ Object Init(Env env, Object exports) {
186
187
  #if defined(NODE_ADDON_API_ENABLE_MAYBE)
187
188
  exports.Set("maybe_check", InitMaybeCheck(env));
188
189
  #endif
190
+
191
+ exports.Set("finalizer_order", InitFinalizerOrder(env));
192
+
193
+ exports.Set(
194
+ "isExperimental",
195
+ Napi::Boolean::New(env, NAPI_VERSION == NAPI_VERSION_EXPERIMENTAL));
196
+
189
197
  return exports;
190
198
  }
191
199
 
@@ -30,6 +30,7 @@
30
30
  'error.cc',
31
31
  'error_handling_for_primitives.cc',
32
32
  'external.cc',
33
+ 'finalizer_order.cc',
33
34
  'function.cc',
34
35
  'function_reference.cc',
35
36
  'handlescope.cc',
@@ -84,21 +85,42 @@
84
85
  'binding-swallowexcept.cc',
85
86
  'error.cc',
86
87
  ],
88
+ 'build_sources_except_all': [
89
+ 'except_all.cc',
90
+ ],
87
91
  'build_sources_type_check': [
88
92
  'value_type_cast.cc'
89
93
  ],
94
+ 'want_coverage': '<!(node -p process.env.npm_config_coverage)',
95
+ 'use_node_api_headers': '<!(node -p process.env.use_node_api_headers)',
90
96
  'conditions': [
91
97
  ['disable_deprecated!="true"', {
92
98
  'build_sources': ['object/object_deprecated.cc']
93
99
  }]
94
100
  ]
95
101
  },
102
+ 'conditions': [
103
+ ['want_coverage=="true" and OS=="linux"', {
104
+ 'cflags_cc': ['--coverage'],
105
+ 'ldflags': ['--coverage'],
106
+ }],
107
+ ['use_node_api_headers=="true"', {
108
+ # prepend to the include_dirs list
109
+ 'include_dirs+': ["<!(node -p \"require('node-api-headers').include_dir\")"],
110
+ }],
111
+ ],
96
112
  },
97
113
  'targets': [
98
114
  {
99
115
  'target_name': 'binding',
100
116
  'dependencies': ['../node_addon_api.gyp:node_addon_api_except'],
101
- 'sources': ['>@(build_sources)']
117
+ 'sources': ['>@(build_sources)'],
118
+ 'defines': ['NODE_ADDON_API_ENABLE_TYPE_CHECK_ON_AS']
119
+ },
120
+ {
121
+ 'target_name': 'binding_except_all',
122
+ 'dependencies': ['../node_addon_api.gyp:node_addon_api_except_all'],
123
+ 'sources': [ '>@(build_sources_except_all)']
102
124
  },
103
125
  {
104
126
  'target_name': 'binding_noexcept',
@@ -2,7 +2,6 @@
2
2
 
3
3
  const assert = require('assert');
4
4
  const testUtil = require('./testUtil');
5
- const safeBuffer = require('safe-buffer');
6
5
 
7
6
  module.exports = require('./common').runTest(test);
8
7
 
@@ -14,7 +13,7 @@ function test (binding) {
14
13
  binding.buffer.checkBuffer(test);
15
14
  assert.ok(test instanceof Buffer);
16
15
 
17
- const test2 = safeBuffer.Buffer.alloc(test.length);
16
+ const test2 = Buffer.alloc(test.length);
18
17
  test.copy(test2);
19
18
  binding.buffer.checkBuffer(test2);
20
19
  },
@@ -142,7 +142,7 @@ async function checkBuildType (buildType) {
142
142
 
143
143
  async function whichBuildType () {
144
144
  let buildType = 'Release';
145
- const envBuildType = process.env.NODE_API_BUILD_CONFIG;
145
+ const envBuildType = process.env.NODE_API_BUILD_CONFIG || (process.env.npm_config_debug === 'true' ? 'Debug' : 'Release');
146
146
  if (envBuildType) {
147
147
  if (Object.values(buildTypes).includes(envBuildType)) {
148
148
  if (await checkBuildType(envBuildType)) {
@@ -0,0 +1,22 @@
1
+ #include <stdexcept>
2
+ #include "napi.h"
3
+
4
+ using namespace Napi;
5
+
6
+ void ThrowStdException(const CallbackInfo& info) {
7
+ std::string message = info[0].As<String>().Utf8Value();
8
+ throw std::runtime_error(message);
9
+ }
10
+
11
+ void ThrowPrimitiveException(const CallbackInfo&) {
12
+ throw 0;
13
+ }
14
+
15
+ Object Init(Env env, Object exports) {
16
+ exports.Set("throwStdException", Napi::Function::New(env, ThrowStdException));
17
+ exports.Set("throwPrimitiveException",
18
+ Napi::Function::New(env, ThrowPrimitiveException));
19
+ return exports;
20
+ }
21
+
22
+ NODE_API_MODULE(addon, Init)
@@ -0,0 +1,14 @@
1
+ 'use strict';
2
+
3
+ const assert = require('assert');
4
+
5
+ module.exports = require('./common').runTestWithBuildType(test);
6
+
7
+ function test (buildType) {
8
+ const binding = require(`./build/${buildType}/binding_except_all.node`);
9
+
10
+ const message = 'error message';
11
+ assert.throws(binding.throwStdException.bind(undefined, message), { message });
12
+
13
+ assert.throws(binding.throwPrimitiveException.bind(undefined), { message: 'A native exception was thrown' });
14
+ }
@@ -0,0 +1,19 @@
1
+ 'use strict';
2
+
3
+ const { strictEqual } = require('assert');
4
+ const { valid } = require('semver');
5
+
6
+ const nodeAddonApi = require('../');
7
+
8
+ module.exports = function test () {
9
+ strictEqual(nodeAddonApi.include.startsWith('"'), true);
10
+ strictEqual(nodeAddonApi.include.endsWith('"'), true);
11
+ strictEqual(nodeAddonApi.include.includes('node-addon-api'), true);
12
+ strictEqual(nodeAddonApi.include_dir, '');
13
+ strictEqual(nodeAddonApi.gyp, 'node_api.gyp:nothing');
14
+ strictEqual(nodeAddonApi.targets, 'node_addon_api.gyp');
15
+ strictEqual(valid(nodeAddonApi.version), true);
16
+ strictEqual(nodeAddonApi.version, require('../package.json').version);
17
+ strictEqual(nodeAddonApi.isNodeApiBuiltin, true);
18
+ strictEqual(nodeAddonApi.needsFlag, false);
19
+ };
@@ -0,0 +1,152 @@
1
+ #include <napi.h>
2
+
3
+ namespace {
4
+ class Test : public Napi::ObjectWrap<Test> {
5
+ public:
6
+ Test(const Napi::CallbackInfo& info) : Napi::ObjectWrap<Test>(info) {
7
+ basicFinalizerCalled = false;
8
+ finalizerCalled = false;
9
+
10
+ if (info.Length() > 0) {
11
+ finalizeCb_ = Napi::Persistent(info[0].As<Napi::Function>());
12
+ }
13
+ }
14
+
15
+ static void Initialize(Napi::Env env, Napi::Object exports) {
16
+ exports.Set("Test",
17
+ DefineClass(env,
18
+ "Test",
19
+ {
20
+ StaticAccessor("isBasicFinalizerCalled",
21
+ &IsBasicFinalizerCalled,
22
+ nullptr,
23
+ napi_default),
24
+ StaticAccessor("isFinalizerCalled",
25
+ &IsFinalizerCalled,
26
+ nullptr,
27
+ napi_default),
28
+ }));
29
+ }
30
+
31
+ void Finalize(Napi::BasicEnv /*env*/) { basicFinalizerCalled = true; }
32
+
33
+ void Finalize(Napi::Env /*env*/) {
34
+ finalizerCalled = true;
35
+ if (!finalizeCb_.IsEmpty()) {
36
+ finalizeCb_.Call({});
37
+ }
38
+ }
39
+
40
+ static Napi::Value IsBasicFinalizerCalled(const Napi::CallbackInfo& info) {
41
+ return Napi::Boolean::New(info.Env(), basicFinalizerCalled);
42
+ }
43
+
44
+ static Napi::Value IsFinalizerCalled(const Napi::CallbackInfo& info) {
45
+ return Napi::Boolean::New(info.Env(), finalizerCalled);
46
+ }
47
+
48
+ private:
49
+ Napi::FunctionReference finalizeCb_;
50
+
51
+ static bool basicFinalizerCalled;
52
+ static bool finalizerCalled;
53
+ };
54
+
55
+ bool Test::basicFinalizerCalled = false;
56
+ bool Test::finalizerCalled = false;
57
+
58
+ bool externalBasicFinalizerCalled = false;
59
+ bool externalFinalizerCalled = false;
60
+
61
+ Napi::Value CreateExternalBasicFinalizer(const Napi::CallbackInfo& info) {
62
+ externalBasicFinalizerCalled = false;
63
+ return Napi::External<int>::New(
64
+ info.Env(), new int(1), [](Napi::BasicEnv /*env*/, int* data) {
65
+ externalBasicFinalizerCalled = true;
66
+ delete data;
67
+ });
68
+ }
69
+
70
+ Napi::Value CreateExternalFinalizer(const Napi::CallbackInfo& info) {
71
+ externalFinalizerCalled = false;
72
+ return Napi::External<int>::New(
73
+ info.Env(), new int(1), [](Napi::Env /*env*/, int* data) {
74
+ externalFinalizerCalled = true;
75
+ delete data;
76
+ });
77
+ }
78
+
79
+ Napi::Value isExternalBasicFinalizerCalled(const Napi::CallbackInfo& info) {
80
+ return Napi::Boolean::New(info.Env(), externalBasicFinalizerCalled);
81
+ }
82
+
83
+ Napi::Value IsExternalFinalizerCalled(const Napi::CallbackInfo& info) {
84
+ return Napi::Boolean::New(info.Env(), externalFinalizerCalled);
85
+ }
86
+
87
+ #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
88
+ Napi::Value PostFinalizer(const Napi::CallbackInfo& info) {
89
+ auto env = info.Env();
90
+
91
+ env.PostFinalizer([callback = Napi::Persistent(info[0].As<Napi::Function>())](
92
+ Napi::Env /*env*/) { callback.Call({}); });
93
+
94
+ return env.Undefined();
95
+ }
96
+
97
+ Napi::Value PostFinalizerWithData(const Napi::CallbackInfo& info) {
98
+ auto env = info.Env();
99
+
100
+ env.PostFinalizer(
101
+ [callback = Napi::Persistent(info[0].As<Napi::Function>())](
102
+ Napi::Env /*env*/, Napi::Reference<Napi::Value>* data) {
103
+ callback.Call({data->Value()});
104
+ delete data;
105
+ },
106
+ new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])));
107
+
108
+ return env.Undefined();
109
+ }
110
+
111
+ Napi::Value PostFinalizerWithDataAndHint(const Napi::CallbackInfo& info) {
112
+ auto env = info.Env();
113
+
114
+ env.PostFinalizer(
115
+ [callback = Napi::Persistent(info[0].As<Napi::Function>())](
116
+ Napi::Env /*env*/,
117
+ Napi::Reference<Napi::Value>* data,
118
+ Napi::Reference<Napi::Value>* hint) {
119
+ callback.Call({data->Value(), hint->Value()});
120
+ delete data;
121
+ delete hint;
122
+ },
123
+ new Napi::Reference<Napi::Value>(Napi::Persistent(info[1])),
124
+ new Napi::Reference<Napi::Value>(Napi::Persistent(info[2])));
125
+
126
+ return env.Undefined();
127
+ }
128
+ #endif
129
+
130
+ } // namespace
131
+
132
+ Napi::Object InitFinalizerOrder(Napi::Env env) {
133
+ Napi::Object exports = Napi::Object::New(env);
134
+ Test::Initialize(env, exports);
135
+ exports["createExternalBasicFinalizer"] =
136
+ Napi::Function::New(env, CreateExternalBasicFinalizer);
137
+ exports["createExternalFinalizer"] =
138
+ Napi::Function::New(env, CreateExternalFinalizer);
139
+ exports["isExternalBasicFinalizerCalled"] =
140
+ Napi::Function::New(env, isExternalBasicFinalizerCalled);
141
+ exports["isExternalFinalizerCalled"] =
142
+ Napi::Function::New(env, IsExternalFinalizerCalled);
143
+
144
+ #ifdef NODE_API_EXPERIMENTAL_HAS_POST_FINALIZER
145
+ exports["PostFinalizer"] = Napi::Function::New(env, PostFinalizer);
146
+ exports["PostFinalizerWithData"] =
147
+ Napi::Function::New(env, PostFinalizerWithData);
148
+ exports["PostFinalizerWithDataAndHint"] =
149
+ Napi::Function::New(env, PostFinalizerWithDataAndHint);
150
+ #endif
151
+ return exports;
152
+ }
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ /* eslint-disable no-unused-vars */
4
+
5
+ const assert = require('assert');
6
+ const common = require('./common');
7
+ const testUtil = require('./testUtil');
8
+
9
+ module.exports = require('./common').runTest(test);
10
+
11
+ function test (binding) {
12
+ const { isExperimental } = binding;
13
+
14
+ let isCallbackCalled = false;
15
+
16
+ const tests = [
17
+ 'Finalizer Order - ObjectWrap',
18
+ () => {
19
+ let test = new binding.finalizer_order.Test(() => { isCallbackCalled = true; });
20
+ test = null;
21
+
22
+ global.gc();
23
+
24
+ if (isExperimental) {
25
+ assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [before ticking]');
26
+ assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
27
+ assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
28
+ } else {
29
+ assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, false, 'Expected basic finalizer to not be called [before ticking]');
30
+ assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, false, 'Expected (extended) finalizer to not be called [before ticking]');
31
+ assert.strictEqual(isCallbackCalled, false, 'Expected callback to not be called [before ticking]');
32
+ }
33
+ },
34
+ () => {
35
+ assert.strictEqual(binding.finalizer_order.Test.isBasicFinalizerCalled, true, 'Expected basic finalizer to be called [after ticking]');
36
+ assert.strictEqual(binding.finalizer_order.Test.isFinalizerCalled, true, 'Expected (extended) finalizer to be called [after ticking]');
37
+ assert.strictEqual(isCallbackCalled, true, 'Expected callback to be called [after ticking]');
38
+ },
39
+
40
+ 'Finalizer Order - External with Basic Finalizer',
41
+ () => {
42
+ let ext = binding.finalizer_order.createExternalBasicFinalizer();
43
+ ext = null;
44
+ global.gc();
45
+
46
+ if (isExperimental) {
47
+ assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [before ticking]');
48
+ } else {
49
+ assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), false, 'Expected External basic finalizer to not be called [before ticking]');
50
+ }
51
+ },
52
+ () => {
53
+ assert.strictEqual(binding.finalizer_order.isExternalBasicFinalizerCalled(), true, 'Expected External basic finalizer to be called [after ticking]');
54
+ },
55
+
56
+ 'Finalizer Order - External with Finalizer',
57
+ () => {
58
+ let ext = binding.finalizer_order.createExternalFinalizer();
59
+ ext = null;
60
+ global.gc();
61
+ assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), false, 'Expected External extended finalizer to not be called [before ticking]');
62
+ },
63
+ () => {
64
+ assert.strictEqual(binding.finalizer_order.isExternalFinalizerCalled(), true, 'Expected External extended finalizer to be called [after ticking]');
65
+ }
66
+ ];
67
+
68
+ if (binding.isExperimental) {
69
+ tests.push(...[
70
+ 'PostFinalizer',
71
+ () => {
72
+ binding.finalizer_order.PostFinalizer(common.mustCall());
73
+ },
74
+
75
+ 'PostFinalizerWithData',
76
+ () => {
77
+ const data = {};
78
+ const callback = (callbackData) => {
79
+ assert.strictEqual(callbackData, data);
80
+ };
81
+ binding.finalizer_order.PostFinalizerWithData(common.mustCall(callback), data);
82
+ },
83
+
84
+ 'PostFinalizerWithDataAndHint',
85
+ () => {
86
+ const data = {};
87
+ const hint = {};
88
+ const callback = (callbackData, callbackHint) => {
89
+ assert.strictEqual(callbackData, data);
90
+ assert.strictEqual(callbackHint, hint);
91
+ };
92
+ binding.finalizer_order.PostFinalizerWithDataAndHint(common.mustCall(callback), data, hint);
93
+ }
94
+ ]);
95
+ }
96
+
97
+ return testUtil.runGCTests(tests);
98
+ }
@@ -18,7 +18,7 @@ function test (binding) {
18
18
 
19
19
  assert.deepStrictEqual(binding.valueCallback(), { foo: 'bar' });
20
20
 
21
- /* eslint-disable-next-line no-new, new-cap */
21
+ /* eslint-disable-next-line new-cap */
22
22
  assert.strictEqual(new binding.newTargetCallback(), binding.newTargetCallback);
23
23
  assert.strictEqual(binding.newTargetCallback(), undefined);
24
24
 
@@ -89,7 +89,7 @@ function test (binding) {
89
89
  assert.deepStrictEqual(args, [7, 8, 9]);
90
90
 
91
91
  assert.throws(() => {
92
- binding.callWithInvalidReceiver();
92
+ binding.callWithInvalidReceiver(() => {});
93
93
  }, /Invalid (pointer passed as )?argument/);
94
94
 
95
95
  obj = binding.callConstructorWithArgs(testConstructor, 5, 6, 7);
@@ -95,7 +95,7 @@ async function canCallAsyncFunctionWithDifferentOverloads (binding) {
95
95
  {
96
96
  eventName: 'init',
97
97
  type: 'func_ref_resources',
98
- triggerAsyncId: triggerAsyncId,
98
+ triggerAsyncId,
99
99
  resource: {}
100
100
  },
101
101
  { eventName: 'before' },
@@ -113,7 +113,7 @@ async function canCallAsyncFunctionWithDifferentOverloads (binding) {
113
113
  {
114
114
  eventName: 'init',
115
115
  type: 'func_ref_resources',
116
- triggerAsyncId: triggerAsyncId,
116
+ triggerAsyncId,
117
117
  resource: {}
118
118
  },
119
119
  { eventName: 'before' },
@@ -5,27 +5,27 @@ using namespace Napi;
5
5
 
6
6
  Value DeletePropertyWithCStyleStringAsKey(const CallbackInfo& info) {
7
7
  Object globalObject = info.Env().Global();
8
- String key = info[0].As<String>();
8
+ String key = info[0].UnsafeAs<String>();
9
9
  return Boolean::New(
10
10
  info.Env(), MaybeUnwrap(globalObject.Delete(key.Utf8Value().c_str())));
11
11
  }
12
12
 
13
13
  Value DeletePropertyWithCppStyleStringAsKey(const CallbackInfo& info) {
14
14
  Object globalObject = info.Env().Global();
15
- String key = info[0].As<String>();
15
+ String key = info[0].UnsafeAs<String>();
16
16
  return Boolean::New(info.Env(),
17
17
  MaybeUnwrap(globalObject.Delete(key.Utf8Value())));
18
18
  }
19
19
 
20
20
  Value DeletePropertyWithInt32AsKey(const CallbackInfo& info) {
21
21
  Object globalObject = info.Env().Global();
22
- Number key = info[0].As<Number>();
22
+ Number key = info[0].UnsafeAs<Number>();
23
23
  return Boolean::New(info.Env(),
24
24
  MaybeUnwrap(globalObject.Delete(key.Uint32Value())));
25
25
  }
26
26
 
27
27
  Value DeletePropertyWithNapiValueAsKey(const CallbackInfo& info) {
28
28
  Object globalObject = info.Env().Global();
29
- Name key = info[0].As<Name>();
29
+ Name key = info[0].UnsafeAs<Name>();
30
30
  return Boolean::New(info.Env(), MaybeUnwrap(globalObject.Delete(key)));
31
31
  }