json-schema-library
Version:
Customizable and hackable json-validator and json-schema utilities for traversal, data generation and validation
42 lines (35 loc) • 1.29 kB
text/typescript
import { resolve } from "uri-js";
const suffixes = /(
const trailingHash = /
const isDomain = /^[^:]+:\/\/[^/]+\//;
const idAndPointer = /
/**
* Resolves a reference URI against a base URI.
* Uses fast-uri (RFC 3986 compliant) for most cases, with special handling for JSON Schema specifics.
*
* This replaces the custom joinId logic while leveraging the standards-compliant fast-uri library.
*
* @param base - The base URI (e.g., current scope $id)
* @param ref - The reference to resolve (e.g., $id, $ref, or json-pointer)
* @returns The resolved absolute URI
*/
export function resolveUri(base?: string, ref?: string): string {
if (ref == null) {
return base?.replace(trailingHash, "") ?? "#";
}
if (base == null || base === "#") {
return ref?.replace(trailingHash, "");
}
// If ref starts with #, it's a fragment - for JSON Schema, append to base without its fragment
if (ref[0] === "#") {
if (base[0] === "/") {
return ref;
}
return `${base.replace(idAndPointer, "")}${ref.replace(suffixes, "")}`;
}
// If ref is a full domain, it's absolute
if (isDomain.test(ref)) {
return ref.replace(trailingHash, "");
}
return resolve(base, ref ?? "") ?? "#";
}