From cd3c7c8dd8323bb6cbfa4c5073608235a9d3e781 Mon Sep 17 00:00:00 2001 From: ismail reida Date: Mon, 2 Nov 2026 22:12:55 +0100 Subject: [PATCH] Rewrite devisPattern in plain JavaScript for 2.0.0 The C++ addon no longer builds: it uses V8 APIs removed around Node.js 12 and cmake-js 3 crashes on install under current Node.js. It was a string hash map keyed by JSON.stringify(pattern), which a Map does natively. - Same public API (add, find, call, list) and first-registration-wins rule - Each instance now has its own table; 1.x shared one native table, so two matchers could resolve each other's patterns to the wrong handler - Drop cmake-js, nan, snyk, Travis and the npm-generated manifest fields - Real tests with node:test and a GitHub Actions matrix on Node.js 22/24 - README describes the actual exact-match behaviour --- .github/workflows/ci.yml | 19 + .gitignore | 1 - .snyk | 8 - .travis.yml | 18 - CMakeLists.txt | 19 - README.md | 113 ++-- devisPattern.js | 17 +- npm-debug.log | 140 ----- package-lock.json | 1140 -------------------------------------- package.json | 97 +--- src/addon.cpp | 25 - src/devisPattern.cpp | 123 ---- src/devisPattern.hpp | 44 -- test/devisPattern.js | 107 ++-- test/time.js | 39 -- 15 files changed, 144 insertions(+), 1766 deletions(-) create mode 100644 .github/workflows/ci.yml delete mode 100644 .snyk delete mode 100644 .travis.yml delete mode 100644 CMakeLists.txt delete mode 100644 npm-debug.log delete mode 100644 package-lock.json delete mode 100644 src/addon.cpp delete mode 100644 src/devisPattern.cpp delete mode 100644 src/devisPattern.hpp delete mode 100644 test/time.js diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..0cfd7d6 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,19 @@ +name: CI + +on: + push: + branches: [master] + pull_request: + +jobs: + test: + runs-on: ubuntu-latest + strategy: + matrix: + node: [22, 24] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node }} + - run: npm test diff --git a/.gitignore b/.gitignore index 43366bf..319c2f8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,3 @@ *.DS_Store .vscode node_modules -build diff --git a/.snyk b/.snyk deleted file mode 100644 index 81baf8b..0000000 --- a/.snyk +++ /dev/null @@ -1,8 +0,0 @@ -# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities. -version: v1.12.0 -ignore: {} -# patches apply the minimum changes required to fix a vulnerability -patch: - 'npm:lodash:20180130': - - cmake-js > lodash: - patched: '2018-07-08T00:40:47.396Z' diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f44664d..0000000 --- a/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -language: node_js -node_js: - - "6" -env: - - CXX=g++-4.8 -addons: - apt: - sources: - - ubuntu-toolchain-r-test - - george-edison55-precise-backports - packages: - - g++-4.8 - - libxtst-dev - - cmake - - cmake-data - - x11-apps -install: - - npm install diff --git a/CMakeLists.txt b/CMakeLists.txt deleted file mode 100644 index c2cec37..0000000 --- a/CMakeLists.txt +++ /dev/null @@ -1,19 +0,0 @@ -cmake_minimum_required(VERSION 2.8) - -# Name of the project (will be the name of the plugin) -project(addon) - -# Build a shared library named after the project from the files in `src/` -file(GLOB SOURCE_FILES "src/*.cpp" "src/*.hpp") -add_library(${PROJECT_NAME} SHARED ${SOURCE_FILES}) - -# Gives our library file a .node extension without any "lib" prefix -set_target_properties(${PROJECT_NAME} PROPERTIES PREFIX "" SUFFIX ".node") - -# Essential include files to build a node addon, -# You should add this line in every CMake.js based project -target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_JS_INC}) - -# Essential library files to link to a node addon -# You should add this line in every CMake.js based project -target_link_libraries(${PROJECT_NAME} ${CMAKE_JS_LIB}) \ No newline at end of file diff --git a/README.md b/README.md index 1ac1bf1..7185e6d 100644 --- a/README.md +++ b/README.md @@ -1,126 +1,81 @@ # DevisPattern ->A fast native pattern matcher addon on JavaScript object properties. - +>An exact-match pattern matcher on JavaScript object properties.

Version License - bitHound Overall Score - bitHound Overall Score - travis - -
- + CI

+This module is used by the [devis](https://github.com/Devisjs/devis) framework to route actions to their handlers. -This addon is used by the devis framework to pattern match actions. - -**Requirements:** - -It's necessary, before using DevisPattern to install: -- [CMake](http://www.cmake.org/download/)(*.msi version for windows: You must check the addition of the path for all users, And restart your computer after installation) -- A proper C/C++ compiler toolchain of the given platform - - **Windows**: - - [Visual C++ Build Tools](http://landinghub.visualstudio.com/visual-cpp-build-tools) - or a recent version of Visual C++ will do ([the free Community](https://www.visualstudio.com/products/visual-studio-community-vs) version works well) - - **Unix/linux-gnu**: - - Clang or GCC - - Ninja or Make (Ninja will be picked if both present) - - Xcode with command line tools if you are under **mac os** - - +Since 2.0.0 it is plain JavaScript: no compiler, CMake or native build is needed. Node.js 22 or later is required. ## Install ```sh npm install devisPattern ``` -Or, if you download the project: - -Generate the appropriate project build files for the current platform. Use `configure` for that: -```sh -node-gyp configure -``` -Now you will have either a `Makefile` (on Unix platforms) or a `vcxproj` file (on Windows) in the `build/` directory. Next invoke the build command: -```sh -node-gyp build -``` ### Quick example -Here's how you register some patterns, and then search for matches: ```JavaScript -const devisPattern =require("devisPattern"); //or require("./devisPattern/devisPattern"); if you download the project +const DevisPattern = require("devisPattern"); +const devisPattern = new DevisPattern(); devisPattern.add({ - action: 'game', - cmd: 'play' + action: "game", + cmd: "play" }, (args, done) => { - - done({ - result: 'play' - }); -}); -devisPattern.add({ - action: 'game', - cmd: 'pause' -}, (args, done)=> { - done({ - result: 'pause' + result: "play" }); }); devisPattern.call({ - action: 'game', - cmd: 'play' -}, (result)=> { - - console.log(result); - + action: "game", + cmd: "play" +}, (result) => { + console.log(result); // { result: 'play' } }); +``` -devisPattern.call({ - action: 'game', - cmd: 'pause' -}, (result) =>{ - +## Matching rules - console.log(result); -}); +A pattern matches only an identical pattern: same keys, same values, same key order. Patterns are compared by their `JSON.stringify` form, so `{ a: 1, b: 2 }` and `{ b: 2, a: 1 }` are different patterns, and `{ a: 1 }` does not match `{ a: 1, b: 2 }`. -``` +When the same pattern is added twice, the first handler is kept. +## API -# The Why +### new DevisPattern() -This addon lets you build a simple decision tree so you can avoid writing if statements. It tries to make the minimum number of comparisons necessary to pick out the most specific match. +Creates a matcher. Each instance has its own patterns. -# API +### .add( {...pattern...}, handler ) -### devisPattern +Registers a pattern and the handler returned when an identical pattern is looked up. Returns the instance. -Generates a new pattern matcher instance. +### .find( {...pattern...} ) +Returns the handler registered for this pattern, or `null`. -### .add( {...pattern...}, object ) +### .call( {...pattern...}, [{...arguments...}], callback ) -Register a pattern, and the object that will be returned if an input -matches. Both keys and values are considered to be strings. Other -types are converted to strings. +Calls the handler registered for this pattern with `(arguments, callback)`. `arguments` defaults to `{}`. Does nothing when no handler matches. -### .find( {...pattern...}) +### .list( ) -Return the unique match for this pattern, or null if not found. +Returns the registered patterns as a JSON array string. -### .call({...pattern...},{...arguments...},callback) +## Upgrading from 1.x -Act this pattern. +- The native addon is gone, so installing no longer needs CMake or a C++ toolchain. +- Instances no longer share a single pattern table. In 1.x, two instances could resolve each other's patterns to the wrong handler. +- Node.js 22 or later is required. -### .list( ) +## License -Return the list of registered patterns that contain this partial -pattern. +MIT diff --git a/devisPattern.js b/devisPattern.js index a4795ca..f12e4b0 100644 --- a/devisPattern.js +++ b/devisPattern.js @@ -1,30 +1,29 @@ /* Copyright (c) 2016 Devis, MIT License */ "use strict"; -const Addon = require("./build/Release/addon"); -const obj = new Addon.devisPattern(); class devisPattern { constructor() { this.path = []; this.id = 0; + this.index = new Map(); } add(path, handle) { this.path[this.id] = handle; - //path = jsonSort(path); - obj.add(JSON.stringify(path), this.id); + const key = JSON.stringify(path); + // First registration wins, as with the former native addon. + if (!this.index.has(key)) {this.index.set(key, this.id);} this.id++; return this; } find(path) { - //path = jsonSort(path); - - let id = obj.find(JSON.stringify(path)); - if (id !== -1) {return this.path[id];} + const id = this.index.get(JSON.stringify(path)); + if (id !== undefined) {return this.path[id];} else {return null;} } + call(path, args, callback) { if (!callback) { callback = args; @@ -36,7 +35,7 @@ class devisPattern { } list() { - return obj.list(); + return "[" + [...this.index.keys()].join(",") + "]"; } } diff --git a/npm-debug.log b/npm-debug.log deleted file mode 100644 index 5f025b9..0000000 --- a/npm-debug.log +++ /dev/null @@ -1,140 +0,0 @@ -0 info it worked if it ends with ok -1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'publish' ] -2 info using npm@3.10.3 -3 info using node@v6.4.0 -4 verbose publish [ '.' ] -5 silly cache add args [ '.', null ] -6 verbose cache add spec . -7 silly cache add parsed spec Result { -7 silly cache add raw: '.', -7 silly cache add scope: null, -7 silly cache add escapedName: null, -7 silly cache add name: null, -7 silly cache add rawSpec: '.', -7 silly cache add spec: '/Volumes/Is/workplace/devisPattern', -7 silly cache add type: 'directory' } -8 verbose addLocalDirectory /Users/ismail/.npm/devisPattern/1.0.2/package.tgz not in flight; packing -9 verbose correctMkdir /Users/ismail/.npm correctMkdir not in flight; initializing -10 info lifecycle devisPattern@1.0.2~prepublish: devisPattern@1.0.2 -11 silly lifecycle devisPattern@1.0.2~prepublish: no script for prepublish, continuing -12 verbose tar pack [ '/Users/ismail/.npm/devisPattern/1.0.2/package.tgz', -12 verbose tar pack '/Volumes/Is/workplace/devisPattern' ] -13 verbose tarball /Users/ismail/.npm/devisPattern/1.0.2/package.tgz -14 verbose folder /Volumes/Is/workplace/devisPattern -15 verbose addLocalTarball adding from inside cache /Users/ismail/.npm/devisPattern/1.0.2/package.tgz -16 verbose correctMkdir /Users/ismail/.npm correctMkdir not in flight; initializing -17 silly cache afterAdd devisPattern@1.0.2 -18 verbose afterAdd /Users/ismail/.npm/devisPattern/1.0.2/package/package.json not in flight; writing -19 verbose correctMkdir /Users/ismail/.npm correctMkdir not in flight; initializing -20 verbose afterAdd /Users/ismail/.npm/devisPattern/1.0.2/package/package.json written -21 silly publish { _args: [ [ [Object], '/Users/ismail/Downloads/devis-master' ] ], -21 silly publish _from: '.', -21 silly publish _id: 'devisPattern@1.0.2', -21 silly publish _inCache: true, -21 silly publish _installable: true, -21 silly publish _location: '/devisPattern', -21 silly publish _nodeVersion: '6.4.0', -21 silly publish _npmOperationalInternal: -21 silly publish { host: 'packages-12-west.internal.npmjs.com', -21 silly publish tmp: 'tmp/devisPattern-1.0.2.tgz_1480005774133_0.2085645659826696' }, -21 silly publish _npmUser: { name: 'ismailrei', email: 'ismailrei@gmail.com' }, -21 silly publish _npmVersion: '3.10.3', -21 silly publish _phantomChildren: {}, -21 silly publish _requested: -21 silly publish { raw: 'devisPattern@^1.1.0', -21 silly publish scope: null, -21 silly publish escapedName: 'devisPattern', -21 silly publish name: 'devisPattern', -21 silly publish rawSpec: '^1.1.0', -21 silly publish spec: '>=1.1.0 <2.0.0', -21 silly publish type: 'range' }, -21 silly publish _requiredBy: [ '/' ], -21 silly publish _resolved: 'https://registry.npmjs.org/devisPattern/-/devisPattern-1.0.2.tgz', -21 silly publish _shasum: '0f83766f9265c3255eb3840523f257dff0fd09e3', -21 silly publish _shrinkwrap: null, -21 silly publish _spec: 'devisPattern@^1.0.1', -21 silly publish _where: '/Users/ismail/Downloads/devis-master', -21 silly publish author: { name: 'ismail reida' }, -21 silly publish bugs: { url: 'https://github.com/Devisjs/devisPattern/issues' }, -21 silly publish dependencies: { 'cmake-js': '^3.3.1', nan: '^2.4.0' }, -21 silly publish description: 'A fast native pattern matcher addon on JavaScript object properties ', -21 silly publish devDependencies: {}, -21 silly publish directories: {}, -21 silly publish dist: -21 silly publish { shasum: '4f45ba61e16f12a2afcc42565411d6d17b5f60e8', -21 silly publish tarball: 'https://registry.npmjs.org/devisPattern/-/devisPattern-1.0.2.tgz' }, -21 silly publish gitHead: '8b470250f60a98cfc737752bcc5657696b2fa086', -21 silly publish homepage: 'https://github.com/Devisjs/devisPattern', -21 silly publish keywords: [ 'pattern', 'matcher', 'object', 'property', 'json' ], -21 silly publish license: 'MIT', -21 silly publish main: 'devisPattern.js', -21 silly publish maintainers: [ { name: 'ismailrei', email: 'ismailrei@gmail.com' } ], -21 silly publish name: 'devisPattern', -21 silly publish optionalDependencies: {}, -21 silly publish readme: 'ERROR: No README data found!', -21 silly publish repository: -21 silly publish { type: 'git', -21 silly publish url: 'git://github.com/Devisjs/devisPattern.git' }, -21 silly publish scripts: -21 silly publish { install: 'cmake-js compile', -21 silly publish test: 'node test/devisPattern.js' }, -21 silly publish version: '1.0.2' } -22 verbose getPublishConfig undefined -23 silly mapToRegistry name devisPattern -24 silly mapToRegistry using default registry -25 silly mapToRegistry registry https://registry.npmjs.org/ -26 silly mapToRegistry data Result { -26 silly mapToRegistry raw: 'devisPattern', -26 silly mapToRegistry scope: null, -26 silly mapToRegistry escapedName: 'devisPattern', -26 silly mapToRegistry name: 'devisPattern', -26 silly mapToRegistry rawSpec: '', -26 silly mapToRegistry spec: 'latest', -26 silly mapToRegistry type: 'tag' } -27 silly mapToRegistry uri https://registry.npmjs.org/devisPattern -28 verbose publish registryBase https://registry.npmjs.org/ -29 silly publish uploading /Users/ismail/.npm/devisPattern/1.0.2/package.tgz -30 verbose request uri https://registry.npmjs.org/devisPattern -31 verbose request sending authorization for write operation -32 info attempt registry request try #1 at 5:24:55 PM -33 verbose request using bearer token for auth -34 verbose request id 18c3abee03222d92 -35 http request PUT https://registry.npmjs.org/devisPattern -36 http 403 https://registry.npmjs.org/devisPattern -37 verbose headers { 'content-type': 'application/json', -37 verbose headers 'cache-control': 'max-age=300', -37 verbose headers 'content-length': '95', -37 verbose headers 'accept-ranges': 'bytes', -37 verbose headers date: 'Sat, 06 May 2017 15:24:56 GMT', -37 verbose headers via: '1.1 varnish', -37 verbose headers connection: 'keep-alive', -37 verbose headers 'x-served-by': 'cache-cdg8723-CDG', -37 verbose headers 'x-cache': 'MISS', -37 verbose headers 'x-cache-hits': '0', -37 verbose headers 'x-timer': 'S1494084296.543268,VS0,VE1314', -37 verbose headers vary: 'Accept-Encoding' } -38 verbose request invalidating /Users/ismail/.npm/registry.npmjs.org/devisPattern on PUT -39 error publish Failed PUT 403 -40 verbose stack Error: "You cannot publish over the previously published version 1.0.2." : devisPattern -40 verbose stack at makeError (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:264:12) -40 verbose stack at CachingRegistryClient. (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:252:14) -40 verbose stack at Request._callback (/usr/local/lib/node_modules/npm/node_modules/npm-registry-client/lib/request.js:172:14) -40 verbose stack at Request.self.callback (/usr/local/lib/node_modules/npm/node_modules/request/request.js:200:22) -40 verbose stack at emitTwo (events.js:106:13) -40 verbose stack at Request.emit (events.js:191:7) -40 verbose stack at Request. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:1067:10) -40 verbose stack at emitOne (events.js:101:20) -40 verbose stack at Request.emit (events.js:188:7) -40 verbose stack at IncomingMessage. (/usr/local/lib/node_modules/npm/node_modules/request/request.js:988:12) -41 verbose statusCode 403 -42 verbose pkgid devisPattern -43 verbose cwd /Volumes/Is/workplace/devisPattern -44 error Darwin 16.6.0 -45 error argv "/usr/local/bin/node" "/usr/local/bin/npm" "publish" -46 error node v6.4.0 -47 error npm v3.10.3 -48 error code E403 -49 error "You cannot publish over the previously published version 1.0.2." : devisPattern -50 error If you need help, you may report this error at: -50 error -51 verbose exit [ 1, true ] diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 59e7aa5..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1140 +0,0 @@ -{ - "name": "devisPattern", - "version": "1.2.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "ajv": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.2.3.tgz", - "integrity": "sha1-wG9Zh3jETGsWGrr+NGa4GtGBTtI=", - "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "json-schema-traverse": "0.3.1", - "json-stable-stringify": "1.0.1" - } - }, - "amdefine": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", - "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" - }, - "ansi": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.1.tgz", - "integrity": "sha1-DELU+xcWDVqa8eSEus4cZpIsGyE=" - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" - }, - "are-we-there-yet": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.6.tgz", - "integrity": "sha1-otKMkxAqpsyWJFomy5VN4G7FPww=", - "requires": { - "delegates": "1.0.0", - "readable-stream": "2.3.3" - }, - "dependencies": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", - "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", - "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "binary": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/binary/-/binary-0.3.0.tgz", - "integrity": "sha1-n2BVO8XOjDOG87VTz/R0Yq3sqnk=", - "requires": { - "buffers": "0.1.1", - "chainsaw": "0.1.0" - } - }, - "bluebird": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", - "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=" - }, - "boom": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", - "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", - "requires": { - "hoek": "4.2.0" - } - }, - "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", - "requires": { - "balanced-match": "1.0.0", - "concat-map": "0.0.1" - } - }, - "buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha1-skV5w77U1tOWru5tmorn9Ugqt7s=" - }, - "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chainsaw": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/chainsaw/-/chainsaw-0.1.0.tgz", - "integrity": "sha1-XqtQsor+WAdNDVgpE4iCi15fvJg=", - "requires": { - "traverse": "0.3.9" - } - }, - "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" - }, - "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" - } - }, - "cmake-js": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/cmake-js/-/cmake-js-3.5.0.tgz", - "integrity": "sha512-oF8JcY94qAzSlA1xmq6PexQHeT76vFSCslnLue4WK/LlF41sy7GVvhSulfTrtMtmM1C1pih3NRXaFE4+9i24oQ==", - "requires": { - "bluebird": "2.11.0", - "debug": "2.6.9", - "fs-extra": "1.0.0", - "is-iojs": "1.1.0", - "lodash": "3.10.1", - "memory-stream": "0.0.3", - "npmconf": "2.1.2", - "npmlog": "1.2.1", - "request": "2.83.0", - "semver": "5.4.1", - "splitargs": "0.0.7", - "tar": "3.2.1", - "traceur": "0.0.111", - "unzip": "0.1.11", - "url-join": "0.0.1", - "which": "1.3.0", - "yargs": "3.32.0" - } - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" - }, - "code-point-at": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", - "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" - }, - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", - "requires": { - "delayed-stream": "1.0.0" - } - }, - "commander": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", - "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", - "requires": { - "graceful-readlink": "1.0.1" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "config-chain": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz", - "integrity": "sha1-q6CXR9++TD5w52am5BWG4YWfxvI=", - "requires": { - "ini": "1.3.4", - "proto-list": "1.2.4" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cryptiles": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", - "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", - "requires": { - "boom": "5.2.0" - }, - "dependencies": { - "boom": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", - "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", - "requires": { - "hoek": "4.2.0" - } - } - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "requires": { - "ms": "2.0.0" - } - }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "delegates": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", - "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" - }, - "ecc-jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", - "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=" - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "fs-extra": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", - "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", - "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1" - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "fstream": { - "version": "0.1.31", - "resolved": "https://registry.npmjs.org/fstream/-/fstream-0.1.31.tgz", - "integrity": "sha1-czfwWPu7vvqMn1YaKMqwhJICyYg=", - "requires": { - "graceful-fs": "3.0.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.2" - }, - "dependencies": { - "graceful-fs": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", - "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", - "requires": { - "natives": "1.1.0" - } - } - } - }, - "gauge": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.7.tgz", - "integrity": "sha1-6c7FSD09TuDvRLYKfZnkk14TbZM=", - "requires": { - "ansi": "0.3.1", - "has-unicode": "2.0.1", - "lodash.pad": "4.5.1", - "lodash.padend": "4.6.1", - "lodash.padstart": "4.6.1" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "1.0.0" - } - }, - "glob": { - "version": "5.0.15", - "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", - "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", - "requires": { - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.3.3", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" - }, - "graceful-readlink": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", - "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", - "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", - "requires": { - "ajv": "5.2.3", - "har-schema": "2.0.0" - } - }, - "has-unicode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", - "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" - }, - "hawk": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", - "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", - "requires": { - "boom": "4.3.1", - "cryptiles": "3.1.2", - "hoek": "4.2.0", - "sntp": "2.0.2" - } - }, - "hoek": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", - "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==" - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "1.0.0", - "jsprim": "1.4.1", - "sshpk": "1.13.1" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "1.3.3", - "wrappy": "1.0.2" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" - }, - "ini": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", - "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=" - }, - "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" - }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "requires": { - "number-is-nan": "1.0.1" - } - }, - "is-iojs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-iojs/-/is-iojs-1.1.0.tgz", - "integrity": "sha1-TBEDO11dlNbqs3dd7cm+fQCDJfE=" - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", - "optional": true - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" - }, - "json-stable-stringify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", - "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", - "requires": { - "jsonify": "0.0.0" - } - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "requires": { - "graceful-fs": "4.1.11" - } - }, - "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", - "requires": { - "invert-kv": "1.0.0" - } - }, - "lodash": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", - "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" - }, - "lodash.pad": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-4.5.1.tgz", - "integrity": "sha1-QzCUmoM6fI2iLMIPaibE1Z3runA=" - }, - "lodash.padend": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padend/-/lodash.padend-4.6.1.tgz", - "integrity": "sha1-U8y6BH0G4VjTEfRdpiX05J5vFm4=" - }, - "lodash.padstart": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/lodash.padstart/-/lodash.padstart-4.6.1.tgz", - "integrity": "sha1-0uPuv/DZ05rVD1y9G1KnvOa7YRs=" - }, - "match-stream": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/match-stream/-/match-stream-0.0.2.tgz", - "integrity": "sha1-mesFAJOzTf+t5CG5rAtBCpz6F88=", - "requires": { - "buffers": "0.1.1", - "readable-stream": "1.0.34" - } - }, - "memory-stream": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/memory-stream/-/memory-stream-0.0.3.tgz", - "integrity": "sha1-6+jdHDuLw4wOeUHp3dWuvmtN6D8=", - "requires": { - "readable-stream": "1.0.34" - } - }, - "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" - }, - "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", - "requires": { - "mime-db": "1.30.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "1.1.8" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" - }, - "minipass": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.2.1.tgz", - "integrity": "sha512-u1aUllxPJUI07cOqzR7reGmQxmCqlH88uIIsf6XZFEWgw7gXKpJdR+5R9Y3KEDmWYkdIz9wXZs3C0jOPxejk/Q==", - "requires": { - "yallist": "3.0.2" - } - }, - "minizlib": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.0.3.tgz", - "integrity": "sha1-1cGr93vhVGGZUuJTM27Mq5sqMvU=", - "requires": { - "minipass": "2.2.1" - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - }, - "nan": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.7.0.tgz", - "integrity": "sha1-2Vv3IeyHfgjbJ27T/G63j5CDrUY=" - }, - "natives": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.0.tgz", - "integrity": "sha1-6f+EFBimsux6SV6TmYT3jxY+bjE=" - }, - "nopt": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", - "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", - "requires": { - "abbrev": "1.1.1" - } - }, - "npmconf": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/npmconf/-/npmconf-2.1.2.tgz", - "integrity": "sha1-ZmBqSnNvHnegWaoHGnnJSreBhTo=", - "requires": { - "config-chain": "1.1.11", - "inherits": "2.0.3", - "ini": "1.3.4", - "mkdirp": "0.5.1", - "nopt": "3.0.6", - "once": "1.3.3", - "osenv": "0.1.4", - "semver": "4.3.6", - "uid-number": "0.0.5" - }, - "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" - } - } - }, - "npmlog": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-1.2.1.tgz", - "integrity": "sha1-KOe+YZYJtT960d0wChDWTXFiaLY=", - "requires": { - "ansi": "0.3.1", - "are-we-there-yet": "1.0.6", - "gauge": "1.2.7" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" - }, - "oauth-sign": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", - "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" - }, - "once": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", - "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", - "requires": { - "wrappy": "1.0.2" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", - "requires": { - "lcid": "1.0.0" - } - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", - "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", - "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" - } - }, - "over": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/over/-/over-0.0.5.tgz", - "integrity": "sha1-8phS5w/X4l82DgE6jsRMgq7bVwg=" - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" - }, - "proto-list": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", - "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" - }, - "pullstream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/pullstream/-/pullstream-0.4.1.tgz", - "integrity": "sha1-1vs79a7Wl+gxFQ6xACwlo/iuExQ=", - "requires": { - "over": "0.0.5", - "readable-stream": "1.0.34", - "setimmediate": "1.0.5", - "slice-stream": "1.0.0" - } - }, - "punycode": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", - "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" - }, - "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - } - }, - "request": { - "version": "2.83.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", - "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", - "requires": { - "aws-sign2": "0.7.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.3.1", - "har-validator": "5.0.3", - "hawk": "6.0.2", - "http-signature": "1.2.0", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.17", - "oauth-sign": "0.8.2", - "performance-now": "2.1.0", - "qs": "6.5.1", - "safe-buffer": "5.1.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.3", - "tunnel-agent": "0.6.0", - "uuid": "3.1.0" - } - }, - "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", - "requires": { - "glob": "7.1.2" - }, - "dependencies": { - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.3.3", - "path-is-absolute": "1.0.1" - } - } - } - }, - "rsvp": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/rsvp/-/rsvp-3.6.2.tgz", - "integrity": "sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw==" - }, - "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" - }, - "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==" - }, - "setimmediate": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", - "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=" - }, - "slice-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-stream/-/slice-stream-1.0.0.tgz", - "integrity": "sha1-WzO9ZvATsaf4ZGCwPUY97DmtPqA=", - "requires": { - "readable-stream": "1.0.34" - } - }, - "sntp": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", - "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", - "requires": { - "hoek": "4.2.0" - } - }, - "source-map": { - "version": "0.1.32", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.32.tgz", - "integrity": "sha1-yLbBZ3l7pHQKjqMyUhYv8IWRsmY=", - "requires": { - "amdefine": "1.0.1" - } - }, - "source-map-support": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.2.10.tgz", - "integrity": "sha1-6lo5AKHByyUJagrozFwrSxDe09w=", - "requires": { - "source-map": "0.1.32" - } - }, - "splitargs": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/splitargs/-/splitargs-0.0.7.tgz", - "integrity": "sha1-/p965lc3GzOxDLgNoUPPgknPazs=" - }, - "sshpk": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", - "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - } - }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" - } - }, - "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" - }, - "stringstream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", - "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "requires": { - "ansi-regex": "2.1.1" - } - }, - "tar": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/tar/-/tar-3.2.1.tgz", - "integrity": "sha512-ZSzds1E0IqutvMU8HxjMaU8eB7urw2fGwTq88ukDOVuUIh0656l7/P7LiVPxhO5kS4flcRJQk8USG+cghQbTUQ==", - "requires": { - "chownr": "1.0.1", - "minipass": "2.2.1", - "minizlib": "1.0.3", - "mkdirp": "0.5.1", - "yallist": "3.0.2" - } - }, - "tough-cookie": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", - "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", - "requires": { - "punycode": "1.4.1" - } - }, - "traceur": { - "version": "0.0.111", - "resolved": "https://registry.npmjs.org/traceur/-/traceur-0.0.111.tgz", - "integrity": "sha1-wE3nTRRpbDNzQn3k/Ajsr5E/w6E=", - "requires": { - "commander": "2.9.0", - "glob": "5.0.15", - "rsvp": "3.6.2", - "semver": "4.3.6", - "source-map-support": "0.2.10" - }, - "dependencies": { - "semver": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", - "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=" - } - } - }, - "traverse": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz", - "integrity": "sha1-cXuPIgzAu3tE5AUUwisui7xw2Lk=" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "5.1.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", - "optional": true - }, - "uid-number": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz", - "integrity": "sha1-Wj2yPvXb1VuB/ODsmirG/M3ruB4=" - }, - "unzip": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/unzip/-/unzip-0.1.11.tgz", - "integrity": "sha1-iXScY7BY19kNYZ+GuYqhU107l/A=", - "requires": { - "binary": "0.3.0", - "fstream": "0.1.31", - "match-stream": "0.0.2", - "pullstream": "0.4.1", - "readable-stream": "1.0.34", - "setimmediate": "1.0.5" - } - }, - "url-join": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/url-join/-/url-join-0.0.1.tgz", - "integrity": "sha1-HbSK1CLTQCRpqH99l73r/k+x48g=" - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "1.3.0" - } - }, - "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "requires": { - "isexe": "2.0.0" - } - }, - "window-size": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", - "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" - }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" - }, - "yallist": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", - "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" - }, - "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", - "requires": { - "camelcase": "2.1.1", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "os-locale": "1.4.0", - "string-width": "1.0.2", - "window-size": "0.1.4", - "y18n": "3.2.1" - } - } - } -} diff --git a/package.json b/package.json index e8f8b00..275a83e 100644 --- a/package.json +++ b/package.json @@ -1,71 +1,17 @@ { - "_args": [ - [ - { - "raw": "devisPattern@^1.2.1", - "scope": null, - "escapedName": "devisPattern", - "name": "devisPattern", - "rawSpec": "^1.2.1", - "spec": ">=1.2.1 <2.0.0", - "type": "range" - }, - "/Users/ismail/Downloads/devis-master" - ] - ], - "_from": "devisPattern@>=1.2.1 <2.0.0", - "_id": "devisPattern@1.2.1", - "_inCache": true, - "_installable": true, - "_location": "/devisPattern", - "_nodeVersion": "6.4.0", - "_npmOperationalInternal": { - "host": "packages-12-west.internal.npmjs.com", - "tmp": "tmp/devisPattern-1.0.2.tgz_1480005774133_0.2085645659826696" - }, - "_npmUser": { - "name": "ismailrei", - "email": "ismailrei@gmail.com" - }, - "_npmVersion": "3.10.3", - "_phantomChildren": {}, - "_requested": { - "raw": "devisPattern@^1.2.1", - "scope": null, - "escapedName": "devisPattern", - "name": "devisPattern", - "rawSpec": "^1.2.1", - "spec": ">=1.2.1 <2.0.0", - "type": "range" - }, - "_requiredBy": [ - "/" + "name": "devisPattern", + "version": "2.0.0", + "description": "An exact-match pattern matcher on JavaScript object properties", + "main": "devisPattern.js", + "files": [ + "devisPattern.js" ], - "_resolved": "https://registry.npmjs.org/devisPattern/-/devisPattern-1.0.2.tgz", - "_shasum": "4f45ba61e16f12a2afcc42565411d6d17b5f60e8", - "_shrinkwrap": null, - "_spec": "devisPattern@^1.0.1", - "_where": "/Users/ismail/Downloads/devis-master", - "author": { - "name": "ismail reida" - }, - "bugs": { - "url": "https://github.com/Devisjs/devisPattern/issues" - }, - "dependencies": { - "cmake-js": "^3.5.0", - "nan": "^2.7.0", - "snyk": "^1.88.2" + "scripts": { + "test": "node --test" }, - "description": "A fast native pattern matcher addon on JavaScript object properties ", - "devDependencies": {}, - "directories": {}, - "dist": { - "shasum": "4f45ba61e16f12a2afcc42565411d6d17b5f60e8", - "tarball": "https://registry.npmjs.org/devisPattern/-/devisPattern-1.0.2.tgz" + "engines": { + "node": ">=22" }, - "gitHead": "8b470250f60a98cfc737752bcc5657696b2fa086", - "homepage": "https://github.com/Devisjs/devisPattern", "keywords": [ "pattern", "matcher", @@ -73,27 +19,14 @@ "property", "json" ], + "author": "ismail reida", "license": "MIT", - "main": "devisPattern.js", - "maintainers": [ - { - "name": "ismailrei", - "email": "ismailrei@gmail.com" - } - ], - "name": "devisPattern", - "optionalDependencies": {}, - "readme": "ERROR: No README data found!", "repository": { "type": "git", - "url": "git://github.com/Devisjs/devisPattern.git" + "url": "git+https://github.com/Devisjs/devisPattern.git" }, - "scripts": { - "install": "cmake-js compile", - "test": "node test/devisPattern.js", - "snyk-protect": "snyk protect", - "prepare": "npm run snyk-protect" + "bugs": { + "url": "https://github.com/Devisjs/devisPattern/issues" }, - "version": "1.2.1", - "snyk": true + "homepage": "https://github.com/Devisjs/devisPattern" } diff --git a/src/addon.cpp b/src/addon.cpp deleted file mode 100644 index 841809b..0000000 --- a/src/addon.cpp +++ /dev/null @@ -1,25 +0,0 @@ -/* Copyright (c) 2016 Devis, MIT License */ -#include "node.h" -#include "devisPattern.hpp" - -namespace devisPattern { - - using v8::FunctionCallbackInfo; - using v8::Isolate; - using v8::Local; - using v8::Object; - using v8::String; - using v8::Value; - - void CreateObject(const FunctionCallbackInfo& args) { - devisPattern::NewInstance(args); - } - - void InitAll(Local exports) { - devisPattern::Init(exports); - - } - - NODE_MODULE(addon, InitAll) - -} diff --git a/src/devisPattern.cpp b/src/devisPattern.cpp deleted file mode 100644 index da24102..0000000 --- a/src/devisPattern.cpp +++ /dev/null @@ -1,123 +0,0 @@ -/* Copyright (c) 2016 Devis, MIT License */ -#include "node.h" -#include "devisPattern.hpp" - -//TStrStrMap devisPattern::devisPattern::tMap; - -namespace devisPattern { - - using v8::Context; - using v8::Function; - using v8::FunctionCallbackInfo; - using v8::FunctionTemplate; - using v8::Isolate; - using v8::Local; - using v8::Number; - using v8::Object; - using v8::Persistent; - using v8::String; - using v8::Value; - - Persistent devisPattern::constructor; - - devisPattern::devisPattern(){ - } - - devisPattern::~devisPattern() { - } - - void devisPattern::Init(Local exports) { - Isolate* isolate = exports->GetIsolate(); - - Local tpl = FunctionTemplate::New(isolate, New); - tpl->SetClassName(String::NewFromUtf8(isolate, "devisPattern")); - tpl->InstanceTemplate()->SetInternalFieldCount(1); - - NODE_SET_PROTOTYPE_METHOD(tpl, "add", add); - NODE_SET_PROTOTYPE_METHOD(tpl, "list", list); - NODE_SET_PROTOTYPE_METHOD(tpl, "find", find); - - constructor.Reset(isolate, tpl->GetFunction()); - exports->Set(String::NewFromUtf8(isolate, "devisPattern"), - tpl->GetFunction()); - } - - void devisPattern::New(const FunctionCallbackInfo& args) { - Isolate* isolate = args.GetIsolate(); - - if (args.IsConstructCall()) { - devisPattern* obj = new devisPattern(); - obj->Wrap(args.This()); - args.GetReturnValue().Set(args.This()); - } else { - const int argc = 1; - Local argv[argc] = { args[0] }; - Local cons = Local::New(isolate, constructor); - Local context = isolate->GetCurrentContext(); - Local instance = - cons->NewInstance(context, argc, argv).ToLocalChecked(); - args.GetReturnValue().Set(instance); - } - } - - void devisPattern::NewInstance(const FunctionCallbackInfo& args) { - Isolate* isolate = args.GetIsolate(); - - const unsigned argc = 1; - Local argv[argc] = { args[0] }; - Local cons = Local::New(isolate, constructor); - Local context = isolate->GetCurrentContext(); - Local instance = - cons->NewInstance(context, argc, argv).ToLocalChecked(); - - args.GetReturnValue().Set(instance); - } - - TStrStrMap::const_iterator FindPath(const TStrStrMap& map, const string& path) { - TStrStrMap::const_iterator i = map.find(path); - //std::this_thread::sleep_for(std::chrono::seconds(1)); - return i; - } - - string liste(TStrStrMap& tMap) - { - string res="["; - for(it_type iterator = tMap.begin(); iterator != tMap.end(); iterator++) { - if(iterator!=tMap.begin()) res+=","; - res+=iterator->first; - } - res+="]"; - return res; - } - - int TFind(const TStrStrMap& map, const string& path) { - auto i = FindPath(map, path); - if (i != map.end()) return i->second; - - return -1 ; - } - - void devisPattern::find(const v8::FunctionCallbackInfo& args) - { - int data; - v8::String::Utf8Value _path(args[0]->ToString()); - auto ptr = Unwrap(args.Holder()); - data=TFind(ptr->tMap, *_path); - args.GetReturnValue().Set(data); - } - - void devisPattern::list(const v8::FunctionCallbackInfo& args) - { - Isolate* isolate=Isolate::GetCurrent(); - auto ptr = Unwrap(args.Holder()); - args.GetReturnValue().Set(String::NewFromUtf8(isolate, liste(ptr->tMap).c_str())); - } - - void devisPattern::add(const FunctionCallbackInfo& args) { - auto id=args[1]->Int32Value(); - auto ptr = Unwrap(args.Holder()); - v8::String::Utf8Value _path(args[0]->ToString()); - ptr->tMap.insert(TStrStrPair(*_path,id)); - } - -} diff --git a/src/devisPattern.hpp b/src/devisPattern.hpp deleted file mode 100644 index 15a8330..0000000 --- a/src/devisPattern.hpp +++ /dev/null @@ -1,44 +0,0 @@ -/* Copyright (c) 2016 Devis, MIT License */ -#ifndef DEVISPATTERN_H -#define DEVISPATTERN_H - -#include -#include -#include -#include -#include -#include -#include "node.h" -#include "node_object_wrap.h" -#include -using namespace std; -using namespace v8; - -typedef unordered_map TStrStrMap; -typedef pair TStrStrPair; -typedef TStrStrMap::iterator it_type; - -namespace devisPattern { - - class devisPattern : public node::ObjectWrap { - - public: - static void Init(v8::Local exports); - static void NewInstance(const v8::FunctionCallbackInfo& args); - - private: - explicit devisPattern(); - ~devisPattern(); - - static void New(const v8::FunctionCallbackInfo& args); - static void list(const v8::FunctionCallbackInfo& args); - static void find(const v8::FunctionCallbackInfo& args); - static void add(const v8::FunctionCallbackInfo& args); - static v8::Persistent constructor; - TStrStrMap tMap; - - }; - -} - -#endif diff --git a/test/devisPattern.js b/test/devisPattern.js index afd723e..a313ad7 100644 --- a/test/devisPattern.js +++ b/test/devisPattern.js @@ -1,40 +1,69 @@ "use strict"; -const DevisP = require("../devisPattern"), - devisPattern=new DevisP(); -const date = require("./time"); - -let i,j; -let LIMIT = 2900; -for (i = 0; i < LIMIT; i++) { - date.time(i); - devisPattern.add({ - id: i, - cmd: i - }, (args, done) => { - - let x = args.ident; - let somme = args.data1 + args.data2 + args.data3 + args.data4; - done(somme); - }); -} - -for (j = 0; j < LIMIT; j++) { - let i = Math.trunc(Math.random() * 100); - - devisPattern.call({ - id: i, - cmd: i - }, { - ident: i, - data1: 2 * i, - data2: 3 * i, - data3: 4 * i, - data4: 5 * i - }, (res) => { - date.timeEnd(i); - - }); -} - -console.log(date.moyenne()/1000+"s"); -//console.log(date.min()/1000+"s"); +const test = require("node:test"); +const assert = require("node:assert"); +const DevisP = require("../devisPattern"); + +test("find returns the handle registered for an identical pattern", () => { + const matcher = new DevisP(); + const play = () => {}; + matcher.add({ action: "game", cmd: "play" }, play); + assert.strictEqual(matcher.find({ action: "game", cmd: "play" }), play); +}); + +test("find returns null for an unknown pattern", () => { + const matcher = new DevisP(); + matcher.add({ action: "game", cmd: "play" }, () => {}); + assert.strictEqual(matcher.find({ action: "game", cmd: "stop" }), null); +}); + +// devis routes remote calls by this exact-match contract, so partial matches must not resolve. +test("find does not match a subset or superset of a pattern", () => { + const matcher = new DevisP(); + matcher.add({ action: "game", cmd: "play" }, () => {}); + assert.strictEqual(matcher.find({ action: "game" }), null); + assert.strictEqual(matcher.find({ action: "game", cmd: "play", extra: 1 }), null); +}); + +test("the first handle registered for a pattern is kept", () => { + const matcher = new DevisP(); + const first = () => {}; + matcher.add({ cmd: "a" }, first); + matcher.add({ cmd: "a" }, () => {}); + assert.strictEqual(matcher.find({ cmd: "a" }), first); +}); + +// The former native addon shared one table across instances, so ids collided between matchers. +test("instances do not share registered patterns", () => { + const a = new DevisP(); + const b = new DevisP(); + a.add({ cmd: "a" }, () => {}); + const handleB = () => {}; + b.add({ cmd: "b" }, handleB); + assert.strictEqual(b.find({ cmd: "a" }), null); + assert.strictEqual(b.find({ cmd: "b" }), handleB); +}); + +test("call invokes the handle with args and callback", () => { + const matcher = new DevisP(); + matcher.add({ cmd: "sum" }, (args, done) => done(args.x + args.y)); + let result; + matcher.call({ cmd: "sum" }, { x: 2, y: 3 }, (res) => { result = res; }); + assert.strictEqual(result, 5); +}); + +test("call without args passes an empty object", () => { + const matcher = new DevisP(); + matcher.add({ cmd: "args" }, (args, done) => done(args)); + let result; + matcher.call({ cmd: "args" }, (res) => { result = res; }); + assert.deepStrictEqual(result, {}); +}); + +// devis parses list() with JSON.parse and re-registers each pattern when plugging services together. +test("list returns a JSON array string of registered patterns", () => { + const matcher = new DevisP(); + assert.strictEqual(matcher.list(), "[]"); + matcher.add({ cmd: "a" }, () => {}); + matcher.add({ cmd: "b", n: 1 }, () => {}); + assert.deepStrictEqual(JSON.parse(matcher.list()), [{ cmd: "a" }, { cmd: "b", n: 1 }]); +}); diff --git a/test/time.js b/test/time.js deleted file mode 100644 index 7bcf9f9..0000000 --- a/test/time.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -class DateTest{ - constructor() - { - this.times=[]; - this.end=[]; - } - time(label) - { - this.times[label]=Date.now(); - } - timeEnd(label) - { - let time = this.times[label]; - if (!time) { - throw new Error('No such label: ' + label); - } - var duration = Date.now() - time; - this.end[label]=duration; - } - max() - { - //return Math.max(...this.end); - } - min() - { - //return Math.min(...this.end); - } - moyenne() - { - let sum=0; - for(let i=0;i