13
13
#endif
14
14
15
15
#ifdef __APPLE__
16
+
16
17
#include < CoreFoundation/CFString.h>
17
18
extern " C" void NSLog (CFStringRef format, ...);
19
+
20
+ #if defined(__has_include)
21
+ #if __has_include(<os/log.h>)
22
+ #include < os/log.h>
23
+ #define TNS_HAVE_OS_LOG 1
24
+ #else
25
+ #define TNS_HAVE_OS_LOG 0
26
+ #endif
27
+ #else
28
+ #define TNS_HAVE_OS_LOG 0
29
+ #endif
30
+
18
31
#else
19
32
#include < iostream>
20
33
#endif
@@ -76,7 +89,7 @@ std::string transformJSObject(napi_env env, napi_value object) {
76
89
return JsonStringifyObject (env, object, false );
77
90
}
78
91
79
- std::string buildStringFromArg (napi_env env, napi_value val) {
92
+ std::string buildStringFromArg (napi_env env, napi_value val, napi_value inspectSymbol ) {
80
93
napi_valuetype type;
81
94
napi_typeof (env, val, &type);
82
95
@@ -105,7 +118,7 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
105
118
if (isStrictEqual) {
106
119
arrayStr << " [Circular]" ;
107
120
} else {
108
- std::string elementString = buildStringFromArg (env, propertyValue);
121
+ std::string elementString = buildStringFromArg (env, propertyValue, inspectSymbol );
109
122
arrayStr << elementString;
110
123
}
111
124
@@ -117,6 +130,13 @@ std::string buildStringFromArg(napi_env env, napi_value val) {
117
130
arrayStr << " ]" ;
118
131
return arrayStr.str ();
119
132
} else if (type == napi_object) {
133
+ napi_value inspectFunc = nullptr ;
134
+ napi_status getInspectStatus = napi_get_property (env, val, inspectSymbol, &inspectFunc);
135
+ if (getInspectStatus == napi_ok && napi_util::is_of_type (env, inspectFunc, napi_function)) {
136
+ napi_value inspectedValue;
137
+ napi_call_function (env, val, inspectFunc, 0 , nullptr , &inspectedValue);
138
+ return buildStringFromArg (env, inspectedValue, inspectSymbol);
139
+ }
120
140
return transformJSObject (env, val);
121
141
} else if (type == napi_symbol) {
122
142
napi_value symString;
@@ -133,6 +153,14 @@ std::string buildLogString(napi_env env, napi_callback_info info,
133
153
int startingIndex = 0 ) {
134
154
NAPI_CALLBACK_BEGIN_VARGS ()
135
155
156
+ napi_value global, Symbol, SymbolFor, symbolDescription, inspectSymbol;
157
+ napi_get_global (env, &global);
158
+ napi_get_named_property (env, global, " Symbol" , &Symbol);
159
+ napi_get_named_property (env, Symbol, " for" , &SymbolFor);
160
+ napi_create_string_utf8 (env, " nodejs.util.inspect.custom" , NAPI_AUTO_LENGTH,
161
+ &symbolDescription);
162
+ napi_call_function (env, global, SymbolFor, 1 , &symbolDescription, &inspectSymbol);
163
+
136
164
std::stringstream ss;
137
165
138
166
if (argc) {
@@ -142,7 +170,7 @@ std::string buildLogString(napi_env env, napi_callback_info info,
142
170
ss << " " ;
143
171
}
144
172
145
- std::string argString = buildStringFromArg (env, argv[i]);
173
+ std::string argString = buildStringFromArg (env, argv[i], inspectSymbol );
146
174
ss << argString;
147
175
}
148
176
} else {
@@ -188,14 +216,6 @@ JS_METHOD(Console::Log) {
188
216
napi_value argv[argc];
189
217
napi_get_cb_info (env, cbinfo, &argc, argv, nullptr , nullptr );
190
218
191
- napi_value global, Symbol, SymbolFor, symbolDescription, symbol;
192
- napi_get_global (env, &global);
193
- napi_get_named_property (env, global, " Symbol" , &Symbol);
194
- napi_get_named_property (env, Symbol, " for" , &SymbolFor);
195
- napi_create_string_utf8 (env, " nodejs.util.inspect.custom" , NAPI_AUTO_LENGTH,
196
- &symbolDescription);
197
- napi_call_function (env, global, SymbolFor, 1 , &symbolDescription, &symbol);
198
-
199
219
std::stringstream log;
200
220
201
221
// TODO(dj): what if we made this pretty?
@@ -227,7 +247,11 @@ JS_METHOD(Console::Log) {
227
247
std::string logString = log.str ();
228
248
229
249
#ifdef __APPLE__
250
+ #if TNS_HAVE_OS_LOG
251
+ os_log (OS_LOG_DEFAULT, " %{public}s" , logString.c_str ());
252
+ #else
230
253
NSLog (CFSTR(" %s" ), logString.c_str());
254
+ #endif
231
255
#else
232
256
switch (stream) {
233
257
case kConsoleLogTypeLog :
0 commit comments