teaspoon 0.7.9 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (163) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +382 -260
  3. data/app/assets/javascripts/teaspoon-angular.js +108 -26241
  4. data/app/assets/javascripts/teaspoon-jasmine.js +103 -2642
  5. data/app/assets/javascripts/teaspoon-mocha.js +109 -5416
  6. data/app/assets/javascripts/teaspoon-qunit.js +107 -2255
  7. data/app/assets/javascripts/teaspoon-teaspoon.js +0 -1
  8. data/app/assets/javascripts/teaspoon/angular.coffee +3 -1
  9. data/app/assets/javascripts/teaspoon/base/hook.coffee +21 -0
  10. data/app/assets/javascripts/teaspoon/base/reporters/html.coffee +26 -14
  11. data/app/assets/javascripts/teaspoon/base/reporters/html/progress_view.coffee +1 -1
  12. data/app/assets/javascripts/teaspoon/base/reporters/html/template.coffee +3 -3
  13. data/app/assets/javascripts/teaspoon/base/teaspoon.coffee +10 -1
  14. data/app/assets/javascripts/teaspoon/jasmine.coffee +3 -1
  15. data/app/assets/javascripts/teaspoon/mocha.coffee +3 -1
  16. data/app/assets/javascripts/teaspoon/mocha/reporters/html.coffee +1 -1
  17. data/app/assets/javascripts/teaspoon/qunit.coffee +3 -1
  18. data/app/assets/javascripts/teaspoon/qunit/reporters/html.coffee +1 -1
  19. data/app/assets/javascripts/teaspoon/teaspoon.coffee +0 -1
  20. data/app/assets/stylesheets/teaspoon.css +12 -8
  21. data/app/controllers/teaspoon/suite_controller.rb +32 -0
  22. data/app/views/teaspoon/suite/_body.html.erb +0 -0
  23. data/app/views/teaspoon/suite/_boot.html.erb +4 -0
  24. data/app/views/teaspoon/suite/_boot_require_js.html.erb +19 -0
  25. data/app/views/teaspoon/{spec/suites.html.erb → suite/index.html.erb} +6 -7
  26. data/app/views/teaspoon/suite/show.html.erb +19 -0
  27. data/bin/teaspoon +1 -1
  28. data/config/routes.rb +14 -4
  29. data/lib/generators/teaspoon/install/POST_INSTALL +2 -2
  30. data/lib/generators/teaspoon/install/install_generator.rb +22 -11
  31. data/lib/generators/teaspoon/install/templates/_body.html.erb +0 -0
  32. data/lib/generators/teaspoon/install/templates/_boot.html.erb +4 -0
  33. data/lib/generators/teaspoon/install/templates/jasmine/env.rb +11 -0
  34. data/lib/generators/teaspoon/install/templates/jasmine/env_comments.rb +182 -0
  35. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.coffee +8 -6
  36. data/lib/generators/teaspoon/install/templates/jasmine/spec_helper.js +8 -7
  37. data/lib/generators/teaspoon/install/templates/mocha/env.rb +11 -0
  38. data/lib/generators/teaspoon/install/templates/mocha/env_comments.rb +182 -0
  39. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.coffee +13 -13
  40. data/lib/generators/teaspoon/install/templates/mocha/spec_helper.js +13 -13
  41. data/lib/generators/teaspoon/install/templates/qunit/env.rb +11 -0
  42. data/lib/generators/teaspoon/install/templates/qunit/env_comments.rb +182 -0
  43. data/lib/generators/teaspoon/install/templates/qunit/test_helper.coffee +6 -5
  44. data/lib/generators/teaspoon/install/templates/qunit/test_helper.js +6 -5
  45. data/lib/tasks/teaspoon.rake +9 -2
  46. data/lib/teaspoon.rb +4 -6
  47. data/lib/teaspoon/command_line.rb +116 -134
  48. data/lib/teaspoon/configuration.rb +144 -66
  49. data/lib/teaspoon/console.rb +70 -37
  50. data/lib/teaspoon/coverage.rb +42 -15
  51. data/lib/teaspoon/deprecated.rb +65 -0
  52. data/lib/teaspoon/drivers/base.rb +10 -0
  53. data/lib/teaspoon/drivers/phantomjs/runner.js +9 -11
  54. data/lib/teaspoon/drivers/phantomjs_driver.rb +21 -21
  55. data/lib/teaspoon/drivers/selenium_driver.rb +32 -13
  56. data/lib/teaspoon/engine.rb +32 -12
  57. data/lib/teaspoon/environment.rb +16 -12
  58. data/lib/teaspoon/exceptions.rb +41 -5
  59. data/lib/teaspoon/exporter.rb +52 -0
  60. data/lib/teaspoon/formatters/base.rb +171 -0
  61. data/lib/teaspoon/formatters/clean_formatter.rb +2 -4
  62. data/lib/teaspoon/formatters/documentation_formatter.rb +60 -0
  63. data/lib/teaspoon/formatters/dot_formatter.rb +12 -90
  64. data/lib/teaspoon/formatters/json_formatter.rb +36 -0
  65. data/lib/teaspoon/formatters/junit_formatter.rb +51 -32
  66. data/lib/teaspoon/formatters/modules/report_module.rb +76 -0
  67. data/lib/teaspoon/formatters/pride_formatter.rb +23 -27
  68. data/lib/teaspoon/formatters/snowday_formatter.rb +7 -11
  69. data/lib/teaspoon/formatters/swayze_or_oprah_formatter.rb +88 -64
  70. data/lib/teaspoon/formatters/tap_formatter.rb +18 -27
  71. data/lib/teaspoon/formatters/tap_y_formatter.rb +35 -45
  72. data/lib/teaspoon/formatters/teamcity_formatter.rb +69 -31
  73. data/lib/teaspoon/instrumentation.rb +33 -33
  74. data/lib/teaspoon/result.rb +2 -1
  75. data/lib/teaspoon/runner.rb +40 -28
  76. data/lib/teaspoon/server.rb +23 -25
  77. data/lib/teaspoon/suite.rb +52 -72
  78. data/lib/teaspoon/utility.rb +3 -14
  79. data/lib/teaspoon/version.rb +1 -1
  80. data/spec/dummy/app/assets/javascripts/integration/integration_spec.coffee +3 -0
  81. data/spec/dummy/app/assets/javascripts/integration/spec_helper.coffee +2 -0
  82. data/spec/dummy/config/application.rb +3 -0
  83. data/spec/features/console_reporter_spec.rb +48 -18
  84. data/spec/features/hooks_spec.rb +23 -41
  85. data/spec/features/html_reporter_spec.rb +38 -21
  86. data/spec/features/install_generator_spec.rb +34 -20
  87. data/spec/features/instrumentation_spec.rb +3 -2
  88. data/spec/fixtures/coverage.json +243 -0
  89. data/spec/javascripts/fixtures/_body.html.erb +1 -0
  90. data/spec/javascripts/jasmine_helper.coffee +1 -1
  91. data/spec/javascripts/teaspoon/base/fixture_spec.coffee +4 -4
  92. data/spec/javascripts/teaspoon/base/reporters/html_spec.coffee +9 -10
  93. data/spec/javascripts/teaspoon/mocha/reporters/html_mspec.coffee +0 -6
  94. data/spec/javascripts/teaspoon/phantomjs/runner_spec.coffee +5 -6
  95. data/spec/javascripts/turbolinks_helper.coffee +1 -1
  96. data/spec/spec_helper.rb +3 -4
  97. data/spec/teaspoon/command_line_spec.rb +139 -23
  98. data/spec/teaspoon/configuration_spec.rb +164 -46
  99. data/spec/teaspoon/console_spec.rb +142 -47
  100. data/spec/teaspoon/coverage_spec.rb +98 -28
  101. data/spec/teaspoon/drivers/base_spec.rb +5 -0
  102. data/spec/teaspoon/drivers/phantomjs_driver_spec.rb +32 -14
  103. data/spec/teaspoon/drivers/selenium_driver_spec.rb +32 -24
  104. data/spec/teaspoon/engine_spec.rb +8 -5
  105. data/spec/teaspoon/environment_spec.rb +56 -33
  106. data/spec/teaspoon/exceptions_spec.rb +57 -0
  107. data/spec/teaspoon/exporter_spec.rb +96 -0
  108. data/spec/teaspoon/formatters/base_spec.rb +259 -0
  109. data/spec/teaspoon/formatters/clean_formatter_spec.rb +37 -0
  110. data/spec/teaspoon/formatters/documentation_formatter_spec.rb +127 -0
  111. data/spec/teaspoon/formatters/dot_formatter_spec.rb +52 -56
  112. data/spec/teaspoon/formatters/json_formatter_spec.rb +77 -0
  113. data/spec/teaspoon/formatters/junit_formatter_spec.rb +72 -35
  114. data/spec/teaspoon/formatters/pride_formatter_spec.rb +37 -0
  115. data/spec/teaspoon/formatters/snowday_formatter_spec.rb +35 -0
  116. data/spec/teaspoon/formatters/tap_formatter_spec.rb +29 -81
  117. data/spec/teaspoon/formatters/tap_y_formatter_spec.rb +31 -141
  118. data/spec/teaspoon/formatters/teamcity_formatter_spec.rb +99 -42
  119. data/spec/teaspoon/instrumentation_spec.rb +44 -44
  120. data/spec/teaspoon/result_spec.rb +37 -0
  121. data/spec/teaspoon/runner_spec.rb +70 -59
  122. data/spec/teaspoon/server_spec.rb +34 -52
  123. data/spec/teaspoon/suite_spec.rb +42 -188
  124. data/spec/teaspoon_env.rb +39 -28
  125. data/vendor/assets/javascripts/{angular-scenario-1.0.5.js → angular/1.0.5.js} +0 -0
  126. data/vendor/assets/javascripts/{angular-scenario-1.0.5.MIT-LICENSE → angular/MIT-LICENSE} +0 -0
  127. data/vendor/assets/javascripts/{jasmine-1.3.1.js → jasmine/1.3.1.js} +0 -0
  128. data/vendor/assets/javascripts/jasmine/2.0.0.js +2412 -0
  129. data/vendor/assets/javascripts/{jasmine-1.3.1.MIT.LICENSE → jasmine/MIT.LICENSE} +0 -0
  130. data/vendor/assets/javascripts/{mocha-1.10.0.js → mocha/1.10.0.js} +1 -0
  131. data/vendor/assets/javascripts/mocha/1.17.1.js +5813 -0
  132. data/vendor/assets/javascripts/{mocha-1.10.1.MIT.LICENSE → mocha/MIT.LICENSE} +0 -0
  133. data/vendor/assets/javascripts/{qunit-1.12.0.js → qunit/1.12.0.js} +1 -1
  134. data/vendor/assets/javascripts/qunit/1.14.0.js +2288 -0
  135. data/vendor/assets/javascripts/{qunit-1.12.0.MIT.LICENSE → qunit/MIT.LICENSE} +0 -0
  136. data/vendor/assets/javascripts/support/chai.js +827 -385
  137. data/vendor/assets/javascripts/support/jasmine-jquery-1.7.0.js +720 -0
  138. data/vendor/assets/javascripts/support/jasmine-jquery-2.0.0.js +812 -0
  139. data/vendor/assets/javascripts/support/sinon-chai.js +17 -0
  140. data/vendor/assets/javascripts/support/sinon.js +1138 -643
  141. metadata +57 -36
  142. data/app/controllers/teaspoon/spec_controller.rb +0 -38
  143. data/app/helpers/teaspoon/spec_helper.rb +0 -36
  144. data/app/views/teaspoon/spec/_require_js.html.erb +0 -21
  145. data/app/views/teaspoon/spec/_standard.html.erb +0 -4
  146. data/app/views/teaspoon/spec/runner.html.erb +0 -19
  147. data/lib/generators/teaspoon/install/templates/env.rb +0 -38
  148. data/lib/generators/teaspoon/install/templates/jasmine/initializer.rb +0 -64
  149. data/lib/generators/teaspoon/install/templates/mocha/initializer.rb +0 -64
  150. data/lib/generators/teaspoon/install/templates/qunit/initializer.rb +0 -64
  151. data/lib/teaspoon/check_coverage.rb +0 -33
  152. data/lib/teaspoon/drivers/base_driver.rb +0 -10
  153. data/lib/teaspoon/exception_handling.rb +0 -18
  154. data/lib/teaspoon/formatters/base_formatter.rb +0 -63
  155. data/spec/dummy/config/initializers/teaspoon.rb +0 -41
  156. data/spec/teaspoon/check_coverage_spec.rb +0 -50
  157. data/spec/teaspoon/formatters/base_formatter_spec.rb +0 -45
  158. data/vendor/assets/javascripts/support/chai.MIT.LICENSE +0 -22
  159. data/vendor/assets/javascripts/support/expect.MIT.LICENSE +0 -22
  160. data/vendor/assets/javascripts/support/jasmine-jquery.MIT.LICENSE +0 -20
  161. data/vendor/assets/javascripts/support/jasmine-jquery.js +0 -659
  162. data/vendor/assets/javascripts/support/sinon-chai.MIT-ISH.LICENSE +0 -13
  163. data/vendor/assets/javascripts/support/sinon.BSD.LICENSE +0 -27
@@ -27,10 +27,14 @@
27
27
  // perform real require()
28
28
  // by invoking the module's
29
29
  // registered function
30
- if (!module.exports) {
31
- module.exports = {};
32
- module.client = module.component = true;
33
- module.call(this, module.exports, require.relative(resolved), module);
30
+ if (!module._resolving && !module.exports) {
31
+ var mod = {};
32
+ mod.exports = {};
33
+ mod.client = mod.component = true;
34
+ module._resolving = true;
35
+ module.call(this, mod.exports, require.relative(resolved), mod);
36
+ delete module._resolving;
37
+ module.exports = mod.exports;
34
38
  }
35
39
 
36
40
  return module.exports;
@@ -64,7 +68,6 @@
64
68
 
65
69
  require.resolve = function(path) {
66
70
  if (path.charAt(0) === '/') path = path.slice(1);
67
- var index = path + '/index.js';
68
71
 
69
72
  var paths = [
70
73
  path,
@@ -77,10 +80,7 @@
77
80
  for (var i = 0; i < paths.length; i++) {
78
81
  var path = paths[i];
79
82
  if (require.modules.hasOwnProperty(path)) return path;
80
- }
81
-
82
- if (require.aliases.hasOwnProperty(index)) {
83
- return require.aliases[index];
83
+ if (require.aliases.hasOwnProperty(path)) return require.aliases[path];
84
84
  }
85
85
  };
86
86
 
@@ -200,287 +200,745 @@
200
200
 
201
201
  return localRequire;
202
202
  };
203
- require.register("chai/index.js", function(exports, require, module){
204
- module.exports = require('./lib/chai');
205
-
206
- });
207
- require.register("chai/lib/chai.js", function(exports, require, module){
203
+ require.register("chaijs-assertion-error/index.js", function(exports, require, module){
208
204
  /*!
209
- * chai
210
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
205
+ * assertion-error
206
+ * Copyright(c) 2013 Jake Luer <jake@qualiancy.com>
211
207
  * MIT Licensed
212
208
  */
213
209
 
214
- var used = []
215
- , exports = module.exports = {};
210
+ /*!
211
+ * Return a function that will copy properties from
212
+ * one object to another excluding any originally
213
+ * listed. Returned function will create a new `{}`.
214
+ *
215
+ * @param {String} excluded properties ...
216
+ * @return {Function}
217
+ */
218
+
219
+ function exclude () {
220
+ var excludes = [].slice.call(arguments);
221
+
222
+ function excludeProps (res, obj) {
223
+ Object.keys(obj).forEach(function (key) {
224
+ if (!~excludes.indexOf(key)) res[key] = obj[key];
225
+ });
226
+ }
227
+
228
+ return function extendExclude () {
229
+ var args = [].slice.call(arguments)
230
+ , i = 0
231
+ , res = {};
232
+
233
+ for (; i < args.length; i++) {
234
+ excludeProps(res, args[i]);
235
+ }
236
+
237
+ return res;
238
+ };
239
+ };
216
240
 
217
241
  /*!
218
- * Chai version
242
+ * Primary Exports
243
+ */
244
+
245
+ module.exports = AssertionError;
246
+
247
+ /**
248
+ * ### AssertionError
249
+ *
250
+ * An extension of the JavaScript `Error` constructor for
251
+ * assertion and validation scenarios.
252
+ *
253
+ * @param {String} message
254
+ * @param {Object} properties to include (optional)
255
+ * @param {callee} start stack function (optional)
219
256
  */
220
257
 
221
- exports.version = '1.6.1';
258
+ function AssertionError (message, _props, ssf) {
259
+ var extend = exclude('name', 'message', 'stack', 'constructor', 'toJSON')
260
+ , props = extend(_props || {});
261
+
262
+ // default values
263
+ this.message = message || 'Unspecified AssertionError';
264
+ this.showDiff = false;
265
+
266
+ // copy from properties
267
+ for (var key in props) {
268
+ this[key] = props[key];
269
+ }
270
+
271
+ // capture stack trace
272
+ ssf = ssf || arguments.callee;
273
+ if (ssf && Error.captureStackTrace) {
274
+ Error.captureStackTrace(this, ssf);
275
+ }
276
+ }
222
277
 
223
278
  /*!
224
- * Primary `Assertion` prototype
279
+ * Inherit from Error.prototype
225
280
  */
226
281
 
227
- exports.Assertion = require('./chai/assertion');
282
+ AssertionError.prototype = Object.create(Error.prototype);
228
283
 
229
284
  /*!
230
- * Assertion Error
285
+ * Statically set name
231
286
  */
232
287
 
233
- exports.AssertionError = require('./chai/error');
288
+ AssertionError.prototype.name = 'AssertionError';
234
289
 
235
290
  /*!
236
- * Utils for plugins (not exported)
291
+ * Ensure correct constructor
237
292
  */
238
293
 
239
- var util = require('./chai/utils');
294
+ AssertionError.prototype.constructor = AssertionError;
240
295
 
241
296
  /**
242
- * # .use(function)
243
- *
244
- * Provides a way to extend the internals of Chai
297
+ * Allow errors to be converted to JSON for static transfer.
245
298
  *
246
- * @param {Function}
247
- * @returns {this} for chaining
248
- * @api public
299
+ * @param {Boolean} include stack (default: `true`)
300
+ * @return {Object} object that can be `JSON.stringify`
249
301
  */
250
302
 
251
- exports.use = function (fn) {
252
- if (!~used.indexOf(fn)) {
253
- fn(this, util);
254
- used.push(fn);
303
+ AssertionError.prototype.toJSON = function (stack) {
304
+ var extend = exclude('constructor', 'toJSON', 'stack')
305
+ , props = extend({ name: this.name }, this);
306
+
307
+ // include stack if exists and not turned off
308
+ if (false !== stack && this.stack) {
309
+ props.stack = this.stack;
255
310
  }
256
311
 
257
- return this;
312
+ return props;
258
313
  };
259
314
 
315
+ });
316
+ require.register("chaijs-type-detect/lib/type.js", function(exports, require, module){
260
317
  /*!
261
- * Core Assertions
318
+ * type-detect
319
+ * Copyright(c) 2013 jake luer <jake@alogicalparadox.com>
320
+ * MIT Licensed
262
321
  */
263
322
 
264
- var core = require('./chai/core/assertions');
265
- exports.use(core);
266
-
267
323
  /*!
268
- * Expect interface
324
+ * Primary Exports
269
325
  */
270
326
 
271
- var expect = require('./chai/interface/expect');
272
- exports.use(expect);
327
+ var exports = module.exports = getType;
273
328
 
274
329
  /*!
275
- * Should interface
330
+ * Detectable javascript natives
276
331
  */
277
332
 
278
- var should = require('./chai/interface/should');
279
- exports.use(should);
333
+ var natives = {
334
+ '[object Array]': 'array'
335
+ , '[object RegExp]': 'regexp'
336
+ , '[object Function]': 'function'
337
+ , '[object Arguments]': 'arguments'
338
+ , '[object Date]': 'date'
339
+ };
280
340
 
281
- /*!
282
- * Assert interface
341
+ /**
342
+ * ### typeOf (obj)
343
+ *
344
+ * Use several different techniques to determine
345
+ * the type of object being tested.
346
+ *
347
+ *
348
+ * @param {Mixed} object
349
+ * @return {String} object type
350
+ * @api public
283
351
  */
284
352
 
285
- var assert = require('./chai/interface/assert');
286
- exports.use(assert);
353
+ function getType (obj) {
354
+ var str = Object.prototype.toString.call(obj);
355
+ if (natives[str]) return natives[str];
356
+ if (obj === null) return 'null';
357
+ if (obj === undefined) return 'undefined';
358
+ if (obj === Object(obj)) return 'object';
359
+ return typeof obj;
360
+ }
361
+
362
+ exports.Library = Library;
363
+
364
+ /**
365
+ * ### Library
366
+ *
367
+ * Create a repository for custom type detection.
368
+ *
369
+ * ```js
370
+ * var lib = new type.Library;
371
+ * ```
372
+ *
373
+ */
374
+
375
+ function Library () {
376
+ this.tests = {};
377
+ }
378
+
379
+ /**
380
+ * #### .of (obj)
381
+ *
382
+ * Expose replacement `typeof` detection to the library.
383
+ *
384
+ * ```js
385
+ * if ('string' === lib.of('hello world')) {
386
+ * // ...
387
+ * }
388
+ * ```
389
+ *
390
+ * @param {Mixed} object to test
391
+ * @return {String} type
392
+ */
393
+
394
+ Library.prototype.of = getType;
395
+
396
+ /**
397
+ * #### .define (type, test)
398
+ *
399
+ * Add a test to for the `.test()` assertion.
400
+ *
401
+ * Can be defined as a regular expression:
402
+ *
403
+ * ```js
404
+ * lib.define('int', /^[0-9]+$/);
405
+ * ```
406
+ *
407
+ * ... or as a function:
408
+ *
409
+ * ```js
410
+ * lib.define('bln', function (obj) {
411
+ * if ('boolean' === lib.of(obj)) return true;
412
+ * var blns = [ 'yes', 'no', 'true', 'false', 1, 0 ];
413
+ * if ('string' === lib.of(obj)) obj = obj.toLowerCase();
414
+ * return !! ~blns.indexOf(obj);
415
+ * });
416
+ * ```
417
+ *
418
+ * @param {String} type
419
+ * @param {RegExp|Function} test
420
+ * @api public
421
+ */
422
+
423
+ Library.prototype.define = function (type, test) {
424
+ if (arguments.length === 1) return this.tests[type];
425
+ this.tests[type] = test;
426
+ return this;
427
+ };
428
+
429
+ /**
430
+ * #### .test (obj, test)
431
+ *
432
+ * Assert that an object is of type. Will first
433
+ * check natives, and if that does not pass it will
434
+ * use the user defined custom tests.
435
+ *
436
+ * ```js
437
+ * assert(lib.test('1', 'int'));
438
+ * assert(lib.test('yes', 'bln'));
439
+ * ```
440
+ *
441
+ * @param {Mixed} object
442
+ * @param {String} type
443
+ * @return {Boolean} result
444
+ * @api public
445
+ */
446
+
447
+ Library.prototype.test = function (obj, type) {
448
+ if (type === getType(obj)) return true;
449
+ var test = this.tests[type];
450
+
451
+ if (test && 'regexp' === getType(test)) {
452
+ return test.test(obj);
453
+ } else if (test && 'function' === getType(test)) {
454
+ return test(obj);
455
+ } else {
456
+ throw new ReferenceError('Type test "' + type + '" not defined or invalid.');
457
+ }
458
+ };
287
459
 
288
460
  });
289
- require.register("chai/lib/chai/assertion.js", function(exports, require, module){
461
+ require.register("chaijs-deep-eql/lib/eql.js", function(exports, require, module){
290
462
  /*!
291
- * chai
292
- * http://chaijs.com
293
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
463
+ * deep-eql
464
+ * Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com>
294
465
  * MIT Licensed
295
466
  */
296
467
 
297
468
  /*!
298
- * Module dependencies.
469
+ * Module dependencies
299
470
  */
300
471
 
301
- var AssertionError = require('./error')
302
- , util = require('./utils')
303
- , flag = util.flag;
472
+ var type = require('type-detect');
304
473
 
305
474
  /*!
306
- * Module export.
475
+ * Buffer.isBuffer browser shim
307
476
  */
308
477
 
309
- module.exports = Assertion;
310
-
478
+ var Buffer;
479
+ try { Buffer = require('buffer').Buffer; }
480
+ catch(ex) {
481
+ Buffer = {};
482
+ Buffer.isBuffer = function() { return false; }
483
+ }
311
484
 
312
485
  /*!
313
- * Assertion Constructor
486
+ * Primary Export
487
+ */
488
+
489
+ module.exports = deepEqual;
490
+
491
+ /**
492
+ * Assert super-strict (egal) equality between
493
+ * two objects of any type.
314
494
  *
315
- * Creates object for chaining.
495
+ * @param {Mixed} a
496
+ * @param {Mixed} b
497
+ * @param {Array} memoised (optional)
498
+ * @return {Boolean} equal match
499
+ */
500
+
501
+ function deepEqual(a, b, m) {
502
+ if (sameValue(a, b)) {
503
+ return true;
504
+ } else if ('date' === type(a)) {
505
+ return dateEqual(a, b);
506
+ } else if ('regexp' === type(a)) {
507
+ return regexpEqual(a, b);
508
+ } else if (Buffer.isBuffer(a)) {
509
+ return bufferEqual(a, b);
510
+ } else if ('arguments' === type(a)) {
511
+ return argumentsEqual(a, b, m);
512
+ } else if (!typeEqual(a, b)) {
513
+ return false;
514
+ } else if (('object' !== type(a) && 'object' !== type(b))
515
+ && ('array' !== type(a) && 'array' !== type(b))) {
516
+ return sameValue(a, b);
517
+ } else {
518
+ return objectEqual(a, b, m);
519
+ }
520
+ }
521
+
522
+ /*!
523
+ * Strict (egal) equality test. Ensures that NaN always
524
+ * equals NaN and `-0` does not equal `+0`.
316
525
  *
317
- * @api private
526
+ * @param {Mixed} a
527
+ * @param {Mixed} b
528
+ * @return {Boolean} equal match
318
529
  */
319
530
 
320
- function Assertion (obj, msg, stack) {
321
- flag(this, 'ssfi', stack || arguments.callee);
322
- flag(this, 'object', obj);
323
- flag(this, 'message', msg);
531
+ function sameValue(a, b) {
532
+ if (a === b) return a !== 0 || 1 / a === 1 / b;
533
+ return a !== a && b !== b;
324
534
  }
325
535
 
326
536
  /*!
327
- * ### Assertion.includeStack
537
+ * Compare the types of two given objects and
538
+ * return if they are equal. Note that an Array
539
+ * has a type of `array` (not `object`) and arguments
540
+ * have a type of `arguments` (not `array`/`object`).
328
541
  *
329
- * User configurable property, influences whether stack trace
330
- * is included in Assertion error message. Default of false
331
- * suppresses stack trace in the error message
542
+ * @param {Mixed} a
543
+ * @param {Mixed} b
544
+ * @return {Boolean} result
545
+ */
546
+
547
+ function typeEqual(a, b) {
548
+ return type(a) === type(b);
549
+ }
550
+
551
+ /*!
552
+ * Compare two Date objects by asserting that
553
+ * the time values are equal using `saveValue`.
332
554
  *
333
- * Assertion.includeStack = true; // enable stack on error
555
+ * @param {Date} a
556
+ * @param {Date} b
557
+ * @return {Boolean} result
558
+ */
559
+
560
+ function dateEqual(a, b) {
561
+ if ('date' !== type(b)) return false;
562
+ return sameValue(a.getTime(), b.getTime());
563
+ }
564
+
565
+ /*!
566
+ * Compare two regular expressions by converting them
567
+ * to string and checking for `sameValue`.
334
568
  *
335
- * @api public
569
+ * @param {RegExp} a
570
+ * @param {RegExp} b
571
+ * @return {Boolean} result
336
572
  */
337
573
 
338
- Assertion.includeStack = false;
574
+ function regexpEqual(a, b) {
575
+ if ('regexp' !== type(b)) return false;
576
+ return sameValue(a.toString(), b.toString());
577
+ }
339
578
 
340
579
  /*!
341
- * ### Assertion.showDiff
580
+ * Assert deep equality of two `arguments` objects.
581
+ * Unfortunately, these must be sliced to arrays
582
+ * prior to test to ensure no bad behavior.
342
583
  *
343
- * User configurable property, influences whether or not
344
- * the `showDiff` flag should be included in the thrown
345
- * AssertionErrors. `false` will always be `false`; `true`
346
- * will be true when the assertion has requested a diff
347
- * be shown.
584
+ * @param {Arguments} a
585
+ * @param {Arguments} b
586
+ * @param {Array} memoize (optional)
587
+ * @return {Boolean} result
588
+ */
589
+
590
+ function argumentsEqual(a, b, m) {
591
+ if ('arguments' !== type(b)) return false;
592
+ a = [].slice.call(a);
593
+ b = [].slice.call(b);
594
+ return deepEqual(a, b, m);
595
+ }
596
+
597
+ /*!
598
+ * Get enumerable properties of a given object.
348
599
  *
349
- * @api public
600
+ * @param {Object} a
601
+ * @return {Array} property names
350
602
  */
351
603
 
352
- Assertion.showDiff = true;
604
+ function enumerable(a) {
605
+ var res = [];
606
+ for (var key in a) res.push(key);
607
+ return res;
608
+ }
353
609
 
354
- Assertion.addProperty = function (name, fn) {
355
- util.addProperty(this.prototype, name, fn);
356
- };
610
+ /*!
611
+ * Simple equality for flat iterable objects
612
+ * such as Arrays or Node.js buffers.
613
+ *
614
+ * @param {Iterable} a
615
+ * @param {Iterable} b
616
+ * @return {Boolean} result
617
+ */
357
618
 
358
- Assertion.addMethod = function (name, fn) {
359
- util.addMethod(this.prototype, name, fn);
360
- };
619
+ function iterableEqual(a, b) {
620
+ if (a.length !== b.length) return false;
361
621
 
362
- Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
363
- util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
364
- };
622
+ var i = 0;
623
+ var match = true;
365
624
 
366
- Assertion.overwriteProperty = function (name, fn) {
367
- util.overwriteProperty(this.prototype, name, fn);
368
- };
625
+ for (; i < a.length; i++) {
626
+ if (a[i] !== b[i]) {
627
+ match = false;
628
+ break;
629
+ }
630
+ }
369
631
 
370
- Assertion.overwriteMethod = function (name, fn) {
371
- util.overwriteMethod(this.prototype, name, fn);
372
- };
632
+ return match;
633
+ }
373
634
 
374
635
  /*!
375
- * ### .assert(expression, message, negateMessage, expected, actual)
636
+ * Extension to `iterableEqual` specifically
637
+ * for Node.js Buffers.
376
638
  *
377
- * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
378
- *
379
- * @name assert
380
- * @param {Philosophical} expression to be tested
381
- * @param {String} message to display if fails
382
- * @param {String} negatedMessage to display if negated expression fails
383
- * @param {Mixed} expected value (remember to check for negation)
384
- * @param {Mixed} actual (optional) will default to `this.obj`
385
- * @api private
639
+ * @param {Buffer} a
640
+ * @param {Mixed} b
641
+ * @return {Boolean} result
386
642
  */
387
643
 
388
- Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
389
- var ok = util.test(this, arguments);
390
- if (true !== showDiff) showDiff = false;
391
- if (true !== Assertion.showDiff) showDiff = false;
392
-
393
- if (!ok) {
394
- var msg = util.getMessage(this, arguments)
395
- , actual = util.getActual(this, arguments);
396
- throw new AssertionError({
397
- message: msg
398
- , actual: actual
399
- , expected: expected
400
- , stackStartFunction: (Assertion.includeStack) ? this.assert : flag(this, 'ssfi')
401
- , showDiff: showDiff
402
- });
403
- }
404
- };
644
+ function bufferEqual(a, b) {
645
+ if (!Buffer.isBuffer(b)) return false;
646
+ return iterableEqual(a, b);
647
+ }
405
648
 
406
649
  /*!
407
- * ### ._obj
650
+ * Block for `objectEqual` ensuring non-existing
651
+ * values don't get in.
408
652
  *
409
- * Quick reference to stored `actual` value for plugin developers.
653
+ * @param {Mixed} object
654
+ * @return {Boolean} result
655
+ */
656
+
657
+ function isValue(a) {
658
+ return a !== null && a !== undefined;
659
+ }
660
+
661
+ /*!
662
+ * Recursively check the equality of two objects.
663
+ * Once basic sameness has been established it will
664
+ * defer to `deepEqual` for each enumerable key
665
+ * in the object.
410
666
  *
411
- * @api private
667
+ * @param {Mixed} a
668
+ * @param {Mixed} b
669
+ * @return {Boolean} result
412
670
  */
413
671
 
414
- Object.defineProperty(Assertion.prototype, '_obj',
415
- { get: function () {
416
- return flag(this, 'object');
672
+ function objectEqual(a, b, m) {
673
+ if (!isValue(a) || !isValue(b)) {
674
+ return false;
675
+ }
676
+
677
+ if (a.prototype !== b.prototype) {
678
+ return false;
679
+ }
680
+
681
+ var i;
682
+ if (m) {
683
+ for (i = 0; i < m.length; i++) {
684
+ if ((m[i][0] === a && m[i][1] === b)
685
+ || (m[i][0] === b && m[i][1] === a)) {
686
+ return true;
687
+ }
417
688
  }
418
- , set: function (val) {
419
- flag(this, 'object', val);
689
+ } else {
690
+ m = [];
691
+ }
692
+
693
+ try {
694
+ var ka = enumerable(a);
695
+ var kb = enumerable(b);
696
+ } catch (ex) {
697
+ return false;
698
+ }
699
+
700
+ ka.sort();
701
+ kb.sort();
702
+
703
+ if (!iterableEqual(ka, kb)) {
704
+ return false;
705
+ }
706
+
707
+ m.push([ a, b ]);
708
+
709
+ var key;
710
+ for (i = ka.length - 1; i >= 0; i--) {
711
+ key = ka[i];
712
+ if (!deepEqual(a[key], b[key], m)) {
713
+ return false;
420
714
  }
421
- });
715
+ }
716
+
717
+ return true;
718
+ }
719
+
720
+ });
721
+ require.register("chai/index.js", function(exports, require, module){
722
+ module.exports = require('./lib/chai');
422
723
 
423
724
  });
424
- require.register("chai/lib/chai/error.js", function(exports, require, module){
725
+ require.register("chai/lib/chai.js", function(exports, require, module){
425
726
  /*!
426
727
  * chai
427
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
728
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
428
729
  * MIT Licensed
429
730
  */
430
731
 
732
+ var used = []
733
+ , exports = module.exports = {};
734
+
431
735
  /*!
432
- * Main export
736
+ * Chai version
433
737
  */
434
738
 
435
- module.exports = AssertionError;
739
+ exports.version = '1.8.1';
740
+
741
+ /*!
742
+ * Assertion Error
743
+ */
744
+
745
+ exports.AssertionError = require('assertion-error');
746
+
747
+ /*!
748
+ * Utils for plugins (not exported)
749
+ */
750
+
751
+ var util = require('./chai/utils');
436
752
 
437
753
  /**
438
- * # AssertionError (constructor)
439
- *
440
- * Create a new assertion error based on the Javascript
441
- * `Error` prototype.
754
+ * # .use(function)
442
755
  *
443
- * **Options**
444
- * - message
445
- * - actual
446
- * - expected
447
- * - operator
448
- * - startStackFunction
756
+ * Provides a way to extend the internals of Chai
449
757
  *
450
- * @param {Object} options
758
+ * @param {Function}
759
+ * @returns {this} for chaining
451
760
  * @api public
452
761
  */
453
762
 
454
- function AssertionError (options) {
455
- options = options || {};
456
- this.message = options.message;
457
- this.actual = options.actual;
458
- this.expected = options.expected;
459
- this.operator = options.operator;
460
- this.showDiff = options.showDiff;
461
-
462
- if (options.stackStartFunction && Error.captureStackTrace) {
463
- var stackStartFunction = options.stackStartFunction;
464
- Error.captureStackTrace(this, stackStartFunction);
763
+ exports.use = function (fn) {
764
+ if (!~used.indexOf(fn)) {
765
+ fn(this, util);
766
+ used.push(fn);
465
767
  }
466
- }
768
+
769
+ return this;
770
+ };
467
771
 
468
772
  /*!
469
- * Inherit from Error
773
+ * Primary `Assertion` prototype
470
774
  */
471
775
 
472
- AssertionError.prototype = Object.create(Error.prototype);
473
- AssertionError.prototype.name = 'AssertionError';
474
- AssertionError.prototype.constructor = AssertionError;
776
+ var assertion = require('./chai/assertion');
777
+ exports.use(assertion);
475
778
 
476
- /**
477
- * # toString()
478
- *
479
- * Override default to string method
779
+ /*!
780
+ * Core Assertions
781
+ */
782
+
783
+ var core = require('./chai/core/assertions');
784
+ exports.use(core);
785
+
786
+ /*!
787
+ * Expect interface
788
+ */
789
+
790
+ var expect = require('./chai/interface/expect');
791
+ exports.use(expect);
792
+
793
+ /*!
794
+ * Should interface
795
+ */
796
+
797
+ var should = require('./chai/interface/should');
798
+ exports.use(should);
799
+
800
+ /*!
801
+ * Assert interface
480
802
  */
481
803
 
482
- AssertionError.prototype.toString = function() {
483
- return this.message;
804
+ var assert = require('./chai/interface/assert');
805
+ exports.use(assert);
806
+
807
+ });
808
+ require.register("chai/lib/chai/assertion.js", function(exports, require, module){
809
+ /*!
810
+ * chai
811
+ * http://chaijs.com
812
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
813
+ * MIT Licensed
814
+ */
815
+
816
+ module.exports = function (_chai, util) {
817
+ /*!
818
+ * Module dependencies.
819
+ */
820
+
821
+ var AssertionError = _chai.AssertionError
822
+ , flag = util.flag;
823
+
824
+ /*!
825
+ * Module export.
826
+ */
827
+
828
+ _chai.Assertion = Assertion;
829
+
830
+ /*!
831
+ * Assertion Constructor
832
+ *
833
+ * Creates object for chaining.
834
+ *
835
+ * @api private
836
+ */
837
+
838
+ function Assertion (obj, msg, stack) {
839
+ flag(this, 'ssfi', stack || arguments.callee);
840
+ flag(this, 'object', obj);
841
+ flag(this, 'message', msg);
842
+ }
843
+
844
+ /*!
845
+ * ### Assertion.includeStack
846
+ *
847
+ * User configurable property, influences whether stack trace
848
+ * is included in Assertion error message. Default of false
849
+ * suppresses stack trace in the error message
850
+ *
851
+ * Assertion.includeStack = true; // enable stack on error
852
+ *
853
+ * @api public
854
+ */
855
+
856
+ Assertion.includeStack = false;
857
+
858
+ /*!
859
+ * ### Assertion.showDiff
860
+ *
861
+ * User configurable property, influences whether or not
862
+ * the `showDiff` flag should be included in the thrown
863
+ * AssertionErrors. `false` will always be `false`; `true`
864
+ * will be true when the assertion has requested a diff
865
+ * be shown.
866
+ *
867
+ * @api public
868
+ */
869
+
870
+ Assertion.showDiff = true;
871
+
872
+ Assertion.addProperty = function (name, fn) {
873
+ util.addProperty(this.prototype, name, fn);
874
+ };
875
+
876
+ Assertion.addMethod = function (name, fn) {
877
+ util.addMethod(this.prototype, name, fn);
878
+ };
879
+
880
+ Assertion.addChainableMethod = function (name, fn, chainingBehavior) {
881
+ util.addChainableMethod(this.prototype, name, fn, chainingBehavior);
882
+ };
883
+
884
+ Assertion.overwriteProperty = function (name, fn) {
885
+ util.overwriteProperty(this.prototype, name, fn);
886
+ };
887
+
888
+ Assertion.overwriteMethod = function (name, fn) {
889
+ util.overwriteMethod(this.prototype, name, fn);
890
+ };
891
+
892
+ Assertion.overwriteChainableMethod = function (name, fn, chainingBehavior) {
893
+ util.overwriteChainableMethod(this.prototype, name, fn, chainingBehavior);
894
+ };
895
+
896
+ /*!
897
+ * ### .assert(expression, message, negateMessage, expected, actual)
898
+ *
899
+ * Executes an expression and check expectations. Throws AssertionError for reporting if test doesn't pass.
900
+ *
901
+ * @name assert
902
+ * @param {Philosophical} expression to be tested
903
+ * @param {String} message to display if fails
904
+ * @param {String} negatedMessage to display if negated expression fails
905
+ * @param {Mixed} expected value (remember to check for negation)
906
+ * @param {Mixed} actual (optional) will default to `this.obj`
907
+ * @api private
908
+ */
909
+
910
+ Assertion.prototype.assert = function (expr, msg, negateMsg, expected, _actual, showDiff) {
911
+ var ok = util.test(this, arguments);
912
+ if (true !== showDiff) showDiff = false;
913
+ if (true !== Assertion.showDiff) showDiff = false;
914
+
915
+ if (!ok) {
916
+ var msg = util.getMessage(this, arguments)
917
+ , actual = util.getActual(this, arguments);
918
+ throw new AssertionError(msg, {
919
+ actual: actual
920
+ , expected: expected
921
+ , showDiff: showDiff
922
+ }, (Assertion.includeStack) ? this.assert : flag(this, 'ssfi'));
923
+ }
924
+ };
925
+
926
+ /*!
927
+ * ### ._obj
928
+ *
929
+ * Quick reference to stored `actual` value for plugin developers.
930
+ *
931
+ * @api private
932
+ */
933
+
934
+ Object.defineProperty(Assertion.prototype, '_obj',
935
+ { get: function () {
936
+ return flag(this, 'object');
937
+ }
938
+ , set: function (val) {
939
+ flag(this, 'object', val);
940
+ }
941
+ });
484
942
  };
485
943
 
486
944
  });
@@ -488,7 +946,7 @@
488
946
  /*!
489
947
  * chai
490
948
  * http://chaijs.com
491
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
949
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
492
950
  * MIT Licensed
493
951
  */
494
952
 
@@ -500,7 +958,7 @@
500
958
  /**
501
959
  * ### Language Chains
502
960
  *
503
- * The following are provide as chainable getters to
961
+ * The following are provided as chainable getters to
504
962
  * improve the readability of your assertions. They
505
963
  * do not provide an testing capability unless they
506
964
  * have been overwritten by a plugin.
@@ -513,6 +971,7 @@
513
971
  * - is
514
972
  * - that
515
973
  * - and
974
+ * - has
516
975
  * - have
517
976
  * - with
518
977
  * - at
@@ -524,7 +983,7 @@
524
983
  */
525
984
 
526
985
  [ 'to', 'be', 'been'
527
- , 'is', 'and', 'have'
986
+ , 'is', 'and', 'has', 'have'
528
987
  , 'with', 'that', 'at'
529
988
  , 'of', 'same' ].forEach(function (chain) {
530
989
  Assertion.addProperty(chain, function () {
@@ -632,9 +1091,21 @@
632
1091
 
633
1092
  function include (val, msg) {
634
1093
  if (msg) flag(this, 'message', msg);
635
- var obj = flag(this, 'object')
1094
+ var obj = flag(this, 'object');
1095
+
1096
+ if (_.type(val) === 'object') {
1097
+ if (!flag(this, 'negate')) {
1098
+ for (var k in val) new Assertion(obj).property(k, val[k]);
1099
+ return;
1100
+ }
1101
+ var subset = {}
1102
+ for (var k in val) subset[k] = obj[k]
1103
+ var expected = _.eql(subset, val);
1104
+ } else {
1105
+ var expected = obj && ~obj.indexOf(val)
1106
+ }
636
1107
  this.assert(
637
- ~obj.indexOf(val)
1108
+ expected
638
1109
  , 'expected #{this} to include ' + _.inspect(val)
639
1110
  , 'expected #{this} to not include ' + _.inspect(val));
640
1111
  }
@@ -731,8 +1202,8 @@
731
1202
  *
732
1203
  * Asserts that the target is `undefined`.
733
1204
  *
734
- * expect(undefined).to.be.undefined;
735
- * expect(null).to.not.be.undefined;
1205
+ * expect(undefined).to.be.undefined;
1206
+ * expect(null).to.not.be.undefined;
736
1207
  *
737
1208
  * @name undefined
738
1209
  * @api public
@@ -1489,6 +1960,7 @@
1489
1960
  * @param {String|RegExp} expected error message
1490
1961
  * @param {String} message _optional_
1491
1962
  * @see https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error#Error_types
1963
+ * @returns error for chaining (null if no error)
1492
1964
  * @api public
1493
1965
  */
1494
1966
 
@@ -1513,7 +1985,10 @@
1513
1985
  constructor = null;
1514
1986
  errMsg = null;
1515
1987
  } else if (typeof constructor === 'function') {
1516
- name = (new constructor()).name;
1988
+ name = constructor.prototype.name || constructor.name;
1989
+ if (name === 'Error' && constructor !== Error) {
1990
+ name = (new constructor()).name;
1991
+ }
1517
1992
  } else {
1518
1993
  constructor = null;
1519
1994
  }
@@ -1527,12 +2002,14 @@
1527
2002
  err === desiredError
1528
2003
  , 'expected #{this} to throw #{exp} but #{act} was thrown'
1529
2004
  , 'expected #{this} to not throw #{exp}'
1530
- , desiredError
1531
- , err
2005
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
2006
+ , (err instanceof Error ? err.toString() : err)
1532
2007
  );
1533
2008
 
2009
+ flag(this, 'object', err);
1534
2010
  return this;
1535
2011
  }
2012
+
1536
2013
  // next, check constructor
1537
2014
  if (constructor) {
1538
2015
  this.assert(
@@ -1540,11 +2017,15 @@
1540
2017
  , 'expected #{this} to throw #{exp} but #{act} was thrown'
1541
2018
  , 'expected #{this} to not throw #{exp} but #{act} was thrown'
1542
2019
  , name
1543
- , err
2020
+ , (err instanceof Error ? err.toString() : err)
1544
2021
  );
1545
2022
 
1546
- if (!errMsg) return this;
2023
+ if (!errMsg) {
2024
+ flag(this, 'object', err);
2025
+ return this;
2026
+ }
1547
2027
  }
2028
+
1548
2029
  // next, check message
1549
2030
  var message = 'object' === _.type(err) && "message" in err
1550
2031
  ? err.message
@@ -1559,6 +2040,7 @@
1559
2040
  , message
1560
2041
  );
1561
2042
 
2043
+ flag(this, 'object', err);
1562
2044
  return this;
1563
2045
  } else if ((message != null) && errMsg && 'string' === typeof errMsg) {
1564
2046
  this.assert(
@@ -1569,6 +2051,7 @@
1569
2051
  , message
1570
2052
  );
1571
2053
 
2054
+ flag(this, 'object', err);
1572
2055
  return this;
1573
2056
  } else {
1574
2057
  thrown = true;
@@ -1591,9 +2074,11 @@
1591
2074
  thrown === true
1592
2075
  , 'expected #{this} to throw ' + expectedThrown + actuallyGot
1593
2076
  , 'expected #{this} to not throw ' + expectedThrown + actuallyGot
1594
- , desiredError
1595
- , thrownError
2077
+ , (desiredError instanceof Error ? desiredError.toString() : desiredError)
2078
+ , (thrownError instanceof Error ? thrownError.toString() : thrownError)
1596
2079
  );
2080
+
2081
+ flag(this, 'object', thrownError);
1597
2082
  };
1598
2083
 
1599
2084
  Assertion.addMethod('throw', assertThrows);
@@ -1612,8 +2097,8 @@
1612
2097
  * To check if a constructor will respond to a static function,
1613
2098
  * set the `itself` flag.
1614
2099
  *
1615
- * Klass.baz = function(){};
1616
- * expect(Klass).itself.to.respondTo('baz');
2100
+ * Klass.baz = function(){};
2101
+ * expect(Klass).itself.to.respondTo('baz');
1617
2102
  *
1618
2103
  * @name respondTo
1619
2104
  * @param {String} method
@@ -1641,12 +2126,12 @@
1641
2126
  *
1642
2127
  * Sets the `itself` flag, later used by the `respondTo` assertion.
1643
2128
  *
1644
- * function Foo() {}
1645
- * Foo.bar = function() {}
1646
- * Foo.prototype.baz = function() {}
2129
+ * function Foo() {}
2130
+ * Foo.bar = function() {}
2131
+ * Foo.prototype.baz = function() {}
1647
2132
  *
1648
- * expect(Foo).itself.to.respondTo('bar');
1649
- * expect(Foo).itself.not.to.respondTo('baz');
2133
+ * expect(Foo).itself.to.respondTo('bar');
2134
+ * expect(Foo).itself.not.to.respondTo('baz');
1650
2135
  *
1651
2136
  * @name itself
1652
2137
  * @api public
@@ -1712,16 +2197,16 @@
1712
2197
  }
1713
2198
 
1714
2199
  /**
1715
- * ### .members
2200
+ * ### .members(set)
1716
2201
  *
1717
2202
  * Asserts that the target is a superset of `set`,
1718
2203
  * or that the target and `set` have the same members.
1719
2204
  *
1720
- * expect([1, 2, 3]).to.include.members([3, 2]);
1721
- * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
2205
+ * expect([1, 2, 3]).to.include.members([3, 2]);
2206
+ * expect([1, 2, 3]).to.not.include.members([3, 2, 8]);
1722
2207
  *
1723
- * expect([4, 2]).to.have.members([2, 4]);
1724
- * expect([5, 2]).to.not.have.members([5, 2, 1]);
2208
+ * expect([4, 2]).to.have.members([2, 4]);
2209
+ * expect([5, 2]).to.not.have.members([5, 2, 1]);
1725
2210
  *
1726
2211
  * @name members
1727
2212
  * @param {Array} set
@@ -1760,7 +2245,7 @@
1760
2245
  require.register("chai/lib/chai/interface/assert.js", function(exports, require, module){
1761
2246
  /*!
1762
2247
  * chai
1763
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
2248
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
1764
2249
  * MIT Licensed
1765
2250
  */
1766
2251
 
@@ -1815,13 +2300,12 @@
1815
2300
  */
1816
2301
 
1817
2302
  assert.fail = function (actual, expected, message, operator) {
1818
- throw new chai.AssertionError({
2303
+ message = message || 'assert.fail()';
2304
+ throw new chai.AssertionError(message, {
1819
2305
  actual: actual
1820
2306
  , expected: expected
1821
- , message: message
1822
2307
  , operator: operator
1823
- , stackStartFunction: assert.fail
1824
- });
2308
+ }, assert.fail);
1825
2309
  };
1826
2310
 
1827
2311
  /**
@@ -1842,6 +2326,24 @@
1842
2326
  new Assertion(val, msg).is.ok;
1843
2327
  };
1844
2328
 
2329
+ /**
2330
+ * ### .notOk(object, [message])
2331
+ *
2332
+ * Asserts that `object` is falsy.
2333
+ *
2334
+ * assert.notOk('everything', 'this will fail');
2335
+ * assert.notOk(false, 'this will pass');
2336
+ *
2337
+ * @name notOk
2338
+ * @param {Mixed} object to test
2339
+ * @param {String} message
2340
+ * @api public
2341
+ */
2342
+
2343
+ assert.notOk = function (val, msg) {
2344
+ new Assertion(val, msg).is.not.ok;
2345
+ };
2346
+
1845
2347
  /**
1846
2348
  * ### .equal(actual, expected, [message])
1847
2349
  *
@@ -2399,18 +2901,7 @@
2399
2901
  */
2400
2902
 
2401
2903
  assert.include = function (exp, inc, msg) {
2402
- var obj = new Assertion(exp, msg);
2403
-
2404
- if (Array.isArray(exp)) {
2405
- obj.to.include(inc);
2406
- } else if ('string' === typeof exp) {
2407
- obj.to.contain.string(inc);
2408
- } else {
2409
- throw new chai.AssertionError({
2410
- message: 'expected an array or string'
2411
- , stackStartFunction: assert.include
2412
- });
2413
- }
2904
+ new Assertion(exp, msg).include(inc);
2414
2905
  };
2415
2906
 
2416
2907
  /**
@@ -2430,18 +2921,7 @@
2430
2921
  */
2431
2922
 
2432
2923
  assert.notInclude = function (exp, inc, msg) {
2433
- var obj = new Assertion(exp, msg);
2434
-
2435
- if (Array.isArray(exp)) {
2436
- obj.to.not.include(inc);
2437
- } else if ('string' === typeof exp) {
2438
- obj.to.not.contain.string(inc);
2439
- } else {
2440
- throw new chai.AssertionError({
2441
- message: 'expected an array or string'
2442
- , stackStartFunction: assert.include
2443
- });
2444
- }
2924
+ new Assertion(exp, msg).not.include(inc);
2445
2925
  };
2446
2926
 
2447
2927
  /**
@@ -2685,7 +3165,8 @@
2685
3165
  errt = null;
2686
3166
  }
2687
3167
 
2688
- new Assertion(fn, msg).to.Throw(errt, errs);
3168
+ var assertErr = new Assertion(fn, msg).to.Throw(errt, errs);
3169
+ return flag(assertErr, 'object');
2689
3170
  };
2690
3171
 
2691
3172
  /**
@@ -2823,7 +3304,7 @@
2823
3304
  require.register("chai/lib/chai/interface/expect.js", function(exports, require, module){
2824
3305
  /*!
2825
3306
  * chai
2826
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
3307
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
2827
3308
  * MIT Licensed
2828
3309
  */
2829
3310
 
@@ -2838,7 +3319,7 @@
2838
3319
  require.register("chai/lib/chai/interface/should.js", function(exports, require, module){
2839
3320
  /*!
2840
3321
  * chai
2841
- * Copyright(c) 2011-2013 Jake Luer <jake@alogicalparadox.com>
3322
+ * Copyright(c) 2011-2014 Jake Luer <jake@alogicalparadox.com>
2842
3323
  * MIT Licensed
2843
3324
  */
2844
3325
 
@@ -2917,7 +3398,7 @@
2917
3398
  require.register("chai/lib/chai/utils/addChainableMethod.js", function(exports, require, module){
2918
3399
  /*!
2919
3400
  * Chai - addChainingMethod utility
2920
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3401
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
2921
3402
  * MIT Licensed
2922
3403
  */
2923
3404
 
@@ -2972,15 +3453,27 @@
2972
3453
  */
2973
3454
 
2974
3455
  module.exports = function (ctx, name, method, chainingBehavior) {
2975
- if (typeof chainingBehavior !== 'function')
3456
+ if (typeof chainingBehavior !== 'function') {
2976
3457
  chainingBehavior = function () { };
3458
+ }
3459
+
3460
+ var chainableBehavior = {
3461
+ method: method
3462
+ , chainingBehavior: chainingBehavior
3463
+ };
3464
+
3465
+ // save the methods so we can overwrite them later, if we need to.
3466
+ if (!ctx.__methods) {
3467
+ ctx.__methods = {};
3468
+ }
3469
+ ctx.__methods[name] = chainableBehavior;
2977
3470
 
2978
3471
  Object.defineProperty(ctx, name,
2979
3472
  { get: function () {
2980
- chainingBehavior.call(this);
3473
+ chainableBehavior.chainingBehavior.call(this);
2981
3474
 
2982
3475
  var assert = function () {
2983
- var result = method.apply(this, arguments);
3476
+ var result = chainableBehavior.method.apply(this, arguments);
2984
3477
  return result === undefined ? this : result;
2985
3478
  };
2986
3479
 
@@ -3014,7 +3507,7 @@
3014
3507
  require.register("chai/lib/chai/utils/addMethod.js", function(exports, require, module){
3015
3508
  /*!
3016
3509
  * Chai - addMethod utility
3017
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3510
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3018
3511
  * MIT Licensed
3019
3512
  */
3020
3513
 
@@ -3054,7 +3547,7 @@
3054
3547
  require.register("chai/lib/chai/utils/addProperty.js", function(exports, require, module){
3055
3548
  /*!
3056
3549
  * Chai - addProperty utility
3057
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3550
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3058
3551
  * MIT Licensed
3059
3552
  */
3060
3553
 
@@ -3093,141 +3586,11 @@
3093
3586
  });
3094
3587
  };
3095
3588
 
3096
- });
3097
- require.register("chai/lib/chai/utils/eql.js", function(exports, require, module){
3098
- // This is (almost) directly from Node.js assert
3099
- // https://github.com/joyent/node/blob/f8c335d0caf47f16d31413f89aa28eda3878e3aa/lib/assert.js
3100
-
3101
- module.exports = _deepEqual;
3102
-
3103
- var getEnumerableProperties = require('./getEnumerableProperties');
3104
-
3105
- // for the browser
3106
- var Buffer;
3107
- try {
3108
- Buffer = require('buffer').Buffer;
3109
- } catch (ex) {
3110
- Buffer = {
3111
- isBuffer: function () { return false; }
3112
- };
3113
- }
3114
-
3115
- function _deepEqual(actual, expected, memos) {
3116
-
3117
- // 7.1. All identical values are equivalent, as determined by ===.
3118
- if (actual === expected) {
3119
- return true;
3120
-
3121
- } else if (Buffer.isBuffer(actual) && Buffer.isBuffer(expected)) {
3122
- if (actual.length != expected.length) return false;
3123
-
3124
- for (var i = 0; i < actual.length; i++) {
3125
- if (actual[i] !== expected[i]) return false;
3126
- }
3127
-
3128
- return true;
3129
-
3130
- // 7.2. If the expected value is a Date object, the actual value is
3131
- // equivalent if it is also a Date object that refers to the same time.
3132
- } else if (actual instanceof Date && expected instanceof Date) {
3133
- return actual.getTime() === expected.getTime();
3134
-
3135
- // 7.3. Other pairs that do not both pass typeof value == 'object',
3136
- // equivalence is determined by ==.
3137
- } else if (typeof actual != 'object' && typeof expected != 'object') {
3138
- return actual === expected;
3139
-
3140
- } else if (actual instanceof RegExp && expected instanceof RegExp){
3141
- return actual.toString() === expected.toString();
3142
-
3143
- // 7.4. For all other Object pairs, including Array objects, equivalence is
3144
- // determined by having the same number of owned properties (as verified
3145
- // with Object.prototype.hasOwnProperty.call), the same set of keys
3146
- // (although not necessarily the same order), equivalent values for every
3147
- // corresponding key, and an identical 'prototype' property. Note: this
3148
- // accounts for both named and indexed properties on Arrays.
3149
- } else {
3150
- return objEquiv(actual, expected, memos);
3151
- }
3152
- }
3153
-
3154
- function isUndefinedOrNull(value) {
3155
- return value === null || value === undefined;
3156
- }
3157
-
3158
- function isArguments(object) {
3159
- return Object.prototype.toString.call(object) == '[object Arguments]';
3160
- }
3161
-
3162
- function objEquiv(a, b, memos) {
3163
- if (isUndefinedOrNull(a) || isUndefinedOrNull(b))
3164
- return false;
3165
-
3166
- // an identical 'prototype' property.
3167
- if (a.prototype !== b.prototype) return false;
3168
-
3169
- // check if we have already compared a and b
3170
- var i;
3171
- if (memos) {
3172
- for(i = 0; i < memos.length; i++) {
3173
- if ((memos[i][0] === a && memos[i][1] === b) ||
3174
- (memos[i][0] === b && memos[i][1] === a))
3175
- return true;
3176
- }
3177
- } else {
3178
- memos = [];
3179
- }
3180
-
3181
- //~~~I've managed to break Object.keys through screwy arguments passing.
3182
- // Converting to array solves the problem.
3183
- if (isArguments(a)) {
3184
- if (!isArguments(b)) {
3185
- return false;
3186
- }
3187
- a = pSlice.call(a);
3188
- b = pSlice.call(b);
3189
- return _deepEqual(a, b, memos);
3190
- }
3191
- try {
3192
- var ka = getEnumerableProperties(a),
3193
- kb = getEnumerableProperties(b),
3194
- key;
3195
- } catch (e) {//happens when one is a string literal and the other isn't
3196
- return false;
3197
- }
3198
-
3199
- // having the same number of owned properties (keys incorporates
3200
- // hasOwnProperty)
3201
- if (ka.length != kb.length)
3202
- return false;
3203
-
3204
- //the same set of keys (although not necessarily the same order),
3205
- ka.sort();
3206
- kb.sort();
3207
- //~~~cheap key test
3208
- for (i = ka.length - 1; i >= 0; i--) {
3209
- if (ka[i] != kb[i])
3210
- return false;
3211
- }
3212
-
3213
- // remember objects we have compared to guard against circular references
3214
- memos.push([ a, b ]);
3215
-
3216
- //equivalent values for every corresponding key, and
3217
- //~~~possibly expensive deep test
3218
- for (i = ka.length - 1; i >= 0; i--) {
3219
- key = ka[i];
3220
- if (!_deepEqual(a[key], b[key], memos)) return false;
3221
- }
3222
-
3223
- return true;
3224
- }
3225
-
3226
3589
  });
3227
3590
  require.register("chai/lib/chai/utils/flag.js", function(exports, require, module){
3228
3591
  /*!
3229
3592
  * Chai - flag utility
3230
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3593
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3231
3594
  * MIT Licensed
3232
3595
  */
3233
3596
 
@@ -3262,7 +3625,7 @@
3262
3625
  require.register("chai/lib/chai/utils/getActual.js", function(exports, require, module){
3263
3626
  /*!
3264
3627
  * Chai - getActual utility
3265
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3628
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3266
3629
  * MIT Licensed
3267
3630
  */
3268
3631
 
@@ -3284,7 +3647,7 @@
3284
3647
  require.register("chai/lib/chai/utils/getEnumerableProperties.js", function(exports, require, module){
3285
3648
  /*!
3286
3649
  * Chai - getEnumerableProperties utility
3287
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3650
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3288
3651
  * MIT Licensed
3289
3652
  */
3290
3653
 
@@ -3312,7 +3675,7 @@
3312
3675
  require.register("chai/lib/chai/utils/getMessage.js", function(exports, require, module){
3313
3676
  /*!
3314
3677
  * Chai - message composition utility
3315
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3678
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3316
3679
  * MIT Licensed
3317
3680
  */
3318
3681
 
@@ -3332,7 +3695,7 @@
3332
3695
  * and template tags. Template tags will return
3333
3696
  * a stringified inspection of the object referenced.
3334
3697
  *
3335
- * Messsage template tags:
3698
+ * Message template tags:
3336
3699
  * - `#{this}` current asserted object
3337
3700
  * - `#{act}` actual value
3338
3701
  * - `#{exp}` expected value
@@ -3364,7 +3727,7 @@
3364
3727
  require.register("chai/lib/chai/utils/getName.js", function(exports, require, module){
3365
3728
  /*!
3366
3729
  * Chai - getName utility
3367
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3730
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3368
3731
  * MIT Licensed
3369
3732
  */
3370
3733
 
@@ -3387,7 +3750,7 @@
3387
3750
  require.register("chai/lib/chai/utils/getPathValue.js", function(exports, require, module){
3388
3751
  /*!
3389
3752
  * Chai - getPathValue utility
3390
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3753
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3391
3754
  * @see https://github.com/logicalparadox/filtr
3392
3755
  * MIT Licensed
3393
3756
  */
@@ -3492,7 +3855,7 @@
3492
3855
  require.register("chai/lib/chai/utils/getProperties.js", function(exports, require, module){
3493
3856
  /*!
3494
3857
  * Chai - getProperties utility
3495
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
3858
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3496
3859
  * MIT Licensed
3497
3860
  */
3498
3861
 
@@ -3592,7 +3955,7 @@
3592
3955
  * Deep equal utility
3593
3956
  */
3594
3957
 
3595
- exports.eql = require('./eql');
3958
+ exports.eql = require('deep-eql');
3596
3959
 
3597
3960
  /*!
3598
3961
  * Deep path value
@@ -3636,6 +3999,12 @@
3636
3999
 
3637
4000
  exports.addChainableMethod = require('./addChainableMethod');
3638
4001
 
4002
+ /*!
4003
+ * Overwrite chainable method
4004
+ */
4005
+
4006
+ exports.overwriteChainableMethod = require('./overwriteChainableMethod');
4007
+
3639
4008
 
3640
4009
  });
3641
4010
  require.register("chai/lib/chai/utils/inspect.js", function(exports, require, module){
@@ -3706,7 +4075,11 @@
3706
4075
  value.inspect !== exports.inspect &&
3707
4076
  // Also filter out any prototype objects using the circular check.
3708
4077
  !(value.constructor && value.constructor.prototype === value)) {
3709
- return value.inspect(recurseTimes);
4078
+ var ret = value.inspect(recurseTimes);
4079
+ if (typeof ret !== 'string') {
4080
+ ret = formatValue(ctx, ret, recurseTimes);
4081
+ }
4082
+ return ret;
3710
4083
  }
3711
4084
 
3712
4085
  // Primitive types cannot have properties
@@ -3960,7 +4333,7 @@
3960
4333
  require.register("chai/lib/chai/utils/objDisplay.js", function(exports, require, module){
3961
4334
  /*!
3962
4335
  * Chai - flag utility
3963
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4336
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
3964
4337
  * MIT Licensed
3965
4338
  */
3966
4339
 
@@ -4011,7 +4384,7 @@
4011
4384
  require.register("chai/lib/chai/utils/overwriteMethod.js", function(exports, require, module){
4012
4385
  /*!
4013
4386
  * Chai - overwriteMethod utility
4014
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4387
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4015
4388
  * MIT Licensed
4016
4389
  */
4017
4390
 
@@ -4065,7 +4438,7 @@
4065
4438
  require.register("chai/lib/chai/utils/overwriteProperty.js", function(exports, require, module){
4066
4439
  /*!
4067
4440
  * Chai - overwriteProperty utility
4068
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4441
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4069
4442
  * MIT Licensed
4070
4443
  */
4071
4444
 
@@ -4118,11 +4491,67 @@
4118
4491
  });
4119
4492
  };
4120
4493
 
4494
+ });
4495
+ require.register("chai/lib/chai/utils/overwriteChainableMethod.js", function(exports, require, module){
4496
+ /*!
4497
+ * Chai - overwriteChainableMethod utility
4498
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4499
+ * MIT Licensed
4500
+ */
4501
+
4502
+ /**
4503
+ * ### overwriteChainableMethod (ctx, name, fn)
4504
+ *
4505
+ * Overwites an already existing chainable method
4506
+ * and provides access to the previous function or
4507
+ * property. Must return functions to be used for
4508
+ * name.
4509
+ *
4510
+ * utils.overwriteChainableMethod(chai.Assertion.prototype, 'length',
4511
+ * function (_super) {
4512
+ * }
4513
+ * , function (_super) {
4514
+ * }
4515
+ * );
4516
+ *
4517
+ * Can also be accessed directly from `chai.Assertion`.
4518
+ *
4519
+ * chai.Assertion.overwriteChainableMethod('foo', fn, fn);
4520
+ *
4521
+ * Then can be used as any other assertion.
4522
+ *
4523
+ * expect(myFoo).to.have.length(3);
4524
+ * expect(myFoo).to.have.length.above(3);
4525
+ *
4526
+ * @param {Object} ctx object whose method / property is to be overwritten
4527
+ * @param {String} name of method / property to overwrite
4528
+ * @param {Function} method function that returns a function to be used for name
4529
+ * @param {Function} chainingBehavior function that returns a function to be used for property
4530
+ * @name overwriteChainableMethod
4531
+ * @api public
4532
+ */
4533
+
4534
+ module.exports = function (ctx, name, method, chainingBehavior) {
4535
+ var chainableBehavior = ctx.__methods[name];
4536
+
4537
+ var _chainingBehavior = chainableBehavior.chainingBehavior;
4538
+ chainableBehavior.chainingBehavior = function () {
4539
+ var result = chainingBehavior(_chainingBehavior).call(this);
4540
+ return result === undefined ? this : result;
4541
+ };
4542
+
4543
+ var _method = chainableBehavior.method;
4544
+ chainableBehavior.method = function () {
4545
+ var result = method(_method).apply(this, arguments);
4546
+ return result === undefined ? this : result;
4547
+ };
4548
+ };
4549
+
4121
4550
  });
4122
4551
  require.register("chai/lib/chai/utils/test.js", function(exports, require, module){
4123
4552
  /*!
4124
4553
  * Chai - test utility
4125
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4554
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4126
4555
  * MIT Licensed
4127
4556
  */
4128
4557
 
@@ -4151,7 +4580,7 @@
4151
4580
  require.register("chai/lib/chai/utils/transferFlags.js", function(exports, require, module){
4152
4581
  /*!
4153
4582
  * Chai - transferFlags utility
4154
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4583
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4155
4584
  * MIT Licensed
4156
4585
  */
4157
4586
 
@@ -4198,7 +4627,7 @@
4198
4627
  require.register("chai/lib/chai/utils/type.js", function(exports, require, module){
4199
4628
  /*!
4200
4629
  * Chai - type utility
4201
- * Copyright(c) 2012-2013 Jake Luer <jake@alogicalparadox.com>
4630
+ * Copyright(c) 2012-2014 Jake Luer <jake@alogicalparadox.com>
4202
4631
  * MIT Licensed
4203
4632
  */
4204
4633
 
@@ -4243,12 +4672,25 @@
4243
4672
  };
4244
4673
 
4245
4674
  });
4246
- require.alias("chai/index.js", "chai/index.js");
4247
4675
 
4248
- if (typeof exports == "object") {
4676
+
4677
+
4678
+
4679
+ require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js");
4680
+ require.alias("chaijs-assertion-error/index.js", "chai/deps/assertion-error/index.js");
4681
+ require.alias("chaijs-assertion-error/index.js", "assertion-error/index.js");
4682
+ require.alias("chaijs-assertion-error/index.js", "chaijs-assertion-error/index.js");
4683
+ require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/lib/eql.js");
4684
+ require.alias("chaijs-deep-eql/lib/eql.js", "chai/deps/deep-eql/index.js");
4685
+ require.alias("chaijs-deep-eql/lib/eql.js", "deep-eql/index.js");
4686
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/lib/type.js");
4687
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-deep-eql/deps/type-detect/index.js");
4688
+ require.alias("chaijs-type-detect/lib/type.js", "chaijs-type-detect/index.js");
4689
+ require.alias("chaijs-deep-eql/lib/eql.js", "chaijs-deep-eql/index.js");
4690
+ require.alias("chai/index.js", "chai/index.js");if (typeof exports == "object") {
4249
4691
  module.exports = require("chai");
4250
4692
  } else if (typeof define == "function" && define.amd) {
4251
- define(function(){ return require("chai"); });
4693
+ define([], function(){ return require("chai"); });
4252
4694
  } else {
4253
4695
  this["chai"] = require("chai");
4254
4696
  }})();