#define NAPI_EXPERIMENTAL

#include <assert.h>
#include <node_api.h>

#include "calls.c"

#define DECLARE_NAPI_METHOD(name, func)                                        \
  { name, 0, func, 0, 0, 0, napi_default, 0 }

napi_value Init(napi_env env, napi_value exports) {
  napi_status status;
  napi_property_descriptor desc[] = { DECLARE_NAPI_METHOD("getMemory", getMemory), DECLARE_NAPI_METHOD("getAddress", getAddress), DECLARE_NAPI_METHOD("_glfwInit", _glfwInit), DECLARE_NAPI_METHOD("_glfwTerminate", _glfwTerminate), DECLARE_NAPI_METHOD("_glfwInitHint", _glfwInitHint), DECLARE_NAPI_METHOD("_glfwGetVersion", _glfwGetVersion), DECLARE_NAPI_METHOD("_glfwGetVersionString", _glfwGetVersionString), DECLARE_NAPI_METHOD("_glfwGetError", _glfwGetError), DECLARE_NAPI_METHOD("_glfwSetErrorCallback", _glfwSetErrorCallback), DECLARE_NAPI_METHOD("_glfwGetMonitors", _glfwGetMonitors), DECLARE_NAPI_METHOD("_glfwGetPrimaryMonitor", _glfwGetPrimaryMonitor), DECLARE_NAPI_METHOD("_glfwGetMonitorPos", _glfwGetMonitorPos), DECLARE_NAPI_METHOD("_glfwGetMonitorWorkarea", _glfwGetMonitorWorkarea), DECLARE_NAPI_METHOD("_glfwGetMonitorPhysicalSize", _glfwGetMonitorPhysicalSize), DECLARE_NAPI_METHOD("_glfwGetMonitorContentScale", _glfwGetMonitorContentScale), DECLARE_NAPI_METHOD("_glfwGetMonitorName", _glfwGetMonitorName), DECLARE_NAPI_METHOD("_glfwSetMonitorUserPointer", _glfwSetMonitorUserPointer), DECLARE_NAPI_METHOD("_glfwGetMonitorUserPointer", _glfwGetMonitorUserPointer), DECLARE_NAPI_METHOD("_glfwSetMonitorCallback", _glfwSetMonitorCallback), DECLARE_NAPI_METHOD("_glfwGetVideoModes", _glfwGetVideoModes), DECLARE_NAPI_METHOD("_glfwGetVideoMode", _glfwGetVideoMode), DECLARE_NAPI_METHOD("_glfwSetGamma", _glfwSetGamma), DECLARE_NAPI_METHOD("_glfwGetGammaRamp", _glfwGetGammaRamp), DECLARE_NAPI_METHOD("_glfwSetGammaRamp", _glfwSetGammaRamp), DECLARE_NAPI_METHOD("_glfwDefaultWindowHints", _glfwDefaultWindowHints), DECLARE_NAPI_METHOD("_glfwWindowHint", _glfwWindowHint), DECLARE_NAPI_METHOD("_glfwWindowHintString", _glfwWindowHintString), DECLARE_NAPI_METHOD("_glfwCreateWindow", _glfwCreateWindow), DECLARE_NAPI_METHOD("_glfwDestroyWindow", _glfwDestroyWindow), DECLARE_NAPI_METHOD("_glfwWindowShouldClose", _glfwWindowShouldClose), DECLARE_NAPI_METHOD("_glfwSetWindowShouldClose", _glfwSetWindowShouldClose), DECLARE_NAPI_METHOD("_glfwSetWindowTitle", _glfwSetWindowTitle), DECLARE_NAPI_METHOD("_glfwSetWindowIcon", _glfwSetWindowIcon), DECLARE_NAPI_METHOD("_glfwGetWindowPos", _glfwGetWindowPos), DECLARE_NAPI_METHOD("_glfwSetWindowPos", _glfwSetWindowPos), DECLARE_NAPI_METHOD("_glfwGetWindowSize", _glfwGetWindowSize), DECLARE_NAPI_METHOD("_glfwSetWindowSizeLimits", _glfwSetWindowSizeLimits), DECLARE_NAPI_METHOD("_glfwSetWindowAspectRatio", _glfwSetWindowAspectRatio), DECLARE_NAPI_METHOD("_glfwSetWindowSize", _glfwSetWindowSize), DECLARE_NAPI_METHOD("_glfwGetFramebufferSize", _glfwGetFramebufferSize), DECLARE_NAPI_METHOD("_glfwGetWindowFrameSize", _glfwGetWindowFrameSize), DECLARE_NAPI_METHOD("_glfwGetWindowContentScale", _glfwGetWindowContentScale), DECLARE_NAPI_METHOD("_glfwGetWindowOpacity", _glfwGetWindowOpacity), DECLARE_NAPI_METHOD("_glfwSetWindowOpacity", _glfwSetWindowOpacity), DECLARE_NAPI_METHOD("_glfwIconifyWindow", _glfwIconifyWindow), DECLARE_NAPI_METHOD("_glfwRestoreWindow", _glfwRestoreWindow), DECLARE_NAPI_METHOD("_glfwMaximizeWindow", _glfwMaximizeWindow), DECLARE_NAPI_METHOD("_glfwShowWindow", _glfwShowWindow), DECLARE_NAPI_METHOD("_glfwHideWindow", _glfwHideWindow), DECLARE_NAPI_METHOD("_glfwFocusWindow", _glfwFocusWindow), DECLARE_NAPI_METHOD("_glfwRequestWindowAttention", _glfwRequestWindowAttention), DECLARE_NAPI_METHOD("_glfwGetWindowMonitor", _glfwGetWindowMonitor), DECLARE_NAPI_METHOD("_glfwSetWindowMonitor", _glfwSetWindowMonitor), DECLARE_NAPI_METHOD("_glfwGetWindowAttrib", _glfwGetWindowAttrib), DECLARE_NAPI_METHOD("_glfwSetWindowAttrib", _glfwSetWindowAttrib), DECLARE_NAPI_METHOD("_glfwSetWindowUserPointer", _glfwSetWindowUserPointer), DECLARE_NAPI_METHOD("_glfwGetWindowUserPointer", _glfwGetWindowUserPointer), DECLARE_NAPI_METHOD("_glfwSetWindowPosCallback", _glfwSetWindowPosCallback), DECLARE_NAPI_METHOD("_glfwSetWindowSizeCallback", _glfwSetWindowSizeCallback), DECLARE_NAPI_METHOD("_glfwSetWindowCloseCallback", _glfwSetWindowCloseCallback), DECLARE_NAPI_METHOD("_glfwSetWindowRefreshCallback", _glfwSetWindowRefreshCallback), DECLARE_NAPI_METHOD("_glfwSetWindowFocusCallback", _glfwSetWindowFocusCallback), DECLARE_NAPI_METHOD("_glfwSetWindowIconifyCallback", _glfwSetWindowIconifyCallback), DECLARE_NAPI_METHOD("_glfwSetWindowMaximizeCallback", _glfwSetWindowMaximizeCallback), DECLARE_NAPI_METHOD("_glfwSetFramebufferSizeCallback", _glfwSetFramebufferSizeCallback), DECLARE_NAPI_METHOD("_glfwSetWindowContentScaleCallback", _glfwSetWindowContentScaleCallback), DECLARE_NAPI_METHOD("_glfwPollEvents", _glfwPollEvents), DECLARE_NAPI_METHOD("_glfwWaitEvents", _glfwWaitEvents), DECLARE_NAPI_METHOD("_glfwWaitEventsTimeout", _glfwWaitEventsTimeout), DECLARE_NAPI_METHOD("_glfwPostEmptyEvent", _glfwPostEmptyEvent), DECLARE_NAPI_METHOD("_glfwGetInputMode", _glfwGetInputMode), DECLARE_NAPI_METHOD("_glfwSetInputMode", _glfwSetInputMode), DECLARE_NAPI_METHOD("_glfwRawMouseMotionSupported", _glfwRawMouseMotionSupported), DECLARE_NAPI_METHOD("_glfwGetKeyName", _glfwGetKeyName), DECLARE_NAPI_METHOD("_glfwGetKeyScancode", _glfwGetKeyScancode), DECLARE_NAPI_METHOD("_glfwGetKey", _glfwGetKey), DECLARE_NAPI_METHOD("_glfwGetMouseButton", _glfwGetMouseButton), DECLARE_NAPI_METHOD("_glfwGetCursorPos", _glfwGetCursorPos), DECLARE_NAPI_METHOD("_glfwSetCursorPos", _glfwSetCursorPos), DECLARE_NAPI_METHOD("_glfwCreateCursor", _glfwCreateCursor), DECLARE_NAPI_METHOD("_glfwCreateStandardCursor", _glfwCreateStandardCursor), DECLARE_NAPI_METHOD("_glfwDestroyCursor", _glfwDestroyCursor), DECLARE_NAPI_METHOD("_glfwSetCursor", _glfwSetCursor), DECLARE_NAPI_METHOD("_glfwSetKeyCallback", _glfwSetKeyCallback), DECLARE_NAPI_METHOD("_glfwSetCharCallback", _glfwSetCharCallback), DECLARE_NAPI_METHOD("_glfwSetCharModsCallback", _glfwSetCharModsCallback), DECLARE_NAPI_METHOD("_glfwSetMouseButtonCallback", _glfwSetMouseButtonCallback), DECLARE_NAPI_METHOD("_glfwSetCursorPosCallback", _glfwSetCursorPosCallback), DECLARE_NAPI_METHOD("_glfwSetCursorEnterCallback", _glfwSetCursorEnterCallback), DECLARE_NAPI_METHOD("_glfwSetScrollCallback", _glfwSetScrollCallback), DECLARE_NAPI_METHOD("_glfwSetDropCallback", _glfwSetDropCallback), DECLARE_NAPI_METHOD("_glfwJoystickPresent", _glfwJoystickPresent), DECLARE_NAPI_METHOD("_glfwGetJoystickAxes", _glfwGetJoystickAxes), DECLARE_NAPI_METHOD("_glfwGetJoystickButtons", _glfwGetJoystickButtons), DECLARE_NAPI_METHOD("_glfwGetJoystickHats", _glfwGetJoystickHats), DECLARE_NAPI_METHOD("_glfwGetJoystickName", _glfwGetJoystickName), DECLARE_NAPI_METHOD("_glfwGetJoystickGUID", _glfwGetJoystickGUID), DECLARE_NAPI_METHOD("_glfwSetJoystickUserPointer", _glfwSetJoystickUserPointer), DECLARE_NAPI_METHOD("_glfwGetJoystickUserPointer", _glfwGetJoystickUserPointer), DECLARE_NAPI_METHOD("_glfwJoystickIsGamepad", _glfwJoystickIsGamepad), DECLARE_NAPI_METHOD("_glfwSetJoystickCallback", _glfwSetJoystickCallback), DECLARE_NAPI_METHOD("_glfwUpdateGamepadMappings", _glfwUpdateGamepadMappings), DECLARE_NAPI_METHOD("_glfwGetGamepadName", _glfwGetGamepadName), DECLARE_NAPI_METHOD("_glfwGetGamepadState", _glfwGetGamepadState), DECLARE_NAPI_METHOD("_glfwSetClipboardString", _glfwSetClipboardString), DECLARE_NAPI_METHOD("_glfwGetClipboardString", _glfwGetClipboardString), DECLARE_NAPI_METHOD("_glfwGetTime", _glfwGetTime), DECLARE_NAPI_METHOD("_glfwSetTime", _glfwSetTime), DECLARE_NAPI_METHOD("_glfwGetTimerValue", _glfwGetTimerValue), DECLARE_NAPI_METHOD("_glfwGetTimerFrequency", _glfwGetTimerFrequency), DECLARE_NAPI_METHOD("_glfwMakeContextCurrent", _glfwMakeContextCurrent), DECLARE_NAPI_METHOD("_glfwGetCurrentContext", _glfwGetCurrentContext), DECLARE_NAPI_METHOD("_glfwSwapBuffers", _glfwSwapBuffers), DECLARE_NAPI_METHOD("_glfwSwapInterval", _glfwSwapInterval), DECLARE_NAPI_METHOD("_glfwExtensionSupported", _glfwExtensionSupported), DECLARE_NAPI_METHOD("_glfwGetProcAddress", _glfwGetProcAddress), DECLARE_NAPI_METHOD("_glfwVulkanSupported", _glfwVulkanSupported), DECLARE_NAPI_METHOD("_glfwGetRequiredInstanceExtensions", _glfwGetRequiredInstanceExtensions),  };
  status = napi_define_properties(env, exports, 118, desc);
  assert(status == napi_ok);
  return exports;
}

NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
