is-char
v1.1.11
Published
Check if a value is exactly one JavaScript UTF-16 code unit.
Maintainers
Readme
is-char
is-char is a focused utility for one job: checking whether a value is exactly one JavaScript UTF-16 code unit.
In many codebases, this check appears in validators, parsers, CLIs, text filters, and protocol handlers. Keeping it in a dedicated package makes that intent explicit and reusable across projects.
Why this package matters
- It standardizes a common validation rule used in input boundaries.
- It removes repeated ad-hoc checks from application code.
- It keeps behavior consistent across services and libraries.
- It is minimal, dependency-free, and safe to use in performance-sensitive paths.
Install
npm
npm i is-charJSR
npx jsr add @arvid/is-charUsage
import isChar from "is-char";
isChar("a"); // true
isChar("ab"); // false
isChar(""); // false
isChar(1); // false
isChar("a", { is: "a" }); // true
isChar("a", { is: "b" }); // falseAPI
isChar(value)
Returns true when:
valueis a stringvalue.length === 1
Otherwise returns false.
isChar(value, { is })
If is is provided, isChar returns true only when:
valueis a single UTF-16 code unit stringisis a single UTF-16 code unit stringvalue === is
An omitted is value, or is: undefined, applies no matching constraint. Other invalid is values return false.
Character semantics
is-char deliberately uses JavaScript's simple string-length rule:
typeof value === "string" && value.length === 1In this package, a char means exactly one UTF-16 code unit. This is not the same as a Unicode code point or a user-perceived grapheme cluster.
| Input | UTF-16 code units | Result |
| --- | ---: | --- |
| "a" | 1 | true |
| "é" | 1 | true |
| "e\\u0301" | 2 | false |
| "😀" | 2 | false |
| "ab" | 2 | false |
"e\\u0301" contains the letter e followed by a combining acute accent. It may be displayed as one user-perceived character, but it contains two UTF-16 code units, so this package returns false.
Astral characters and multi-code-unit sequences, including many emoji, return false. Single-code-unit symbols such as "♥" return true.
This package does not normalize strings, combine grapheme clusters, identify emoji, or coerce non-string values.
JSR and Deno
For npm, Node.js, and bundlers:
import isChar from "is-char";For Deno through JSR:
import isChar from "jsr:@arvid/is-char";Browser usage
The package is browser-compatible because the implementation is dependency-free and uses only standard JavaScript string operations. It does not access Node.js APIs, the filesystem, or the DOM.
With a bundler
Install the package and import it as an ESM module:
npm i is-charimport isChar from "is-char";
const input = document.querySelector("input").value;
const valid = isChar(input);The package's exports entry points directly to its ESM implementation, so
modern bundlers can include it in browser builds.
Direct browser import from a CDN
For a browser that supports JavaScript modules, import the published package through a CDN:
<script type="module">
import isChar from "https://cdn.jsdelivr.net/npm/is-char/index.js";
const value = document.querySelector("input").value;
document.querySelector("#result").textContent = String(isChar(value));
</script>For JSR users, an ESM CDN such as esm.sh can expose the JSR package to a browser:
<script type="module">
import isChar from "https://esm.sh/jsr/@arvid/is-char";
console.log(isChar("a"));
</script>Browser support depends on the browser supporting JavaScript modules. The package itself does not require a framework, bundler, polyfill, or runtime adapter.
TypeScript
import isChar from "is-char";
const value: unknown = "x";
if (isChar(value)) {
console.log(`Single UTF-16 code unit: ${value}`);
}Type definitions are included out of the box.
