diff --git a/.gitignore b/.gitignore index cf74ff1..97c8451 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build +cache test/*.json wcc.exe.c diff --git a/.vscode/settings.json b/.vscode/settings.json index e7045df..6a96ead 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -54,7 +54,23 @@ "ratio": "cpp", "mutex": "cpp", "thread": "cpp", - "variant": "cpp" + "variant": "cpp", + "hash_map": "cpp", + "hash_set": "cpp", + "bitset": "cpp", + "charconv": "cpp", + "cinttypes": "cpp", + "compare": "cpp", + "concepts": "cpp", + "forward_list": "cpp", + "list": "cpp", + "unordered_set": "cpp", + "ranges": "cpp", + "shared_mutex": "cpp", + "span": "cpp", + "stop_token": "cpp", + "cfenv": "cpp", + "typeindex": "cpp" }, "cmake.debugConfig": { "cwd": "/home/msojocs/github/wx-compiler/test/spec/issue/102/wxapp", diff --git a/CMakeLists.txt b/CMakeLists.txt index b3d2de7..0b3dcfd 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,17 +1,13 @@ cmake_minimum_required(VERSION 3.0.0) project(wx_complier VERSION 0.1.0 LANGUAGES C CXX) -set(CMAKE_CXX_STANDARD 11) +set(CMAKE_CXX_STANDARD 14) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) -# set (CMAKE_CXX_STANDARD 14) # set(CMAKE_VERBOSE_MAKEFILE ON) # message("before: ${CMAKE_CXX_FLAGS_DEBUG}") # set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O1") # message("after: ${CMAKE_CXX_FLAGS_DEBUG}") -include(CTest) -enable_testing() - add_executable(wcc src/wcc.cpp src/include/wxml.h @@ -99,9 +95,13 @@ add_executable(test1 # src/wxml/expr_lib/transit_table.cpp # ) +include(CTest) +enable_testing() add_test(transit_table_test $ ) set(CPACK_PROJECT_NAME ${PROJECT_NAME}) set(CPACK_PROJECT_VERSION ${PROJECT_VERSION}) include(CPack) + +add_subdirectory(./src/nwjs) \ No newline at end of file diff --git a/src/nwjs/.gitignore b/src/nwjs/.gitignore new file mode 100644 index 0000000..34beb63 --- /dev/null +++ b/src/nwjs/.gitignore @@ -0,0 +1,3 @@ +node +lib +nw-headers-v*.tar.gz \ No newline at end of file diff --git a/src/nwjs/CMakeLists.txt b/src/nwjs/CMakeLists.txt new file mode 100644 index 0000000..bb06e87 --- /dev/null +++ b/src/nwjs/CMakeLists.txt @@ -0,0 +1,93 @@ +set(NW_VERSION "0.55.0") +message("current dir: ${CMAKE_CURRENT_SOURCE_DIR}") +if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/cache/nw-headers-v${NW_VERSION}.tar.gz") + execute_process( + COMMAND wget -c -O nw-headers-v${NW_VERSION}.tar.gz.tmp https://dl.nwjs.io/v${NW_VERSION}/nw-headers-v${NW_VERSION}.tar.gz; + COMMAND mv nw-headers-v${NW_VERSION}.tar.gz.tmp nw-headers-v${NW_VERSION}.tar.gz; + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cache + OUTPUT_VARIABLE CMAKE_JS_VERSION + OUTPUT_STRIP_TRAILING_WHITESPACE + ) +endif() +execute_process(COMMAND rm -rf ${CMAKE_CURRENT_SOURCE_DIR}/node WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) +if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/node") + execute_process(COMMAND tar -zxf nw-headers-v${NW_VERSION}.tar.gz -C ${CMAKE_CURRENT_SOURCE_DIR} WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cache) +endif() +# if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/node-v${NW_VERSION}.lib") +# execute_process( +# COMMAND wget -c -O node-v${NW_VERSION}.lib.tmp https://dl.nwjs.io/v${NW_VERSION}/node.lib; +# COMMAND mv node-v${NW_VERSION}.lib.tmp node-v${NW_VERSION}.lib; +# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib +# OUTPUT_VARIABLE CMAKE_JS_VERSION +# OUTPUT_STRIP_TRAILING_WHITESPACE +# ) +# endif() +# if(NOT EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/lib/nw-v${NW_VERSION}.lib") +# execute_process( +# COMMAND wget -c -O nw-v${NW_VERSION}.lib.tmp https://dl.nwjs.io/v${NW_VERSION}/nw.lib; +# COMMAND mv nw-v${NW_VERSION}.lib.tmp nw-v${NW_VERSION}.lib; +# WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib +# OUTPUT_VARIABLE CMAKE_JS_VERSION +# OUTPUT_STRIP_TRAILING_WHITESPACE +# ) +# endif() + +include_directories(node/src) +include_directories(node/include/node) +include_directories(node/deps/v8/include) +include_directories(node/deps/uv/include) + +add_library(wcc_node + SHARED + ./wcc.cpp + ./include/wcc.hh + ./config/wcc.cc + ../include/wxml.h + ../include/night.h + ../wcc/usage.cpp + ../wxa/wxa.cpp + ../wxml/rewrite.cpp + ../wxml/name_allocator.cpp + ../wxml/string_templating/common.cpp + ../wxml/string_templating/token.cpp + ../wxml/dom_lib/rvm_op_code_position_recorder.cpp + ../wxml/dom_lib/rvm_op_code_position.cpp + ../wxml/dom_lib/parse_exception.cpp + ../wxml/dom_lib/token.cpp + ../wxml/dom_lib/common.cpp + ../wxml/dom_lib/machine.cpp + ../wxml/dom_lib/tokenizer.cpp + ../wxml/dom_lib/parser.cpp + ../night/night.cpp + ../night/ns_ast_parse.cpp + ../night/ns_compile_js.cpp + ../night/ns_node.cpp + ../night/ns_sourcemap.cpp + ../night/ns_stream.cpp + ../night/ns_token.cpp + ../night/ns_god/ns_god.cpp + ../night/str/str.cpp + ../wxml/rpx.cpp + ../wxml/expr_lib/base.cpp + ../wxml/expr_lib/bnf.cpp + ../wxml/expr_lib/common.cpp + ../wxml/expr_lib/expr_syntax_tree.cpp + ../wxml/expr_lib/parser.cpp + ../wxml/expr_lib/token.cpp + ../wxml/expr_lib/tokenizer.cpp + ../wxml/expr_lib/transit_table.cpp + ../wxml/compiler.cpp + ../wxml/dom_lib/str_cache.cpp + ../wxml/dom_lib/wxml_dom.cpp + ../utils/json.cpp + ../utils/string_utils.cpp + ../utils/file.cpp +) + +# DV8_COMPRESS_POINTERS: 缺少会导致IsString崩溃 +target_compile_options(wcc_node PRIVATE "-DNODE_GYP_MODULE_NAME=binding" "-DUSING_UV_SHARED=1" "-DUSING_V8_SHARED=1" "-DV8_DEPRECATION_WARNINGS=1" "-DV8_DEPRECATION_WARNINGS" "-DV8_REVERSE_JSARGS" "-D_GLIBCXX_USE_CXX11_ABI=1" "-D_LIBCPP_HAS_NO_VENDOR_AVAILABILITY_ANNOTATIONS" "-D_LARGEFILE_SOURCE" "-D_FILE_OFFSET_BITS=64" "-DV8_COMPRESS_POINTERS" "-DV8_31BIT_SMIS_ON_64BIT_ARCH" "-D__STDC_FORMAT_MACROS" "-DOPENSSL_NO_PINSHARED" "-DOPENSSL_THREADS" "-DOPENSSL_NO_ASM" "-DBUILDING_NODE_EXTENSION") +set_target_properties(wcc_node PROPERTIES RUNTIME_OUTPUT_DIRECTORY /home/msojocs/github/wx-compiler/cache/package.nw) +set_target_properties(wcc_node PROPERTIES PREFIX "" SUFFIX ".node") +# target_link_libraries(wcc_node ${CMAKE_CURRENT_SOURCE_DIR}/lib/nw-v${NW_VERSION}.lib) +# target_link_libraries(wcc_node ${CMAKE_CURRENT_SOURCE_DIR}/lib/node-v${NW_VERSION}.lib) + diff --git a/src/nwjs/config/wcc.cc b/src/nwjs/config/wcc.cc new file mode 100644 index 0000000..04cc65b --- /dev/null +++ b/src/nwjs/config/wcc.cc @@ -0,0 +1,168 @@ +#include "../include/wcc.hh" + +namespace wcc_options +{ + using v8::Local; + using v8::NewStringType; + using v8::String; + using v8::Value; + + bool get_boolean_property(v8::Isolate *isolate, v8::Local &src, const char *property_name, bool &out_value) + { + v8::Local key = v8::String::NewFromUtf8(isolate, property_name, v8::NewStringType::kNormal).ToLocalChecked(); + v8::Local value; + v8::Local context = isolate->GetCurrentContext(); + + if (!src->Get(context, key).ToLocal(&value)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!value->IsBoolean()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + "' property must be a boolean").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + out_value = value->BooleanValue(isolate); + return true; + } + + bool get_string_property(v8::Isolate *isolate, v8::Local &src, const char *property_name, std::string &out_value) + { + v8::Local key = v8::String::NewFromUtf8(isolate, property_name, v8::NewStringType::kNormal).ToLocalChecked(); + v8::Local value; + v8::Local context = isolate->GetCurrentContext(); + + if (!src->Get(context, key).ToLocal(&value)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!value->IsString()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + "' property must be a string").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + v8::String::Utf8Value utf8Value(isolate, value); + std::string str(*utf8Value, utf8Value.length()); + out_value = str; + return true; + } + + bool get_vector_string_property(v8::Isolate *isolate, v8::Local &src, const char *property_name, std::vector &out_value) + { + v8::Local key = v8::String::NewFromUtf8(isolate, property_name, v8::NewStringType::kNormal).ToLocalChecked(); + v8::Local value; + v8::Local context = isolate->GetCurrentContext(); + + if (!src->Get(context, key).ToLocal(&value)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!value->IsArray()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + "' property must be a array").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + auto arr = value.As(); + for (int i=0; i < arr->Length(); i++) + { + v8::Local v; + if (!arr->Get(context, i).ToLocal(&v)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!v->IsString()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + std::string("[") + std::to_string(i) +"]' property must be a string").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + v8::String::Utf8Value utf8Value(isolate, v); + std::string str(*utf8Value, utf8Value.length()); + out_value.emplace_back(str); + } + return true; + } + + bool get_map_string_property(v8::Isolate *isolate, v8::Local &src, const char *property_name, std::map &out_value) + { + v8::Local key = v8::String::NewFromUtf8(isolate, property_name, v8::NewStringType::kNormal).ToLocalChecked(); + v8::Local value; + v8::Local context = isolate->GetCurrentContext(); + + if (!src->Get(context, key).ToLocal(&value)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!value->IsObject()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + "' property must be a object").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + auto obj = value.As(); + auto keys = obj->GetPropertyNames(context).ToLocalChecked(); + + for (int i = 0; i < keys->Length(); i++) + { + // key + v8::Local k; + if (!keys->Get(context, i).ToLocal(&k)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!k->IsString()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + std::string("[") + std::to_string(i) +"]' property must be a string").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + + // value + v8::Local v; + if (!obj->Get(context, k).ToLocal(&v)) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("Failed to get '" + std::string(property_name) + "' property").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + if (!v->IsString()) + { + isolate->ThrowException(v8::String::NewFromUtf8(isolate, ("The '" + std::string(property_name) + std::string("[") + std::to_string(i) +"]' property must be a string").c_str(), v8::NewStringType::kNormal).ToLocalChecked()); + return false; + } + v8::String::Utf8Value utf8Value(isolate, k); + std::string kr(*utf8Value, utf8Value.length()); + v8::String::Utf8Value utf8Value2(isolate, v); + std::string vr(*utf8Value2, utf8Value2.length()); + out_value.emplace(kr, vr); + } + + return true; + } + + bool parse_wcc_options(v8::Isolate *isolate, v8::Local &src, WCCOptions *result) + { + Local context = isolate->GetCurrentContext(); + bool ret = get_boolean_property(isolate, src, "verbose", result->verbose) && + get_boolean_property(isolate, src, "debug", result->debug) && + get_boolean_property(isolate, src, "debugWXS", result->debugWXS) && + get_boolean_property(isolate, src, "showNewTree", result->showNewTree) && + get_boolean_property(isolate, src, "isPlugin", result->isPlugin) && + get_boolean_property(isolate, src, "addTestAttre", result->addTestAttre) && + get_boolean_property(isolate, src, "independent", result->independent) && + get_boolean_property(isolate, src, "isCut", result->isCut) && + get_boolean_property(isolate, src, "lazyload", result->lazyload) && + get_string_property(isolate, src, "genfuncname", result->genfuncname) && + get_string_property(isolate, src, "cwd", result->cwd) && + get_string_property(isolate, src, "wxmlCompileConfig", result->wxmlCompileConfig) && + get_string_property(isolate, src, "wxmlCompileConfigSplit", result->wxmlCompileConfigSplit) && + get_string_property(isolate, src, "lazyloadConfig", result->lazyloadConfig) && + get_vector_string_property(isolate, src, "files", result->files) && + get_vector_string_property(isolate, src, "contents", result->contents) && + get_map_string_property(isolate, src, "replaceContent", result->replaceContent); + + return ret; + } +} \ No newline at end of file diff --git a/src/nwjs/config/wcsc.cc b/src/nwjs/config/wcsc.cc new file mode 100644 index 0000000..e69de29 diff --git a/src/nwjs/include/wcc.hh b/src/nwjs/include/wcc.hh new file mode 100644 index 0000000..41d318b --- /dev/null +++ b/src/nwjs/include/wcc.hh @@ -0,0 +1,30 @@ +#ifndef __WCC_HH__ +#define __WCC_HH__ +#include +#include +#include +#include + +struct WCCOptions +{ + std::vector files; + std::vector contents; + std::map replaceContent; + bool verbose = false; + bool debug = false; + bool debugWXS = false; + bool showNewTree = false; + bool isPlugin = false; + bool addTestAttre = false; + bool independent = false; + std::string genfuncname; + bool isCut; + std::string cwd; + bool lazyload = false; + std::string wxmlCompileConfig; + std::string wxmlCompileConfigSplit; + std::string lazyloadConfig; +}; + +bool parse_wcc_options(v8::Isolate *isolate, v8::Local &src, WCCOptions *result); +#endif \ No newline at end of file diff --git a/src/nwjs/wcc.cpp b/src/nwjs/wcc.cpp new file mode 100644 index 0000000..f2b853a --- /dev/null +++ b/src/nwjs/wcc.cpp @@ -0,0 +1,73 @@ +// hello.cc +#include +#include "../include/wxml.h" +#include "./include/wcc.hh" + +namespace wx_compiler +{ + + using v8::Function; + using v8::FunctionCallbackInfo; + using v8::FunctionTemplate; + using v8::Isolate; + using v8::Local; + using v8::NewStringType; + using v8::Object; + using v8::String; + using v8::Value; + + + void Compiler(const FunctionCallbackInfo &args) + { + Isolate *isolate = args.GetIsolate(); + v8::HandleScope scope(isolate); // Ensure we have a proper handle scope. + + // Check if the first argument is an object. + if (args.Length() < 1 || !args[0]->IsObject()) + { + isolate->ThrowException(String::NewFromUtf8(isolate, "Argument must be an object", NewStringType::kNormal).ToLocalChecked()); + return; + } + + // Cast the first argument to an Object. + Local context = isolate->GetCurrentContext(); + Local obj = args[0]->ToObject(context).ToLocalChecked(); + + WCCOptions options; + if(!parse_wcc_options(isolate, obj, &options)) + { + // 选项解析失败 + return; + } + + // TODO: 解析成功,开始编译 + + // Convert the "msg" property to a C++ string and return it. + // String::Utf8Value utf8(isolate, value); + // args.GetReturnValue().Set(String::NewFromUtf8(isolate, *utf8, NewStringType::kNormal).ToLocalChecked()); + } + + void Initialize(Local exports, Local module) + { + + Isolate *isolate = exports->GetIsolate(); + auto context = isolate->GetCurrentContext(); + + std::string versionInfo; + WXML::Compiler::GetVersionInfo(versionInfo, "global"); + + // Set the module.exports to be a function + Local tpl = FunctionTemplate::New(isolate, Compiler); + Local fn = tpl->GetFunction(context).ToLocalChecked(); + + // Set the 'version' property on the function + fn->Set(context, String::NewFromUtf8(isolate, "version", NewStringType::kNormal).ToLocalChecked(), + String::NewFromUtf8(isolate, versionInfo.c_str(), NewStringType::kNormal).ToLocalChecked()) + .Check(); + + module->Set(context, String::NewFromUtf8(isolate, "exports", NewStringType::kNormal).ToLocalChecked(), fn).Check(); + } + + NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) + +} // namespace demo \ No newline at end of file diff --git a/test/node-gyp/binding.cc b/test/node-gyp/binding.cc new file mode 100644 index 0000000..13d5b91 --- /dev/null +++ b/test/node-gyp/binding.cc @@ -0,0 +1,70 @@ +// hello.cc +#include +// #include "../include/wxml.h" + +namespace demo +{ + + using v8::FunctionCallbackInfo; + using v8::FunctionTemplate; + using v8::Isolate; + using v8::Local; + using v8::Object; + using v8::NewStringType; + using v8::String; + using v8::Value; + + void MsgMethod(const FunctionCallbackInfo &args) { + Isolate *isolate = args.GetIsolate(); + v8::HandleScope scope(isolate); // Ensure we have a proper handle scope. + + // Check if the first argument is an object. + if (args.Length() < 1 || !args[0]->IsObject()) { + isolate->ThrowException(String::NewFromUtf8(isolate, "Argument must be an object", NewStringType::kNormal).ToLocalChecked()); + return; + } + + // Cast the first argument to an Object. + Local context = isolate->GetCurrentContext(); + Local obj = args[0]->ToObject(context).ToLocalChecked(); + + // Get the "msg" property from the object. + Local key = String::NewFromUtf8(isolate, "msg", NewStringType::kNormal).ToLocalChecked(); + Local value; + if (!obj->Get(context, key).ToLocal(&value)) { + isolate->ThrowException(String::NewFromUtf8(isolate, "Failed to get 'msg' property", NewStringType::kNormal).ToLocalChecked()); + return; + } + + if (!value->IsString()) { + isolate->ThrowException(String::NewFromUtf8(isolate, "The 'msg' property must be a string", NewStringType::kNormal).ToLocalChecked()); + return; + } + + // Now we can safely check if value is a string and print the message. + printf("get msg2\n"); + printf("get msg3 %d\n", value->IsString()); + + // Convert the "msg" property to a C++ string and return it. + String::Utf8Value utf8(isolate, value); + args.GetReturnValue().Set(String::NewFromUtf8(isolate, *utf8, NewStringType::kNormal).ToLocalChecked()); + } + + void Initialize(Local exports, Local module) + { + + Isolate* isolate = exports->GetIsolate(); + auto context = isolate->GetCurrentContext(); + + + // std::string versionInfo; + // WXML::Compiler::GetVersionInfo(versionInfo, "global"); + module->Set(context, String::NewFromUtf8(isolate, "exports", NewStringType::kNormal).ToLocalChecked(), + FunctionTemplate::New(isolate, MsgMethod)->GetFunction(context).ToLocalChecked()).Check(); + auto _ = exports->Set(context, String::NewFromUtf8(isolate, "version", NewStringType::kNormal).ToLocalChecked(), + String::NewFromUtf8(isolate, "v1.0.0", NewStringType::kNormal).ToLocalChecked()); + } + + NODE_MODULE(NODE_GYP_MODULE_NAME, Initialize) + +} // namespace demo \ No newline at end of file diff --git a/test/node-gyp/binding.gyp b/test/node-gyp/binding.gyp new file mode 100644 index 0000000..71c9efb --- /dev/null +++ b/test/node-gyp/binding.gyp @@ -0,0 +1,14 @@ +{ + 'defines': [ 'V8_DEPRECATION_WARNINGS=1' ], + 'conditions': [ + [ 'OS in "linux freebsd openbsd solaris android aix os400 cloudabi"', { + 'cflags': ['-Wno-cast-function-type'], + }], + ], + 'targets': [ + { + 'target_name': 'binding', + 'sources': [ 'binding.cc' ], + } + ] +} \ No newline at end of file diff --git a/test/node-gyp/build.sh b/test/node-gyp/build.sh new file mode 100755 index 0000000..360ea54 --- /dev/null +++ b/test/node-gyp/build.sh @@ -0,0 +1,10 @@ +export npm_config_target=0.55.0 +# Setup build architecture, ia32 or x64 +export npm_config_arch=x64 +export npm_config_target_arch=x64 +# Setup env for modules built with node-pre-gyp +export npm_config_runtime=node-webkit +export npm_config_build_from_source=true +# Setup nw-gyp as node-gyp +export npm_config_node_gyp=$(which nw-gyp) +nw-gyp rebuild --loglevel verbose diff --git a/test/node-gyp/package.json b/test/node-gyp/package.json new file mode 100644 index 0000000..6e88b07 --- /dev/null +++ b/test/node-gyp/package.json @@ -0,0 +1,16 @@ +{ + "name": "node-gyp", + "version": "1.0.0", + "description": "", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "keywords": [], + "author": "", + "license": "ISC", + "dependencies": { + "node-gyp": "^10.1.0", + "nw-gyp": "^3.6.6" + } +} diff --git a/test/node-gyp/pnpm-lock.yaml b/test/node-gyp/pnpm-lock.yaml new file mode 100644 index 0000000..6d35f1f --- /dev/null +++ b/test/node-gyp/pnpm-lock.yaml @@ -0,0 +1,1261 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + node-gyp: + specifier: ^10.1.0 + version: 10.1.0 + nw-gyp: + specifier: ^3.6.6 + version: 3.6.6 + +packages: + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@npmcli/agent@2.2.2: + resolution: {integrity: sha512-OrcNPXdpSl9UX7qPVRWbmWMCSXrcDa2M9DvrbOTj7ao1S4PlqVFYv9/yLKMkrJKZ/V5A/kDBC690or307i26Og==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + agent-base: 7.1.1 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.5 + lru-cache: 10.3.0 + socks-proxy-agent: 8.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /@npmcli/fs@3.1.1: + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + semver: 7.6.2 + dev: false + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: false + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: false + + /ansi-regex@2.1.1: + resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} + engines: {node: '>=0.10.0'} + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /aproba@1.2.0: + resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==} + dev: false + + /are-we-there-yet@1.1.7: + resolution: {integrity: sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==} + deprecated: This package is no longer supported. + dependencies: + delegates: 1.0.0 + readable-stream: 2.3.8 + dev: false + + /asn1@0.2.6: + resolution: {integrity: sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /assert-plus@1.0.0: + resolution: {integrity: sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==} + engines: {node: '>=0.8'} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /aws-sign2@0.7.0: + resolution: {integrity: sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==} + dev: false + + /aws4@1.13.0: + resolution: {integrity: sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /bcrypt-pbkdf@1.0.2: + resolution: {integrity: sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==} + dependencies: + tweetnacl: 0.14.5 + dev: false + + /block-stream@0.0.9: + resolution: {integrity: sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==} + engines: {node: 0.4 || >=0.5.8} + dependencies: + inherits: 2.0.4 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /cacache@18.0.3: + resolution: {integrity: sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.4.2 + lru-cache: 10.3.0 + minipass: 7.1.2 + minipass-collect: 2.0.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + dev: false + + /caseless@0.12.0: + resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==} + dev: false + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false + + /code-point-at@1.1.0: + resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} + engines: {node: '>=0.10.0'} + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + + /core-util-is@1.0.2: + resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==} + dev: false + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /dashdash@1.14.1: + resolution: {integrity: sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==} + engines: {node: '>=0.10'} + dependencies: + assert-plus: 1.0.0 + dev: false + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + dev: false + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /ecc-jsbn@0.1.2: + resolution: {integrity: sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==} + dependencies: + jsbn: 0.1.1 + safer-buffer: 2.1.2 + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: false + optional: true + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + + /exponential-backoff@3.1.1: + resolution: {integrity: sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==} + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /extsprintf@1.3.0: + resolution: {integrity: sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==} + engines: {'0': node >=0.6.0} + dev: false + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + dev: false + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: false + + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /forever-agent@0.6.1: + resolution: {integrity: sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==} + dev: false + + /form-data@2.3.3: + resolution: {integrity: sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + dev: false + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + dev: false + + /fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: false + + /gauge@2.7.4: + resolution: {integrity: sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==} + deprecated: This package is no longer supported. + dependencies: + aproba: 1.2.0 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + object-assign: 4.1.1 + signal-exit: 3.0.7 + string-width: 1.0.2 + strip-ansi: 3.0.1 + wide-align: 1.1.5 + dev: false + + /getpass@0.1.7: + resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} + dependencies: + assert-plus: 1.0.0 + dev: false + + /glob@10.4.2: + resolution: {integrity: sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + dependencies: + foreground-child: 3.2.1 + jackspeak: 3.4.0 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.0 + path-scurry: 1.11.1 + dev: false + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /har-schema@2.0.0: + resolution: {integrity: sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==} + engines: {node: '>=4'} + dev: false + + /har-validator@5.1.5: + resolution: {integrity: sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==} + engines: {node: '>=6'} + deprecated: this library is no longer supported + dependencies: + ajv: 6.12.6 + har-schema: 2.0.0 + dev: false + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /http-signature@1.2.0: + resolution: {integrity: sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==} + engines: {node: '>=0.8', npm: '>=1.3.7'} + dependencies: + assert-plus: 1.0.0 + jsprim: 1.4.2 + sshpk: 1.18.0 + dev: false + + /https-proxy-agent@7.0.5: + resolution: {integrity: sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + dev: false + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + dev: false + + /is-fullwidth-code-point@1.0.0: + resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} + engines: {node: '>=0.10.0'} + dependencies: + number-is-nan: 1.0.1 + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: false + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: false + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /isexe@3.1.1: + resolution: {integrity: sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ==} + engines: {node: '>=16'} + dev: false + + /isstream@0.1.2: + resolution: {integrity: sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==} + dev: false + + /jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jsbn@0.1.1: + resolution: {integrity: sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==} + dev: false + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + dev: false + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: false + + /json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + dev: false + + /json-stringify-safe@5.0.1: + resolution: {integrity: sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==} + dev: false + + /jsprim@1.4.2: + resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} + engines: {node: '>=0.6.0'} + dependencies: + assert-plus: 1.0.0 + extsprintf: 1.3.0 + json-schema: 0.4.0 + verror: 1.10.0 + dev: false + + /lru-cache@10.3.0: + resolution: {integrity: sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==} + engines: {node: 14 || >=16.14} + dev: false + + /make-fetch-happen@13.0.1: + resolution: {integrity: sha512-cKTUFc/rbKUd/9meOvgrpJ2WrNzymt6jfRDdwg5UCnVzv9dTpEj9JS5m3wtziXVCjluIXyL8pcaukYqezIzZQA==} + engines: {node: ^16.14.0 || >=18.0.0} + dependencies: + '@npmcli/agent': 2.2.2 + cacache: 18.0.3 + http-cache-semantics: 4.1.1 + is-lambda: 1.0.1 + minipass: 7.1.2 + minipass-fetch: 3.0.5 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + proc-log: 4.2.0 + promise-retry: 2.0.1 + ssri: 10.0.6 + transitivePeerDependencies: + - supports-color + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + dev: false + + /minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + dev: false + + /minipass-collect@2.0.1: + resolution: {integrity: sha512-D7V8PO9oaz7PWGLbCACuI1qEOsq7UKfLotx/C0Aet43fCUB/wfQ7DYeq2oR/svFJGYDHPr38SHATeaj/ZoKHKw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + minipass: 7.1.2 + dev: false + + /minipass-fetch@3.0.5: + resolution: {integrity: sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: false + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + dev: false + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: false + + /node-gyp@10.1.0: + resolution: {integrity: sha512-B4J5M1cABxPc5PwfjhbV5hoy2DP9p8lFXASnEN6hugXOa61416tnTZ29x9sSwAd0o99XNIcpvDDy1swAExsVKA==} + engines: {node: ^16.14.0 || >=18.0.0} + hasBin: true + dependencies: + env-paths: 2.2.1 + exponential-backoff: 3.1.1 + glob: 10.4.2 + graceful-fs: 4.2.11 + make-fetch-happen: 13.0.1 + nopt: 7.2.1 + proc-log: 3.0.0 + semver: 7.6.2 + tar: 6.2.1 + which: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /nopt@3.0.6: + resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + abbrev: 2.0.0 + dev: false + + /npmlog@4.1.2: + resolution: {integrity: sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==} + deprecated: This package is no longer supported. + dependencies: + are-we-there-yet: 1.1.7 + console-control-strings: 1.1.0 + gauge: 2.7.4 + set-blocking: 2.0.0 + dev: false + + /number-is-nan@1.0.1: + resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} + engines: {node: '>=0.10.0'} + dev: false + + /nw-gyp@3.6.6: + resolution: {integrity: sha512-FeMnpFQWtEEMJ1BrSfK3T62CjuxaNl0mNHqdrxFcIF5XQdC3gaZYW4n+77lQLk8PE3Upfknkl9VRo6gDKJIHuA==} + engines: {node: '>= 0.8.0'} + hasBin: true + dependencies: + fstream: 1.0.12 + glob: 7.2.3 + graceful-fs: 4.2.11 + minimatch: 3.1.2 + mkdirp: 0.5.6 + nopt: 3.0.6 + npmlog: 4.1.2 + osenv: 0.1.5 + request: 2.88.2 + rimraf: 2.7.1 + semver: 5.3.0 + tar: 2.2.2 + which: 1.3.1 + dev: false + + /oauth-sign@0.9.0: + resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /os-homedir@1.0.2: + resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} + engines: {node: '>=0.10.0'} + dev: false + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + dev: false + + /osenv@0.1.5: + resolution: {integrity: sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==} + deprecated: This package is no longer supported. + dependencies: + os-homedir: 1.0.2 + os-tmpdir: 1.0.2 + dev: false + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /package-json-from-dist@1.0.0: + resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} + dev: false + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.3.0 + minipass: 7.1.2 + dev: false + + /performance-now@2.1.0: + resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} + dev: false + + /proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dev: false + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + dev: false + + /qs@6.5.3: + resolution: {integrity: sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==} + engines: {node: '>=0.6'} + dev: false + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /request@2.88.2: + resolution: {integrity: sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==} + engines: {node: '>= 6'} + deprecated: request has been deprecated, see https://github.com/request/request/issues/3142 + dependencies: + aws-sign2: 0.7.0 + aws4: 1.13.0 + caseless: 0.12.0 + combined-stream: 1.0.8 + extend: 3.0.2 + forever-agent: 0.6.1 + form-data: 2.3.3 + har-validator: 5.1.5 + http-signature: 1.2.0 + is-typedarray: 1.0.0 + isstream: 0.1.2 + json-stringify-safe: 5.0.1 + mime-types: 2.1.35 + oauth-sign: 0.9.0 + performance-now: 2.1.0 + qs: 6.5.3 + safe-buffer: 5.2.1 + tough-cookie: 2.5.0 + tunnel-agent: 0.6.0 + uuid: 3.4.0 + dev: false + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + requiresBuild: true + dev: false + + /semver@5.3.0: + resolution: {integrity: sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==} + hasBin: true + dev: false + + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /socks-proxy-agent@8.0.4: + resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + dev: false + + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + dev: false + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + dev: false + + /sshpk@1.18.0: + resolution: {integrity: sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + asn1: 0.2.6 + assert-plus: 1.0.0 + bcrypt-pbkdf: 1.0.2 + dashdash: 1.14.1 + ecc-jsbn: 0.1.2 + getpass: 0.1.7 + jsbn: 0.1.1 + safer-buffer: 2.1.2 + tweetnacl: 0.14.5 + dev: false + + /ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + minipass: 7.1.2 + dev: false + + /string-width@1.0.2: + resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} + engines: {node: '>=0.10.0'} + dependencies: + code-point-at: 1.1.0 + is-fullwidth-code-point: 1.0.0 + strip-ansi: 3.0.1 + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /strip-ansi@3.0.1: + resolution: {integrity: sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==} + engines: {node: '>=0.10.0'} + dependencies: + ansi-regex: 2.1.1 + dev: false + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /tar@2.2.2: + resolution: {integrity: sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==} + deprecated: This version of tar is no longer supported, and will not receive security updates. Please upgrade asap. + dependencies: + block-stream: 0.0.9 + fstream: 1.0.12 + inherits: 2.0.4 + dev: false + + /tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /tough-cookie@2.5.0: + resolution: {integrity: sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==} + engines: {node: '>=0.8'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /tweetnacl@0.14.5: + resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==} + dev: false + + /unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + unique-slug: 4.0.0 + dev: false + + /unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + dependencies: + imurmurhash: 0.1.4 + dev: false + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@3.4.0: + resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} + deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. + hasBin: true + dev: false + + /verror@1.10.0: + resolution: {integrity: sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==} + engines: {'0': node >=0.6.0} + dependencies: + assert-plus: 1.0.0 + core-util-is: 1.0.2 + extsprintf: 1.3.0 + dev: false + + /which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /which@4.0.0: + resolution: {integrity: sha512-GlaYyEb07DPxYCKhKzplCWBJtvxZcZMrL+4UkrTSJHHPyZU4mYYTv3qaOe77H7EODLSSopAUFAc6W8U4yqvscg==} + engines: {node: ^16.13.0 || >=18.0.0} + hasBin: true + dependencies: + isexe: 3.1.1 + dev: false + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false diff --git a/test/runner/nwjs/linux.ts b/test/runner/nwjs/linux.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/runner/nwjs/package.nw/index.html b/test/runner/nwjs/package.nw/index.html new file mode 100644 index 0000000..b5ce08f --- /dev/null +++ b/test/runner/nwjs/package.nw/index.html @@ -0,0 +1,13 @@ + + + + Hello World! + + +

Hello World!

+ + + \ No newline at end of file diff --git a/test/runner/nwjs/package.nw/main.js b/test/runner/nwjs/package.nw/main.js new file mode 100644 index 0000000..4e0a979 --- /dev/null +++ b/test/runner/nwjs/package.nw/main.js @@ -0,0 +1,83 @@ +// initialize your app +// and ... + +console.log("main.js"); +const fs = require("fs"); +console.log("fs:", fs); +const wcc = require("./wcc"); +console.log("wcc:", wcc); + +const { createServer } = require("http"); + +const HOST = "0.0.0.0"; +const PORT = "8083"; + +const Handle = { + /** + * + * @param {IncomingMessage} req + * @returns + */ + readBody: (req) => { + return new Promise((resolve, reject) => { + let body = ""; + req.on("data", (d) => { + body += d; + }); + req.on("end", () => { + resolve(body); + }); + }); + }, +}; + +const server = createServer(async (req, resp) => { + // the first param is status code it returns + // and the second param is response header info + try { + console.log("server is working..."); + if(req.url?.includes("close")) + { + nw.App.quit() + } + const body = JSON.parse(await Handle.readBody(req)); + + let result = {}; + if (req.url?.includes("wcc")) { + result = await wcc.wcc(body); + } else if (req.url?.includes("wcsc")){ + result = await wcc.wcsc(body); + } + + if (typeof result != 'string') + { + // JSON + resp.writeHead(200, { "Content-Type": "application/json" }); + resp.end(JSON.stringify(result)); + } + else + { + // call end method to tell server that the request has been fulfilled + resp.writeHead(200, { "Content-Type": "text/plain" }); + resp.end(result); + } + + } catch (e) { + console.error('server error:', e) + resp.writeHead(500, { "Content-Type": "text/plain" }); + resp.end("server error:" + e); + } +}); + +server.listen(PORT, HOST, (error) => { + if (error) { + console.log("Something wrong: ", error); + return; + } + + console.log(`server is listening on http://${HOST}:${PORT} ...`); +}); + +// nw.Window.open("index.html", {}, function (win) {}); +// nw.process.exit(0) +// process.exit(0) diff --git a/test/runner/nwjs/package.nw/package.json b/test/runner/nwjs/package.nw/package.json new file mode 100644 index 0000000..da65f15 --- /dev/null +++ b/test/runner/nwjs/package.nw/package.json @@ -0,0 +1,5 @@ +{ + "name": "helloworld", + "main": "main.js", + "show": "false" + } \ No newline at end of file diff --git a/test/runner/nwjs/package.nw/wcc/lib/index.js b/test/runner/nwjs/package.nw/wcc/lib/index.js new file mode 100644 index 0000000..96015fe --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/index.js @@ -0,0 +1,4 @@ +module.exports = { + wcc: require('./wcc'), + wcsc: require('./wcsc') +} \ No newline at end of file diff --git a/test/runner/nwjs/package.nw/wcc/lib/index.js:Zone.Identifier b/test/runner/nwjs/package.nw/wcc/lib/index.js:Zone.Identifier new file mode 100644 index 0000000..a45e1ac --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/index.js:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/test/runner/nwjs/package.nw/wcc/lib/util.js b/test/runner/nwjs/package.nw/wcc/lib/util.js new file mode 100644 index 0000000..c21a2c2 --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/util.js @@ -0,0 +1,1134 @@ +// Built by eustia. +/* eslint-disable */ + +var _ = {}; + +/* ------------------------------ has ------------------------------ */ + +var has = _.has = (function (exports) { + /* Checks if key is a direct property. + * + * |Name |Desc | + * |------|--------------------------------| + * |obj |Object to query | + * |key |Path to check | + * |return|True if key is a direct property| + */ + + /* example + * has({ one: 1 }, 'one'); // -> true + */ + + /* typescript + * export declare function has(obj: {}, key: string): boolean; + */ + var hasOwnProp = Object.prototype.hasOwnProperty; + + exports = function(obj, key) { + return hasOwnProp.call(obj, key); + }; + + return exports; +})({}); + +/* ------------------------------ isUndef ------------------------------ */ + +var isUndef = _.isUndef = (function (exports) { + /* Check if value is undefined. + * + * |Name |Desc | + * |------|--------------------------| + * |val |Value to check | + * |return|True if value is undefined| + */ + + /* example + * isUndef(void 0); // -> true + * isUndef(null); // -> false + */ + + /* typescript + * export declare function isUndef(val: any): boolean; + */ + exports = function(val) { + return val === void 0; + }; + + return exports; +})({}); + +/* ------------------------------ types ------------------------------ */ + +var types = _.types = (function (exports) { + /* Used for typescript definitions only. + */ + + /* typescript + * export declare namespace types { + * interface Collection {} + * interface List extends Collection { + * [index: number]: T; + * length: number; + * } + * interface ListIterator { + * (value: T, index: number, list: List): TResult; + * } + * interface Dictionary extends Collection { + * [index: string]: T; + * } + * interface ObjectIterator { + * (element: T, key: string, list: Dictionary): TResult; + * } + * interface MemoIterator { + * (prev: TResult, curr: T, index: number, list: List): TResult; + * } + * interface MemoObjectIterator { + * (prev: TResult, curr: T, key: string, list: Dictionary): TResult; + * } + * type Fn = (...args: any[]) => T; + * type AnyFn = Fn; + * type PlainObj = { [name: string]: T }; + * } + * export declare const types: {}; + */ + exports = {}; + + return exports; +})({}); + +/* ------------------------------ keys ------------------------------ */ + +var keys = _.keys = (function (exports) { + /* Create an array of the own enumerable property names of object. + * + * |Name |Desc | + * |------|-----------------------| + * |obj |Object to query | + * |return|Array of property names| + */ + + /* example + * keys({ a: 1 }); // -> ['a'] + */ + + /* typescript + * export declare function keys(obj: any): string[]; + */ + + /* dependencies + * has + */ + + if (Object.keys && !false) { + exports = Object.keys; + } else { + exports = function(obj) { + var ret = []; + + for (var key in obj) { + if (has(obj, key)) ret.push(key); + } + + return ret; + }; + } + + return exports; +})({}); + +/* ------------------------------ optimizeCb ------------------------------ */ + +var optimizeCb = _.optimizeCb = (function (exports) { + /* Used for function context binding. + */ + + /* typescript + * export declare function optimizeCb( + * fn: types.AnyFn, + * ctx: any, + * argCount?: number + * ): types.AnyFn; + */ + + /* dependencies + * isUndef types + */ + + exports = function(fn, ctx, argCount) { + if (isUndef(ctx)) return fn; + + switch (argCount == null ? 3 : argCount) { + case 1: + return function(val) { + return fn.call(ctx, val); + }; + + case 3: + return function(val, idx, collection) { + return fn.call(ctx, val, idx, collection); + }; + + case 4: + return function(accumulator, val, idx, collection) { + return fn.call(ctx, accumulator, val, idx, collection); + }; + } + + return function() { + return fn.apply(ctx, arguments); + }; + }; + + return exports; +})({}); + +/* ------------------------------ identity ------------------------------ */ + +var identity = _.identity = (function (exports) { + /* Return the first argument given. + * + * |Name |Desc | + * |------|-----------| + * |val |Any value | + * |return|Given value| + */ + + /* example + * identity('a'); // -> 'a' + */ + + /* typescript + * export declare function identity(val: T): T; + */ + exports = function(val) { + return val; + }; + + return exports; +})({}); + +/* ------------------------------ objToStr ------------------------------ */ + +var objToStr = _.objToStr = (function (exports) { + /* Alias of Object.prototype.toString. + * + * |Name |Desc | + * |------|------------------------------------| + * |val |Source value | + * |return|String representation of given value| + */ + + /* example + * objToStr(5); // -> '[object Number]' + */ + + /* typescript + * export declare function objToStr(val: any): string; + */ + var ObjToStr = Object.prototype.toString; + + exports = function(val) { + return ObjToStr.call(val); + }; + + return exports; +})({}); + +/* ------------------------------ isArr ------------------------------ */ + +var isArr = _.isArr = (function (exports) { + /* Check if value is an `Array` object. + * + * |Name |Desc | + * |------|----------------------------------| + * |val |Value to check | + * |return|True if value is an `Array` object| + */ + + /* example + * isArr([]); // -> true + * isArr({}); // -> false + */ + + /* typescript + * export declare function isArr(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + if (Array.isArray && !false) { + exports = Array.isArray; + } else { + exports = function(val) { + return objToStr(val) === '[object Array]'; + }; + } + + return exports; +})({}); + +/* ------------------------------ castPath ------------------------------ */ + +var castPath = _.castPath = (function (exports) { + /* Cast value into a property path array. + * + * |Name |Desc | + * |------|-------------------| + * |path |Value to inspect | + * |obj |Object to query | + * |return|Property path array| + */ + + /* example + * castPath('a.b.c'); // -> ['a', 'b', 'c'] + * castPath(['a']); // -> ['a'] + * castPath('a[0].b'); // -> ['a', '0', 'b'] + * castPath('a.b.c', { 'a.b.c': true }); // -> ['a.b.c'] + */ + + /* typescript + * export declare function castPath(path: string | string[], obj?: any): string[]; + */ + + /* dependencies + * has isArr + */ + + exports = function(str, obj) { + if (isArr(str)) return str; + if (obj && has(obj, str)) return [str]; + var ret = []; + str.replace(regPropName, function(match, number, quote, str) { + ret.push(quote ? str.replace(regEscapeChar, '$1') : number || match); + }); + return ret; + }; // Lodash _stringToPath + + var regPropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g; + var regEscapeChar = /\\(\\)?/g; + + return exports; +})({}); + +/* ------------------------------ isNum ------------------------------ */ + +var isNum = _.isNum = (function (exports) { + /* Check if value is classified as a Number primitive or object. + * + * |Name |Desc | + * |------|-------------------------------------| + * |val |Value to check | + * |return|True if value is correctly classified| + */ + + /* example + * isNum(5); // -> true + * isNum(5.1); // -> true + * isNum({}); // -> false + */ + + /* typescript + * export declare function isNum(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + return objToStr(val) === '[object Number]'; + }; + + return exports; +})({}); + +/* ------------------------------ isFn ------------------------------ */ + +var isFn = _.isFn = (function (exports) { + /* Check if value is a function. + * + * |Name |Desc | + * |------|---------------------------| + * |val |Value to check | + * |return|True if value is a function| + * + * Generator function is also classified as true. + */ + + /* example + * isFn(function() {}); // -> true + * isFn(function*() {}); // -> true + * isFn(async function() {}); // -> true + */ + + /* typescript + * export declare function isFn(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + var objStr = objToStr(val); + return ( + objStr === '[object Function]' || + objStr === '[object GeneratorFunction]' || + objStr === '[object AsyncFunction]' + ); + }; + + return exports; +})({}); + +/* ------------------------------ isArrLike ------------------------------ */ + +var isArrLike = _.isArrLike = (function (exports) { + /* Check if value is array-like. + * + * |Name |Desc | + * |------|---------------------------| + * |val |Value to check | + * |return|True if value is array like| + * + * Function returns false. + */ + + /* example + * isArrLike('test'); // -> true + * isArrLike(document.body.children); // -> true; + * isArrLike([1, 2, 3]); // -> true + */ + + /* typescript + * export declare function isArrLike(val: any): boolean; + */ + + /* dependencies + * isNum isFn + */ + + var MAX_ARR_IDX = Math.pow(2, 53) - 1; + + exports = function(val) { + if (!val) return false; + var len = val.length; + return isNum(len) && len >= 0 && len <= MAX_ARR_IDX && !isFn(val); + }; + + return exports; +})({}); + +/* ------------------------------ each ------------------------------ */ + +var each = _.each = (function (exports) { + /* Iterate over elements of collection and invokes iterator for each element. + * + * |Name |Desc | + * |--------|------------------------------| + * |obj |Collection to iterate over | + * |iterator|Function invoked per iteration| + * |ctx |Function context | + */ + + /* example + * each({ a: 1, b: 2 }, function(val, key) {}); + */ + + /* typescript + * export declare function each( + * list: types.List, + * iterator: types.ListIterator, + * ctx?: any + * ): types.List; + * export declare function each( + * object: types.Dictionary, + * iterator: types.ObjectIterator, + * ctx?: any + * ): types.Collection; + */ + + /* dependencies + * isArrLike keys optimizeCb types + */ + + exports = function(obj, iterator, ctx) { + iterator = optimizeCb(iterator, ctx); + var i, len; + + if (isArrLike(obj)) { + for (i = 0, len = obj.length; i < len; i++) { + iterator(obj[i], i, obj); + } + } else { + var _keys = keys(obj); + + for (i = 0, len = _keys.length; i < len; i++) { + iterator(obj[_keys[i]], _keys[i], obj); + } + } + + return obj; + }; + + return exports; +})({}); + +/* ------------------------------ createAssigner ------------------------------ */ + +var createAssigner = _.createAssigner = (function (exports) { + /* Used to create extend, extendOwn and defaults. + * + * |Name |Desc | + * |--------|------------------------------| + * |keysFn |Function to get object keys | + * |defaults|No override when set to true | + * |return |Result function, extend... | + */ + + /* typescript + * export declare function createAssigner( + * keysFn: types.AnyFn, + * defaults: boolean + * ): types.AnyFn; + */ + + /* dependencies + * isUndef each types + */ + + exports = function(keysFn, defaults) { + return function(obj) { + each(arguments, function(src, idx) { + if (idx === 0) return; + var keys = keysFn(src); + each(keys, function(key) { + if (!defaults || isUndef(obj[key])) obj[key] = src[key]; + }); + }); + return obj; + }; + }; + + return exports; +})({}); + +/* ------------------------------ extendOwn ------------------------------ */ + +var extendOwn = _.extendOwn = (function (exports) { + /* Like extend, but only copies own properties over to the destination object. + * + * |Name |Desc | + * |-----------|------------------| + * |destination|Destination object| + * |...sources |Sources objects | + * |return |Destination object| + */ + + /* example + * extendOwn({ name: 'RedHood' }, { age: 24 }); // -> {name: 'RedHood', age: 24} + */ + + /* typescript + * export declare function extendOwn(destination: any, ...sources: any[]): any; + */ + + /* dependencies + * keys createAssigner + */ + + exports = createAssigner(keys); + + return exports; +})({}); + +/* ------------------------------ isBrowser ------------------------------ */ + +var isBrowser = _.isBrowser = (function (exports) { + /* Check if running in a browser. + */ + + /* example + * console.log(isBrowser); // -> true if running in a browser + */ + + /* typescript + * export declare const isBrowser: boolean; + */ + exports = + typeof window === 'object' && + typeof document === 'object' && + document.nodeType === 9; + + return exports; +})({}); + +/* ------------------------------ root ------------------------------ */ + +var root = _.root = (function (exports) { + /* Root object reference, `global` in nodeJs, `window` in browser. */ + + /* typescript + * export declare const root: any; + */ + + /* dependencies + * isBrowser + */ + + exports = isBrowser ? window : global; + + return exports; +})({}); + +/* ------------------------------ isMatch ------------------------------ */ + +var isMatch = _.isMatch = (function (exports) { + /* Check if keys and values in src are contained in obj. + * + * |Name |Desc | + * |------|----------------------------------| + * |obj |Object to inspect | + * |src |Object of property values to match| + * |return|True if object is match | + */ + + /* example + * isMatch({ a: 1, b: 2 }, { a: 1 }); // -> true + */ + + /* typescript + * export declare function isMatch(obj: any, src: any): boolean; + */ + + /* dependencies + * keys + */ + + exports = function(obj, src) { + var _keys = keys(src); + + var len = _keys.length; + if (obj == null) return !len; + obj = Object(obj); + + for (var i = 0; i < len; i++) { + var key = _keys[i]; + if (src[key] !== obj[key] || !(key in obj)) return false; + } + + return true; + }; + + return exports; +})({}); + +/* ------------------------------ isObj ------------------------------ */ + +var isObj = _.isObj = (function (exports) { + /* Check if value is the language type of Object. + * + * |Name |Desc | + * |------|--------------------------| + * |val |Value to check | + * |return|True if value is an object| + * + * [Language Spec](http://www.ecma-international.org/ecma-262/6.0/#sec-ecmascript-language-types) + */ + + /* example + * isObj({}); // -> true + * isObj([]); // -> true + */ + + /* typescript + * export declare function isObj(val: any): boolean; + */ + exports = function(val) { + var type = typeof val; + return !!val && (type === 'function' || type === 'object'); + }; + + return exports; +})({}); + +/* ------------------------------ isStr ------------------------------ */ + +var isStr = _.isStr = (function (exports) { + /* Check if value is a string primitive. + * + * |Name |Desc | + * |------|-----------------------------------| + * |val |Value to check | + * |return|True if value is a string primitive| + */ + + /* example + * isStr('licia'); // -> true + */ + + /* typescript + * export declare function isStr(val: any): boolean; + */ + + /* dependencies + * objToStr + */ + + exports = function(val) { + return objToStr(val) === '[object String]'; + }; + + return exports; +})({}); + +/* ------------------------------ matcher ------------------------------ */ + +var matcher = _.matcher = (function (exports) { + /* Return a predicate function that checks if attrs are contained in an object. + * + * |Name |Desc | + * |------|----------------------------------| + * |attrs |Object of property values to match| + * |return|New predicate function | + */ + + /* example + * const filter = require('licia/filter'); + * + * const objects = [ + * { a: 1, b: 2, c: 3 }, + * { a: 4, b: 5, c: 6 } + * ]; + * filter(objects, matcher({ a: 4, c: 6 })); // -> [{a: 4, b: 5, c: 6}] + */ + + /* typescript + * export declare function matcher(attrs: any): types.AnyFn; + */ + + /* dependencies + * extendOwn isMatch types + */ + + exports = function(attrs) { + attrs = extendOwn({}, attrs); + return function(obj) { + return isMatch(obj, attrs); + }; + }; + + return exports; +})({}); + +/* ------------------------------ restArgs ------------------------------ */ + +var restArgs = _.restArgs = (function (exports) { + /* This accumulates the arguments passed into an array, after a given index. + * + * |Name |Desc | + * |----------|---------------------------------------| + * |function |Function that needs rest parameters | + * |startIndex|The start index to accumulates | + * |return |Generated function with rest parameters| + */ + + /* example + * const paramArr = restArgs(function(rest) { + * return rest; + * }); + * paramArr(1, 2, 3, 4); // -> [1, 2, 3, 4] + */ + + /* typescript + * export declare function restArgs( + * fn: types.AnyFn, + * startIndex?: number + * ): types.AnyFn; + */ + + /* dependencies + * types + */ + + exports = function(fn, startIdx) { + startIdx = startIdx == null ? fn.length - 1 : +startIdx; + return function() { + var len = Math.max(arguments.length - startIdx, 0); + var rest = new Array(len); + var i; + + for (i = 0; i < len; i++) { + rest[i] = arguments[i + startIdx]; + } // Call runs faster than apply. + + switch (startIdx) { + case 0: + return fn.call(this, rest); + + case 1: + return fn.call(this, arguments[0], rest); + + case 2: + return fn.call(this, arguments[0], arguments[1], rest); + } + + var args = new Array(startIdx + 1); + + for (i = 0; i < startIdx; i++) { + args[i] = arguments[i]; + } + + args[startIdx] = rest; + return fn.apply(this, args); + }; + }; + + return exports; +})({}); + +/* ------------------------------ promisify ------------------------------ */ + +var promisify = _.promisify = (function (exports) { + /* Convert callback based functions into Promises. + * + * |Name |Desc | + * |---------------|--------------------------------------| + * |fn |Callback based function | + * |multiArgs=false|If callback has multiple success value| + * |return |Result function | + * + * If multiArgs is set to true, the resulting promise will always fulfill with an array of the callback's success values. + */ + + /* example + * const fs = require('fs'); + * + * const readFile = promisify(fs.readFile); + * readFile('test.js', 'utf-8').then(function(data) { + * // Do something with file content. + * }); + */ + + /* typescript + * export declare function promisify( + * fn: types.AnyFn, + * multiArgs?: boolean + * ): types.AnyFn; + */ + + /* dependencies + * restArgs root types + */ + + exports = function(fn, multiArgs) { + return restArgs(function(args) { + return new root.Promise(function(resolve, reject) { + args.push( + restArgs(function callback(err, values) { + if (err) return reject(err); + if (!multiArgs) return resolve(values[0]); + resolve(values); + }) + ); + fn.apply(this, args); + }); + }); + }; + + return exports; +})({}); + +/* ------------------------------ safeGet ------------------------------ */ + +var safeGet = _.safeGet = (function (exports) { + /* Get object property, don't throw undefined error. + * + * |Name |Desc | + * |------|-------------------------| + * |obj |Object to query | + * |path |Path of property to get | + * |return|Target value or undefined| + */ + + /* example + * const obj = { a: { aa: { aaa: 1 } } }; + * safeGet(obj, 'a.aa.aaa'); // -> 1 + * safeGet(obj, ['a', 'aa']); // -> {aaa: 1} + * safeGet(obj, 'a.b'); // -> undefined + */ + + /* typescript + * export declare function safeGet(obj: any, path: string | string[]): any; + */ + + /* dependencies + * isUndef castPath + */ + + exports = function(obj, path) { + path = castPath(path, obj); + var prop; + prop = path.shift(); + + while (!isUndef(prop)) { + obj = obj[prop]; + if (obj == null) return; + prop = path.shift(); + } + + return obj; + }; + + return exports; +})({}); + +/* ------------------------------ property ------------------------------ */ + +var property = _.property = (function (exports) { + /* Return a function that will itself return the key property of any passed-in object. + * + * |Name |Desc | + * |------|---------------------------| + * |path |Path of the property to get| + * |return|New accessor function | + */ + + /* example + * const obj = { a: { b: 1 } }; + * property('a')(obj); // -> {b: 1} + * property(['a', 'b'])(obj); // -> 1 + */ + + /* typescript + * export declare function property(path: string | string[]): types.AnyFn; + */ + + /* dependencies + * isArr safeGet types + */ + + exports = function(path) { + if (!isArr(path)) return shallowProperty(path); + return function(obj) { + return safeGet(obj, path); + }; + }; + + function shallowProperty(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + } + + return exports; +})({}); + +/* ------------------------------ safeCb ------------------------------ */ + +var safeCb = _.safeCb = (function (exports) { + /* Create callback based on input value. + */ + + /* typescript + * export declare function safeCb( + * val?: any, + * ctx?: any, + * argCount?: number + * ): types.AnyFn; + */ + + /* dependencies + * isFn isObj isArr optimizeCb matcher identity types property + */ + + exports = function(val, ctx, argCount) { + if (val == null) return identity; + if (isFn(val)) return optimizeCb(val, ctx, argCount); + if (isObj(val) && !isArr(val)) return matcher(val); + return property(val); + }; + + return exports; +})({}); + +/* ------------------------------ map ------------------------------ */ + +var map = _.map = (function (exports) { + /* Create an array of values by running each element in collection through iteratee. + * + * |Name |Desc | + * |--------|------------------------------| + * |object |Collection to iterate over | + * |iterator|Function invoked per iteration| + * |context |Function context | + * |return |New mapped array | + */ + + /* example + * map([4, 8], function(n) { + * return n * n; + * }); // -> [16, 64] + */ + + /* typescript + * export declare function map( + * list: types.List, + * iterator: types.ListIterator, + * context?: any + * ): TResult[]; + * export declare function map( + * object: types.Dictionary, + * iterator: types.ObjectIterator, + * context?: any + * ): TResult[]; + */ + + /* dependencies + * safeCb keys isArrLike types + */ + + exports = function(obj, iterator, ctx) { + iterator = safeCb(iterator, ctx); + + var _keys = !isArrLike(obj) && keys(obj); + + var len = (_keys || obj).length; + var results = Array(len); + + for (var i = 0; i < len; i++) { + var curKey = _keys ? _keys[i] : i; + results[i] = iterator(obj[curKey], curKey, obj); + } + + return results; + }; + + return exports; +})({}); + +/* ------------------------------ toArr ------------------------------ */ + +var toArr = _.toArr = (function (exports) { + /* Convert value to an array. + * + * |Name |Desc | + * |------|----------------| + * |val |Value to convert| + * |return|Converted array | + */ + + /* example + * toArr({ a: 1, b: 2 }); // -> [{a: 1, b: 2}] + * toArr('abc'); // -> ['abc'] + * toArr(1); // -> [1] + * toArr(null); // -> [] + */ + + /* typescript + * export declare function toArr(val: any): any[]; + */ + + /* dependencies + * isArrLike map isArr isStr + */ + + exports = function(val) { + if (!val) return []; + if (isArr(val)) return val; + if (isArrLike(val) && !isStr(val)) return map(val); + return [val]; + }; + + return exports; +})({}); + +/* ------------------------------ fs ------------------------------ */ +_.fs = (function (exports) { + /* Promised version of node.js fs module. + */ + + /* example + * fs.readFile('test.js') + * .then(function(data) { + * // Do something + * }) + * .catch(function(err) { + * // Handle errors + * }); + */ + + /* typescript + * export declare const fs: { + * readFile(path: string, encoding: string): Promise; + * readFile(path: string): Promise; + * exists(path: string): Promise; + * unlink(path: string): Promise; + * writeFile(path: string, data: string, options?: string): Promise; + * writeFile(path: string, data: Buffer): Promise; + * readdir(path: string): Promise; + * rmdir(path: string): Promise; + * [key: string]: any; + * }; + */ + + /* dependencies + * promisify root each toArr + */ + + const fs = require('fs'); + + each( + [ + 'access', + 'appendFile', + 'chmod', + 'chown', + 'close', + 'fchmod', + 'fchown', + 'fdatasync', + 'fstat', + 'fsync', + 'ftruncate', + 'futimes', + 'link', + 'lstat', + 'mkdir', + 'mkdtemp', + 'open', + 'read', + 'readFile', + 'readdir', + 'readlink', + 'realpath', + 'rename', + 'rmdir', + 'stat', + 'symlink', + 'truncate', + 'unlink', + 'utimes', + 'write', + 'writeFile' + ], + function(method) { + exports[method] = promisify(fs[method]); + } + ); + + exports.exists = function() { + const args = toArr(arguments); + + return new root.Promise(function(resolve) { + args.push(resolve); + fs.exists.apply(null, args); + }); + }; + + return exports; +})({}); + +module.exports = _; \ No newline at end of file diff --git a/test/runner/nwjs/package.nw/wcc/lib/util.js:Zone.Identifier b/test/runner/nwjs/package.nw/wcc/lib/util.js:Zone.Identifier new file mode 100644 index 0000000..a45e1ac --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/util.js:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/test/runner/nwjs/package.nw/wcc/lib/wcc.js b/test/runner/nwjs/package.nw/wcc/lib/wcc.js new file mode 100644 index 0000000..bf08e43 --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/wcc.js @@ -0,0 +1,94 @@ +const util = require('./util') +const path = require('path') + +let wcc + +function loadWccAddon() { + if (wcc) return + wcc = require('../build/Release/wcc.node') +} + +const fs = util.fs + +exports = async function (options) { + + loadWccAddon() + + if (!options) throw Error('options is required') + + const lazyload = !!options.lazyloadConfig + + options = Object.assign( + { + files: [], + contents: [], + replaceContent: {}, + verbose: false, + debug: false, + debugWXS: false, + showNewTree: false, + isPlugin: false, + addTestAttre: false, + independent: false, + genfuncname: '$gwx', + isCut: false, + cwd: process.cwd, + debug: false, + lazyload, + lazyloadConfig: '', + }, + options, + ) + + return new Promise(async (resolve, reject) => { + let st = Date.now() + + // 获取文件内容 + if (!options.contents.length) { + const tasks = options.files.map((file) => { + if (typeof options.replaceContent[file] === 'string') { + return options.replaceContent[file] + } + return fs.readFile(path.resolve(options.cwd, file), 'utf8') + }) + options.contents = await Promise.all(tasks) || [] + } + // console.log('wcc get files', Date.now() - st, options.contents) + let result + try { + result = wcc(options) + } catch(errmsg) { + reject(new Error(errmsg)) + return + } + + console.log('wcc get compile', Date.now() - st) + if (options.output) { + const output = path.resolve(options.cwd, options.output) + const dir = path.dirname(output) + if (lazyload) { + // lazyload 为 true时,wcc 返回值是个对象, 需要序列化一下 + result = JSON.stringify(result) + } + try { + await fs.stat(dir) + } catch (e) { + await fs.mkdir(dir, { + recursive: true, + }) + } + await fs.writeFile(output, result, 'utf8') + } + console.log('wcc get output', Date.now() - st) + resolve(result) + }) +} + +Object.defineProperty(exports, 'version', { + get() { + loadWccAddon() + return wcc.version + }, +}) + +module.exports = exports diff --git a/test/runner/nwjs/package.nw/wcc/lib/wcc.js:Zone.Identifier b/test/runner/nwjs/package.nw/wcc/lib/wcc.js:Zone.Identifier new file mode 100644 index 0000000..a45e1ac --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/wcc.js:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/test/runner/nwjs/package.nw/wcc/lib/wcsc.js b/test/runner/nwjs/package.nw/wcc/lib/wcsc.js new file mode 100644 index 0000000..424d2a5 --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/wcsc.js @@ -0,0 +1,92 @@ +const util = require('./util') +const path = require('path') +const fs = util.fs + +let wcsc + +function loadWcscAddon() { + if (wcsc) return + wcsc = require('../build/Release/wcsc.node') +} + +function tranWcscResultToObject(resultStr) { + const resultArr = resultStr.split('=') + const result = {} + for (let i = 0, len = resultArr.length; i < len && resultArr[i + 1]; i += 2) { + result[resultArr[i]] = resultArr[i + 1] + } + return result +} + +exports = async function (options) { + + loadWcscAddon() + + if (!options) throw Error('options is required') + + // avoid undefined or null + if (typeof options.subPackage !== 'string') { + delete options.subPackage + } + + if (typeof options.lazyload !== 'boolean') { + delete options.lazyload + } + + options = Object.assign( + { + files: [], + contents: [], + pageCount: 0, + cwd: process.cwd, + replaceContent: {}, + debug: false, + classPrefix: '', + lazyload: false, + }, + options, + ) + + if (!options.contents.length) { + const tasks = options.files.map((file) => { + if (typeof options.replaceContent[file] === 'string') { + return options.replaceContent[file] + } + return fs.readFile(path.resolve(options.cwd, file), 'utf8') + }) + options.contents = await Promise.all(tasks) || [] + } + + let wccResult + try { + wccResult = wcsc(options) + } catch (errmsg) { + throw new Error(errmsg) + } + + const result = options.lazyload ? wccResult : tranWcscResultToObject(wccResult) + + if (options.output) { + const output = path.resolve(options.cwd, options.output) + const dir = path.dirname(output) + try { + await fs.stat(dir) + } catch (e) { + await fs.mkdir(dir, { + recursive: true, + }) + } + await fs.writeFile(output, JSON.stringify(result, null, 2), 'utf8') + } + + return result +} + +Object.defineProperty(exports, 'version', { + get() { + loadWcscAddon() + return wcsc.version + }, +}) + +module.exports = exports diff --git a/test/runner/nwjs/package.nw/wcc/lib/wcsc.js:Zone.Identifier b/test/runner/nwjs/package.nw/wcc/lib/wcsc.js:Zone.Identifier new file mode 100644 index 0000000..a45e1ac --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/lib/wcsc.js:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/test/runner/nwjs/package.nw/wcc/package.json b/test/runner/nwjs/package.nw/wcc/package.json new file mode 100644 index 0000000..ffa7511 --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/package.json @@ -0,0 +1,18 @@ +{ + "name": "miniprogram-wcc", + "version": "0.0.1", + "description": "WCC node C++ addon", + "main": "lib/index.js", + "scripts": { + "rebuild": "node-gyp rebuild", + "build": "node-gyp build", + "test": "node ./test/wcc/index && node ./test/wcsc/index", + "format": "prettier *.js test/*.js scripts/*.js --write" + }, + "author": "coverguo", + "license": "MIT", + "devDependencies": { + "licia": "^1.21.2", + "node-gyp": "^7.0.0" + } +} diff --git a/test/runner/nwjs/package.nw/wcc/package.json:Zone.Identifier b/test/runner/nwjs/package.nw/wcc/package.json:Zone.Identifier new file mode 100644 index 0000000..a45e1ac --- /dev/null +++ b/test/runner/nwjs/package.nw/wcc/package.json:Zone.Identifier @@ -0,0 +1,2 @@ +[ZoneTransfer] +ZoneId=3 diff --git a/test/runner/nwjs/windows.ts b/test/runner/nwjs/windows.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/runner/nwjs/wine.sh b/test/runner/nwjs/wine.sh new file mode 100644 index 0000000..349559f --- /dev/null +++ b/test/runner/nwjs/wine.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +# 代码里不要启动gui +docker run -it --volume=.:/c --env=USE_XVFB=yes --env=XVFB_SERVER=:95 --env=XVFB_SCREEN=0 --env=XVFB_RESOLUTION=320x240x8 --env=DISPLAY=:95 --rm --hostname=DESKTOP-1TV4OAG --name=wine --shm-size=1g --workdir=/home/wineuser --env=TZ=Asia/Shanghai --volume=winehome:/home/wineuser -p 8083:8083 scottyhardy/docker-wine:latest wine /c/nwjs-sdk-v0.55.0-win-x64/nw.exe +