@venn-lang/data 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +143 -0
  3. package/dist/index.d.ts +152 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +1941 -0
  6. package/dist/index.js.map +1 -0
  7. package/package.json +54 -0
  8. package/src/actions/faker-actions.ts +22 -0
  9. package/src/actions/index.ts +7 -0
  10. package/src/actions/parse-actions.ts +31 -0
  11. package/src/actions/random-actions.ts +51 -0
  12. package/src/csv/csv.types.ts +2 -0
  13. package/src/csv/index.ts +2 -0
  14. package/src/csv/parse-csv.ts +30 -0
  15. package/src/faker/address.ts +70 -0
  16. package/src/faker/all-specs.ts +25 -0
  17. package/src/faker/brazil-documents.ts +46 -0
  18. package/src/faker/brazil.ts +75 -0
  19. package/src/faker/check-digits.ts +56 -0
  20. package/src/faker/commerce.ts +59 -0
  21. package/src/faker/company.ts +41 -0
  22. package/src/faker/data/business.ts +80 -0
  23. package/src/faker/data/commerce.ts +73 -0
  24. package/src/faker/data/index.ts +36 -0
  25. package/src/faker/data/names.ts +93 -0
  26. package/src/faker/data/places.ts +109 -0
  27. package/src/faker/data/web.ts +45 -0
  28. package/src/faker/data/words.ts +104 -0
  29. package/src/faker/datetime.ts +102 -0
  30. package/src/faker/faker.types.ts +24 -0
  31. package/src/faker/finance.ts +86 -0
  32. package/src/faker/ids.ts +80 -0
  33. package/src/faker/index.ts +8 -0
  34. package/src/faker/internet.ts +100 -0
  35. package/src/faker/person.ts +88 -0
  36. package/src/faker/primitives.ts +77 -0
  37. package/src/faker/text.ts +56 -0
  38. package/src/index.ts +8 -0
  39. package/src/plugin.ts +17 -0
  40. package/src/rng/index.ts +4 -0
  41. package/src/rng/mulberry32.ts +18 -0
  42. package/src/rng/rng.types.ts +2 -0
  43. package/src/rng/shared-rng.ts +15 -0
  44. package/src/rng/shuffle.ts +17 -0
  45. package/src/types.ts +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["street","address","phone"],"sources":["../src/faker/data/business.ts","../src/faker/data/commerce.ts","../src/faker/data/names.ts","../src/faker/data/places.ts","../src/faker/data/web.ts","../src/faker/data/words.ts","../src/faker/primitives.ts","../src/faker/address.ts","../src/faker/brazil-documents.ts","../src/faker/brazil.ts","../src/faker/check-digits.ts","../src/faker/commerce.ts","../src/faker/company.ts","../src/faker/datetime.ts","../src/faker/finance.ts","../src/faker/ids.ts","../src/faker/person.ts","../src/faker/internet.ts","../src/faker/text.ts","../src/faker/all-specs.ts","../src/rng/mulberry32.ts","../src/rng/shared-rng.ts","../src/rng/shuffle.ts","../src/actions/faker-actions.ts","../src/csv/parse-csv.ts","../src/actions/parse-actions.ts","../src/actions/random-actions.ts","../src/actions/index.ts","../src/types.ts","../src/plugin.ts"],"sourcesContent":["export const COMPANY_ROOTS: readonly string[] = [\n \"Northwind\",\n \"Acme\",\n \"Globex\",\n \"Initech\",\n \"Umbrella\",\n \"Vandelay\",\n \"Stark\",\n \"Wayne\",\n \"Tyrell\",\n \"Cyberdyne\",\n \"Aperture\",\n \"Soylent\",\n \"Massive\",\n \"Hooli\",\n];\n\nexport const COMPANY_SUFFIXES: readonly string[] = [\n \"Ltd\",\n \"Inc\",\n \"GmbH\",\n \"S.A.\",\n \"LLC\",\n \"Group\",\n \"Labs\",\n \"Systems\",\n \"Holdings\",\n];\n\nexport const DEPARTMENTS: readonly string[] = [\n \"Engineering\",\n \"Design\",\n \"Sales\",\n \"Marketing\",\n \"Support\",\n \"Finance\",\n \"Legal\",\n \"People\",\n \"Operations\",\n \"Security\",\n \"Data\",\n \"Research\",\n];\n\nexport const JOB_TITLES: readonly string[] = [\n \"Software Engineer\",\n \"Product Designer\",\n \"Data Analyst\",\n \"Engineering Manager\",\n \"QA Engineer\",\n \"Site Reliability Engineer\",\n \"Technical Writer\",\n \"Product Manager\",\n \"Security Analyst\",\n \"Solutions Architect\",\n \"Support Specialist\",\n \"Accountant\",\n];\n\nexport const BUZZWORDS: readonly string[] = [\n \"synergy\",\n \"scalability\",\n \"throughput\",\n \"observability\",\n \"resilience\",\n \"alignment\",\n \"velocity\",\n \"leverage\",\n \"bandwidth\",\n \"runway\",\n];\n\nexport const CATCH_VERBS: readonly string[] = [\n \"streamline\",\n \"orchestrate\",\n \"unlock\",\n \"accelerate\",\n \"simplify\",\n \"amplify\",\n];\n","export const PRODUCTS: readonly string[] = [\n \"Chair\",\n \"Keyboard\",\n \"Lamp\",\n \"Backpack\",\n \"Mug\",\n \"Notebook\",\n \"Headphones\",\n \"Monitor\",\n \"Desk\",\n \"Bottle\",\n \"Jacket\",\n \"Sneakers\",\n \"Table\",\n \"Shelf\",\n \"Camera\",\n];\n\nexport const MATERIALS: readonly string[] = [\n \"cotton\",\n \"steel\",\n \"oak\",\n \"leather\",\n \"glass\",\n \"aluminium\",\n \"ceramic\",\n \"linen\",\n];\n\nexport const CATEGORIES: readonly string[] = [\n \"Electronics\",\n \"Home\",\n \"Outdoors\",\n \"Books\",\n \"Clothing\",\n \"Toys\",\n \"Grocery\",\n \"Sports\",\n \"Beauty\",\n \"Automotive\",\n];\n\nexport const COLORS: readonly [string, string][] = [\n [\"black\", \"#000000\"],\n [\"white\", \"#ffffff\"],\n [\"red\", \"#e53935\"],\n [\"blue\", \"#1e88e5\"],\n [\"green\", \"#43a047\"],\n [\"amber\", \"#ffb300\"],\n [\"violet\", \"#8e24aa\"],\n [\"teal\", \"#00897b\"],\n [\"slate\", \"#546e7a\"],\n [\"coral\", \"#ff7043\"],\n];\n\n/** `[code, symbol, name]`. */\nexport const CURRENCIES: readonly [string, string, string][] = [\n [\"BRL\", \"R$\", \"Brazilian Real\"],\n [\"USD\", \"$\", \"US Dollar\"],\n [\"EUR\", \"€\", \"Euro\"],\n [\"GBP\", \"£\", \"Pound Sterling\"],\n [\"JPY\", \"¥\", \"Japanese Yen\"],\n [\"CAD\", \"$\", \"Canadian Dollar\"],\n];\n\n/** `[brand, prefix, length]`. The prefixes are the real issuer ranges. */\nexport const CARD_BRANDS: readonly [string, string, number][] = [\n [\"Visa\", \"4\", 16],\n [\"Mastercard\", \"51\", 16],\n [\"Mastercard\", \"55\", 16],\n [\"Discover\", \"6011\", 16],\n [\"Elo\", \"4011\", 16],\n];\n","/** Given names, mixing the computing pantheon with names common in Brazil. */\nexport const FIRST_NAMES: readonly string[] = [\n \"Ada\",\n \"Alan\",\n \"Grace\",\n \"Linus\",\n \"Edsger\",\n \"Barbara\",\n \"Katherine\",\n \"Dennis\",\n \"Margaret\",\n \"Donald\",\n \"Anita\",\n \"Tim\",\n \"Radia\",\n \"Ken\",\n \"Frances\",\n \"Vint\",\n \"Ana\",\n \"Bruno\",\n \"Camila\",\n \"Diego\",\n \"Eduarda\",\n \"Felipe\",\n \"Gabriela\",\n \"Heitor\",\n \"Isabela\",\n \"João\",\n \"Larissa\",\n \"Mateus\",\n \"Natália\",\n \"Otávio\",\n \"Paula\",\n \"Rafael\",\n \"Sofia\",\n \"Thiago\",\n \"Valentina\",\n \"Yuri\",\n \"Beatriz\",\n \"Caio\",\n \"Débora\",\n \"Enzo\",\n];\n\n/** Family names, likewise mixed. */\nexport const LAST_NAMES: readonly string[] = [\n \"Lovelace\",\n \"Turing\",\n \"Hopper\",\n \"Torvalds\",\n \"Dijkstra\",\n \"Liskov\",\n \"Johnson\",\n \"Ritchie\",\n \"Hamilton\",\n \"Knuth\",\n \"Borg\",\n \"Berners-Lee\",\n \"Perlman\",\n \"Thompson\",\n \"Allen\",\n \"Cerf\",\n \"Silva\",\n \"Santos\",\n \"Oliveira\",\n \"Souza\",\n \"Rodrigues\",\n \"Ferreira\",\n \"Almeida\",\n \"Costa\",\n \"Gomes\",\n \"Martins\",\n \"Araújo\",\n \"Melo\",\n \"Barbosa\",\n \"Ribeiro\",\n \"Carvalho\",\n \"Pereira\",\n \"Lima\",\n \"Moreira\",\n \"Cardoso\",\n \"Teixeira\",\n \"Correia\",\n];\n\n/** Honorifics that precede a name. */\nexport const NAME_PREFIXES: readonly string[] = [\"Dr.\", \"Dra.\", \"Sr.\", \"Sra.\", \"Prof.\", \"Eng.\"];\n\n/** Generational suffixes that follow a name. */\nexport const NAME_SUFFIXES: readonly string[] = [\"Jr.\", \"Neto\", \"Filho\", \"II\", \"III\"];\n\n/** Gender values shaped the way most forms model them. */\nexport const GENDERS: readonly string[] = [\"female\", \"male\", \"non-binary\", \"prefer not to say\"];\n","export const CITIES: readonly string[] = [\n \"Lisbon\",\n \"Porto\",\n \"Amsterdam\",\n \"Berlin\",\n \"Toronto\",\n \"Austin\",\n \"Dublin\",\n \"Wellington\",\n \"Reykjavík\",\n \"Kyoto\",\n \"Montréal\",\n \"Helsinki\",\n \"Tallinn\",\n \"Bergen\",\n];\n\nexport const COUNTRIES: readonly [string, string][] = [\n [\"Brazil\", \"BR\"],\n [\"Portugal\", \"PT\"],\n [\"Netherlands\", \"NL\"],\n [\"Germany\", \"DE\"],\n [\"Canada\", \"CA\"],\n [\"United States\", \"US\"],\n [\"Ireland\", \"IE\"],\n [\"New Zealand\", \"NZ\"],\n [\"Japan\", \"JP\"],\n [\"Finland\", \"FI\"],\n [\"Estonia\", \"EE\"],\n [\"Norway\", \"NO\"],\n];\n\nexport const STREET_TYPES: readonly string[] = [\n \"Street\",\n \"Avenue\",\n \"Road\",\n \"Lane\",\n \"Way\",\n \"Square\",\n];\n\nexport const TIMEZONES: readonly string[] = [\n \"America/Sao_Paulo\",\n \"America/New_York\",\n \"Europe/Lisbon\",\n \"Europe/Berlin\",\n \"Europe/Helsinki\",\n \"Asia/Tokyo\",\n \"Pacific/Auckland\",\n \"UTC\",\n];\n\n/** Brazilian federal units, as `[name, code]`. */\nexport const BR_STATES: readonly [string, string][] = [\n [\"São Paulo\", \"SP\"],\n [\"Rio de Janeiro\", \"RJ\"],\n [\"Minas Gerais\", \"MG\"],\n [\"Bahia\", \"BA\"],\n [\"Paraná\", \"PR\"],\n [\"Rio Grande do Sul\", \"RS\"],\n [\"Pernambuco\", \"PE\"],\n [\"Ceará\", \"CE\"],\n [\"Santa Catarina\", \"SC\"],\n [\"Goiás\", \"GO\"],\n [\"Pará\", \"PA\"],\n [\"Espírito Santo\", \"ES\"],\n [\"Amazonas\", \"AM\"],\n [\"Distrito Federal\", \"DF\"],\n];\n\nexport const BR_CITIES: readonly string[] = [\n \"São Paulo\",\n \"Rio de Janeiro\",\n \"Belo Horizonte\",\n \"Salvador\",\n \"Curitiba\",\n \"Porto Alegre\",\n \"Recife\",\n \"Fortaleza\",\n \"Florianópolis\",\n \"Goiânia\",\n \"Belém\",\n \"Vitória\",\n \"Manaus\",\n \"Brasília\",\n \"Campinas\",\n \"Uberlândia\",\n];\n\nexport const BR_STREET_TYPES: readonly string[] = [\n \"Rua\",\n \"Avenida\",\n \"Travessa\",\n \"Alameda\",\n \"Praça\",\n];\n\nexport const BR_STREET_NAMES: readonly string[] = [\n \"das Flores\",\n \"Sete de Setembro\",\n \"Getúlio Vargas\",\n \"XV de Novembro\",\n \"Santos Dumont\",\n \"do Comércio\",\n \"Paulista\",\n \"Brasil\",\n \"das Palmeiras\",\n \"Tiradentes\",\n];\n","/** Reserved by RFC 2606/6761, so a generated address never resolves to anyone real. */\nexport const SAFE_DOMAINS: readonly string[] = [\n \"example.test\",\n \"example.com\",\n \"example.org\",\n \"example.net\",\n \"test.invalid\",\n];\n\nexport const TLDS: readonly string[] = [\"com\", \"org\", \"net\", \"io\", \"dev\", \"app\", \"com.br\"];\n\nexport const HTTP_METHODS: readonly string[] = [\n \"GET\",\n \"POST\",\n \"PUT\",\n \"PATCH\",\n \"DELETE\",\n \"HEAD\",\n \"OPTIONS\",\n];\n\nexport const HTTP_STATUSES: readonly number[] = [\n 200, 201, 202, 204, 301, 302, 304, 400, 401, 403, 404, 409, 422, 429, 500, 502, 503,\n];\n\nexport const MIME_TYPES: readonly string[] = [\n \"application/json\",\n \"text/html\",\n \"text/plain\",\n \"text/csv\",\n \"application/pdf\",\n \"image/png\",\n \"image/jpeg\",\n \"image/svg+xml\",\n \"application/octet-stream\",\n];\n\nexport const USER_AGENTS: readonly string[] = [\n \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36\",\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15\",\n \"Mozilla/5.0 (X11; Linux x86_64; rv:127.0) Gecko/20100101 Firefox/127.0\",\n \"Mozilla/5.0 (iPhone; CPU iPhone OS 17_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148\",\n];\n\nexport const PROTOCOLS: readonly string[] = [\"https\", \"http\"];\n","/** Classic lorem vocabulary: filler text that is obviously filler. */\nexport const LOREM: readonly string[] = [\n \"lorem\",\n \"ipsum\",\n \"dolor\",\n \"sit\",\n \"amet\",\n \"consectetur\",\n \"adipiscing\",\n \"elit\",\n \"sed\",\n \"do\",\n \"eiusmod\",\n \"tempor\",\n \"incididunt\",\n \"ut\",\n \"labore\",\n \"et\",\n \"dolore\",\n \"magna\",\n \"aliqua\",\n \"enim\",\n \"ad\",\n \"minim\",\n \"veniam\",\n \"quis\",\n \"nostrud\",\n \"exercitation\",\n \"ullamco\",\n \"laboris\",\n \"nisi\",\n \"aliquip\",\n \"ex\",\n \"ea\",\n \"commodo\",\n \"consequat\",\n \"duis\",\n \"aute\",\n \"irure\",\n \"in\",\n \"reprehenderit\",\n \"voluptate\",\n \"velit\",\n \"esse\",\n \"cillum\",\n \"eu\",\n \"fugiat\",\n \"nulla\",\n \"pariatur\",\n \"excepteur\",\n \"sint\",\n \"occaecat\",\n \"cupidatat\",\n \"non\",\n \"proident\",\n \"culpa\",\n \"officia\",\n \"deserunt\",\n \"mollit\",\n \"anim\",\n \"id\",\n \"est\",\n \"laborum\",\n];\n\n/** Adjectives, for product and project names. */\nexport const ADJECTIVES: readonly string[] = [\n \"quiet\",\n \"bright\",\n \"rapid\",\n \"solid\",\n \"gentle\",\n \"bold\",\n \"clever\",\n \"plain\",\n \"sturdy\",\n \"sleek\",\n \"warm\",\n \"crisp\",\n \"amber\",\n \"hollow\",\n \"northern\",\n \"silent\",\n];\n\n/** Concrete nouns, for the same. */\nexport const NOUNS: readonly string[] = [\n \"harbour\",\n \"lantern\",\n \"meadow\",\n \"compass\",\n \"anchor\",\n \"ridge\",\n \"beacon\",\n \"quarry\",\n \"willow\",\n \"falcon\",\n \"cascade\",\n \"summit\",\n \"orchard\",\n \"canyon\",\n \"delta\",\n \"ember\",\n];\n","import type { Rng } from \"../rng/index.js\";\n\nconst COMBINING = /[\\u0300-\\u036f]/g;\n\nexport const DIGITS = \"0123456789\";\nexport const HEX = \"0123456789abcdef\";\nexport const LOWER = \"abcdefghijklmnopqrstuvwxyz\";\nexport const ALNUM: string = `${LOWER}${LOWER.toUpperCase()}${DIGITS}`;\n\n/** Pick one item from a list. Drawing from an empty list is a programming error. */\nexport function pick<T>(items: readonly T[], rng: Rng): T {\n const chosen = items[Math.floor(rng() * items.length)];\n if (chosen === undefined) throw new Error(\"faker: cannot pick from an empty list\");\n return chosen;\n}\n\n/** An integer in the inclusive range [min, max]. */\nexport function intBetween(args: { min: number; max: number; rng: Rng }): number {\n return args.min + Math.floor(args.rng() * (args.max - args.min + 1));\n}\n\n/** A number in [min, max), rounded to `decimals` places. */\nexport function floatBetween(args: {\n min: number;\n max: number;\n decimals: number;\n rng: Rng;\n}): number {\n const raw = args.min + args.rng() * (args.max - args.min);\n return Number(raw.toFixed(args.decimals));\n}\n\n/** `count` characters drawn from `alphabet`. */\nexport function chars(args: { count: number; alphabet: string; rng: Rng }): string {\n let out = \"\";\n for (let index = 0; index < args.count; index += 1) {\n out += args.alphabet.charAt(Math.floor(args.rng() * args.alphabet.length));\n }\n return out;\n}\n\n/** `count` decimal digits, e.g. `\"40721\"`. */\nexport function digits(count: number, rng: Rng): string {\n return chars({ count, alphabet: DIGITS, rng });\n}\n\n/** Upper-case the first character, leaving the rest alone. */\nexport function capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\n/** Zero-pad a number to `width` digits. */\nexport function pad(value: number, width: number): string {\n return String(value).padStart(width, \"0\");\n}\n\n/** Strip diacritics so a name can become an email local part or a URL slug. */\nexport function ascii(text: string): string {\n return text.normalize(\"NFD\").replace(COMBINING, \"\");\n}\n\n/** ASCII-safe lowercase slug: `\"João Gonçalves\"` → `\"joao-goncalves\"`. */\nexport function slug(text: string): string {\n const plain = ascii(text).toLowerCase();\n return plain.replace(/[^a-z0-9]+/g, \"-\").replace(/^-+|-+$/g, \"\");\n}\n\n/** Read a positional argument as a number, falling back when it is absent. */\nexport function numArg(args: readonly unknown[], index: number, fallback: number): number {\n const raw = Number(args[index]);\n return args[index] === undefined || Number.isNaN(raw) ? fallback : raw;\n}\n\n/** Build `count` values, each drawn independently. */\nexport function times<T>(count: number, make: () => T): T[] {\n return Array.from({ length: count }, make);\n}\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport { CITIES, COUNTRIES, NOUNS, STREET_TYPES, TIMEZONES } from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { capitalize, digits, floatBetween, intBetween, pick } from \"./primitives.js\";\n\nfunction street(rng: Rng): string {\n return `${capitalize(pick(NOUNS, rng))} ${pick(STREET_TYPES, rng)}`;\n}\n\nfunction streetAddress(rng: Rng): string {\n return `${intBetween({ min: 1, max: 9999, rng })} ${street(rng)}`;\n}\n\nfunction country(rng: Rng): string {\n return pick(COUNTRIES, rng)[0];\n}\n\nfunction countryCode(rng: Rng): string {\n return pick(COUNTRIES, rng)[1];\n}\n\n/** A one-line postal address, the shape a shipping form expects. */\nfunction address(rng: Rng): string {\n return `${streetAddress(rng)}, ${pick(CITIES, rng)} ${digits(5, rng)}, ${country(rng)}`;\n}\n\nexport const addressSpecs: readonly FakerSpec[] = [\n { name: \"street\", doc: \"A street name.\", result: t.string, make: street },\n {\n name: \"streetAddress\",\n doc: \"A street name with a building number.\",\n result: t.string,\n make: streetAddress,\n },\n { name: \"address\", doc: \"A full one-line postal address.\", result: t.string, make: address },\n {\n name: \"buildingNumber\",\n doc: \"A building number.\",\n result: t.number,\n make: (rng) => intBetween({ min: 1, max: 9999, rng }),\n },\n { name: \"city\", doc: \"A city name.\", result: t.string, make: (rng) => pick(CITIES, rng) },\n { name: \"country\", doc: \"A country name.\", result: t.string, make: country },\n { name: \"countryCode\", doc: \"An ISO 3166-1 alpha-2 code.\", result: t.string, make: countryCode },\n {\n name: \"zip\",\n doc: \"A five-digit postal code.\",\n result: t.string,\n make: (rng) => digits(5, rng),\n },\n {\n name: \"latitude\",\n doc: \"A latitude in degrees, between -90 and 90.\",\n result: t.number,\n make: (rng) => floatBetween({ min: -90, max: 90, decimals: 6, rng }),\n },\n {\n name: \"longitude\",\n doc: \"A longitude in degrees, between -180 and 180.\",\n result: t.number,\n make: (rng) => floatBetween({ min: -180, max: 180, decimals: 6, rng }),\n },\n {\n name: \"timezone\",\n doc: \"An IANA time zone name.\",\n result: t.string,\n make: (rng) => pick(TIMEZONES, rng),\n },\n];\n","// Check digits for Brazilian documents. A CPF or CNPJ with the wrong digits is\n// refused by the form before the request leaves the browser, so getting them\n// right is what makes a generated document usable in a real test.\n\n/**\n * The two CPF check digits.\n *\n * @param base The first nine digits, unformatted.\n * @returns Two digits to append.\n */\nexport function cpfDigits(base: string): string {\n const first = cpfDigit(base, 10);\n return `${first}${cpfDigit(`${base}${first}`, 11)}`;\n}\n\nfunction cpfDigit(base: string, weight: number): string {\n let sum = 0;\n for (let index = 0; index < base.length; index += 1) {\n sum += Number(base[index]) * (weight - index);\n }\n const rest = (sum * 10) % 11;\n return String(rest === 10 ? 0 : rest);\n}\n\nconst CNPJ_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];\n\n/**\n * The two CNPJ check digits.\n *\n * @param base The first twelve digits, unformatted.\n * @returns Two digits to append.\n */\nexport function cnpjDigits(base: string): string {\n const first = cnpjDigit(base);\n return `${first}${cnpjDigit(`${base}${first}`)}`;\n}\n\nfunction cnpjDigit(base: string): string {\n const weights = CNPJ_WEIGHTS.slice(CNPJ_WEIGHTS.length - base.length);\n let sum = 0;\n for (let index = 0; index < base.length; index += 1) {\n sum += Number(base[index]) * (weights[index] ?? 0);\n }\n const rest = sum % 11;\n return String(rest < 2 ? 0 : 11 - rest);\n}\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport { cnpjDigits, cpfDigits } from \"./brazil-documents.js\";\nimport { BR_CITIES, BR_STATES, BR_STREET_NAMES, BR_STREET_TYPES } from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { chars, digits, intBetween, pick } from \"./primitives.js\";\n\n/** A CPF with correct check digits, formatted `000.000.000-00`. */\nfunction cpf(rng: Rng): string {\n const base = digits(9, rng);\n const full = `${base}${cpfDigits(base)}`;\n return `${full.slice(0, 3)}.${full.slice(3, 6)}.${full.slice(6, 9)}-${full.slice(9)}`;\n}\n\n/** A CNPJ with correct check digits, formatted `00.000.000/0001-00`. */\nfunction cnpj(rng: Rng): string {\n const base = `${digits(8, rng)}0001`;\n const full = `${base}${cnpjDigits(base)}`;\n return `${full.slice(0, 2)}.${full.slice(2, 5)}.${full.slice(5, 8)}/${full.slice(8, 12)}-${full.slice(12)}`;\n}\n\nfunction cep(rng: Rng): string {\n return `${digits(5, rng)}-${digits(3, rng)}`;\n}\n\n/** A mobile number, `(11) 9XXXX-XXXX`. */\nfunction phone(rng: Rng): string {\n const area = intBetween({ min: 11, max: 99, rng });\n return `(${area}) 9${digits(4, rng)}-${digits(4, rng)}`;\n}\n\n/** A Mercosul plate, `ABC1D23`. */\nfunction plate(rng: Rng): string {\n const letters = (count: number): string =>\n chars({ count, alphabet: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", rng });\n return `${letters(3)}${digits(1, rng)}${letters(1)}${digits(2, rng)}`;\n}\n\nfunction street(rng: Rng): string {\n return `${pick(BR_STREET_TYPES, rng)} ${pick(BR_STREET_NAMES, rng)}`;\n}\n\nfunction address(rng: Rng): string {\n const state = pick(BR_STATES, rng)[1];\n const number = intBetween({ min: 1, max: 4000, rng });\n return `${street(rng)}, ${number} — ${pick(BR_CITIES, rng)}/${state}, ${cep(rng)}`;\n}\n\nexport const brazilSpecs: readonly FakerSpec[] = [\n { name: \"br.cpf\", doc: \"A CPF with valid check digits.\", result: t.string, make: cpf },\n { name: \"br.cnpj\", doc: \"A CNPJ with valid check digits.\", result: t.string, make: cnpj },\n { name: \"br.cep\", doc: \"A postal code as `00000-000`.\", result: t.string, make: cep },\n { name: \"br.phone\", doc: \"A Brazilian mobile number.\", result: t.string, make: phone },\n { name: \"br.plate\", doc: \"A Mercosul licence plate.\", result: t.string, make: plate },\n { name: \"br.street\", doc: \"A Brazilian street name.\", result: t.string, make: street },\n { name: \"br.address\", doc: \"A full Brazilian address.\", result: t.string, make: address },\n {\n name: \"br.city\",\n doc: \"A Brazilian city.\",\n result: t.string,\n make: (rng) => pick(BR_CITIES, rng),\n },\n {\n name: \"br.state\",\n doc: \"A Brazilian federal unit, by name.\",\n result: t.string,\n make: (rng) => pick(BR_STATES, rng)[0],\n },\n {\n name: \"br.stateCode\",\n doc: \"A Brazilian federal unit, by two-letter code.\",\n result: t.string,\n make: (rng) => pick(BR_STATES, rng)[1],\n },\n];\n","import { pad } from \"./primitives.js\";\n\n// Check digits for the numbers real forms validate locally. A card, barcode or\n// IBAN with the wrong digit is rejected before any network call, so a generator\n// that skips these produces values no checkout would ever accept.\n\n/**\n * The Luhn check digit for a card number.\n *\n * @param base The digits preceding the check digit.\n * @returns One digit. Appending it makes `base` pass the Luhn test.\n */\nexport function luhnDigit(base: string): string {\n let sum = 0;\n let double = true;\n for (let index = base.length - 1; index >= 0; index -= 1) {\n const scaled = Number(base[index]) * (double ? 2 : 1);\n sum += scaled > 9 ? scaled - 9 : scaled;\n double = !double;\n }\n return String((10 - (sum % 10)) % 10);\n}\n\n/**\n * The EAN-13 check digit for the leading 12 digits of a barcode.\n *\n * @param base Exactly 12 digits.\n * @returns The thirteenth digit.\n */\nexport function eanDigit(base: string): string {\n let sum = 0;\n for (let index = 0; index < base.length; index += 1) {\n sum += Number(base[index]) * (index % 2 === 0 ? 1 : 3);\n }\n return String((10 - (sum % 10)) % 10);\n}\n\n/**\n * The two IBAN check digits: mod-97 over the rearranged, letter-expanded account.\n *\n * @param country The two-letter country code, upper case.\n * @param account The account part, without check digits.\n * @returns Two digits, zero-padded, to be inserted after the country code.\n */\nexport function ibanCheck(country: string, account: string): string {\n const rearranged = `${account}${country}00`;\n const expanded = rearranged.replace(/[A-Z]/g, (letter) => String(letter.charCodeAt(0) - 55));\n return pad(98 - mod97(expanded), 2);\n}\n\n/** Mod 97 digit by digit, because an expanded IBAN overflows `Number`. */\nfunction mod97(value: string): number {\n let rest = 0;\n for (const char of value) rest = (rest * 10 + Number(char)) % 97;\n return rest;\n}\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport { eanDigit } from \"./check-digits.js\";\nimport { ADJECTIVES, CATEGORIES, COLORS, MATERIALS, PRODUCTS } from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { capitalize, chars, digits, floatBetween, pick } from \"./primitives.js\";\n\nfunction productName(rng: Rng): string {\n const adjective = capitalize(pick(ADJECTIVES, rng));\n return `${adjective} ${pick(MATERIALS, rng)} ${pick(PRODUCTS, rng)}`;\n}\n\nfunction sku(rng: Rng): string {\n const letters = chars({ count: 3, alphabet: \"ABCDEFGHJKLMNPQRSTUVWXYZ\", rng });\n return `${letters}-${digits(5, rng)}`;\n}\n\n/** A 13-digit EAN with a real check digit, so barcode validators accept it. */\nfunction barcode(rng: Rng): string {\n const base = digits(12, rng);\n return `${base}${eanDigit(base)}`;\n}\n\nexport const commerceSpecs: readonly FakerSpec[] = [\n {\n name: \"product\",\n doc: \"A product noun.\",\n result: t.string,\n make: (rng) => pick(PRODUCTS, rng),\n },\n { name: \"productName\", doc: \"A full product name.\", result: t.string, make: productName },\n { name: \"sku\", doc: \"A stock keeping unit.\", result: t.string, make: sku },\n { name: \"barcode\", doc: \"A valid EAN-13 barcode.\", result: t.string, make: barcode },\n {\n name: \"category\",\n doc: \"A product category.\",\n result: t.string,\n make: (rng) => pick(CATEGORIES, rng),\n },\n {\n name: \"material\",\n doc: \"A material, like `leather`.\",\n result: t.string,\n make: (rng) => pick(MATERIALS, rng),\n },\n { name: \"color\", doc: \"A colour name.\", result: t.string, make: (rng) => pick(COLORS, rng)[0] },\n {\n name: \"hexColor\",\n doc: \"A colour as a hex triplet, like `#1e88e5`.\",\n result: t.string,\n make: (rng) => pick(COLORS, rng)[1],\n },\n {\n name: \"price\",\n doc: \"A retail price with two decimal places.\",\n result: t.number,\n make: (rng) => floatBetween({ min: 5, max: 500, decimals: 2, rng }),\n },\n];\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport {\n BUZZWORDS,\n CATCH_VERBS,\n COMPANY_ROOTS,\n COMPANY_SUFFIXES,\n DEPARTMENTS,\n} from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { capitalize, pick } from \"./primitives.js\";\n\nfunction company(rng: Rng): string {\n return `${pick(COMPANY_ROOTS, rng)} ${pick(COMPANY_SUFFIXES, rng)}`;\n}\n\nfunction catchPhrase(rng: Rng): string {\n return `${capitalize(pick(CATCH_VERBS, rng))} your ${pick(BUZZWORDS, rng)}`;\n}\n\nexport const companySpecs: readonly FakerSpec[] = [\n { name: \"company\", doc: \"A company name.\", result: t.string, make: company },\n {\n name: \"department\",\n doc: \"A department name.\",\n result: t.string,\n make: (rng) => pick(DEPARTMENTS, rng),\n },\n {\n name: \"catchPhrase\",\n doc: \"A marketing catch phrase.\",\n result: t.string,\n make: catchPhrase,\n },\n {\n name: \"buzzword\",\n doc: \"A single piece of business jargon.\",\n result: t.string,\n make: (rng) => pick(BUZZWORDS, rng),\n },\n];\n","import { optionalArg } from \"@venn-lang/sdk\";\nimport { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { intBetween, numArg, pad, pick } from \"./primitives.js\";\n\n/**\n * The instant every generated date is measured from.\n *\n * Dates hang off a fixed anchor rather than the wall clock: `Date.now()` would\n * give a different answer on every run and break the seeded replay guarantee.\n */\nexport const ANCHOR: number = Date.UTC(2025, 0, 1);\n\nconst DAY = 86_400_000;\nconst YEAR = 365 * DAY;\n\nconst WEEKDAYS = [\"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\", \"Sunday\"];\nconst MONTHS = [\n \"January\",\n \"February\",\n \"March\",\n \"April\",\n \"May\",\n \"June\",\n \"July\",\n \"August\",\n \"September\",\n \"October\",\n \"November\",\n \"December\",\n];\n\nfunction offsetFrom(args: { rng: Rng; min: number; max: number }): number {\n return ANCHOR + intBetween({ min: args.min, max: args.max, rng: args.rng });\n}\n\n/** `YYYY-MM-DD` within five years either side of the anchor. */\nfunction isoDate(rng: Rng): string {\n const at = offsetFrom({ rng, min: -5 * YEAR, max: 5 * YEAR });\n return new Date(at).toISOString().slice(0, 10);\n}\n\nfunction isoDateTime(rng: Rng): string {\n return new Date(offsetFrom({ rng, min: -5 * YEAR, max: 5 * YEAR })).toISOString();\n}\n\nfunction pastDate(rng: Rng): string {\n return new Date(offsetFrom({ rng, min: -5 * YEAR, max: -DAY })).toISOString();\n}\n\nfunction futureDate(rng: Rng): string {\n return new Date(offsetFrom({ rng, min: DAY, max: 5 * YEAR })).toISOString();\n}\n\n/** `HH:MM:SS` on a 24-hour clock. */\nfunction time(rng: Rng): string {\n const part = (max: number): string => pad(intBetween({ min: 0, max, rng }), 2);\n return `${part(23)}:${part(59)}:${part(59)}`;\n}\n\n/** Seconds since the epoch, the unit `exp` and `iat` claims use. */\nfunction timestamp(rng: Rng): number {\n return Math.floor(offsetFrom({ rng, min: -5 * YEAR, max: 5 * YEAR }) / 1000);\n}\n\nexport const datetimeSpecs: readonly FakerSpec[] = [\n { name: \"date\", doc: \"A date as `YYYY-MM-DD`.\", result: t.string, make: isoDate },\n { name: \"dateTime\", doc: \"An ISO 8601 instant.\", result: t.string, make: isoDateTime },\n {\n name: \"pastDate\",\n doc: \"An ISO 8601 instant before the anchor.\",\n result: t.string,\n make: pastDate,\n },\n {\n name: \"futureDate\",\n doc: \"An ISO 8601 instant after the anchor.\",\n result: t.string,\n make: futureDate,\n },\n { name: \"time\", doc: \"A time of day as `HH:MM:SS`.\", result: t.string, make: time },\n { name: \"timestamp\", doc: \"Seconds since the Unix epoch.\", result: t.number, make: timestamp },\n {\n name: \"weekday\",\n doc: \"A day of the week.\",\n result: t.string,\n make: (rng) => pick(WEEKDAYS, rng),\n },\n { name: \"month\", doc: \"A month name.\", result: t.string, make: (rng) => pick(MONTHS, rng) },\n {\n name: \"year\",\n doc: \"A year. `faker.year(2000, 2030)` bounds it.\",\n result: t.number,\n args: [\n optionalArg(\"from\", t.number, \"The earliest year, included.\"),\n optionalArg(\"to\", t.number, \"The latest year, included.\"),\n ],\n make: (rng, args) =>\n intBetween({ min: numArg(args, 0, 1980), max: numArg(args, 1, 2030), rng }),\n },\n];\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport { ibanCheck, luhnDigit } from \"./check-digits.js\";\nimport { CARD_BRANDS, CURRENCIES } from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { chars, digits, floatBetween, intBetween, pad, pick } from \"./primitives.js\";\n\n/** A 16-digit card number that passes Luhn, grouped `#### #### #### ####`. */\nfunction creditCard(rng: Rng): string {\n const [, prefix, length] = pick(CARD_BRANDS, rng);\n const base = `${prefix}${digits(length - prefix.length - 1, rng)}`;\n const full = `${base}${luhnDigit(base)}`;\n return (full.match(/.{1,4}/g) ?? []).join(\" \");\n}\n\nfunction expiryDate(rng: Rng): string {\n const month = intBetween({ min: 1, max: 12, rng });\n return `${pad(month, 2)}/${intBetween({ min: 26, max: 34, rng })}`;\n}\n\n/** An IBAN with correct mod-97 check digits. */\nfunction iban(rng: Rng): string {\n const country = \"DE\";\n const account = digits(18, rng);\n return `${country}${ibanCheck(country, account)}${account}`;\n}\n\nfunction bic(rng: Rng): string {\n const letters = (count: number): string =>\n chars({ count, alphabet: \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\", rng });\n return `${letters(4)}${letters(2)}${letters(2)}`;\n}\n\nexport const financeSpecs: readonly FakerSpec[] = [\n {\n name: \"creditCard\",\n doc: \"A 16-digit card number that passes the Luhn check.\",\n result: t.string,\n make: creditCard,\n },\n {\n name: \"cardType\",\n doc: \"A card brand, like `Visa`.\",\n result: t.string,\n make: (rng) => pick(CARD_BRANDS, rng)[0],\n },\n {\n name: \"cvv\",\n doc: \"A three-digit card security code.\",\n result: t.string,\n make: (rng) => digits(3, rng),\n },\n { name: \"expiryDate\", doc: \"A card expiry as `MM/YY`.\", result: t.string, make: expiryDate },\n { name: \"iban\", doc: \"An IBAN with valid check digits.\", result: t.string, make: iban },\n { name: \"bic\", doc: \"A SWIFT/BIC code.\", result: t.string, make: bic },\n {\n name: \"accountNumber\",\n doc: \"A bank account number.\",\n result: t.string,\n make: (rng) => digits(10, rng),\n },\n {\n name: \"currencyCode\",\n doc: \"An ISO 4217 currency code, like `BRL`.\",\n result: t.string,\n make: (rng) => pick(CURRENCIES, rng)[0],\n },\n {\n name: \"currencySymbol\",\n doc: \"A currency symbol, like `R$`.\",\n result: t.string,\n make: (rng) => pick(CURRENCIES, rng)[1],\n },\n {\n name: \"currencyName\",\n doc: \"A currency name, like `Brazilian Real`.\",\n result: t.string,\n make: (rng) => pick(CURRENCIES, rng)[2],\n },\n {\n name: \"amount\",\n doc: \"A monetary amount with two decimal places.\",\n result: t.number,\n make: (rng) => floatBetween({ min: 1, max: 10000, decimals: 2, rng }),\n },\n];\n","import { optionalArg } from \"@venn-lang/sdk\";\nimport { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { ALNUM, chars, digits, floatBetween, HEX, intBetween, numArg } from \"./primitives.js\";\n\n/** An RFC 4122 v4 UUID. The version and variant bits are stamped, not drawn. */\nexport function uuid(rng: Rng): string {\n const hex = (count: number): string => chars({ count, alphabet: HEX, rng });\n const variant = \"89ab\".charAt(Math.floor(rng() * 4));\n return `${hex(8)}-${hex(4)}-4${hex(3)}-${variant}${hex(3)}-${hex(12)}`;\n}\n\nconst NANO_ALPHABET = `${ALNUM}_-`;\n\nexport const idSpecs: readonly FakerSpec[] = [\n { name: \"uuid\", doc: \"A v4 UUID.\", result: t.string, make: uuid },\n {\n name: \"nanoid\",\n doc: \"A 21-character NanoID. `faker.nanoid(10)` sets the length.\",\n result: t.string,\n args: [optionalArg(\"length\", t.number, \"How many characters. 21 by default.\")],\n make: (rng, args) => chars({ count: numArg(args, 0, 21), alphabet: NANO_ALPHABET, rng }),\n },\n {\n name: \"objectId\",\n doc: \"A 24-character MongoDB ObjectId.\",\n result: t.string,\n make: (rng) => chars({ count: 24, alphabet: HEX, rng }),\n },\n {\n name: \"hex\",\n doc: \"Hex characters. `faker.hex(32)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"length\", t.number, \"How many characters.\")],\n make: (rng, args) => chars({ count: numArg(args, 0, 16), alphabet: HEX, rng }),\n },\n {\n name: \"token\",\n doc: \"A 32-character opaque token.\",\n result: t.string,\n make: (rng) => chars({ count: 32, alphabet: ALNUM, rng }),\n },\n {\n name: \"alphanumeric\",\n doc: \"Letters and digits. `faker.alphanumeric(8)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"length\", t.number, \"How many characters.\")],\n make: (rng, args) => chars({ count: numArg(args, 0, 8), alphabet: ALNUM, rng }),\n },\n {\n name: \"digits\",\n doc: \"Decimal digits. `faker.digits(6)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"length\", t.number, \"How many digits.\")],\n make: (rng, args) => digits(numArg(args, 0, 6), rng),\n },\n {\n name: \"int\",\n doc: \"An integer. `faker.int(1, 10)` bounds it, inclusive.\",\n result: t.number,\n args: [\n optionalArg(\"min\", t.number, \"The lowest it may be, included.\"),\n optionalArg(\"max\", t.number, \"The highest it may be, included.\"),\n ],\n make: (rng, args) => intBetween({ min: numArg(args, 0, 0), max: numArg(args, 1, 100), rng }),\n },\n {\n name: \"float\",\n doc: \"A number with two decimals. `faker.float(0, 1)` bounds it.\",\n result: t.number,\n args: [\n optionalArg(\"min\", t.number, \"The lowest it may be.\"),\n optionalArg(\"max\", t.number, \"The highest it may be.\"),\n ],\n make: (rng, args) =>\n floatBetween({ min: numArg(args, 0, 0), max: numArg(args, 1, 1), decimals: 2, rng }),\n },\n { name: \"boolean\", doc: \"`true` or `false`.\", result: t.bool, make: (rng) => rng() < 0.5 },\n];\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport {\n FIRST_NAMES,\n GENDERS,\n JOB_TITLES,\n LAST_NAMES,\n NAME_PREFIXES,\n NAME_SUFFIXES,\n} from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { digits, intBetween, pad, pick } from \"./primitives.js\";\n\n/** A given name, e.g. `\"Grace\"`. */\nexport function firstName(rng: Rng): string {\n return pick(FIRST_NAMES, rng);\n}\n\n/** A family name, e.g. `\"Hopper\"`. */\nexport function lastName(rng: Rng): string {\n return pick(LAST_NAMES, rng);\n}\n\n/** A full name, e.g. `\"Grace Hopper\"`. */\nexport function fullName(rng: Rng): string {\n return `${firstName(rng)} ${lastName(rng)}`;\n}\n\nfunction birthDate(rng: Rng): string {\n const year = intBetween({ min: 1950, max: 2006, rng });\n const month = intBetween({ min: 1, max: 12, rng });\n const day = intBetween({ min: 1, max: 28, rng });\n return `${year}-${pad(month, 2)}-${pad(day, 2)}`;\n}\n\n/** `+1 555 01xx`, the range reserved for fiction, so it can never reach anyone. */\nfunction phone(rng: Rng): string {\n return `+1 555 01${digits(2, rng)}`;\n}\n\nexport const personSpecs: readonly FakerSpec[] = [\n { name: \"firstName\", doc: \"A given name.\", result: t.string, make: firstName },\n { name: \"lastName\", doc: \"A family name.\", result: t.string, make: lastName },\n { name: \"name\", doc: \"A full name.\", result: t.string, make: fullName },\n { name: \"fullName\", doc: \"A full name.\", result: t.string, make: fullName },\n {\n name: \"prefix\",\n doc: \"An honorific that precedes a name, like `Dra.`.\",\n result: t.string,\n make: (rng) => pick(NAME_PREFIXES, rng),\n },\n {\n name: \"suffix\",\n doc: \"A generational suffix that follows a name, like `Neto`.\",\n result: t.string,\n make: (rng) => pick(NAME_SUFFIXES, rng),\n },\n {\n name: \"gender\",\n doc: \"A gender value shaped the way most forms model them.\",\n result: t.string,\n make: (rng) => pick(GENDERS, rng),\n },\n {\n name: \"jobTitle\",\n doc: \"A job title, like `Site Reliability Engineer`.\",\n result: t.string,\n make: (rng) => pick(JOB_TITLES, rng),\n },\n {\n name: \"age\",\n doc: \"An adult age, between 18 and 80.\",\n result: t.number,\n make: (rng) => intBetween({ min: 18, max: 80, rng }),\n },\n {\n name: \"birthDate\",\n doc: \"A birth date as `YYYY-MM-DD`.\",\n result: t.string,\n make: birthDate,\n },\n {\n name: \"phone\",\n doc: \"An international phone number in the range reserved for fiction.\",\n result: t.string,\n make: phone,\n },\n];\n","import { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport {\n ADJECTIVES,\n HTTP_METHODS,\n HTTP_STATUSES,\n MIME_TYPES,\n NOUNS,\n PROTOCOLS,\n SAFE_DOMAINS,\n TLDS,\n USER_AGENTS,\n} from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { firstName, lastName } from \"./person.js\";\nimport { ALNUM, chars, digits, HEX, intBetween, pick, slug } from \"./primitives.js\";\n\n/** An email on a reserved domain, e.g. `\"grace.hopper@example.test\"`. It reaches nobody. */\nexport function email(rng: Rng): string {\n const local = `${slug(firstName(rng))}.${slug(lastName(rng))}`;\n return `${local}@${pick(SAFE_DOMAINS, rng)}`;\n}\n\nfunction username(rng: Rng): string {\n return `${slug(firstName(rng))}${intBetween({ min: 1, max: 99, rng })}`;\n}\n\nfunction password(rng: Rng): string {\n return chars({ count: 14, alphabet: `${ALNUM}!@#$%&*?`, rng });\n}\n\nfunction domain(rng: Rng): string {\n return `${pick(ADJECTIVES, rng)}${pick(NOUNS, rng)}.${pick(TLDS, rng)}`;\n}\n\nfunction url(rng: Rng): string {\n return `${pick(PROTOCOLS, rng)}://${domain(rng)}/${pick(NOUNS, rng)}`;\n}\n\nfunction ipv4(rng: Rng): string {\n const octet = (): number => intBetween({ min: 1, max: 254, rng });\n return `${octet()}.${octet()}.${octet()}.${octet()}`;\n}\n\nfunction ipv6(rng: Rng): string {\n const group = (): string => chars({ count: 4, alphabet: HEX, rng });\n return Array.from({ length: 8 }, group).join(\":\");\n}\n\nfunction mac(rng: Rng): string {\n const pair = (): string => chars({ count: 2, alphabet: HEX, rng }).toUpperCase();\n return Array.from({ length: 6 }, pair).join(\":\");\n}\n\nexport const internetSpecs: readonly FakerSpec[] = [\n { name: \"email\", doc: \"An email address on a reserved domain.\", result: t.string, make: email },\n { name: \"username\", doc: \"A login name.\", result: t.string, make: username },\n { name: \"password\", doc: \"A 14-character password.\", result: t.string, make: password },\n { name: \"domain\", doc: \"A domain name.\", result: t.string, make: domain },\n { name: \"url\", doc: \"An absolute URL.\", result: t.string, make: url },\n { name: \"ipv4\", doc: \"An IPv4 address.\", result: t.string, make: ipv4 },\n { name: \"ipv6\", doc: \"An IPv6 address.\", result: t.string, make: ipv6 },\n { name: \"mac\", doc: \"A MAC address.\", result: t.string, make: mac },\n {\n name: \"port\",\n doc: \"An unprivileged TCP port.\",\n result: t.number,\n make: (rng) => intBetween({ min: 1024, max: 65535, rng }),\n },\n {\n name: \"userAgent\",\n doc: \"A browser User-Agent string.\",\n result: t.string,\n make: (rng) => pick(USER_AGENTS, rng),\n },\n {\n name: \"slug\",\n doc: \"A URL slug, like `bright-harbour-417`.\",\n result: t.string,\n make: (rng) => `${pick(ADJECTIVES, rng)}-${pick(NOUNS, rng)}-${digits(3, rng)}`,\n },\n {\n name: \"httpMethod\",\n doc: \"An HTTP verb.\",\n result: t.string,\n make: (rng) => pick(HTTP_METHODS, rng),\n },\n {\n name: \"httpStatus\",\n doc: \"An HTTP status code that servers really return.\",\n result: t.number,\n make: (rng) => pick(HTTP_STATUSES, rng),\n },\n {\n name: \"mimeType\",\n doc: \"A MIME type.\",\n result: t.string,\n make: (rng) => pick(MIME_TYPES, rng),\n },\n];\n","import { optionalArg } from \"@venn-lang/sdk\";\nimport { t } from \"@venn-lang/types\";\nimport type { Rng } from \"../rng/index.js\";\nimport { ADJECTIVES, LOREM, NOUNS } from \"./data/index.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { capitalize, intBetween, numArg, pick, times } from \"./primitives.js\";\n\nfunction words(rng: Rng, count: number): string {\n return times(count, () => pick(LOREM, rng)).join(\" \");\n}\n\n/** A capitalised sentence of 6 to 14 words, ending in a full stop. */\nfunction sentence(rng: Rng): string {\n return `${capitalize(words(rng, intBetween({ min: 6, max: 14, rng })))}.`;\n}\n\nfunction sentences(rng: Rng, count: number): string {\n return times(count, () => sentence(rng)).join(\" \");\n}\n\nfunction paragraph(rng: Rng): string {\n return sentences(rng, intBetween({ min: 3, max: 6, rng }));\n}\n\n/** A headline in title case, e.g. `\"Bright Harbour\"`. */\nfunction title(rng: Rng): string {\n return `${capitalize(pick(ADJECTIVES, rng))} ${capitalize(pick(NOUNS, rng))}`;\n}\n\nexport const textSpecs: readonly FakerSpec[] = [\n { name: \"word\", doc: \"A single word.\", result: t.string, make: (rng) => pick(LOREM, rng) },\n {\n name: \"words\",\n doc: \"Several words. `faker.words(5)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"count\", t.number, \"How many words.\")],\n make: (rng, args) => words(rng, numArg(args, 0, 3)),\n },\n { name: \"sentence\", doc: \"One sentence.\", result: t.string, make: sentence },\n {\n name: \"sentences\",\n doc: \"Several sentences. `faker.sentences(3)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"count\", t.number, \"How many sentences.\")],\n make: (rng, args) => sentences(rng, numArg(args, 0, 3)),\n },\n { name: \"paragraph\", doc: \"One paragraph.\", result: t.string, make: paragraph },\n {\n name: \"paragraphs\",\n doc: \"Several paragraphs, separated by blank lines. `faker.paragraphs(4)` sets how many.\",\n result: t.string,\n args: [optionalArg(\"count\", t.number, \"How many paragraphs.\")],\n make: (rng, args) => times(numArg(args, 0, 2), () => paragraph(rng)).join(\"\\n\\n\"),\n },\n { name: \"title\", doc: \"A short headline in title case.\", result: t.string, make: title },\n];\n","import { addressSpecs } from \"./address.js\";\nimport { brazilSpecs } from \"./brazil.js\";\nimport { commerceSpecs } from \"./commerce.js\";\nimport { companySpecs } from \"./company.js\";\nimport { datetimeSpecs } from \"./datetime.js\";\nimport type { FakerSpec } from \"./faker.types.js\";\nimport { financeSpecs } from \"./finance.js\";\nimport { idSpecs } from \"./ids.js\";\nimport { internetSpecs } from \"./internet.js\";\nimport { personSpecs } from \"./person.js\";\nimport { textSpecs } from \"./text.js\";\n\n/** Every `data.faker.*` verb. Adding a whole category is one line here. */\nexport const allFakerSpecs: readonly FakerSpec[] = [\n ...personSpecs,\n ...internetSpecs,\n ...addressSpecs,\n ...companySpecs,\n ...commerceSpecs,\n ...financeSpecs,\n ...datetimeSpecs,\n ...textSpecs,\n ...idSpecs,\n ...brazilSpecs,\n];\n","import type { Rng } from \"./rng.types.js\";\n\n/**\n * Mulberry32: a tiny, fast, fully deterministic PRNG.\n *\n * @param seed Any number. It is coerced to a uint32, so the same seed always\n * yields the same stream.\n * @returns A generator producing the next float in [0, 1) on each call.\n */\nexport function mulberry32(seed: number): Rng {\n let state = seed >>> 0;\n return () => {\n state = (state + 0x6d2b79f5) | 0;\n let t = Math.imul(state ^ (state >>> 15), 1 | state);\n t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n };\n}\n","import { mulberry32 } from \"./mulberry32.js\";\nimport type { Rng } from \"./rng.types.js\";\n\n/** The fixed seed. A constant seed is what makes every generated value reproducible. */\nconst SEED = 1;\n\nlet shared: Rng = mulberry32(SEED);\n\n/** The module-level deterministic PRNG shared by every generator in this package. */\nexport const rng: Rng = () => shared();\n\n/** Reset the shared PRNG to its seed so the same stream can be drawn again. Used by tests. */\nexport function resetRng(): void {\n shared = mulberry32(SEED);\n}\n","import type { Rng } from \"./rng.types.js\";\n\n/**\n * Fisher-Yates shuffle driven by the given PRNG.\n *\n * @returns A new array holding the same elements in a new order. `items` is untouched.\n */\nexport function shuffleWith(items: readonly unknown[], rng: Rng): unknown[] {\n const out = [...items];\n for (let i = out.length - 1; i > 0; i -= 1) {\n const j = Math.floor(rng() * (i + 1));\n const tmp = out[i];\n out[i] = out[j];\n out[j] = tmp;\n }\n return out;\n}\n","import { type ActionDefinition, defineAction } from \"@venn-lang/sdk\";\nimport { allFakerSpecs, type FakerSpec } from \"../faker/index.js\";\nimport { rng } from \"../rng/index.js\";\n\n/** Turn one spec into the `data.faker.<name>` verb, drawn from the shared PRNG. */\nfunction toAction(spec: FakerSpec): ActionDefinition {\n return defineAction({\n name: `faker.${spec.name}`,\n doc: spec.doc,\n // A faker verb takes bounds, not options, so every argument is positional:\n // `faker.int(1, 10)`. The spec declares which ones it reads.\n args: spec.args,\n result: spec.result,\n run: (_ctx, input) => spec.make(rng, input.args),\n });\n}\n\n/**\n * The `data.faker.*` verbs. Every value is deterministic under the shared seed,\n * so a failing run replays exactly. The catalogue itself lives in `faker/`.\n */\nexport const fakerActions: ActionDefinition[] = allFakerSpecs.map(toAction);\n","import type { CsvRow } from \"./csv.types.js\";\n\n/**\n * Parse a CSV string into row objects. The first line supplies the headers.\n *\n * A minimal splitter: it takes inline content only (never a path) and does not\n * understand quoting, so a quoted cell containing a comma splits in two.\n *\n * @param content The CSV text. Blank lines are skipped.\n * @returns One object per data line, keyed by header. Empty when there is no header line.\n */\nexport function parseCsv(content: string): CsvRow[] {\n const lines = content.split(/\\r?\\n/).filter((line) => line.trim() !== \"\");\n const [header, ...rows] = lines;\n if (header === undefined) return [];\n const headers = splitLine(header);\n return rows.map((row) => toRow(headers, splitLine(row)));\n}\n\nfunction splitLine(line: string): string[] {\n return line.split(\",\").map((cell) => cell.trim());\n}\n\nfunction toRow(headers: readonly string[], cells: readonly string[]): CsvRow {\n const row: CsvRow = {};\n headers.forEach((key, index) => {\n row[key] = cells[index] ?? \"\";\n });\n return row;\n}\n","import { type ActionDefinition, arg, defineAction } from \"@venn-lang/sdk\";\nimport { t } from \"@venn-lang/types\";\nimport { parseCsv } from \"../csv/index.js\";\n\n/**\n * `data.csv(text)`: parse an inline CSV string into a list of `data.Row`.\n *\n * The first line names the columns. Every cell arrives as a string.\n */\nexport const csv: ActionDefinition = defineAction({\n name: \"csv\",\n doc: \"Parse an inline CSV string into an array of row objects (first line = headers).\",\n args: [arg(\"text\", t.string, \"The CSV itself. Its first line names the columns.\")],\n result: t.list(t.ref(\"data.Row\")),\n run: (_ctx, input) => parseCsv(String(input.args[0] ?? \"\")),\n});\n\n/**\n * `data.json(text)`: parse a JSON string into a value.\n *\n * Throws whatever `JSON.parse` throws when the text is not valid JSON.\n */\nexport const json: ActionDefinition = defineAction({\n name: \"json\",\n doc: \"Parse a JSON string into a value.\",\n // The result is `dynamic` on purpose: only the text knows its shape, and\n // guessing one here would make the checker enforce the guess.\n args: [arg(\"text\", t.string, \"The JSON to read.\")],\n result: t.dynamic,\n run: (_ctx, input) => JSON.parse(String(input.args[0] ?? \"null\")),\n});\n","import {\n type ActionDefinition,\n type ActionInput,\n arg,\n defineAction,\n restArg,\n} from \"@venn-lang/sdk\";\nimport { t } from \"@venn-lang/types\";\nimport { rng, shuffleWith } from \"../rng/index.js\";\n\n/** `data.oneOf(\"free\", \"pro\")`: pick one of the given values via the shared PRNG. */\nexport const oneOf: ActionDefinition = defineAction({\n name: \"oneOf\",\n doc: \"Pick one of the given values deterministically.\",\n args: [restArg(\"choices\", t.dynamic, \"The candidates. One of them comes back.\")],\n result: t.dynamic,\n run: (_ctx, input) => input.args[Math.floor(rng() * input.args.length)],\n});\n\n/** `data.range(1, 10)`: a deterministic integer in the inclusive range [min, max]. */\nexport const range: ActionDefinition = defineAction({\n name: \"range\",\n doc: \"A deterministic integer within the inclusive range [min, max].\",\n args: [\n arg(\"min\", t.number, \"The lowest it may be, included.\"),\n arg(\"max\", t.number, \"The highest it may be, included.\"),\n ],\n result: t.number,\n run: (_ctx, input) => integerInRange(input),\n});\n\nfunction integerInRange(input: ActionInput<unknown>): number {\n const min = Math.trunc(Number(input.args[0] ?? 0));\n const max = Math.trunc(Number(input.args[1] ?? 0));\n return min + Math.floor(rng() * (max - min + 1));\n}\n\n/** `data.shuffle([1, 2, 3])`: a deterministic permutation of the given array. */\nexport const shuffle: ActionDefinition = defineAction({\n name: \"shuffle\",\n doc: \"A deterministic shuffle of the given array.\",\n // Elements come back unchanged, only reordered, but a signature cannot carry\n // the element type through, so both sides stay `dynamic`.\n args: [arg(\"values\", t.list(t.dynamic), \"What to shuffle. The original is left alone.\")],\n result: t.list(t.dynamic),\n run: (_ctx, input) => shuffleWith(toArray(input.args[0]), rng),\n});\n\nfunction toArray(value: unknown): readonly unknown[] {\n return Array.isArray(value) ? value : [];\n}\n","import type { ActionDefinition } from \"@venn-lang/sdk\";\nimport { fakerActions } from \"./faker-actions.js\";\nimport { csv, json } from \"./parse-actions.js\";\nimport { oneOf, range, shuffle } from \"./random-actions.js\";\n\n/** Every verb in the `data` namespace. Adding one is a single line here. */\nexport const dataActions: ActionDefinition[] = [...fakerActions, oneOf, range, shuffle, csv, json];\n","import { type TypeSpec, t } from \"@venn-lang/types\";\n\n/**\n * The named types `@venn-lang/data` publishes to scripts, keyed by their bare name.\n *\n * Hand-mirrored from `csv/csv.types.ts`: the two must agree, so change them together.\n */\nexport const dataTypeDefs: Readonly<Record<string, TypeSpec>> = {\n /**\n * One parsed CSV record. The keys come from the file's header line, so they\n * cannot be named here. Only the cell type is knowable, and it is always a string.\n */\n Row: t.map(t.string),\n};\n","import { definePlugin, type PluginDefinition } from \"@venn-lang/sdk\";\nimport { dataActions } from \"./actions/index.js\";\nimport { dataTypeDefs } from \"./types.js\";\n\n/**\n * The `data` plugin: pure, deterministic test-data generators.\n *\n * Every verb draws from a seeded module-level PRNG, so the same script replays the\n * same values. Nothing here does I/O, so there is no capability and no port to bind.\n */\nexport const dataPlugin: PluginDefinition = definePlugin({\n name: \"venn/data\",\n version: \"0.0.0\",\n namespace: \"data\",\n actions: dataActions,\n typeDefs: dataTypeDefs,\n});\n"],"mappings":";;;AAAA,MAAa,gBAAmC;CAC9C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,mBAAsC;CACjD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,cAAiC;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,YAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,cAAiC;CAC5C;CACA;CACA;CACA;CACA;CACA;AACF;;;AC/EA,MAAa,WAA8B;CACzC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,YAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,SAAsC;CACjD,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;CACnB,CAAC,OAAO,SAAS;CACjB,CAAC,QAAQ,SAAS;CAClB,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;CACnB,CAAC,UAAU,SAAS;CACpB,CAAC,QAAQ,SAAS;CAClB,CAAC,SAAS,SAAS;CACnB,CAAC,SAAS,SAAS;AACrB;;AAGA,MAAa,aAAkD;CAC7D;EAAC;EAAO;EAAM;CAAgB;CAC9B;EAAC;EAAO;EAAK;CAAW;CACxB;EAAC;EAAO;EAAK;CAAM;CACnB;EAAC;EAAO;EAAK;CAAgB;CAC7B;EAAC;EAAO;EAAK;CAAc;CAC3B;EAAC;EAAO;EAAK;CAAiB;AAChC;;AAGA,MAAa,cAAmD;CAC9D;EAAC;EAAQ;EAAK;CAAE;CAChB;EAAC;EAAc;EAAM;CAAE;CACvB;EAAC;EAAc;EAAM;CAAE;CACvB;EAAC;EAAY;EAAQ;CAAE;CACvB;EAAC;EAAO;EAAQ;CAAE;AACpB;;;;ACvEA,MAAa,cAAiC;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,gBAAmC;CAAC;CAAO;CAAQ;CAAO;CAAQ;CAAS;AAAM;;AAG9F,MAAa,gBAAmC;CAAC;CAAO;CAAQ;CAAS;CAAM;AAAK;;AAGpF,MAAa,UAA6B;CAAC;CAAU;CAAQ;CAAc;AAAmB;;;AC5F9F,MAAa,SAA4B;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,YAAyC;CACpD,CAAC,UAAU,IAAI;CACf,CAAC,YAAY,IAAI;CACjB,CAAC,eAAe,IAAI;CACpB,CAAC,WAAW,IAAI;CAChB,CAAC,UAAU,IAAI;CACf,CAAC,iBAAiB,IAAI;CACtB,CAAC,WAAW,IAAI;CAChB,CAAC,eAAe,IAAI;CACpB,CAAC,SAAS,IAAI;CACd,CAAC,WAAW,IAAI;CAChB,CAAC,WAAW,IAAI;CAChB,CAAC,UAAU,IAAI;AACjB;AAEA,MAAa,eAAkC;CAC7C;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,YAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAGA,MAAa,YAAyC;CACpD,CAAC,aAAa,IAAI;CAClB,CAAC,kBAAkB,IAAI;CACvB,CAAC,gBAAgB,IAAI;CACrB,CAAC,SAAS,IAAI;CACd,CAAC,UAAU,IAAI;CACf,CAAC,qBAAqB,IAAI;CAC1B,CAAC,cAAc,IAAI;CACnB,CAAC,SAAS,IAAI;CACd,CAAC,kBAAkB,IAAI;CACvB,CAAC,SAAS,IAAI;CACd,CAAC,QAAQ,IAAI;CACb,CAAC,kBAAkB,IAAI;CACvB,CAAC,YAAY,IAAI;CACjB,CAAC,oBAAoB,IAAI;AAC3B;AAEA,MAAa,YAA+B;CAC1C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,kBAAqC;CAChD;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,kBAAqC;CAChD;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;;;AC3GA,MAAa,eAAkC;CAC7C;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,OAA0B;CAAC;CAAO;CAAO;CAAO;CAAM;CAAO;CAAO;AAAQ;AAEzF,MAAa,eAAkC;CAC7C;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,gBAAmC;CAC9C;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;CAAK;AAClF;AAEA,MAAa,aAAgC;CAC3C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAEA,MAAa,cAAiC;CAC5C;CACA;CACA;CACA;AACF;AAEA,MAAa,YAA+B,CAAC,SAAS,MAAM;;;;AC3C5D,MAAa,QAA2B;CACtC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;C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"}
package/package.json ADDED
@@ -0,0 +1,54 @@
1
+ {
2
+ "name": "@venn-lang/data",
3
+ "version": "0.1.0",
4
+ "description": "The data namespace: 96 deterministic faker verbs, plus picking, shuffling and parsing.",
5
+ "keywords": [
6
+ "venn",
7
+ "testing",
8
+ "e2e",
9
+ "data"
10
+ ],
11
+ "homepage": "https://github.com/venn-lang/venn/tree/main/packages/std-data#readme",
12
+ "bugs": "https://github.com/venn-lang/venn/issues",
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+https://github.com/venn-lang/venn.git",
16
+ "directory": "packages/std-data"
17
+ },
18
+ "license": "MIT",
19
+ "author": "Vinicius Borges",
20
+ "type": "module",
21
+ "sideEffects": false,
22
+ "exports": {
23
+ ".": {
24
+ "development": "./src/index.ts",
25
+ "types": "./dist/index.d.ts",
26
+ "import": "./dist/index.js",
27
+ "default": "./dist/index.js"
28
+ }
29
+ },
30
+ "files": [
31
+ "dist",
32
+ "src",
33
+ "!src/**/*.test.ts",
34
+ "!src/**/*.suite.ts"
35
+ ],
36
+ "publishConfig": {
37
+ "access": "public"
38
+ },
39
+ "dependencies": {
40
+ "@venn-lang/contracts": "0.1.0",
41
+ "@venn-lang/sdk": "0.1.0",
42
+ "@venn-lang/types": "0.1.0"
43
+ },
44
+ "devDependencies": {
45
+ "tsdown": "^0.22.14",
46
+ "typescript": "^7.0.2",
47
+ "vitest": "^4.1.10"
48
+ },
49
+ "scripts": {
50
+ "build": "tsdown",
51
+ "test": "vitest run",
52
+ "typecheck": "tsc --noEmit"
53
+ }
54
+ }
@@ -0,0 +1,22 @@
1
+ import { type ActionDefinition, defineAction } from "@venn-lang/sdk";
2
+ import { allFakerSpecs, type FakerSpec } from "../faker/index.js";
3
+ import { rng } from "../rng/index.js";
4
+
5
+ /** Turn one spec into the `data.faker.<name>` verb, drawn from the shared PRNG. */
6
+ function toAction(spec: FakerSpec): ActionDefinition {
7
+ return defineAction({
8
+ name: `faker.${spec.name}`,
9
+ doc: spec.doc,
10
+ // A faker verb takes bounds, not options, so every argument is positional:
11
+ // `faker.int(1, 10)`. The spec declares which ones it reads.
12
+ args: spec.args,
13
+ result: spec.result,
14
+ run: (_ctx, input) => spec.make(rng, input.args),
15
+ });
16
+ }
17
+
18
+ /**
19
+ * The `data.faker.*` verbs. Every value is deterministic under the shared seed,
20
+ * so a failing run replays exactly. The catalogue itself lives in `faker/`.
21
+ */
22
+ export const fakerActions: ActionDefinition[] = allFakerSpecs.map(toAction);
@@ -0,0 +1,7 @@
1
+ import type { ActionDefinition } from "@venn-lang/sdk";
2
+ import { fakerActions } from "./faker-actions.js";
3
+ import { csv, json } from "./parse-actions.js";
4
+ import { oneOf, range, shuffle } from "./random-actions.js";
5
+
6
+ /** Every verb in the `data` namespace. Adding one is a single line here. */
7
+ export const dataActions: ActionDefinition[] = [...fakerActions, oneOf, range, shuffle, csv, json];
@@ -0,0 +1,31 @@
1
+ import { type ActionDefinition, arg, defineAction } from "@venn-lang/sdk";
2
+ import { t } from "@venn-lang/types";
3
+ import { parseCsv } from "../csv/index.js";
4
+
5
+ /**
6
+ * `data.csv(text)`: parse an inline CSV string into a list of `data.Row`.
7
+ *
8
+ * The first line names the columns. Every cell arrives as a string.
9
+ */
10
+ export const csv: ActionDefinition = defineAction({
11
+ name: "csv",
12
+ doc: "Parse an inline CSV string into an array of row objects (first line = headers).",
13
+ args: [arg("text", t.string, "The CSV itself. Its first line names the columns.")],
14
+ result: t.list(t.ref("data.Row")),
15
+ run: (_ctx, input) => parseCsv(String(input.args[0] ?? "")),
16
+ });
17
+
18
+ /**
19
+ * `data.json(text)`: parse a JSON string into a value.
20
+ *
21
+ * Throws whatever `JSON.parse` throws when the text is not valid JSON.
22
+ */
23
+ export const json: ActionDefinition = defineAction({
24
+ name: "json",
25
+ doc: "Parse a JSON string into a value.",
26
+ // The result is `dynamic` on purpose: only the text knows its shape, and
27
+ // guessing one here would make the checker enforce the guess.
28
+ args: [arg("text", t.string, "The JSON to read.")],
29
+ result: t.dynamic,
30
+ run: (_ctx, input) => JSON.parse(String(input.args[0] ?? "null")),
31
+ });
@@ -0,0 +1,51 @@
1
+ import {
2
+ type ActionDefinition,
3
+ type ActionInput,
4
+ arg,
5
+ defineAction,
6
+ restArg,
7
+ } from "@venn-lang/sdk";
8
+ import { t } from "@venn-lang/types";
9
+ import { rng, shuffleWith } from "../rng/index.js";
10
+
11
+ /** `data.oneOf("free", "pro")`: pick one of the given values via the shared PRNG. */
12
+ export const oneOf: ActionDefinition = defineAction({
13
+ name: "oneOf",
14
+ doc: "Pick one of the given values deterministically.",
15
+ args: [restArg("choices", t.dynamic, "The candidates. One of them comes back.")],
16
+ result: t.dynamic,
17
+ run: (_ctx, input) => input.args[Math.floor(rng() * input.args.length)],
18
+ });
19
+
20
+ /** `data.range(1, 10)`: a deterministic integer in the inclusive range [min, max]. */
21
+ export const range: ActionDefinition = defineAction({
22
+ name: "range",
23
+ doc: "A deterministic integer within the inclusive range [min, max].",
24
+ args: [
25
+ arg("min", t.number, "The lowest it may be, included."),
26
+ arg("max", t.number, "The highest it may be, included."),
27
+ ],
28
+ result: t.number,
29
+ run: (_ctx, input) => integerInRange(input),
30
+ });
31
+
32
+ function integerInRange(input: ActionInput<unknown>): number {
33
+ const min = Math.trunc(Number(input.args[0] ?? 0));
34
+ const max = Math.trunc(Number(input.args[1] ?? 0));
35
+ return min + Math.floor(rng() * (max - min + 1));
36
+ }
37
+
38
+ /** `data.shuffle([1, 2, 3])`: a deterministic permutation of the given array. */
39
+ export const shuffle: ActionDefinition = defineAction({
40
+ name: "shuffle",
41
+ doc: "A deterministic shuffle of the given array.",
42
+ // Elements come back unchanged, only reordered, but a signature cannot carry
43
+ // the element type through, so both sides stay `dynamic`.
44
+ args: [arg("values", t.list(t.dynamic), "What to shuffle. The original is left alone.")],
45
+ result: t.list(t.dynamic),
46
+ run: (_ctx, input) => shuffleWith(toArray(input.args[0]), rng),
47
+ });
48
+
49
+ function toArray(value: unknown): readonly unknown[] {
50
+ return Array.isArray(value) ? value : [];
51
+ }
@@ -0,0 +1,2 @@
1
+ /** One parsed CSV record: header name → cell value, both strings. */
2
+ export type CsvRow = Record<string, string>;
@@ -0,0 +1,2 @@
1
+ export type { CsvRow } from "./csv.types.js";
2
+ export { parseCsv } from "./parse-csv.js";
@@ -0,0 +1,30 @@
1
+ import type { CsvRow } from "./csv.types.js";
2
+
3
+ /**
4
+ * Parse a CSV string into row objects. The first line supplies the headers.
5
+ *
6
+ * A minimal splitter: it takes inline content only (never a path) and does not
7
+ * understand quoting, so a quoted cell containing a comma splits in two.
8
+ *
9
+ * @param content The CSV text. Blank lines are skipped.
10
+ * @returns One object per data line, keyed by header. Empty when there is no header line.
11
+ */
12
+ export function parseCsv(content: string): CsvRow[] {
13
+ const lines = content.split(/\r?\n/).filter((line) => line.trim() !== "");
14
+ const [header, ...rows] = lines;
15
+ if (header === undefined) return [];
16
+ const headers = splitLine(header);
17
+ return rows.map((row) => toRow(headers, splitLine(row)));
18
+ }
19
+
20
+ function splitLine(line: string): string[] {
21
+ return line.split(",").map((cell) => cell.trim());
22
+ }
23
+
24
+ function toRow(headers: readonly string[], cells: readonly string[]): CsvRow {
25
+ const row: CsvRow = {};
26
+ headers.forEach((key, index) => {
27
+ row[key] = cells[index] ?? "";
28
+ });
29
+ return row;
30
+ }
@@ -0,0 +1,70 @@
1
+ import { t } from "@venn-lang/types";
2
+ import type { Rng } from "../rng/index.js";
3
+ import { CITIES, COUNTRIES, NOUNS, STREET_TYPES, TIMEZONES } from "./data/index.js";
4
+ import type { FakerSpec } from "./faker.types.js";
5
+ import { capitalize, digits, floatBetween, intBetween, pick } from "./primitives.js";
6
+
7
+ function street(rng: Rng): string {
8
+ return `${capitalize(pick(NOUNS, rng))} ${pick(STREET_TYPES, rng)}`;
9
+ }
10
+
11
+ function streetAddress(rng: Rng): string {
12
+ return `${intBetween({ min: 1, max: 9999, rng })} ${street(rng)}`;
13
+ }
14
+
15
+ function country(rng: Rng): string {
16
+ return pick(COUNTRIES, rng)[0];
17
+ }
18
+
19
+ function countryCode(rng: Rng): string {
20
+ return pick(COUNTRIES, rng)[1];
21
+ }
22
+
23
+ /** A one-line postal address, the shape a shipping form expects. */
24
+ function address(rng: Rng): string {
25
+ return `${streetAddress(rng)}, ${pick(CITIES, rng)} ${digits(5, rng)}, ${country(rng)}`;
26
+ }
27
+
28
+ export const addressSpecs: readonly FakerSpec[] = [
29
+ { name: "street", doc: "A street name.", result: t.string, make: street },
30
+ {
31
+ name: "streetAddress",
32
+ doc: "A street name with a building number.",
33
+ result: t.string,
34
+ make: streetAddress,
35
+ },
36
+ { name: "address", doc: "A full one-line postal address.", result: t.string, make: address },
37
+ {
38
+ name: "buildingNumber",
39
+ doc: "A building number.",
40
+ result: t.number,
41
+ make: (rng) => intBetween({ min: 1, max: 9999, rng }),
42
+ },
43
+ { name: "city", doc: "A city name.", result: t.string, make: (rng) => pick(CITIES, rng) },
44
+ { name: "country", doc: "A country name.", result: t.string, make: country },
45
+ { name: "countryCode", doc: "An ISO 3166-1 alpha-2 code.", result: t.string, make: countryCode },
46
+ {
47
+ name: "zip",
48
+ doc: "A five-digit postal code.",
49
+ result: t.string,
50
+ make: (rng) => digits(5, rng),
51
+ },
52
+ {
53
+ name: "latitude",
54
+ doc: "A latitude in degrees, between -90 and 90.",
55
+ result: t.number,
56
+ make: (rng) => floatBetween({ min: -90, max: 90, decimals: 6, rng }),
57
+ },
58
+ {
59
+ name: "longitude",
60
+ doc: "A longitude in degrees, between -180 and 180.",
61
+ result: t.number,
62
+ make: (rng) => floatBetween({ min: -180, max: 180, decimals: 6, rng }),
63
+ },
64
+ {
65
+ name: "timezone",
66
+ doc: "An IANA time zone name.",
67
+ result: t.string,
68
+ make: (rng) => pick(TIMEZONES, rng),
69
+ },
70
+ ];
@@ -0,0 +1,25 @@
1
+ import { addressSpecs } from "./address.js";
2
+ import { brazilSpecs } from "./brazil.js";
3
+ import { commerceSpecs } from "./commerce.js";
4
+ import { companySpecs } from "./company.js";
5
+ import { datetimeSpecs } from "./datetime.js";
6
+ import type { FakerSpec } from "./faker.types.js";
7
+ import { financeSpecs } from "./finance.js";
8
+ import { idSpecs } from "./ids.js";
9
+ import { internetSpecs } from "./internet.js";
10
+ import { personSpecs } from "./person.js";
11
+ import { textSpecs } from "./text.js";
12
+
13
+ /** Every `data.faker.*` verb. Adding a whole category is one line here. */
14
+ export const allFakerSpecs: readonly FakerSpec[] = [
15
+ ...personSpecs,
16
+ ...internetSpecs,
17
+ ...addressSpecs,
18
+ ...companySpecs,
19
+ ...commerceSpecs,
20
+ ...financeSpecs,
21
+ ...datetimeSpecs,
22
+ ...textSpecs,
23
+ ...idSpecs,
24
+ ...brazilSpecs,
25
+ ];
@@ -0,0 +1,46 @@
1
+ // Check digits for Brazilian documents. A CPF or CNPJ with the wrong digits is
2
+ // refused by the form before the request leaves the browser, so getting them
3
+ // right is what makes a generated document usable in a real test.
4
+
5
+ /**
6
+ * The two CPF check digits.
7
+ *
8
+ * @param base The first nine digits, unformatted.
9
+ * @returns Two digits to append.
10
+ */
11
+ export function cpfDigits(base: string): string {
12
+ const first = cpfDigit(base, 10);
13
+ return `${first}${cpfDigit(`${base}${first}`, 11)}`;
14
+ }
15
+
16
+ function cpfDigit(base: string, weight: number): string {
17
+ let sum = 0;
18
+ for (let index = 0; index < base.length; index += 1) {
19
+ sum += Number(base[index]) * (weight - index);
20
+ }
21
+ const rest = (sum * 10) % 11;
22
+ return String(rest === 10 ? 0 : rest);
23
+ }
24
+
25
+ const CNPJ_WEIGHTS = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
26
+
27
+ /**
28
+ * The two CNPJ check digits.
29
+ *
30
+ * @param base The first twelve digits, unformatted.
31
+ * @returns Two digits to append.
32
+ */
33
+ export function cnpjDigits(base: string): string {
34
+ const first = cnpjDigit(base);
35
+ return `${first}${cnpjDigit(`${base}${first}`)}`;
36
+ }
37
+
38
+ function cnpjDigit(base: string): string {
39
+ const weights = CNPJ_WEIGHTS.slice(CNPJ_WEIGHTS.length - base.length);
40
+ let sum = 0;
41
+ for (let index = 0; index < base.length; index += 1) {
42
+ sum += Number(base[index]) * (weights[index] ?? 0);
43
+ }
44
+ const rest = sum % 11;
45
+ return String(rest < 2 ? 0 : 11 - rest);
46
+ }
@@ -0,0 +1,75 @@
1
+ import { t } from "@venn-lang/types";
2
+ import type { Rng } from "../rng/index.js";
3
+ import { cnpjDigits, cpfDigits } from "./brazil-documents.js";
4
+ import { BR_CITIES, BR_STATES, BR_STREET_NAMES, BR_STREET_TYPES } from "./data/index.js";
5
+ import type { FakerSpec } from "./faker.types.js";
6
+ import { chars, digits, intBetween, pick } from "./primitives.js";
7
+
8
+ /** A CPF with correct check digits, formatted `000.000.000-00`. */
9
+ function cpf(rng: Rng): string {
10
+ const base = digits(9, rng);
11
+ const full = `${base}${cpfDigits(base)}`;
12
+ return `${full.slice(0, 3)}.${full.slice(3, 6)}.${full.slice(6, 9)}-${full.slice(9)}`;
13
+ }
14
+
15
+ /** A CNPJ with correct check digits, formatted `00.000.000/0001-00`. */
16
+ function cnpj(rng: Rng): string {
17
+ const base = `${digits(8, rng)}0001`;
18
+ const full = `${base}${cnpjDigits(base)}`;
19
+ return `${full.slice(0, 2)}.${full.slice(2, 5)}.${full.slice(5, 8)}/${full.slice(8, 12)}-${full.slice(12)}`;
20
+ }
21
+
22
+ function cep(rng: Rng): string {
23
+ return `${digits(5, rng)}-${digits(3, rng)}`;
24
+ }
25
+
26
+ /** A mobile number, `(11) 9XXXX-XXXX`. */
27
+ function phone(rng: Rng): string {
28
+ const area = intBetween({ min: 11, max: 99, rng });
29
+ return `(${area}) 9${digits(4, rng)}-${digits(4, rng)}`;
30
+ }
31
+
32
+ /** A Mercosul plate, `ABC1D23`. */
33
+ function plate(rng: Rng): string {
34
+ const letters = (count: number): string =>
35
+ chars({ count, alphabet: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", rng });
36
+ return `${letters(3)}${digits(1, rng)}${letters(1)}${digits(2, rng)}`;
37
+ }
38
+
39
+ function street(rng: Rng): string {
40
+ return `${pick(BR_STREET_TYPES, rng)} ${pick(BR_STREET_NAMES, rng)}`;
41
+ }
42
+
43
+ function address(rng: Rng): string {
44
+ const state = pick(BR_STATES, rng)[1];
45
+ const number = intBetween({ min: 1, max: 4000, rng });
46
+ return `${street(rng)}, ${number} — ${pick(BR_CITIES, rng)}/${state}, ${cep(rng)}`;
47
+ }
48
+
49
+ export const brazilSpecs: readonly FakerSpec[] = [
50
+ { name: "br.cpf", doc: "A CPF with valid check digits.", result: t.string, make: cpf },
51
+ { name: "br.cnpj", doc: "A CNPJ with valid check digits.", result: t.string, make: cnpj },
52
+ { name: "br.cep", doc: "A postal code as `00000-000`.", result: t.string, make: cep },
53
+ { name: "br.phone", doc: "A Brazilian mobile number.", result: t.string, make: phone },
54
+ { name: "br.plate", doc: "A Mercosul licence plate.", result: t.string, make: plate },
55
+ { name: "br.street", doc: "A Brazilian street name.", result: t.string, make: street },
56
+ { name: "br.address", doc: "A full Brazilian address.", result: t.string, make: address },
57
+ {
58
+ name: "br.city",
59
+ doc: "A Brazilian city.",
60
+ result: t.string,
61
+ make: (rng) => pick(BR_CITIES, rng),
62
+ },
63
+ {
64
+ name: "br.state",
65
+ doc: "A Brazilian federal unit, by name.",
66
+ result: t.string,
67
+ make: (rng) => pick(BR_STATES, rng)[0],
68
+ },
69
+ {
70
+ name: "br.stateCode",
71
+ doc: "A Brazilian federal unit, by two-letter code.",
72
+ result: t.string,
73
+ make: (rng) => pick(BR_STATES, rng)[1],
74
+ },
75
+ ];