index.js 6.3 KB

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