Skip to content

Commit 951adbe

Browse files
addaleaxMylesBorins
authored andcommittedApr 16, 2018
n-api: add napi_get_node_version
Add `napi_get_node_version`, to help with feature-detecting Node.js as an environment. Backport-PR-URL: #19447 PR-URL: #14696 Reviewed-By: Kyle Farnung <kfarnung@microsoft.com> Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
1 parent b29eb69 commit 951adbe

File tree

8 files changed

+87
-1
lines changed

8 files changed

+87
-1
lines changed
 

‎doc/api/n-api.md

+31
Original file line numberDiff line numberDiff line change
@@ -3285,6 +3285,35 @@ callback invocation, even if it has been successfully cancelled.
32853285

32863286
## Version Management
32873287

3288+
### napi_get_node_version
3289+
<!-- YAML
3290+
added: REPLACEME
3291+
-->
3292+
3293+
```C
3294+
typedef struct {
3295+
uint32_t major;
3296+
uint32_t minor;
3297+
uint32_t patch;
3298+
const char* release;
3299+
} napi_node_version;
3300+
3301+
NAPI_EXTERN
3302+
napi_status napi_get_node_version(napi_env env,
3303+
const napi_node_version** version);
3304+
```
3305+
3306+
- `[in] env`: The environment that the API is invoked under.
3307+
- `[out] version`: A pointer to version information for Node itself.
3308+
3309+
Returns `napi_ok` if the API succeeded.
3310+
3311+
This function fills the `version` struct with the major, minor and patch version
3312+
of Node that is currently running, and the `release` field with the
3313+
value of [`process.release.name`][`process.release`].
3314+
3315+
The returned buffer is statically allocated and does not need to be freed.
3316+
32883317
### napi_get_version
32893318
<!-- YAML
32903319
added: REPLACEME
@@ -3369,3 +3398,5 @@ support it:
33693398
[`napi_throw_type_error`]: #n_api_napi_throw_type_error
33703399
[`napi_unwrap`]: #n_api_napi_unwrap
33713400
[`napi_wrap`]: #n_api_napi_wrap
3401+
3402+
[`process.release`]: process.html#process_process_release

‎src/node.cc

+2-1
Original file line numberDiff line numberDiff line change
@@ -3254,7 +3254,8 @@ void SetupProcessObject(Environment* env,
32543254
// process.release
32553255
Local<Object> release = Object::New(env->isolate());
32563256
READONLY_PROPERTY(process, "release", release);
3257-
READONLY_PROPERTY(release, "name", OneByteString(env->isolate(), "node"));
3257+
READONLY_PROPERTY(release, "name",
3258+
OneByteString(env->isolate(), NODE_RELEASE));
32583259

32593260
#if NODE_VERSION_IS_LTS
32603261
READONLY_PROPERTY(release, "lts",

‎src/node_api.cc

+14
Original file line numberDiff line numberDiff line change
@@ -3122,6 +3122,20 @@ napi_status napi_get_version(napi_env env, uint32_t* result) {
31223122
return napi_clear_last_error(env);
31233123
}
31243124

3125+
napi_status napi_get_node_version(napi_env env,
3126+
const napi_node_version** result) {
3127+
CHECK_ENV(env);
3128+
CHECK_ARG(env, result);
3129+
static const napi_node_version version = {
3130+
NODE_MAJOR_VERSION,
3131+
NODE_MINOR_VERSION,
3132+
NODE_PATCH_VERSION,
3133+
NODE_RELEASE
3134+
};
3135+
*result = &version;
3136+
return napi_clear_last_error(env);
3137+
}
3138+
31253139
namespace uvimpl {
31263140

31273141
static napi_status ConvertUVErrorCode(int code) {

‎src/node_api.h

+4
Original file line numberDiff line numberDiff line change
@@ -536,6 +536,10 @@ NAPI_EXTERN napi_status napi_cancel_async_work(napi_env env,
536536
// version management
537537
NAPI_EXTERN napi_status napi_get_version(napi_env env, uint32_t* result);
538538

539+
NAPI_EXTERN
540+
napi_status napi_get_node_version(napi_env env,
541+
const napi_node_version** version);
542+
539543
EXTERN_C_END
540544

541545
#endif // SRC_NODE_API_H_

‎src/node_api_types.h

+7
Original file line numberDiff line numberDiff line change
@@ -102,4 +102,11 @@ typedef struct {
102102
napi_status error_code;
103103
} napi_extended_error_info;
104104

105+
typedef struct {
106+
uint32_t major;
107+
uint32_t minor;
108+
uint32_t patch;
109+
const char* release;
110+
} napi_node_version;
111+
105112
#endif // SRC_NODE_API_TYPES_H_

‎src/node_version.h

+4
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@
1515
#define NODE_STRINGIFY_HELPER(n) #n
1616
#endif
1717

18+
#ifndef NODE_RELEASE
19+
#define NODE_RELEASE "node"
20+
#endif
21+
1822
#ifndef NODE_TAG
1923
# if NODE_VERSION_IS_RELEASE
2024
# define NODE_TAG ""

‎test/addons-napi/test_general/test.js

+5
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ assert.ok(test_general.testGetPrototype(baseObject) !==
3535
// expected version is currently 1
3636
assert.strictEqual(test_general.testGetVersion(), 1);
3737

38+
const [ major, minor, patch, release ] = test_general.testGetNodeVersion();
39+
assert.strictEqual(process.version.split('-')[0],
40+
`v${major}.${minor}.${patch}`);
41+
assert.strictEqual(release, process.release.name);
42+
3843
[
3944
123,
4045
'test string',

‎test/addons-napi/test_general/test_general.c

+20
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,25 @@ napi_value testGetVersion(napi_env env, napi_callback_info info) {
3333
return result;
3434
}
3535

36+
napi_value testGetNodeVersion(napi_env env, napi_callback_info info) {
37+
const napi_node_version* node_version;
38+
napi_value result, major, minor, patch, release;
39+
NAPI_CALL(env, napi_get_node_version(env, &node_version));
40+
NAPI_CALL(env, napi_create_uint32(env, node_version->major, &major));
41+
NAPI_CALL(env, napi_create_uint32(env, node_version->minor, &minor));
42+
NAPI_CALL(env, napi_create_uint32(env, node_version->patch, &patch));
43+
NAPI_CALL(env, napi_create_string_utf8(env,
44+
node_version->release,
45+
(size_t)-1,
46+
&release));
47+
NAPI_CALL(env, napi_create_array_with_length(env, 4, &result));
48+
NAPI_CALL(env, napi_set_element(env, result, 0, major));
49+
NAPI_CALL(env, napi_set_element(env, result, 1, minor));
50+
NAPI_CALL(env, napi_set_element(env, result, 2, patch));
51+
NAPI_CALL(env, napi_set_element(env, result, 3, release));
52+
return result;
53+
}
54+
3655
napi_value doInstanceOf(napi_env env, napi_callback_info info) {
3756
size_t argc = 2;
3857
napi_value args[2];
@@ -142,6 +161,7 @@ void Init(napi_env env, napi_value exports, napi_value module, void* priv) {
142161
DECLARE_NAPI_PROPERTY("testStrictEquals", testStrictEquals),
143162
DECLARE_NAPI_PROPERTY("testGetPrototype", testGetPrototype),
144163
DECLARE_NAPI_PROPERTY("testGetVersion", testGetVersion),
164+
DECLARE_NAPI_PROPERTY("testGetNodeVersion", testGetNodeVersion),
145165
DECLARE_NAPI_PROPERTY("doInstanceOf", doInstanceOf),
146166
DECLARE_NAPI_PROPERTY("getUndefined", getUndefined),
147167
DECLARE_NAPI_PROPERTY("getNull", getNull),

0 commit comments

Comments
 (0)
Please sign in to comment.