20 lines
710 B
JavaScript
20 lines
710 B
JavaScript
import reservedIdentifiers_ from 'reserved-identifiers';
|
|
import base62 from '@sindresorhus/base62';
|
|
|
|
const reservedIdentifiers = reservedIdentifiers_({includeGlobalProperties: true});
|
|
|
|
const encodeCodePoint = x => `$${base62.encodeInteger(x.codePointAt(0))}$`;
|
|
|
|
export default function toValidIdentifier(value) {
|
|
if (typeof value !== 'string') {
|
|
throw new TypeError(`Expected a string, got \`${typeof value}\`.`);
|
|
}
|
|
|
|
if (reservedIdentifiers.has(value)) {
|
|
// We prefix with underscore to avoid any potential conflicts with the Base62 encoded string.
|
|
return `$_${value}$`;
|
|
}
|
|
|
|
return value.replaceAll(/(?<!^)\P{ID_Continue}/gu, encodeCodePoint)
|
|
.replaceAll(/^[^_\p{ID_Start}]/gu, encodeCodePoint);
|
|
}
|