UNPKG

tiny-ulid

Version:
136 lines (135 loc) 4.61 kB
#!/usr/bin/env node import { createConsola } from "consola" import { decodeUlid, toUlid, getUlidBufferTime, makeUlid } from "../default.js" const consola = createConsola({ stdout: process.stderr }), options = new Map(), commands = [], fatal = message => { consola.fatal(message) process.exit(1) } for (const argument of process.argv.slice(2)) if ("-" == argument[0]) { const argumentEqualsIndex = argument.indexOf("=") let key, value if (-1 == argumentEqualsIndex) key = argument else { key = argument.slice(0, argumentEqualsIndex) value = argument.slice(argumentEqualsIndex + 1) } if ("-" == argument[1]) { const name = key.slice(2) options.has(name) && fatal(`Option --${name} specified twice.`) options.set(name, value) } else for (const name of key.slice(1)) { options.has(name) && fatal(`Option -${name} specified twice.`) options.set(name, value) } } else { options.size && fatal("Options must come last.") commands.push(argument) } consola.debug(commands) consola.debug(options) if ("version" == commands[0] || options.has("version")) { console.log("0.1.1") process.exit() } const poppedOptions = new Set() let complainedAboutUnrecognisedOptions = !1 const popOption = (name, { requirePresence = !1, requireValue = !1 } = {}) => { if (complainedAboutUnrecognisedOptions) { consola.error(Error("Tried to pop option after already complaining")) process.exit(2) } if (poppedOptions.has(name)) { consola.error(Error(`Tried to pop option --${name} twice.`)) process.exit(2) } poppedOptions.add(name) if (options.has(name)) { const value = options.get(name) requireValue && null == value && fatal(`Option --${name} missing value.`) options.delete(name) return value } requirePresence && fatal(`Option --${name} missing.`) }, popFlagOption = name => { if (complainedAboutUnrecognisedOptions) { consola.error(Error("Tried to pop option after already complaining")) process.exit(2) } if (poppedOptions.has(name)) { consola.error(Error(`Tried to pop option --${name} twice.`)) process.exit(2) } poppedOptions.add(name) if (options.has(name)) { null != options.get(name) && fatal(`Option --${name} must not have value.`) options.delete(name) return !0 } return !1 }, complainAboutUnrecognisedOptions = () => { complainedAboutUnrecognisedOptions = !0 options.size && fatal(`Unknown option: --${options.keys().next().value}.`) } if (commands.length) { if ("get-time" == commands[0]) { commands.length < 2 && fatal("Missing argument.") commands.length > 2 && fatal("Too many arguments.") const ulidBuffer = decodeUlid(toUlid(commands[1])) consola.debug(ulidBuffer) const time = getUlidBufferTime(ulidBuffer), formatOption = popOption("format", { requireValue: !0 }) complainAboutUnrecognisedOptions() "locale" == formatOption || null == formatOption ? console.log(new Date(time).toLocaleString()) : "locale-full" == formatOption ? console.log(new Date(time).toLocaleString(void 0, { dateStyle: "full", timeStyle: "full" })) : "iso" == formatOption ? console.log(new Date(time).toISOString()) : "epoch-milliseconds" == formatOption ? console.log(time + "") : fatal( `Unrecognised format ${JSON.stringify(formatOption)}.\nValid formats are "locale", "locale-full", "iso", and "epoch-milliseconds".` ) process.exit() } if ("to-hex" == commands[0]) { commands.length < 2 && fatal("Missing argument.") commands.length > 2 && fatal("Too many arguments.") const ulidBuffer = decodeUlid(toUlid(commands[1])) consola.debug(ulidBuffer) const lowercaseOption = popFlagOption("lowercase"), seperator = popOption("seperator", { requireValue: !0 }) ?? " " complainAboutUnrecognisedOptions() const result = [...new Uint8Array(ulidBuffer)] .map(byte => { let result = byte.toString(16) lowercaseOption || (result = result.toUpperCase()) return result.padStart(2, "0") }) .join(seperator) console.log(result) process.exit() } if ("to-base64" == commands[0]) { commands.length < 2 && fatal("Missing argument.") commands.length > 2 && fatal("Too many arguments.") const urlOption = popFlagOption("url") complainAboutUnrecognisedOptions() const ulidBuffer = decodeUlid(toUlid(commands[1])) consola.debug(ulidBuffer) const result = Buffer.from(ulidBuffer).toString(urlOption ? "base64url" : "base64") console.log(result) process.exit() } fatal(`Unknown command: ${commands[0]}.`) } complainAboutUnrecognisedOptions() console.log(makeUlid()) process.exit()