62 lines
1.8 KiB
JavaScript
62 lines
1.8 KiB
JavaScript
|
/**
|
||
|
* @typedef Options
|
||
|
* Configuration.
|
||
|
* @property {boolean | null | undefined} [jsx=false]
|
||
|
* Support JSX identifiers (default: `false`).
|
||
|
*/
|
||
|
|
||
|
const startRe = /[$_\p{ID_Start}]/u
|
||
|
const contRe = /[$_\u{200C}\u{200D}\p{ID_Continue}]/u
|
||
|
const contReJsx = /[-$_\u{200C}\u{200D}\p{ID_Continue}]/u
|
||
|
const nameRe = /^[$_\p{ID_Start}][$_\u{200C}\u{200D}\p{ID_Continue}]*$/u
|
||
|
const nameReJsx = /^[$_\p{ID_Start}][-$_\u{200C}\u{200D}\p{ID_Continue}]*$/u
|
||
|
|
||
|
/** @type {Options} */
|
||
|
const emptyOptions = {}
|
||
|
|
||
|
/**
|
||
|
* Checks if the given code point can start an identifier.
|
||
|
*
|
||
|
* @param {number | undefined} code
|
||
|
* Code point to check.
|
||
|
* @returns {boolean}
|
||
|
* Whether `code` can start an identifier.
|
||
|
*/
|
||
|
// Note: `undefined` is supported so you can pass the result from `''.codePointAt`.
|
||
|
export function start(code) {
|
||
|
return code ? startRe.test(String.fromCodePoint(code)) : false
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the given code point can continue an identifier.
|
||
|
*
|
||
|
* @param {number | undefined} code
|
||
|
* Code point to check.
|
||
|
* @param {Options | null | undefined} [options]
|
||
|
* Configuration (optional).
|
||
|
* @returns {boolean}
|
||
|
* Whether `code` can continue an identifier.
|
||
|
*/
|
||
|
// Note: `undefined` is supported so you can pass the result from `''.codePointAt`.
|
||
|
export function cont(code, options) {
|
||
|
const settings = options || emptyOptions
|
||
|
const re = settings.jsx ? contReJsx : contRe
|
||
|
return code ? re.test(String.fromCodePoint(code)) : false
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Checks if the given value is a valid identifier name.
|
||
|
*
|
||
|
* @param {string} name
|
||
|
* Identifier to check.
|
||
|
* @param {Options | null | undefined} [options]
|
||
|
* Configuration (optional).
|
||
|
* @returns {boolean}
|
||
|
* Whether `name` can be an identifier.
|
||
|
*/
|
||
|
export function name(name, options) {
|
||
|
const settings = options || emptyOptions
|
||
|
const re = settings.jsx ? nameReJsx : nameRe
|
||
|
return re.test(name)
|
||
|
}
|