diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml new file mode 100644 index 0000000..1091ab1 --- /dev/null +++ b/.github/workflows/nodejs.yml @@ -0,0 +1,38 @@ +name: Node CI + +on: [push] + +jobs: + build: + strategy: + fail-fast: false + matrix: + node-version: [8.x, 10.x, 12.x] + platform: + - { os: windows-latest, force-hunspell: true } + - { os: windows-latest } + - { os: macos-latest, force-hunspell: true } + - { os: macos-latest } + - { os: ubuntu-latest, use-clang: true } + + runs-on: ${{ matrix.platform.os }} + env: + SPELLCHECKER_PREFER_HUNSPELL: ${{ matrix.platform.hunspell }} + + steps: + - uses: actions/checkout@v1 + - name: Use Node.js ${{ matrix.node-version }} + uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - name: npm install, build, and test (clang) + if: matrix.platform.use-clang == true + run: | + export CC="$(which clang)" + export CPP="$(which clang++)" + npm install + npm test + - name: npm install, build, and test + run: | + npm install + npm test diff --git a/.gitignore b/.gitignore index c24784c..c0f05f6 100644 --- a/.gitignore +++ b/.gitignore @@ -3,4 +3,4 @@ build/ node_modules/ npm-debug.log -package-lock.json +.idea/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index 0ea25f3..0000000 --- a/.travis.yml +++ /dev/null @@ -1,35 +0,0 @@ -notifications: - email: - on_success: never - on_failure: change - -os: - - linux - - osx - -install: - - rm -rf ~/.nvm - - git clone https://github.com/creationix/nvm.git ~/.nvm - - source ~/.nvm/nvm.sh - - nvm install $NODE_VERSION - - node --version - - npm install - -script: npm test - -sudo: false - -git: - depth: 10 - -branches: - only: - - master - -env: - global: - - CC=clang CXX=clang++ npm_config_clang=1 - matrix: - - NODE_VERSION=8.9.3 - - NODE_VERSION=10 - - NODE_VERSION=12 diff --git a/appveyor.yml b/appveyor.yml deleted file mode 100644 index 6eb4f22..0000000 --- a/appveyor.yml +++ /dev/null @@ -1,18 +0,0 @@ -environment: - matrix: - - nodejs_version: '10' - - nodejs_version: '10' - SPELLCHECKER_PREFER_HUNSPELL: true - - nodejs_version: '8' - -install: - - ps: Install-Product node $env:nodejs_version - - npm --msvs_version=2015 install - -test_script: - - node --version - - npm --version - - ps: Write-Host $env:SPELLCHECKER_PREFER_HUNSPELL - - npm test - -build: off diff --git a/binding.gyp b/binding.gyp index bfb0fa4..3c76df4 100644 --- a/binding.gyp +++ b/binding.gyp @@ -1,15 +1,12 @@ { 'variables': { 'conditions': [ - ['OS=="mac"', { - 'spellchecker_use_hunspell%': 'true', - }], - ['OS=="linux"', { - 'spellchecker_use_hunspell': 'true', - }], - ['OS=="win"', { - 'spellchecker_use_hunspell': 'true', - }], + ['OS=="mac"', { 'spellchecker_use_hunspell%': 'true' }, + 'OS=="linux"', { 'spellchecker_use_hunspell': 'true'}, + 'OS=="win"', { 'spellchecker_use_hunspell': 'true' }, + 'OS=="freebsd"', { 'spellchecker_use_hunspell': 'true' }, + { 'spellchecker_use_hunspell': 'false' } + ], ], }, 'target_defaults': { diff --git a/package-lock.json b/package-lock.json index 3bd3e17..ed85921 100644 --- a/package-lock.json +++ b/package-lock.json @@ -44,13 +44,13 @@ "dev": true }, "coffeestack": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/coffeestack/-/coffeestack-1.1.2.tgz", - "integrity": "sha1-NSePO+uc5vXQraH7bgh4UrZXzpg=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/coffeestack/-/coffeestack-1.2.0.tgz", + "integrity": "sha512-vXT7ZxSZ4lXHh/0A2cODyFqrVIl4Vb0Er5wcS2SrFN4jW8g1qIAmcMsRlRdUKvnvfmKixvENYspAyF/ihWbpyw==", "dev": true, "requires": { "coffee-script": "~1.8.0", - "fs-plus": "^2.5.0", + "fs-plus": "^3.1.1", "source-map": "~0.1.43" }, "dependencies": { @@ -116,9 +116,9 @@ } }, "fs-plus": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/fs-plus/-/fs-plus-2.10.1.tgz", - "integrity": "sha1-MgR4HXhAYR5jZOe2+wWMljJ8WqU=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fs-plus/-/fs-plus-3.1.1.tgz", + "integrity": "sha512-Se2PJdOWXqos1qVTkvqqjb0CSnfBnwwD+pq+z4ksT+e97mEShod/hrNg0TRCCsXPbJzcIq+NuzQhigunMWMJUA==", "dev": true, "requires": { "async": "^1.5.2", @@ -128,12 +128,12 @@ }, "dependencies": { "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } } } @@ -167,9 +167,9 @@ } }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { "fs.realpath": "^1.0.0", @@ -191,9 +191,9 @@ } }, "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "jasmine-focused": { @@ -209,7 +209,7 @@ }, "jasmine-node": { "version": "git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", - "from": "jasmine-node@git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "from": "git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", "dev": true, "requires": { "coffee-script": ">=1.0.1", @@ -233,12 +233,12 @@ }, "dependencies": { "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } } } @@ -259,9 +259,9 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mkdirp": { @@ -271,9 +271,9 @@ "dev": true }, "nan": { - "version": "2.14.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", - "integrity": "sha512-INOFj37C7k3AfaNTtX8RhsTw7qRy7eLET14cROi9+5HAVbbHuIWUHEauBv5qT4Av2tWasiTY1Jw6puUNqRJXQg==" + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==" }, "once": { "version": "1.4.0", @@ -297,9 +297,9 @@ "dev": true }, "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { "glob": "^7.1.3" @@ -321,26 +321,18 @@ } }, "underscore": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz", - "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.12.0.tgz", + "integrity": "sha512-21rQzss/XPMjolTiIezSu3JAjgagXKROtNrYFEOWK109qY1Uv2tVjPTZ1ci2HgvQDA16gHYSthQIJfB+XId/rQ==", "dev": true }, "underscore-plus": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.6.8.tgz", - "integrity": "sha512-88PrCeMKeAAC1L4xjSiiZ3Fg6kZOYrLpLGVPPeqKq/662DfQe/KTSKdSR/Q/tucKNnfW2MNAUGSCkDf8HmXC5Q==", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.7.0.tgz", + "integrity": "sha512-A3BEzkeicFLnr+U/Q3EyWwJAQPbA19mtZZ4h+lLq3ttm9kn8WC4R3YpuJZEXmWdLjYP47Zc8aLZm9kwdv+zzvA==", "dev": true, "requires": { - "underscore": "~1.8.3" - }, - "dependencies": { - "underscore": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", - "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", - "dev": true - } + "underscore": "^1.9.1" } }, "walkdir": { @@ -356,9 +348,9 @@ "dev": true }, "xmldom": { - "version": "0.1.27", - "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", - "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.31.tgz", + "integrity": "sha512-yS2uJflVQs6n+CyjHoaBmVSqIDevTAWrzMmjG1Gc7h1qQ7uVozNhEPJAwZXWyGQ/Gafo3fCwrcaokezLPupVyQ==", "dev": true } } diff --git a/src/main.cc b/src/main.cc index 0318ac5..3f335dc 100644 --- a/src/main.cc +++ b/src/main.cc @@ -134,9 +134,22 @@ class Spellchecker : public Nan::ObjectWrap { uint32_t start = iter->start, end = iter->end; Local misspelled_range = Nan::New(); + +#ifdef V8_USE_MAYBE + { + Isolate* isolate = misspelled_range->GetIsolate(); + Local context = isolate->GetCurrentContext(); + misspelled_range->Set(context, Nan::New("start").ToLocalChecked(), Nan::New(start)).Check(); + misspelled_range->Set(context, Nan::New("end").ToLocalChecked(), Nan::New(end)).Check(); + } + Isolate* isolate = result->GetIsolate(); + Local context = isolate->GetCurrentContext(); + result->Set(context, index, misspelled_range).Check(); +#else misspelled_range->Set(Nan::New("start").ToLocalChecked(), Nan::New(start)); misspelled_range->Set(Nan::New("end").ToLocalChecked(), Nan::New(end)); result->Set(index, misspelled_range); +#endif } } @@ -220,7 +233,13 @@ class Spellchecker : public Nan::ObjectWrap { Local result = Nan::New(dictionaries.size()); for (size_t i = 0; i < dictionaries.size(); ++i) { const std::string& dict = dictionaries[i]; +#ifdef V8_USE_MAYBE + Isolate* isolate = result->GetIsolate(); + Local context = isolate->GetCurrentContext(); + result->Set(context, i, Nan::New(dict.data(), dict.size()).ToLocalChecked()).Check(); +#else result->Set(i, Nan::New(dict.data(), dict.size()).ToLocalChecked()); +#endif } info.GetReturnValue().Set(result); @@ -246,7 +265,13 @@ class Spellchecker : public Nan::ObjectWrap { const std::string& word = corrections[i]; Nan::MaybeLocal val = Nan::New(word.data(), word.size()); +#ifdef V8_USE_MAYBE + Isolate* isolate = result->GetIsolate(); + Local context = isolate->GetCurrentContext(); + result->Set(context, i, val.ToLocalChecked()).Check(); +#else result->Set(i, val.ToLocalChecked()); +#endif } info.GetReturnValue().Set(result); @@ -286,14 +311,22 @@ class Spellchecker : public Nan::ObjectWrap { Isolate* isolate = exports->GetIsolate(); Local context = isolate->GetCurrentContext(); +#ifdef V8_USE_MAYBE + exports->Set(context, Nan::New("Spellchecker").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()).Check(); +#else exports->Set(Nan::New("Spellchecker").ToLocalChecked(), tpl->GetFunction(context).ToLocalChecked()); +#endif } }; -void Init(Local exports, Local module) { - Spellchecker::Init(exports); +NAN_MODULE_INIT(Init) { + Spellchecker::Init(target); } } // namespace -NODE_MODULE(spellchecker, Init) +#if NODE_MAJOR_VERSION >= 10 + NAN_MODULE_WORKER_ENABLED(spellchecker, Init) +#else + NODE_MODULE(spellchecker, Init) +#endif \ No newline at end of file diff --git a/src/spellchecker.h b/src/spellchecker.h index d1d9b68..0c3e2ad 100644 --- a/src/spellchecker.h +++ b/src/spellchecker.h @@ -6,6 +6,10 @@ #include #include +#if (V8_MAJOR_VERSION == 7 && V8_MINOR_VERSION > 2) || V8_MAJOR_VERSION > 7 +#define V8_USE_MAYBE +#endif + namespace spellchecker { const int USE_SYSTEM_DEFAULTS = 0; diff --git a/src/worker.cc b/src/worker.cc index fbae5ec..e54bf02 100644 --- a/src/worker.cc +++ b/src/worker.cc @@ -35,11 +35,24 @@ void CheckSpellingWorker::HandleOKCallback() { uint32_t start = iter->start, end = iter->end; Local misspelled_range = Nan::New(); +#ifdef V8_USE_MAYBE + { + Isolate* isolate = misspelled_range->GetIsolate(); + Local context = isolate->GetCurrentContext(); + misspelled_range->Set(context, Nan::New("start").ToLocalChecked(), Nan::New(start)).Check(); + misspelled_range->Set(context, Nan::New("end").ToLocalChecked(), Nan::New(end)).Check(); + } + Isolate* isolate = result->GetIsolate(); + Local context = isolate->GetCurrentContext(); + result->Set(context, index, misspelled_range).Check(); +#else misspelled_range->Set(Nan::New("start").ToLocalChecked(), Nan::New(start)); misspelled_range->Set(Nan::New("end").ToLocalChecked(), Nan::New(end)); - result->Set(index, misspelled_range); + result->Set(index, misspelled_range); +#endif } Local argv[] = { Nan::Null(), result }; - callback->Call(2, argv); + Nan::AsyncResource resource("CheckSpellingWorker::HandleOKCallback"); + callback->Call(2, argv, &resource); }