diff --git a/scripts/browser-smoke.html b/scripts/browser-smoke.html
index 8cfc21c..ceedb76 100644
--- a/scripts/browser-smoke.html
+++ b/scripts/browser-smoke.html
@@ -42,6 +42,7 @@
getTimestamp,
id,
isId,
+ parseId,
sortableId,
template,
} from "../dist/index.js";
@@ -56,6 +57,25 @@
if (!isId(uid, "user")) throw new Error("id() failed");
lines.push(`id("user") -> ${uid}`);
lines.push(`getPrefix(...) -> ${getPrefix(uid)}`);
+
+ const parsed = parseId(uid);
+ if (
+ !parsed ||
+ parsed.prefix !== "user" ||
+ parsed.id !== uid.substring(5)
+ ) {
+ throw new Error("parseId() round-trip failed");
+ }
+ if (parseId("nosep") !== undefined) {
+ throw new Error("parseId() nosep failed");
+ }
+ if (parseId(null) !== undefined) {
+ throw new Error("parseId() null failed");
+ }
+ lines.push(
+ `parseId(...) -> { prefix: "${parsed.prefix}", id: "${parsed.id}" }`,
+ );
+
lines.push(
`createId({ size: 8 }) -> ${createId({ size: 8 })("order")}`,
);
diff --git a/scripts/smoke.cjs b/scripts/smoke.cjs
index f52e73b..fe89b49 100644
--- a/scripts/smoke.cjs
+++ b/scripts/smoke.cjs
@@ -1,6 +1,7 @@
const {
id,
isId,
+ parseId,
getPrefix,
sortableId,
getTimestamp,
@@ -15,6 +16,24 @@ if (!isId(uid, "user") || getPrefix(uid) !== "user") {
process.exit(1);
}
+const parsed = parseId(uid);
+if (!parsed || parsed.prefix !== "user" || parsed.id !== uid.substring(5)) {
+ console.error("smoke failed: parseId() should round-trip a generated id");
+ process.exit(1);
+}
+if (parseId("nosep") !== undefined) {
+ console.error(
+ "smoke failed: parseId() should return undefined when separator is missing",
+ );
+ process.exit(1);
+}
+if (parseId(null) !== undefined) {
+ console.error(
+ "smoke failed: parseId() should return undefined for non-string input",
+ );
+ process.exit(1);
+}
+
const sid = sortableId("evt");
if (
!isId(sid, "evt") ||
diff --git a/scripts/smoke.mjs b/scripts/smoke.mjs
index 0f307c8..9671033 100644
--- a/scripts/smoke.mjs
+++ b/scripts/smoke.mjs
@@ -9,6 +9,7 @@ import {
getTimestampOrThrow,
id,
isId,
+ parseId,
sortableId,
template,
} from "prefid";
@@ -30,6 +31,22 @@ const uid = id("user");
assert(isId(uid, "user"), "id() should produce a user_ id");
assert(getPrefix(uid) === "user", "getPrefix() should return the prefix");
+const parsed = parseId(uid);
+assert(
+ parsed !== undefined &&
+ parsed.prefix === "user" &&
+ parsed.id === uid.substring(5),
+ "parseId() should round-trip a generated id",
+);
+assert(
+ parseId("nosep") === undefined,
+ "parseId() should return undefined when separator is missing",
+);
+assert(
+ parseId(null) === undefined,
+ "parseId() should return undefined for non-string input",
+);
+
const short = createId({ size: 8 })("order");
assert(short.length === "order_".length + 8, "createId({ size }) length");