801 lines
11 KiB
TypeScript
801 lines
11 KiB
TypeScript
/**
|
|
* Random word slug generator for plan IDs
|
|
* Inspired by https://github.com/nas5w/random-word-slugs
|
|
* with Claude-flavored words
|
|
*/
|
|
import { randomBytes } from 'crypto'
|
|
|
|
// Adjectives for slug generation - whimsical and delightful
|
|
const ADJECTIVES = [
|
|
// Classic pleasant adjectives
|
|
'abundant',
|
|
'ancient',
|
|
'bright',
|
|
'calm',
|
|
'cheerful',
|
|
'clever',
|
|
'cozy',
|
|
'curious',
|
|
'dapper',
|
|
'dazzling',
|
|
'deep',
|
|
'delightful',
|
|
'eager',
|
|
'elegant',
|
|
'enchanted',
|
|
'fancy',
|
|
'fluffy',
|
|
'gentle',
|
|
'gleaming',
|
|
'golden',
|
|
'graceful',
|
|
'happy',
|
|
'hidden',
|
|
'humble',
|
|
'jolly',
|
|
'joyful',
|
|
'keen',
|
|
'kind',
|
|
'lively',
|
|
'lovely',
|
|
'lucky',
|
|
'luminous',
|
|
'magical',
|
|
'majestic',
|
|
'mellow',
|
|
'merry',
|
|
'mighty',
|
|
'misty',
|
|
'noble',
|
|
'peaceful',
|
|
'playful',
|
|
'polished',
|
|
'precious',
|
|
'proud',
|
|
'quiet',
|
|
'quirky',
|
|
'radiant',
|
|
'rosy',
|
|
'serene',
|
|
'shiny',
|
|
'silly',
|
|
'sleepy',
|
|
'smooth',
|
|
'snazzy',
|
|
'snug',
|
|
'snuggly',
|
|
'soft',
|
|
'sparkling',
|
|
'spicy',
|
|
'splendid',
|
|
'sprightly',
|
|
'starry',
|
|
'steady',
|
|
'sunny',
|
|
'swift',
|
|
'tender',
|
|
'tidy',
|
|
'toasty',
|
|
'tranquil',
|
|
'twinkly',
|
|
'valiant',
|
|
'vast',
|
|
'velvet',
|
|
'vivid',
|
|
'warm',
|
|
'whimsical',
|
|
'wild',
|
|
'wise',
|
|
'witty',
|
|
'wondrous',
|
|
'zany',
|
|
'zesty',
|
|
'zippy',
|
|
// Whimsical / magical
|
|
'breezy',
|
|
'bubbly',
|
|
'buzzing',
|
|
'cheeky',
|
|
'cosmic',
|
|
'cozy',
|
|
'crispy',
|
|
'crystalline',
|
|
'cuddly',
|
|
'drifting',
|
|
'dreamy',
|
|
'effervescent',
|
|
'ethereal',
|
|
'fizzy',
|
|
'flickering',
|
|
'floating',
|
|
'floofy',
|
|
'fluttering',
|
|
'foamy',
|
|
'frolicking',
|
|
'fuzzy',
|
|
'giggly',
|
|
'glimmering',
|
|
'glistening',
|
|
'glittery',
|
|
'glowing',
|
|
'goofy',
|
|
'groovy',
|
|
'harmonic',
|
|
'hazy',
|
|
'humming',
|
|
'iridescent',
|
|
'jaunty',
|
|
'jazzy',
|
|
'jiggly',
|
|
'melodic',
|
|
'moonlit',
|
|
'mossy',
|
|
'nifty',
|
|
'peppy',
|
|
'prancy',
|
|
'purrfect',
|
|
'purring',
|
|
'quizzical',
|
|
'rippling',
|
|
'rustling',
|
|
'shimmering',
|
|
'shimmying',
|
|
'snappy',
|
|
'snoopy',
|
|
'squishy',
|
|
'swirling',
|
|
'ticklish',
|
|
'tingly',
|
|
'twinkling',
|
|
'velvety',
|
|
'wiggly',
|
|
'wobbly',
|
|
'woolly',
|
|
'zazzy',
|
|
// Programming concepts
|
|
'abstract',
|
|
'adaptive',
|
|
'agile',
|
|
'async',
|
|
'atomic',
|
|
'binary',
|
|
'cached',
|
|
'compiled',
|
|
'composed',
|
|
'compressed',
|
|
'concurrent',
|
|
'cryptic',
|
|
'curried',
|
|
'declarative',
|
|
'delegated',
|
|
'distributed',
|
|
'dynamic',
|
|
'eager',
|
|
'elegant',
|
|
'encapsulated',
|
|
'enumerated',
|
|
'eventual',
|
|
'expressive',
|
|
'federated',
|
|
'functional',
|
|
'generic',
|
|
'greedy',
|
|
'hashed',
|
|
'idempotent',
|
|
'immutable',
|
|
'imperative',
|
|
'indexed',
|
|
'inherited',
|
|
'iterative',
|
|
'lazy',
|
|
'lexical',
|
|
'linear',
|
|
'linked',
|
|
'logical',
|
|
'memoized',
|
|
'modular',
|
|
'mutable',
|
|
'nested',
|
|
'optimized',
|
|
'parallel',
|
|
'parsed',
|
|
'partitioned',
|
|
'piped',
|
|
'polymorphic',
|
|
'pure',
|
|
'reactive',
|
|
'recursive',
|
|
'refactored',
|
|
'reflective',
|
|
'replicated',
|
|
'resilient',
|
|
'robust',
|
|
'scalable',
|
|
'sequential',
|
|
'serialized',
|
|
'sharded',
|
|
'sorted',
|
|
'staged',
|
|
'stateful',
|
|
'stateless',
|
|
'streamed',
|
|
'structured',
|
|
'synchronous',
|
|
'synthetic',
|
|
'temporal',
|
|
'transient',
|
|
'typed',
|
|
'unified',
|
|
'validated',
|
|
'vectorized',
|
|
'virtual',
|
|
] as const
|
|
|
|
// Nouns for slug generation - whimsical creatures, nature, and fun objects
|
|
const NOUNS = [
|
|
// Nature & cosmic
|
|
'aurora',
|
|
'avalanche',
|
|
'blossom',
|
|
'breeze',
|
|
'brook',
|
|
'bubble',
|
|
'canyon',
|
|
'cascade',
|
|
'cloud',
|
|
'clover',
|
|
'comet',
|
|
'coral',
|
|
'cosmos',
|
|
'creek',
|
|
'crescent',
|
|
'crystal',
|
|
'dawn',
|
|
'dewdrop',
|
|
'dusk',
|
|
'eclipse',
|
|
'ember',
|
|
'feather',
|
|
'fern',
|
|
'firefly',
|
|
'flame',
|
|
'flurry',
|
|
'fog',
|
|
'forest',
|
|
'frost',
|
|
'galaxy',
|
|
'garden',
|
|
'glacier',
|
|
'glade',
|
|
'grove',
|
|
'harbor',
|
|
'horizon',
|
|
'island',
|
|
'lagoon',
|
|
'lake',
|
|
'leaf',
|
|
'lightning',
|
|
'meadow',
|
|
'meteor',
|
|
'mist',
|
|
'moon',
|
|
'moonbeam',
|
|
'mountain',
|
|
'nebula',
|
|
'nova',
|
|
'ocean',
|
|
'orbit',
|
|
'pebble',
|
|
'petal',
|
|
'pine',
|
|
'planet',
|
|
'pond',
|
|
'puddle',
|
|
'quasar',
|
|
'rain',
|
|
'rainbow',
|
|
'reef',
|
|
'ripple',
|
|
'river',
|
|
'shore',
|
|
'sky',
|
|
'snowflake',
|
|
'spark',
|
|
'spring',
|
|
'star',
|
|
'stardust',
|
|
'starlight',
|
|
'storm',
|
|
'stream',
|
|
'summit',
|
|
'sun',
|
|
'sunbeam',
|
|
'sunrise',
|
|
'sunset',
|
|
'thunder',
|
|
'tide',
|
|
'twilight',
|
|
'valley',
|
|
'volcano',
|
|
'waterfall',
|
|
'wave',
|
|
'willow',
|
|
'wind',
|
|
// Cute creatures
|
|
'alpaca',
|
|
'axolotl',
|
|
'badger',
|
|
'bear',
|
|
'beaver',
|
|
'bee',
|
|
'bird',
|
|
'bumblebee',
|
|
'bunny',
|
|
'cat',
|
|
'chipmunk',
|
|
'crab',
|
|
'crane',
|
|
'deer',
|
|
'dolphin',
|
|
'dove',
|
|
'dragon',
|
|
'dragonfly',
|
|
'duckling',
|
|
'eagle',
|
|
'elephant',
|
|
'falcon',
|
|
'finch',
|
|
'flamingo',
|
|
'fox',
|
|
'frog',
|
|
'giraffe',
|
|
'goose',
|
|
'hamster',
|
|
'hare',
|
|
'hedgehog',
|
|
'hippo',
|
|
'hummingbird',
|
|
'jellyfish',
|
|
'kitten',
|
|
'koala',
|
|
'ladybug',
|
|
'lark',
|
|
'lemur',
|
|
'llama',
|
|
'lobster',
|
|
'lynx',
|
|
'manatee',
|
|
'meerkat',
|
|
'moth',
|
|
'narwhal',
|
|
'newt',
|
|
'octopus',
|
|
'otter',
|
|
'owl',
|
|
'panda',
|
|
'parrot',
|
|
'peacock',
|
|
'pelican',
|
|
'penguin',
|
|
'phoenix',
|
|
'piglet',
|
|
'platypus',
|
|
'pony',
|
|
'porcupine',
|
|
'puffin',
|
|
'puppy',
|
|
'quail',
|
|
'quokka',
|
|
'rabbit',
|
|
'raccoon',
|
|
'raven',
|
|
'robin',
|
|
'salamander',
|
|
'seahorse',
|
|
'seal',
|
|
'sloth',
|
|
'snail',
|
|
'sparrow',
|
|
'sphinx',
|
|
'squid',
|
|
'squirrel',
|
|
'starfish',
|
|
'swan',
|
|
'tiger',
|
|
'toucan',
|
|
'turtle',
|
|
'unicorn',
|
|
'walrus',
|
|
'whale',
|
|
'wolf',
|
|
'wombat',
|
|
'wren',
|
|
'yeti',
|
|
'zebra',
|
|
// Fun objects & concepts
|
|
'acorn',
|
|
'anchor',
|
|
'balloon',
|
|
'beacon',
|
|
'biscuit',
|
|
'blanket',
|
|
'bonbon',
|
|
'book',
|
|
'boot',
|
|
'cake',
|
|
'candle',
|
|
'candy',
|
|
'castle',
|
|
'charm',
|
|
'clock',
|
|
'cocoa',
|
|
'cookie',
|
|
'crayon',
|
|
'crown',
|
|
'cupcake',
|
|
'donut',
|
|
'dream',
|
|
'fairy',
|
|
'fiddle',
|
|
'flask',
|
|
'flute',
|
|
'fountain',
|
|
'gadget',
|
|
'gem',
|
|
'gizmo',
|
|
'globe',
|
|
'goblet',
|
|
'hammock',
|
|
'harp',
|
|
'haven',
|
|
'hearth',
|
|
'honey',
|
|
'journal',
|
|
'kazoo',
|
|
'kettle',
|
|
'key',
|
|
'kite',
|
|
'lantern',
|
|
'lemon',
|
|
'lighthouse',
|
|
'locket',
|
|
'lollipop',
|
|
'mango',
|
|
'map',
|
|
'marble',
|
|
'marshmallow',
|
|
'melody',
|
|
'mitten',
|
|
'mochi',
|
|
'muffin',
|
|
'music',
|
|
'nest',
|
|
'noodle',
|
|
'oasis',
|
|
'origami',
|
|
'pancake',
|
|
'parasol',
|
|
'peach',
|
|
'pearl',
|
|
'pebble',
|
|
'pie',
|
|
'pillow',
|
|
'pinwheel',
|
|
'pixel',
|
|
'pizza',
|
|
'plum',
|
|
'popcorn',
|
|
'pretzel',
|
|
'prism',
|
|
'pudding',
|
|
'pumpkin',
|
|
'puzzle',
|
|
'quiche',
|
|
'quill',
|
|
'quilt',
|
|
'riddle',
|
|
'rocket',
|
|
'rose',
|
|
'scone',
|
|
'scroll',
|
|
'shell',
|
|
'sketch',
|
|
'snowglobe',
|
|
'sonnet',
|
|
'sparkle',
|
|
'spindle',
|
|
'sprout',
|
|
'sundae',
|
|
'swing',
|
|
'taco',
|
|
'teacup',
|
|
'teapot',
|
|
'thimble',
|
|
'toast',
|
|
'token',
|
|
'tome',
|
|
'tower',
|
|
'treasure',
|
|
'treehouse',
|
|
'trinket',
|
|
'truffle',
|
|
'tulip',
|
|
'umbrella',
|
|
'waffle',
|
|
'wand',
|
|
'whisper',
|
|
'whistle',
|
|
'widget',
|
|
'wreath',
|
|
'zephyr',
|
|
// Computer scientists
|
|
'abelson',
|
|
'adleman',
|
|
'aho',
|
|
'allen',
|
|
'babbage',
|
|
'bachman',
|
|
'backus',
|
|
'barto',
|
|
'bengio',
|
|
'bentley',
|
|
'blum',
|
|
'boole',
|
|
'brooks',
|
|
'catmull',
|
|
'cerf',
|
|
'cherny',
|
|
'church',
|
|
'clarke',
|
|
'cocke',
|
|
'codd',
|
|
'conway',
|
|
'cook',
|
|
'corbato',
|
|
'cray',
|
|
'curry',
|
|
'dahl',
|
|
'diffie',
|
|
'dijkstra',
|
|
'dongarra',
|
|
'eich',
|
|
'emerson',
|
|
'engelbart',
|
|
'feigenbaum',
|
|
'floyd',
|
|
'gosling',
|
|
'graham',
|
|
'gray',
|
|
'hamming',
|
|
'hanrahan',
|
|
'hartmanis',
|
|
'hejlsberg',
|
|
'hellman',
|
|
'hennessy',
|
|
'hickey',
|
|
'hinton',
|
|
'hoare',
|
|
'hollerith',
|
|
'hopcroft',
|
|
'hopper',
|
|
'iverson',
|
|
'kahan',
|
|
'kahn',
|
|
'karp',
|
|
'kay',
|
|
'kernighan',
|
|
'knuth',
|
|
'kurzweil',
|
|
'lamport',
|
|
'lampson',
|
|
'lecun',
|
|
'lerdorf',
|
|
'liskov',
|
|
'lovelace',
|
|
'matsumoto',
|
|
'mccarthy',
|
|
'metcalfe',
|
|
'micali',
|
|
'milner',
|
|
'minsky',
|
|
'moler',
|
|
'moore',
|
|
'naur',
|
|
'neumann',
|
|
'newell',
|
|
'nygaard',
|
|
'papert',
|
|
'parnas',
|
|
'pascal',
|
|
'patterson',
|
|
'pearl',
|
|
'perlis',
|
|
'pike',
|
|
'pnueli',
|
|
'rabin',
|
|
'reddy',
|
|
'ritchie',
|
|
'rivest',
|
|
'rossum',
|
|
'russell',
|
|
'scott',
|
|
'sedgewick',
|
|
'shamir',
|
|
'shannon',
|
|
'sifakis',
|
|
'simon',
|
|
'stallman',
|
|
'stearns',
|
|
'steele',
|
|
'stonebraker',
|
|
'stroustrup',
|
|
'sutherland',
|
|
'sutton',
|
|
'tarjan',
|
|
'thacker',
|
|
'thompson',
|
|
'torvalds',
|
|
'turing',
|
|
'ullman',
|
|
'valiant',
|
|
'wadler',
|
|
'wall',
|
|
'wigderson',
|
|
'wilkes',
|
|
'wilkinson',
|
|
'wirth',
|
|
'wozniak',
|
|
'yao',
|
|
] as const
|
|
|
|
// Verbs for the middle word - whimsical action words
|
|
const VERBS = [
|
|
'baking',
|
|
'beaming',
|
|
'booping',
|
|
'bouncing',
|
|
'brewing',
|
|
'bubbling',
|
|
'chasing',
|
|
'churning',
|
|
'coalescing',
|
|
'conjuring',
|
|
'cooking',
|
|
'crafting',
|
|
'crunching',
|
|
'cuddling',
|
|
'dancing',
|
|
'dazzling',
|
|
'discovering',
|
|
'doodling',
|
|
'dreaming',
|
|
'drifting',
|
|
'enchanting',
|
|
'exploring',
|
|
'finding',
|
|
'floating',
|
|
'fluttering',
|
|
'foraging',
|
|
'forging',
|
|
'frolicking',
|
|
'gathering',
|
|
'giggling',
|
|
'gliding',
|
|
'greeting',
|
|
'growing',
|
|
'hatching',
|
|
'herding',
|
|
'honking',
|
|
'hopping',
|
|
'hugging',
|
|
'humming',
|
|
'imagining',
|
|
'inventing',
|
|
'jingling',
|
|
'juggling',
|
|
'jumping',
|
|
'kindling',
|
|
'knitting',
|
|
'launching',
|
|
'leaping',
|
|
'mapping',
|
|
'marinating',
|
|
'meandering',
|
|
'mixing',
|
|
'moseying',
|
|
'munching',
|
|
'napping',
|
|
'nibbling',
|
|
'noodling',
|
|
'orbiting',
|
|
'painting',
|
|
'percolating',
|
|
'petting',
|
|
'plotting',
|
|
'pondering',
|
|
'popping',
|
|
'prancing',
|
|
'purring',
|
|
'puzzling',
|
|
'questing',
|
|
'riding',
|
|
'roaming',
|
|
'rolling',
|
|
'sauteeing',
|
|
'scribbling',
|
|
'seeking',
|
|
'shimmying',
|
|
'singing',
|
|
'skipping',
|
|
'sleeping',
|
|
'snacking',
|
|
'sniffing',
|
|
'snuggling',
|
|
'soaring',
|
|
'sparking',
|
|
'spinning',
|
|
'splashing',
|
|
'sprouting',
|
|
'squishing',
|
|
'stargazing',
|
|
'stirring',
|
|
'strolling',
|
|
'swimming',
|
|
'swinging',
|
|
'tickling',
|
|
'tinkering',
|
|
'toasting',
|
|
'tumbling',
|
|
'twirling',
|
|
'waddling',
|
|
'wandering',
|
|
'watching',
|
|
'weaving',
|
|
'whistling',
|
|
'wibbling',
|
|
'wiggling',
|
|
'wishing',
|
|
'wobbling',
|
|
'wondering',
|
|
'yawning',
|
|
'zooming',
|
|
] as const
|
|
|
|
/**
|
|
* Generate a cryptographically random integer in the range [0, max)
|
|
*/
|
|
function randomInt(max: number): number {
|
|
// Use crypto.randomBytes for better randomness than Math.random
|
|
const bytes = randomBytes(4)
|
|
const value = bytes.readUInt32BE(0)
|
|
return value % max
|
|
}
|
|
|
|
/**
|
|
* Pick a random element from an array
|
|
*/
|
|
function pickRandom<T>(array: readonly T[]): T {
|
|
return array[randomInt(array.length)]!
|
|
}
|
|
|
|
/**
|
|
* Generate a random word slug in the format "adjective-verb-noun"
|
|
* Example: "gleaming-brewing-phoenix", "cosmic-pondering-lighthouse"
|
|
*/
|
|
export function generateWordSlug(): string {
|
|
const adjective = pickRandom(ADJECTIVES)
|
|
const verb = pickRandom(VERBS)
|
|
const noun = pickRandom(NOUNS)
|
|
return `${adjective}-${verb}-${noun}`
|
|
}
|
|
|
|
/**
|
|
* Generate a shorter random word slug in the format "adjective-noun"
|
|
* Example: "graceful-unicorn", "cosmic-lighthouse"
|
|
*/
|
|
export function generateShortWordSlug(): string {
|
|
const adjective = pickRandom(ADJECTIVES)
|
|
const noun = pickRandom(NOUNS)
|
|
return `${adjective}-${noun}`
|
|
}
|