UNPKG

6.46 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.outdent = void 0;
4// In the absence of a WeakSet or WeakMap implementation, don't break, but don't cache either.
5function noop() {
6 var args = [];
7 for (var _i = 0; _i < arguments.length; _i++) {
8 args[_i] = arguments[_i];
9 }
10}
11function 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 */
22function 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
34var hop = Object.prototype.hasOwnProperty;
35var has = function (obj, prop) {
36 return hop.call(obj, prop);
37};
38// Copy all own enumerable properties from source to target
39function 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}
47var reLeadingNewline = /^[ \t]*(?:\r\n|\r|\n)/;
48var reTrailingNewline = /(?:\r\n|\r|\n)[ \t]*$/;
49var reStartsWithNewlineOrIsEmpty = /^(?:[\r\n]|$)/;
50var reDetectIndentation = /(?:\r\n|\r|\n)([ \t]*)(?:[^ \t\r\n]|$)/;
51var reOnlyWhitespaceWithAtLeastOneNewline = /^[ \t]*[\r\n][ \t\r\n]*$/;
52function _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}
87function 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}
97function 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 */
106function 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}
155var defaultOutdent = createInstance({
156 trimLeadingNewline: true,
157 trimTrailingNewline: true,
158});
159exports.outdent = defaultOutdent;
160// Named exports. Simple and preferred.
161// import outdent from 'outdent';
162exports.default = defaultOutdent;
163if (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
\No newline at end of file