From 2212222c479703db5400b480c48e28b346727729 Mon Sep 17 00:00:00 2001 From: Kevin Sawicki Date: Mon, 11 Mar 2013 11:22:36 -0700 Subject: [PATCH] Use underscore node module --- benchmark/benchmark-helper.coffee | 3 +- benchmark/benchmark-suite.coffee | 2 +- package.json | 3 +- spec/app/buffer-spec.coffee | 2 +- spec/app/display-buffer-spec.coffee | 2 +- spec/app/editor-spec.coffee | 2 +- spec/app/event-emitter-spec.coffee | 4 +- spec/app/grammar-view-spec.coffee | 2 +- spec/app/pane-container-spec.coffee | 2 +- spec/app/project-spec.coffee | 2 +- spec/app/text-mate-grammar-spec.coffee | 2 +- spec/app/tokenized-buffer-spec.coffee | 2 +- spec/atom-reporter.coffee | 2 +- spec/spec-helper.coffee | 2 +- spec/stdlib/underscore-extensions-spec.coffee | 2 +- spec/time-reporter.coffee | 2 +- src/app/atom-package.coffee | 2 +- src/app/atom.coffee | 2 +- src/app/binding-set.coffee | 2 +- src/app/buffer-change-operation.coffee | 2 +- src/app/buffer-marker.coffee | 2 +- src/app/buffer.coffee | 2 +- src/app/config.coffee | 2 +- src/app/cursor-view.coffee | 2 +- src/app/cursor.coffee | 2 +- src/app/directory.coffee | 2 +- src/app/display-buffer-marker.coffee | 2 +- src/app/display-buffer.coffee | 2 +- src/app/edit-session.coffee | 2 +- src/app/editor.coffee | 2 +- src/app/event-emitter.coffee | 2 +- src/app/file.coffee | 2 +- src/app/git.coffee | 2 +- src/app/keymap.coffee | 2 +- src/app/language-mode.coffee | 2 +- src/app/pane-column.coffee | 2 +- src/app/pane-row.coffee | 2 +- src/app/pane.coffee | 2 +- src/app/project.coffee | 2 +- src/app/range.coffee | 2 +- src/app/repository-status-task.coffee | 2 +- src/app/root-view.coffee | 2 +- src/app/screen-line.coffee | 2 +- src/app/selection.coffee | 2 +- src/app/syntax.coffee | 2 +- src/app/text-mate-grammar.coffee | 2 +- src/app/text-mate-package.coffee | 2 +- src/app/text-mate-theme.coffee | 2 +- src/app/token.coffee | 2 +- src/app/tokenized-buffer.coffee | 2 +- src/app/undo-manager.coffee | 2 +- .../lib/bracket-matcher.coffee | 2 +- .../lib/command-logger-view.coffee | 2 +- .../lib/command-palette-view.coffee | 2 +- .../spec/command-palette-spec.coffee | 2 +- .../lib/command-panel-view.coffee | 2 +- .../lib/commands/composite-command.coffee | 2 +- .../command-panel/lib/preview-list.coffee | 2 +- .../spec/command-interpreter-spec.coffee | 2 +- .../spec/command-panel-spec.coffee | 2 +- .../editor-stats/lib/editor-stats-view.coffee | 2 +- .../spec/editor-stats-spec.coffee | 2 +- .../fuzzy-finder/lib/fuzzy-finder-view.coffee | 2 +- .../fuzzy-finder/lib/fuzzy-finder.coffee | 2 +- .../lib/load-paths-handler.coffee | 2 +- .../spec/fuzzy-finder-spec.coffee | 2 +- .../spec/markdown-preview-spec.coffee | 2 +- .../lib/package-generator-view.coffee | 2 +- .../snippets/lib/snippet-expansion.coffee | 2 +- src/packages/snippets/lib/snippet.coffee | 2 +- src/packages/snippets/lib/snippets.coffee | 2 +- .../snippets/spec/snippets-spec.coffee | 2 +- .../spell-check/lib/spell-check-view.coffee | 2 +- .../status-bar/lib/status-bar-view.coffee | 2 +- .../status-bar/spec/status-bar-spec.coffee | 2 +- src/packages/tabs/lib/tab-bar-view.coffee | 2 +- src/packages/tabs/spec/tabs-spec.coffee | 2 +- src/packages/tree-view/lib/tree-view.coffee | 2 +- .../tree-view/spec/tree-view-spec.coffee | 2 +- .../wrap-guide/lib/wrap-guide-view.coffee | 2 +- src/stdlib/cson.coffee | 2 +- src/stdlib/event.coffee | 2 +- src/stdlib/fs.coffee | 2 +- src/stdlib/jquery-extensions.coffee | 2 +- src/stdlib/path.coffee | 2 +- src/stdlib/space-pen-extensions.coffee | 2 +- src/stdlib/task.coffee | 2 +- src/stdlib/underscore-extensions.coffee | 2 +- vendor/underscore.js | 964 ------------------ 89 files changed, 89 insertions(+), 1055 deletions(-) delete mode 100644 vendor/underscore.js diff --git a/benchmark/benchmark-helper.coffee b/benchmark/benchmark-helper.coffee index dff4cee35..bfe5ba06e 100644 --- a/benchmark/benchmark-helper.coffee +++ b/benchmark/benchmark-helper.coffee @@ -1,6 +1,6 @@ nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' Keymap = require 'keymap' Point = require 'point' Config = require 'config' @@ -127,4 +127,3 @@ $.fn.textInput = (data) -> event = document.createEvent 'TextEvent' event.initTextEvent('textInput', true, true, window, data) this.each -> this.dispatchEvent(event) - diff --git a/benchmark/benchmark-suite.coffee b/benchmark/benchmark-suite.coffee index c0d142a6d..b2ff4bdfc 100644 --- a/benchmark/benchmark-suite.coffee +++ b/benchmark/benchmark-suite.coffee @@ -1,7 +1,7 @@ require 'benchmark-helper' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' TokenizedBuffer = require 'tokenized-buffer' describe "editor.", -> diff --git a/package.json b/package.json index acee00c34..8dae9dcb0 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,8 @@ "ctags": "0.1.0", "oniguruma": "0.5.0", "mkdirp": "0.3.5", - "git-utils": "0.3.0" + "git-utils": "0.3.0", + "underscore": "1.3.3" }, "scripts": { diff --git a/spec/app/buffer-spec.coffee b/spec/app/buffer-spec.coffee index 84b58ddeb..77253422f 100644 --- a/spec/app/buffer-spec.coffee +++ b/spec/app/buffer-spec.coffee @@ -1,7 +1,7 @@ Project = require 'project' Buffer = require 'buffer' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe 'Buffer', -> [filePath, fileContents, buffer] = [] diff --git a/spec/app/display-buffer-spec.coffee b/spec/app/display-buffer-spec.coffee index 2381d76e2..11b177235 100644 --- a/spec/app/display-buffer-spec.coffee +++ b/spec/app/display-buffer-spec.coffee @@ -1,6 +1,6 @@ DisplayBuffer = require 'display-buffer' Buffer = require 'buffer' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "DisplayBuffer", -> [editSession, displayBuffer, buffer, changeHandler, tabLength] = [] diff --git a/spec/app/editor-spec.coffee b/spec/app/editor-spec.coffee index 04e6c9b57..da885955e 100644 --- a/spec/app/editor-spec.coffee +++ b/spec/app/editor-spec.coffee @@ -5,7 +5,7 @@ Range = require 'range' Project = require 'project' $ = require 'jquery' {$$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' describe "Editor", -> diff --git a/spec/app/event-emitter-spec.coffee b/spec/app/event-emitter-spec.coffee index dd02fdaa3..a8ff230f7 100644 --- a/spec/app/event-emitter-spec.coffee +++ b/spec/app/event-emitter-spec.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' describe "EventEmitter mixin", -> @@ -167,5 +167,3 @@ describe "EventEmitter mixin", -> object.off 'foo' expect(object.subscriptionCount()).toBe 2 - - diff --git a/spec/app/grammar-view-spec.coffee b/spec/app/grammar-view-spec.coffee index 45157aab0..548a30d22 100644 --- a/spec/app/grammar-view-spec.coffee +++ b/spec/app/grammar-view-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' GrammarView = require 'grammar-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "GrammarView", -> [editor, textGrammar, jsGrammar] = [] diff --git a/spec/app/pane-container-spec.coffee b/spec/app/pane-container-spec.coffee index 56ea53336..05b76f09b 100644 --- a/spec/app/pane-container-spec.coffee +++ b/spec/app/pane-container-spec.coffee @@ -1,7 +1,7 @@ PaneContainer = require 'pane-container' Pane = require 'pane' {View, $$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' describe "PaneContainer", -> diff --git a/spec/app/project-spec.coffee b/spec/app/project-spec.coffee index e12a4f093..278c00f5f 100644 --- a/spec/app/project-spec.coffee +++ b/spec/app/project-spec.coffee @@ -1,6 +1,6 @@ Project = require 'project' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' BufferedProcess = require 'buffered-process' describe "Project", -> diff --git a/spec/app/text-mate-grammar-spec.coffee b/spec/app/text-mate-grammar-spec.coffee index 07d06ca02..e727f0382 100644 --- a/spec/app/text-mate-grammar-spec.coffee +++ b/spec/app/text-mate-grammar-spec.coffee @@ -2,7 +2,7 @@ TextMateGrammar = require 'text-mate-grammar' TextMatePackage = require 'text-mate-package' plist = require 'plist' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "TextMateGrammar", -> grammar = null diff --git a/spec/app/tokenized-buffer-spec.coffee b/spec/app/tokenized-buffer-spec.coffee index 86bd50520..3fb102d75 100644 --- a/spec/app/tokenized-buffer-spec.coffee +++ b/spec/app/tokenized-buffer-spec.coffee @@ -2,7 +2,7 @@ TokenizedBuffer = require 'tokenized-buffer' LanguageMode = require 'language-mode' Buffer = require 'buffer' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "TokenizedBuffer", -> [editSession, tokenizedBuffer, buffer, changeHandler] = [] diff --git a/spec/atom-reporter.coffee b/spec/atom-reporter.coffee index c02035cc8..f8b7714c5 100644 --- a/spec/atom-reporter.coffee +++ b/spec/atom-reporter.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' {View, $$} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class AtomReporter extends View diff --git a/spec/spec-helper.coffee b/spec/spec-helper.coffee index 4632db296..5f19f9264 100644 --- a/spec/spec-helper.coffee +++ b/spec/spec-helper.coffee @@ -3,7 +3,7 @@ window.setUpEnvironment() nakedLoad 'jasmine-jquery' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' Keymap = require 'keymap' Config = require 'config' Point = require 'point' diff --git a/spec/stdlib/underscore-extensions-spec.coffee b/spec/stdlib/underscore-extensions-spec.coffee index 5ae310cde..eed055ced 100644 --- a/spec/stdlib/underscore-extensions-spec.coffee +++ b/spec/stdlib/underscore-extensions-spec.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "underscore extensions", -> describe "_.adviseBefore", -> diff --git a/spec/time-reporter.coffee b/spec/time-reporter.coffee index 7004072ef..1862103e5 100644 --- a/spec/time-reporter.coffee +++ b/spec/time-reporter.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class TimeReporter extends jasmine.Reporter diff --git a/src/app/atom-package.coffee b/src/app/atom-package.coffee index 4c3195b0e..8bd99562e 100644 --- a/src/app/atom-package.coffee +++ b/src/app/atom-package.coffee @@ -1,6 +1,6 @@ Package = require 'package' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/app/atom.coffee b/src/app/atom.coffee index 2e4635c18..eb00a399a 100644 --- a/src/app/atom.coffee +++ b/src/app/atom.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' Package = require 'package' TextMatePackage = require 'text-mate-package' Theme = require 'theme' diff --git a/src/app/binding-set.coffee b/src/app/binding-set.coffee index 168de6bbe..318e91c36 100644 --- a/src/app/binding-set.coffee +++ b/src/app/binding-set.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Specificity = require 'specificity' diff --git a/src/app/buffer-change-operation.coffee b/src/app/buffer-change-operation.coffee index cbbf68b0a..c70180914 100644 --- a/src/app/buffer-change-operation.coffee +++ b/src/app/buffer-change-operation.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class BufferChangeOperation diff --git a/src/app/buffer-marker.coffee b/src/app/buffer-marker.coffee index 199171595..d315120c1 100644 --- a/src/app/buffer-marker.coffee +++ b/src/app/buffer-marker.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' diff --git a/src/app/buffer.coffee b/src/app/buffer.coffee index 00d0483e4..9c16f3eb8 100644 --- a/src/app/buffer.coffee +++ b/src/app/buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' File = require 'file' Point = require 'point' diff --git a/src/app/config.coffee b/src/app/config.coffee index 2940b33f4..d01180a3f 100644 --- a/src/app/config.coffee +++ b/src/app/config.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' configDirPath = fs.absolute("~/.atom") diff --git a/src/app/cursor-view.coffee b/src/app/cursor-view.coffee index 03fae93de..755229a0a 100644 --- a/src/app/cursor-view.coffee +++ b/src/app/cursor-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' Point = require 'point' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CursorView extends View diff --git a/src/app/cursor.coffee b/src/app/cursor.coffee index 5708d4bf7..22d492f01 100644 --- a/src/app/cursor.coffee +++ b/src/app/cursor.coffee @@ -1,7 +1,7 @@ Point = require 'point' Range = require 'range' EventEmitter = require 'event-emitter' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Cursor diff --git a/src/app/directory.coffee b/src/app/directory.coffee index 808e839e7..f2daa21f3 100644 --- a/src/app/directory.coffee +++ b/src/app/directory.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' File = require 'file' EventEmitter = require 'event-emitter' diff --git a/src/app/display-buffer-marker.coffee b/src/app/display-buffer-marker.coffee index c8ed1648a..c8cf38c16 100644 --- a/src/app/display-buffer-marker.coffee +++ b/src/app/display-buffer-marker.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/app/display-buffer.coffee b/src/app/display-buffer.coffee index 0f24a235d..9b9d307f7 100644 --- a/src/app/display-buffer.coffee +++ b/src/app/display-buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' TokenizedBuffer = require 'tokenized-buffer' LineMap = require 'line-map' Point = require 'point' diff --git a/src/app/edit-session.coffee b/src/app/edit-session.coffee index 0104a297f..1a158dad7 100644 --- a/src/app/edit-session.coffee +++ b/src/app/edit-session.coffee @@ -7,7 +7,7 @@ Selection = require 'selection' EventEmitter = require 'event-emitter' Subscriber = require 'subscriber' Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' module.exports = diff --git a/src/app/editor.coffee b/src/app/editor.coffee index 1e2c0b464..a8c2992f5 100644 --- a/src/app/editor.coffee +++ b/src/app/editor.coffee @@ -8,7 +8,7 @@ CursorView = require 'cursor-view' SelectionView = require 'selection-view' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Editor extends View diff --git a/src/app/event-emitter.coffee b/src/app/event-emitter.coffee index 3abcb74ac..bdcce5529 100644 --- a/src/app/event-emitter.coffee +++ b/src/app/event-emitter.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = on: (eventName, handler) -> diff --git a/src/app/file.coffee b/src/app/file.coffee index 9edde198f..7f203af71 100644 --- a/src/app/file.coffee +++ b/src/app/file.coffee @@ -1,7 +1,7 @@ EventEmitter = require 'event-emitter' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class File diff --git a/src/app/git.coffee b/src/app/git.coffee index bf66d65bb..f824406e8 100644 --- a/src/app/git.coffee +++ b/src/app/git.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Subscriber = require 'subscriber' EventEmitter = require 'event-emitter' diff --git a/src/app/keymap.coffee b/src/app/keymap.coffee index 695e733d1..b3d45872d 100644 --- a/src/app/keymap.coffee +++ b/src/app/keymap.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' BindingSet = require 'binding-set' diff --git a/src/app/language-mode.coffee b/src/app/language-mode.coffee index 80fcc301d..d88f78bd7 100644 --- a/src/app/language-mode.coffee +++ b/src/app/language-mode.coffee @@ -1,5 +1,5 @@ Range = require 'range' -_ = require 'underscore' +_ = nodeRequire 'underscore' require 'underscore-extensions' {OnigRegExp} = nodeRequire 'oniguruma' diff --git a/src/app/pane-column.coffee b/src/app/pane-column.coffee index 43ba40cbb..d603837e8 100644 --- a/src/app/pane-column.coffee +++ b/src/app/pane-column.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane-row.coffee b/src/app/pane-row.coffee index ce7a09f82..76b49a7d6 100644 --- a/src/app/pane-row.coffee +++ b/src/app/pane-row.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneAxis = require 'pane-axis' module.exports = diff --git a/src/app/pane.coffee b/src/app/pane.coffee index ef29ce72f..414507b2b 100644 --- a/src/app/pane.coffee +++ b/src/app/pane.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' PaneRow = require 'pane-row' PaneColumn = require 'pane-column' diff --git a/src/app/project.coffee b/src/app/project.coffee index 45dbdb104..766f25952 100644 --- a/src/app/project.coffee +++ b/src/app/project.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' Range = require 'range' Buffer = require 'buffer' diff --git a/src/app/range.coffee b/src/app/range.coffee index a3870ea66..e5a2bf39a 100644 --- a/src/app/range.coffee +++ b/src/app/range.coffee @@ -1,5 +1,5 @@ Point = require 'point' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Range diff --git a/src/app/repository-status-task.coffee b/src/app/repository-status-task.coffee index 0e5f746a5..020654d0d 100644 --- a/src/app/repository-status-task.coffee +++ b/src/app/repository-status-task.coffee @@ -1,5 +1,5 @@ Task = require 'task' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class RepositoryStatusTask extends Task diff --git a/src/app/root-view.coffee b/src/app/root-view.coffee index 2d3b8fa83..0ab323fae 100644 --- a/src/app/root-view.coffee +++ b/src/app/root-view.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' {$$} = require 'space-pen' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' {View} = require 'space-pen' Buffer = require 'buffer' diff --git a/src/app/screen-line.coffee b/src/app/screen-line.coffee index 739d23eff..5574542c3 100644 --- a/src/app/screen-line.coffee +++ b/src/app/screen-line.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class ScreenLine diff --git a/src/app/selection.coffee b/src/app/selection.coffee index 9377498a2..e5e3a115a 100644 --- a/src/app/selection.coffee +++ b/src/app/selection.coffee @@ -1,6 +1,6 @@ Range = require 'range' EventEmitter = require 'event-emitter' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Selection diff --git a/src/app/syntax.coffee b/src/app/syntax.coffee index 9c176fefe..f6ef7ccca 100644 --- a/src/app/syntax.coffee +++ b/src/app/syntax.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' jQuery = require 'jquery' Specificity = require 'specificity' {$$} = require 'space-pen' diff --git a/src/app/text-mate-grammar.coffee b/src/app/text-mate-grammar.coffee index 9a9a78178..712b3e2ad 100644 --- a/src/app/text-mate-grammar.coffee +++ b/src/app/text-mate-grammar.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' plist = require 'plist' Token = require 'token' diff --git a/src/app/text-mate-package.coffee b/src/app/text-mate-package.coffee index c4901cc02..2c430de99 100644 --- a/src/app/text-mate-package.coffee +++ b/src/app/text-mate-package.coffee @@ -1,7 +1,7 @@ Package = require 'package' fs = require 'fs' plist = require 'plist' -_ = require 'underscore' +_ = nodeRequire 'underscore' TextMateGrammar = require 'text-mate-grammar' module.exports = diff --git a/src/app/text-mate-theme.coffee b/src/app/text-mate-theme.coffee index f2c1d1f92..0d56b6e93 100644 --- a/src/app/text-mate-theme.coffee +++ b/src/app/text-mate-theme.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' plist = require 'plist' Theme = require 'theme' diff --git a/src/app/token.coffee b/src/app/token.coffee index 9c3d50ed8..20d1b5efa 100644 --- a/src/app/token.coffee +++ b/src/app/token.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Token diff --git a/src/app/tokenized-buffer.coffee b/src/app/tokenized-buffer.coffee index 70e982e28..0ef4ea2c0 100644 --- a/src/app/tokenized-buffer.coffee +++ b/src/app/tokenized-buffer.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' ScreenLine = require 'screen-line' EventEmitter = require 'event-emitter' Token = require 'token' diff --git a/src/app/undo-manager.coffee b/src/app/undo-manager.coffee index fc5b73e00..3f4025740 100644 --- a/src/app/undo-manager.coffee +++ b/src/app/undo-manager.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = diff --git a/src/packages/bracket-matcher/lib/bracket-matcher.coffee b/src/packages/bracket-matcher/lib/bracket-matcher.coffee index 52ad5aa50..44dc1998b 100644 --- a/src/packages/bracket-matcher/lib/bracket-matcher.coffee +++ b/src/packages/bracket-matcher/lib/bracket-matcher.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {$$} = require 'space-pen' Range = require 'range' diff --git a/src/packages/command-logger/lib/command-logger-view.coffee b/src/packages/command-logger/lib/command-logger-view.coffee index 584c01d5a..510f8f2f9 100644 --- a/src/packages/command-logger/lib/command-logger-view.coffee +++ b/src/packages/command-logger/lib/command-logger-view.coffee @@ -1,6 +1,6 @@ {$$$} = require 'space-pen' ScrollView = require 'scroll-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandLoggerView extends ScrollView diff --git a/src/packages/command-palette/lib/command-palette-view.coffee b/src/packages/command-palette/lib/command-palette-view.coffee index 2acb80753..717118041 100644 --- a/src/packages/command-palette/lib/command-palette-view.coffee +++ b/src/packages/command-palette/lib/command-palette-view.coffee @@ -1,7 +1,7 @@ {$$} = require 'space-pen' SelectList = require 'select-list' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandPaletteView extends SelectList diff --git a/src/packages/command-palette/spec/command-palette-spec.coffee b/src/packages/command-palette/spec/command-palette-spec.coffee index 414c53996..780ad33b3 100644 --- a/src/packages/command-palette/spec/command-palette-spec.coffee +++ b/src/packages/command-palette/spec/command-palette-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' CommandPalette = require 'command-palette/lib/command-palette-view' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandPalette", -> [palette] = [] diff --git a/src/packages/command-panel/lib/command-panel-view.coffee b/src/packages/command-panel/lib/command-panel-view.coffee index 2430c7ae0..72c2b95e6 100644 --- a/src/packages/command-panel/lib/command-panel-view.coffee +++ b/src/packages/command-panel/lib/command-panel-view.coffee @@ -5,7 +5,7 @@ CompositeCommand = require './commands/composite-command' PreviewList = require './preview-list' Editor = require 'editor' {SyntaxError} = require('pegjs').parser -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class CommandPanelView extends View diff --git a/src/packages/command-panel/lib/commands/composite-command.coffee b/src/packages/command-panel/lib/commands/composite-command.coffee index cc5485b4a..7c6648bce 100644 --- a/src/packages/command-panel/lib/commands/composite-command.coffee +++ b/src/packages/command-panel/lib/commands/composite-command.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/command-panel/lib/preview-list.coffee b/src/packages/command-panel/lib/preview-list.coffee index 5430d7ae9..6d7629128 100644 --- a/src/packages/command-panel/lib/preview-list.coffee +++ b/src/packages/command-panel/lib/preview-list.coffee @@ -1,6 +1,6 @@ $ = require 'jquery' ScrollView = require 'scroll-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' PathView = require './path-view' OperationView = require './operation-view' diff --git a/src/packages/command-panel/spec/command-interpreter-spec.coffee b/src/packages/command-panel/spec/command-interpreter-spec.coffee index c4602b59f..9d6b0c1c1 100644 --- a/src/packages/command-panel/spec/command-interpreter-spec.coffee +++ b/src/packages/command-panel/spec/command-interpreter-spec.coffee @@ -3,7 +3,7 @@ Project = require 'project' Buffer = require 'buffer' EditSession = require 'edit-session' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandInterpreter", -> [interpreter, editSession, buffer] = [] diff --git a/src/packages/command-panel/spec/command-panel-spec.coffee b/src/packages/command-panel/spec/command-panel-spec.coffee index 213d14191..d5f087c1a 100644 --- a/src/packages/command-panel/spec/command-panel-spec.coffee +++ b/src/packages/command-panel/spec/command-panel-spec.coffee @@ -1,6 +1,6 @@ RootView = require 'root-view' CommandPanelView = require 'command-panel/lib/command-panel-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "CommandPanel", -> [editSession, buffer, commandPanel] = [] diff --git a/src/packages/editor-stats/lib/editor-stats-view.coffee b/src/packages/editor-stats/lib/editor-stats-view.coffee index c86ab18d8..850364c36 100644 --- a/src/packages/editor-stats/lib/editor-stats-view.coffee +++ b/src/packages/editor-stats/lib/editor-stats-view.coffee @@ -1,6 +1,6 @@ ScrollView = require 'scroll-view' d3 = require 'd3.v3' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' module.exports = diff --git a/src/packages/editor-stats/spec/editor-stats-spec.coffee b/src/packages/editor-stats/spec/editor-stats-spec.coffee index 5d8708e42..d8f372365 100644 --- a/src/packages/editor-stats/spec/editor-stats-spec.coffee +++ b/src/packages/editor-stats/spec/editor-stats-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' EditorStats = require 'editor-stats/lib/editor-stats-view' diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee index d12f6f29a..013d4b344 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder-view.coffee @@ -1,6 +1,6 @@ {View, $$} = require 'space-pen' SelectList = require 'select-list' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' fs = require 'fs' LoadPathsTask = require './load-paths-task' diff --git a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee index c6fbe92aa..e3fcf839c 100644 --- a/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee +++ b/src/packages/fuzzy-finder/lib/fuzzy-finder.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = projectPaths: null diff --git a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee index 9ef442c99..783b93d35 100644 --- a/src/packages/fuzzy-finder/lib/load-paths-handler.coffee +++ b/src/packages/fuzzy-finder/lib/load-paths-handler.coffee @@ -1,5 +1,5 @@ fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = loadPaths: (rootPath, ignoredNames, excludeGitIgnoredPaths) -> diff --git a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee index ffaae8cb0..0f9b04e64 100644 --- a/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee +++ b/src/packages/fuzzy-finder/spec/fuzzy-finder-spec.coffee @@ -1,7 +1,7 @@ RootView = require 'root-view' FuzzyFinder = require 'fuzzy-finder/lib/fuzzy-finder-view' LoadPathsTask = require 'fuzzy-finder/lib/load-paths-task' -_ = require 'underscore' +_ = nodeRequire 'underscore' $ = require 'jquery' {$$} = require 'space-pen' fs = require 'fs' diff --git a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee index 7704768ee..4941e36d6 100644 --- a/src/packages/markdown-preview/spec/markdown-preview-spec.coffee +++ b/src/packages/markdown-preview/spec/markdown-preview-spec.coffee @@ -1,7 +1,7 @@ $ = require 'jquery' RootView = require 'root-view' MarkdownPreview = require 'markdown-preview/lib/markdown-preview-view' -_ = require 'underscore' +_ = nodeRequire 'underscore' describe "MarkdownPreview", -> beforeEach -> diff --git a/src/packages/package-generator/lib/package-generator-view.coffee b/src/packages/package-generator/lib/package-generator-view.coffee index d1ca900cc..95d17b2e6 100644 --- a/src/packages/package-generator/lib/package-generator-view.coffee +++ b/src/packages/package-generator/lib/package-generator-view.coffee @@ -1,7 +1,7 @@ {View} = require 'space-pen' Editor = require 'editor' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' module.exports = diff --git a/src/packages/snippets/lib/snippet-expansion.coffee b/src/packages/snippets/lib/snippet-expansion.coffee index 7c27222b8..7d0ffdc76 100644 --- a/src/packages/snippets/lib/snippet-expansion.coffee +++ b/src/packages/snippets/lib/snippet-expansion.coffee @@ -1,5 +1,5 @@ Subscriber = require 'subscriber' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class SnippetExpansion diff --git a/src/packages/snippets/lib/snippet.coffee b/src/packages/snippets/lib/snippet.coffee index 6e0069862..6d484fef6 100644 --- a/src/packages/snippets/lib/snippet.coffee +++ b/src/packages/snippets/lib/snippet.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' Range = require 'range' module.exports = diff --git a/src/packages/snippets/lib/snippets.coffee b/src/packages/snippets/lib/snippets.coffee index cd8e279d9..74e02cae9 100644 --- a/src/packages/snippets/lib/snippets.coffee +++ b/src/packages/snippets/lib/snippets.coffee @@ -1,6 +1,6 @@ AtomPackage = require 'atom-package' fs = require 'fs' -_ = require 'underscore' +_ = nodeRequire 'underscore' SnippetExpansion = require './snippet-expansion' Snippet = require './snippet' LoadSnippetsTask = require './load-snippets-task' diff --git a/src/packages/snippets/spec/snippets-spec.coffee b/src/packages/snippets/spec/snippets-spec.coffee index b77b2d80b..b7150791c 100644 --- a/src/packages/snippets/spec/snippets-spec.coffee +++ b/src/packages/snippets/spec/snippets-spec.coffee @@ -3,7 +3,7 @@ LoadSnippetsTask = require 'snippets/lib/load-snippets-task' RootView = require 'root-view' Buffer = require 'buffer' Editor = require 'editor' -_ = require 'underscore' +_ = nodeRequire 'underscore' fs = require 'fs' Package = require 'package' diff --git a/src/packages/spell-check/lib/spell-check-view.coffee b/src/packages/spell-check/lib/spell-check-view.coffee index 323d0e873..37ad954ec 100644 --- a/src/packages/spell-check/lib/spell-check-view.coffee +++ b/src/packages/spell-check/lib/spell-check-view.coffee @@ -1,5 +1,5 @@ {View} = require 'space-pen' -_ = require 'underscore' +_ = nodeRequire 'underscore' SpellCheckTask = require './spell-check-task' MisspellingView = require './misspelling-view' diff --git a/src/packages/status-bar/lib/status-bar-view.coffee b/src/packages/status-bar/lib/status-bar-view.coffee index f58d4dba0..a3d6723c0 100644 --- a/src/packages/status-bar/lib/status-bar-view.coffee +++ b/src/packages/status-bar/lib/status-bar-view.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {View, $$} = require 'space-pen' $ = require 'jquery' diff --git a/src/packages/status-bar/spec/status-bar-spec.coffee b/src/packages/status-bar/spec/status-bar-spec.coffee index f7a88cf4d..5d45a5097 100644 --- a/src/packages/status-bar/spec/status-bar-spec.coffee +++ b/src/packages/status-bar/spec/status-bar-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' StatusBar = require 'status-bar/lib/status-bar-view' fs = require 'fs' diff --git a/src/packages/tabs/lib/tab-bar-view.coffee b/src/packages/tabs/lib/tab-bar-view.coffee index fbbab1330..37e830071 100644 --- a/src/packages/tabs/lib/tab-bar-view.coffee +++ b/src/packages/tabs/lib/tab-bar-view.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' SortableList = require 'sortable-list' TabView = require './tab-view' diff --git a/src/packages/tabs/spec/tabs-spec.coffee b/src/packages/tabs/spec/tabs-spec.coffee index d8d32e390..41c012c2e 100644 --- a/src/packages/tabs/spec/tabs-spec.coffee +++ b/src/packages/tabs/spec/tabs-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' RootView = require 'root-view' Pane = require 'pane' PaneContainer = require 'pane-container' diff --git a/src/packages/tree-view/lib/tree-view.coffee b/src/packages/tree-view/lib/tree-view.coffee index fb3da5783..ae125b04c 100644 --- a/src/packages/tree-view/lib/tree-view.coffee +++ b/src/packages/tree-view/lib/tree-view.coffee @@ -6,7 +6,7 @@ FileView = require './file-view' Dialog = require './dialog' fs = require 'fs' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class TreeView extends ScrollView diff --git a/src/packages/tree-view/spec/tree-view-spec.coffee b/src/packages/tree-view/spec/tree-view-spec.coffee index fc2f9fe81..75b0ab070 100644 --- a/src/packages/tree-view/spec/tree-view-spec.coffee +++ b/src/packages/tree-view/spec/tree-view-spec.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' TreeView = require 'tree-view/lib/tree-view' RootView = require 'root-view' Directory = require 'directory' diff --git a/src/packages/wrap-guide/lib/wrap-guide-view.coffee b/src/packages/wrap-guide/lib/wrap-guide-view.coffee index 491e19705..f3f79e978 100644 --- a/src/packages/wrap-guide/lib/wrap-guide-view.coffee +++ b/src/packages/wrap-guide/lib/wrap-guide-view.coffee @@ -1,6 +1,6 @@ {View} = require 'space-pen' $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class WrapGuideView extends View diff --git a/src/stdlib/cson.coffee b/src/stdlib/cson.coffee index 382d8600a..30402be5a 100644 --- a/src/stdlib/cson.coffee +++ b/src/stdlib/cson.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = stringifyIndent: (level=0) -> _.multiplyString(' ', Math.max(level, 0)) diff --git a/src/stdlib/event.coffee b/src/stdlib/event.coffee index adf761d97..902eba4e9 100644 --- a/src/stdlib/event.coffee +++ b/src/stdlib/event.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = class Event diff --git a/src/stdlib/fs.coffee b/src/stdlib/fs.coffee index e5c361e32..542ab016c 100644 --- a/src/stdlib/fs.coffee +++ b/src/stdlib/fs.coffee @@ -1,7 +1,7 @@ # commonjs fs module # http://ringojs.org/api/v0.8/fs/ -_ = require 'underscore' +_ = nodeRequire 'underscore' nodeFs = nodeRequire 'fs' mkdirp = nodeRequire 'mkdirp' diff --git a/src/stdlib/jquery-extensions.coffee b/src/stdlib/jquery-extensions.coffee index 089363577..592d01b03 100644 --- a/src/stdlib/jquery-extensions.coffee +++ b/src/stdlib/jquery-extensions.coffee @@ -1,5 +1,5 @@ $ = require 'jquery' -_ = require 'underscore' +_ = nodeRequire 'underscore' $.fn.scrollBottom = (newValue) -> if newValue? diff --git a/src/stdlib/path.coffee b/src/stdlib/path.coffee index 337b60d6b..2d1d5c41d 100644 --- a/src/stdlib/path.coffee +++ b/src/stdlib/path.coffee @@ -1,7 +1,7 @@ # node.js path module # http://nodejs.org/docs/v0.6.0/api/path.html -_ = require 'underscore' +_ = nodeRequire 'underscore' module.exports = # Return the last portion of a path. Similar to the Unix basename command. diff --git a/src/stdlib/space-pen-extensions.coffee b/src/stdlib/space-pen-extensions.coffee index 37443ab03..819b4f15e 100644 --- a/src/stdlib/space-pen-extensions.coffee +++ b/src/stdlib/space-pen-extensions.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' {View} = require 'space-pen' jQuery = require 'jquery' ConfigObserver = require 'config-observer' diff --git a/src/stdlib/task.coffee b/src/stdlib/task.coffee index eb3e2f3f5..4e2873a0d 100644 --- a/src/stdlib/task.coffee +++ b/src/stdlib/task.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' EventEmitter = require 'event-emitter' module.exports = diff --git a/src/stdlib/underscore-extensions.coffee b/src/stdlib/underscore-extensions.coffee index df5865b24..7aecba5b8 100644 --- a/src/stdlib/underscore-extensions.coffee +++ b/src/stdlib/underscore-extensions.coffee @@ -1,4 +1,4 @@ -_ = require 'underscore' +_ = nodeRequire 'underscore' _.mixin remove: (array, element) -> diff --git a/vendor/underscore.js b/vendor/underscore.js deleted file mode 100644 index 60cf14611..000000000 --- a/vendor/underscore.js +++ /dev/null @@ -1,964 +0,0 @@ -// Underscore.js 1.2.2 -// (c) 2011 Jeremy Ashkenas, DocumentCloud Inc. -// Underscore is freely distributable under the MIT license. -// Portions of Underscore are inspired or borrowed from Prototype, -// Oliver Steele's Functional, and John Resig's Micro-Templating. -// For all details and documentation: -// http://documentcloud.github.com/underscore - -(function() { - - // Baseline setup - // -------------- - - // Establish the root object, `window` in the browser, or `global` on the server. - var root = this; - - // Save the previous value of the `_` variable. - var previousUnderscore = root._; - - // Establish the object that gets returned to break out of a loop iteration. - var breaker = {}; - - // Save bytes in the minified (but not gzipped) version: - var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; - - // Create quick reference variables for speed access to core prototypes. - var slice = ArrayProto.slice, - unshift = ArrayProto.unshift, - toString = ObjProto.toString, - hasOwnProperty = ObjProto.hasOwnProperty; - - // All **ECMAScript 5** native function implementations that we hope to use - // are declared here. - var - nativeForEach = ArrayProto.forEach, - nativeMap = ArrayProto.map, - nativeReduce = ArrayProto.reduce, - nativeReduceRight = ArrayProto.reduceRight, - nativeFilter = ArrayProto.filter, - nativeEvery = ArrayProto.every, - nativeSome = ArrayProto.some, - nativeIndexOf = ArrayProto.indexOf, - nativeLastIndexOf = ArrayProto.lastIndexOf, - nativeIsArray = Array.isArray, - nativeKeys = Object.keys, - nativeBind = FuncProto.bind; - - // Create a safe reference to the Underscore object for use below. - var _ = function(obj) { return new wrapper(obj); }; - - // Export the Underscore object for **Node.js** and **"CommonJS"**, with - // backwards-compatibility for the old `require()` API. If we're not in - // CommonJS, add `_` to the global object. - module.exports = _; - - // Current version. - _.VERSION = '1.2.2'; - - // Collection Functions - // -------------------- - - // The cornerstone, an `each` implementation, aka `forEach`. - // Handles objects with the built-in `forEach`, arrays, and raw objects. - // Delegates to **ECMAScript 5**'s native `forEach` if available. - var each = _.each = _.forEach = function(obj, iterator, context) { - if (obj == null) return; - if (nativeForEach && obj.forEach === nativeForEach) { - obj.forEach(iterator, context); - } else if (obj.length === +obj.length) { - for (var i = 0, l = obj.length; i < l; i++) { - if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; - } - } else { - for (var key in obj) { - if (hasOwnProperty.call(obj, key)) { - if (iterator.call(context, obj[key], key, obj) === breaker) return; - } - } - } - }; - - // Return the results of applying the iterator to each element. - // Delegates to **ECMAScript 5**'s native `map` if available. - _.map = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); - each(obj, function(value, index, list) { - results[results.length] = iterator.call(context, value, index, list); - }); - return results; - }; - - // **Reduce** builds up a single result from a list of values, aka `inject`, - // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. - _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { - var initial = memo !== void 0; - if (obj == null) obj = []; - if (nativeReduce && obj.reduce === nativeReduce) { - if (context) iterator = _.bind(iterator, context); - return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); - } - each(obj, function(value, index, list) { - if (!initial) { - memo = value; - initial = true; - } else { - memo = iterator.call(context, memo, value, index, list); - } - }); - if (!initial) throw new TypeError("Reduce of empty array with no initial value"); - return memo; - }; - - // The right-associative version of reduce, also known as `foldr`. - // Delegates to **ECMAScript 5**'s native `reduceRight` if available. - _.reduceRight = _.foldr = function(obj, iterator, memo, context) { - if (obj == null) obj = []; - if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { - if (context) iterator = _.bind(iterator, context); - return memo !== void 0 ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); - } - var reversed = (_.isArray(obj) ? obj.slice() : _.toArray(obj)).reverse(); - return _.reduce(reversed, iterator, memo, context); - }; - - // Return the first value which passes a truth test. Aliased as `detect`. - _.find = _.detect = function(obj, iterator, context) { - var result; - any(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) { - result = value; - return true; - } - }); - return result; - }; - - // Return all the elements that pass a truth test. - // Delegates to **ECMAScript 5**'s native `filter` if available. - // Aliased as `select`. - _.filter = _.select = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); - each(obj, function(value, index, list) { - if (iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Return all the elements for which a truth test fails. - _.reject = function(obj, iterator, context) { - var results = []; - if (obj == null) return results; - each(obj, function(value, index, list) { - if (!iterator.call(context, value, index, list)) results[results.length] = value; - }); - return results; - }; - - // Determine whether all of the elements match a truth test. - // Delegates to **ECMAScript 5**'s native `every` if available. - // Aliased as `all`. - _.every = _.all = function(obj, iterator, context) { - var result = true; - if (obj == null) return result; - if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); - each(obj, function(value, index, list) { - if (!(result = result && iterator.call(context, value, index, list))) return breaker; - }); - return result; - }; - - // Determine if at least one element in the object matches a truth test. - // Delegates to **ECMAScript 5**'s native `some` if available. - // Aliased as `any`. - var any = _.some = _.any = function(obj, iterator, context) { - iterator = iterator || _.identity; - var result = false; - if (obj == null) return result; - if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); - each(obj, function(value, index, list) { - if (result || (result = iterator.call(context, value, index, list))) return breaker; - }); - return !!result; - }; - - // Determine if a given value is included in the array or object using `===`. - // Aliased as `contains`. - _.include = _.contains = function(obj, target) { - var found = false; - if (obj == null) return found; - if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; - found = any(obj, function(value) { - return value === target; - }); - return found; - }; - - // Invoke a method (with arguments) on every item in a collection. - _.invoke = function(obj, method) { - var args = slice.call(arguments, 2); - return _.map(obj, function(value) { - return (method.call ? method || value : value[method]).apply(value, args); - }); - }; - - // Convenience version of a common use case of `map`: fetching a property. - _.pluck = function(obj, key) { - return _.map(obj, function(value){ return value[key]; }); - }; - - // Return the maximum element or (element-based computation). - _.max = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.max.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return -Infinity; - var result = {computed : -Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed >= result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Return the minimum element (or element-based computation). - _.min = function(obj, iterator, context) { - if (!iterator && _.isArray(obj)) return Math.min.apply(Math, obj); - if (!iterator && _.isEmpty(obj)) return Infinity; - var result = {computed : Infinity}; - each(obj, function(value, index, list) { - var computed = iterator ? iterator.call(context, value, index, list) : value; - computed < result.computed && (result = {value : value, computed : computed}); - }); - return result.value; - }; - - // Shuffle an array. - _.shuffle = function(obj) { - var shuffled = [], rand; - each(obj, function(value, index, list) { - if (index == 0) { - shuffled[0] = value; - } else { - rand = Math.floor(Math.random() * (index + 1)); - shuffled[index] = shuffled[rand]; - shuffled[rand] = value; - } - }); - return shuffled; - }; - - // Sort the object's values by a criterion produced by an iterator. - _.sortBy = function(obj, iterator, context) { - return _.pluck(_.map(obj, function(value, index, list) { - return { - value : value, - criteria : iterator.call(context, value, index, list) - }; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }), 'value'); - }; - - // Groups the object's values by a criterion. Pass either a string attribute - // to group by, or a function that returns the criterion. - _.groupBy = function(obj, val) { - var result = {}; - var iterator = _.isFunction(val) ? val : function(obj) { return obj[val]; }; - each(obj, function(value, index) { - var key = iterator(value, index); - (result[key] || (result[key] = [])).push(value); - }); - return result; - }; - - // Use a comparator function to figure out at what index an object should - // be inserted so as to maintain order. Uses binary search. - _.sortedIndex = function(array, obj, iterator) { - iterator || (iterator = _.identity); - var low = 0, high = array.length; - while (low < high) { - var mid = (low + high) >> 1; - iterator(array[mid]) < iterator(obj) ? low = mid + 1 : high = mid; - } - return low; - }; - - // Safely convert anything iterable into a real, live array. - _.toArray = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) return iterable.toArray(); - if (_.isArray(iterable)) return slice.call(iterable); - if (_.isArguments(iterable)) return slice.call(iterable); - return _.values(iterable); - }; - - // Return the number of elements in an object. - _.size = function(obj) { - return _.toArray(obj).length; - }; - - // Array Functions - // --------------- - - // Get the first element of an array. Passing **n** will return the first N - // values in the array. Aliased as `head`. The **guard** check allows it to work - // with `_.map`. - _.first = _.head = function(array, n, guard) { - return (n != null) && !guard ? slice.call(array, 0, n) : array[0]; - }; - - // Returns everything but the last entry of the array. Especcialy useful on - // the arguments object. Passing **n** will return all the values in - // the array, excluding the last N. The **guard** check allows it to work with - // `_.map`. - _.initial = function(array, n, guard) { - return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); - }; - - // Get the last element of an array. Passing **n** will return the last N - // values in the array. The **guard** check allows it to work with `_.map`. - _.last = function(array, n, guard) { - if ((n != null) && !guard) { - return slice.call(array, Math.max(array.length - n, 0)); - } else { - return array[array.length - 1]; - } - }; - - // Returns everything but the first entry of the array. Aliased as `tail`. - // Especially useful on the arguments object. Passing an **index** will return - // the rest of the values in the array from that index onward. The **guard** - // check allows it to work with `_.map`. - _.rest = _.tail = function(array, index, guard) { - return slice.call(array, (index == null) || guard ? 1 : index); - }; - - // Trim out all falsy values from an array. - _.compact = function(array) { - return _.filter(array, function(value){ return !!value; }); - }; - - // Return a completely flattened version of an array. - _.flatten = function(array, shallow) { - return _.reduce(array, function(memo, value) { - if (_.isArray(value)) return memo.concat(shallow ? value : _.flatten(value)); - memo[memo.length] = value; - return memo; - }, []); - }; - - // Return a version of the array that does not contain the specified value(s). - _.without = function(array) { - return _.difference(array, slice.call(arguments, 1)); - }; - - // Produce a duplicate-free version of the array. If the array has already - // been sorted, you have the option of using a faster algorithm. - // Aliased as `unique`. - _.uniq = _.unique = function(array, isSorted, iterator) { - var initial = iterator ? _.map(array, iterator) : array; - var result = []; - _.reduce(initial, function(memo, el, i) { - if (0 == i || (isSorted === true ? _.last(memo) != el : !_.include(memo, el))) { - memo[memo.length] = el; - result[result.length] = array[i]; - } - return memo; - }, []); - return result; - }; - - // Produce an array that contains the union: each distinct element from all of - // the passed-in arrays. - _.union = function() { - return _.uniq(_.flatten(arguments, true)); - }; - - // Produce an array that contains every item shared between all the - // passed-in arrays. (Aliased as "intersect" for back-compat.) - _.intersection = _.intersect = function(array) { - var rest = slice.call(arguments, 1); - return _.filter(_.uniq(array), function(item) { - return _.every(rest, function(other) { - return _.indexOf(other, item) >= 0; - }); - }); - }; - - // Take the difference between one array and another. - // Only the elements present in just the first array will remain. - _.difference = function(array, other) { - return _.filter(array, function(value){ return !_.include(other, value); }); - }; - - // Zip together multiple lists into a single array -- elements that share - // an index go together. - _.zip = function() { - var args = slice.call(arguments); - var length = _.max(_.pluck(args, 'length')); - var results = new Array(length); - for (var i = 0; i < length; i++) results[i] = _.pluck(args, "" + i); - return results; - }; - - // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), - // we need this function. Return the position of the first occurrence of an - // item in an array, or -1 if the item is not included in the array. - // Delegates to **ECMAScript 5**'s native `indexOf` if available. - // If the array is large and already in sort order, pass `true` - // for **isSorted** to use binary search. - _.indexOf = function(array, item, isSorted) { - if (array == null) return -1; - var i, l; - if (isSorted) { - i = _.sortedIndex(array, item); - return array[i] === item ? i : -1; - } - if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item); - for (i = 0, l = array.length; i < l; i++) if (array[i] === item) return i; - return -1; - }; - - // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. - _.lastIndexOf = function(array, item) { - if (array == null) return -1; - if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) return array.lastIndexOf(item); - var i = array.length; - while (i--) if (array[i] === item) return i; - return -1; - }; - - // Generate an integer Array containing an arithmetic progression. A port of - // the native Python `range()` function. See - // [the Python documentation](http://docs.python.org/library/functions.html#range). - _.range = function(start, stop, step) { - if (arguments.length <= 1) { - stop = start || 0; - start = 0; - } - step = arguments[2] || 1; - - var len = Math.max(Math.ceil((stop - start) / step), 0); - var idx = 0; - var range = new Array(len); - - while(idx < len) { - range[idx++] = start; - start += step; - } - - return range; - }; - - // Function (ahem) Functions - // ------------------ - - // Reusable constructor function for prototype setting. - var ctor = function(){}; - - // Create a function bound to a given object (assigning `this`, and arguments, - // optionally). Binding with arguments is also known as `curry`. - // Delegates to **ECMAScript 5**'s native `Function.bind` if available. - // We check for `func.bind` first, to fail fast when `func` is undefined. - _.bind = function bind(func, context) { - var bound, args; - if (func.bind === nativeBind && nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); - if (!_.isFunction(func)) throw new TypeError; - args = slice.call(arguments, 2); - return bound = function() { - if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); - ctor.prototype = func.prototype; - var self = new ctor; - var result = func.apply(self, args.concat(slice.call(arguments))); - if (Object(result) === result) return result; - return self; - }; - }; - - // Bind all of an object's methods to that object. Useful for ensuring that - // all callbacks defined on an object belong to it. - _.bindAll = function(obj) { - var funcs = slice.call(arguments, 1); - if (funcs.length == 0) funcs = _.functions(obj); - each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); - return obj; - }; - - // Memoize an expensive function by storing its results. - _.memoize = function(func, hasher) { - var memo = {}; - hasher || (hasher = _.identity); - return function() { - var key = hasher.apply(this, arguments); - return hasOwnProperty.call(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); - }; - }; - - // Delays a function for the given number of milliseconds, and then calls - // it with the arguments supplied. - _.delay = function(func, wait) { - var args = slice.call(arguments, 2); - return setTimeout(function(){ return func.apply(func, args); }, wait); - }; - - // Defers a function, scheduling it to run after the current call stack has - // cleared. - _.defer = function(func) { - return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); - }; - - // Returns a function, that, when invoked, will only be triggered at most once - // during a given window of time. - _.throttle = function(func, wait) { - var context, args, timeout, throttling, more; - var whenDone = _.debounce(function(){ more = throttling = false; }, wait); - return function() { - context = this; args = arguments; - var later = function() { - timeout = null; - if (more) func.apply(context, args); - whenDone(); - }; - if (!timeout) timeout = setTimeout(later, wait); - if (throttling) { - more = true; - } else { - func.apply(context, args); - } - whenDone(); - throttling = true; - }; - }; - - // Returns a function, that, as long as it continues to be invoked, will not - // be triggered. The function will be called after it stops being called for - // N milliseconds. - _.debounce = function(func, wait) { - var timeout; - return function() { - var context = this, args = arguments; - var later = function() { - timeout = null; - func.apply(context, args); - }; - clearTimeout(timeout); - timeout = setTimeout(later, wait); - }; - }; - - // Returns a function that will be executed at most one time, no matter how - // often you call it. Useful for lazy initialization. - _.once = function(func) { - var ran = false, memo; - return function() { - if (ran) return memo; - ran = true; - return memo = func.apply(this, arguments); - }; - }; - - // Returns the first function passed as an argument to the second, - // allowing you to adjust arguments, run code before and after, and - // conditionally execute the original function. - _.wrap = function(func, wrapper) { - return function() { - var args = [func].concat(slice.call(arguments)); - return wrapper.apply(this, args); - }; - }; - - // Returns a function that is the composition of a list of functions, each - // consuming the return value of the function that follows. - _.compose = function() { - var funcs = slice.call(arguments); - return function() { - var args = slice.call(arguments); - for (var i = funcs.length - 1; i >= 0; i--) { - args = [funcs[i].apply(this, args)]; - } - return args[0]; - }; - }; - - // Returns a function that will only be executed after being called N times. - _.after = function(times, func) { - if (times <= 0) return func(); - return function() { - if (--times < 1) { return func.apply(this, arguments); } - }; - }; - - // Object Functions - // ---------------- - - // Retrieve the names of an object's properties. - // Delegates to **ECMAScript 5**'s native `Object.keys` - _.keys = nativeKeys || function(obj) { - if (obj !== Object(obj)) throw new TypeError('Invalid object'); - var keys = []; - for (var key in obj) if (hasOwnProperty.call(obj, key)) keys[keys.length] = key; - return keys; - }; - - // Retrieve the values of an object's properties. - _.values = function(obj) { - return _.map(obj, _.identity); - }; - - // Return a sorted list of the function names available on the object. - // Aliased as `methods` - _.functions = _.methods = function(obj) { - var names = []; - for (var key in obj) { - if (_.isFunction(obj[key])) names.push(key); - } - return names.sort(); - }; - - // Extend a given object with all the properties in passed-in object(s). - _.extend = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (source[prop] !== void 0) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Fill in a given object with default properties. - _.defaults = function(obj) { - each(slice.call(arguments, 1), function(source) { - for (var prop in source) { - if (obj[prop] == null) obj[prop] = source[prop]; - } - }); - return obj; - }; - - // Create a (shallow-cloned) duplicate of an object. - _.clone = function(obj) { - if (!_.isObject(obj)) return obj; - return _.isArray(obj) ? obj.slice() : _.extend({}, obj); - }; - - // Invokes interceptor with the obj, and then returns obj. - // The primary purpose of this method is to "tap into" a method chain, in - // order to perform operations on intermediate results within the chain. - _.tap = function(obj, interceptor) { - interceptor(obj); - return obj; - }; - - // Internal recursive comparison function. - function eq(a, b, stack) { - // Identical objects are equal. `0 === -0`, but they aren't identical. - // See the Harmony `egal` proposal: http://wiki.ecmascript.org/doku.php?id=harmony:egal. - if (a === b) return a !== 0 || 1 / a == 1 / b; - // A strict comparison is necessary because `null == undefined`. - if (a == null || b == null) return a === b; - // Unwrap any wrapped objects. - if (a._chain) a = a._wrapped; - if (b._chain) b = b._wrapped; - // Invoke a custom `isEqual` method if one is provided. - if (_.isFunction(a.isEqual)) return a.isEqual(b); - if (_.isFunction(b.isEqual)) return b.isEqual(a); - // Compare `[[Class]]` names. - var className = toString.call(a); - if (className != toString.call(b)) return false; - switch (className) { - // Strings, numbers, dates, and booleans are compared by value. - case '[object String]': - // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is - // equivalent to `new String("5")`. - return String(a) == String(b); - case '[object Number]': - a = +a; - b = +b; - // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for - // other numeric values. - return a != a ? b != b : (a == 0 ? 1 / a == 1 / b : a == b); - case '[object Date]': - case '[object Boolean]': - // Coerce dates and booleans to numeric primitive values. Dates are compared by their - // millisecond representations. Note that invalid dates with millisecond representations - // of `NaN` are not equivalent. - return +a == +b; - // RegExps are compared by their source patterns and flags. - case '[object RegExp]': - return a.source == b.source && - a.global == b.global && - a.multiline == b.multiline && - a.ignoreCase == b.ignoreCase; - } - if (typeof a != 'object' || typeof b != 'object') return false; - // Assume equality for cyclic structures. The algorithm for detecting cyclic - // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. - var length = stack.length; - while (length--) { - // Linear search. Performance is inversely proportional to the number of - // unique nested structures. - if (stack[length] == a) return true; - } - // Add the first object to the stack of traversed objects. - stack.push(a); - var size = 0, result = true; - // Recursively compare objects and arrays. - if (className == '[object Array]') { - // Compare array lengths to determine if a deep comparison is necessary. - size = a.length; - result = size == b.length; - if (result) { - // Deep compare the contents, ignoring non-numeric properties. - while (size--) { - // Ensure commutative equality for sparse arrays. - if (!(result = size in a == size in b && eq(a[size], b[size], stack))) break; - } - } - } else { - // Objects with different constructors are not equivalent. - if ("constructor" in a != "constructor" in b || a.constructor != b.constructor) return false; - // Deep compare objects. - for (var key in a) { - if (hasOwnProperty.call(a, key)) { - // Count the expected number of properties. - size++; - // Deep compare each member. - if (!(result = hasOwnProperty.call(b, key) && eq(a[key], b[key], stack))) break; - } - } - // Ensure that both objects contain the same number of properties. - if (result) { - for (key in b) { - if (hasOwnProperty.call(b, key) && !(size--)) break; - } - result = !size; - } - } - // Remove the first object from the stack of traversed objects. - stack.pop(); - return result; - } - - // Perform a deep comparison to check if two objects are equal. - _.isEqual = function(a, b) { - return eq(a, b, []); - }; - - // Is a given array, string, or object empty? - // An "empty" object has no enumerable own-properties. - _.isEmpty = function(obj) { - if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; - for (var key in obj) if (hasOwnProperty.call(obj, key)) return false; - return true; - }; - - // Is a given value a DOM element? - _.isElement = function(obj) { - return !!(obj && obj.nodeType == 1); - }; - - // Is a given value an array? - // Delegates to ECMA5's native Array.isArray - _.isArray = nativeIsArray || function(obj) { - return toString.call(obj) == '[object Array]'; - }; - - // Is a given variable an object? - _.isObject = function(obj) { - return obj === Object(obj); - }; - - // Is a given variable an arguments object? - if (toString.call(arguments) == '[object Arguments]') { - _.isArguments = function(obj) { - return toString.call(obj) == '[object Arguments]'; - }; - } else { - _.isArguments = function(obj) { - return !!(obj && hasOwnProperty.call(obj, 'callee')); - }; - } - - // Is a given value a function? - _.isFunction = function(obj) { - return toString.call(obj) == '[object Function]'; - }; - - // Is a given value a string? - _.isString = function(obj) { - return toString.call(obj) == '[object String]'; - }; - - // Is a given value a number? - _.isNumber = function(obj) { - return toString.call(obj) == '[object Number]'; - }; - - // Is the given value `NaN`? - _.isNaN = function(obj) { - // `NaN` is the only value for which `===` is not reflexive. - return obj !== obj; - }; - - // Is a given value a boolean? - _.isBoolean = function(obj) { - return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; - }; - - // Is a given value a date? - _.isDate = function(obj) { - return toString.call(obj) == '[object Date]'; - }; - - // Is the given value a regular expression? - _.isRegExp = function(obj) { - return toString.call(obj) == '[object RegExp]'; - }; - - // Is a given value equal to null? - _.isNull = function(obj) { - return obj === null; - }; - - // Is a given variable undefined? - _.isUndefined = function(obj) { - return obj === void 0; - }; - - // Utility Functions - // ----------------- - - // Run Underscore.js in *noConflict* mode, returning the `_` variable to its - // previous owner. Returns a reference to the Underscore object. - _.noConflict = function() { - root._ = previousUnderscore; - return this; - }; - - // Keep the identity function around for default iterators. - _.identity = function(value) { - return value; - }; - - // Run a function **n** times. - _.times = function (n, iterator, context) { - for (var i = 0; i < n; i++) iterator.call(context, i); - }; - - // Escape a string for HTML interpolation. - _.escape = function(string) { - return (''+string).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"').replace(/'/g, ''').replace(/\//g,'/'); - }; - - // Add your own custom functions to the Underscore object, ensuring that - // they're correctly added to the OOP wrapper as well. - _.mixin = function(obj) { - each(_.functions(obj), function(name){ - addToWrapper(name, _[name] = obj[name]); - }); - }; - - // Generate a unique integer id (unique within the entire client session). - // Useful for temporary DOM ids. - var idCounter = 0; - _.uniqueId = function(prefix) { - var id = idCounter++; - return prefix ? prefix + id : id; - }; - - // By default, Underscore uses ERB-style template delimiters, change the - // following template settings to use alternative delimiters. - _.templateSettings = { - evaluate : /<%([\s\S]+?)%>/g, - interpolate : /<%=([\s\S]+?)%>/g, - escape : /<%-([\s\S]+?)%>/g - }; - - // JavaScript micro-templating, similar to John Resig's implementation. - // Underscore templating handles arbitrary delimiters, preserves whitespace, - // and correctly escapes quotes within interpolated code. - _.template = function(str, data) { - var c = _.templateSettings; - var tmpl = 'var __p=[],print=function(){__p.push.apply(__p,arguments);};' + - 'with(obj||{}){__p.push(\'' + - str.replace(/\\/g, '\\\\') - .replace(/'/g, "\\'") - .replace(c.escape, function(match, code) { - return "',_.escape(" + code.replace(/\\'/g, "'") + "),'"; - }) - .replace(c.interpolate, function(match, code) { - return "'," + code.replace(/\\'/g, "'") + ",'"; - }) - .replace(c.evaluate || null, function(match, code) { - return "');" + code.replace(/\\'/g, "'") - .replace(/[\r\n\t]/g, ' ') + ";__p.push('"; - }) - .replace(/\r/g, '\\r') - .replace(/\n/g, '\\n') - .replace(/\t/g, '\\t') - + "');}return __p.join('');"; - var func = new Function('obj', '_', tmpl); - return data ? func(data, _) : function(data) { return func(data, _) }; - }; - - // The OOP Wrapper - // --------------- - - // If Underscore is called as a function, it returns a wrapped object that - // can be used OO-style. This wrapper holds altered versions of all the - // underscore functions. Wrapped objects may be chained. - var wrapper = function(obj) { this._wrapped = obj; }; - - // Expose `wrapper.prototype` as `_.prototype` - _.prototype = wrapper.prototype; - - // Helper function to continue chaining intermediate results. - var result = function(obj, chain) { - return chain ? _(obj).chain() : obj; - }; - - // A method to easily add functions to the OOP wrapper. - var addToWrapper = function(name, func) { - wrapper.prototype[name] = function() { - var args = slice.call(arguments); - unshift.call(args, this._wrapped); - return result(func.apply(_, args), this._chain); - }; - }; - - // Add all of the Underscore functions to the wrapper object. - _.mixin(_); - - // Add all mutator Array functions to the wrapper. - each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - method.apply(this._wrapped, arguments); - return result(this._wrapped, this._chain); - }; - }); - - // Add all accessor Array functions to the wrapper. - each(['concat', 'join', 'slice'], function(name) { - var method = ArrayProto[name]; - wrapper.prototype[name] = function() { - return result(method.apply(this._wrapped, arguments), this._chain); - }; - }); - - // Start chaining a wrapped Underscore object. - wrapper.prototype.chain = function() { - this._chain = true; - return this; - }; - - // Extracts the result from a wrapped and chained object. - wrapper.prototype.value = function() { - return this._wrapped; - }; - -}).call(this);