| 'use strict'; | 
| var FREEZING = require('../internals/freezing'); | 
| var $ = require('../internals/export'); | 
| var makeBuiltIn = require('../internals/make-built-in'); | 
| var uncurryThis = require('../internals/function-uncurry-this'); | 
| var apply = require('../internals/function-apply'); | 
| var anObject = require('../internals/an-object'); | 
| var toObject = require('../internals/to-object'); | 
| var isCallable = require('../internals/is-callable'); | 
| var lengthOfArrayLike = require('../internals/length-of-array-like'); | 
| var defineProperty = require('../internals/object-define-property').f; | 
| var createArrayFromList = require('../internals/array-slice'); | 
| var WeakMapHelpers = require('../internals/weak-map-helpers'); | 
| var cooked = require('../internals/string-cooked'); | 
| var parse = require('../internals/string-parse'); | 
| var whitespaces = require('../internals/whitespaces'); | 
|   | 
| var DedentMap = new WeakMapHelpers.WeakMap(); | 
| var weakMapGet = WeakMapHelpers.get; | 
| var weakMapHas = WeakMapHelpers.has; | 
| var weakMapSet = WeakMapHelpers.set; | 
|   | 
| var $Array = Array; | 
| var $TypeError = TypeError; | 
| // eslint-disable-next-line es/no-object-freeze -- safe | 
| var freeze = Object.freeze || Object; | 
| // eslint-disable-next-line es/no-object-isfrozen -- safe | 
| var isFrozen = Object.isFrozen; | 
| var min = Math.min; | 
| var charAt = uncurryThis(''.charAt); | 
| var stringSlice = uncurryThis(''.slice); | 
| var split = uncurryThis(''.split); | 
| var exec = uncurryThis(/./.exec); | 
|   | 
| var NEW_LINE = /([\n\u2028\u2029]|\r\n?)/g; | 
| var LEADING_WHITESPACE = RegExp('^[' + whitespaces + ']*'); | 
| var NON_WHITESPACE = RegExp('[^' + whitespaces + ']'); | 
| var INVALID_TAG = 'Invalid tag'; | 
| var INVALID_OPENING_LINE = 'Invalid opening line'; | 
| var INVALID_CLOSING_LINE = 'Invalid closing line'; | 
|   | 
| var dedentTemplateStringsArray = function (template) { | 
|   var rawInput = template.raw; | 
|   // https://github.com/tc39/proposal-string-dedent/issues/75 | 
|   if (FREEZING && !isFrozen(rawInput)) throw new $TypeError('Raw template should be frozen'); | 
|   if (weakMapHas(DedentMap, rawInput)) return weakMapGet(DedentMap, rawInput); | 
|   var raw = dedentStringsArray(rawInput); | 
|   var cookedArr = cookStrings(raw); | 
|   defineProperty(cookedArr, 'raw', { | 
|     value: freeze(raw) | 
|   }); | 
|   freeze(cookedArr); | 
|   weakMapSet(DedentMap, rawInput, cookedArr); | 
|   return cookedArr; | 
| }; | 
|   | 
| var dedentStringsArray = function (template) { | 
|   var t = toObject(template); | 
|   var length = lengthOfArrayLike(t); | 
|   var blocks = $Array(length); | 
|   var dedented = $Array(length); | 
|   var i = 0; | 
|   var lines, common, quasi, k; | 
|   | 
|   if (!length) throw new $TypeError(INVALID_TAG); | 
|   | 
|   for (; i < length; i++) { | 
|     var element = t[i]; | 
|     if (typeof element == 'string') blocks[i] = split(element, NEW_LINE); | 
|     else throw new $TypeError(INVALID_TAG); | 
|   } | 
|   | 
|   for (i = 0; i < length; i++) { | 
|     var lastSplit = i + 1 === length; | 
|     lines = blocks[i]; | 
|     if (i === 0) { | 
|       if (lines.length === 1 || lines[0].length > 0) { | 
|         throw new $TypeError(INVALID_OPENING_LINE); | 
|       } | 
|       lines[1] = ''; | 
|     } | 
|     if (lastSplit) { | 
|       if (lines.length === 1 || exec(NON_WHITESPACE, lines[lines.length - 1])) { | 
|         throw new $TypeError(INVALID_CLOSING_LINE); | 
|       } | 
|       lines[lines.length - 2] = ''; | 
|       lines[lines.length - 1] = ''; | 
|     } | 
|     // eslint-disable-next-line sonarjs/no-redundant-assignments -- false positive, https://github.com/SonarSource/SonarJS/issues/4767 | 
|     for (var j = 2; j < lines.length; j += 2) { | 
|       var text = lines[j]; | 
|       var lineContainsTemplateExpression = j + 1 === lines.length && !lastSplit; | 
|       var leading = exec(LEADING_WHITESPACE, text)[0]; | 
|       if (!lineContainsTemplateExpression && leading.length === text.length) { | 
|         lines[j] = ''; | 
|         continue; | 
|       } | 
|       common = commonLeadingIndentation(leading, common); | 
|     } | 
|   } | 
|   | 
|   var count = common ? common.length : 0; | 
|   | 
|   for (i = 0; i < length; i++) { | 
|     lines = blocks[i]; | 
|     quasi = lines[0]; | 
|     k = 1; | 
|     for (; k < lines.length; k += 2) { | 
|       quasi += lines[k] + stringSlice(lines[k + 1], count); | 
|     } | 
|     dedented[i] = quasi; | 
|   } | 
|   | 
|   return dedented; | 
| }; | 
|   | 
| var commonLeadingIndentation = function (a, b) { | 
|   if (b === undefined || a === b) return a; | 
|   var i = 0; | 
|   for (var len = min(a.length, b.length); i < len; i++) { | 
|     if (charAt(a, i) !== charAt(b, i)) break; | 
|   } | 
|   return stringSlice(a, 0, i); | 
| }; | 
|   | 
| var cookStrings = function (raw) { | 
|   var i = 0; | 
|   var length = raw.length; | 
|   var result = $Array(length); | 
|   for (; i < length; i++) { | 
|     result[i] = parse(raw[i]); | 
|   } return result; | 
| }; | 
|   | 
| var makeDedentTag = function (tag) { | 
|   return makeBuiltIn(function (template /* , ...substitutions */) { | 
|     var args = createArrayFromList(arguments); | 
|     args[0] = dedentTemplateStringsArray(anObject(template)); | 
|     return apply(tag, this, args); | 
|   }, ''); | 
| }; | 
|   | 
| var cookedDedentTag = makeDedentTag(cooked); | 
|   | 
| // `String.dedent` method | 
| // https://github.com/tc39/proposal-string-dedent | 
| $({ target: 'String', stat: true, forced: true }, { | 
|   dedent: function dedent(templateOrFn /* , ...substitutions */) { | 
|     anObject(templateOrFn); | 
|     if (isCallable(templateOrFn)) return makeDedentTag(templateOrFn); | 
|     return apply(cookedDedentTag, this, arguments); | 
|   } | 
| }); |