create-formatter.js 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. 'use strict';
  2. var assign = require('core-js/library/fn/object/assign');
  3. var ContextTraversal = require('power-assert-context-traversal');
  4. var LegacyContextTraversal = require('./legacy-context-traversal');
  5. var StringWriter = require('./string-writer');
  6. var defaultOptions = require('./default-options');
  7. var reduce = require('core-js/library/fn/array/reduce');
  8. /**
  9. * options.reducers [array]
  10. * options.renderers [array]
  11. * options.outputOffset [number]
  12. * options.lineSeparator [string]
  13. * options.legacy [boolean]
  14. */
  15. function createFormatter (options) {
  16. var formatterConfig = assign({}, defaultOptions(), options);
  17. var reducers = formatterConfig.reducers || [];
  18. var rendererConfigs = formatterConfig.renderers;
  19. var len = rendererConfigs.length;
  20. return function (powerAssertContext) {
  21. var context = reduce(reducers, function (prevContext, reducer) {
  22. return reducer(prevContext);
  23. }, powerAssertContext);
  24. var writer = new StringWriter(formatterConfig);
  25. var traversal;
  26. if (formatterConfig.legacy) {
  27. traversal = new LegacyContextTraversal(context);
  28. traversal.setWritable(writer);
  29. } else {
  30. traversal = new ContextTraversal(context);
  31. }
  32. for (var i = 0; i < len; i += 1) {
  33. var RendererClass;
  34. var renderer;
  35. var config = rendererConfigs[i];
  36. if (typeof config === 'object') {
  37. RendererClass = config.ctor;
  38. renderer = new RendererClass(config.options);
  39. } else if (typeof config === 'function') {
  40. RendererClass = config;
  41. renderer = new RendererClass();
  42. }
  43. renderer.init(traversal);
  44. if (typeof renderer.setWritable === 'function') {
  45. renderer.setWritable(writer);
  46. }
  47. }
  48. traversal.traverse();
  49. writer.write('');
  50. return writer.toString();
  51. };
  52. }
  53. createFormatter.StringWriter = StringWriter;
  54. module.exports = createFormatter;