index.js 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. // In the absence of a WeakSet or WeakMap implementation, don't break, but don't cache either.
  2. function noop() {
  3. var args = [];
  4. for (var _i = 0; _i < arguments.length; _i++) {
  5. args[_i] = arguments[_i];
  6. }
  7. }
  8. function createWeakMap() {
  9. if (typeof WeakMap !== "undefined") {
  10. return new WeakMap();
  11. }
  12. else {
  13. return fakeSetOrMap();
  14. }
  15. }
  16. /**
  17. * Creates and returns a no-op implementation of a WeakMap / WeakSet that never stores anything.
  18. */
  19. function fakeSetOrMap() {
  20. return {
  21. add: noop,
  22. delete: noop,
  23. get: noop,
  24. set: noop,
  25. has: function (k) {
  26. return false;
  27. },
  28. };
  29. }
  30. // Safe hasOwnProperty
  31. var hop = Object.prototype.hasOwnProperty;
  32. var has = function (obj, prop) {
  33. return hop.call(obj, prop);
  34. };
  35. // Copy all own enumerable properties from source to target
  36. function extend(target, source) {
  37. for (var prop in source) {
  38. if (has(source, prop)) {
  39. target[prop] = source[prop];
  40. }
  41. }
  42. return target;
  43. }
  44. var reLeadingNewline = /^[ \t]*(?:\r\n|\r|\n)/;
  45. var reTrailingNewline = /(?:\r\n|\r|\n)[ \t]*$/;
  46. var reStartsWithNewlineOrIsEmpty = /^(?:[\r\n]|$)/;
  47. var reDetectIndentation = /(?:\r\n|\r|\n)([ \t]*)(?:[^ \t\r\n]|$)/;
  48. var reOnlyWhitespaceWithAtLeastOneNewline = /^[ \t]*[\r\n][ \t\r\n]*$/;
  49. function _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options) {
  50. // If first interpolated value is a reference to outdent,
  51. // determine indentation level from the indentation of the interpolated value.
  52. var indentationLevel = 0;
  53. var match = strings[0].match(reDetectIndentation);
  54. if (match) {
  55. indentationLevel = match[1].length;
  56. }
  57. var reSource = "(\\r\\n|\\r|\\n).{0," + indentationLevel + "}";
  58. var reMatchIndent = new RegExp(reSource, "g");
  59. if (firstInterpolatedValueSetsIndentationLevel) {
  60. strings = strings.slice(1);
  61. }
  62. var newline = options.newline, trimLeadingNewline = options.trimLeadingNewline, trimTrailingNewline = options.trimTrailingNewline;
  63. var normalizeNewlines = typeof newline === "string";
  64. var l = strings.length;
  65. var outdentedStrings = strings.map(function (v, i) {
  66. // Remove leading indentation from all lines
  67. v = v.replace(reMatchIndent, "$1");
  68. // Trim a leading newline from the first string
  69. if (i === 0 && trimLeadingNewline) {
  70. v = v.replace(reLeadingNewline, "");
  71. }
  72. // Trim a trailing newline from the last string
  73. if (i === l - 1 && trimTrailingNewline) {
  74. v = v.replace(reTrailingNewline, "");
  75. }
  76. // Normalize newlines
  77. if (normalizeNewlines) {
  78. v = v.replace(/\r\n|\n|\r/g, function (_) { return newline; });
  79. }
  80. return v;
  81. });
  82. return outdentedStrings;
  83. }
  84. function concatStringsAndValues(strings, values) {
  85. var ret = "";
  86. for (var i = 0, l = strings.length; i < l; i++) {
  87. ret += strings[i];
  88. if (i < l - 1) {
  89. ret += values[i];
  90. }
  91. }
  92. return ret;
  93. }
  94. function isTemplateStringsArray(v) {
  95. return has(v, "raw") && has(v, "length");
  96. }
  97. /**
  98. * It is assumed that opts will not change. If this is a problem, clone your options object and pass the clone to
  99. * makeInstance
  100. * @param options
  101. * @return {outdent}
  102. */
  103. function createInstance(options) {
  104. /** Cache of pre-processed template literal arrays */
  105. var arrayAutoIndentCache = createWeakMap();
  106. /**
  107. * Cache of pre-processed template literal arrays, where first interpolated value is a reference to outdent,
  108. * before interpolated values are injected.
  109. */
  110. var arrayFirstInterpSetsIndentCache = createWeakMap();
  111. function outdent(stringsOrOptions) {
  112. var values = [];
  113. for (var _i = 1; _i < arguments.length; _i++) {
  114. values[_i - 1] = arguments[_i];
  115. }
  116. /* tslint:enable:no-shadowed-variable */
  117. if (isTemplateStringsArray(stringsOrOptions)) {
  118. var strings = stringsOrOptions;
  119. // Is first interpolated value a reference to outdent, alone on its own line, without any preceding non-whitespace?
  120. var firstInterpolatedValueSetsIndentationLevel = (values[0] === outdent || values[0] === defaultOutdent) &&
  121. reOnlyWhitespaceWithAtLeastOneNewline.test(strings[0]) &&
  122. reStartsWithNewlineOrIsEmpty.test(strings[1]);
  123. // Perform outdentation
  124. var cache = firstInterpolatedValueSetsIndentationLevel
  125. ? arrayFirstInterpSetsIndentCache
  126. : arrayAutoIndentCache;
  127. var renderedArray = cache.get(strings);
  128. if (!renderedArray) {
  129. renderedArray = _outdentArray(strings, firstInterpolatedValueSetsIndentationLevel, options);
  130. cache.set(strings, renderedArray);
  131. }
  132. /** If no interpolated values, skip concatenation step */
  133. if (values.length === 0) {
  134. return renderedArray[0];
  135. }
  136. /** Concatenate string literals with interpolated values */
  137. var rendered = concatStringsAndValues(renderedArray, firstInterpolatedValueSetsIndentationLevel ? values.slice(1) : values);
  138. return rendered;
  139. }
  140. else {
  141. // Create and return a new instance of outdent with the given options
  142. return createInstance(extend(extend({}, options), stringsOrOptions || {}));
  143. }
  144. }
  145. var fullOutdent = extend(outdent, {
  146. string: function (str) {
  147. return _outdentArray([str], false, options)[0];
  148. },
  149. });
  150. return fullOutdent;
  151. }
  152. var defaultOutdent = createInstance({
  153. trimLeadingNewline: true,
  154. trimTrailingNewline: true,
  155. });
  156. // Named exports. Simple and preferred.
  157. // import outdent from 'outdent';
  158. export default defaultOutdent;
  159. // import {outdent} from 'outdent';
  160. export { defaultOutdent as outdent };
  161. if (typeof module !== "undefined") {
  162. // In webpack harmony-modules environments, module.exports is read-only,
  163. // so we fail gracefully.
  164. try {
  165. module.exports = defaultOutdent;
  166. Object.defineProperty(defaultOutdent, "__esModule", { value: true });
  167. defaultOutdent.default = defaultOutdent;
  168. defaultOutdent.outdent = defaultOutdent;
  169. }
  170. catch (e) { }
  171. }
  172. //# sourceMappingURL=index.js.map