https://github.com/user-attachments/assets/b1707287-f7a8-46ec-bca8-c68bd782d0fa
// Name: Faker// Description: Generate fake data with faker.js// Author: Pavel 'Strajk' Dolecek// Twitter: @straaajkimport "@johnlindquist/kit"import { faker } from '@faker-js/faker';import { Choice } from "@johnlindquist/kit";const CACHE_EXPIRATION = 1000 * 60 * 60 * 24 * 30 // 1 month// const CACHE_EXPIRATION = 1000 * 15 // 15 seconds // uncomment for debugging// @ts-ignore kitCommand is defined, but it's not in types :(const keyv = await store(kitCommand, {cachedChoices: null, cachedChoicesExpires: null})const maybeCachedChoices = await keyv.get('choices') as Choice[] | nullconst maybeCachedChoicesExpires = await keyv.get('cachedChoicesExpires') as number | nullconst EXAMPLES_MAX_COUNT = 5const EXAMPLES_MAX_CHARS = 120const modulesToIgnore = ["_defaultRefDate","_randomizer","datatype", // just boolean"helpers","rawDefinitions","definitions",]const methodsToIgnore = ["faker",]const pairsToIgnore = ["internet.userName", // deprecated in favour of internet.username"image.avatarLegacy", // deprecated in favour of image.avatar// requires params, which would require special handling"string.fromCharacters","date.between","date.betweens",]let choices = []if (maybeCachedChoices?.length > 0&& maybeCachedChoicesExpires > Date.now()) {// console.log("Using cached choices")choices = maybeCachedChoices as Choice[]} else {// console.log("Generating choices")for (const module in faker) { // date, number, string, finance, ...if (modulesToIgnore.includes(module)) {continue;}for (const method in faker[module]) {if (methodsToIgnore.includes(method)) {continue;}const pair = `${module}.${method}`;if (pairsToIgnore.includes(pair)) {continue;}let examplesCount = 0;let examplesText = "";while (examplesText.length < EXAMPLES_MAX_CHARS && examplesCount < EXAMPLES_MAX_COUNT) {const newExample = callFaker(module, method);if (examplesText.length > 0) {examplesText += " • "}examplesText += toString(newExample);examplesCount++;}examplesText = examplesText.trim().substring(0, EXAMPLES_MAX_CHARS);choices.push({name: `${module}: ${method}`,value: pair,description: examplesText,})}}await keyv.set('choices', choices)await keyv.set('cachedChoicesExpires', Date.now() + CACHE_EXPIRATION)}const selected = await arg({placeholder: "Select a Faker module and method",choices: choices,enter: "Copy to clipboard",})let [module, method] = selected.split(".")let value = toString(callFaker(module, method))await copy(value)await notify(`Copied: ${value}`)// Helpers// ===function callFaker(module: string, method: string) {try {return faker[module][method]()} catch (error) {console.error(`Error calling faker method: ${module}.${method}`, error);return}}function toString(value: any): string {if (typeof value === "string") {return value} else if (typeof value === "object") {return JSON.stringify(value)} else {return value?.toString() || "❌"}}