odin-js-fundamentals-part-5/node_modules/dedent/dist/dedent.js

67 lines
2.0 KiB
JavaScript
Raw Permalink Normal View History

2024-01-11 08:52:05 +00:00
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _default = createDedent({});
exports.default = _default;
function createDedent(options) {
dedent.withOptions = newOptions => createDedent({
...options,
...newOptions
});
return dedent;
function dedent(strings, ...values) {
const raw = typeof strings === "string" ? [strings] : strings.raw;
const {
escapeSpecialCharacters = Array.isArray(strings)
} = options;
// first, perform interpolation
let result = "";
for (let i = 0; i < raw.length; i++) {
let next = raw[i];
if (escapeSpecialCharacters) {
// handle escaped newlines, backticks, and interpolation characters
next = next.replace(/\\\n[ \t]*/g, "").replace(/\\`/g, "`").replace(/\\\$/g, "$").replace(/\\{/g, "{");
}
result += next;
if (i < values.length) {
// eslint-disable-next-line @typescript-eslint/restrict-plus-operands
result += values[i];
}
}
// now strip indentation
const lines = result.split("\n");
let mindent = null;
for (const l of lines) {
const m = l.match(/^(\s+)\S+/);
if (m) {
const indent = m[1].length;
if (!mindent) {
// this is the first indented line
mindent = indent;
} else {
mindent = Math.min(mindent, indent);
}
}
}
if (mindent !== null) {
const m = mindent; // appease TypeScript
result = lines
// https://github.com/typescript-eslint/typescript-eslint/issues/7140
// eslint-disable-next-line @typescript-eslint/prefer-string-starts-ends-with
.map(l => l[0] === " " || l[0] === "\t" ? l.slice(m) : l).join("\n");
}
return result
// dedent eats leading and trailing whitespace too
.trim()
// handle escaped newlines at the end to ensure they don't get stripped too
.replace(/\\n/g, "\n");
}
}
module.exports = exports.default;
module.exports.default = exports.default;