UNPKG

@datocms/cma-client

Version:
66 lines 2.49 kB
import { v4 } from 'uuid'; function fromUint8ArrayToUrlSafeBase64(bytes) { var base64 = typeof Buffer === 'undefined' ? btoa(Array.from(bytes, function (byte) { return String.fromCharCode(byte); }).join('')) : Buffer.from(bytes).toString('base64'); // Convert to URL-safe format (see RFC 4648, sec. 5) return (base64 // Replace + with - .replace(/\+/g, '-') // Replace / with _ .replace(/\//g, '_') // Drop '==' padding .substring(0, 22)); } function fromUrlSafeBase64toUint8Array(urlSafeBase64) { // Convert from URL-safe format (see RFC 4648, sec. 5) var base64 = urlSafeBase64 // Replace - with + .replace(/-/g, '+') // Replace _ with / .replace(/_/g, '/'); return typeof Buffer === 'undefined' ? Uint8Array.from(atob(base64), function (c) { return c.charCodeAt(0); }) : new Uint8Array(Buffer.from(base64, 'base64')); } export function isValidId(id) { // For backward compatibility, first check to see if this is an older-style integer ID formerly used by Dato if (/^\d+$/.test(id)) { var intId = BigInt(id); var maxDatoIntegerId = 281474976710655; // Max 6-byte/48-bit unsigned int return intId <= maxDatoIntegerId; } var bytes = fromUrlSafeBase64toUint8Array(id); // UUIDs are 16 bytes if (bytes.length !== 16) { return false; } // The variant field determines the layout of the UUID // (see RFC 4122, sec. 4.1.1) var variant = bytes.at(8); // Variant must be the one described in RFC 4122 if ((variant & 192) !== 128) { return false; } // The version number is in the most significant 4 bits // of the time stamp (see RFC 4122, sec. 4.1.3) var version = bytes.at(6) >> 4; // Version number must be 4 (randomly generated) if (version !== 0x4) { return false; } return true; } export function generateId() { var bytes = v4(null, new Uint8Array(16)); // Here we unset the first bit to ensure [A-Za-f] as the first char. // // If we didn't do this, we would generate IDs that, once encoded // in base64, could start with a '+' or a '/'. This makes them less // easy to copy/paste, with bad DX. // This choice is purely aesthetic: definitely non-mandatory! bytes[0] = bytes[0] & 0x7f; var base64 = fromUint8ArrayToUrlSafeBase64(bytes); return base64; } //# sourceMappingURL=idUtils.js.map