index.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. /**
  2. * empower-core - Power Assert feature enhancer for assert function/object.
  3. *
  4. * https://github.com/twada/power-assert-runtime/packages/empower-core
  5. *
  6. * Copyright (c) 2013-2018 Takuto Wada
  7. * Licensed under the MIT license.
  8. * https://github.com/twada/power-assert-runtime/blob/master/LICENSE
  9. */
  10. var create = require('core-js/library/fn/object/create');
  11. var assign = require('core-js/library/fn/object/assign');
  12. var defaultOptions = require('./lib/default-options');
  13. var Decorator = require('./lib/decorator');
  14. var define = require('./lib/define-properties');
  15. var slice = Array.prototype.slice;
  16. /**
  17. * Enhance Power Assert feature to assert function/object.
  18. * @param assert target assert function or object to enhance
  19. * @param options enhancement options
  20. * @return enhanced assert function/object
  21. */
  22. function empowerCore (assert, options) {
  23. var typeOfAssert = (typeof assert);
  24. var enhancedAssert;
  25. if ((typeOfAssert !== 'object' && typeOfAssert !== 'function') || assert === null) {
  26. throw new TypeError('empower-core argument should be a function or object.');
  27. }
  28. if (isEmpowered(assert)) {
  29. return assert;
  30. }
  31. switch (typeOfAssert) {
  32. case 'function':
  33. enhancedAssert = empowerAssertFunction(assert, options);
  34. break;
  35. case 'object':
  36. enhancedAssert = empowerAssertObject(assert, options);
  37. break;
  38. default:
  39. throw new Error('Cannot be here');
  40. }
  41. define(enhancedAssert, { _empowered: true });
  42. return enhancedAssert;
  43. }
  44. function empowerAssertObject (assertObject, options) {
  45. var config = assign(defaultOptions(), options);
  46. var target = config.destructive ? assertObject : create(assertObject);
  47. var decorator = new Decorator(target, config);
  48. return assign(target, decorator.enhancement());
  49. }
  50. function empowerAssertFunction (assertFunction, options) {
  51. var config = assign(defaultOptions(), options);
  52. if (config.destructive) {
  53. throw new Error('cannot use destructive:true to function.');
  54. }
  55. var decorator = new Decorator(assertFunction, config);
  56. var enhancement = decorator.enhancement();
  57. var powerAssert;
  58. if (typeof enhancement === 'function') {
  59. powerAssert = function powerAssert () {
  60. return enhancement.apply(null, slice.apply(arguments));
  61. };
  62. } else {
  63. powerAssert = function powerAssert () {
  64. return assertFunction.apply(null, slice.apply(arguments));
  65. };
  66. }
  67. assign(powerAssert, assertFunction);
  68. return assign(powerAssert, enhancement);
  69. }
  70. function isEmpowered (assertObjectOrFunction) {
  71. return assertObjectOrFunction._empowered;
  72. }
  73. empowerCore.defaultOptions = defaultOptions;
  74. module.exports = empowerCore;