From 2bf9921e4fbd20d4202560fe287da384c87e4779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 2 Nov 2022 11:15:03 -0300 Subject: [PATCH 1/5] Making module context-aware --- src/main.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main.cc b/src/main.cc index 898f45f..1f37cc9 100644 --- a/src/main.cc +++ b/src/main.cc @@ -16,4 +16,4 @@ void Init(Local exports) { } // namespace -NODE_MODULE(pathwatcher, Init) +NAN_MODULE_WORKER_ENABLED(pathwatcher, Init) From 567561f76e77333107a528c0aa0ee30863d796e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Wed, 2 Nov 2022 11:42:32 -0300 Subject: [PATCH 2/5] Dist -> src --- package.json | 2 +- src/directory.coffee | 334 ---------------------------- src/directory.js | 379 +++++++++++++++++++++++++++++++ src/file.coffee | 406 --------------------------------- src/file.js | 518 +++++++++++++++++++++++++++++++++++++++++++ src/main.coffee | 137 ------------ src/main.js | 266 ++++++++++++++++++++++ 7 files changed, 1164 insertions(+), 878 deletions(-) delete mode 100644 src/directory.coffee create mode 100644 src/directory.js delete mode 100644 src/file.coffee create mode 100644 src/file.js delete mode 100644 src/main.coffee create mode 100644 src/main.js diff --git a/package.json b/package.json index 650864a..1b5b049 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "main": "./lib/main", + "main": "./src/main", "name": "pathwatcher", "description": "Watch files and directories for changes", "version": "8.1.2", diff --git a/src/directory.coffee b/src/directory.coffee deleted file mode 100644 index 513835e..0000000 --- a/src/directory.coffee +++ /dev/null @@ -1,334 +0,0 @@ -path = require 'path' - -async = require 'async' -{Emitter, Disposable} = require 'event-kit' -fs = require 'fs-plus' -Grim = require 'grim' - -File = require './file' -PathWatcher = require './main' - -# Extended: Represents a directory on disk that can be watched for changes. -module.exports = -class Directory - realPath: null - subscriptionCount: 0 - - ### - Section: Construction - ### - - # Public: Configures a new Directory instance, no files are accessed. - # - # * `directoryPath` A {String} containing the absolute path to the directory - # * `symlink` (optional) A {Boolean} indicating if the path is a symlink. - # (default: false) - constructor: (directoryPath, @symlink=false, includeDeprecatedAPIs=Grim.includeDeprecatedAPIs) -> - @emitter = new Emitter - - if includeDeprecatedAPIs - @on 'contents-changed-subscription-will-be-added', @willAddSubscription - @on 'contents-changed-subscription-removed', @didRemoveSubscription - - if directoryPath - directoryPath = path.normalize(directoryPath) - # Remove a trailing slash - if directoryPath.length > 1 and directoryPath[directoryPath.length - 1] is path.sep - directoryPath = directoryPath.substring(0, directoryPath.length - 1) - @path = directoryPath - - @lowerCasePath = @path.toLowerCase() if fs.isCaseInsensitive() - @reportOnDeprecations = true if Grim.includeDeprecatedAPIs - - # Public: Creates the directory on disk that corresponds to `::getPath()` if - # no such directory already exists. - # - # * `mode` (optional) {Number} that defaults to `0777`. - # - # Returns a {Promise} that resolves once the directory is created on disk. It - # resolves to a boolean value that is true if the directory was created or - # false if it already existed. - create: (mode = 0o0777) -> - @exists().then (isExistingDirectory) => - return false if isExistingDirectory - - throw Error("Root directory does not exist: #{@getPath()}") if @isRoot() - - @getParent().create().then => - new Promise (resolve, reject) => - fs.mkdir @getPath(), mode, (error) -> - if error - reject error - else - resolve true - ### - Section: Event Subscription - ### - - # Public: Invoke the given callback when the directory's contents change. - # - # * `callback` {Function} to be called when the directory's contents change. - # - # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. - onDidChange: (callback) -> - @willAddSubscription() - @trackUnsubscription(@emitter.on('did-change', callback)) - - willAddSubscription: => - @subscribeToNativeChangeEvents() if @subscriptionCount is 0 - @subscriptionCount++ - - didRemoveSubscription: => - @subscriptionCount-- - @unsubscribeFromNativeChangeEvents() if @subscriptionCount is 0 - - trackUnsubscription: (subscription) -> - new Disposable => - subscription.dispose() - @didRemoveSubscription() - - ### - Section: Directory Metadata - ### - - # Public: Returns a {Boolean}, always false. - isFile: -> false - - # Public: Returns a {Boolean}, always true. - isDirectory: -> true - - # Public: Returns a {Boolean} indicating whether or not this is a symbolic link - isSymbolicLink: -> - @symlink - - # Public: Returns a promise that resolves to a {Boolean}, true if the - # directory exists, false otherwise. - exists: -> - new Promise (resolve) => fs.exists(@getPath(), resolve) - - # Public: Returns a {Boolean}, true if the directory exists, false otherwise. - existsSync: -> - fs.existsSync(@getPath()) - - # Public: Return a {Boolean}, true if this {Directory} is the root directory - # of the filesystem, or false if it isn't. - isRoot: -> - @getParent().getRealPathSync() is @getRealPathSync() - - ### - Section: Managing Paths - ### - - # Public: Returns the directory's {String} path. - # - # This may include unfollowed symlinks or relative directory entries. Or it - # may be fully resolved, it depends on what you give it. - getPath: -> @path - - # Public: Returns this directory's completely resolved {String} path. - # - # All relative directory entries are removed and symlinks are resolved to - # their final destination. - getRealPathSync: -> - unless @realPath? - try - @realPath = fs.realpathSync(@path) - @lowerCaseRealPath = @realPath.toLowerCase() if fs.isCaseInsensitive() - catch e - @realPath = @path - @lowerCaseRealPath = @lowerCasePath if fs.isCaseInsensitive() - @realPath - - # Public: Returns the {String} basename of the directory. - getBaseName: -> - path.basename(@path) - - # Public: Returns the relative {String} path to the given path from this - # directory. - relativize: (fullPath) -> - return fullPath unless fullPath - - # Normalize forward slashes to back slashes on windows - fullPath = fullPath.replace(/\//g, '\\') if process.platform is 'win32' - - if fs.isCaseInsensitive() - pathToCheck = fullPath.toLowerCase() - directoryPath = @lowerCasePath - else - pathToCheck = fullPath - directoryPath = @path - - if pathToCheck is directoryPath - return '' - else if @isPathPrefixOf(directoryPath, pathToCheck) - return fullPath.substring(directoryPath.length + 1) - - # Check real path - @getRealPathSync() - if fs.isCaseInsensitive() - directoryPath = @lowerCaseRealPath - else - directoryPath = @realPath - - if pathToCheck is directoryPath - '' - else if @isPathPrefixOf(directoryPath, pathToCheck) - fullPath.substring(directoryPath.length + 1) - else - fullPath - - # Given a relative path, this resolves it to an absolute path relative to this - # directory. If the path is already absolute or prefixed with a URI scheme, it - # is returned unchanged. - # - # * `uri` A {String} containing the path to resolve. - # - # Returns a {String} containing an absolute path or `undefined` if the given - # URI is falsy. - resolve: (relativePath) -> - return unless relativePath - - if relativePath?.match(/[A-Za-z0-9+-.]+:\/\//) # leave path alone if it has a scheme - relativePath - else if fs.isAbsolute(relativePath) - path.normalize(fs.resolveHome(relativePath)) - else - path.normalize(fs.resolveHome(path.join(@getPath(), relativePath))) - - ### - Section: Traversing - ### - - # Public: Traverse to the parent directory. - # - # Returns a {Directory}. - getParent: -> - new Directory(path.join @path, '..') - - # Public: Traverse within this Directory to a child File. This method doesn't - # actually check to see if the File exists, it just creates the File object. - # - # * `filename` The {String} name of a File within this Directory. - # - # Returns a {File}. - getFile: (filename...) -> - new File(path.join @getPath(), filename...) - - # Public: Traverse within this a Directory to a child Directory. This method - # doesn't actually check to see if the Directory exists, it just creates the - # Directory object. - # - # * `dirname` The {String} name of the child Directory. - # - # Returns a {Directory}. - getSubdirectory: (dirname...) -> - new Directory(path.join @path, dirname...) - - # Public: Reads file entries in this directory from disk synchronously. - # - # Returns an {Array} of {File} and {Directory} objects. - getEntriesSync: -> - directories = [] - files = [] - for entryPath in fs.listSync(@path) - try - stat = fs.lstatSync(entryPath) - symlink = stat.isSymbolicLink() - stat = fs.statSync(entryPath) if symlink - - if stat?.isDirectory() - directories.push(new Directory(entryPath, symlink)) - else if stat?.isFile() - files.push(new File(entryPath, symlink)) - - directories.concat(files) - - # Public: Reads file entries in this directory from disk asynchronously. - # - # * `callback` A {Function} to call with the following arguments: - # * `error` An {Error}, may be null. - # * `entries` An {Array} of {File} and {Directory} objects. - getEntries: (callback) -> - fs.list @path, (error, entries) -> - return callback(error) if error? - - directories = [] - files = [] - addEntry = (entryPath, stat, symlink, callback) -> - if stat?.isDirectory() - directories.push(new Directory(entryPath, symlink)) - else if stat?.isFile() - files.push(new File(entryPath, symlink)) - callback() - - statEntry = (entryPath, callback) -> - fs.lstat entryPath, (error, stat) -> - if stat?.isSymbolicLink() - fs.stat entryPath, (error, stat) -> - addEntry(entryPath, stat, true, callback) - else - addEntry(entryPath, stat, false, callback) - - async.eachLimit entries, 1, statEntry, -> - callback(null, directories.concat(files)) - - # Public: Determines if the given path (real or symbolic) is inside this - # directory. This method does not actually check if the path exists, it just - # checks if the path is under this directory. - # - # * `pathToCheck` The {String} path to check. - # - # Returns a {Boolean} whether the given path is inside this directory. - contains: (pathToCheck) -> - return false unless pathToCheck - - # Normalize forward slashes to back slashes on windows - pathToCheck = pathToCheck.replace(/\//g, '\\') if process.platform is 'win32' - - if fs.isCaseInsensitive() - directoryPath = @lowerCasePath - pathToCheck = pathToCheck.toLowerCase() - else - directoryPath = @path - - return true if @isPathPrefixOf(directoryPath, pathToCheck) - - # Check real path - @getRealPathSync() - if fs.isCaseInsensitive() - directoryPath = @lowerCaseRealPath - else - directoryPath = @realPath - - @isPathPrefixOf(directoryPath, pathToCheck) - - ### - Section: Private - ### - - subscribeToNativeChangeEvents: -> - @watchSubscription ?= PathWatcher.watch @path, (eventType) => - if eventType is 'change' - @emit 'contents-changed' if Grim.includeDeprecatedAPIs - @emitter.emit 'did-change' - - unsubscribeFromNativeChangeEvents: -> - if @watchSubscription? - @watchSubscription.close() - @watchSubscription = null - - # Does given full path start with the given prefix? - isPathPrefixOf: (prefix, fullPath) -> - fullPath.indexOf(prefix) is 0 and fullPath[prefix.length] is path.sep - -if Grim.includeDeprecatedAPIs - EmitterMixin = require('emissary').Emitter - EmitterMixin.includeInto(Directory) - - Directory::on = (eventName) -> - if eventName is 'contents-changed' - Grim.deprecate("Use Directory::onDidChange instead") - else if @reportOnDeprecations - Grim.deprecate("Subscribing via ::on is deprecated. Use documented event subscription methods instead.") - - EmitterMixin::on.apply(this, arguments) diff --git a/src/directory.js b/src/directory.js new file mode 100644 index 0000000..2e6f8ec --- /dev/null +++ b/src/directory.js @@ -0,0 +1,379 @@ +(function() { + var Directory, Disposable, Emitter, EmitterMixin, File, Grim, PathWatcher, async, fs, path, _ref, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __slice = [].slice; + + path = require('path'); + + async = require('async'); + + _ref = require('event-kit'), Emitter = _ref.Emitter, Disposable = _ref.Disposable; + + fs = require('fs-plus'); + + Grim = require('grim'); + + File = require('./file'); + + PathWatcher = require('./main'); + + module.exports = Directory = (function() { + Directory.prototype.realPath = null; + + Directory.prototype.subscriptionCount = 0; + + + /* + Section: Construction + */ + + function Directory(directoryPath, symlink, includeDeprecatedAPIs) { + this.symlink = symlink != null ? symlink : false; + if (includeDeprecatedAPIs == null) { + includeDeprecatedAPIs = Grim.includeDeprecatedAPIs; + } + this.didRemoveSubscription = __bind(this.didRemoveSubscription, this); + this.willAddSubscription = __bind(this.willAddSubscription, this); + this.emitter = new Emitter; + if (includeDeprecatedAPIs) { + this.on('contents-changed-subscription-will-be-added', this.willAddSubscription); + this.on('contents-changed-subscription-removed', this.didRemoveSubscription); + } + if (directoryPath) { + directoryPath = path.normalize(directoryPath); + if (directoryPath.length > 1 && directoryPath[directoryPath.length - 1] === path.sep) { + directoryPath = directoryPath.substring(0, directoryPath.length - 1); + } + } + this.path = directoryPath; + if (fs.isCaseInsensitive()) { + this.lowerCasePath = this.path.toLowerCase(); + } + if (Grim.includeDeprecatedAPIs) { + this.reportOnDeprecations = true; + } + } + + Directory.prototype.create = function(mode) { + if (mode == null) { + mode = 0x1ff; + } + return this.exists().then((function(_this) { + return function(isExistingDirectory) { + if (isExistingDirectory) { + return false; + } + if (_this.isRoot()) { + throw Error("Root directory does not exist: " + (_this.getPath())); + } + return _this.getParent().create().then(function() { + return new Promise(function(resolve, reject) { + return fs.mkdir(_this.getPath(), mode, function(error) { + if (error) { + return reject(error); + } else { + return resolve(true); + } + }); + }); + }); + }; + })(this)); + }; + + + /* + Section: Event Subscription + */ + + Directory.prototype.onDidChange = function(callback) { + this.willAddSubscription(); + return this.trackUnsubscription(this.emitter.on('did-change', callback)); + }; + + Directory.prototype.willAddSubscription = function() { + if (this.subscriptionCount === 0) { + this.subscribeToNativeChangeEvents(); + } + return this.subscriptionCount++; + }; + + Directory.prototype.didRemoveSubscription = function() { + this.subscriptionCount--; + if (this.subscriptionCount === 0) { + return this.unsubscribeFromNativeChangeEvents(); + } + }; + + Directory.prototype.trackUnsubscription = function(subscription) { + return new Disposable((function(_this) { + return function() { + subscription.dispose(); + return _this.didRemoveSubscription(); + }; + })(this)); + }; + + + /* + Section: Directory Metadata + */ + + Directory.prototype.isFile = function() { + return false; + }; + + Directory.prototype.isDirectory = function() { + return true; + }; + + Directory.prototype.isSymbolicLink = function() { + return this.symlink; + }; + + Directory.prototype.exists = function() { + return new Promise((function(_this) { + return function(resolve) { + return fs.exists(_this.getPath(), resolve); + }; + })(this)); + }; + + Directory.prototype.existsSync = function() { + return fs.existsSync(this.getPath()); + }; + + Directory.prototype.isRoot = function() { + return this.getParent().getRealPathSync() === this.getRealPathSync(); + }; + + + /* + Section: Managing Paths + */ + + Directory.prototype.getPath = function() { + return this.path; + }; + + Directory.prototype.getRealPathSync = function() { + var e; + if (this.realPath == null) { + try { + this.realPath = fs.realpathSync(this.path); + if (fs.isCaseInsensitive()) { + this.lowerCaseRealPath = this.realPath.toLowerCase(); + } + } catch (_error) { + e = _error; + this.realPath = this.path; + if (fs.isCaseInsensitive()) { + this.lowerCaseRealPath = this.lowerCasePath; + } + } + } + return this.realPath; + }; + + Directory.prototype.getBaseName = function() { + return path.basename(this.path); + }; + + Directory.prototype.relativize = function(fullPath) { + var directoryPath, pathToCheck; + if (!fullPath) { + return fullPath; + } + if (process.platform === 'win32') { + fullPath = fullPath.replace(/\//g, '\\'); + } + if (fs.isCaseInsensitive()) { + pathToCheck = fullPath.toLowerCase(); + directoryPath = this.lowerCasePath; + } else { + pathToCheck = fullPath; + directoryPath = this.path; + } + if (pathToCheck === directoryPath) { + return ''; + } else if (this.isPathPrefixOf(directoryPath, pathToCheck)) { + return fullPath.substring(directoryPath.length + 1); + } + this.getRealPathSync(); + if (fs.isCaseInsensitive()) { + directoryPath = this.lowerCaseRealPath; + } else { + directoryPath = this.realPath; + } + if (pathToCheck === directoryPath) { + return ''; + } else if (this.isPathPrefixOf(directoryPath, pathToCheck)) { + return fullPath.substring(directoryPath.length + 1); + } else { + return fullPath; + } + }; + + Directory.prototype.resolve = function(relativePath) { + if (!relativePath) { + return; + } + if (relativePath != null ? relativePath.match(/[A-Za-z0-9+-.]+:\/\//) : void 0) { + return relativePath; + } else if (fs.isAbsolute(relativePath)) { + return path.normalize(fs.resolveHome(relativePath)); + } else { + return path.normalize(fs.resolveHome(path.join(this.getPath(), relativePath))); + } + }; + + + /* + Section: Traversing + */ + + Directory.prototype.getParent = function() { + return new Directory(path.join(this.path, '..')); + }; + + Directory.prototype.getFile = function() { + var filename; + filename = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + return new File(path.join.apply(path, [this.getPath()].concat(__slice.call(filename)))); + }; + + Directory.prototype.getSubdirectory = function() { + var dirname; + dirname = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + return new Directory(path.join.apply(path, [this.path].concat(__slice.call(dirname)))); + }; + + Directory.prototype.getEntriesSync = function() { + var directories, entryPath, files, stat, symlink, _i, _len, _ref1; + directories = []; + files = []; + _ref1 = fs.listSync(this.path); + for (_i = 0, _len = _ref1.length; _i < _len; _i++) { + entryPath = _ref1[_i]; + try { + stat = fs.lstatSync(entryPath); + symlink = stat.isSymbolicLink(); + if (symlink) { + stat = fs.statSync(entryPath); + } + } catch (_error) {} + if (stat != null ? stat.isDirectory() : void 0) { + directories.push(new Directory(entryPath, symlink)); + } else if (stat != null ? stat.isFile() : void 0) { + files.push(new File(entryPath, symlink)); + } + } + return directories.concat(files); + }; + + Directory.prototype.getEntries = function(callback) { + return fs.list(this.path, function(error, entries) { + var addEntry, directories, files, statEntry; + if (error != null) { + return callback(error); + } + directories = []; + files = []; + addEntry = function(entryPath, stat, symlink, callback) { + if (stat != null ? stat.isDirectory() : void 0) { + directories.push(new Directory(entryPath, symlink)); + } else if (stat != null ? stat.isFile() : void 0) { + files.push(new File(entryPath, symlink)); + } + return callback(); + }; + statEntry = function(entryPath, callback) { + return fs.lstat(entryPath, function(error, stat) { + if (stat != null ? stat.isSymbolicLink() : void 0) { + return fs.stat(entryPath, function(error, stat) { + return addEntry(entryPath, stat, true, callback); + }); + } else { + return addEntry(entryPath, stat, false, callback); + } + }); + }; + return async.eachLimit(entries, 1, statEntry, function() { + return callback(null, directories.concat(files)); + }); + }); + }; + + Directory.prototype.contains = function(pathToCheck) { + var directoryPath; + if (!pathToCheck) { + return false; + } + if (process.platform === 'win32') { + pathToCheck = pathToCheck.replace(/\//g, '\\'); + } + if (fs.isCaseInsensitive()) { + directoryPath = this.lowerCasePath; + pathToCheck = pathToCheck.toLowerCase(); + } else { + directoryPath = this.path; + } + if (this.isPathPrefixOf(directoryPath, pathToCheck)) { + return true; + } + this.getRealPathSync(); + if (fs.isCaseInsensitive()) { + directoryPath = this.lowerCaseRealPath; + } else { + directoryPath = this.realPath; + } + return this.isPathPrefixOf(directoryPath, pathToCheck); + }; + + + /* + Section: Private + */ + + Directory.prototype.subscribeToNativeChangeEvents = function() { + return this.watchSubscription != null ? this.watchSubscription : this.watchSubscription = PathWatcher.watch(this.path, (function(_this) { + return function(eventType) { + if (eventType === 'change') { + if (Grim.includeDeprecatedAPIs) { + _this.emit('contents-changed'); + } + return _this.emitter.emit('did-change'); + } + }; + })(this)); + }; + + Directory.prototype.unsubscribeFromNativeChangeEvents = function() { + if (this.watchSubscription != null) { + this.watchSubscription.close(); + return this.watchSubscription = null; + } + }; + + Directory.prototype.isPathPrefixOf = function(prefix, fullPath) { + return fullPath.indexOf(prefix) === 0 && fullPath[prefix.length] === path.sep; + }; + + return Directory; + + })(); + + if (Grim.includeDeprecatedAPIs) { + EmitterMixin = require('emissary').Emitter; + EmitterMixin.includeInto(Directory); + Directory.prototype.on = function(eventName) { + if (eventName === 'contents-changed') { + Grim.deprecate("Use Directory::onDidChange instead"); + } else if (this.reportOnDeprecations) { + Grim.deprecate("Subscribing via ::on is deprecated. Use documented event subscription methods instead."); + } + return EmitterMixin.prototype.on.apply(this, arguments); + }; + } + +}).call(this); diff --git a/src/file.coffee b/src/file.coffee deleted file mode 100644 index b9bf58f..0000000 --- a/src/file.coffee +++ /dev/null @@ -1,406 +0,0 @@ -crypto = require 'crypto' -path = require 'path' - -_ = require 'underscore-plus' -{Emitter, Disposable} = require 'event-kit' -fs = require 'fs-plus' -Grim = require 'grim' - -iconv = null # Defer until used - -Directory = null -PathWatcher = require './main' - -# Extended: Represents an individual file that can be watched, read from, and -# written to. -module.exports = -class File - encoding: 'utf8' - realPath: null - subscriptionCount: 0 - - ### - Section: Construction - ### - - # Public: Configures a new File instance, no files are accessed. - # - # * `filePath` A {String} containing the absolute path to the file - # * `symlink` (optional) A {Boolean} indicating if the path is a symlink (default: false). - constructor: (filePath, @symlink=false, includeDeprecatedAPIs=Grim.includeDeprecatedAPIs) -> - filePath = path.normalize(filePath) if filePath - @path = filePath - @emitter = new Emitter - - if includeDeprecatedAPIs - @on 'contents-changed-subscription-will-be-added', @willAddSubscription - @on 'moved-subscription-will-be-added', @willAddSubscription - @on 'removed-subscription-will-be-added', @willAddSubscription - @on 'contents-changed-subscription-removed', @didRemoveSubscription - @on 'moved-subscription-removed', @didRemoveSubscription - @on 'removed-subscription-removed', @didRemoveSubscription - - @cachedContents = null - @reportOnDeprecations = true - - # Public: Creates the file on disk that corresponds to `::getPath()` if no - # such file already exists. - # - # Returns a {Promise} that resolves once the file is created on disk. It - # resolves to a boolean value that is true if the file was created or false if - # it already existed. - create: -> - @exists().then (isExistingFile) => - unless isExistingFile - parent = @getParent() - parent.create().then => - @write('').then -> true - else - false - - ### - Section: Event Subscription - ### - - # Public: Invoke the given callback when the file's contents change. - # - # * `callback` {Function} to be called when the file's contents change. - # - # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. - onDidChange: (callback) -> - @willAddSubscription() - @trackUnsubscription(@emitter.on('did-change', callback)) - - # Public: Invoke the given callback when the file's path changes. - # - # * `callback` {Function} to be called when the file's path changes. - # - # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. - onDidRename: (callback) -> - @willAddSubscription() - @trackUnsubscription(@emitter.on('did-rename', callback)) - - # Public: Invoke the given callback when the file is deleted. - # - # * `callback` {Function} to be called when the file is deleted. - # - # Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. - onDidDelete: (callback) -> - @willAddSubscription() - @trackUnsubscription(@emitter.on('did-delete', callback)) - - # Public: Invoke the given callback when there is an error with the watch. - # When your callback has been invoked, the file will have unsubscribed from - # the file watches. - # - # * `callback` {Function} callback - # * `errorObject` {Object} - # * `error` {Object} the error object - # * `handle` {Function} call this to indicate you have handled the error. - # The error will not be thrown if this function is called. - onWillThrowWatchError: (callback) -> - @emitter.on('will-throw-watch-error', callback) - - willAddSubscription: => - @subscriptionCount++ - try - @subscribeToNativeChangeEvents() - - didRemoveSubscription: => - @subscriptionCount-- - @unsubscribeFromNativeChangeEvents() if @subscriptionCount is 0 - - trackUnsubscription: (subscription) -> - new Disposable => - subscription.dispose() - @didRemoveSubscription() - - ### - Section: File Metadata - ### - - # Public: Returns a {Boolean}, always true. - isFile: -> true - - # Public: Returns a {Boolean}, always false. - isDirectory: -> false - - # Public: Returns a {Boolean} indicating whether or not this is a symbolic link - isSymbolicLink: -> - @symlink - - # Public: Returns a promise that resolves to a {Boolean}, true if the file - # exists, false otherwise. - exists: -> - new Promise (resolve) => - fs.exists @getPath(), resolve - - # Public: Returns a {Boolean}, true if the file exists, false otherwise. - existsSync: -> - fs.existsSync(@getPath()) - - # Public: Get the SHA-1 digest of this file - # - # Returns a promise that resolves to a {String}. - getDigest: -> - if @digest? - Promise.resolve(@digest) - else - @read().then => @digest # read assigns digest as a side-effect - - # Public: Get the SHA-1 digest of this file - # - # Returns a {String}. - getDigestSync: -> - @readSync() unless @digest - @digest - - setDigest: (contents) -> - @digest = crypto.createHash('sha1').update(contents ? '').digest('hex') - - # Public: Sets the file's character set encoding name. - # - # * `encoding` The {String} encoding to use (default: 'utf8') - setEncoding: (encoding='utf8') -> - # Throws if encoding doesn't exist. Better to throw an exception early - # instead of waiting until the file is saved. - - if encoding isnt 'utf8' - iconv ?= require 'iconv-lite' - iconv.getCodec(encoding) - - @encoding = encoding - - # Public: Returns the {String} encoding name for this file (default: 'utf8'). - getEncoding: -> @encoding - - ### - Section: Managing Paths - ### - - # Public: Returns the {String} path for the file. - getPath: -> @path - - # Sets the path for the file. - setPath: (@path) -> - @realPath = null - - # Public: Returns this file's completely resolved {String} path. - getRealPathSync: -> - unless @realPath? - try - @realPath = fs.realpathSync(@path) - catch error - @realPath = @path - @realPath - - # Public: Returns a promise that resolves to the file's completely resolved {String} path. - getRealPath: -> - if @realPath? - Promise.resolve(@realPath) - else - new Promise (resolve, reject) => - fs.realpath @path, (err, result) => - if err? - reject(err) - else - resolve(@realPath = result) - - # Public: Return the {String} filename without any directory information. - getBaseName: -> - path.basename(@path) - - ### - Section: Traversing - ### - - # Public: Return the {Directory} that contains this file. - getParent: -> - Directory ?= require './directory' - new Directory(path.dirname @path) - - ### - Section: Reading and Writing - ### - - readSync: (flushCache) -> - if not @existsSync() - @cachedContents = null - else if not @cachedContents? or flushCache - encoding = @getEncoding() - if encoding is 'utf8' - @cachedContents = fs.readFileSync(@getPath(), encoding) - else - iconv ?= require 'iconv-lite' - @cachedContents = iconv.decode(fs.readFileSync(@getPath()), encoding) - - @setDigest(@cachedContents) - @cachedContents - - writeFileSync: (filePath, contents) -> - encoding = @getEncoding() - if encoding is 'utf8' - fs.writeFileSync(filePath, contents, {encoding}) - else - iconv ?= require 'iconv-lite' - fs.writeFileSync(filePath, iconv.encode(contents, encoding)) - - # Public: Reads the contents of the file. - # - # * `flushCache` A {Boolean} indicating whether to require a direct read or if - # a cached copy is acceptable. - # - # Returns a promise that resolves to either a {String}, or null if the file does not exist. - read: (flushCache) -> - if @cachedContents? and not flushCache - promise = Promise.resolve(@cachedContents) - else - promise = new Promise (resolve, reject) => - content = [] - readStream = @createReadStream() - - readStream.on 'data', (chunk) -> - content.push(chunk) - - readStream.on 'end', -> - resolve(content.join('')) - - readStream.on 'error', (error) -> - if error.code == 'ENOENT' - resolve(null) - else - reject(error) - - promise.then (contents) => - @setDigest(contents) - @cachedContents = contents - - # Public: Returns a stream to read the content of the file. - # - # Returns a {ReadStream} object. - createReadStream: -> - encoding = @getEncoding() - if encoding is 'utf8' - fs.createReadStream(@getPath(), {encoding}) - else - iconv ?= require 'iconv-lite' - fs.createReadStream(@getPath()).pipe(iconv.decodeStream(encoding)) - - # Public: Overwrites the file with the given text. - # - # * `text` The {String} text to write to the underlying file. - # - # Returns a {Promise} that resolves when the file has been written. - write: (text) -> - @exists().then (previouslyExisted) => - @writeFile(@getPath(), text).then => - @cachedContents = text - @setDigest(text) - @subscribeToNativeChangeEvents() if not previouslyExisted and @hasSubscriptions() - undefined - - # Public: Returns a stream to write content to the file. - # - # Returns a {WriteStream} object. - createWriteStream: -> - encoding = @getEncoding() - if encoding is 'utf8' - fs.createWriteStream(@getPath(), {encoding}) - else - iconv ?= require 'iconv-lite' - stream = iconv.encodeStream(encoding) - stream.pipe(fs.createWriteStream(@getPath())) - stream - - # Public: Overwrites the file with the given text. - # - # * `text` The {String} text to write to the underlying file. - # - # Returns undefined. - writeSync: (text) -> - previouslyExisted = @existsSync() - @writeFileSync(@getPath(), text) - @cachedContents = text - @setDigest(text) - @emit 'contents-changed' if Grim.includeDeprecatedAPIs - @emitter.emit 'did-change' - @subscribeToNativeChangeEvents() if not previouslyExisted and @hasSubscriptions() - undefined - - writeFile: (filePath, contents) -> - encoding = @getEncoding() - if encoding is 'utf8' - new Promise (resolve, reject) -> - fs.writeFile filePath, contents, {encoding}, (err, result) -> - if err? - reject(err) - else - resolve(result) - else - iconv ?= require 'iconv-lite' - new Promise (resolve, reject) -> - fs.writeFile filePath, iconv.encode(contents, encoding), (err, result) -> - if err? - reject(err) - else - resolve(result) - - ### - Section: Private - ### - - handleNativeChangeEvent: (eventType, eventPath) -> - switch eventType - when 'delete' - @unsubscribeFromNativeChangeEvents() - @detectResurrectionAfterDelay() - when 'rename' - @setPath(eventPath) - @emit 'moved' if Grim.includeDeprecatedAPIs - @emitter.emit 'did-rename' - when 'change', 'resurrect' - @cachedContents = null - @emitter.emit 'did-change' - - detectResurrectionAfterDelay: -> - _.delay (=> @detectResurrection()), 50 - - detectResurrection: -> - @exists().then (exists) => - if exists - @subscribeToNativeChangeEvents() - @handleNativeChangeEvent('resurrect') - else - @cachedContents = null - @emit 'removed' if Grim.includeDeprecatedAPIs - @emitter.emit 'did-delete' - - subscribeToNativeChangeEvents: -> - @watchSubscription ?= PathWatcher.watch @path, (args...) => - @handleNativeChangeEvent(args...) - - unsubscribeFromNativeChangeEvents: -> - if @watchSubscription? - @watchSubscription.close() - @watchSubscription = null - -if Grim.includeDeprecatedAPIs - EmitterMixin = require('emissary').Emitter - EmitterMixin.includeInto(File) - - File::on = (eventName) -> - switch eventName - when 'contents-changed' - Grim.deprecate("Use File::onDidChange instead") - when 'moved' - Grim.deprecate("Use File::onDidRename instead") - when 'removed' - Grim.deprecate("Use File::onDidDelete instead") - else - if @reportOnDeprecations - Grim.deprecate("Subscribing via ::on is deprecated. Use documented event subscription methods instead.") - - EmitterMixin::on.apply(this, arguments) -else - File::hasSubscriptions = -> - @subscriptionCount > 0 diff --git a/src/file.js b/src/file.js new file mode 100644 index 0000000..37243d1 --- /dev/null +++ b/src/file.js @@ -0,0 +1,518 @@ +(function() { + var Directory, Disposable, Emitter, EmitterMixin, File, Grim, PathWatcher, crypto, fs, iconv, path, _, _ref, + __bind = function(fn, me){ return function(){ return fn.apply(me, arguments); }; }, + __slice = [].slice; + + crypto = require('crypto'); + + path = require('path'); + + _ = require('underscore-plus'); + + _ref = require('event-kit'), Emitter = _ref.Emitter, Disposable = _ref.Disposable; + + fs = require('fs-plus'); + + Grim = require('grim'); + + iconv = null; + + Directory = null; + + PathWatcher = require('./main'); + + module.exports = File = (function() { + File.prototype.encoding = 'utf8'; + + File.prototype.realPath = null; + + File.prototype.subscriptionCount = 0; + + + /* + Section: Construction + */ + + function File(filePath, symlink, includeDeprecatedAPIs) { + this.symlink = symlink != null ? symlink : false; + if (includeDeprecatedAPIs == null) { + includeDeprecatedAPIs = Grim.includeDeprecatedAPIs; + } + this.didRemoveSubscription = __bind(this.didRemoveSubscription, this); + this.willAddSubscription = __bind(this.willAddSubscription, this); + if (filePath) { + filePath = path.normalize(filePath); + } + this.path = filePath; + this.emitter = new Emitter; + if (includeDeprecatedAPIs) { + this.on('contents-changed-subscription-will-be-added', this.willAddSubscription); + this.on('moved-subscription-will-be-added', this.willAddSubscription); + this.on('removed-subscription-will-be-added', this.willAddSubscription); + this.on('contents-changed-subscription-removed', this.didRemoveSubscription); + this.on('moved-subscription-removed', this.didRemoveSubscription); + this.on('removed-subscription-removed', this.didRemoveSubscription); + } + this.cachedContents = null; + this.reportOnDeprecations = true; + } + + File.prototype.create = function() { + return this.exists().then((function(_this) { + return function(isExistingFile) { + var parent; + if (!isExistingFile) { + parent = _this.getParent(); + return parent.create().then(function() { + return _this.write('').then(function() { + return true; + }); + }); + } else { + return false; + } + }; + })(this)); + }; + + + /* + Section: Event Subscription + */ + + File.prototype.onDidChange = function(callback) { + this.willAddSubscription(); + return this.trackUnsubscription(this.emitter.on('did-change', callback)); + }; + + File.prototype.onDidRename = function(callback) { + this.willAddSubscription(); + return this.trackUnsubscription(this.emitter.on('did-rename', callback)); + }; + + File.prototype.onDidDelete = function(callback) { + this.willAddSubscription(); + return this.trackUnsubscription(this.emitter.on('did-delete', callback)); + }; + + File.prototype.onWillThrowWatchError = function(callback) { + return this.emitter.on('will-throw-watch-error', callback); + }; + + File.prototype.willAddSubscription = function() { + this.subscriptionCount++; + try { + return this.subscribeToNativeChangeEvents(); + } catch (_error) {} + }; + + File.prototype.didRemoveSubscription = function() { + this.subscriptionCount--; + if (this.subscriptionCount === 0) { + return this.unsubscribeFromNativeChangeEvents(); + } + }; + + File.prototype.trackUnsubscription = function(subscription) { + return new Disposable((function(_this) { + return function() { + subscription.dispose(); + return _this.didRemoveSubscription(); + }; + })(this)); + }; + + + /* + Section: File Metadata + */ + + File.prototype.isFile = function() { + return true; + }; + + File.prototype.isDirectory = function() { + return false; + }; + + File.prototype.isSymbolicLink = function() { + return this.symlink; + }; + + File.prototype.exists = function() { + return new Promise((function(_this) { + return function(resolve) { + return fs.exists(_this.getPath(), resolve); + }; + })(this)); + }; + + File.prototype.existsSync = function() { + return fs.existsSync(this.getPath()); + }; + + File.prototype.getDigest = function() { + if (this.digest != null) { + return Promise.resolve(this.digest); + } else { + return this.read().then((function(_this) { + return function() { + return _this.digest; + }; + })(this)); + } + }; + + File.prototype.getDigestSync = function() { + if (!this.digest) { + this.readSync(); + } + return this.digest; + }; + + File.prototype.setDigest = function(contents) { + return this.digest = crypto.createHash('sha1').update(contents != null ? contents : '').digest('hex'); + }; + + File.prototype.setEncoding = function(encoding) { + if (encoding == null) { + encoding = 'utf8'; + } + if (encoding !== 'utf8') { + if (iconv == null) { + iconv = require('iconv-lite'); + } + iconv.getCodec(encoding); + } + return this.encoding = encoding; + }; + + File.prototype.getEncoding = function() { + return this.encoding; + }; + + + /* + Section: Managing Paths + */ + + File.prototype.getPath = function() { + return this.path; + }; + + File.prototype.setPath = function(path) { + this.path = path; + return this.realPath = null; + }; + + File.prototype.getRealPathSync = function() { + var error; + if (this.realPath == null) { + try { + this.realPath = fs.realpathSync(this.path); + } catch (_error) { + error = _error; + this.realPath = this.path; + } + } + return this.realPath; + }; + + File.prototype.getRealPath = function() { + if (this.realPath != null) { + return Promise.resolve(this.realPath); + } else { + return new Promise((function(_this) { + return function(resolve, reject) { + return fs.realpath(_this.path, function(err, result) { + if (err != null) { + return reject(err); + } else { + return resolve(_this.realPath = result); + } + }); + }; + })(this)); + } + }; + + File.prototype.getBaseName = function() { + return path.basename(this.path); + }; + + + /* + Section: Traversing + */ + + File.prototype.getParent = function() { + if (Directory == null) { + Directory = require('./directory'); + } + return new Directory(path.dirname(this.path)); + }; + + + /* + Section: Reading and Writing + */ + + File.prototype.readSync = function(flushCache) { + var encoding; + if (!this.existsSync()) { + this.cachedContents = null; + } else if ((this.cachedContents == null) || flushCache) { + encoding = this.getEncoding(); + if (encoding === 'utf8') { + this.cachedContents = fs.readFileSync(this.getPath(), encoding); + } else { + if (iconv == null) { + iconv = require('iconv-lite'); + } + this.cachedContents = iconv.decode(fs.readFileSync(this.getPath()), encoding); + } + } + this.setDigest(this.cachedContents); + return this.cachedContents; + }; + + File.prototype.writeFileSync = function(filePath, contents) { + var encoding; + encoding = this.getEncoding(); + if (encoding === 'utf8') { + return fs.writeFileSync(filePath, contents, { + encoding: encoding + }); + } else { + if (iconv == null) { + iconv = require('iconv-lite'); + } + return fs.writeFileSync(filePath, iconv.encode(contents, encoding)); + } + }; + + File.prototype.read = function(flushCache) { + var promise; + if ((this.cachedContents != null) && !flushCache) { + promise = Promise.resolve(this.cachedContents); + } else { + promise = new Promise((function(_this) { + return function(resolve, reject) { + var content, readStream; + content = []; + readStream = _this.createReadStream(); + readStream.on('data', function(chunk) { + return content.push(chunk); + }); + readStream.on('end', function() { + return resolve(content.join('')); + }); + return readStream.on('error', function(error) { + if (error.code === 'ENOENT') { + return resolve(null); + } else { + return reject(error); + } + }); + }; + })(this)); + } + return promise.then((function(_this) { + return function(contents) { + _this.setDigest(contents); + return _this.cachedContents = contents; + }; + })(this)); + }; + + File.prototype.createReadStream = function() { + var encoding; + encoding = this.getEncoding(); + if (encoding === 'utf8') { + return fs.createReadStream(this.getPath(), { + encoding: encoding + }); + } else { + if (iconv == null) { + iconv = require('iconv-lite'); + } + return fs.createReadStream(this.getPath()).pipe(iconv.decodeStream(encoding)); + } + }; + + File.prototype.write = function(text) { + return this.exists().then((function(_this) { + return function(previouslyExisted) { + return _this.writeFile(_this.getPath(), text).then(function() { + _this.cachedContents = text; + _this.setDigest(text); + if (!previouslyExisted && _this.hasSubscriptions()) { + _this.subscribeToNativeChangeEvents(); + } + return void 0; + }); + }; + })(this)); + }; + + File.prototype.createWriteStream = function() { + var encoding, stream; + encoding = this.getEncoding(); + if (encoding === 'utf8') { + return fs.createWriteStream(this.getPath(), { + encoding: encoding + }); + } else { + if (iconv == null) { + iconv = require('iconv-lite'); + } + stream = iconv.encodeStream(encoding); + stream.pipe(fs.createWriteStream(this.getPath())); + return stream; + } + }; + + File.prototype.writeSync = function(text) { + var previouslyExisted; + previouslyExisted = this.existsSync(); + this.writeFileSync(this.getPath(), text); + this.cachedContents = text; + this.setDigest(text); + if (Grim.includeDeprecatedAPIs) { + this.emit('contents-changed'); + } + this.emitter.emit('did-change'); + if (!previouslyExisted && this.hasSubscriptions()) { + this.subscribeToNativeChangeEvents(); + } + return void 0; + }; + + File.prototype.writeFile = function(filePath, contents) { + var encoding; + encoding = this.getEncoding(); + if (encoding === 'utf8') { + return new Promise(function(resolve, reject) { + return fs.writeFile(filePath, contents, { + encoding: encoding + }, function(err, result) { + if (err != null) { + return reject(err); + } else { + return resolve(result); + } + }); + }); + } else { + if (iconv == null) { + iconv = require('iconv-lite'); + } + return new Promise(function(resolve, reject) { + return fs.writeFile(filePath, iconv.encode(contents, encoding), function(err, result) { + if (err != null) { + return reject(err); + } else { + return resolve(result); + } + }); + }); + } + }; + + + /* + Section: Private + */ + + File.prototype.handleNativeChangeEvent = function(eventType, eventPath) { + switch (eventType) { + case 'delete': + this.unsubscribeFromNativeChangeEvents(); + return this.detectResurrectionAfterDelay(); + case 'rename': + this.setPath(eventPath); + if (Grim.includeDeprecatedAPIs) { + this.emit('moved'); + } + return this.emitter.emit('did-rename'); + case 'change': + case 'resurrect': + this.cachedContents = null; + return this.emitter.emit('did-change'); + } + }; + + File.prototype.detectResurrectionAfterDelay = function() { + return _.delay(((function(_this) { + return function() { + return _this.detectResurrection(); + }; + })(this)), 50); + }; + + File.prototype.detectResurrection = function() { + return this.exists().then((function(_this) { + return function(exists) { + if (exists) { + _this.subscribeToNativeChangeEvents(); + return _this.handleNativeChangeEvent('resurrect'); + } else { + _this.cachedContents = null; + if (Grim.includeDeprecatedAPIs) { + _this.emit('removed'); + } + return _this.emitter.emit('did-delete'); + } + }; + })(this)); + }; + + File.prototype.subscribeToNativeChangeEvents = function() { + return this.watchSubscription != null ? this.watchSubscription : this.watchSubscription = PathWatcher.watch(this.path, (function(_this) { + return function() { + var args; + args = 1 <= arguments.length ? __slice.call(arguments, 0) : []; + return _this.handleNativeChangeEvent.apply(_this, args); + }; + })(this)); + }; + + File.prototype.unsubscribeFromNativeChangeEvents = function() { + if (this.watchSubscription != null) { + this.watchSubscription.close(); + return this.watchSubscription = null; + } + }; + + return File; + + })(); + + if (Grim.includeDeprecatedAPIs) { + EmitterMixin = require('emissary').Emitter; + EmitterMixin.includeInto(File); + File.prototype.on = function(eventName) { + switch (eventName) { + case 'contents-changed': + Grim.deprecate("Use File::onDidChange instead"); + break; + case 'moved': + Grim.deprecate("Use File::onDidRename instead"); + break; + case 'removed': + Grim.deprecate("Use File::onDidDelete instead"); + break; + default: + if (this.reportOnDeprecations) { + Grim.deprecate("Subscribing via ::on is deprecated. Use documented event subscription methods instead."); + } + } + return EmitterMixin.prototype.on.apply(this, arguments); + }; + } else { + File.prototype.hasSubscriptions = function() { + return this.subscriptionCount > 0; + }; + } + +}).call(this); diff --git a/src/main.coffee b/src/main.coffee deleted file mode 100644 index 81b6fb4..0000000 --- a/src/main.coffee +++ /dev/null @@ -1,137 +0,0 @@ -binding = require '../build/Release/pathwatcher.node' -{HandleMap} = binding -{Emitter} = require 'event-kit' -fs = require 'fs' -path = require 'path' - -handleWatchers = null - -class HandleWatcher - constructor: (@path) -> - @emitter = new Emitter() - @start() - - onEvent: (event, filePath, oldFilePath) -> - filePath = path.normalize(filePath) if filePath - oldFilePath = path.normalize(oldFilePath) if oldFilePath - - switch event - when 'rename' - # Detect atomic write. - @close() - detectRename = => - fs.stat @path, (err) => - if err # original file is gone it's a rename. - @path = filePath - # On OS X files moved to ~/.Trash should be handled as deleted. - if process.platform is 'darwin' and (/\/\.Trash\//).test(filePath) - @emitter.emit('did-change', {event: 'delete', newFilePath: null}) - @close() - else - @start() - @emitter.emit('did-change', {event: 'rename', newFilePath: filePath}) - else # atomic write. - @start() - @emitter.emit('did-change', {event: 'change', newFilePath: null}) - setTimeout(detectRename, 100) - when 'delete' - @emitter.emit('did-change', {event: 'delete', newFilePath: null}) - @close() - when 'unknown' - throw new Error("Received unknown event for path: #{@path}") - else - @emitter.emit('did-change', {event, newFilePath: filePath, oldFilePath: oldFilePath}) - - onDidChange: (callback) -> - @emitter.on('did-change', callback) - - start: -> - @handle = binding.watch(@path) - if handleWatchers.has(@handle) - troubleWatcher = handleWatchers.get(@handle) - troubleWatcher.close() - console.error("The handle(#{@handle}) returned by watching #{@path} is the same with an already watched path(#{troubleWatcher.path})") - handleWatchers.add(@handle, this) - - closeIfNoListener: -> - @close() if @emitter.getTotalListenerCount() is 0 - - close: -> - if handleWatchers.has(@handle) - binding.unwatch(@handle) - handleWatchers.remove(@handle) - -class PathWatcher - isWatchingParent: false - path: null - handleWatcher: null - - constructor: (filePath, callback) -> - @path = filePath - @emitter = new Emitter() - - # On Windows watching a file is emulated by watching its parent folder. - if process.platform is 'win32' - stats = fs.statSync(filePath) - @isWatchingParent = not stats.isDirectory() - - filePath = path.dirname(filePath) if @isWatchingParent - for watcher in handleWatchers.values() - if watcher.path is filePath - @handleWatcher = watcher - break - - @handleWatcher ?= new HandleWatcher(filePath) - - @onChange = ({event, newFilePath, oldFilePath}) => - switch event - when 'rename', 'change', 'delete' - @path = newFilePath if event is 'rename' - callback.call(this, event, newFilePath) if typeof callback is 'function' - @emitter.emit('did-change', {event, newFilePath}) - when 'child-rename' - if @isWatchingParent - @onChange({event: 'rename', newFilePath}) if @path is oldFilePath - else - @onChange({event: 'change', newFilePath: ''}) - when 'child-delete' - if @isWatchingParent - @onChange({event: 'delete', newFilePath: null}) if @path is newFilePath - else - @onChange({event: 'change', newFilePath: ''}) - when 'child-change' - @onChange({event: 'change', newFilePath: ''}) if @isWatchingParent and @path is newFilePath - when 'child-create' - @onChange({event: 'change', newFilePath: ''}) unless @isWatchingParent - - @disposable = @handleWatcher.onDidChange(@onChange) - - onDidChange: (callback) -> - @emitter.on('did-change', callback) - - close: -> - @emitter.dispose() - @disposable.dispose() - @handleWatcher.closeIfNoListener() - -exports.watch = (pathToWatch, callback) -> - unless handleWatchers? - handleWatchers = new HandleMap - binding.setCallback (event, handle, filePath, oldFilePath) -> - handleWatchers.get(handle).onEvent(event, filePath, oldFilePath) if handleWatchers.has(handle) - - new PathWatcher(path.resolve(pathToWatch), callback) - -exports.closeAllWatchers = -> - if handleWatchers? - watcher.close() for watcher in handleWatchers.values() - handleWatchers.clear() - -exports.getWatchedPaths = -> - paths = [] - if handleWatchers? - paths.push(watcher.path) for watcher in handleWatchers.values() - paths - -exports.File = require './file' -exports.Directory = require './directory' diff --git a/src/main.js b/src/main.js new file mode 100644 index 0000000..9090027 --- /dev/null +++ b/src/main.js @@ -0,0 +1,266 @@ +(function() { + var Emitter, HandleMap, HandleWatcher, PathWatcher, binding, fs, handleWatchers, path; + + binding = require('../build/Release/pathwatcher.node'); + + HandleMap = binding.HandleMap; + + Emitter = require('event-kit').Emitter; + + fs = require('fs'); + + path = require('path'); + + handleWatchers = null; + + HandleWatcher = (function() { + function HandleWatcher(path) { + this.path = path; + this.emitter = new Emitter(); + this.start(); + } + + HandleWatcher.prototype.onEvent = function(event, filePath, oldFilePath) { + var detectRename; + if (filePath) { + filePath = path.normalize(filePath); + } + if (oldFilePath) { + oldFilePath = path.normalize(oldFilePath); + } + switch (event) { + case 'rename': + this.close(); + detectRename = (function(_this) { + return function() { + return fs.stat(_this.path, function(err) { + if (err) { + _this.path = filePath; + if (process.platform === 'darwin' && /\/\.Trash\//.test(filePath)) { + _this.emitter.emit('did-change', { + event: 'delete', + newFilePath: null + }); + return _this.close(); + } else { + _this.start(); + return _this.emitter.emit('did-change', { + event: 'rename', + newFilePath: filePath + }); + } + } else { + _this.start(); + return _this.emitter.emit('did-change', { + event: 'change', + newFilePath: null + }); + } + }); + }; + })(this); + return setTimeout(detectRename, 100); + case 'delete': + this.emitter.emit('did-change', { + event: 'delete', + newFilePath: null + }); + return this.close(); + case 'unknown': + throw new Error("Received unknown event for path: " + this.path); + break; + default: + return this.emitter.emit('did-change', { + event: event, + newFilePath: filePath, + oldFilePath: oldFilePath + }); + } + }; + + HandleWatcher.prototype.onDidChange = function(callback) { + return this.emitter.on('did-change', callback); + }; + + HandleWatcher.prototype.start = function() { + var troubleWatcher; + this.handle = binding.watch(this.path); + if (handleWatchers.has(this.handle)) { + troubleWatcher = handleWatchers.get(this.handle); + troubleWatcher.close(); + console.error("The handle(" + this.handle + ") returned by watching " + this.path + " is the same with an already watched path(" + troubleWatcher.path + ")"); + } + return handleWatchers.add(this.handle, this); + }; + + HandleWatcher.prototype.closeIfNoListener = function() { + if (this.emitter.getTotalListenerCount() === 0) { + return this.close(); + } + }; + + HandleWatcher.prototype.close = function() { + if (handleWatchers.has(this.handle)) { + binding.unwatch(this.handle); + return handleWatchers.remove(this.handle); + } + }; + + return HandleWatcher; + + })(); + + PathWatcher = (function() { + PathWatcher.prototype.isWatchingParent = false; + + PathWatcher.prototype.path = null; + + PathWatcher.prototype.handleWatcher = null; + + function PathWatcher(filePath, callback) { + var stats, watcher, _i, _len, _ref; + this.path = filePath; + this.emitter = new Emitter(); + if (process.platform === 'win32') { + stats = fs.statSync(filePath); + this.isWatchingParent = !stats.isDirectory(); + } + if (this.isWatchingParent) { + filePath = path.dirname(filePath); + } + _ref = handleWatchers.values(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + watcher = _ref[_i]; + if (watcher.path === filePath) { + this.handleWatcher = watcher; + break; + } + } + if (this.handleWatcher == null) { + this.handleWatcher = new HandleWatcher(filePath); + } + this.onChange = (function(_this) { + return function(_arg) { + var event, newFilePath, oldFilePath; + event = _arg.event, newFilePath = _arg.newFilePath, oldFilePath = _arg.oldFilePath; + switch (event) { + case 'rename': + case 'change': + case 'delete': + if (event === 'rename') { + _this.path = newFilePath; + } + if (typeof callback === 'function') { + callback.call(_this, event, newFilePath); + } + return _this.emitter.emit('did-change', { + event: event, + newFilePath: newFilePath + }); + case 'child-rename': + if (_this.isWatchingParent) { + if (_this.path === oldFilePath) { + return _this.onChange({ + event: 'rename', + newFilePath: newFilePath + }); + } + } else { + return _this.onChange({ + event: 'change', + newFilePath: '' + }); + } + break; + case 'child-delete': + if (_this.isWatchingParent) { + if (_this.path === newFilePath) { + return _this.onChange({ + event: 'delete', + newFilePath: null + }); + } + } else { + return _this.onChange({ + event: 'change', + newFilePath: '' + }); + } + break; + case 'child-change': + if (_this.isWatchingParent && _this.path === newFilePath) { + return _this.onChange({ + event: 'change', + newFilePath: '' + }); + } + break; + case 'child-create': + if (!_this.isWatchingParent) { + return _this.onChange({ + event: 'change', + newFilePath: '' + }); + } + } + }; + })(this); + this.disposable = this.handleWatcher.onDidChange(this.onChange); + } + + PathWatcher.prototype.onDidChange = function(callback) { + return this.emitter.on('did-change', callback); + }; + + PathWatcher.prototype.close = function() { + this.emitter.dispose(); + this.disposable.dispose(); + return this.handleWatcher.closeIfNoListener(); + }; + + return PathWatcher; + + })(); + + exports.watch = function(pathToWatch, callback) { + if (handleWatchers == null) { + handleWatchers = new HandleMap; + binding.setCallback(function(event, handle, filePath, oldFilePath) { + if (handleWatchers.has(handle)) { + return handleWatchers.get(handle).onEvent(event, filePath, oldFilePath); + } + }); + } + return new PathWatcher(path.resolve(pathToWatch), callback); + }; + + exports.closeAllWatchers = function() { + var watcher, _i, _len, _ref; + if (handleWatchers != null) { + _ref = handleWatchers.values(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + watcher = _ref[_i]; + watcher.close(); + } + return handleWatchers.clear(); + } + }; + + exports.getWatchedPaths = function() { + var paths, watcher, _i, _len, _ref; + paths = []; + if (handleWatchers != null) { + _ref = handleWatchers.values(); + for (_i = 0, _len = _ref.length; _i < _len; _i++) { + watcher = _ref[_i]; + paths.push(watcher.path); + } + } + return paths; + }; + + exports.File = require('./file'); + + exports.Directory = require('./directory'); + +}).call(this); From e56a44caa603432d0506f5868d646fd182d9f84c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Tue, 13 Jun 2023 17:35:30 -0300 Subject: [PATCH 3/5] Upgrading nan --- .gitignore | 1 - package-lock.json | 2735 +++++++++++++++++++++++++++++++++++++++++++++ package.json | 2 +- 3 files changed, 2736 insertions(+), 2 deletions(-) create mode 100644 package-lock.json diff --git a/.gitignore b/.gitignore index 79c895b..f0b667b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,3 @@ lib/ .node-version npm-debug.log api.json -package-lock.json diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..dffa117 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2735 @@ +{ + "name": "pathwatcher", + "version": "8.1.2", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "pathwatcher", + "version": "8.1.2", + "dependencies": { + "async": "~0.2.10", + "emissary": "^1.3.2", + "event-kit": "^2.1.0", + "fs-plus": "^3.0.0", + "grim": "^2.0.1", + "iconv-lite": "~0.4.4", + "nan": "2.17.0", + "underscore-plus": "~1.x" + }, + "devDependencies": { + "grunt": "~0.4.1", + "grunt-atomdoc": "^1.0", + "grunt-cli": "~0.1.7", + "grunt-coffeelint": "git+https://github.com/atom/grunt-coffeelint.git", + "grunt-contrib-coffee": "~0.9.0", + "grunt-shell": "~0.2.2", + "jasmine-tagged": "^1.1", + "node-cpplint": "~0.1.5", + "rimraf": "~2.2.0", + "temp": "~0.9.0" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.5.tgz", + "integrity": "sha512-0dpjDLeCXYThL2YhqZcd/spuwoH+dmnFoND9ZxZkAYxp1IJUB2GP16ow2MJRsjVxy8j1Qv8BJRmN5GKnbDKCmQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true, + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha512-LjmC2dNpdn2L4UzyoaIr11ELYoLn37ZFy9zObrQFHsSuOepeUEMKnM8w5KL4Tnrp2gy88rRuQt6Ky8Bjml+Baw==", + "dev": true, + "dependencies": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + }, + "node_modules/argparse/node_modules/underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==", + "dev": true + }, + "node_modules/argparse/node_modules/underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha512-yxkabuCaIBnzfIvX3kBxQqCs0ar/bfJwDnFEHJUm/ZrRVhT3IItdRF5cZjARLzEnyQYtIUhsZ2LG2j3HidFOFQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "node_modules/atomdoc": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/atomdoc/-/atomdoc-1.0.6.tgz", + "integrity": "sha512-DU9ABgZw7egM0mxAe2AZX1RqEDyXu/PeIsVni/R3hxeuXEyyf+GVfygcYwclx1d7bEUVVMP+zTB8Aw4itei4sA==", + "dev": true, + "dependencies": { + "marked": "^0.3.6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/builtins": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.4.tgz", + "integrity": "sha512-WfzPUnPeK0c5T6BX1bd/2xEluDkSekN4triHgeEL/2ZZPMjgZuAEIFxUhhR8Tf1c5Qkk4JtF8/JQG6B8XLl2gA==", + "dev": true + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha512-QjQ1T4BqyHv19k6XSfdhy/QLlIOhywz0ekBUCa9h71zYMJlfDTGan/Z1JXzYkZ6v8R+GhvL/p4FZPbPW8WNXlg==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/coffeelint": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/coffeelint/-/coffeelint-1.16.2.tgz", + "integrity": "sha512-6mzgOo4zb17WfdrSui/cSUEgQ0AQkW3gXDht+6lHkfkqGUtSYKwGdGcXsDfAyuScVzTlTtKdfwkAlJWfqul7zg==", + "dev": true, + "dependencies": { + "coffee-script": "~1.11.0", + "glob": "^7.0.6", + "ignore": "^3.0.9", + "optimist": "^0.6.1", + "resolve": "^0.6.3", + "strip-json-comments": "^1.0.2" + }, + "bin": { + "coffeelint": "bin/coffeelint" + }, + "engines": { + "node": ">=0.8.0", + "npm": ">=1.3.7" + } + }, + "node_modules/coffeelint-stylish": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/coffeelint-stylish/-/coffeelint-stylish-0.1.2.tgz", + "integrity": "sha512-VcuzfB0bC9lvdvwckLzh3njKce68VVmOOXp0igyNl50D/uRLbFb4HSjQtTNGFEYiQ9Z0hjhfTqKe4v8UQxnngA==", + "dev": true, + "dependencies": { + "chalk": "^1.0.0", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=0.10.0", + "npm": ">=1.3.7" + } + }, + "node_modules/coffeelint/node_modules/coffee-script": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.11.1.tgz", + "integrity": "sha512-NIWm59Fh1zkXq6TS6PQvSO3AR9DbGq1IBNZHa1E3fUCNmJhIwLf1YKcWgaHqaU7zWGC/OE2V7K3GVAXFzcmu+A==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coffeelint/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/coffeelint/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/coffeelint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/coffeelint/node_modules/resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "dev": true + }, + "node_modules/coffeestack": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/coffeestack/-/coffeestack-1.2.0.tgz", + "integrity": "sha512-vXT7ZxSZ4lXHh/0A2cODyFqrVIl4Vb0Er5wcS2SrFN4jW8g1qIAmcMsRlRdUKvnvfmKixvENYspAyF/ihWbpyw==", + "dev": true, + "dependencies": { + "coffee-script": "~1.8.0", + "fs-plus": "^3.1.1", + "source-map": "~0.1.43" + } + }, + "node_modules/coffeestack/node_modules/coffee-script": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz", + "integrity": "sha512-EvLTMcu9vR6G1yfnz75yrISvhq1eBPC+pZbQhHzTiC5vXgpYIrArxQc5tB+SYfBi3souVdSZ4AZzYxI72oLXUw==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "dependencies": { + "mkdirp": "~0.3.5" + }, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/coffeestack/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true + }, + "node_modules/coffeestack/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz", + "integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==", + "dev": true, + "dependencies": { + "keypress": "0.1.x" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", + "dependencies": { + "es5-ext": "~0.10.2" + } + }, + "node_modules/dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha512-AXvW8g7tO4ilk5HgOWeDmPi/ZPaCnMJ+9Cg1I3p19w6mcvAAXBuuGEXAxybC+Djj1PSZUiHUcyoYu7WneCX8gQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/donna": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/donna/-/donna-1.0.16.tgz", + "integrity": "sha512-ijxJSPmi+oNMyPdz7FaG3fs+CUuJJ31zN1WDOGUyLMpEuU+ve5vgFHqUA1nAOyFwyDnvtTzXgeqF0vpRLgEpGw==", + "dev": true, + "dependencies": { + "async": ">= 0.1.22", + "builtins": "0.0.4", + "coffee-script": "1.10.x", + "optimist": "~0.6", + "source-map": "0.1.29", + "underscore": ">= 0.1.0", + "underscore.string": ">= 0.1.0", + "walkdir": ">= 0.0.2" + }, + "bin": { + "donna": "bin/donna" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/donna/node_modules/coffee-script": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", + "integrity": "sha512-ef2EsKe2bCuX3VGXfPCNGqni3wgrL8Bu0tDdY8mUDa+QnDR1GNcsC4QhxwG4az6l5y5W0wKUc1Pn/F3MCyafjg==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/emissary": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/emissary/-/emissary-1.3.3.tgz", + "integrity": "sha512-pD6FWNBSlEOzSJDCTcSGVLgNnGw5fnCvvGMdQ/TN43efeXZ/QTq8+hZoK3OOEXPRNjMmSJmeOnEJh+bWT5O8rQ==", + "dependencies": { + "es6-weak-map": "^0.1.2", + "mixto": "1.x", + "property-accessors": "^1.1", + "underscore-plus": "1.x" + } + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es5-ext/node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/es5-ext/node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es5-ext/node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", + "dependencies": { + "d": "~0.1.1", + "es5-ext": "~0.10.5", + "es6-symbol": "~2.0.1" + } + }, + "node_modules/es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", + "dependencies": { + "d": "~0.1.1", + "es5-ext": "~0.10.5" + } + }, + "node_modules/es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", + "dependencies": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "es6-iterator": "~0.1.3", + "es6-symbol": "~2.0.1" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/event-kit": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.5.3.tgz", + "integrity": "sha512-b7Qi1JNzY4BfAYfnIRanLk0DOD1gdkWHT4GISIn8Q2tAf3LpU8SP2CMwWaq40imYoKWbtN4ZhbSRxvsnikooZQ==" + }, + "node_modules/eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/fileset": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.8.tgz", + "integrity": "sha512-Gg0/Iy/v4BfdGWZpbpVBPKIYcap7jMn2uT5lcIDZyMFZR35VDojrJnIAwWjCj7ZOqsGp3j+ExWKqnfGrz4q0fg==", + "dev": true, + "dependencies": { + "glob": "3.x", + "minimatch": "0.x" + } + }, + "node_modules/findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha512-yjftfYnF4ThYEvKEV/kEFR15dmtyXTAh3vQnzpJUoc7Naj5y1P0Ck7Zs1+Vroa00E3KT3IYsk756S+8WA5dNLw==", + "dev": true, + "dependencies": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/findup-sync/node_modules/glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "dependencies": { + "inherits": "2", + "minimatch": "0.3" + }, + "engines": { + "node": "*" + } + }, + "node_modules/findup-sync/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/findup-sync/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/findup-sync/node_modules/minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fs-plus": { + "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==", + "dependencies": { + "async": "^1.5.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2", + "underscore-plus": "1.x" + } + }, + "node_modules/fs-plus/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/fs-plus/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fs-plus/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/fs-plus/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/fs-plus/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/gaze": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", + "integrity": "sha512-vIK81ZT20o9X0LOHYDGo5Phq6FaQRjDjBN2KkbYSxlaXnN1WDH0Op0tPThqNVA8ZnmN/TYNZfGHAVkBTrdeBIQ==", + "dev": true, + "dependencies": { + "fileset": "~0.1.5", + "minimatch": "~0.2.9" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha512-hIGEBfnHcZpWkXPsAVeVmpYDvfy/matVl03yOY91FPmnpCC12Lm5izNxCjO3lHAeO6uaTwMxu7g450Siknlhig==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "dependencies": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + }, + "engines": { + "node": "*" + } + }, + "node_modules/graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "deprecated": "please upgrade to graceful-fs 4 for compatibility with current and future versions of Node.js", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/grim": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/grim/-/grim-2.0.3.tgz", + "integrity": "sha512-FM20Ump11qYLK9k9DbL8yzVpy+YBieya1JG15OeH8s+KbHq8kL4SdwRtURwIUHniSxb24EoBUpwKfFjGNVi4/Q==", + "dependencies": { + "event-kit": "^2.0.0" + } + }, + "node_modules/grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha512-1iq3ylLjzXqz/KSq1OAE2qhnpcbkF2WyhsQcavZt+YmgvHu0EbPMEhGhy2gr0FP67isHpRdfwjB5WVeXXcJemQ==", + "dev": true, + "dependencies": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-atomdoc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-atomdoc/-/grunt-atomdoc-1.0.1.tgz", + "integrity": "sha512-/DM4+o+23UXNqeoQbuh48i+jVIR5xeXT8o+pB+nyffDTXLjWT+oqy6+9zXyceQImmGZ6EmYlCDKAXezuqKnmVw==", + "dev": true, + "dependencies": { + "donna": "~1.0", + "tello": "~1.0" + }, + "peerDependencies": { + "grunt": "~0.4.0" + } + }, + "node_modules/grunt-cli": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-0.1.13.tgz", + "integrity": "sha512-BbNtMuqZIZjafVWYB2nipPtvWILEVtY6N30eMNwKzwISddC5D4XHzfqjuCyEKcKTH19k3FqsRLZenEc1g3PE0Q==", + "dev": true, + "dependencies": { + "findup-sync": "~0.1.0", + "nopt": "~1.0.10", + "resolve": "~0.3.1" + }, + "bin": { + "grunt": "bin/grunt" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-coffeelint": { + "version": "0.0.13", + "resolved": "git+ssh://git@github.com/atom/grunt-coffeelint.git#e2c627a0cb508bbd93969b51eb92c727dcb18e7f", + "dev": true, + "dependencies": { + "coffeelint": "^1.5.4", + "coffeelint-stylish": "~0.1.0" + }, + "engines": { + "node": "*" + }, + "peerDependencies": { + "grunt": "~0.4" + } + }, + "node_modules/grunt-contrib-coffee": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.9.0.tgz", + "integrity": "sha512-YUaNYGBi/1OiNNVjkveKJGD16Bh4EOKQsOVWO6cewQ41qwJYZ6ZhDCPZSlYNgWAXv4/wq7DdNb2DWNkIkZ6QXw==", + "dev": true, + "dependencies": { + "chalk": "~0.4.0", + "coffee-script": "~1.7.0", + "lodash": "~2.4.1" + }, + "engines": { + "node": ">= 0.8.0" + }, + "peerDependencies": { + "grunt": "~0.4.0" + } + }, + "node_modules/grunt-contrib-coffee/node_modules/ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-coffee/node_modules/chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "dependencies": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-coffee/node_modules/coffee-script": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", + "integrity": "sha512-W3s+SROY73OmrSGtPTTW/2wp2rmW5vuh0/tUuCK1NvTuyzLOVPccIP9whmhZ4cYWcr2NJPNENZIFaAMkTD5G3w==", + "deprecated": "CoffeeScript on NPM has moved to \"coffeescript\" (no hyphen)", + "dev": true, + "dependencies": { + "mkdirp": "~0.3.5" + }, + "bin": { + "cake": "bin/cake", + "coffee": "bin/coffee" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-contrib-coffee/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/grunt-contrib-coffee/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true + }, + "node_modules/grunt-contrib-coffee/node_modules/strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true, + "bin": { + "strip-ansi": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha512-qYs/uM0ImdzwIXLhS4O5WLV5soAM+PEqqHI/hzSxlo450ERSccEhnXqoeDA9ZozOdaWuYnzTOTwRcVRogleMxg==", + "dev": true, + "dependencies": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha512-D0vbUX00TFYCKNZtcZzemMpwT8TR/FdRs1pmfiBw6qnUw80PfsjV+lhIozY/3eJ3PSG2zj89wd2mH/7f4tNAlw==", + "dev": true, + "dependencies": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-legacy-log-utils/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/grunt-legacy-log-utils/node_modules/underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-legacy-log/node_modules/lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/grunt-legacy-log/node_modules/underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha512-cXPbfF8aM+pvveQeN1K872D5fRm30xfJWZiS63Y8W8oyIPLClCsmI8bW96Txqzac9cyL4lRqEBhbhJ3n5EzUUQ==", + "dev": true, + "dependencies": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/grunt-legacy-util/node_modules/async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/grunt-shell": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.2.2.tgz", + "integrity": "sha512-jbPlpDjWD3aMZRSSbgOjBZVD2Q7xvzaBFY/0c+/AqH8TZx+/raeO0OSxoE705i9p/+3yNN4t3rJAgzebFY3GVA==", + "dev": true, + "engines": { + "node": ">=0.8.0" + }, + "peerDependencies": { + "grunt": "~0.4.0" + } + }, + "node_modules/grunt/node_modules/async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/grunt/node_modules/iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha512-KhmFWgaQZY83Cbhi+ADInoUQ8Etn6BG5fikM9syeOjQltvR45h7cRKJ/9uvQEuD61I3Uju77yYce0/LhKVClQw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + }, + "node_modules/jasmine-focused": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/jasmine-focused/-/jasmine-focused-1.0.7.tgz", + "integrity": "sha512-FYJImuqPz3O0T1aOBrRfwgGNMfp/NAa2ywmqDkKWZ1hAxXZ4ZAzfFZ8AK+yKfWpCQSjXFqPuFaKoNTJyvS2sWw==", + "dev": true, + "dependencies": { + "jasmine-node": "git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "underscore-plus": "1.x", + "walkdir": "0.0.7" + }, + "bin": { + "jasmine-focused": "bin/jasmine-focused", + "nof": "bin/nof" + } + }, + "node_modules/jasmine-focused/node_modules/walkdir": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz", + "integrity": "sha512-onj2wLVXrMWx/Ptvb1fobwLsoU/Aah+WHzcdu1iUXDKaJX12HWQsTF/41TwUBSULvNf+EjYMXoKePPt3x8FcXA==", + "dev": true, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/jasmine-node": { + "version": "1.10.2", + "resolved": "git+ssh://git@github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "integrity": "sha512-OvqXUF5P3qkt6qYIkMeTRfBRp0V2BcQYhmUfax40vP0CcjxNbXy1hKaxTj/fidXU72bp/zf8UEJd5DqZI+Ojlg==", + "dev": true, + "dependencies": { + "coffee-script": ">=1.0.1", + "coffeestack": ">=1 <2", + "gaze": "~0.3.2", + "jasmine-reporters": ">=0.2.0", + "mkdirp": "~0.3.5", + "requirejs": ">=0.27.1", + "underscore": ">= 1.3.1", + "walkdir": ">= 0.0.1" + }, + "bin": { + "jasmine-node": "bin/jasmine-node" + } + }, + "node_modules/jasmine-node/node_modules/mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "deprecated": "Legacy versions of mkdirp are no longer supported. Please update to mkdirp 1.x. (Note that the API surface has changed to use Promises in 1.x.)", + "dev": true + }, + "node_modules/jasmine-reporters": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.5.1.tgz", + "integrity": "sha512-vFVTOveMTXTVh3yssjHZYhoHtqoz+Ch1JhIJNAcbUiZIBZprKuskbxtOIpJORCFlYKq5KhnTEzwI8Ts6Qcwuwg==", + "dev": true, + "dependencies": { + "@xmldom/xmldom": "^0.8.3", + "mkdirp": "^1.0.4" + } + }, + "node_modules/jasmine-reporters/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jasmine-tagged": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jasmine-tagged/-/jasmine-tagged-1.1.4.tgz", + "integrity": "sha512-Gw/UzbeNJibnX4Eje64Yk/6k9yxZHXpPxm/x0ooaYbSu7Uw/w6rwahf3cOryRP00sofuD8yCCxO3n6xjUauh9g==", + "dev": true, + "dependencies": { + "jasmine-focused": "^1.0.7" + }, + "bin": { + "jasmine-tagged": "bin/jasmine-tagged" + } + }, + "node_modules/js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha512-VEKcIksckDBUhg2JS874xVouiPkywVUh4yyUmLCDe1Zg3bCd6M+F1eGPenPeHLc2XC8pp9G8bsuofK0NeEqRkA==", + "dev": true, + "dependencies": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + }, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/keypress": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", + "integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==", + "dev": true + }, + "node_modules/lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true, + "engines": [ + "node", + "rhino" + ] + }, + "node_modules/lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "node_modules/marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true, + "bin": { + "marked": "bin/marked" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "deprecated": "Please update to minimatch 3.0.2 or higher to avoid a RegExp DoS issue", + "dev": true, + "dependencies": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mixto/-/mixto-1.0.0.tgz", + "integrity": "sha512-g2Kg8O3ww9RbWuPnAgTsAhe+aBwVXoo/lhYyDKTYPiLKdJofAr97O8zTFzW5UfiJUoeJbmXLmcjDAF7/Egwi8Q==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-cpplint": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/node-cpplint/-/node-cpplint-0.1.5.tgz", + "integrity": "sha512-1XpD/dwhGxh5MlgLojQB6x9FBQqW3UNSsbOT48VaH6nDQIOxKr+C+VHDifHQJj9O5h7MDGOn61yR7qUpwsU8lQ==", + "dev": true, + "dependencies": { + "colors": "~0.6.0-1", + "commander": "~1.1.1" + }, + "bin": { + "node-cpplint": "bin/cpplint" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dev": true, + "dependencies": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + } + }, + "node_modules/optimist/node_modules/minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "dev": true + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/property-accessors": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/property-accessors/-/property-accessors-1.1.3.tgz", + "integrity": "sha512-WQTVW7rn+k6wq8FyYVM15afyoB2loEdeIzd/o7+HEA5hMZcxvRf4Khie0fBM9wLP3EJotKhiH15kY7Dd4gc57g==", + "dependencies": { + "es6-weak-map": "^0.1.2", + "mixto": "1.x" + } + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "dev": true, + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha512-mxx/I/wLjxtryDBtrrb0ZNzaYERVWaHpJ0W0Arm8N4l8b+jiX/U5yKcsj0zQpF9UuKN1uz80EUTOudON6OPuaQ==", + "dev": true + }, + "node_modules/rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "node_modules/source-map": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.29.tgz", + "integrity": "sha512-/XGYfd2ykeYNmXopQsGZK+oMxR7A48VBHK7u8610061aivyuopi86C87gG2yfQeTsQxQDw0N9cyP5JQIbnn9UA==", + "dev": true, + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true, + "bin": { + "strip-json-comments": "cli.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/tello": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tello/-/tello-1.0.7.tgz", + "integrity": "sha512-N/EvP7dLmiNQwg0NFY1igz69Fj6G8RGM2AuVSpJfDWYb831w9Ary81/jwRhgIarFDH6deK7jytHyYMo6FtHbiA==", + "dev": true, + "dependencies": { + "atomdoc": "1.0.6", + "optimist": "~0.6", + "underscore": "~1.6" + }, + "bin": { + "tello": "bin/tello" + } + }, + "node_modules/tello/node_modules/underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==", + "dev": true + }, + "node_modules/temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "dependencies": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/temp/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/temp/node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/temp/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/temp/node_modules/rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/underscore-plus": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.7.0.tgz", + "integrity": "sha512-A3BEzkeicFLnr+U/Q3EyWwJAQPbA19mtZZ4h+lLq3ttm9kn8WC4R3YpuJZEXmWdLjYP47Zc8aLZm9kwdv+zzvA==", + "dependencies": { + "underscore": "^1.9.1" + } + }, + "node_modules/underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha512-3FVmhXqelrj6gfgp3Bn6tOavJvW0dNH2T+heTD38JRxIrAbiuzbqjknszoOYj3DyFB1nWiLj208Qt2no/L4cIA==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "dev": true, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + }, + "dependencies": { + "@xmldom/xmldom": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.5.tgz", + "integrity": "sha512-0dpjDLeCXYThL2YhqZcd/spuwoH+dmnFoND9ZxZkAYxp1IJUB2GP16ow2MJRsjVxy8j1Qv8BJRmN5GKnbDKCmQ==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha512-LjmC2dNpdn2L4UzyoaIr11ELYoLn37ZFy9zObrQFHsSuOepeUEMKnM8w5KL4Tnrp2gy88rRuQt6Ky8Bjml+Baw==", + "dev": true, + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + }, + "dependencies": { + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha512-cp0oQQyZhUM1kpJDLdGO1jPZHgS/MpzoWYfe9+CM2h/QGDZlqwT2T3YGukuBdaNJ/CAPoeyAZRRHz8JFo176vA==", + "dev": true + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha512-yxkabuCaIBnzfIvX3kBxQqCs0ar/bfJwDnFEHJUm/ZrRVhT3IItdRF5cZjARLzEnyQYtIUhsZ2LG2j3HidFOFQ==", + "dev": true + } + } + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==" + }, + "atomdoc": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/atomdoc/-/atomdoc-1.0.6.tgz", + "integrity": "sha512-DU9ABgZw7egM0mxAe2AZX1RqEDyXu/PeIsVni/R3hxeuXEyyf+GVfygcYwclx1d7bEUVVMP+zTB8Aw4itei4sA==", + "dev": true, + "requires": { + "marked": "^0.3.6" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "builtins": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-0.0.4.tgz", + "integrity": "sha512-WfzPUnPeK0c5T6BX1bd/2xEluDkSekN4triHgeEL/2ZZPMjgZuAEIFxUhhR8Tf1c5Qkk4JtF8/JQG6B8XLl2gA==", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "coffee-script": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", + "integrity": "sha512-QjQ1T4BqyHv19k6XSfdhy/QLlIOhywz0ekBUCa9h71zYMJlfDTGan/Z1JXzYkZ6v8R+GhvL/p4FZPbPW8WNXlg==", + "dev": true + }, + "coffeelint": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/coffeelint/-/coffeelint-1.16.2.tgz", + "integrity": "sha512-6mzgOo4zb17WfdrSui/cSUEgQ0AQkW3gXDht+6lHkfkqGUtSYKwGdGcXsDfAyuScVzTlTtKdfwkAlJWfqul7zg==", + "dev": true, + "requires": { + "coffee-script": "~1.11.0", + "glob": "^7.0.6", + "ignore": "^3.0.9", + "optimist": "^0.6.1", + "resolve": "^0.6.3", + "strip-json-comments": "^1.0.2" + }, + "dependencies": { + "coffee-script": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.11.1.tgz", + "integrity": "sha512-NIWm59Fh1zkXq6TS6PQvSO3AR9DbGq1IBNZHa1E3fUCNmJhIwLf1YKcWgaHqaU7zWGC/OE2V7K3GVAXFzcmu+A==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "resolve": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.6.3.tgz", + "integrity": "sha512-UHBY3viPlJKf85YijDUcikKX6tmF4SokIDp518ZDVT92JNDcG5uKIthaT/owt3Sar0lwtOafsQuwrg22/v2Dwg==", + "dev": true + } + } + }, + "coffeelint-stylish": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/coffeelint-stylish/-/coffeelint-stylish-0.1.2.tgz", + "integrity": "sha512-VcuzfB0bC9lvdvwckLzh3njKce68VVmOOXp0igyNl50D/uRLbFb4HSjQtTNGFEYiQ9Z0hjhfTqKe4v8UQxnngA==", + "dev": true, + "requires": { + "chalk": "^1.0.0", + "text-table": "^0.2.0" + } + }, + "coffeestack": { + "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": "^3.1.1", + "source-map": "~0.1.43" + }, + "dependencies": { + "coffee-script": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.8.0.tgz", + "integrity": "sha512-EvLTMcu9vR6G1yfnz75yrISvhq1eBPC+pZbQhHzTiC5vXgpYIrArxQc5tB+SYfBi3souVdSZ4AZzYxI72oLXUw==", + "dev": true, + "requires": { + "mkdirp": "~0.3.5" + } + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "colors": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", + "integrity": "sha512-OsSVtHK8Ir8r3+Fxw/b4jS1ZLPXkV6ZxDRJQzeD7qo0SqMXWrHDM71DgYzPMHY8SFJ0Ao+nNU2p1MmwdzKqPrw==", + "dev": true + }, + "commander": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-1.1.1.tgz", + "integrity": "sha512-71Rod2AhcH3JhkBikVpNd0pA+fWsmAaVoti6OR38T76chA7vE3pSerS0Jor4wDw+tOueD2zLVvFOw5H0Rcj7rA==", + "dev": true, + "requires": { + "keypress": "0.1.x" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "d": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/d/-/d-0.1.1.tgz", + "integrity": "sha512-0SdM9V9pd/OXJHoWmTfNPTAeD+lw6ZqHg+isPyBFuJsZLSE0Ygg1cYZ/0l6DrKQXMOqGOu1oWupMoOfoRfMZrQ==", + "requires": { + "es5-ext": "~0.10.2" + } + }, + "dateformat": { + "version": "1.0.2-1.2.3", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", + "integrity": "sha512-AXvW8g7tO4ilk5HgOWeDmPi/ZPaCnMJ+9Cg1I3p19w6mcvAAXBuuGEXAxybC+Djj1PSZUiHUcyoYu7WneCX8gQ==", + "dev": true + }, + "donna": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/donna/-/donna-1.0.16.tgz", + "integrity": "sha512-ijxJSPmi+oNMyPdz7FaG3fs+CUuJJ31zN1WDOGUyLMpEuU+ve5vgFHqUA1nAOyFwyDnvtTzXgeqF0vpRLgEpGw==", + "dev": true, + "requires": { + "async": ">= 0.1.22", + "builtins": "0.0.4", + "coffee-script": "1.10.x", + "optimist": "~0.6", + "source-map": "0.1.29", + "underscore": ">= 0.1.0", + "underscore.string": ">= 0.1.0", + "walkdir": ">= 0.0.2" + }, + "dependencies": { + "coffee-script": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.10.0.tgz", + "integrity": "sha512-ef2EsKe2bCuX3VGXfPCNGqni3wgrL8Bu0tDdY8mUDa+QnDR1GNcsC4QhxwG4az6l5y5W0wKUc1Pn/F3MCyafjg==", + "dev": true + } + } + }, + "emissary": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/emissary/-/emissary-1.3.3.tgz", + "integrity": "sha512-pD6FWNBSlEOzSJDCTcSGVLgNnGw5fnCvvGMdQ/TN43efeXZ/QTq8+hZoK3OOEXPRNjMmSJmeOnEJh+bWT5O8rQ==", + "requires": { + "es6-weak-map": "^0.1.2", + "mixto": "1.x", + "property-accessors": "^1.1", + "underscore-plus": "1.x" + } + }, + "es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "requires": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "dependencies": { + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + } + } + }, + "es6-iterator": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-0.1.3.tgz", + "integrity": "sha512-6TOmbFM6OPWkTe+bQ3ZuUkvqcWUjAnYjKUCLdbvRsAUz2Pr+fYIibwNXNkLNtIK9PPFbNMZZddaRNkyJhlGJhA==", + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5", + "es6-symbol": "~2.0.1" + } + }, + "es6-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-2.0.1.tgz", + "integrity": "sha512-wjobO4zO8726HVU7mI2OA/B6QszqwHJuKab7gKHVx+uRfVVYGcWJkCIFxV2Madqb9/RUSrhJ/r6hPfG7FsWtow==", + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.5" + } + }, + "es6-weak-map": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-0.1.4.tgz", + "integrity": "sha512-P+N5Cd2TXeb7G59euFiM7snORspgbInS29Nbf3KNO2JQp/DyhvMCDWd58nsVAXwYJ6W3Bx7qDdy6QQ3PCJ7jKQ==", + "requires": { + "d": "~0.1.1", + "es5-ext": "~0.10.6", + "es6-iterator": "~0.1.3", + "es6-symbol": "~2.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha512-rp5dMKN8zEs9dfi9g0X1ClLmV//WRyk/R15mppFNICIFRG5P92VP7Z04p8pk++gABo9W2tY+kHyu6P1mEHgmTA==", + "dev": true + }, + "event-kit": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/event-kit/-/event-kit-2.5.3.tgz", + "integrity": "sha512-b7Qi1JNzY4BfAYfnIRanLk0DOD1gdkWHT4GISIn8Q2tAf3LpU8SP2CMwWaq40imYoKWbtN4ZhbSRxvsnikooZQ==" + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha512-K7J4xq5xAD5jHsGM5ReWXRTFa3JRGofHiMcVgQ8PRwgWxzjHpMWCIzsmyf60+mh8KLsqYPcjUMa0AC4hd6lPyQ==", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "dev": true + }, + "ext": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "requires": { + "type": "^2.7.2" + }, + "dependencies": { + "type": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + } + } + }, + "fileset": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-0.1.8.tgz", + "integrity": "sha512-Gg0/Iy/v4BfdGWZpbpVBPKIYcap7jMn2uT5lcIDZyMFZR35VDojrJnIAwWjCj7ZOqsGp3j+ExWKqnfGrz4q0fg==", + "dev": true, + "requires": { + "glob": "3.x", + "minimatch": "0.x" + } + }, + "findup-sync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", + "integrity": "sha512-yjftfYnF4ThYEvKEV/kEFR15dmtyXTAh3vQnzpJUoc7Naj5y1P0Ck7Zs1+Vroa00E3KT3IYsk756S+8WA5dNLw==", + "dev": true, + "requires": { + "glob": "~3.2.9", + "lodash": "~2.4.1" + }, + "dependencies": { + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha512-hVb0zwEZwC1FXSKRPFTeOtN7AArJcJlI6ULGLtrstaswKNlrTJqAA+1lYlSUop4vjA423xlBzqfVS3iWGlqJ+g==", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha512-WFX1jI1AaxNTZVOHLBVazwTWKaQjoykSzCBNXB72vDTCzopQGtyP91tKdFK5cv1+qMwPyiTu1HqUriqplI8pcA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + } + } + }, + "fs-plus": { + "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==", + "requires": { + "async": "^1.5.2", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2", + "underscore-plus": "1.x" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "gaze": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.3.4.tgz", + "integrity": "sha512-vIK81ZT20o9X0LOHYDGo5Phq6FaQRjDjBN2KkbYSxlaXnN1WDH0Op0tPThqNVA8ZnmN/TYNZfGHAVkBTrdeBIQ==", + "dev": true, + "requires": { + "fileset": "~0.1.5", + "minimatch": "~0.2.9" + } + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha512-hIGEBfnHcZpWkXPsAVeVmpYDvfy/matVl03yOY91FPmnpCC12Lm5izNxCjO3lHAeO6uaTwMxu7g450Siknlhig==", + "dev": true + }, + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha512-ANhy2V2+tFpRajE3wN4DhkNQ08KDr0Ir1qL12/cUe5+a7STEK8jkW4onUYuY8/06qAFuT5je7mjAqzx0eKI2tQ==", + "dev": true, + "requires": { + "graceful-fs": "~1.2.0", + "inherits": "1", + "minimatch": "~0.2.11" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha512-iiTUZ5vZ+2ZV+h71XAgwCSu6+NAizhFU3Yw8aC/hH5SQ3SnISqEqAek40imAFGtDcwJKNhXvSY+hzIolnLwcdQ==", + "dev": true + }, + "grim": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/grim/-/grim-2.0.3.tgz", + "integrity": "sha512-FM20Ump11qYLK9k9DbL8yzVpy+YBieya1JG15OeH8s+KbHq8kL4SdwRtURwIUHniSxb24EoBUpwKfFjGNVi4/Q==", + "requires": { + "event-kit": "^2.0.0" + } + }, + "grunt": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", + "integrity": "sha512-1iq3ylLjzXqz/KSq1OAE2qhnpcbkF2WyhsQcavZt+YmgvHu0EbPMEhGhy2gr0FP67isHpRdfwjB5WVeXXcJemQ==", + "dev": true, + "requires": { + "async": "~0.1.22", + "coffee-script": "~1.3.3", + "colors": "~0.6.2", + "dateformat": "1.0.2-1.2.3", + "eventemitter2": "~0.4.13", + "exit": "~0.1.1", + "findup-sync": "~0.1.2", + "getobject": "~0.1.0", + "glob": "~3.1.21", + "grunt-legacy-log": "~0.1.0", + "grunt-legacy-util": "~0.2.0", + "hooker": "~0.2.3", + "iconv-lite": "~0.2.11", + "js-yaml": "~2.0.5", + "lodash": "~0.9.2", + "minimatch": "~0.2.12", + "nopt": "~1.0.10", + "rimraf": "~2.2.8", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + }, + "dependencies": { + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "dev": true + }, + "iconv-lite": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", + "integrity": "sha512-KhmFWgaQZY83Cbhi+ADInoUQ8Etn6BG5fikM9syeOjQltvR45h7cRKJ/9uvQEuD61I3Uju77yYce0/LhKVClQw==", + "dev": true + } + } + }, + "grunt-atomdoc": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/grunt-atomdoc/-/grunt-atomdoc-1.0.1.tgz", + "integrity": "sha512-/DM4+o+23UXNqeoQbuh48i+jVIR5xeXT8o+pB+nyffDTXLjWT+oqy6+9zXyceQImmGZ6EmYlCDKAXezuqKnmVw==", + "dev": true, + "requires": { + "donna": "~1.0", + "tello": "~1.0" + } + }, + "grunt-cli": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-0.1.13.tgz", + "integrity": "sha512-BbNtMuqZIZjafVWYB2nipPtvWILEVtY6N30eMNwKzwISddC5D4XHzfqjuCyEKcKTH19k3FqsRLZenEc1g3PE0Q==", + "dev": true, + "requires": { + "findup-sync": "~0.1.0", + "nopt": "~1.0.10", + "resolve": "~0.3.1" + } + }, + "grunt-coffeelint": { + "version": "git+ssh://git@github.com/atom/grunt-coffeelint.git#e2c627a0cb508bbd93969b51eb92c727dcb18e7f", + "dev": true, + "from": "grunt-coffeelint@git+https://github.com/atom/grunt-coffeelint.git", + "requires": { + "coffeelint": "^1.5.4", + "coffeelint-stylish": "~0.1.0" + } + }, + "grunt-contrib-coffee": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-coffee/-/grunt-contrib-coffee-0.9.0.tgz", + "integrity": "sha512-YUaNYGBi/1OiNNVjkveKJGD16Bh4EOKQsOVWO6cewQ41qwJYZ6ZhDCPZSlYNgWAXv4/wq7DdNb2DWNkIkZ6QXw==", + "dev": true, + "requires": { + "chalk": "~0.4.0", + "coffee-script": "~1.7.0", + "lodash": "~2.4.1" + }, + "dependencies": { + "ansi-styles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.0.0.tgz", + "integrity": "sha512-3iF4FIKdxaVYT3JqQuY3Wat/T2t7TRbbQ94Fu50ZUCbLy4TFbTzr90NOHQodQkNqmeEGCw8WbeP78WNi6SKYUA==", + "dev": true + }, + "chalk": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.4.0.tgz", + "integrity": "sha512-sQfYDlfv2DGVtjdoQqxS0cEZDroyG8h6TamA6rvxwlrU5BaSLDx9xhatBYl2pxZ7gmpNaPFVwBtdGdu5rQ+tYQ==", + "dev": true, + "requires": { + "ansi-styles": "~1.0.0", + "has-color": "~0.1.0", + "strip-ansi": "~0.1.0" + } + }, + "coffee-script": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.7.1.tgz", + "integrity": "sha512-W3s+SROY73OmrSGtPTTW/2wp2rmW5vuh0/tUuCK1NvTuyzLOVPccIP9whmhZ4cYWcr2NJPNENZIFaAMkTD5G3w==", + "dev": true, + "requires": { + "mkdirp": "~0.3.5" + } + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + }, + "strip-ansi": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.1.1.tgz", + "integrity": "sha512-behete+3uqxecWlDAm5lmskaSaISA+ThQ4oNNBDTBJt0x2ppR6IPqfZNuj6BLaLJ/Sji4TPZlcRyOis8wXQTLg==", + "dev": true + } + } + }, + "grunt-legacy-log": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", + "integrity": "sha512-qYs/uM0ImdzwIXLhS4O5WLV5soAM+PEqqHI/hzSxlo450ERSccEhnXqoeDA9ZozOdaWuYnzTOTwRcVRogleMxg==", + "dev": true, + "requires": { + "colors": "~0.6.2", + "grunt-legacy-log-utils": "~0.1.1", + "hooker": "~0.2.3", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + } + } + }, + "grunt-legacy-log-utils": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", + "integrity": "sha512-D0vbUX00TFYCKNZtcZzemMpwT8TR/FdRs1pmfiBw6qnUw80PfsjV+lhIozY/3eJ3PSG2zj89wd2mH/7f4tNAlw==", + "dev": true, + "requires": { + "colors": "~0.6.2", + "lodash": "~2.4.1", + "underscore.string": "~2.3.3" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha512-Kak1hi6/hYHGVPmdyiZijoQyz5x2iGVzs6w9GYB/HiXEtylY7tIoYEROMjvM1d9nXJqPOrG2MNPMn01bJ+S0Rw==", + "dev": true + }, + "underscore.string": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha512-hbD5MibthuDAu4yA5wxes5bzFgqd3PpBJuClbRxaNddxfdsz+qf+1kHwrGQFrmchmDHb9iNU+6EHDn8uj0xDJg==", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", + "integrity": "sha512-cXPbfF8aM+pvveQeN1K872D5fRm30xfJWZiS63Y8W8oyIPLClCsmI8bW96Txqzac9cyL4lRqEBhbhJ3n5EzUUQ==", + "dev": true, + "requires": { + "async": "~0.1.22", + "exit": "~0.1.1", + "getobject": "~0.1.0", + "hooker": "~0.2.3", + "lodash": "~0.9.2", + "underscore.string": "~2.2.1", + "which": "~1.0.5" + }, + "dependencies": { + "async": { + "version": "0.1.22", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", + "integrity": "sha512-2tEzliJmf5fHNafNwQLJXUasGzQCVctvsNkXmnlELHwypU0p08/rHohYvkqKIjyXpx+0rkrYv6QbhJ+UF4QkBg==", + "dev": true + } + } + }, + "grunt-shell": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/grunt-shell/-/grunt-shell-0.2.2.tgz", + "integrity": "sha512-jbPlpDjWD3aMZRSSbgOjBZVD2Q7xvzaBFY/0c+/AqH8TZx+/raeO0OSxoE705i9p/+3yNN4t3rJAgzebFY3GVA==", + "dev": true, + "requires": {} + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-color": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-color/-/has-color-0.1.7.tgz", + "integrity": "sha512-kaNz5OTAYYmt646Hkqw50/qyxP2vFnTVu5AQ1Zmk22Kk5+4Qx6BpO8+u7IKsML5fOsFk0ZT0AcCJNYwcvaLBvw==", + "dev": true + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha512-t+UerCsQviSymAInD01Pw+Dn/usmz1sRO+3Zk1+lx8eg+WKpD2ulcwWqHHL0+aseRBr+3+vIhiG1K1JTwaIcTA==", + "dev": true + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha512-Al67oatbRSo3RV5hRqIoln6Y5yMVbJSIn4jEJNL7VCImzq/kLr7vvb6sFRJXqr8rpHc/2kJOM+y0sPKN47VdzA==", + "dev": true + }, + "jasmine-focused": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/jasmine-focused/-/jasmine-focused-1.0.7.tgz", + "integrity": "sha512-FYJImuqPz3O0T1aOBrRfwgGNMfp/NAa2ywmqDkKWZ1hAxXZ4ZAzfFZ8AK+yKfWpCQSjXFqPuFaKoNTJyvS2sWw==", + "dev": true, + "requires": { + "jasmine-node": "git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "underscore-plus": "1.x", + "walkdir": "0.0.7" + }, + "dependencies": { + "walkdir": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.7.tgz", + "integrity": "sha512-onj2wLVXrMWx/Ptvb1fobwLsoU/Aah+WHzcdu1iUXDKaJX12HWQsTF/41TwUBSULvNf+EjYMXoKePPt3x8FcXA==", + "dev": true + } + } + }, + "jasmine-node": { + "version": "git+ssh://git@github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "integrity": "sha512-OvqXUF5P3qkt6qYIkMeTRfBRp0V2BcQYhmUfax40vP0CcjxNbXy1hKaxTj/fidXU72bp/zf8UEJd5DqZI+Ojlg==", + "dev": true, + "from": "jasmine-node@git+https://github.com/kevinsawicki/jasmine-node.git#81af4f953a2b7dfb5bde8331c05362a4b464c5ef", + "requires": { + "coffee-script": ">=1.0.1", + "coffeestack": ">=1 <2", + "gaze": "~0.3.2", + "jasmine-reporters": ">=0.2.0", + "mkdirp": "~0.3.5", + "requirejs": ">=0.27.1", + "underscore": ">= 1.3.1", + "walkdir": ">= 0.0.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha512-8OCq0De/h9ZxseqzCH8Kw/Filf5pF/vMI6+BH7Lu0jXz2pqYCjTAQRolSxRIi+Ax+oCCjlxoJMP0YQ4XlrQNHg==", + "dev": true + } + } + }, + "jasmine-reporters": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/jasmine-reporters/-/jasmine-reporters-2.5.1.tgz", + "integrity": "sha512-vFVTOveMTXTVh3yssjHZYhoHtqoz+Ch1JhIJNAcbUiZIBZprKuskbxtOIpJORCFlYKq5KhnTEzwI8Ts6Qcwuwg==", + "dev": true, + "requires": { + "@xmldom/xmldom": "^0.8.3", + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "jasmine-tagged": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/jasmine-tagged/-/jasmine-tagged-1.1.4.tgz", + "integrity": "sha512-Gw/UzbeNJibnX4Eje64Yk/6k9yxZHXpPxm/x0ooaYbSu7Uw/w6rwahf3cOryRP00sofuD8yCCxO3n6xjUauh9g==", + "dev": true, + "requires": { + "jasmine-focused": "^1.0.7" + } + }, + "js-yaml": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", + "integrity": "sha512-VEKcIksckDBUhg2JS874xVouiPkywVUh4yyUmLCDe1Zg3bCd6M+F1eGPenPeHLc2XC8pp9G8bsuofK0NeEqRkA==", + "dev": true, + "requires": { + "argparse": "~ 0.1.11", + "esprima": "~ 1.0.2" + } + }, + "keypress": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/keypress/-/keypress-0.1.0.tgz", + "integrity": "sha512-x0yf9PL/nx9Nw9oLL8ZVErFAk85/lslwEP7Vz7s5SI1ODXZIgit3C5qyWjw4DxOuO/3Hb4866SQh28a1V1d+WA==", + "dev": true + }, + "lodash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", + "integrity": "sha512-LVbt/rjK62gSbhehDVKL0vlaime4Y1IBixL+bKeNfoY4L2zab/jGrxU6Ka05tMA/zBxkTk5t3ivtphdyYupczw==", + "dev": true + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha512-WpibWJ60c3AgAz8a2iYErDrcT2C7OmKnsWhIcHOjkUHFjkXncJhtLxNSqUmxRxRunpb5I8Vprd7aNSd2NtksJQ==", + "dev": true + }, + "marked": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.19.tgz", + "integrity": "sha512-ea2eGWOqNxPcXv8dyERdSr/6FmzvWwzjMxpfGB/sbMccXoct+xY+YukPD+QTUZwyvK7BZwcr4m21WBOW41pAkg==", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha512-zZ+Jy8lVWlvqqeM8iZB7w7KmQkoJn8djM585z88rywrEbzoqawVa9FR5p2hwD+y74nfuKOjmNvi9gtWJNLqHvA==", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + }, + "mixto": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mixto/-/mixto-1.0.0.tgz", + "integrity": "sha512-g2Kg8O3ww9RbWuPnAgTsAhe+aBwVXoo/lhYyDKTYPiLKdJofAr97O8zTFzW5UfiJUoeJbmXLmcjDAF7/Egwi8Q==" + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, + "nan": { + "version": "2.17.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", + "integrity": "sha512-2ZTgtl0nJsO0KQCjEpxcIr5D+Yv90plTitZt9JBfQvVJDS5seMl3FOvsh3+9CoYWXf/1l5OaZzzF6nDm4cagaQ==" + }, + "next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node-cpplint": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/node-cpplint/-/node-cpplint-0.1.5.tgz", + "integrity": "sha512-1XpD/dwhGxh5MlgLojQB6x9FBQqW3UNSsbOT48VaH6nDQIOxKr+C+VHDifHQJj9O5h7MDGOn61yR7qUpwsU8lQ==", + "dev": true, + "requires": { + "colors": "~0.6.0-1", + "commander": "~1.1.1" + } + }, + "nopt": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", + "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha512-snN4O4TkigujZphWLN0E//nQmm7790RYaE53DdL7ZYwee2D8DDo9/EyYiKUfN3rneWUjhJnueija3G9I2i0h3g==", + "dev": true, + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha512-iotkTvxc+TwOm5Ieim8VnSNvCDjCK9S8G3scJ50ZthspSxa7jx50jkhYduuAtAjvfDUwSgOwf8+If99AlOEhyw==", + "dev": true + } + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "property-accessors": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/property-accessors/-/property-accessors-1.1.3.tgz", + "integrity": "sha512-WQTVW7rn+k6wq8FyYVM15afyoB2loEdeIzd/o7+HEA5hMZcxvRf4Khie0fBM9wLP3EJotKhiH15kY7Dd4gc57g==", + "requires": { + "es6-weak-map": "^0.1.2", + "mixto": "1.x" + } + }, + "requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "dev": true + }, + "resolve": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-0.3.1.tgz", + "integrity": "sha512-mxx/I/wLjxtryDBtrrb0ZNzaYERVWaHpJ0W0Arm8N4l8b+jiX/U5yKcsj0zQpF9UuKN1uz80EUTOudON6OPuaQ==", + "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha512-R5KMKHnPAQaZMqLOsyuyUmcIjSeDm+73eoqQpaXA7AZ22BL+6C+1mcUscgOsNd8WVlJuvlgAPsegcx7pjlV0Dg==", + "dev": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha512-fCvEXfh6NWpm+YSuY2bpXb/VIihqWA6hLsgboC+0nl71Q7N7o2eaCW8mJa/NLvQhs6jpd3VZV4UiUQlV6+lc8g==", + "dev": true + }, + "source-map": { + "version": "0.1.29", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.29.tgz", + "integrity": "sha512-/XGYfd2ykeYNmXopQsGZK+oMxR7A48VBHK7u8610061aivyuopi86C87gG2yfQeTsQxQDw0N9cyP5JQIbnn9UA==", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha512-AOPG8EBc5wAikaG1/7uFCNFJwnKOuQwFTpYBdTW6OvWHeZBQBrAA/amefHGrEiOnCPcLFZK6FUPtWVKpQVIRgg==", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true + }, + "tello": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/tello/-/tello-1.0.7.tgz", + "integrity": "sha512-N/EvP7dLmiNQwg0NFY1igz69Fj6G8RGM2AuVSpJfDWYb831w9Ary81/jwRhgIarFDH6deK7jytHyYMo6FtHbiA==", + "dev": true, + "requires": { + "atomdoc": "1.0.6", + "optimist": "~0.6", + "underscore": "~1.6" + }, + "dependencies": { + "underscore": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.6.0.tgz", + "integrity": "sha512-z4o1fvKUojIWh9XuaVLUDdf86RQiq13AC1dmHbTpoyuu+bquHms76v16CjycCbec87J7z0k//SiQVk0sMdFmpQ==", + "dev": true + } + } + }, + "temp": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.4.tgz", + "integrity": "sha512-yYrrsWnrXMcdsnu/7YMYAofM1ktpL5By7vZhf15CrXijWWrEYZks5AXBudalfSWJLlnen/QUJUB5aoB0kqZUGA==", + "dev": true, + "requires": { + "mkdirp": "^0.5.1", + "rimraf": "~2.6.2" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "underscore-plus": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore-plus/-/underscore-plus-1.7.0.tgz", + "integrity": "sha512-A3BEzkeicFLnr+U/Q3EyWwJAQPbA19mtZZ4h+lLq3ttm9kn8WC4R3YpuJZEXmWdLjYP47Zc8aLZm9kwdv+zzvA==", + "requires": { + "underscore": "^1.9.1" + } + }, + "underscore.string": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", + "integrity": "sha512-3FVmhXqelrj6gfgp3Bn6tOavJvW0dNH2T+heTD38JRxIrAbiuzbqjknszoOYj3DyFB1nWiLj208Qt2no/L4cIA==", + "dev": true + }, + "walkdir": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.4.1.tgz", + "integrity": "sha512-3eBwRyEln6E1MSzcxcVpQIhRG8Q1jLvEqRmCZqS3dsfXEDR/AhOF4d+jHg1qvDCpYaVRZjENPQyrVxAkQqxPgQ==", + "dev": true + }, + "which": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", + "integrity": "sha512-E87fdQ/eRJr9W1X4wTPejNy9zTW3FI2vpCZSJ/HAY+TkjKVC0TUm1jk6vn2Z7qay0DQy0+RBGdXxj+RmmiGZKQ==", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + } + } +} diff --git a/package.json b/package.json index 1b5b049..599882e 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ "fs-plus": "^3.0.0", "grim": "^2.0.1", "iconv-lite": "~0.4.4", - "nan": "^2.10.0", + "nan": "2.17.0", "underscore-plus": "~1.x" } } From e81e1fa43375c5892965338440d2a91778b16450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maur=C3=ADcio=20Szabo?= Date: Tue, 1 Aug 2023 15:14:31 -0300 Subject: [PATCH 4/5] Fixing some openssl on newer node --- binding.gyp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/binding.gyp b/binding.gyp index 9bf2936..ed2517a 100644 --- a/binding.gyp +++ b/binding.gyp @@ -14,6 +14,9 @@ "src", ' Date: Tue, 1 Aug 2023 15:17:26 -0300 Subject: [PATCH 5/5] Putting variable on the right place :D --- binding.gyp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/binding.gyp b/binding.gyp index ed2517a..d4ed274 100644 --- a/binding.gyp +++ b/binding.gyp @@ -14,9 +14,6 @@ "src", '