cmake_minimum_required(VERSION 3.26)
cmake_policy(SET CMP0091 NEW)  # MSVC runtime selection (cmake-js)
cmake_policy(SET CMP0042 NEW)  # macOS @rpath

# npm's `rc` package installs node_modules/.bin/rc, which shadows the Windows
# resource compiler (rc.exe) when cmake-js runs under npm. Drop .bin from PATH.
if(WIN32)
  set(_fk_path "$ENV{PATH}")
  list(FILTER _fk_path EXCLUDE REGEX "node_modules[/\\\\]\\.bin")
  set(ENV{PATH} "${_fk_path}")
endif()

project(secrethider_node LANGUAGES C CXX)

set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)
if(MSVC)
  add_compile_options(/EHsc /utf-8)
endif()
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)
if(NOT CMAKE_BUILD_TYPE)
  set(CMAKE_BUILD_TYPE Release)
endif()

# Reuse the shared C++ core (this tree is built by cmake-js, not the top-level project).
set(REPO_ROOT ${CMAKE_CURRENT_SOURCE_DIR}/../..)
list(APPEND CMAKE_MODULE_PATH ${REPO_ROOT}/cmake)
option(SECRETHIDER_WITH_RE2 "Custom regex rules via RE2 (pulls abseil)" ON)
# cmake-js builds addons against the static MSVC runtime (/MT); abseil defaults to /MD.
set(ABSL_MSVC_STATIC_RUNTIME ON CACHE BOOL "" FORCE)
include(Warnings)
include(Dependencies)
add_subdirectory(${REPO_ROOT}/core ${CMAKE_BINARY_DIR}/core EXCLUDE_FROM_ALL)

# Node-API (node-addon-api headers from node_modules)
execute_process(COMMAND node -p "require('node-addon-api').include_dir"
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                OUTPUT_VARIABLE NODE_ADDON_API_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REPLACE "\"" "" NODE_ADDON_API_DIR "${NODE_ADDON_API_DIR}")

add_library(secrethider_node SHARED src/addon.cpp src/redact.cpp ${CMAKE_JS_SRC})
set_target_properties(secrethider_node PROPERTIES
  PREFIX "" SUFFIX ".node" OUTPUT_NAME "secrethider"
  # same location for Ninja and Visual Studio generators: build/Release/secrethider.node
  RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release
  LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_BINARY_DIR}/Release)
target_include_directories(secrethider_node PRIVATE ${CMAKE_JS_INC} ${NODE_ADDON_API_DIR})
target_link_libraries(secrethider_node PRIVATE secrethider::core ${CMAKE_JS_LIB})
target_compile_definitions(secrethider_node PRIVATE NAPI_VERSION=8 NAPI_CPP_EXCEPTIONS)
secrethider_set_warnings(secrethider_node)

if(MSVC)
  target_link_libraries(secrethider_node PRIVATE delayimp)  # needed by cmake-js's win_delay_load_hook
endif()

if(MSVC AND CMAKE_JS_NODELIB_DEF AND CMAKE_JS_NODELIB_TARGET)
  execute_process(COMMAND ${CMAKE_AR} /def:${CMAKE_JS_NODELIB_DEF}
                          /out:${CMAKE_JS_NODELIB_TARGET} ${CMAKE_STATIC_LINKER_FLAGS})
endif()
