36 lines
880 B
JavaScript
36 lines
880 B
JavaScript
|
'use strict';
|
||
|
const deburr = require('lodash.deburr');
|
||
|
const escapeStringRegexp = require('escape-string-regexp');
|
||
|
const builtinReplacements = require('./replacements');
|
||
|
|
||
|
const doCustomReplacements = (string, replacements) => {
|
||
|
for (const [key, value] of replacements) {
|
||
|
// TODO: Use `String#replaceAll()` when targeting Node.js 16.
|
||
|
string = string.replace(new RegExp(escapeStringRegexp(key), 'g'), value);
|
||
|
}
|
||
|
|
||
|
return string;
|
||
|
};
|
||
|
|
||
|
module.exports = (string, options) => {
|
||
|
if (typeof string !== 'string') {
|
||
|
throw new TypeError(`Expected a string, got \`${typeof string}\``);
|
||
|
}
|
||
|
|
||
|
options = {
|
||
|
customReplacements: [],
|
||
|
...options
|
||
|
};
|
||
|
|
||
|
const customReplacements = new Map([
|
||
|
...builtinReplacements,
|
||
|
...options.customReplacements
|
||
|
]);
|
||
|
|
||
|
string = string.normalize();
|
||
|
string = doCustomReplacements(string, customReplacements);
|
||
|
string = deburr(string);
|
||
|
|
||
|
return string;
|
||
|
};
|