@cosyte/synth 0.0.9 → 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 (55) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +21 -12
  3. package/dist/astm/index.cjs +18 -6
  4. package/dist/astm/index.cjs.map +1 -1
  5. package/dist/astm/index.d.cts +2 -2
  6. package/dist/astm/index.d.ts +2 -2
  7. package/dist/astm/index.mjs +18 -6
  8. package/dist/astm/index.mjs.map +1 -1
  9. package/dist/ccda/index.cjs +23 -7
  10. package/dist/ccda/index.cjs.map +1 -1
  11. package/dist/ccda/index.d.cts +2 -2
  12. package/dist/ccda/index.d.ts +2 -2
  13. package/dist/ccda/index.mjs +23 -7
  14. package/dist/ccda/index.mjs.map +1 -1
  15. package/dist/deid/index.cjs +26 -8
  16. package/dist/deid/index.cjs.map +1 -1
  17. package/dist/deid/index.d.cts +2 -2
  18. package/dist/deid/index.d.ts +2 -2
  19. package/dist/deid/index.mjs +26 -8
  20. package/dist/deid/index.mjs.map +1 -1
  21. package/dist/fhir/index.cjs +174 -7
  22. package/dist/fhir/index.cjs.map +1 -1
  23. package/dist/fhir/index.d.cts +163 -2
  24. package/dist/fhir/index.d.ts +163 -2
  25. package/dist/fhir/index.mjs +171 -9
  26. package/dist/fhir/index.mjs.map +1 -1
  27. package/dist/hl7/index.cjs +18 -6
  28. package/dist/hl7/index.cjs.map +1 -1
  29. package/dist/hl7/index.d.cts +2 -2
  30. package/dist/hl7/index.d.ts +2 -2
  31. package/dist/hl7/index.mjs +18 -6
  32. package/dist/hl7/index.mjs.map +1 -1
  33. package/dist/index.cjs +37 -6
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.d.cts +172 -38
  36. package/dist/index.d.ts +172 -38
  37. package/dist/index.mjs +36 -7
  38. package/dist/index.mjs.map +1 -1
  39. package/dist/ncpdp/index.cjs +18 -6
  40. package/dist/ncpdp/index.cjs.map +1 -1
  41. package/dist/ncpdp/index.d.cts +1 -1
  42. package/dist/ncpdp/index.d.ts +1 -1
  43. package/dist/ncpdp/index.mjs +18 -6
  44. package/dist/ncpdp/index.mjs.map +1 -1
  45. package/dist/{providers-B9uVinAe.d.cts → providers-BQtPk3PN.d.cts} +18 -4
  46. package/dist/{providers-B9uVinAe.d.ts → providers-BQtPk3PN.d.ts} +18 -4
  47. package/dist/{quirk-HZdznAkM.d.ts → quirk-Bzx9g8KG.d.ts} +1 -1
  48. package/dist/{quirk-IaHp4z7N.d.cts → quirk-C_lZrspq.d.cts} +1 -1
  49. package/dist/x12/index.cjs +18 -6
  50. package/dist/x12/index.cjs.map +1 -1
  51. package/dist/x12/index.d.cts +1 -1
  52. package/dist/x12/index.d.ts +1 -1
  53. package/dist/x12/index.mjs +18 -6
  54. package/dist/x12/index.mjs.map +1 -1
  55. package/package.json +54 -30
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/rng/splitmix32.ts","../../src/rng/sfc32.ts","../../src/codes.ts","../../src/rng/rng.ts","../../src/corpus.ts","../../src/safe/reserved.ts","../../src/safe/names-pool.ts","../../src/safe/providers.ts","../../src/safe/index.ts","../../src/fhir/us-core.ts","../../src/fhir/example-codes.ts","../../src/ccda/example-codes.ts","../../src/ccda/identity.ts","../../src/select.ts","../../src/ccda/ccd.ts","../../src/ccda/round-trip.ts","../../src/profile.ts","../../src/quirk.ts","../../src/ccda/quirk.ts","../../src/ccda/index.ts"],"names":["LOINC","SNOMED_CT","RXNORM","CVX","NCI_ROUTE","buildCcda","serializeCcda","parseCcda","name","ccdaProfiles"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `splitmix32`: a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed,\n * and only the seed, determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state): the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets**: statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it: {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate: its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract:\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal, never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal,\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal: a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal, never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal: a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal, never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal:\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES}: the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry**: the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design: it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route, not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng`: the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed, and only the seed, determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run: the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable: its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The `Corpus` abstraction: a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen**: this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact: the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from: regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic**: the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: authoritative ranges published by SSA, NANPA, and the\n * IETF that are guaranteed never to denote a real person or a real routable resource. Every provider\n * draws only from these; the predicates here are the executable half of the CI synthetic-safety gate:\n * they let a test assert that no emitted value falls **outside** a reserved source.\n *\n * Sources:\n * - **SSN**, SSA never issues area numbers `000`, `666`, or `900–999`; the `987-65-4320…4329` block\n * is SSA's explicitly-reserved advertising range. (ssa.gov)\n * - **Phone**, NANP reserves `555-0100…555-0199` as the fictional/non-working line range. (nanpa.com)\n * - **Email/domain**, RFC 2606 / RFC 6761 reserved: `example.com`/`.net`/`.org` and the `.example`,\n * `.test`, `.invalid`, `.localhost` TLDs.\n * - **IP**, RFC 5737 IPv4 TEST-NET-1/2/3 (`192.0.2.0/24`, `198.51.100.0/24`, `203.0.113.0/24`) and\n * RFC 3849 IPv6 documentation prefix `2001:db8::/32`.\n * - **NPI**, a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base (CMS NPI check-digit rule, ISO\n * 7812). A number whose check digit is **wrong** therefore cannot be a NPPES-issued NPI. `synth`\n * emits NPIs with a deliberately-invalid check digit, so no generated NPI can collide with a real\n * provider.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under. There is **no** reserved MRN range (an MRN is unique only within its assigning-authority /\n * OID namespace), so, as a documented design decision, every synthetic identifier\n * is scoped to a namespace that clearly cannot be a real facility's: a `SYNTH`-labelled authority whose\n * OID lives under HL7's designated **example** root `2.16.840.1.113883.19`. A value under this AA can\n * never collide with a real record because the *namespace itself* is synthetic.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id, an OID under HL7's example arc `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check (the CMS NPI check-digit\n * rule: `80840` is the ISO 7812 issuer identifier for the US health-application namespace). A real\n * NPI satisfies `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base: the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * @param base9 - The 9-digit NPI base (positions 1–9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3, so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose: they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The published DEA checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1–6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic**: its check digit\n * (the 7th digit) does **not** match the published DEA checksum, so it cannot be a validly-issued DEA\n * registration. A checksum-valid DEA number (which *could* denote a real prescriber) returns `false`; a\n * value that is not the DEA shape returns `false`.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base: true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic**, i.e. its check digit is invalid, so it cannot be\n * a NPPES-issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true: invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false: Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string is drawn from an SSA never-issued / reserved\n * space: area `000`, `666`, or `900–999`. A real, issuable SSN returns `false`.\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (never issued)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool**: `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address: the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose: structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer: every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng}, same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address: synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits): unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN**: dashed `AAA-GG-SSSS`. Default draws the SSA never-issued area space\n * (`900–999`); `block: \"advertising\"` draws SSA's reserved advertising block (`987-65-4320…4329`).\n * A value from this function can never be a real SSN.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // SSA's explicitly-reserved advertising block: last digit 0..9 within -4320..-4329.\n return `987-65-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n const group = rng.digits(2);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block: `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain: `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block, never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32`, never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker,\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI**: a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true: invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number**: `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so, like {@link npi}, non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true: invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address**: a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations: structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace: the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool, no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * US Core + base-FHIR **canonical URLs and code-system identifiers**: the facts `@cosyte/synth` needs\n * to emit US-Core-conformant resources, and nothing more.\n *\n * **Content-free, exactly like `@cosyte/fhir`.** These are *identifiers*: canonical URLs and code\n * `system` URIs, not the copyrighted terminology tables or the profile `StructureDefinition` content\n * they name. `@cosyte/synth` bundles **no** US Core IG: a consumer who wants to *validate* generated\n * output against US Core supplies the `StructureDefinition`s themselves (BYO), exactly as\n * `@cosyte/fhir.validateResource({ profiles })` requires. What is encoded here is only which canonical\n * URL a resource's `meta.profile` claims and which `system` a coding carries: public facts.\n *\n * The URLs target **US Core 6.1.0** (the USCDI v3 / ONC HTI-1 §170.315(g)(10) anchor, FHIR R4 4.0.1),\n * grounded firsthand against the published IG (`hl7.org/fhir/us/core/STU6.1`): the same version the\n * test corpus validates against.\n *\n * @module\n */\n\n/** The canonical `meta.profile` URLs for the US Core 6.1.0 profiles `@cosyte/synth` generates. */\nexport const US_CORE_PROFILE = Object.freeze({\n /** US Core Patient. */\n PATIENT: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient\",\n /** US Core Condition (Problems and Health Concerns). */\n CONDITION:\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns\",\n /** US Core Laboratory Result Observation. */\n OBSERVATION_LAB: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-observation-lab\",\n /** US Core Vital Signs (derived from the base FHIR vital-signs profile). */\n VITAL_SIGNS: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs\",\n /** US Core MedicationRequest. */\n MEDICATION_REQUEST: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationrequest\",\n /** US Core Encounter. */\n ENCOUNTER: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter\",\n /** US Core DiagnosticReport Profile for Laboratory Results Reporting. */\n DIAGNOSTIC_REPORT_LAB:\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-lab\",\n /** US Core Immunization. */\n IMMUNIZATION: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-immunization\",\n /** US Core AllergyIntolerance. */\n ALLERGY_INTOLERANCE: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-allergyintolerance\",\n /** US Core Procedure. */\n PROCEDURE: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-procedure\",\n} as const);\n\n/** The US Core `us-core-race` extension URL (a Patient must-support extension). */\nexport const US_CORE_RACE_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race\";\n/** The US Core `us-core-ethnicity` extension URL (a Patient must-support extension). */\nexport const US_CORE_ETHNICITY_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity\";\n/** The US Core `us-core-birthsex` extension URL (a Patient must-support extension). */\nexport const US_CORE_BIRTHSEX_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex\";\n\n/**\n * The code-system `system` URIs the generators reference. Public identity URIs (HL7-published),\n * never the code-system *content*, no SNOMED/LOINC/RxNorm table is bundled.\n */\nexport const SYSTEM = Object.freeze({\n /** FHIR `administrative-gender` (`Patient.gender`). */\n ADMINISTRATIVE_GENDER: \"http://hl7.org/fhir/administrative-gender\",\n /** HL7 Terminology `observation-category`. */\n OBSERVATION_CATEGORY: \"http://terminology.hl7.org/CodeSystem/observation-category\",\n /** HL7 Terminology `condition-category`. */\n CONDITION_CATEGORY: \"http://terminology.hl7.org/CodeSystem/condition-category\",\n /** HL7 Terminology `condition-clinical`. */\n CONDITION_CLINICAL: \"http://terminology.hl7.org/CodeSystem/condition-clinical\",\n /** HL7 Terminology `condition-ver-status`. */\n CONDITION_VER_STATUS: \"http://terminology.hl7.org/CodeSystem/condition-ver-status\",\n /** HL7 v2 `0203` identifier-type (`Identifier.type.coding.code` = `MR`). */\n IDENTIFIER_TYPE: \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n /** OMB race & ethnicity category system (US Core race/ethnicity `ombCategory`). */\n OMB_RACE_ETHNICITY: \"urn:oid:2.16.840.1.113883.6.238\",\n /** LOINC, `Observation.code` (lab + vital-signs). */\n LOINC: \"http://loinc.org\",\n /** SNOMED CT, `Condition.code`. */\n SNOMED: \"http://snomed.info/sct\",\n /** RxNorm, `MedicationRequest.medicationCodeableConcept` + an allergen substance. */\n RXNORM: \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n /** UCUM, `Quantity.system` for units of measure. */\n UCUM: \"http://unitsofmeasure.org\",\n /** CVX (CDC vaccine administered), `Immunization.vaccineCode`. */\n CVX: \"http://hl7.org/fhir/sid/cvx\",\n /** HL7 v3 `ActCode`, `Encounter.class`. */\n V3_ACT_CODE: \"http://terminology.hl7.org/CodeSystem/v3-ActCode\",\n /** HL7 v2 `0074` diagnostic-service-section, `DiagnosticReport.category` (`LAB`). */\n DIAGNOSTIC_SERVICE_SECTION: \"http://terminology.hl7.org/CodeSystem/v2-0074\",\n /** HL7 Terminology `allergyintolerance-clinical`, `AllergyIntolerance.clinicalStatus`. */\n ALLERGY_CLINICAL: \"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical\",\n /** HL7 Terminology `allergyintolerance-verification`, `AllergyIntolerance.verificationStatus`. */\n ALLERGY_VERIFICATION: \"http://terminology.hl7.org/CodeSystem/allergyintolerance-verification\",\n} as const);\n\n/** A US Core profile canonical URL. */\nexport type UsCoreProfileUrl = (typeof US_CORE_PROFILE)[keyof typeof US_CORE_PROFILE];\n","/**\n * A tiny, curated, **license-clean** pool of example codes for filling coded fields in generated FHIR\n * resources (`Observation.code`, `Condition.code`, `MedicationRequest.medication[x]`, and the OMB\n * race/ethnicity categories). These are **public code facts**: codes drawn from the published FHIR R4\n * and US Core specification examples, not copyrighted terminology tables: `@cosyte/synth` bundles\n * **no** SNOMED/LOINC/RxNorm content. The pool exists only so a\n * generated resource is *structurally* realistic; a consumer who needs their own codes supplies them.\n *\n * Nothing here is PHI: codes and their display text are not patient identifiers. The synthetic-safety\n * invariant governs identity fields (name/DOB/identifier/telecom/address), which come from `../safe`.\n *\n * @module\n */\n\n/** A coded concept: a `system` URI, a `code`, and its human-readable `display`. */\nexport interface CodeConcept {\n /** The code-system URI (`Coding.system`). */\n readonly system: string;\n /** The code value (`Coding.code`). */\n readonly code: string;\n /** The human-readable display text (`Coding.display`). */\n readonly display: string;\n}\n\n/**\n * A quantitative observation concept: a LOINC code plus the UCUM unit and a plausible synthetic value\n * range the seeded generator draws within. The range implies **no** real measurement: it only keeps a\n * generated result inside a structurally-sane band.\n */\nexport interface QuantConcept extends CodeConcept {\n /** The UCUM unit code (`Quantity.code` and, as text, `Quantity.unit`). */\n readonly unit: string;\n /** Inclusive lower bound of the synthetic value (in `unit`). */\n readonly low: number;\n /** Inclusive upper bound of the synthetic value (in `unit`). */\n readonly high: number;\n /** Decimal places to render (keeps the emitted `decimal` lexical form stable and realistic). */\n readonly decimals: number;\n}\n\nimport { SYSTEM } from \"./us-core.js\";\n\n/**\n * LOINC laboratory-result example codes (for a US Core Laboratory Result `Observation`). Public LOINC\n * identifiers used purely as illustrative structural fillers, with UCUM units and synthetic value bands.\n */\nexport const EXAMPLE_LAB_OBSERVATIONS: readonly QuantConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2345-7\",\n display: \"Glucose [Mass/volume] in Serum or Plasma\",\n unit: \"mg/dL\",\n low: 70,\n high: 140,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"718-7\",\n display: \"Hemoglobin [Mass/volume] in Blood\",\n unit: \"g/dL\",\n low: 12,\n high: 17,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2951-2\",\n display: \"Sodium [Moles/volume] in Serum or Plasma\",\n unit: \"mmol/L\",\n low: 135,\n high: 145,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2823-3\",\n display: \"Potassium [Moles/volume] in Serum or Plasma\",\n unit: \"mmol/L\",\n low: 4,\n high: 5,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"4548-4\",\n display: \"Hemoglobin A1c/Hemoglobin.total in Blood\",\n unit: \"%\",\n low: 4,\n high: 9,\n decimals: 1,\n }),\n]);\n\n/**\n * LOINC vital-sign example codes (for a US Core Vital Signs `Observation`). Public LOINC identifiers\n * with their required UCUM units and synthetic value bands. Simple single-value vitals only:\n * multi-component vitals (e.g. blood-pressure panel `85354-9`) are not generated.\n */\nexport const EXAMPLE_VITAL_SIGNS: readonly QuantConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8867-4\",\n display: \"Heart rate\",\n unit: \"/min\",\n low: 55,\n high: 100,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"9279-1\",\n display: \"Respiratory rate\",\n unit: \"/min\",\n low: 12,\n high: 20,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8310-5\",\n display: \"Body temperature\",\n unit: \"Cel\",\n low: 36,\n high: 38,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"29463-7\",\n display: \"Body weight\",\n unit: \"kg\",\n low: 50,\n high: 100,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8302-2\",\n display: \"Body height\",\n unit: \"cm\",\n low: 150,\n high: 190,\n decimals: 0,\n }),\n]);\n\n/**\n * SNOMED CT problem/condition example codes (for a US Core `Condition.code`). Public SNOMED identifiers\n * used as structural fillers; `@cosyte/synth` bundles no SNOMED content.\n */\nexport const EXAMPLE_CONDITIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.SNOMED, code: \"59621000\", display: \"Essential hypertension\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"44054006\", display: \"Type 2 diabetes mellitus\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"195967001\", display: \"Asthma\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"13645005\",\n display: \"Chronic obstructive lung disease\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"38341003\", display: \"Hypertensive disorder\" }),\n]);\n\n/**\n * RxNorm medication example codes (for a US Core `MedicationRequest.medicationCodeableConcept`). Public\n * RxNorm identifiers used as structural fillers; `@cosyte/synth` bundles no RxNorm content.\n */\nexport const EXAMPLE_MEDICATIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"1049221\",\n display: \"Acetaminophen 325 MG Oral Tablet\",\n }),\n Object.freeze({ system: SYSTEM.RXNORM, code: \"197361\", display: \"Amlodipine 5 MG Oral Tablet\" }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"860975\",\n display: \"24 HR Metformin hydrochloride 500 MG Extended Release Oral Tablet\",\n }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"308136\",\n display: \"Amoxicillin 250 MG Oral Capsule\",\n }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"617314\",\n display: \"Atorvastatin 40 MG Oral Tablet\",\n }),\n]);\n\n/**\n * OMB race categories (US Core `us-core-race` `ombCategory`): the five OMB categories, public code\n * facts from the CDC Race &amp; Ethnicity code system (`urn:oid:2.16.840.1.113883.6.238`).\n */\nexport const EXAMPLE_RACE_CATEGORIES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: \"2106-3\", display: \"White\" }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2054-5\",\n display: \"Black or African American\",\n }),\n Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: \"2028-9\", display: \"Asian\" }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"1002-5\",\n display: \"American Indian or Alaska Native\",\n }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2076-8\",\n display: \"Native Hawaiian or Other Pacific Islander\",\n }),\n]);\n\n/**\n * OMB ethnicity categories (US Core `us-core-ethnicity` `ombCategory`): the two OMB categories, public\n * code facts from the CDC Race &amp; Ethnicity code system.\n */\nexport const EXAMPLE_ETHNICITY_CATEGORIES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2135-2\",\n display: \"Hispanic or Latino\",\n }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2186-5\",\n display: \"Not Hispanic or Latino\",\n }),\n]);\n\n/**\n * CVX vaccine-administered example codes (for a US Core `Immunization.vaccineCode`). Public CDC CVX\n * identifiers used as structural fillers; `@cosyte/synth` bundles no CVX content.\n */\nexport const EXAMPLE_VACCINES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.CVX,\n code: \"140\",\n display: \"Influenza, seasonal, injectable, preservative free\",\n }),\n Object.freeze({ system: SYSTEM.CVX, code: \"03\", display: \"MMR\" }),\n Object.freeze({ system: SYSTEM.CVX, code: \"20\", display: \"DTaP\" }),\n Object.freeze({ system: SYSTEM.CVX, code: \"133\", display: \"Pneumococcal conjugate PCV 13\" }),\n Object.freeze({\n system: SYSTEM.CVX,\n code: \"208\",\n display: \"COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose\",\n }),\n]);\n\n/**\n * Allergen-substance example codes (for a US Core `AllergyIntolerance.code`). Public RxNorm / SNOMED CT\n * identifiers used as structural fillers; no terminology content is bundled.\n */\nexport const EXAMPLE_ALLERGENS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.RXNORM, code: \"7980\", display: \"Penicillin G\" }),\n Object.freeze({ system: SYSTEM.RXNORM, code: \"2670\", display: \"Codeine\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"762952008\", display: \"Peanut (substance)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"227493005\", display: \"Cashew nuts (substance)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"3718001\", display: \"Cow's milk (substance)\" }),\n]);\n\n/**\n * Allergy-reaction manifestation example codes (for `AllergyIntolerance.reaction.manifestation`).\n * Public SNOMED CT clinical-finding identifiers used as structural fillers.\n */\nexport const EXAMPLE_ALLERGY_MANIFESTATIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.SNOMED, code: \"247472004\", display: \"Wheal (finding)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"126485001\", display: \"Urticaria (disorder)\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"271807003\",\n display: \"Eruption of skin (disorder)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"267036007\", display: \"Dyspnea (finding)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"422587007\", display: \"Nausea (finding)\" }),\n]);\n\n/**\n * SNOMED CT procedure example codes (for a US Core `Procedure.code`). Public SNOMED identifiers used as\n * structural fillers, **not** CPT (which is never bundled).\n */\nexport const EXAMPLE_PROCEDURES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"80146002\",\n display: \"Excision of appendix (procedure)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"73761001\", display: \"Colonoscopy (procedure)\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"5880005\",\n display: \"Physical examination procedure (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"108252007\",\n display: \"Laboratory procedure (procedure)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"71651007\", display: \"Mammography (procedure)\" }),\n]);\n\n/**\n * LOINC diagnostic-report example codes (for a US Core Laboratory `DiagnosticReport.code`). Public LOINC\n * panel identifiers used as structural fillers.\n */\nexport const EXAMPLE_DIAGNOSTIC_REPORTS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24323-8\",\n display: \"Comprehensive metabolic 2000 panel - Serum or Plasma\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"58410-2\",\n display: \"CBC panel - Blood by Automated count\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24357-6\",\n display: \"Urinalysis complete panel - Urine\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24331-1\",\n display: \"Lipid 1996 panel - Serum or Plasma\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24321-2\",\n display: \"Basic metabolic 1998 panel - Serum or Plasma\",\n }),\n]);\n\n/**\n * SNOMED CT encounter-type example codes (for a US Core `Encounter.type`). Public SNOMED identifiers\n * used as structural fillers.\n */\nexport const EXAMPLE_ENCOUNTER_TYPES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"308335008\",\n display: \"Patient encounter procedure (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"185349003\",\n display: \"Encounter for check up (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"185347001\",\n display: \"Encounter for problem (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"390906007\",\n display: \"Follow-up encounter (procedure)\",\n }),\n]);\n\n/**\n * HL7 v3 `ActCode` encounter-class example codes (for `Encounter.class`, a single `Coding`). Public\n * ActCode identifiers used as structural fillers.\n */\nexport const EXAMPLE_ENCOUNTER_CLASSES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"AMB\", display: \"ambulatory\" }),\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"EMER\", display: \"emergency\" }),\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"IMP\", display: \"inpatient encounter\" }),\n]);\n","/**\n * The C-CDA example-code pool: a thin adapter that **reuses** the same license-clean, public\n * code facts the FHIR generators ship (`../fhir/example-codes.ts`), reshaped into `@cosyte/ccda`'s\n * `BuildCode` tuple (an OID `codeSystem` instead of a FHIR `system` URI). Reusing one source of truth\n * keeps the LOINC / RxNorm / SNOMED / CVX pools consistent across the FHIR and C-CDA surfaces;\n * `@cosyte/synth` still bundles\n * **no** terminology content: these are public spec-example codes, not copyrighted tables.\n *\n * Nothing here is PHI: codes and their display text are not patient identifiers. The synthetic-safety\n * invariant governs identity fields (name / DOB / MRN / telecom), which come from `../safe`.\n *\n * @module\n */\n\nimport { CVX, LOINC, NCI_ROUTE, RXNORM, SNOMED_CT } from \"@cosyte/ccda\";\nimport type { BuildCode, BuildQuantity } from \"@cosyte/ccda\";\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\nimport {\n EXAMPLE_ALLERGENS,\n EXAMPLE_ALLERGY_MANIFESTATIONS,\n EXAMPLE_CONDITIONS,\n EXAMPLE_DIAGNOSTIC_REPORTS,\n EXAMPLE_LAB_OBSERVATIONS,\n EXAMPLE_MEDICATIONS,\n EXAMPLE_PROCEDURES,\n EXAMPLE_VACCINES,\n EXAMPLE_VITAL_SIGNS,\n type CodeConcept,\n type QuantConcept,\n} from \"../fhir/example-codes.js\";\n\n/** Map a FHIR code-system `system` URI to the C-CDA OID `@cosyte/ccda` expects. */\nconst URI_TO_OID: Readonly<Record<string, string>> = Object.freeze({\n \"http://loinc.org\": LOINC,\n \"http://snomed.info/sct\": SNOMED_CT,\n \"http://www.nlm.nih.gov/research/umls/rxnorm\": RXNORM,\n \"http://hl7.org/fhir/sid/cvx\": CVX,\n});\n\n/**\n * Adapt a FHIR {@link CodeConcept} to a `@cosyte/ccda` {@link BuildCode}, resolving its `system` URI to\n * the matching OID. The `codeSystem` is always set explicitly (never left to a per-slot default), so a\n * SNOMED allergen or a LOINC panel carries the right OID regardless of which builder slot consumes it.\n *\n * @param concept - The FHIR-shaped `{ system, code, display }` concept.\n * @returns The `@cosyte/ccda` `BuildCode`.\n * @throws SynthError `SYNTH_UNMAPPED_CODE_SYSTEM` when the concept's `system` URI has no known OID\n * mapping. The refusal does not quote the URI: `concept` is caller-supplied.\n * @example\n * ```ts\n * import { toBuildCode } from \"@cosyte/synth/ccda\";\n * // toBuildCode({ system: \"http://snomed.info/sct\", code: \"59621000\", display: \"Essential hypertension\" });\n * ```\n */\nexport function toBuildCode(concept: CodeConcept): BuildCode {\n const codeSystem = URI_TO_OID[concept.system];\n if (codeSystem === undefined) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNMAPPED_CODE_SYSTEM);\n }\n return { code: concept.code, codeSystem, displayName: concept.display };\n}\n\n/**\n * Draw a synthetic-but-structurally-sane {@link BuildQuantity} for a quantitative concept: a value in\n * the concept's plausible band (from the seeded generator, so reproducible) rendered to the concept's\n * decimal precision, with its UCUM unit. The value implies **no** real measurement.\n *\n * @param rng - The seeded generator.\n * @param concept - The quantitative concept (LOINC code + UCUM unit + value band).\n * @returns A `BuildQuantity` (`{ value, unit }`) for the C-CDA builder.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { quantityFor, LAB_RESULTS } from \"@cosyte/synth/ccda\";\n * // quantityFor(createRng(1), LAB_RESULTS[0]);\n * ```\n */\nexport function quantityFor(rng: Rng, concept: QuantConcept): BuildQuantity {\n const scale = 10 ** concept.decimals;\n const value = rng.int(concept.low * scale, concept.high * scale) / scale;\n return { value, unit: concept.unit };\n}\n\n/** SNOMED CT problem/condition example codes (Problems / Past Medical History). */\nexport const PROBLEMS: readonly CodeConcept[] = EXAMPLE_CONDITIONS;\n/** RxNorm / SNOMED CT allergen example codes (Allergies). */\nexport const ALLERGENS: readonly CodeConcept[] = EXAMPLE_ALLERGENS;\n/** SNOMED CT allergy-reaction manifestation example codes. */\nexport const ALLERGY_REACTIONS: readonly CodeConcept[] = EXAMPLE_ALLERGY_MANIFESTATIONS;\n/** RxNorm medication example codes (Medications). */\nexport const MEDICATIONS: readonly CodeConcept[] = EXAMPLE_MEDICATIONS;\n/** LOINC laboratory-result example codes with UCUM units + value bands (Results members). */\nexport const LAB_RESULTS: readonly QuantConcept[] = EXAMPLE_LAB_OBSERVATIONS;\n/** LOINC panel example codes (the Result Organizer `code`). */\nexport const RESULT_PANELS: readonly CodeConcept[] = EXAMPLE_DIAGNOSTIC_REPORTS;\n/** LOINC vital-sign example codes with UCUM units + value bands (Vital Signs members). */\nexport const VITAL_SIGNS: readonly QuantConcept[] = EXAMPLE_VITAL_SIGNS;\n/** CVX vaccine example codes (Immunizations). */\nexport const VACCINES: readonly CodeConcept[] = EXAMPLE_VACCINES;\n/** SNOMED CT procedure example codes (Procedures). */\nexport const PROCEDURES: readonly CodeConcept[] = EXAMPLE_PROCEDURES;\n\n/**\n * SNOMED CT Current Smoking Status value-set example codes (Social History). Public SNOMED CT\n * identifiers used as structural fillers; `@cosyte/synth` bundles no SNOMED content.\n */\nexport const SMOKING_STATUSES: readonly BuildCode[] = Object.freeze([\n Object.freeze({ code: \"266919005\", codeSystem: SNOMED_CT, displayName: \"Never smoker\" }),\n Object.freeze({ code: \"8517006\", codeSystem: SNOMED_CT, displayName: \"Former smoker\" }),\n Object.freeze({\n code: \"449868002\",\n codeSystem: SNOMED_CT,\n displayName: \"Current every day smoker\",\n }),\n Object.freeze({\n code: \"428041000124106\",\n codeSystem: SNOMED_CT,\n displayName: \"Current some day smoker\",\n }),\n]);\n\n/**\n * NCI Thesaurus administration-route example codes (Medications / Immunizations `route`). Public NCI\n * concept ids used as structural fillers.\n */\nexport const ROUTES: readonly BuildCode[] = Object.freeze([\n Object.freeze({ code: \"C38288\", codeSystem: NCI_ROUTE, displayName: \"Oral\" }),\n Object.freeze({ code: \"C28161\", codeSystem: NCI_ROUTE, displayName: \"Intramuscular\" }),\n Object.freeze({ code: \"C38276\", codeSystem: NCI_ROUTE, displayName: \"Intravenous\" }),\n Object.freeze({ code: \"C38299\", codeSystem: NCI_ROUTE, displayName: \"Subcutaneous\" }),\n]);\n","/**\n * Synthetic C-CDA patient identity: the `recordTarget` demographics for a generated document, every\n * field minted from the synthetic-safety providers in `../safe`. No value a generated\n * C-CDA carries at a PHI locus can be real or plausibly-real: the name is from the shipped fake-name\n * pool, the MRN lives under the synthetic assigning-authority OID (never a real facility namespace),\n * and the birth date comes from the seeded generator (never wall-clock).\n *\n * The draw order is **fixed** (name → MRN → DOB → gender) so the same seed yields the same identity,\n * the reproducibility contract.\n *\n * @module\n */\n\nimport type { BuildCcdaPatient } from \"@cosyte/ccda\";\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { safe, type SyntheticIdentifier, type SyntheticName } from \"../safe/index.js\";\n\n/** A synthetic C-CDA patient identity: the values threaded into a document's `recordTarget`. */\nexport interface CcdaPatientIdentity {\n /** The `BuildCcdaPatient` `@cosyte/ccda` consumes for the single `recordTarget`. */\n readonly patient: BuildCcdaPatient;\n /** The name from the shipped fake-name pool (also used to compose synthetic narrative/email). */\n readonly person: SyntheticName;\n /** The medical-record identifier, scoped to the synthetic assigning authority. */\n readonly mrn: SyntheticIdentifier;\n}\n\n/**\n * Mint a complete synthetic {@link CcdaPatientIdentity}. Every value comes from a synthetic-safety\n * provider, no code path here can return a real identifier. The MRN is scoped to the\n * synthetic assigning-authority OID (`mrnRoot`), so it is non-colliding by *namespace*, not by value.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link CcdaPatientIdentity}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ccdaPatientIdentity } from \"@cosyte/synth/ccda\";\n * // const { patient } = ccdaPatientIdentity(createRng(1));\n * ```\n */\nexport function ccdaPatientIdentity(rng: Rng): CcdaPatientIdentity {\n const person = safe.name(rng);\n const mrn = safe.identifier(rng, \"MR\");\n const birthTime = safe.dateYmd(rng, 1930, 2010);\n const gender = rng.pick([\"M\", \"F\"] as const);\n const patient: BuildCcdaPatient = {\n mrn: mrn.value,\n mrnRoot: mrn.assigningAuthorityOid,\n mrnAssigningAuthority: mrn.assigningAuthority,\n given: [person.given],\n family: person.family,\n gender,\n birthTime,\n };\n return { patient, person, mrn };\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not: `??` fires on `undefined` and never on `[]`, and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * Synthetic **C-CDA document generation**: a spec-clean Continuity of Care Document\n * (CCD) or Referral Note built **through `@cosyte/ccda`'s `buildCcda`**, so template IDs, LOINC section\n * codes, and structured/narrative agreement are the builder's own (spec-clean *by construction*), and\n * every `recordTarget` / clinical identifier is drawn from the synthetic-safety providers.\n *\n * The document round-trips through `parseCcda` with **zero warnings**: the builder's round-trip-by-\n * construction guarantee, re-verified independently by {@link ./round-trip.roundTrip}. Coverage tracks\n * `buildCcda`'s section/doc-type maturity: the CCD SHALL sections (Problems,\n * Allergies, Medications, Results, Vital Signs) plus Immunizations, Procedures, and Social History\n * (Smoking Status). Clinical *content* is drawn from the reused, license-clean example-code pools; a\n * `synth` document exercises the parser, it is **not** a clinically-coherent record.\n *\n * @module\n */\n\nimport { buildCcda, type BuildCcdaInit, type CcdaDocument } from \"@cosyte/ccda\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport { safe } from \"../safe/index.js\";\n\nimport {\n ALLERGENS,\n ALLERGY_REACTIONS,\n LAB_RESULTS,\n MEDICATIONS,\n PROBLEMS,\n PROCEDURES,\n RESULT_PANELS,\n ROUTES,\n SMOKING_STATUSES,\n VACCINES,\n VITAL_SIGNS,\n quantityFor,\n toBuildCode,\n} from \"./example-codes.js\";\nimport { ccdaPatientIdentity } from \"./identity.js\";\nimport { resolveKind } from \"../select.js\";\n\n/** The C-CDA document type a generator emits: the two `buildCcda` supports. */\nexport type CcdaDocumentType = \"ccd\" | \"referralNote\";\n\n/** Every value {@link CcdaDocumentType} admits. Erased at run time, so it is resolved, not trusted. */\nconst CCDA_DOCUMENT_TYPES: readonly CcdaDocumentType[] = Object.freeze([\"ccd\", \"referralNote\"]);\n\n/** Options common to every C-CDA generator. */\nexport interface GenerateCcdaOptions {\n /** The seed (deterministic: same seed yields a byte-identical document). Defaults to `0`. */\n readonly seed?: number;\n /** The document type to emit. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\n/** Pick `n` **distinct** items from a pool (`n` clamped to the pool size) using the seeded generator. */\nfunction pickN<T>(rng: Rng, pool: readonly T[], n: number): T[] {\n const take = Math.min(n, pool.length);\n const indices = pool.map((_v, i) => i);\n const out: T[] = [];\n for (let i = 0; i < take; i += 1) {\n const j = rng.int(0, indices.length - 1);\n // `j` is in `[0, indices.length-1]` on a non-empty array, so `indices[j]` and `pool[idx]` are\n // never holes; the casts discharge `noUncheckedIndexedAccess`'s `| undefined` with no runtime\n // re-check (mirroring `Rng.pick`).\n const idx = indices[j] as number;\n indices.splice(j, 1);\n out.push(pool[idx] as T);\n }\n return out;\n}\n\n/**\n * Assemble the synthetic {@link BuildCcdaInit}: the identity + clinical content the builder turns into\n * a spec-clean document. Section counts vary with the seed (each SHALL clinical section is always\n * non-empty; the optional sections are always populated for a rich fixture), and every code is drawn\n * from the reused example-code pools.\n */\nfunction buildInit(rng: Rng, documentType: CcdaDocumentType): BuildCcdaInit {\n const effectiveTime = safe.dateYmd(rng, 2020, 2025);\n const { patient, person } = ccdaPatientIdentity(rng);\n\n const problems = pickN(rng, PROBLEMS, rng.int(1, 3)).map((c) => ({\n problem: toBuildCode(c),\n status: \"active\" as const,\n onset: safe.dateYmd(rng, 2010, 2019),\n }));\n\n const allergen = rng.pick(ALLERGENS);\n const reaction = rng.pick(ALLERGY_REACTIONS);\n const allergies = [{ allergen: toBuildCode(allergen), reaction: toBuildCode(reaction) }];\n\n const medications = pickN(rng, MEDICATIONS, rng.int(1, 2)).map((c) => ({\n drug: toBuildCode(c),\n dose: { value: 1, unit: \"{tablet}\" },\n route: rng.pick(ROUTES),\n frequency: { value: rng.pick([8, 12, 24]), unit: \"h\" },\n }));\n\n const panel = rng.pick(RESULT_PANELS);\n const resultMembers = pickN(rng, LAB_RESULTS, 2).map((q) => ({\n test: toBuildCode(q),\n quantity: quantityFor(rng, q),\n effectiveTime,\n }));\n const results = [{ code: toBuildCode(panel), effectiveTime, results: resultMembers }];\n\n const vitalMembers = pickN(rng, VITAL_SIGNS, 2).map((q) => ({\n code: toBuildCode(q),\n quantity: quantityFor(rng, q),\n }));\n const vitalSigns = [{ effectiveTime, vitals: vitalMembers }];\n\n const vaccine = rng.pick(VACCINES);\n const immunizations = [\n {\n vaccine: toBuildCode(vaccine),\n dose: { value: 0.5, unit: \"mL\" },\n route: rng.pick(ROUTES),\n effectiveTime: safe.dateYmd(rng, 2018, 2024),\n },\n ];\n\n const procedure = rng.pick(PROCEDURES);\n const procedures = [\n {\n code: toBuildCode(procedure),\n disposition: \"performed\" as const,\n effectiveTime: safe.dateYmd(rng, 2015, 2023),\n },\n ];\n\n const smokingStatus = [{ value: rng.pick(SMOKING_STATUSES), effectiveTime }];\n\n const base: BuildCcdaInit = {\n documentType,\n effectiveTime,\n patient,\n problems,\n allergies,\n medications,\n results,\n vitalSigns,\n immunizations,\n procedures,\n smokingStatus,\n };\n\n if (documentType === \"referralNote\") {\n // The Referral Note's narrative-only SHALL sections: synthetic free text (never fabricated\n // clinical judgment about a real person; the \"patient\" does not exist).\n return {\n ...base,\n reasonForReferral: `Synthetic referral for evaluation of ${person.given} ${person.family}.`,\n assessment: \"Synthetic assessment narrative. Not a real clinical assessment.\",\n };\n }\n return base;\n}\n\n/**\n * Generate a spec-clean synthetic C-CDA document (CCD by default, or Referral Note), built through\n * `@cosyte/ccda`'s `buildCcda`. The returned {@link CcdaDocument} round-trips through `parseCcda` with\n * zero warnings, and the same seed yields a byte-identical document.\n *\n * @param options - Seed and document type. See {@link GenerateCcdaOptions}.\n * @returns The `@cosyte/ccda` `CcdaDocument` (serialize via `serializeCcda(doc)` or `doc.toString()`).\n * @example\n * ```ts\n * import { generateCcda } from \"@cosyte/synth/ccda\";\n * import { serializeCcda } from \"@cosyte/ccda\";\n * const xml = serializeCcda(generateCcda({ seed: 42 }));\n * ```\n */\nexport function generateCcda(options: GenerateCcdaOptions = {}): CcdaDocument {\n const { seed = 0 } = options;\n const documentType = resolveKind(CCDA_DOCUMENT_TYPES, options.documentType ?? \"ccd\");\n const rng = createRng(seed);\n return buildCcda(buildInit(rng, documentType));\n}\n\n/**\n * Generate a spec-clean synthetic **Continuity of Care Document (CCD)**.\n *\n * @param options - Seed (deterministic). See {@link GenerateCcdaOptions}.\n * @returns The `CcdaDocument`.\n * @example\n * ```ts\n * import { generateCcd, roundTrip } from \"@cosyte/synth/ccda\";\n * roundTrip(generateCcd({ seed: 1 })).specClean; // true\n * ```\n */\nexport function generateCcd(options: Omit<GenerateCcdaOptions, \"documentType\"> = {}): CcdaDocument {\n return generateCcda({ ...options, documentType: \"ccd\" });\n}\n\n/**\n * Generate a spec-clean synthetic **Referral Note**: the second document type `buildCcda` supports,\n * with its own US Realm Header specialization and Reason-for-Referral / Assessment narrative sections.\n *\n * @param options - Seed (deterministic). See {@link GenerateCcdaOptions}.\n * @returns The `CcdaDocument`.\n * @example\n * ```ts\n * import { generateReferralNote } from \"@cosyte/synth/ccda\";\n * generateReferralNote({ seed: 1 }).documentType; // \"referralNote\"\n * ```\n */\nexport function generateReferralNote(\n options: Omit<GenerateCcdaOptions, \"documentType\"> = {},\n): CcdaDocument {\n return generateCcda({ ...options, documentType: \"referralNote\" });\n}\n","/**\n * The **round-trip-through-the-parser harness** for C-CDA: the headline gate for the synthetic-fixture\n * generator. A generated document is \"spec-clean\" only if `@cosyte/ccda`, not\n * `@cosyte/synth`'s own opinion, reads it back cleanly. This harness serializes a generated document,\n * parses it straight back through `parseCcda`, and reports what the parser found, so a false\n * \"spec-clean\" claim cannot hide.\n *\n * `@cosyte/ccda`'s `buildCcda` is round-trip-by-construction (it emits through the same DOM the parser\n * reads), so a clean build carries zero warnings, but this harness re-verifies that *independently*,\n * against the parser, because the parser is the judge.\n *\n * @module\n */\n\nimport { parseCcda, serializeCcda, type CcdaDocument } from \"@cosyte/ccda\";\n\n/** The verdict of one round-trip through `@cosyte/ccda`. */\nexport interface RoundTripResult {\n /** The serialized C-CDA XML (the builder/serializer's own conservative emit). */\n readonly content: string;\n /** The warning codes the parser emitted on re-parse. Empty ⇒ spec-clean. */\n readonly warnings: readonly string[];\n /** Whether re-serializing the re-parsed document is byte-identical to `content`. */\n readonly byteStable: boolean;\n /** `true` iff the artifact is spec-clean: zero warnings **and** byte-stable. */\n readonly specClean: boolean;\n}\n\n/**\n * Round-trip a generated `@cosyte/ccda` `CcdaDocument` through serialize → parse → serialize and report\n * the verdict. A spec-clean document re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param doc - The document to check (typically from {@link ./ccd.generateCcd}).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateCcd, roundTrip } from \"@cosyte/synth/ccda\";\n * const { specClean, warnings } = roundTrip(generateCcd({ seed: 1 }));\n * // specClean === true, warnings.length === 0\n * ```\n */\nexport function roundTrip(doc: CcdaDocument): RoundTripResult {\n const content = serializeCcda(doc);\n const reparsed = parseCcda(content);\n const warnings = reparsed.warnings.map((w) => String(w.code));\n const byteStable = serializeCcda(reparsed) === content;\n return {\n content,\n warnings,\n byteStable,\n specClean: warnings.length === 0 && byteStable,\n };\n}\n","/**\n * `defineSynthProfile`: the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only, see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)**, no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction, it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active: the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"`, the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"`, the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"`, no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead: see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk: the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk, the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk, the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact: the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s), the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists: the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding, which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true: the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture, a\n * golden file that lies about the parser verdict it anchors, and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason, to be interpolated into\n * the refusal, and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * C-CDA **vendor-quirk generation**. A quirk deviates the\n * *structure* of an otherwise spec-clean document (built through `@cosyte/ccda`'s `buildCcda`) so it\n * round-trips through `parseCcda` to **exactly** one intended, stable warning code: the tolerance a\n * `defineCcdaProfile` profile encodes. With the matching built-in profile active, that warning is\n * **re-badged** to the value-free `PROFILE_QUIRK_APPLIED` marker (`expected: true`, `toleratedCode` = the\n * original), exactly as the parser's `profileQuirkApplied` does.\n *\n * The deviation is applied **post-serialize**. Three quirks ship, each\n * publicly grounded and re-badged by a built-in public profile:\n *\n * - **`template-extension-absent`** → `TEMPLATE_EXTENSION_ABSENT` (profile `legacyR11`). The R2.1\n * `@extension=\"2015-08-01\"` version stamp is dropped from the document-type templateId: a legacy\n * R1.1-era document shape.\n * - **`deprecated-loinc`** → `DEPRECATED_LOINC` (profile `smartScorecard`). A result/vital observation\n * LOINC code is swapped to a known-deprecated LOINC (`41909-3`).\n * - **`deprecated-code-system`** → `DEPRECATED_CODE_SYSTEM` (profile `smartScorecard`). A problem\n * observation's value is swapped to a deprecated code system (ICD-9-CM `2.16.840.1.113883.6.103`).\n *\n * A quirk **never** introduces a real-looking value: it changes a template stamp or a code, never a PHI\n * locus, so the synthetic-safety gate still runs and stays zero.\n *\n * @module\n */\n\nimport { parseCcda, serializeCcda, ccdaProfiles, type CcdaProfile } from \"@cosyte/ccda\";\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\nimport { defineSynthProfile, type SynthProfile } from \"../profile.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\nimport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkRoundTripResult,\n} from \"../quirk.js\";\n\nimport { generateCcda, type CcdaDocumentType } from \"./ccd.js\";\n\n/** Every C-CDA quirk this package ships. */\nexport type CcdaQuirkName =\n | \"template-extension-absent\"\n | \"deprecated-loinc\"\n | \"deprecated-code-system\";\n\n/** The C-CDA quirk registry: each recipe bound to the exact `@cosyte/ccda` warning code it targets. */\nexport const CCDA_QUIRKS: Readonly<Record<CcdaQuirkName, QuirkDescriptor>> = Object.freeze({\n \"template-extension-absent\": Object.freeze({\n name: \"template-extension-absent\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"TEMPLATE_EXTENSION_ABSENT\"]),\n grounding:\n \"ONC 2015 Edition §170.315(b)(1) + HL7/C-CDA-Examples (CC0): legacy R1.1-era documents omit the \" +\n \"R2.1 @extension=2015-08-01 version stamp. Re-badged by @cosyte/ccda's public `legacyR11` profile.\",\n toleratingProfile: \"legacyR11\",\n disposition: \"rebadged\",\n }),\n \"deprecated-loinc\": Object.freeze({\n name: \"deprecated-loinc\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"DEPRECATED_LOINC\"]),\n grounding:\n \"SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: real documents carry deprecated LOINC codes \" +\n \"(e.g. 41909-3). Re-badged by @cosyte/ccda's public `smartScorecard` profile.\",\n toleratingProfile: \"smartScorecard\",\n disposition: \"rebadged\",\n }),\n \"deprecated-code-system\": Object.freeze({\n name: \"deprecated-code-system\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"DEPRECATED_CODE_SYSTEM\"]),\n grounding:\n \"SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: legacy problem lists code diagnoses in \" +\n \"ICD-9-CM (2.16.840.1.113883.6.103). Re-badged by @cosyte/ccda's public `smartScorecard` profile.\",\n toleratingProfile: \"smartScorecard\",\n disposition: \"rebadged\",\n }),\n});\n\n/** The tolerating C-CDA profile object for a quirk. */\nfunction toleratingProfile(quirk: CcdaQuirkName): CcdaProfile {\n return quirk === \"template-extension-absent\"\n ? ccdaProfiles.legacyR11\n : ccdaProfiles.smartScorecard;\n}\n\n/**\n * The document-type templateId roots whose R2.1 `@extension` stamp the `legacyR11` quirk drops: the\n * US Realm Header (`…22.1.1`) **and** every document-type template `buildCcda` emits: CCD (`…22.1.2`)\n * and Referral Note (`…22.1.14`). The parser keys `TEMPLATE_EXTENSION_ABSENT` on the **document-type**\n * template, so this must cover each generable document type; dropping a root a given document does not\n * carry is a harmless no-op, and the generation-time contract assertion catches any type left uncovered.\n */\nconst DOC_TEMPLATE_ROOTS = [\n \"2.16.840.1.113883.10.20.22.1.1\",\n \"2.16.840.1.113883.10.20.22.1.2\",\n \"2.16.840.1.113883.10.20.22.1.14\",\n] as const;\n\n/**\n * Match the first Result-Observation (template `…22.4.2`) or Vital-Sign-Observation (`…22.4.27`) LOINC\n * `<code>`: its code value is the capture between groups 1 and 2. Structural, so it is seed-robust (it\n * never depends on which example LOINC a given seed drew).\n */\nconst RESULT_OR_VITAL_LOINC =\n /(<templateId root=\"2\\.16\\.840\\.1\\.113883\\.10\\.20\\.22\\.4\\.(?:2|27)\"[^>]*\\/>(?:(?!<templateId)[\\s\\S])*?<code code=\")[^\"]+(\" codeSystem=\"2\\.16\\.840\\.1\\.113883\\.6\\.1\")/;\n\n/** Match the first Problem-Observation (`…22.4.4`) SNOMED CD `<value>`: code + codeSystem are captured. */\nconst PROBLEM_VALUE_SNOMED =\n /(<templateId root=\"2\\.16\\.840\\.1\\.113883\\.10\\.20\\.22\\.4\\.4\"[\\s\\S]*?<value code=\")[^\"]+(\" codeSystem=\")2\\.16\\.840\\.1\\.113883\\.6\\.96(\"[^>]*xsi:type=\"CD\"\\/>)/;\n\n/** A known-deprecated LOINC (BMI, superseded by 39156-5): the `deprecated-loinc` target. */\nconst DEPRECATED_LOINC_CODE = \"41909-3\";\n\n/** The post-serialize XML transform for each quirk: a pure, deterministic function of the clean XML. */\nfunction applyQuirk(quirk: CcdaQuirkName, xml: string): string {\n switch (quirk) {\n case \"template-extension-absent\": {\n let out = xml;\n for (const root of DOC_TEMPLATE_ROOTS) {\n out = out.replace(\n `<templateId root=\"${root}\" extension=\"2015-08-01\"/>`,\n `<templateId root=\"${root}\"/>`,\n );\n }\n return out;\n }\n case \"deprecated-loinc\":\n return xml.replace(RESULT_OR_VITAL_LOINC, `$1${DEPRECATED_LOINC_CODE}$2`);\n case \"deprecated-code-system\":\n // ICD-9-CM hypertension (401.9) under the deprecated ICD-9-CM diagnosis code system.\n return xml.replace(PROBLEM_VALUE_SNOMED, `$1401.9$22.16.840.1.113883.6.103$3`);\n }\n}\n\n/**\n * Apply a C-CDA quirk transform to a spec-clean document, or **fail closed**. Refuses to return a\n * document that does not carry the intended deviation (a quirk whose structural anchor is absent):\n * a fixture that silently lost its quirk would test the wrong thing.\n *\n * @param quirk - The quirk to inject.\n * @param cleanXml - The spec-clean C-CDA XML.\n * @returns The quirked XML.\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` when `quirk` is not a supported C-CDA quirk.\n * @throws SynthError `SYNTH_QUIRK_ANCHOR_ABSENT` when the quirk found no structural anchor to mutate.\n * @example\n * ```ts\n * import { injectCcdaQuirk } from \"@cosyte/synth/ccda\";\n * injectCcdaQuirk(\"template-extension-absent\", cleanXml);\n * ```\n */\nexport function injectCcdaQuirk(quirk: CcdaQuirkName, cleanXml: string): string {\n // The union is erased at runtime, so an unrecognised name used to fall out of `applyQuirk`'s switch\n // as `undefined` and be returned as if it were a document. Resolve it against the registry first.\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", quirk);\n const content = applyQuirk(descriptor.name as CcdaQuirkName, cleanXml);\n if (content === cleanXml) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_QUIRK_ANCHOR_ABSENT);\n }\n return content;\n}\n\n/** Options for {@link generateCcdaQuirk}. */\nexport interface GenerateCcdaQuirkOptions {\n /** The seed: the same seed + quirk yields a byte-identical document. Defaults to `0`. */\n readonly seed?: number;\n /** The quirk to inject. Required. */\n readonly quirk: CcdaQuirkName;\n /** The spec-clean base document type. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\n/**\n * Generate one C-CDA **quirk** artifact: a spec-clean document (built through `@cosyte/ccda`'s\n * `buildCcda`) with the requested vendor deviation injected post-serialize. Deterministic in `seed` +\n * `quirk` + `documentType`.\n *\n * @param options - Seed, quirk, and base document type. See {@link GenerateCcdaQuirkOptions}.\n * @returns The {@link QuirkArtifact}: its `content` round-trips to `intendedWarnings` exactly.\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` if `quirk` is not a supported C-CDA quirk.\n * @throws Error if the base document does not contain the structural anchor the quirk targets.\n * @example\n * ```ts\n * import { generateCcdaQuirk, ccdaQuirkRoundTrip } from \"@cosyte/synth/ccda\";\n * const rt = ccdaQuirkRoundTrip(generateCcdaQuirk({ seed: 1, quirk: \"deprecated-loinc\" }));\n * rt.withProfile?.tolerated; // true, `smartScorecard` re-badges DEPRECATED_LOINC\n * ```\n */\nexport function generateCcdaQuirk(options: GenerateCcdaQuirkOptions): QuirkArtifact {\n const seed = options.seed ?? 0;\n const documentType = options.documentType ?? \"ccd\";\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", options.quirk);\n const clean = serializeCcda(generateCcda({ seed, documentType }));\n const content = injectCcdaQuirk(options.quirk, clean);\n // Self-check the intended-warning contract at generation time: never emit a mislabeled fixture (a\n // transform can change bytes on the wrong template and still produce no warning, e.g. a document\n // type whose document-type root is not in DOC_TEMPLATE_ROOTS).\n assertIntendedWarnings(\n descriptor.intendedWarnings,\n parseCcda(content).warnings.map((w) => String(w.code)),\n );\n return Object.freeze({\n format: \"ccda\" as const,\n quirk: descriptor.name,\n kind: documentType,\n content,\n intendedWarnings: descriptor.intendedWarnings,\n });\n}\n\n/**\n * Round-trip a C-CDA quirk artifact through `@cosyte/ccda` and report the intended-warning verdict: a bare\n * parse must produce **exactly** the intended code, and the matching public profile\n * must re-badge it to `PROFILE_QUIRK_APPLIED`.\n *\n * @param artifact - The quirk artifact (from {@link generateCcdaQuirk}).\n * @returns The {@link QuirkRoundTripResult}.\n * @example\n * ```ts\n * import { generateCcdaQuirk, ccdaQuirkRoundTrip } from \"@cosyte/synth/ccda\";\n * ccdaQuirkRoundTrip(generateCcdaQuirk({ seed: 1, quirk: \"deprecated-loinc\" })).intendedWarningHeld;\n * ```\n */\nexport function ccdaQuirkRoundTrip(artifact: QuirkArtifact): QuirkRoundTripResult {\n const quirk = artifact.quirk as CcdaQuirkName;\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", quirk);\n const bare = parseCcda(artifact.content).warnings.map((w) => String(w.code));\n const profile = toleratingProfile(quirk);\n const profiledWarnings = parseCcda(artifact.content, { profile }).warnings.map((w) =>\n String(w.code),\n );\n return {\n content: artifact.content,\n warnings: bare,\n intendedWarnings: artifact.intendedWarnings,\n intendedWarningHeld: sameCodeSet(bare, artifact.intendedWarnings),\n withProfile: {\n profileName: descriptor.toleratingProfile ?? profile.name,\n disposition: descriptor.disposition,\n warnings: profiledWarnings,\n tolerated: profileTolerated(\n descriptor.disposition,\n artifact.intendedWarnings,\n profiledWarnings,\n ),\n },\n };\n}\n\n/** Options for {@link ccdaQuirkCorpus}. */\nexport interface CcdaQuirkCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many quirk artifacts to generate. Defaults to the number of quirks. */\n readonly count?: number;\n /** The quirk names to cycle through. Defaults to every C-CDA quirk. Validated; unsupported ⇒ fatal. */\n readonly quirks?: readonly CcdaQuirkName[];\n /** A {@link SynthProfile} whose `quirks` drive the corpus (validated). Takes precedence over `quirks`. */\n readonly profile?: SynthProfile;\n /** The base document type each quirk is injected into. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\nconst ALL_CCDA_QUIRKS: readonly CcdaQuirkName[] = Object.freeze(\n Object.keys(CCDA_QUIRKS) as CcdaQuirkName[],\n);\n\n/**\n * Build a reproducible {@link Corpus} of C-CDA quirk artifacts. Each artifact's `warnings` record the\n * intended code for its quirk; the manifest lists the applied quirk names.\n *\n * @param options - Seed, count, and the quirk selection. See {@link CcdaQuirkCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ccdaQuirkCorpus } from \"@cosyte/synth/ccda\";\n * ccdaQuirkCorpus({ seed: 42 }).manifest.quirks; // the applied quirk names\n * ```\n */\nexport function ccdaQuirkCorpus(options: CcdaQuirkCorpusOptions): Corpus {\n const quirks: readonly string[] = options.profile\n ? validateProfileQuirks(options.profile, CCDA_QUIRKS, \"ccda\")\n : (options.quirks ?? ALL_CCDA_QUIRKS);\n const names = quirks.length > 0 ? quirks : ALL_CCDA_QUIRKS;\n // Resolve the WHOLE list here, not lazily per generated artifact. `count` can be below\n // `names.length`, and the tail then never reaches this module's own `resolveQuirk`\n // while still landing on `manifest.quirks` verbatim. A manifest that names a quirk the\n // corpus does not contain is the same mislabeled-fixture defect the intended-warning\n // contract exists to prevent, and `manifest.quirks` is a derived identifier.\n for (const name of names) resolveQuirk(CCDA_QUIRKS, \"ccda\", name);\n const documentType = options.documentType ?? \"ccd\";\n const count = options.count ?? names.length;\n const seedStream = createRng(options.seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const quirk = names[i % names.length] as CcdaQuirkName;\n const artifactSeed = seedStream.nextUint32();\n const artifact = generateCcdaQuirk({ seed: artifactSeed, quirk, documentType });\n return {\n format: \"ccda\" as const,\n kind: `${documentType}~${quirk}`,\n content: artifact.content,\n warnings: artifact.intendedWarnings,\n };\n });\n return makeCorpus(options.seed, artifacts, [...new Set(names)]);\n}\n\n/** A ready-made {@link SynthProfile} requesting every built-in C-CDA quirk. */\nexport const ccdaQuirkProfile: SynthProfile = defineSynthProfile({\n name: \"cosyte-ccda-quirks\",\n quirks: [...ALL_CCDA_QUIRKS],\n});\n","/**\n * `@cosyte/synth/ccda`: the C-CDA generation surface, exposed as its own subpath so importing the\n * package root does **not** pull `@cosyte/ccda`. This is the **lazy, per-format** boundary: a consumer\n * who only needs C-CDA fixtures imports `@cosyte/synth/ccda`; one who needs only the core primitives\n * never loads a parser.\n * `@cosyte/ccda` is an **optional peer dependency**, present only for this subpath.\n *\n * This subpath ships spec-clean C-CDA document generation via `@cosyte/ccda`'s\n * `buildCcda`: a **CCD** (`generateCcd`) and a **Referral Note** (`generateReferralNote`), each built\n * through the parser's own emitter so it round-trips through `parseCcda` with zero warnings, and each\n * drawing every identity value from the synthetic-safety providers.\n *\n * @module\n */\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\n\nimport { generateCcda, type CcdaDocumentType } from \"./ccd.js\";\nimport { roundTrip } from \"./round-trip.js\";\nimport { resolveMix } from \"../select.js\";\n\nexport {\n generateCcda,\n generateCcd,\n generateReferralNote,\n type CcdaDocumentType,\n type GenerateCcdaOptions,\n} from \"./ccd.js\";\nexport { roundTrip, type RoundTripResult } from \"./round-trip.js\";\nexport { ccdaPatientIdentity, type CcdaPatientIdentity } from \"./identity.js\";\nexport {\n toBuildCode,\n quantityFor,\n PROBLEMS,\n ALLERGENS,\n ALLERGY_REACTIONS,\n MEDICATIONS,\n LAB_RESULTS,\n RESULT_PANELS,\n VITAL_SIGNS,\n VACCINES,\n PROCEDURES,\n SMOKING_STATUSES,\n ROUTES,\n} from \"./example-codes.js\";\nexport {\n generateCcdaQuirk,\n injectCcdaQuirk,\n ccdaQuirkRoundTrip,\n ccdaQuirkCorpus,\n ccdaQuirkProfile,\n CCDA_QUIRKS,\n type CcdaQuirkName,\n type GenerateCcdaQuirkOptions,\n type CcdaQuirkCorpusOptions,\n} from \"./quirk.js\";\n\n/** Every C-CDA document kind {@link ccdaCorpus} generates: the `documentType` used as the corpus `kind`. */\nexport type CcdaCorpusKind = CcdaDocumentType;\n\n/** Every kind {@link ccdaCorpus} accepts, and the default mix: one CCD and one Referral Note. */\nconst ALL_KINDS: readonly CcdaCorpusKind[] = Object.freeze([\"ccd\", \"referralNote\"]);\nconst DEFAULT_MIX = ALL_KINDS;\n\n/** Options for {@link ccdaCorpus}. */\nexport interface CcdaCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many documents to generate. Defaults to `1`. */\n readonly count?: number;\n /** The document types to cycle through. Defaults to one CCD + one Referral Note. */\n readonly mix?: readonly CcdaCorpusKind[];\n}\n\n/**\n * Build a reproducible {@link Corpus} of spec-clean C-CDA documents. Each document is generated from a\n * distinct sub-seed derived from the corpus seed (so the set is deterministic) and round-tripped through\n * `@cosyte/ccda`; the per-artifact `warnings` record the parser's verdict (empty ⇒ spec-clean).\n *\n * @param options - Seed, count, and the document mix. See {@link CcdaCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ccdaCorpus } from \"@cosyte/synth/ccda\";\n * const corpus = ccdaCorpus({ seed: 42, count: 4 });\n * corpus.artifacts.every((a) => a.warnings.length === 0); // true, spec-clean\n * ```\n */\nexport function ccdaCorpus(options: CcdaCorpusOptions): Corpus {\n const { seed, count = 1 } = options;\n const mix = resolveMix(ALL_KINDS, options.mix, DEFAULT_MIX);\n const seedStream = createRng(seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const documentType = mix[i % mix.length] ?? \"ccd\";\n const docSeed = seedStream.nextUint32();\n const rt = roundTrip(generateCcda({ seed: docSeed, documentType }));\n return {\n format: \"ccda\" as const,\n kind: documentType,\n content: rt.content,\n warnings: rt.warnings,\n };\n });\n return makeCorpus(seed, artifacts);\n}\n"]}
1
+ {"version":3,"sources":["../../src/rng/splitmix32.ts","../../src/rng/sfc32.ts","../../src/codes.ts","../../src/rng/rng.ts","../../src/corpus.ts","../../src/safe/reserved.ts","../../src/safe/names-pool.ts","../../src/safe/providers.ts","../../src/safe/index.ts","../../src/fhir/us-core.ts","../../src/fhir/example-codes.ts","../../src/ccda/example-codes.ts","../../src/ccda/identity.ts","../../src/select.ts","../../src/ccda/ccd.ts","../../src/ccda/round-trip.ts","../../src/profile.ts","../../src/quirk.ts","../../src/ccda/quirk.ts","../../src/ccda/index.ts"],"names":["LOINC","SNOMED_CT","RXNORM","CVX","NCI_ROUTE","buildCcda","serializeCcda","parseCcda","name","ccdaProfiles"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * `splitmix32`: a tiny, well-studied 32-bit mixing PRNG used **only** to expand a single integer\n * seed into the four 32-bit state words that seed {@link ../rng/sfc32.sfc32}. It is not the corpus\n * generator itself (that is `sfc32`); it exists so that a one-number seed deterministically produces a\n * well-distributed 128-bit `sfc32` state, avoiding the poor low-bit behavior of naive\n * `state = seed`-style initialization.\n *\n * Zero-dependency, `Math.random`-free (lint-enforced): the whole point of the library is that a seed,\n * and only the seed, determines the output, on any machine, any run.\n *\n * @module\n */\n\n/**\n * A stateful `splitmix32` step function. Each call advances the internal 32-bit state and returns the\n * next unsigned 32-bit integer. Deterministic for a given seed.\n *\n * @param seed - The 32-bit seed. Coerced to a 32-bit integer via `| 0`.\n * @returns A nullary function returning the next `uint32` in the stream.\n * @example\n * ```ts\n * import { splitmix32 } from \"@cosyte/synth\";\n * const next = splitmix32(12345);\n * const a = next(); // deterministic uint32\n * ```\n */\nexport function splitmix32(seed: number): () => number {\n let a = seed | 0;\n return function next(): number {\n a = (a + 0x9e3779b9) | 0;\n let t = a ^ (a >>> 16);\n t = Math.imul(t, 0x21f0aaad);\n t = t ^ (t >>> 15);\n t = Math.imul(t, 0x735a2d97);\n t = t ^ (t >>> 15);\n return t >>> 0;\n };\n}\n","/**\n * `sfc32` (Small Fast Counter, 32-bit, 128-bit state): the deterministic, non-cryptographic PRNG that\n * drives every value `@cosyte/synth` generates. Chosen over `mulberry32` (whose author flags that it\n * skips ~1/3 of 32-bit outputs) and over a CSPRNG (`node:crypto`, which is **not seedable** and would\n * defeat reproducibility). A synthetic-fixture generator has **no secrets**: statistical quality plus\n * byte-for-byte reproducibility is exactly the right trade.\n *\n * The state is four 32-bit words. This module exposes the raw step function; {@link ../rng/rng.Rng}\n * wraps it with a seed-expansion ({@link ./splitmix32.splitmix32}) and the ergonomic draw helpers.\n *\n * @module\n */\n\n/**\n * The mutable four-word `sfc32` state. Threaded explicitly (never global) by {@link ../rng/rng.Rng}.\n */\nexport interface Sfc32State {\n /** State word `a`. */\n a: number;\n /** State word `b`. */\n b: number;\n /** State word `c`. */\n c: number;\n /** Counter word `d`. */\n d: number;\n}\n\n/**\n * Advance an {@link Sfc32State} in place by one step and return the next unsigned 32-bit integer.\n *\n * This is the canonical `sfc32` step. The state object is mutated (the counter `d` increments and the\n * mixing words rotate); callers that need reproducible independence hold their own state and never\n * share it: {@link ../rng/rng.Rng} creates a fresh state per seed so two runs from the same seed are\n * identical.\n *\n * @param s - The state to advance. Mutated in place.\n * @returns The next `uint32` in the stream.\n * @example\n * ```ts\n * import { sfc32Next, type Sfc32State } from \"@cosyte/synth\";\n * const s: Sfc32State = { a: 1, b: 2, c: 3, d: 4 };\n * const x = sfc32Next(s); // uint32\n * ```\n */\nexport function sfc32Next(s: Sfc32State): number {\n s.a |= 0;\n s.b |= 0;\n s.c |= 0;\n s.d |= 0;\n const t = (((s.a + s.b) | 0) + s.d) | 0;\n s.d = (s.d + 1) | 0;\n s.a = s.b ^ (s.b >>> 9);\n s.b = (s.c + (s.c << 3)) | 0;\n s.c = (s.c << 21) | (s.c >>> 11);\n s.c = (s.c + t) | 0;\n return t >>> 0;\n}\n","/**\n * Stable diagnostic codes for `@cosyte/synth` and the {@link SynthError} they travel on.\n *\n * Unlike a parser (which recovers from bad *input* into Tier-2 warnings), a **generator** has no input\n * to tolerate: its reflex is *synthetic-by-construction* and *fail-closed on impossibility*. So the\n * codes here are **fatal**: a caller asked for something the library cannot honor spec-clean, and the\n * only safe answer is to throw, never to silently fabricate a value or a byte workaround. Codes are `key ===\n * value` and part of the public contract:\n * renaming one is a breaking change.\n *\n * @module\n */\n\n/**\n * The stable **fatal** code registry. Additions-only thereafter.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SynthError } from \"@cosyte/synth\";\n * try {\n * // ...generate...\n * } catch (err) {\n * if (err instanceof SynthError && err.code === SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT) {\n * // handle an unsupported format request\n * }\n * }\n * ```\n */\nexport const SYNTH_FATAL_CODES = {\n /**\n * A format was requested that this build cannot generate through a real parser builder/serializer.\n * Fatal, never a hand-written byte fallback.\n *\n * **No code path in this build raises it.** All six formats generate, so it is reserved for a\n * future format that does not, and is kept because removing a published code is a breaking change.\n * An unsupported *kind* within a format that does generate is `SYNTH_UNSUPPORTED_KIND`.\n */\n SYNTH_UNSUPPORTED_FORMAT: \"SYNTH_UNSUPPORTED_FORMAT\",\n /**\n * A vendor quirk was requested that the target format's profile system does not support. Fatal,\n * never a silent no-op and never a fabricated quirk.\n */\n SYNTH_UNSUPPORTED_QUIRK: \"SYNTH_UNSUPPORTED_QUIRK\",\n /**\n * A quirk transform found no structural anchor to mutate, so the fixture would not carry the\n * deviation it is labelled with. Fatal: a golden file that lies about its parser verdict is worse\n * than no golden file.\n */\n SYNTH_QUIRK_ANCHOR_ABSENT: \"SYNTH_QUIRK_ANCHOR_ABSENT\",\n /**\n * A bare parse of a freshly-generated quirk artifact did not produce exactly the declared intended\n * warning code(s). Fatal, never emit a mislabeled fixture.\n */\n SYNTH_INTENDED_WARNING_MISMATCH: \"SYNTH_INTENDED_WARNING_MISMATCH\",\n /** A concept's code-system URI has no OID mapping in the C-CDA example-code table. Fatal. */\n SYNTH_UNMAPPED_CODE_SYSTEM: \"SYNTH_UNMAPPED_CODE_SYSTEM\",\n /** A money value could not be read as an X12 decimal. Fatal: a generator never rounds to a float. */\n SYNTH_INVALID_DECIMAL: \"SYNTH_INVALID_DECIMAL\",\n /** An integer range was requested with its maximum below its minimum. Fatal. */\n SYNTH_INVALID_RANGE: \"SYNTH_INVALID_RANGE\",\n /** A value was drawn from an empty pool. Fatal, never a fabricated substitute. */\n SYNTH_EMPTY_POOL: \"SYNTH_EMPTY_POOL\",\n /** A `defineSynthProfile` spec was not usable (a missing or blank `name`). Fatal. */\n SYNTH_INVALID_PROFILE: \"SYNTH_INVALID_PROFILE\",\n /**\n * A caller-supplied selector (a message kind, a document type, a corpus mix entry, a claim\n * variant, a Bundle type, a resource profile) is not in the closed set that governs it. Fatal:\n * see `resolveKind`: a selector union is erased at run time, and a selector that falls through\n * either mislabels the fixture or hands the value to a peer builder that quotes it back.\n */\n SYNTH_UNSUPPORTED_KIND: \"SYNTH_UNSUPPORTED_KIND\",\n /**\n * A requested profile IS published by the adopted implementation guide, and this build does not\n * generate it. Deliberately distinct from `SYNTH_UNSUPPORTED_KIND`, which says the name is not in\n * the adopted set at all: \"the guide does not publish this\" and \"we do not generate this yet\" are\n * different answers, and a caller building to a regulatory profile set has to be able to tell them\n * apart without matching message text. Fatal, and raised **before** anything is generated: a\n * mislabelled artifact is worse than no artifact.\n */\n SYNTH_PROFILE_NOT_GENERATED: \"SYNTH_PROFILE_NOT_GENERATED\",\n} as const;\n\n/**\n * A value from {@link SYNTH_FATAL_CODES}: the type carried by a thrown {@link SynthError}.\n */\nexport type SynthFatalCode = (typeof SYNTH_FATAL_CODES)[keyof typeof SYNTH_FATAL_CODES];\n\n/**\n * The **frozen message registry**: the only place a {@link SynthError} message can come from.\n *\n * A message here is a fixed string. It never quotes the request that produced it, and there is no\n * parameter through which it could: {@link SynthError} takes a code and nothing else. That is the\n * whole mechanism, and it is deliberately a mechanism rather than a habit. Every one of these\n * messages used to be assembled by interpolating the caller's value into a template, and the reason\n * that was safe was not the design: it was that the caller happened to be passing a quirk name.\n *\n * The trade is real and is accepted: a fatal no longer tells you *which* value it rejected. It tells\n * you which rule refused, on `err.code`, and the stack frame tells you where. The caller already\n * holds the value it passed.\n *\n * @example\n * ```ts\n * import { SYNTH_FATAL_CODES, SYNTH_FATAL_MESSAGES } from \"@cosyte/synth\";\n * SYNTH_FATAL_MESSAGES[SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL]; // => \"A value was drawn from an empty pool.\"\n * ```\n */\nexport const SYNTH_FATAL_MESSAGES: Readonly<Record<SynthFatalCode, string>> = Object.freeze({\n SYNTH_UNSUPPORTED_FORMAT:\n \"The requested format is not generable by this build. A generator has no byte fallback: it \" +\n \"builds through a parser's own serializer or it refuses.\",\n SYNTH_UNSUPPORTED_QUIRK:\n \"The requested vendor quirk is not in the target format's quirk registry. Compare the request \" +\n \"against that format's exported registry (HL7_QUIRKS, CCDA_QUIRKS, ASTM_QUIRKS).\",\n SYNTH_QUIRK_ANCHOR_ABSENT:\n \"The quirk transform found no structural anchor to mutate, so the fixture would not carry the \" +\n \"deviation it is labelled with. Refusing to emit a mislabeled fixture.\",\n SYNTH_INTENDED_WARNING_MISMATCH:\n \"A bare parse of the generated quirk artifact did not produce exactly the declared intended \" +\n \"warning code(s). Refusing to emit a mislabeled fixture.\",\n SYNTH_UNMAPPED_CODE_SYSTEM:\n \"The concept's code-system URI has no OID mapping in the C-CDA example-code table.\",\n SYNTH_INVALID_DECIMAL: \"The value could not be read as an X12 decimal.\",\n SYNTH_INVALID_RANGE: \"An integer range was requested with its maximum below its minimum.\",\n SYNTH_EMPTY_POOL: \"A value was drawn from an empty pool.\",\n SYNTH_INVALID_PROFILE: \"defineSynthProfile requires a non-empty string name.\",\n SYNTH_UNSUPPORTED_KIND:\n \"The requested kind, document type, corpus mix entry, variant or profile is not one this \" +\n \"generator supports. The supported set is the exported union for that option.\",\n SYNTH_PROFILE_NOT_GENERATED:\n \"The requested profile is published by the adopted implementation guide, and this build does \" +\n \"not generate it. The coverage surface reports, per adopted profile, whether it is generated.\",\n});\n\n/**\n * The typed error every fatal `@cosyte/synth` condition throws. Carries a stable\n * {@link SynthFatalCode} so callers branch on `err.code` without matching message text.\n *\n * It takes **no value parameter**. The message is whatever {@link SYNTH_FATAL_MESSAGES} holds for the\n * code, so no caller-supplied string can reach a diagnostic surface by any route, not `message`, not\n * `stack`, not a field on the thrown object.\n *\n * @example\n * ```ts\n * import { SynthError, SYNTH_FATAL_CODES } from \"@cosyte/synth\";\n * throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_FORMAT);\n * ```\n */\nexport class SynthError extends Error {\n /** The stable fatal code. */\n public readonly code: SynthFatalCode;\n\n /**\n * @param code - The stable {@link SynthFatalCode}. The message comes from the frozen registry.\n */\n public constructor(code: SynthFatalCode) {\n super(SYNTH_FATAL_MESSAGES[code]);\n this.name = \"SynthError\";\n this.code = code;\n }\n}\n","/**\n * `Rng`: the seeded, deterministic random source every `@cosyte/synth` provider draws from.\n *\n * **The reproducibility contract.** A seed, and only the seed, determines the output.\n * `createRng(seed)` expands the integer seed through {@link ./splitmix32.splitmix32} into the four\n * `sfc32` state words, then every draw advances that state via {@link ./sfc32.sfc32Next}. Two `Rng`s\n * created from the same seed emit the **identical** sequence on any machine, any run: the property\n * the parsers', `transform`'s, and `deid`'s regression suites depend on.\n *\n * **Explicit, never global.** An `Rng` is a value you thread through a build; there is no ambient\n * shared generator and **`Math.random` is lint-banned** in `src/` (it is not seedable: its seed is\n * engine-chosen and cannot be reset, so a corpus built on it is not reproducible). Because each\n * generation creates a fresh `Rng` from its seed, generations are independent and parallel-safe.\n *\n * The `Rng` object is stateful by nature (a PRNG advances). Immutability in this library lives where it\n * is testable and matters: the generated **artifacts and the `Corpus` are deep-frozen** (see\n * `../corpus.ts`). Determinism, not object-immutability, is the `Rng`'s guarantee.\n *\n * @module\n */\n\nimport { splitmix32 } from \"./splitmix32.js\";\nimport { sfc32Next, type Sfc32State } from \"./sfc32.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\n\n/**\n * A seeded, deterministic random source. Created via {@link createRng}; passed explicitly to every\n * provider. All draw methods advance the internal state deterministically.\n */\nexport interface Rng {\n /** The integer seed this generator was created from (part of the `Corpus` manifest). */\n readonly seed: number;\n /** The next unsigned 32-bit integer. */\n nextUint32(): number;\n /** The next float in `[0, 1)`. */\n float(): number;\n /**\n * A uniformly-distributed integer in the inclusive range `[min, max]`.\n *\n * @param min - Inclusive lower bound (integer).\n * @param max - Inclusive upper bound (integer, `>= min`).\n */\n int(min: number, max: number): number;\n /** `true` with probability `p` (default `0.5`). */\n bool(p?: number): boolean;\n /**\n * Pick one element from a non-empty array.\n *\n * @param items - A non-empty readonly array.\n */\n pick<T>(items: readonly T[]): T;\n /**\n * A string of `n` decimal digits (`0`–`9`), each drawn uniformly.\n *\n * @param n - The number of digits (`>= 0`).\n */\n digits(n: number): string;\n}\n\n/**\n * The concrete {@link Rng}. Holds the mutable `sfc32` state; every method advances it deterministically.\n */\nclass Sfc32Rng implements Rng {\n public readonly seed: number;\n readonly #state: Sfc32State;\n\n public constructor(seed: number) {\n this.seed = seed | 0;\n // Expand the single seed into four well-distributed state words. Seeding sfc32 directly from the\n // raw seed gives poor low-bit behavior; splitmix32 is the standard fix (bryc / roadmap §5).\n const mix = splitmix32(this.seed);\n this.#state = { a: mix(), b: mix(), c: mix(), d: mix() };\n // A short warm-up so nearby seeds diverge immediately.\n for (let i = 0; i < 8; i += 1) sfc32Next(this.#state);\n }\n\n public nextUint32(): number {\n return sfc32Next(this.#state);\n }\n\n public float(): number {\n return this.nextUint32() / 0x1_0000_0000;\n }\n\n public int(min: number, max: number): number {\n if (max < min) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_RANGE);\n const span = max - min + 1;\n return min + Math.floor(this.float() * span);\n }\n\n public bool(p = 0.5): boolean {\n return this.float() < p;\n }\n\n public pick<T>(items: readonly T[]): T {\n if (items.length === 0) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_EMPTY_POOL);\n // `int(0, length-1)` is always in-bounds on a non-empty array, so this access cannot be a hole;\n // the cast discharges `noUncheckedIndexedAccess`'s `T | undefined` without a runtime re-check.\n return items[this.int(0, items.length - 1)] as T;\n }\n\n public digits(n: number): string {\n let out = \"\";\n for (let i = 0; i < n; i += 1) out += String(this.int(0, 9));\n return out;\n }\n}\n\n/**\n * Create a seeded, deterministic {@link Rng}. The same `seed` yields the same sequence everywhere.\n *\n * @param seed - The integer seed. Coerced to a 32-bit integer.\n * @returns A fresh, independent {@link Rng}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * const rng = createRng(12345);\n * rng.int(1, 6); // deterministic for seed 12345\n * ```\n */\nexport function createRng(seed: number): Rng {\n return new Sfc32Rng(seed);\n}\n","/**\n * The `Corpus` abstraction: a seed plus a self-describing manifest of what was generated, so a\n * fixture set is itself reproducible and regenerable. A downstream repo pins a seed\n * and gets a stable fixture set that regenerates identically.\n *\n * Generated artifacts and the `Corpus` are **deep-frozen**: this is where the archetype's immutability\n * invariant lives in a generator: a consumer cannot mutate a shared fixture out from under\n * another test.\n *\n * @module\n */\n\n/** The format an artifact was generated for. */\nexport type SynthFormat = \"hl7v2\" | \"fhir\" | \"ccda\" | \"x12\" | \"ncpdp\" | \"astm\";\n\n/**\n * One generated artifact: the serialized wire text plus the metadata needed to reproduce and check\n * it. `warnings` records what the artifact's own parser reported on the round-trip (zero for a\n * spec-clean artifact).\n */\nexport interface Artifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** A format-specific kind label (e.g. `\"ADT^A01\"`). */\n readonly kind: string;\n /** The serialized wire text, produced by the parser's own conservative serializer. */\n readonly content: string;\n /** The warning codes the parser emitted when the artifact was round-tripped (empty = spec-clean). */\n readonly warnings: readonly string[];\n}\n\n/** A self-describing manifest of a {@link Corpus}. */\nexport interface CorpusManifest {\n /** The formats present in the corpus. */\n readonly formats: readonly SynthFormat[];\n /** Per-kind artifact counts (e.g. `{ \"ADT^A01\": 3 }`). */\n readonly counts: Readonly<Record<string, number>>;\n /** The quirk names applied. */\n readonly quirks: readonly string[];\n}\n\n/** A reproducible, self-describing set of generated artifacts. */\nexport interface Corpus {\n /** The seed the corpus was generated from: regenerating from it yields byte-identical artifacts. */\n readonly seed: number;\n /** The manifest describing what was generated. */\n readonly manifest: CorpusManifest;\n /** The generated artifacts, in generation order. */\n readonly artifacts: readonly Artifact[];\n}\n\n/**\n * Assemble a deep-frozen {@link Corpus} from a seed and its artifacts, deriving the manifest.\n *\n * @param seed - The seed the artifacts were generated from.\n * @param artifacts - The generated artifacts, in order.\n * @param quirks - The quirk names applied (default none).\n * @returns A deep-frozen, self-describing {@link Corpus}.\n * @example\n * ```ts\n * import { makeCorpus } from \"@cosyte/synth\";\n * const corpus = makeCorpus(1, [{ format: \"hl7v2\", kind: \"ADT^A01\", content, warnings: [] }]);\n * corpus.manifest.counts[\"ADT^A01\"]; // 1\n * ```\n */\nexport function makeCorpus(\n seed: number,\n artifacts: readonly Artifact[],\n quirks: readonly string[] = [],\n): Corpus {\n const counts: Record<string, number> = {};\n const formats = new Set<SynthFormat>();\n const frozenArtifacts = artifacts.map((a) => {\n counts[a.kind] = (counts[a.kind] ?? 0) + 1;\n formats.add(a.format);\n return Object.freeze({ ...a, warnings: Object.freeze([...a.warnings]) });\n });\n const manifest: CorpusManifest = Object.freeze({\n formats: Object.freeze([...formats]),\n counts: Object.freeze(counts),\n quirks: Object.freeze([...quirks]),\n });\n return Object.freeze({\n seed,\n manifest,\n artifacts: Object.freeze(frozenArtifacts),\n });\n}\n","/**\n * The reserved / never-collide identifier facts that make a `@cosyte/synth` value **provably\n * synthetic**: the ground truth behind the synthetic-safety invariant.\n *\n * These are **facts**, not copyrighted prose: ranges and check-digit rules published by SSA, the\n * IRS, HHS, NANPA and the IETF that are guaranteed never to denote a real person or a real routable\n * resource. Where two authorities share one number space (SSN and ITIN), a value must be outside\n * both. Every provider draws only from these; the predicates here are the executable half of the CI\n * synthetic-safety gate: they let a test assert that no emitted value falls **outside** a reserved\n * source.\n *\n * Every entry below names its authority by that authority's **own published identifier**, never by a\n * bare hostname, so a reader can open the text and check the claim instead of taking this module's\n * word for it. Two loci have no reserving authority and one rests on a source that is not the\n * issuing agency; each says so at the point of use rather than being left out of this list.\n *\n * Sources:\n * - **SSN**, SSA POMS RM 10201.035 (Invalid Social Security Numbers (SSNs)) defines an invalid SSN\n * as \"one that we never assigned\", and identifies one by a first three digits (former area number)\n * of `000`, `666`, or \"in the 900 series\", or a second group of two digits (former group number)\n * of `00`. <https://secure.ssa.gov/poms.nsf/lnx/0110201035>\n * - **ITIN**, an IRS Individual Taxpayer Identification Number shares the SSN number space by\n * construction: it is a `9NN-GG-NNNN` value whose group `GG` falls in a published ITIN group\n * range. Area `900-999` alone therefore does not prove a value cannot be a federally issued\n * identifier, so a synthetic SSN also keeps its group outside every published range. IRS Internal\n * Revenue Manual 3.21.263: \"An ITIN begins with a `9` and the 4th and 5th digits are 50-65, 70-88,\n * 90-92 and 94-99\". <https://www.irs.gov/irm/part3/irm_03-021-263r>\n * - **Phone**, NANPA's 555 Line Numbers page: \"The fictitious, non-working numbers, 555-0100 through\n * 555-0199, will remain reserved for entertainment/advertising.\"\n * <https://nanpa.com/numbering/555-line-numbers>\n * - **Email/domain**, RFC 2606 (Reserved Top Level DNS Names) reserves the `.test`, `.example`,\n * `.invalid` and `.localhost` top-level names and the second-level names `example.com`/`.net`/\n * `.org`; RFC 6761 section 6.5 carries the example domains into the special-use registry.\n * <https://datatracker.ietf.org/doc/html/rfc2606>,\n * <https://datatracker.ietf.org/doc/html/rfc6761>\n * - **IP**, RFC 5737: the blocks `192.0.2.0/24` (TEST-NET-1), `198.51.100.0/24` (TEST-NET-2) and\n * `203.0.113.0/24` (TEST-NET-3) \"are provided for use in documentation\"; RFC 3849: \"The prefix\n * allocated for documentation purposes is 2001:DB8::/32\".\n * <https://datatracker.ietf.org/doc/html/rfc5737>,\n * <https://datatracker.ietf.org/doc/html/rfc3849>\n * - **NPI**, a real National Provider Identifier is a 10-digit number whose last digit is a Luhn\n * check digit computed over the `80840` prefix + the 9-digit base. The rule is 69 FR 3434, the\n * final rule adopting the NPI (FR Doc 04-1149, docket CMS-0045-F), whose issuing agency that\n * document records as \"Centers for Medicare & Medicaid Services, HHS\": \"the NPI check digit\n * calculation must always be performed as though the NPI is preceded by\" `80840`, and the check\n * digit is \"calculated using the ISO standard Luhn check digit algorithm\". A number whose check\n * digit is **wrong** therefore cannot be a validly issued NPI. `synth` emits NPIs with a\n * deliberately-invalid check digit, so no generated NPI can collide with a real provider.\n * <https://www.federalregister.gov/documents/full_text/text/2004/01/23/04-1149.txt>\n * - **DEA**, the check-digit formula is **not** attributed to the DEA and no DEA-published text\n * stating it is cited anywhere here. See {@link deaCheckDigit}, which names the non-normative\n * source the claim does rest on, and what that source is not.\n * - **MRN / member / account**, **no authority reserves this locus**: there is no reserved MRN range\n * and none is claimed. See {@link SYNTHETIC_ASSIGNING_AUTHORITY} for what the floor rests on\n * instead.\n *\n * @module\n */\n\n/**\n * The synthetic **assigning authority** `@cosyte/synth` mints MRNs / account / member identifiers\n * under.\n *\n * **No authority reserves this locus.** An MRN is unique only within its assigning-authority / OID\n * namespace, no registry reserves a range of them, and none is cited here. What the floor rests on\n * instead is the *namespace*, as a documented design decision: every synthetic identifier is scoped\n * to a namespace that clearly cannot be a real facility's, a `SYNTH`-labelled authority this package\n * mints and no real facility uses. A value under this AA can never collide with a real record\n * whatever its digits are, because the namespace itself is synthetic.\n *\n * The OID is **uncited for the same reason**. `2.16.840.1.113883.19.999` is a value this package\n * chose; no published text designating the root `2.16.840.1.113883.19` for example use could be\n * shown, so this module claims no such designation and the guarantee above does not rest on one.\n */\nexport const SYNTHETIC_ASSIGNING_AUTHORITY = Object.freeze({\n /** The human-readable assigning-authority namespace id (HL7 HD.1). */\n namespaceId: \"COSYTE-SYNTH\",\n /** The universal id, an OID this package chose under the root `2.16.840.1.113883.19` (HD.2). */\n universalId: \"2.16.840.1.113883.19.999\",\n /** The universal id type (HD.3). */\n universalIdType: \"ISO\",\n});\n\n/** RFC 2606 / 6761 reserved email domains `@cosyte/synth` draws from. */\nexport const RESERVED_EMAIL_DOMAINS: readonly string[] = Object.freeze([\n \"example.com\",\n \"example.org\",\n \"example.net\",\n]);\n\n/** RFC 5737 IPv4 documentation (TEST-NET) `/24` network prefixes. */\nexport const TEST_NET_V4_PREFIXES: readonly string[] = Object.freeze([\n \"192.0.2\", // TEST-NET-1\n \"198.51.100\", // TEST-NET-2\n \"203.0.113\", // TEST-NET-3\n]);\n\n/** RFC 3849 IPv6 documentation prefix. */\nexport const DOC_V6_PREFIX = \"2001:db8\";\n\n/**\n * The published **IRS ITIN group ranges**, inclusive `[min, max]` bands over the two group digits\n * (positions 4 and 5) of a `9NN-GG-NNNN` value. An Individual Taxpayer Identification Number is an\n * SSN-format number that begins with `9` and carries a group inside one of these bands, so these\n * bands are what separates an SSN the SSA manual calls invalid from a validly formatted ITIN.\n *\n * These are **facts** about the number's shape, not copyrighted prose (IRS Internal Revenue Manual\n * 3.21.263). Group values `89` and `93` sit between the bands on purpose: the IRM records them as\n * reserved for other IRS programs rather than for ITINs, so a value carrying one is **not**\n * ITIN-formatted (see {@link isItinFormatted}).\n */\nexport const ITIN_GROUP_RANGES: readonly Readonly<{ min: number; max: number }>[] = Object.freeze([\n Object.freeze({ min: 50, max: 65 }),\n Object.freeze({ min: 70, max: 88 }),\n Object.freeze({ min: 90, max: 92 }),\n Object.freeze({ min: 94, max: 99 }),\n]);\n\n/**\n * The two group values the IRM records as reserved for other IRS programs rather than for ITINs.\n * They are **not** ITIN-formatted (so {@link isItinFormatted} must not claim them), and they are\n * still an issuing authority's space, so {@link SSN_SYNTHETIC_GROUPS} does not draw from them\n * either: the generator stays out of every federally used group, not merely out of the ITIN ones.\n *\n * @internal\n */\nconst ITIN_EXCLUDED_GROUPS: readonly number[] = Object.freeze([89, 93]);\n\n/**\n * The two-digit **group values a synthetic SSN may carry**: every value from `00` to `99` that is\n * outside every band in {@link ITIN_GROUP_RANGES} and outside {@link ITIN_EXCLUDED_GROUPS}. Derived\n * from those two lists rather than written out, so the pool can never drift from the published\n * ranges it is defined against.\n *\n * Combined with an area in the `900-999` band, a value drawn from this pool is provably outside both\n * issuing authorities that share the number space: SSA POMS RM 10201.035 identifies that area as\n * marking an **invalid** SSN, and a group outside every published ITIN band is not ITIN-formatted.\n *\n * @internal\n */\nexport const SSN_SYNTHETIC_GROUPS: readonly string[] = Object.freeze(\n Array.from({ length: 100 }, (_unused, group) => group)\n .filter(\n (group) =>\n !ITIN_GROUP_RANGES.some((range) => group >= range.min && group <= range.max) &&\n !ITIN_EXCLUDED_GROUPS.includes(group),\n )\n .map((group) => String(group).padStart(2, \"0\")),\n);\n\n/**\n * The `80840` prefix prepended to a 10-digit NPI before the Luhn check. A real NPI satisfies\n * `luhn(\"80840\" + npi) ≡ 0 (mod 10)`.\n *\n * The rule is **69 FR 3434**, the final rule adopting the NPI (FR Doc 04-1149, docket CMS-0045-F),\n * issued by the agency that document names as \"Centers for Medicare & Medicaid Services, HHS\": \"the\n * NPI check digit calculation must always be performed as though the NPI is preceded by\" `80840`.\n * The prefix itself is not that rule's: it credits the NCITS.284 standard health care identification\n * card, which \"requires that the first five digits of the card issuer identifier be\" `80840`, \"where\n * the initial two digits, 80, signify health applications, the next three digits, 840, signify\n * United States\". The rule cites no ISO document number for the prefix or for the check digit, and\n * neither does this module.\n * <https://www.federalregister.gov/documents/full_text/text/2004/01/23/04-1149.txt>\n */\nexport const NPI_LUHN_PREFIX = \"80840\";\n\n/**\n * The Luhn sum (mod 10) of a numeric string, doubling every second digit from the right. Used to\n * verify (or deliberately break) an NPI check digit.\n *\n * @param digits - A string of decimal digits.\n * @returns The Luhn sum modulo 10 (0 ⇒ the string passes the Luhn check).\n * @internal\n */\nexport function luhnMod10(digits: string): number {\n let sum = 0;\n // Standard Luhn: the RIGHTMOST digit is never doubled; doubling starts one position in and\n // alternates. For a full payload+check string this makes a Luhn-valid string sum to 0 (mod 10);\n // for a payload with a `0` placeholder in the check position it yields the complement of the\n // correct check digit.\n let double = false;\n for (let i = digits.length - 1; i >= 0; i -= 1) {\n let d = digits.charCodeAt(i) - 48;\n if (d < 0 || d > 9) continue;\n if (double) {\n d *= 2;\n if (d > 9) d -= 9;\n }\n sum += d;\n double = !double;\n }\n return sum % 10;\n}\n\n/**\n * The correct NPI check digit for a 9-digit base: the value that makes `80840` + base + check pass\n * the Luhn check.\n *\n * The algorithm this inverts is cited: 69 FR 3434 (FR Doc 04-1149) requires the check digit to be\n * \"calculated using the ISO standard Luhn check digit algorithm\", a modulus 10 double-add-double\n * algorithm, performed as though the NPI were preceded by {@link NPI_LUHN_PREFIX}. That rule names\n * the algorithm and its behaviour but no ISO document number, and points onward for the step-by-step\n * form: \"The specification for calculation of the NPI check digit will be made available on the CMS\n * Web site\". What this function implements is the rule's own description, modulus 10 Luhn over the\n * prefixed digits; no separate specification is cited for it.\n * <https://www.federalregister.gov/documents/full_text/text/2004/01/23/04-1149.txt>\n *\n * @param base9 - The 9-digit NPI base (positions 1 to 9).\n * @returns The check digit (`0`–`9`) a real NPI would carry for this base.\n * @example\n * ```ts\n * import { npiCheckDigit } from \"@cosyte/synth\";\n * npiCheckDigit(\"123456789\"); // 3, so 1234567893 is a Luhn-valid NPI shape\n * ```\n */\nexport function npiCheckDigit(base9: string): number {\n // Luhn over \"80840\" + base9 with a trailing 0 check placeholder; the check digit closes the sum.\n const partial = luhnMod10(`${NPI_LUHN_PREFIX}${base9}0`);\n return (10 - partial) % 10;\n}\n\n/**\n * The DEA-registration prefix letters `@cosyte/synth` draws a synthetic DEA number's first character\n * from. A real DEA number is `<registrant-type><last-name-initial>` + 7 digits; the first letter is the\n * registrant type (A/B/F/G/M/P/R/X are the widely-published values; the second letter is the\n * registrant's last-name initial). These letters are a **fact** about the number's shape, not\n * copyrighted prose: they only shape the value; the synthetic guarantee is the deliberately-**invalid\n * checksum** (see {@link dea} / {@link isSyntheticDea}).\n */\nexport const DEA_REGISTRANT_TYPES: readonly string[] = Object.freeze([\n \"A\",\n \"B\",\n \"F\",\n \"G\",\n \"M\",\n \"P\",\n \"R\",\n \"X\",\n]);\n\n/**\n * The correct DEA check digit for a 7-digit numeric base. The checksum is\n * `(d1 + d3 + d5) + 2·(d2 + d4 + d6)`, whose **units digit** is the 7th (check) digit. A real DEA\n * number satisfies this; a number whose 7th digit differs cannot be a validly-issued DEA registration.\n *\n * **NON-NORMATIVELY SOURCED, and this is the one locus in this module that is.** The formula above\n * is quoted from a pharmacy journal article, Gabay, \"Federal Controlled Substances Act: Controlled\n * Substances Prescriptions\", Hospital Pharmacy (PMC3847977): \"add the sum of the first, third, and\n * fifth digits to twice the sum of the second, fourth, and sixth digits. The total should be a\n * number whose last digit is the same as the last digit of the DEA number.\"\n * <https://pmc.ncbi.nlm.nih.gov/articles/PMC3847977/>\n *\n * **That article is not the DEA.** It is a secondary description of the agency's algorithm, not the\n * agency's own statement of it, and no DEA-published text stating the algorithm is cited here. The\n * consequence is stated rather than hidden: if the formula is wrong, a value this package builds to\n * fail it may in fact **pass** the real check, and the generator would then emit a checksum-valid\n * DEA number while {@link isSyntheticDea} asserts the opposite. Every other entry in this module's\n * `Sources:` list names the issuing authority's own text; this one cannot.\n *\n * @param base6 - The first 6 digits of the DEA number (positions 1 to 6).\n * @returns The check digit (`0`–`9`) a real DEA number would carry for this base.\n * @example\n * ```ts\n * import { deaCheckDigit } from \"@cosyte/synth\";\n * deaCheckDigit(\"123456\"); // the units digit of (1+3+5) + 2·(2+4+6)\n * ```\n */\nexport function deaCheckDigit(base6: string): number {\n let odd = 0;\n let even = 0;\n for (let i = 0; i < 6; i += 1) {\n const digit = base6.charCodeAt(i) - 48;\n if (i % 2 === 0) odd += digit;\n else even += digit;\n }\n return (odd + 2 * even) % 10;\n}\n\n/**\n * Whether a DEA number (`XX` + 7 digits, case-insensitive) is **provably synthetic**: its check digit\n * (the 7th digit) does **not** match the checksum {@link deaCheckDigit} computes, so it cannot be a\n * validly-issued DEA registration. A checksum-valid DEA number (which *could* denote a real\n * prescriber) returns `false`; a value that is not the DEA shape returns `false`.\n *\n * **NON-NORMATIVELY SOURCED.** This predicate is only as strong as the algorithm it inverts, and\n * that algorithm is cited to a pharmacy journal article (PMC3847977), **not to the DEA**: no\n * DEA-published statement of it is cited anywhere in this package. Read `true` as \"fails the\n * formula {@link deaCheckDigit} implements\", never as \"the DEA could not have issued this\". The\n * full citation and the consequence of the formula being wrong are on {@link deaCheckDigit}.\n *\n * @param value - The candidate DEA number (with or without incidental separators).\n * @returns `true` when the DEA number's checksum is wrong (never a real DEA registration).\n * @example\n * ```ts\n * import { isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(\"AF1234561\"); // depends on the base: true when the 7th digit is wrong\n * ```\n */\nexport function isSyntheticDea(value: string): boolean {\n const compact = value.replace(/[\\s-]/g, \"\").toUpperCase();\n if (!/^[A-Z]{2}\\d{7}$/.test(compact)) return false;\n const digits = compact.slice(2);\n const check = digits.charCodeAt(6) - 48;\n return deaCheckDigit(digits.slice(0, 6)) !== check;\n}\n\n/**\n * Whether a 10-digit NPI is **provably synthetic**, i.e. its check digit is invalid, so it cannot be\n * a validly issued NPI. A Luhn-valid 10-digit NPI (which *could* denote a real registered provider)\n * returns `false`; a non-10-digit value returns `false` (not an NPI shape).\n *\n * The check this inverts is the one 69 FR 3434 (FR Doc 04-1149) requires: the Luhn check digit,\n * computed as though the NPI were preceded by {@link NPI_LUHN_PREFIX}. Unlike the DEA locus, this\n * one cites the issuing rule itself.\n * <https://www.federalregister.gov/documents/full_text/text/2004/01/23/04-1149.txt>\n *\n * @param value - The candidate NPI (digits only, or with incidental separators).\n * @returns `true` when the NPI's check digit is wrong (never a real NPI).\n * @example\n * ```ts\n * import { isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(\"1234567894\"); // true: invalid check digit (valid would be 1234567893)\n * isSyntheticNpi(\"1234567893\"); // false: Luhn-valid, could be a real NPI\n * ```\n */\nexport function isSyntheticNpi(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 10) return false;\n return luhnMod10(`${NPI_LUHN_PREFIX}${digits}`) !== 0;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) SSN string carries an area SSA's own manual identifies\n * as **invalid**: `000`, `666`, or \"in the 900 series\". A real, issuable SSN returns `false`.\n *\n * The citable claim is SSA POMS RM 10201.035, which defines an invalid SSN as \"one that we never\n * assigned\" and lists those three areas as identifying one. The wording here says invalid rather\n * than never-issued because invalidity is what the manual states.\n * <https://secure.ssa.gov/poms.nsf/lnx/0110201035>\n *\n * @param value - The candidate SSN (dashes optional).\n * @returns `true` when the SSN is provably synthetic.\n * @example\n * ```ts\n * import { isSyntheticSsn } from \"@cosyte/synth\";\n * isSyntheticSsn(\"900-12-3456\"); // true (the 900 series marks an invalid SSN)\n * isSyntheticSsn(\"123456789\"); // false (issuable area 123)\n * ```\n */\nexport function isSyntheticSsn(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n const area = Number(digits.slice(0, 3));\n return area === 0 || area === 666 || area >= 900;\n}\n\n/**\n * Whether a `ddd-dd-dddd` (or `ddddddddd`) value is a **validly formatted IRS ITIN**: it begins\n * with `9` and its group digits (positions 4 and 5) fall inside a published ITIN group range\n * ({@link ITIN_GROUP_RANGES}). This is the second issuing authority sharing the SSN number space,\n * so `isSyntheticSsn(v) && !isItinFormatted(v)` is the full \"cannot be a federally issued national\n * id\" guarantee, of which the area rule alone is only half.\n *\n * `true` means the value is ITIN-shaped and therefore **must not** be emitted at an SSN locus. A\n * value that is not exactly 9 digits once separators are stripped returns `false` (not an SSN/ITIN\n * shape) rather than throwing, as do the group values `89` and `93`, which the IRM reserves for\n * other IRS programs rather than for ITINs.\n *\n * @param value - The candidate national id (dashes and other separators optional).\n * @returns `true` when the value is formatted as a valid ITIN.\n * @example\n * ```ts\n * import { isItinFormatted } from \"@cosyte/synth\";\n * isItinFormatted(\"912-70-1234\"); // true: group 70 is inside a published ITIN range\n * isItinFormatted(\"912-66-1234\"); // false: group 66 is outside every published ITIN range\n * ```\n */\nexport function isItinFormatted(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n if (digits.length !== 9) return false;\n if (!digits.startsWith(\"9\")) return false;\n const group = Number(digits.slice(3, 5));\n return ITIN_GROUP_RANGES.some((range) => group >= range.min && group <= range.max);\n}\n\n/**\n * Whether a phone string contains the NANP `555-0100…555-0199` reserved fictional line range.\n *\n * @param value - The candidate phone (any formatting).\n * @returns `true` when the number is in the reserved fictional block.\n * @example\n * ```ts\n * import { isSyntheticPhone } from \"@cosyte/synth\";\n * isSyntheticPhone(\"(202) 555-0142\"); // true\n * ```\n */\nexport function isSyntheticPhone(value: string): boolean {\n const digits = value.replace(/\\D/g, \"\");\n // The reserved guarantee is the 7-digit tail: exchange 555 + line 01NN.\n const tail = digits.slice(-7);\n return /^555 ?01\\d\\d$/.test(tail) || /^55501\\d\\d$/.test(tail);\n}\n\n/**\n * Whether an email's domain is an RFC 2606 / 6761 reserved / test domain.\n *\n * @param value - The candidate email address.\n * @returns `true` when the domain is reserved (never real).\n * @example\n * ```ts\n * import { isSyntheticEmail } from \"@cosyte/synth\";\n * isSyntheticEmail(\"faux.testerson@example.com\"); // true\n * ```\n */\nexport function isSyntheticEmail(value: string): boolean {\n const at = value.lastIndexOf(\"@\");\n if (at < 0) return false;\n const domain = value.slice(at + 1).toLowerCase();\n if (RESERVED_EMAIL_DOMAINS.includes(domain)) return true;\n return /\\.(example|test|invalid|localhost)$/.test(domain);\n}\n\n/**\n * Whether an IP string is in an RFC 5737 (IPv4 TEST-NET) or RFC 3849 (IPv6 documentation) reserved\n * block. A real routable address returns `false`.\n *\n * @param value - The candidate IPv4 or IPv6 address.\n * @returns `true` when the address is a reserved documentation address.\n * @example\n * ```ts\n * import { isSyntheticIp } from \"@cosyte/synth\";\n * isSyntheticIp(\"192.0.2.44\"); // true (TEST-NET-1)\n * isSyntheticIp(\"8.8.8.8\"); // false (real)\n * ```\n */\nexport function isSyntheticIp(value: string): boolean {\n if (value.toLowerCase().startsWith(`${DOC_V6_PREFIX}:`)) return true;\n return TEST_NET_V4_PREFIXES.some((prefix) => value.startsWith(`${prefix}.`));\n}\n","/**\n * The shipped **clearly-fake name pool**: `@cosyte/synth`'s own license-clean synthetic data.\n *\n * Deliberately **not** a `faker`-style realistic-name corpus (which could match a real person at a real\n * address: the exact hazard the synthetic-safety invariant forbids). Every token is\n * an obviously-invented, fixture-flavoured word: a reader can tell at a glance it names no one. The pool\n * is small on purpose: structural coverage, not demographic realism, is the goal.\n *\n * `# synthetic: true`\n *\n * @module\n */\n\n/** Obviously-synthetic given names. None is a plausible real person's name. */\nexport const SYNTHETIC_GIVEN_NAMES: readonly string[] = Object.freeze([\n \"Testina\",\n \"Fixtura\",\n \"Synthos\",\n \"Placeholda\",\n \"Sampleton\",\n \"Prototius\",\n \"Stubbina\",\n \"Exampla\",\n \"Quilliam\",\n \"Fabrica\",\n \"Simula\",\n \"Testry\",\n \"Seedwin\",\n \"Corpora\",\n \"Reprodo\",\n \"Mocktavia\",\n \"Dummett\",\n \"Voidwin\",\n \"Deteria\",\n \"Randomir\",\n]);\n\n/** Obviously-synthetic family names. None is a plausible real surname at a real address. */\nexport const SYNTHETIC_FAMILY_NAMES: readonly string[] = Object.freeze([\n \"Testerson\",\n \"Fauxman\",\n \"Placeholt\",\n \"Mockridge\",\n \"Fixtingham\",\n \"Synthwell\",\n \"Dummerton\",\n \"Examplewood\",\n \"Fabricant\",\n \"Simulacre\",\n \"Nonesuch\",\n \"Seedman\",\n \"Corpusworth\",\n \"Reprodus\",\n \"Voidmark\",\n \"Deterwood\",\n \"Randomson\",\n \"Quillfeather\",\n \"Notreal\",\n \"Genfield\",\n]);\n\n/** Obviously-synthetic street names for structured address fields. */\nexport const SYNTHETIC_STREET_NAMES: readonly string[] = Object.freeze([\n \"Fixture Lane\",\n \"Sample Street\",\n \"Placeholder Avenue\",\n \"Synthetic Way\",\n \"Example Boulevard\",\n \"Testing Terrace\",\n \"Mock Road\",\n \"Prototype Court\",\n]);\n\n/**\n * Obviously-synthetic city names. Combined only ever with a synthetic street + a fake name (the\n * *combination* is what identifies, and the combination is always synthetic).\n */\nexport const SYNTHETIC_CITY_NAMES: readonly string[] = Object.freeze([\n \"Faketon\",\n \"Synthville\",\n \"Exampleburg\",\n \"Testford\",\n \"Mockhaven\",\n \"Fixtureton\",\n]);\n","/**\n * The synthetic-safety provider layer: every identifier, contact point, name, and date\n * `@cosyte/synth` emits is minted here, and **only** from a guaranteed-non-colliding source. There is no code\n * path that returns a value not drawn from a reserved range or the\n * shipped fake-name pool. This is the inverse of a parser's liberality: the generator is *closed-world*\n * on its data sources, so no output *can* be real or plausibly-real PHI.\n *\n * All providers are pure functions of an explicit {@link ../rng/rng.Rng}, same seed, same values.\n *\n * @module\n */\n\nimport type { Rng } from \"../rng/rng.js\";\n\nimport {\n RESERVED_EMAIL_DOMAINS,\n TEST_NET_V4_PREFIXES,\n DOC_V6_PREFIX,\n SYNTHETIC_ASSIGNING_AUTHORITY,\n npiCheckDigit,\n deaCheckDigit,\n DEA_REGISTRANT_TYPES,\n SSN_SYNTHETIC_GROUPS,\n} from \"./reserved.js\";\nimport {\n SYNTHETIC_GIVEN_NAMES,\n SYNTHETIC_FAMILY_NAMES,\n SYNTHETIC_STREET_NAMES,\n SYNTHETIC_CITY_NAMES,\n} from \"./names-pool.js\";\n\n/** A synthetic person name drawn from the shipped fake-name pool. */\nexport interface SyntheticName {\n /** A clearly-fake given name. */\n readonly given: string;\n /** A clearly-fake family name. */\n readonly family: string;\n}\n\n/** A synthetic postal address: synthetic street + city, a fixed non-real ZIP. */\nexport interface SyntheticAddress {\n /** A clearly-fake street line. */\n readonly street: string;\n /** A clearly-fake city. */\n readonly city: string;\n /** A US state abbreviation (structural only; never combined with a real street + name + DOB). */\n readonly state: string;\n /** A reserved non-real ZIP (`00000`). */\n readonly zip: string;\n}\n\n/** A synthetic identifier scoped to the synthetic assigning authority. */\nexport interface SyntheticIdentifier {\n /** The identifier value (digits): unique only within the synthetic namespace. */\n readonly value: string;\n /** HL7 identifier type code (`MR` = medical record, `AN` = account, `MB` = member). */\n readonly typeCode: \"MR\" | \"AN\" | \"MB\";\n /** The synthetic assigning-authority namespace id. */\n readonly assigningAuthority: string;\n /** The synthetic assigning-authority OID (HL7 example arc). */\n readonly assigningAuthorityOid: string;\n}\n\n/** Which SSN reserved space to draw from. */\nexport type SsnBlock = \"never-issued\" | \"advertising\";\n\n/**\n * A **synthetic SSN**: dashed `AAA-GG-SSSS`, drawn so it can be neither an SSA-assignable Social\n * Security number nor a validly formatted IRS ITIN. Two authorities share this number space: SSA\n * never issues area `900-999`, and the IRS issues ITINs *inside* that area, distinguished by the\n * group digits. So the area rule alone is only half the guarantee, and both blocks below also keep\n * the group outside every published ITIN group range (see {@link isItinFormatted}).\n *\n * Default draws the never-issued area space (`900-999`) with a group from\n * {@link SSN_SYNTHETIC_GROUPS}; `block: \"advertising\"` returns the fixed display block\n * `987-00-4320` to `987-00-4329`, whose group `00` is one SSA never assigns and one no published\n * ITIN range contains.\n *\n * **`\"advertising\"` no longer means SSA's own advertising block.** That published block is\n * `987-65-4320` to `987-65-4329`, and group `65` sits inside a published ITIN group range, so every\n * value in it is ITIN-formatted and none of them can be emitted here. The option keeps its name\n * (renaming it would break call sites for a property no test asserts) and keeps its purpose, a fixed\n * ten-value block safe to print on screen, but it is a display block of this package's choosing now,\n * not a citation of SSA's. Do not reintroduce the `65` group to recover the provenance.\n *\n * @param rng - The seeded generator.\n * @param block - Which reserved space to draw from. Defaults to `\"never-issued\"`.\n * @returns A dashed synthetic SSN string.\n * @example\n * ```ts\n * import { createRng, ssn } from \"@cosyte/synth\";\n * ssn(createRng(1)); // e.g. a 900-area, never-issued, never-ITIN-formatted SSN\n * ```\n */\nexport function ssn(rng: Rng, block: SsnBlock = \"never-issued\"): string {\n if (block === \"advertising\") {\n // The fixed display block: last digit 0..9 within -4320..-4329, group 00 so no value here is\n // ITIN-formatted (the previous group, 65, sat inside the published ITIN range 50-65).\n return `987-00-432${String(rng.int(0, 9))}`;\n }\n const area = rng.int(900, 999); // SSA never issues 900-999.\n // Never a bare two-digit draw: 44 of the 100 group values would make the result a validly\n // formatted ITIN. The pool is the complement, so an ITIN-shaped candidate is never produced\n // rather than produced and rejected (generation never fails for a seed).\n const group = rng.pick(SSN_SYNTHETIC_GROUPS);\n const serial = rng.digits(4);\n return `${String(area)}-${group}-${serial}`;\n}\n\n/**\n * A **synthetic phone** in the NANP reserved fictional block: `(AAA) 555-01NN`. The reserved\n * guarantee is the `555-01NN` tail (exchange 555, line 0100–0199); the area code is any NANP-valid\n * `NXX`. Can never be a working number.\n *\n * @param rng - The seeded generator.\n * @returns A formatted synthetic phone string.\n * @example\n * ```ts\n * import { createRng, phone } from \"@cosyte/synth\";\n * phone(createRng(1)); // e.g. \"(2XX) 555-01NN\"\n * ```\n */\nexport function phone(rng: Rng): string {\n const area = `${String(rng.int(2, 9))}${rng.digits(2)}`; // NXX area code.\n const line = `01${rng.digits(2)}`; // reserved 0100-0199.\n return `(${area}) 555-${line}`;\n}\n\n/**\n * A **synthetic name** drawn from the shipped clearly-fake pool.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticName}.\n * @example\n * ```ts\n * import { createRng, name } from \"@cosyte/synth\";\n * const { given, family } = name(createRng(1));\n * ```\n */\nexport function name(rng: Rng): SyntheticName {\n return { given: rng.pick(SYNTHETIC_GIVEN_NAMES), family: rng.pick(SYNTHETIC_FAMILY_NAMES) };\n}\n\n/**\n * A **synthetic email** at an RFC 2606 / 6761 reserved domain: `<slug>@example.com`.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name to derive the local-part slug from; otherwise a random slug is used.\n * @returns A synthetic email address.\n * @example\n * ```ts\n * import { createRng, email, name } from \"@cosyte/synth\";\n * email(createRng(1), name(createRng(1))); // \"<given>.<family>@example.com\"\n * ```\n */\nexport function email(rng: Rng, person?: SyntheticName): string {\n const domain = rng.pick(RESERVED_EMAIL_DOMAINS);\n const slug = person ? `${person.given}.${person.family}`.toLowerCase() : `synth${rng.digits(6)}`;\n return `${slug}@${domain}`;\n}\n\n/**\n * A **synthetic IPv4** in an RFC 5737 TEST-NET block, never routable.\n *\n * @param rng - The seeded generator.\n * @returns A TEST-NET IPv4 address string.\n * @example\n * ```ts\n * import { createRng, ipv4 } from \"@cosyte/synth\";\n * ipv4(createRng(1)); // e.g. \"192.0.2.NN\"\n * ```\n */\nexport function ipv4(rng: Rng): string {\n return `${rng.pick(TEST_NET_V4_PREFIXES)}.${String(rng.int(1, 254))}`;\n}\n\n/**\n * A **synthetic IPv6** in the RFC 3849 documentation prefix `2001:db8::/32`, never routable.\n *\n * @param rng - The seeded generator.\n * @returns A documentation-prefix IPv6 address string.\n * @example\n * ```ts\n * import { createRng, ipv6 } from \"@cosyte/synth\";\n * ipv6(createRng(1)); // e.g. \"2001:db8::NNNN\"\n * ```\n */\nexport function ipv6(rng: Rng): string {\n const tail = rng.nextUint32().toString(16).padStart(4, \"0\").slice(-4);\n return `${DOC_V6_PREFIX}::${tail}`;\n}\n\n/**\n * A **deterministic UUIDv4-shaped** surrogate key from the seeded generator. Because it is seeded (not\n * from `node:crypto`, which is not reproducible), the cryptographic non-collision argument is weaker,\n * acceptable because the identifier namespace is synthetic anyway, and noted honestly.\n *\n * @param rng - The seeded generator.\n * @returns A canonical `8-4-4-4-12` lowercase-hex UUID string with version `4` and RFC 4122 variant.\n * @example\n * ```ts\n * import { createRng, uuid } from \"@cosyte/synth\";\n * uuid(createRng(1)); // \"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\"\n * ```\n */\nexport function uuid(rng: Rng): string {\n const bytes = new Uint8Array(16);\n for (let i = 0; i < 16; i += 1) bytes[i] = rng.int(0, 255);\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40; // version 4\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80; // variant 10xx\n const hex = Array.from(bytes, (b) => b.toString(16).padStart(2, \"0\"));\n return `${hex.slice(0, 4).join(\"\")}-${hex.slice(4, 6).join(\"\")}-${hex.slice(6, 8).join(\"\")}-${hex.slice(8, 10).join(\"\")}-${hex.slice(10, 16).join(\"\")}`;\n}\n\n/**\n * A **synthetic NPI**: a 10-digit National Provider Identifier with a **deliberately-invalid Luhn\n * check digit**, so it can never be a NPPES-issued NPI (a real NPI must satisfy the `80840`-prefixed\n * Luhn check). The 9-digit base is drawn from the seeded generator; the check digit is\n * set to `(correct + 1) mod 10`, guaranteeing the full value fails validation.\n *\n * @param rng - The seeded generator.\n * @returns A 10-digit NPI-shaped string that is provably not a real NPI.\n * @example\n * ```ts\n * import { createRng, npi, isSyntheticNpi } from \"@cosyte/synth\";\n * isSyntheticNpi(npi(createRng(1))); // true: invalid check digit by construction\n * ```\n */\nexport function npi(rng: Rng): string {\n const base9 = rng.digits(9);\n const wrongCheck = (npiCheckDigit(base9) + 1) % 10;\n return `${base9}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic DEA number**: `<registrant-type><initial>` + 7 digits with a **deliberately-invalid\n * checksum**, so it can never be a validly-issued DEA registration (a real DEA number's 7th digit\n * satisfies the published DEA checksum). The first letter is a registrant-type letter, the\n * second is derived from `person` (its family initial) when supplied so the number reads plausibly; the\n * 6-digit base is seeded and the check digit is set to `(correct + 1) mod 10`, guaranteeing the value\n * fails validation. NCPDP carries prescriber DEA, and this is the identity locus a refuter attacks\n * hardest, so, like {@link npi}, non-collision is a construction-level guarantee, not a heuristic.\n *\n * @param rng - The seeded generator.\n * @param person - Optional name whose family initial becomes the DEA's second letter.\n * @returns A DEA-shaped string that is provably not a real DEA registration.\n * @example\n * ```ts\n * import { createRng, dea, isSyntheticDea } from \"@cosyte/synth\";\n * isSyntheticDea(dea(createRng(1))); // true: invalid checksum by construction\n * ```\n */\nexport function dea(rng: Rng, person?: SyntheticName): string {\n const type = rng.pick(DEA_REGISTRANT_TYPES);\n const initialSource = person?.family ?? rng.pick(SYNTHETIC_FAMILY_NAMES);\n const initial = initialSource.slice(0, 1).toUpperCase();\n const base6 = rng.digits(6);\n const wrongCheck = (deaCheckDigit(base6) + 1) % 10;\n return `${type}${initial}${base6}${String(wrongCheck)}`;\n}\n\n/**\n * A **synthetic identifier** (MRN / account / member id) scoped to the synthetic assigning authority.\n * There is no reserved MRN range, so non-collision is guaranteed by the *namespace*, not the value: the\n * identifier lives under a `SYNTH` authority no real facility uses.\n *\n * @param rng - The seeded generator.\n * @param typeCode - The HL7 identifier type: `MR` (default), `AN`, or `MB`.\n * @returns A {@link SyntheticIdentifier}.\n * @example\n * ```ts\n * import { createRng, identifier } from \"@cosyte/synth\";\n * identifier(createRng(1), \"MR\"); // { value, typeCode: \"MR\", assigningAuthority: \"COSYTE-SYNTH\", ... }\n * ```\n */\nexport function identifier(\n rng: Rng,\n typeCode: SyntheticIdentifier[\"typeCode\"] = \"MR\",\n): SyntheticIdentifier {\n return {\n value: rng.digits(8),\n typeCode,\n assigningAuthority: SYNTHETIC_ASSIGNING_AUTHORITY.namespaceId,\n assigningAuthorityOid: SYNTHETIC_ASSIGNING_AUTHORITY.universalId,\n };\n}\n\n/**\n * A **synthetic address**: a fake street + city, a reserved non-real ZIP (`00000`). A real state\n * abbreviation may appear (structural only) but is never combined with a real street + name + DOB.\n *\n * @param rng - The seeded generator.\n * @returns A {@link SyntheticAddress}.\n * @example\n * ```ts\n * import { createRng, address } from \"@cosyte/synth\";\n * address(createRng(1)); // { street, city, state, zip: \"00000\" }\n * ```\n */\nexport function address(rng: Rng): SyntheticAddress {\n const number = rng.int(1, 9999);\n return {\n street: `${String(number)} ${rng.pick(SYNTHETIC_STREET_NAMES)}`,\n city: rng.pick(SYNTHETIC_CITY_NAMES),\n state: rng.pick(US_STATES),\n zip: \"00000\",\n };\n}\n\n/**\n * A **synthetic date** in HL7 `YYYYMMDD` form, drawn uniformly within an inclusive year range. Comes\n * from the seeded generator (never wall-clock), so it is reproducible and implies no real event.\n *\n * @param rng - The seeded generator.\n * @param minYear - Inclusive lower year bound (default `1930`).\n * @param maxYear - Inclusive upper year bound (default `2010`).\n * @returns An `YYYYMMDD` date string (always a valid calendar day).\n * @example\n * ```ts\n * import { createRng, dateYmd } from \"@cosyte/synth\";\n * dateYmd(createRng(1), 1970, 2000); // \"YYYYMMDD\"\n * ```\n */\nexport function dateYmd(rng: Rng, minYear = 1930, maxYear = 2010): string {\n const year = rng.int(minYear, maxYear);\n const month = rng.int(1, 12);\n const daysInMonth = new Date(Date.UTC(year, month, 0)).getUTCDate();\n const day = rng.int(1, daysInMonth);\n return `${String(year).padStart(4, \"0\")}${String(month).padStart(2, \"0\")}${String(day).padStart(2, \"0\")}`;\n}\n\n/** US state abbreviations: structural only (see {@link address}). */\nconst US_STATES: readonly string[] = Object.freeze([\n \"AL\",\n \"AK\",\n \"AZ\",\n \"AR\",\n \"CA\",\n \"CO\",\n \"CT\",\n \"DE\",\n \"FL\",\n \"GA\",\n \"HI\",\n \"ID\",\n \"IL\",\n \"IN\",\n \"IA\",\n \"KS\",\n \"KY\",\n \"LA\",\n \"ME\",\n \"MD\",\n \"MA\",\n \"MI\",\n \"MN\",\n \"MS\",\n \"MO\",\n \"MT\",\n \"NE\",\n \"NV\",\n \"NH\",\n \"NJ\",\n \"NM\",\n \"NY\",\n \"NC\",\n \"ND\",\n \"OH\",\n \"OK\",\n \"OR\",\n \"PA\",\n \"RI\",\n \"SC\",\n \"SD\",\n \"TN\",\n \"TX\",\n \"UT\",\n \"VT\",\n \"VA\",\n \"WA\",\n \"WV\",\n \"WI\",\n \"WY\",\n]);\n","/**\n * The `safe` namespace: the single entry point for every synthetic-by-construction value provider.\n *\n * Grouped under one object so a consumer reads `safe.ssn(rng)` / `safe.phone(rng)` and it is\n * self-evident that the value is drawn from a guaranteed-non-colliding synthetic source.\n * The individual functions and the reserved-range predicates are also exported by name from the\n * package root for direct import.\n *\n * @module\n */\n\nimport {\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n} from \"./providers.js\";\n\nexport * from \"./providers.js\";\nexport * from \"./reserved.js\";\nexport * from \"./names-pool.js\";\n\n/**\n * The synthetic-safety provider namespace. Every function draws only from a reserved range or the\n * shipped fake-name pool, no value it returns can be real or plausibly-real PHI.\n *\n * @example\n * ```ts\n * import { createRng, safe } from \"@cosyte/synth\";\n * const rng = createRng(42);\n * safe.ssn(rng); // never-issued SSN\n * safe.phone(rng); // reserved 555-01NN number\n * ```\n */\nexport const safe = Object.freeze({\n ssn,\n phone,\n name,\n email,\n ipv4,\n ipv6,\n uuid,\n identifier,\n address,\n dateYmd,\n npi,\n dea,\n});\n","/**\n * US Core + base-FHIR **canonical URLs and code-system identifiers**: the facts `@cosyte/synth` needs\n * to emit US-Core-conformant resources, and nothing more.\n *\n * **Content-free, exactly like `@cosyte/fhir`.** These are *identifiers*: canonical URLs and code\n * `system` URIs, not the copyrighted terminology tables or the profile `StructureDefinition` content\n * they name. `@cosyte/synth` bundles **no** US Core IG: a consumer who wants to *validate* generated\n * output against US Core supplies the `StructureDefinition`s themselves (BYO), exactly as\n * `@cosyte/fhir.validateResource({ profiles })` requires. What is encoded here is only which canonical\n * URL a resource's `meta.profile` claims and which `system` a coding carries: public facts.\n *\n * The URLs target **US Core 6.1.0** (the USCDI v3 / ONC HTI-1 §170.315(g)(10) anchor, FHIR R4 4.0.1),\n * grounded firsthand against the published IG (`hl7.org/fhir/us/core/STU6.1`): the same version the\n * test corpus validates against.\n *\n * @module\n */\n\n/** The canonical `meta.profile` URLs for the US Core 6.1.0 profiles `@cosyte/synth` generates. */\nexport const US_CORE_PROFILE = Object.freeze({\n /** US Core Patient. */\n PATIENT: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-patient\",\n /** US Core Condition (Problems and Health Concerns). */\n CONDITION:\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-condition-problems-health-concerns\",\n /** US Core Laboratory Result Observation. */\n OBSERVATION_LAB: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-observation-lab\",\n /** US Core Vital Signs (derived from the base FHIR vital-signs profile). */\n VITAL_SIGNS: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-vital-signs\",\n /** US Core MedicationRequest. */\n MEDICATION_REQUEST: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-medicationrequest\",\n /** US Core Encounter. */\n ENCOUNTER: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-encounter\",\n /** US Core DiagnosticReport Profile for Laboratory Results Reporting. */\n DIAGNOSTIC_REPORT_LAB:\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-diagnosticreport-lab\",\n /** US Core Immunization. */\n IMMUNIZATION: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-immunization\",\n /** US Core AllergyIntolerance. */\n ALLERGY_INTOLERANCE: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-allergyintolerance\",\n /** US Core Procedure. */\n PROCEDURE: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-procedure\",\n /** US Core Provenance. */\n PROVENANCE: \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-provenance\",\n} as const);\n\n/**\n * The canonical prefix every US Core 6.1.0 resource profile's `url` shares. A profile's canonical is\n * this prefix followed by its profile id.\n *\n * @example\n * ```ts\n * import { US_CORE_PROFILE_BASE } from \"@cosyte/synth/fhir\";\n * `${US_CORE_PROFILE_BASE}us-core-provenance`;\n * ```\n */\nexport const US_CORE_PROFILE_BASE = \"http://hl7.org/fhir/us/core/StructureDefinition/\";\n\n/**\n * The **adopted set**: the profile ids of every US Core 6.1.0 **resource profile** the implementation\n * guide publishes, transcribed from the guide's own artifact index (\"Structures: Resource Profiles\").\n * This is the closed set a profile-addressed request is resolved against, and it is *identifiers\n * only*, never IG content, exactly like {@link US_CORE_PROFILE}.\n *\n * `45 CFR 170.215` adopts FHIR R4.0.1 and US Core STU 6.1.0, so this is the profile set a developer\n * building to `45 CFR 170.315(g)(10)` addresses. It is **not** the count of\n * `StructureDefinition-us-core-*.json` files in the guide's source tree: that directory also holds\n * the guide's extension definitions and omits profiles the guide publishes.\n *\n * The guide's 10 **extension definitions** (`us-core-race`, `us-core-birthsex`, …) are deliberately\n * absent: an extension is not a standalone artifact, so a request naming one is refused like any\n * other name outside this set.\n *\n * @example\n * ```ts\n * import { US_CORE_ADOPTED_PROFILES } from \"@cosyte/synth/fhir\";\n * US_CORE_ADOPTED_PROFILES.includes(\"us-core-provenance\"); // true\n * ```\n */\nexport const US_CORE_ADOPTED_PROFILES = Object.freeze([\n \"head-occipital-frontal-circumference-percentile\",\n \"pediatric-bmi-for-age\",\n \"pediatric-weight-for-height\",\n \"us-core-allergyintolerance\",\n \"us-core-blood-pressure\",\n \"us-core-bmi\",\n \"us-core-body-height\",\n \"us-core-body-temperature\",\n \"us-core-body-weight\",\n \"us-core-careplan\",\n \"us-core-careteam\",\n \"us-core-condition-encounter-diagnosis\",\n \"us-core-condition-problems-health-concerns\",\n \"us-core-coverage\",\n \"us-core-diagnosticreport-lab\",\n \"us-core-diagnosticreport-note\",\n \"us-core-documentreference\",\n \"us-core-encounter\",\n \"us-core-goal\",\n \"us-core-head-circumference\",\n \"us-core-heart-rate\",\n \"us-core-immunization\",\n \"us-core-implantable-device\",\n \"us-core-location\",\n \"us-core-medication\",\n \"us-core-medicationdispense\",\n \"us-core-medicationrequest\",\n \"us-core-observation-clinical-result\",\n \"us-core-observation-lab\",\n \"us-core-observation-occupation\",\n \"us-core-observation-pregnancyintent\",\n \"us-core-observation-pregnancystatus\",\n \"us-core-observation-screening-assessment\",\n \"us-core-observation-sexual-orientation\",\n \"us-core-organization\",\n \"us-core-patient\",\n \"us-core-practitioner\",\n \"us-core-practitionerrole\",\n \"us-core-procedure\",\n \"us-core-provenance\",\n \"us-core-pulse-oximetry\",\n \"us-core-questionnaireresponse\",\n \"us-core-relatedperson\",\n \"us-core-respiratory-rate\",\n \"us-core-servicerequest\",\n \"us-core-simple-observation\",\n \"us-core-smokingstatus\",\n \"us-core-specimen\",\n \"us-core-vital-signs\",\n] as const);\n\n/** One profile id from the adopted US Core 6.1.0 set. Erased at run time, so it is resolved, not trusted. */\nexport type UsCoreProfileId = (typeof US_CORE_ADOPTED_PROFILES)[number];\n\n/** The US Core `us-core-race` extension URL (a Patient must-support extension). */\nexport const US_CORE_RACE_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-race\";\n/** The US Core `us-core-ethnicity` extension URL (a Patient must-support extension). */\nexport const US_CORE_ETHNICITY_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity\";\n/** The US Core `us-core-birthsex` extension URL (a Patient must-support extension). */\nexport const US_CORE_BIRTHSEX_EXTENSION =\n \"http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex\";\n\n/**\n * The code-system `system` URIs the generators reference. Public identity URIs (HL7-published),\n * never the code-system *content*, no SNOMED/LOINC/RxNorm table is bundled.\n */\nexport const SYSTEM = Object.freeze({\n /** FHIR `administrative-gender` (`Patient.gender`). */\n ADMINISTRATIVE_GENDER: \"http://hl7.org/fhir/administrative-gender\",\n /** HL7 Terminology `observation-category`. */\n OBSERVATION_CATEGORY: \"http://terminology.hl7.org/CodeSystem/observation-category\",\n /** HL7 Terminology `condition-category`. */\n CONDITION_CATEGORY: \"http://terminology.hl7.org/CodeSystem/condition-category\",\n /** HL7 Terminology `condition-clinical`. */\n CONDITION_CLINICAL: \"http://terminology.hl7.org/CodeSystem/condition-clinical\",\n /** HL7 Terminology `condition-ver-status`. */\n CONDITION_VER_STATUS: \"http://terminology.hl7.org/CodeSystem/condition-ver-status\",\n /** HL7 v2 `0203` identifier-type (`Identifier.type.coding.code` = `MR`). */\n IDENTIFIER_TYPE: \"http://terminology.hl7.org/CodeSystem/v2-0203\",\n /** OMB race & ethnicity category system (US Core race/ethnicity `ombCategory`). */\n OMB_RACE_ETHNICITY: \"urn:oid:2.16.840.1.113883.6.238\",\n /** LOINC, `Observation.code` (lab + vital-signs). */\n LOINC: \"http://loinc.org\",\n /** SNOMED CT, `Condition.code`. */\n SNOMED: \"http://snomed.info/sct\",\n /** RxNorm, `MedicationRequest.medicationCodeableConcept` + an allergen substance. */\n RXNORM: \"http://www.nlm.nih.gov/research/umls/rxnorm\",\n /** UCUM, `Quantity.system` for units of measure. */\n UCUM: \"http://unitsofmeasure.org\",\n /** CVX (CDC vaccine administered), `Immunization.vaccineCode`. */\n CVX: \"http://hl7.org/fhir/sid/cvx\",\n /** HL7 v3 `ActCode`, `Encounter.class`. */\n V3_ACT_CODE: \"http://terminology.hl7.org/CodeSystem/v3-ActCode\",\n /** HL7 v2 `0074` diagnostic-service-section, `DiagnosticReport.category` (`LAB`). */\n DIAGNOSTIC_SERVICE_SECTION: \"http://terminology.hl7.org/CodeSystem/v2-0074\",\n /** HL7 Terminology `allergyintolerance-clinical`, `AllergyIntolerance.clinicalStatus`. */\n ALLERGY_CLINICAL: \"http://terminology.hl7.org/CodeSystem/allergyintolerance-clinical\",\n /** HL7 Terminology `allergyintolerance-verification`, `AllergyIntolerance.verificationStatus`. */\n ALLERGY_VERIFICATION: \"http://terminology.hl7.org/CodeSystem/allergyintolerance-verification\",\n /** HL7 Terminology `provenance-participant-type`, `Provenance.agent.type` (`author`). */\n PROVENANCE_PARTICIPANT_TYPE: \"http://terminology.hl7.org/CodeSystem/provenance-participant-type\",\n /** US Core `us-core-provenance-participant-type`, `Provenance.agent.type` (`transmitter`). */\n US_CORE_PROVENANCE_PARTICIPANT_TYPE:\n \"http://hl7.org/fhir/us/core/CodeSystem/us-core-provenance-participant-type\",\n} as const);\n\n/** A US Core profile canonical URL. */\nexport type UsCoreProfileUrl = (typeof US_CORE_PROFILE)[keyof typeof US_CORE_PROFILE];\n","/**\n * A tiny, curated, **license-clean** pool of example codes for filling coded fields in generated FHIR\n * resources (`Observation.code`, `Condition.code`, `MedicationRequest.medication[x]`, and the OMB\n * race/ethnicity categories). These are **public code facts**: codes drawn from the published FHIR R4\n * and US Core specification examples, not copyrighted terminology tables: `@cosyte/synth` bundles\n * **no** SNOMED/LOINC/RxNorm content. The pool exists only so a\n * generated resource is *structurally* realistic; a consumer who needs their own codes supplies them.\n *\n * Nothing here is PHI: codes and their display text are not patient identifiers. The synthetic-safety\n * invariant governs identity fields (name/DOB/identifier/telecom/address), which come from `../safe`.\n *\n * @module\n */\n\n/** A coded concept: a `system` URI, a `code`, and its human-readable `display`. */\nexport interface CodeConcept {\n /** The code-system URI (`Coding.system`). */\n readonly system: string;\n /** The code value (`Coding.code`). */\n readonly code: string;\n /** The human-readable display text (`Coding.display`). */\n readonly display: string;\n}\n\n/**\n * A quantitative observation concept: a LOINC code plus the UCUM unit and a plausible synthetic value\n * range the seeded generator draws within. The range implies **no** real measurement: it only keeps a\n * generated result inside a structurally-sane band.\n */\nexport interface QuantConcept extends CodeConcept {\n /** The UCUM unit code (`Quantity.code` and, as text, `Quantity.unit`). */\n readonly unit: string;\n /** Inclusive lower bound of the synthetic value (in `unit`). */\n readonly low: number;\n /** Inclusive upper bound of the synthetic value (in `unit`). */\n readonly high: number;\n /** Decimal places to render (keeps the emitted `decimal` lexical form stable and realistic). */\n readonly decimals: number;\n}\n\nimport { SYSTEM } from \"./us-core.js\";\n\n/**\n * LOINC laboratory-result example codes (for a US Core Laboratory Result `Observation`). Public LOINC\n * identifiers used purely as illustrative structural fillers, with UCUM units and synthetic value bands.\n */\nexport const EXAMPLE_LAB_OBSERVATIONS: readonly QuantConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2345-7\",\n display: \"Glucose [Mass/volume] in Serum or Plasma\",\n unit: \"mg/dL\",\n low: 70,\n high: 140,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"718-7\",\n display: \"Hemoglobin [Mass/volume] in Blood\",\n unit: \"g/dL\",\n low: 12,\n high: 17,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2951-2\",\n display: \"Sodium [Moles/volume] in Serum or Plasma\",\n unit: \"mmol/L\",\n low: 135,\n high: 145,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"2823-3\",\n display: \"Potassium [Moles/volume] in Serum or Plasma\",\n unit: \"mmol/L\",\n low: 4,\n high: 5,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"4548-4\",\n display: \"Hemoglobin A1c/Hemoglobin.total in Blood\",\n unit: \"%\",\n low: 4,\n high: 9,\n decimals: 1,\n }),\n]);\n\n/**\n * LOINC vital-sign example codes (for a US Core Vital Signs `Observation`). Public LOINC identifiers\n * with their required UCUM units and synthetic value bands. Simple single-value vitals only:\n * multi-component vitals (e.g. blood-pressure panel `85354-9`) are not generated.\n */\nexport const EXAMPLE_VITAL_SIGNS: readonly QuantConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8867-4\",\n display: \"Heart rate\",\n unit: \"/min\",\n low: 55,\n high: 100,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"9279-1\",\n display: \"Respiratory rate\",\n unit: \"/min\",\n low: 12,\n high: 20,\n decimals: 0,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8310-5\",\n display: \"Body temperature\",\n unit: \"Cel\",\n low: 36,\n high: 38,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"29463-7\",\n display: \"Body weight\",\n unit: \"kg\",\n low: 50,\n high: 100,\n decimals: 1,\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"8302-2\",\n display: \"Body height\",\n unit: \"cm\",\n low: 150,\n high: 190,\n decimals: 0,\n }),\n]);\n\n/**\n * SNOMED CT problem/condition example codes (for a US Core `Condition.code`). Public SNOMED identifiers\n * used as structural fillers; `@cosyte/synth` bundles no SNOMED content.\n */\nexport const EXAMPLE_CONDITIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.SNOMED, code: \"59621000\", display: \"Essential hypertension\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"44054006\", display: \"Type 2 diabetes mellitus\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"195967001\", display: \"Asthma\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"13645005\",\n display: \"Chronic obstructive lung disease\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"38341003\", display: \"Hypertensive disorder\" }),\n]);\n\n/**\n * RxNorm medication example codes (for a US Core `MedicationRequest.medicationCodeableConcept`). Public\n * RxNorm identifiers used as structural fillers; `@cosyte/synth` bundles no RxNorm content.\n */\nexport const EXAMPLE_MEDICATIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"1049221\",\n display: \"Acetaminophen 325 MG Oral Tablet\",\n }),\n Object.freeze({ system: SYSTEM.RXNORM, code: \"197361\", display: \"Amlodipine 5 MG Oral Tablet\" }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"860975\",\n display: \"24 HR Metformin hydrochloride 500 MG Extended Release Oral Tablet\",\n }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"308136\",\n display: \"Amoxicillin 250 MG Oral Capsule\",\n }),\n Object.freeze({\n system: SYSTEM.RXNORM,\n code: \"617314\",\n display: \"Atorvastatin 40 MG Oral Tablet\",\n }),\n]);\n\n/**\n * OMB race categories (US Core `us-core-race` `ombCategory`): the five OMB categories, public code\n * facts from the CDC Race &amp; Ethnicity code system (`urn:oid:2.16.840.1.113883.6.238`).\n */\nexport const EXAMPLE_RACE_CATEGORIES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: \"2106-3\", display: \"White\" }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2054-5\",\n display: \"Black or African American\",\n }),\n Object.freeze({ system: SYSTEM.OMB_RACE_ETHNICITY, code: \"2028-9\", display: \"Asian\" }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"1002-5\",\n display: \"American Indian or Alaska Native\",\n }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2076-8\",\n display: \"Native Hawaiian or Other Pacific Islander\",\n }),\n]);\n\n/**\n * OMB ethnicity categories (US Core `us-core-ethnicity` `ombCategory`): the two OMB categories, public\n * code facts from the CDC Race &amp; Ethnicity code system.\n */\nexport const EXAMPLE_ETHNICITY_CATEGORIES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2135-2\",\n display: \"Hispanic or Latino\",\n }),\n Object.freeze({\n system: SYSTEM.OMB_RACE_ETHNICITY,\n code: \"2186-5\",\n display: \"Not Hispanic or Latino\",\n }),\n]);\n\n/**\n * CVX vaccine-administered example codes (for a US Core `Immunization.vaccineCode`). Public CDC CVX\n * identifiers used as structural fillers; `@cosyte/synth` bundles no CVX content.\n */\nexport const EXAMPLE_VACCINES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.CVX,\n code: \"140\",\n display: \"Influenza, seasonal, injectable, preservative free\",\n }),\n Object.freeze({ system: SYSTEM.CVX, code: \"03\", display: \"MMR\" }),\n Object.freeze({ system: SYSTEM.CVX, code: \"20\", display: \"DTaP\" }),\n Object.freeze({ system: SYSTEM.CVX, code: \"133\", display: \"Pneumococcal conjugate PCV 13\" }),\n Object.freeze({\n system: SYSTEM.CVX,\n code: \"208\",\n display: \"COVID-19, mRNA, LNP-S, PF, 30 mcg/0.3 mL dose\",\n }),\n]);\n\n/**\n * Allergen-substance example codes (for a US Core `AllergyIntolerance.code`). Public RxNorm / SNOMED CT\n * identifiers used as structural fillers; no terminology content is bundled.\n */\nexport const EXAMPLE_ALLERGENS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.RXNORM, code: \"7980\", display: \"Penicillin G\" }),\n Object.freeze({ system: SYSTEM.RXNORM, code: \"2670\", display: \"Codeine\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"762952008\", display: \"Peanut (substance)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"227493005\", display: \"Cashew nuts (substance)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"3718001\", display: \"Cow's milk (substance)\" }),\n]);\n\n/**\n * Allergy-reaction manifestation example codes (for `AllergyIntolerance.reaction.manifestation`).\n * Public SNOMED CT clinical-finding identifiers used as structural fillers.\n */\nexport const EXAMPLE_ALLERGY_MANIFESTATIONS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.SNOMED, code: \"247472004\", display: \"Wheal (finding)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"126485001\", display: \"Urticaria (disorder)\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"271807003\",\n display: \"Eruption of skin (disorder)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"267036007\", display: \"Dyspnea (finding)\" }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"422587007\", display: \"Nausea (finding)\" }),\n]);\n\n/**\n * SNOMED CT procedure example codes (for a US Core `Procedure.code`). Public SNOMED identifiers used as\n * structural fillers, **not** CPT (which is never bundled).\n */\nexport const EXAMPLE_PROCEDURES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"80146002\",\n display: \"Excision of appendix (procedure)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"73761001\", display: \"Colonoscopy (procedure)\" }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"5880005\",\n display: \"Physical examination procedure (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"108252007\",\n display: \"Laboratory procedure (procedure)\",\n }),\n Object.freeze({ system: SYSTEM.SNOMED, code: \"71651007\", display: \"Mammography (procedure)\" }),\n]);\n\n/**\n * LOINC diagnostic-report example codes (for a US Core Laboratory `DiagnosticReport.code`). Public LOINC\n * panel identifiers used as structural fillers.\n */\nexport const EXAMPLE_DIAGNOSTIC_REPORTS: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24323-8\",\n display: \"Comprehensive metabolic 2000 panel - Serum or Plasma\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"58410-2\",\n display: \"CBC panel - Blood by Automated count\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24357-6\",\n display: \"Urinalysis complete panel - Urine\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24331-1\",\n display: \"Lipid 1996 panel - Serum or Plasma\",\n }),\n Object.freeze({\n system: SYSTEM.LOINC,\n code: \"24321-2\",\n display: \"Basic metabolic 1998 panel - Serum or Plasma\",\n }),\n]);\n\n/**\n * SNOMED CT encounter-type example codes (for a US Core `Encounter.type`). Public SNOMED identifiers\n * used as structural fillers.\n */\nexport const EXAMPLE_ENCOUNTER_TYPES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"308335008\",\n display: \"Patient encounter procedure (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"185349003\",\n display: \"Encounter for check up (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"185347001\",\n display: \"Encounter for problem (procedure)\",\n }),\n Object.freeze({\n system: SYSTEM.SNOMED,\n code: \"390906007\",\n display: \"Follow-up encounter (procedure)\",\n }),\n]);\n\n/**\n * HL7 v3 `ActCode` encounter-class example codes (for `Encounter.class`, a single `Coding`). Public\n * ActCode identifiers used as structural fillers.\n */\nexport const EXAMPLE_ENCOUNTER_CLASSES: readonly CodeConcept[] = Object.freeze([\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"AMB\", display: \"ambulatory\" }),\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"EMER\", display: \"emergency\" }),\n Object.freeze({ system: SYSTEM.V3_ACT_CODE, code: \"IMP\", display: \"inpatient encounter\" }),\n]);\n","/**\n * The C-CDA example-code pool: a thin adapter that **reuses** the same license-clean, public\n * code facts the FHIR generators ship (`../fhir/example-codes.ts`), reshaped into `@cosyte/ccda`'s\n * `BuildCode` tuple (an OID `codeSystem` instead of a FHIR `system` URI). Reusing one source of truth\n * keeps the LOINC / RxNorm / SNOMED / CVX pools consistent across the FHIR and C-CDA surfaces;\n * `@cosyte/synth` still bundles\n * **no** terminology content: these are public spec-example codes, not copyrighted tables.\n *\n * Nothing here is PHI: codes and their display text are not patient identifiers. The synthetic-safety\n * invariant governs identity fields (name / DOB / MRN / telecom), which come from `../safe`.\n *\n * @module\n */\n\nimport { CVX, LOINC, NCI_ROUTE, RXNORM, SNOMED_CT } from \"@cosyte/ccda\";\nimport type { BuildCode, BuildQuantity } from \"@cosyte/ccda\";\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\nimport {\n EXAMPLE_ALLERGENS,\n EXAMPLE_ALLERGY_MANIFESTATIONS,\n EXAMPLE_CONDITIONS,\n EXAMPLE_DIAGNOSTIC_REPORTS,\n EXAMPLE_LAB_OBSERVATIONS,\n EXAMPLE_MEDICATIONS,\n EXAMPLE_PROCEDURES,\n EXAMPLE_VACCINES,\n EXAMPLE_VITAL_SIGNS,\n type CodeConcept,\n type QuantConcept,\n} from \"../fhir/example-codes.js\";\n\n/** Map a FHIR code-system `system` URI to the C-CDA OID `@cosyte/ccda` expects. */\nconst URI_TO_OID: Readonly<Record<string, string>> = Object.freeze({\n \"http://loinc.org\": LOINC,\n \"http://snomed.info/sct\": SNOMED_CT,\n \"http://www.nlm.nih.gov/research/umls/rxnorm\": RXNORM,\n \"http://hl7.org/fhir/sid/cvx\": CVX,\n});\n\n/**\n * Adapt a FHIR {@link CodeConcept} to a `@cosyte/ccda` {@link BuildCode}, resolving its `system` URI to\n * the matching OID. The `codeSystem` is always set explicitly (never left to a per-slot default), so a\n * SNOMED allergen or a LOINC panel carries the right OID regardless of which builder slot consumes it.\n *\n * @param concept - The FHIR-shaped `{ system, code, display }` concept.\n * @returns The `@cosyte/ccda` `BuildCode`.\n * @throws SynthError `SYNTH_UNMAPPED_CODE_SYSTEM` when the concept's `system` URI has no known OID\n * mapping. The refusal does not quote the URI: `concept` is caller-supplied.\n * @example\n * ```ts\n * import { toBuildCode } from \"@cosyte/synth/ccda\";\n * // toBuildCode({ system: \"http://snomed.info/sct\", code: \"59621000\", display: \"Essential hypertension\" });\n * ```\n */\nexport function toBuildCode(concept: CodeConcept): BuildCode {\n const codeSystem = URI_TO_OID[concept.system];\n if (codeSystem === undefined) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNMAPPED_CODE_SYSTEM);\n }\n return { code: concept.code, codeSystem, displayName: concept.display };\n}\n\n/**\n * Draw a synthetic-but-structurally-sane {@link BuildQuantity} for a quantitative concept: a value in\n * the concept's plausible band (from the seeded generator, so reproducible) rendered to the concept's\n * decimal precision, with its UCUM unit. The value implies **no** real measurement.\n *\n * @param rng - The seeded generator.\n * @param concept - The quantitative concept (LOINC code + UCUM unit + value band).\n * @returns A `BuildQuantity` (`{ value, unit }`) for the C-CDA builder.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { quantityFor, LAB_RESULTS } from \"@cosyte/synth/ccda\";\n * // quantityFor(createRng(1), LAB_RESULTS[0]);\n * ```\n */\nexport function quantityFor(rng: Rng, concept: QuantConcept): BuildQuantity {\n const scale = 10 ** concept.decimals;\n const value = rng.int(concept.low * scale, concept.high * scale) / scale;\n return { value, unit: concept.unit };\n}\n\n/** SNOMED CT problem/condition example codes (Problems / Past Medical History). */\nexport const PROBLEMS: readonly CodeConcept[] = EXAMPLE_CONDITIONS;\n/** RxNorm / SNOMED CT allergen example codes (Allergies). */\nexport const ALLERGENS: readonly CodeConcept[] = EXAMPLE_ALLERGENS;\n/** SNOMED CT allergy-reaction manifestation example codes. */\nexport const ALLERGY_REACTIONS: readonly CodeConcept[] = EXAMPLE_ALLERGY_MANIFESTATIONS;\n/** RxNorm medication example codes (Medications). */\nexport const MEDICATIONS: readonly CodeConcept[] = EXAMPLE_MEDICATIONS;\n/** LOINC laboratory-result example codes with UCUM units + value bands (Results members). */\nexport const LAB_RESULTS: readonly QuantConcept[] = EXAMPLE_LAB_OBSERVATIONS;\n/** LOINC panel example codes (the Result Organizer `code`). */\nexport const RESULT_PANELS: readonly CodeConcept[] = EXAMPLE_DIAGNOSTIC_REPORTS;\n/** LOINC vital-sign example codes with UCUM units + value bands (Vital Signs members). */\nexport const VITAL_SIGNS: readonly QuantConcept[] = EXAMPLE_VITAL_SIGNS;\n/** CVX vaccine example codes (Immunizations). */\nexport const VACCINES: readonly CodeConcept[] = EXAMPLE_VACCINES;\n/** SNOMED CT procedure example codes (Procedures). */\nexport const PROCEDURES: readonly CodeConcept[] = EXAMPLE_PROCEDURES;\n\n/**\n * SNOMED CT Current Smoking Status value-set example codes (Social History). Public SNOMED CT\n * identifiers used as structural fillers; `@cosyte/synth` bundles no SNOMED content.\n */\nexport const SMOKING_STATUSES: readonly BuildCode[] = Object.freeze([\n Object.freeze({ code: \"266919005\", codeSystem: SNOMED_CT, displayName: \"Never smoker\" }),\n Object.freeze({ code: \"8517006\", codeSystem: SNOMED_CT, displayName: \"Former smoker\" }),\n Object.freeze({\n code: \"449868002\",\n codeSystem: SNOMED_CT,\n displayName: \"Current every day smoker\",\n }),\n Object.freeze({\n code: \"428041000124106\",\n codeSystem: SNOMED_CT,\n displayName: \"Current some day smoker\",\n }),\n]);\n\n/**\n * NCI Thesaurus administration-route example codes (Medications / Immunizations `route`). Public NCI\n * concept ids used as structural fillers.\n */\nexport const ROUTES: readonly BuildCode[] = Object.freeze([\n Object.freeze({ code: \"C38288\", codeSystem: NCI_ROUTE, displayName: \"Oral\" }),\n Object.freeze({ code: \"C28161\", codeSystem: NCI_ROUTE, displayName: \"Intramuscular\" }),\n Object.freeze({ code: \"C38276\", codeSystem: NCI_ROUTE, displayName: \"Intravenous\" }),\n Object.freeze({ code: \"C38299\", codeSystem: NCI_ROUTE, displayName: \"Subcutaneous\" }),\n]);\n","/**\n * Synthetic C-CDA patient identity: the `recordTarget` demographics for a generated document, every\n * field minted from the synthetic-safety providers in `../safe`. No value a generated\n * C-CDA carries at a PHI locus can be real or plausibly-real: the name is from the shipped fake-name\n * pool, the MRN lives under the synthetic assigning-authority OID (never a real facility namespace),\n * and the birth date comes from the seeded generator (never wall-clock).\n *\n * The draw order is **fixed** (name → MRN → DOB → gender) so the same seed yields the same identity,\n * the reproducibility contract.\n *\n * @module\n */\n\nimport type { BuildCcdaPatient } from \"@cosyte/ccda\";\n\nimport type { Rng } from \"../rng/rng.js\";\nimport { safe, type SyntheticIdentifier, type SyntheticName } from \"../safe/index.js\";\n\n/** A synthetic C-CDA patient identity: the values threaded into a document's `recordTarget`. */\nexport interface CcdaPatientIdentity {\n /** The `BuildCcdaPatient` `@cosyte/ccda` consumes for the single `recordTarget`. */\n readonly patient: BuildCcdaPatient;\n /** The name from the shipped fake-name pool (also used to compose synthetic narrative/email). */\n readonly person: SyntheticName;\n /** The medical-record identifier, scoped to the synthetic assigning authority. */\n readonly mrn: SyntheticIdentifier;\n}\n\n/**\n * Mint a complete synthetic {@link CcdaPatientIdentity}. Every value comes from a synthetic-safety\n * provider, no code path here can return a real identifier. The MRN is scoped to the\n * synthetic assigning-authority OID (`mrnRoot`), so it is non-colliding by *namespace*, not by value.\n *\n * @param rng - The seeded generator.\n * @returns A synthetic {@link CcdaPatientIdentity}.\n * @example\n * ```ts\n * import { createRng } from \"@cosyte/synth\";\n * import { ccdaPatientIdentity } from \"@cosyte/synth/ccda\";\n * // const { patient } = ccdaPatientIdentity(createRng(1));\n * ```\n */\nexport function ccdaPatientIdentity(rng: Rng): CcdaPatientIdentity {\n const person = safe.name(rng);\n const mrn = safe.identifier(rng, \"MR\");\n const birthTime = safe.dateYmd(rng, 1930, 2010);\n const gender = rng.pick([\"M\", \"F\"] as const);\n const patient: BuildCcdaPatient = {\n mrn: mrn.value,\n mrnRoot: mrn.assigningAuthorityOid,\n mrnAssigningAuthority: mrn.assigningAuthority,\n given: [person.given],\n family: person.family,\n gender,\n birthTime,\n };\n return { patient, person, mrn };\n}\n","/**\n * The **selector chokepoint**. A generator's options are almost all *selectors*: a message kind, a\n * document type, a corpus mix, a claim variant, a Bundle type, a profile. Each is typed as a closed\n * union, and every one of those unions is **erased at run time**, so a JavaScript caller (or a\n * `as never` in someone's test) reaches the branch with any string at all.\n *\n * Three things went wrong when that was left unchecked, and they are all the same bug:\n *\n * 1. **The value reached a diagnostic.** An unrecognised `documentType` travelled into\n * `@cosyte/ccda`'s `buildCcda`, which is entitled to quote it back in its own `TypeError` and\n * does. This package then has a caller-supplied string on an `err.message` and an `err.stack`,\n * through its own public entry point, having taken no care of it.\n * 2. **The value reached the model.** A corpus mix entry becomes an `Artifact.kind` and a\n * `manifest.counts` key, which is precisely the structural-identifier position a downstream\n * package interpolates to describe a location.\n * 3. **The fixture was silently mislabeled.** An exhaustive `switch` over an erased union takes no\n * branch and returns `undefined`, or a trailing `else` quietly generates something else. A corpus\n * whose manifest says it holds one transaction and holds another is a golden file that lies.\n *\n * So a selector is resolved against its own set, once, before anything is generated, and an\n * unrecognised one is a fatal `SYNTH_UNSUPPORTED_KIND`. Like every fatal here it carries a code and a\n * fixed message, and quotes neither the request nor the set.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/**\n * Resolve one caller-supplied selector against the closed set that governs it, or **fail closed**.\n *\n * @param allowed - Every value the selector may take.\n * @param requested - The selector the caller supplied.\n * @returns `requested`, narrowed to the union.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` when `requested` is not in `allowed`.\n * @example\n * ```ts\n * import { resolveKind } from \"@cosyte/synth\";\n * resolveKind([\"ccd\", \"referralNote\"] as const, \"ccd\"); // \"ccd\"\n * ```\n */\nexport function resolveKind<T extends string>(allowed: readonly T[], requested: string): T {\n const match = allowed.find((value) => value === requested);\n if (match === undefined) throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_KIND);\n return match;\n}\n\n/**\n * Resolve every entry of a caller-supplied corpus mix, in order, or **fail closed** on the first\n * unrecognised one.\n *\n * It substitutes the default **only** when the caller supplied nothing, which is exactly what the\n * `??` it replaced did. An empty array is a supplied mix and is returned as one. An earlier version\n * of this function also treated `[]` as \"nothing supplied\", on the stated grounds that it matched the\n * previous behaviour; it did not: `??` fires on `undefined` and never on `[]`, and it changed the\n * result of six published entry points, turning an explicit empty selection into \"generate one of\n * everything\". A convenience that fails open is not a convenience.\n *\n * @param allowed - Every kind the corpus may generate.\n * @param requested - The mix the caller supplied, or `undefined` for the default.\n * @param fallback - The default mix, used only when `requested` is `undefined`.\n * @returns The resolved mix.\n * @throws SynthError `SYNTH_UNSUPPORTED_KIND` on the first unrecognised entry.\n * @example\n * ```ts\n * import { resolveMix } from \"@cosyte/synth\";\n * resolveMix([\"Result\", \"Order\"] as const, [\"Order\"], [\"Result\", \"Order\"]); // [\"Order\"]\n * ```\n */\nexport function resolveMix<T extends string>(\n allowed: readonly T[],\n requested: readonly string[] | undefined,\n fallback: readonly T[],\n): readonly T[] {\n if (requested === undefined) return fallback;\n return requested.map((entry) => resolveKind(allowed, entry));\n}\n","/**\n * Synthetic **C-CDA document generation**: a spec-clean Continuity of Care Document\n * (CCD) or Referral Note built **through `@cosyte/ccda`'s `buildCcda`**, so template IDs, LOINC section\n * codes, and structured/narrative agreement are the builder's own (spec-clean *by construction*), and\n * every `recordTarget` / clinical identifier is drawn from the synthetic-safety providers.\n *\n * The document round-trips through `parseCcda` with **zero warnings**: the builder's round-trip-by-\n * construction guarantee, re-verified independently by {@link ./round-trip.roundTrip}. Coverage tracks\n * `buildCcda`'s section/doc-type maturity: the CCD SHALL sections (Problems,\n * Allergies, Medications, Results, Vital Signs) plus Immunizations, Procedures, and Social History\n * (Smoking Status). Clinical *content* is drawn from the reused, license-clean example-code pools; a\n * `synth` document exercises the parser, it is **not** a clinically-coherent record.\n *\n * @module\n */\n\nimport { buildCcda, type BuildCcdaInit, type CcdaDocument } from \"@cosyte/ccda\";\n\nimport { createRng, type Rng } from \"../rng/rng.js\";\nimport { safe } from \"../safe/index.js\";\n\nimport {\n ALLERGENS,\n ALLERGY_REACTIONS,\n LAB_RESULTS,\n MEDICATIONS,\n PROBLEMS,\n PROCEDURES,\n RESULT_PANELS,\n ROUTES,\n SMOKING_STATUSES,\n VACCINES,\n VITAL_SIGNS,\n quantityFor,\n toBuildCode,\n} from \"./example-codes.js\";\nimport { ccdaPatientIdentity } from \"./identity.js\";\nimport { resolveKind } from \"../select.js\";\n\n/** The C-CDA document type a generator emits: the two `buildCcda` supports. */\nexport type CcdaDocumentType = \"ccd\" | \"referralNote\";\n\n/** Every value {@link CcdaDocumentType} admits. Erased at run time, so it is resolved, not trusted. */\nconst CCDA_DOCUMENT_TYPES: readonly CcdaDocumentType[] = Object.freeze([\"ccd\", \"referralNote\"]);\n\n/** Options common to every C-CDA generator. */\nexport interface GenerateCcdaOptions {\n /** The seed (deterministic: same seed yields a byte-identical document). Defaults to `0`. */\n readonly seed?: number;\n /** The document type to emit. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\n/** Pick `n` **distinct** items from a pool (`n` clamped to the pool size) using the seeded generator. */\nfunction pickN<T>(rng: Rng, pool: readonly T[], n: number): T[] {\n const take = Math.min(n, pool.length);\n const indices = pool.map((_v, i) => i);\n const out: T[] = [];\n for (let i = 0; i < take; i += 1) {\n const j = rng.int(0, indices.length - 1);\n // `j` is in `[0, indices.length-1]` on a non-empty array, so `indices[j]` and `pool[idx]` are\n // never holes; the casts discharge `noUncheckedIndexedAccess`'s `| undefined` with no runtime\n // re-check (mirroring `Rng.pick`).\n const idx = indices[j] as number;\n indices.splice(j, 1);\n out.push(pool[idx] as T);\n }\n return out;\n}\n\n/**\n * Assemble the synthetic {@link BuildCcdaInit}: the identity + clinical content the builder turns into\n * a spec-clean document. Section counts vary with the seed (each SHALL clinical section is always\n * non-empty; the optional sections are always populated for a rich fixture), and every code is drawn\n * from the reused example-code pools.\n */\nfunction buildInit(rng: Rng, documentType: CcdaDocumentType): BuildCcdaInit {\n const effectiveTime = safe.dateYmd(rng, 2020, 2025);\n const { patient, person } = ccdaPatientIdentity(rng);\n\n const problems = pickN(rng, PROBLEMS, rng.int(1, 3)).map((c) => ({\n problem: toBuildCode(c),\n status: \"active\" as const,\n onset: safe.dateYmd(rng, 2010, 2019),\n }));\n\n const allergen = rng.pick(ALLERGENS);\n const reaction = rng.pick(ALLERGY_REACTIONS);\n const allergies = [{ allergen: toBuildCode(allergen), reaction: toBuildCode(reaction) }];\n\n const medications = pickN(rng, MEDICATIONS, rng.int(1, 2)).map((c) => ({\n drug: toBuildCode(c),\n dose: { value: 1, unit: \"{tablet}\" },\n route: rng.pick(ROUTES),\n frequency: { value: rng.pick([8, 12, 24]), unit: \"h\" },\n }));\n\n const panel = rng.pick(RESULT_PANELS);\n const resultMembers = pickN(rng, LAB_RESULTS, 2).map((q) => ({\n test: toBuildCode(q),\n quantity: quantityFor(rng, q),\n effectiveTime,\n }));\n const results = [{ code: toBuildCode(panel), effectiveTime, results: resultMembers }];\n\n const vitalMembers = pickN(rng, VITAL_SIGNS, 2).map((q) => ({\n code: toBuildCode(q),\n quantity: quantityFor(rng, q),\n }));\n const vitalSigns = [{ effectiveTime, vitals: vitalMembers }];\n\n const vaccine = rng.pick(VACCINES);\n const immunizations = [\n {\n vaccine: toBuildCode(vaccine),\n dose: { value: 0.5, unit: \"mL\" },\n route: rng.pick(ROUTES),\n effectiveTime: safe.dateYmd(rng, 2018, 2024),\n },\n ];\n\n const procedure = rng.pick(PROCEDURES);\n const procedures = [\n {\n code: toBuildCode(procedure),\n disposition: \"performed\" as const,\n effectiveTime: safe.dateYmd(rng, 2015, 2023),\n },\n ];\n\n const smokingStatus = [{ value: rng.pick(SMOKING_STATUSES), effectiveTime }];\n\n const base: BuildCcdaInit = {\n documentType,\n effectiveTime,\n patient,\n problems,\n allergies,\n medications,\n results,\n vitalSigns,\n immunizations,\n procedures,\n smokingStatus,\n };\n\n if (documentType === \"referralNote\") {\n // The Referral Note's narrative-only SHALL sections: synthetic free text (never fabricated\n // clinical judgment about a real person; the \"patient\" does not exist).\n return {\n ...base,\n reasonForReferral: `Synthetic referral for evaluation of ${person.given} ${person.family}.`,\n assessment: \"Synthetic assessment narrative. Not a real clinical assessment.\",\n };\n }\n return base;\n}\n\n/**\n * Generate a spec-clean synthetic C-CDA document (CCD by default, or Referral Note), built through\n * `@cosyte/ccda`'s `buildCcda`. The returned {@link CcdaDocument} round-trips through `parseCcda` with\n * zero warnings, and the same seed yields a byte-identical document.\n *\n * @param options - Seed and document type. See {@link GenerateCcdaOptions}.\n * @returns The `@cosyte/ccda` `CcdaDocument` (serialize via `serializeCcda(doc)` or `doc.toString()`).\n * @example\n * ```ts\n * import { generateCcda } from \"@cosyte/synth/ccda\";\n * import { serializeCcda } from \"@cosyte/ccda\";\n * const xml = serializeCcda(generateCcda({ seed: 42 }));\n * ```\n */\nexport function generateCcda(options: GenerateCcdaOptions = {}): CcdaDocument {\n const { seed = 0 } = options;\n const documentType = resolveKind(CCDA_DOCUMENT_TYPES, options.documentType ?? \"ccd\");\n const rng = createRng(seed);\n return buildCcda(buildInit(rng, documentType));\n}\n\n/**\n * Generate a spec-clean synthetic **Continuity of Care Document (CCD)**.\n *\n * @param options - Seed (deterministic). See {@link GenerateCcdaOptions}.\n * @returns The `CcdaDocument`.\n * @example\n * ```ts\n * import { generateCcd, roundTrip } from \"@cosyte/synth/ccda\";\n * roundTrip(generateCcd({ seed: 1 })).specClean; // true\n * ```\n */\nexport function generateCcd(options: Omit<GenerateCcdaOptions, \"documentType\"> = {}): CcdaDocument {\n return generateCcda({ ...options, documentType: \"ccd\" });\n}\n\n/**\n * Generate a spec-clean synthetic **Referral Note**: the second document type `buildCcda` supports,\n * with its own US Realm Header specialization and Reason-for-Referral / Assessment narrative sections.\n *\n * @param options - Seed (deterministic). See {@link GenerateCcdaOptions}.\n * @returns The `CcdaDocument`.\n * @example\n * ```ts\n * import { generateReferralNote } from \"@cosyte/synth/ccda\";\n * generateReferralNote({ seed: 1 }).documentType; // \"referralNote\"\n * ```\n */\nexport function generateReferralNote(\n options: Omit<GenerateCcdaOptions, \"documentType\"> = {},\n): CcdaDocument {\n return generateCcda({ ...options, documentType: \"referralNote\" });\n}\n","/**\n * The **round-trip-through-the-parser harness** for C-CDA: the headline gate for the synthetic-fixture\n * generator. A generated document is \"spec-clean\" only if `@cosyte/ccda`, not\n * `@cosyte/synth`'s own opinion, reads it back cleanly. This harness serializes a generated document,\n * parses it straight back through `parseCcda`, and reports what the parser found, so a false\n * \"spec-clean\" claim cannot hide.\n *\n * `@cosyte/ccda`'s `buildCcda` is round-trip-by-construction (it emits through the same DOM the parser\n * reads), so a clean build carries zero warnings, but this harness re-verifies that *independently*,\n * against the parser, because the parser is the judge.\n *\n * @module\n */\n\nimport { parseCcda, serializeCcda, type CcdaDocument } from \"@cosyte/ccda\";\n\n/** The verdict of one round-trip through `@cosyte/ccda`. */\nexport interface RoundTripResult {\n /** The serialized C-CDA XML (the builder/serializer's own conservative emit). */\n readonly content: string;\n /** The warning codes the parser emitted on re-parse. Empty ⇒ spec-clean. */\n readonly warnings: readonly string[];\n /** Whether re-serializing the re-parsed document is byte-identical to `content`. */\n readonly byteStable: boolean;\n /** `true` iff the artifact is spec-clean: zero warnings **and** byte-stable. */\n readonly specClean: boolean;\n}\n\n/**\n * Round-trip a generated `@cosyte/ccda` `CcdaDocument` through serialize → parse → serialize and report\n * the verdict. A spec-clean document re-parses with **zero warnings** and re-serializes byte-identically.\n *\n * @param doc - The document to check (typically from {@link ./ccd.generateCcd}).\n * @returns The {@link RoundTripResult}.\n * @example\n * ```ts\n * import { generateCcd, roundTrip } from \"@cosyte/synth/ccda\";\n * const { specClean, warnings } = roundTrip(generateCcd({ seed: 1 }));\n * // specClean === true, warnings.length === 0\n * ```\n */\nexport function roundTrip(doc: CcdaDocument): RoundTripResult {\n const content = serializeCcda(doc);\n const reparsed = parseCcda(content);\n const warnings = reparsed.warnings.map((w) => String(w.code));\n const byteStable = serializeCcda(reparsed) === content;\n return {\n content,\n warnings,\n byteStable,\n specClean: warnings.length === 0 && byteStable,\n };\n}\n","/**\n * `defineSynthProfile`: the growth-loop hook for site/vendor fixture recipes. A profile bundles the\n * value pools and the quirk recipe a fixture set should use, authored through the same public API as\n * the built-ins: a validated, frozen `SynthProfile` carrying a name, optional value overrides, and the\n * quirk names a format's quirk corpus should apply.\n *\n * @module\n */\n\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\n\n/** The user-authored spec passed to {@link defineSynthProfile}. */\nexport interface SynthProfileSpec {\n /** A stable, human-readable profile name (e.g. `\"acme-hospital\"`). Required, non-empty. */\n readonly name: string;\n /** Optional given-name pool override (clearly-synthetic names only, see the safety invariant). */\n readonly givenNames?: readonly string[];\n /** Optional family-name pool override (clearly-synthetic names only). */\n readonly familyNames?: readonly string[];\n /**\n * The vendor quirk recipe names this profile requests. Validated against the target format's quirk\n * registry when the profile drives a quirk corpus (an unsupported quirk is a fatal\n * `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op).\n */\n readonly quirks?: readonly string[];\n}\n\n/** A frozen, validated fixture recipe produced by {@link defineSynthProfile}. */\nexport interface SynthProfile {\n /** The profile name. */\n readonly name: string;\n /** The given-name pool this profile draws from (overrides or the built-in default). */\n readonly givenNames?: readonly string[];\n /** The family-name pool this profile draws from. */\n readonly familyNames?: readonly string[];\n /** The requested quirk recipe names. */\n readonly quirks: readonly string[];\n}\n\n/**\n * Define a reusable, frozen synthetic-fixture profile.\n *\n * @param spec - The profile spec; `name` is required and non-empty.\n * @returns A deep-frozen {@link SynthProfile}.\n * @throws SynthError `SYNTH_INVALID_PROFILE` when `name` is missing or blank.\n * @example\n * ```ts\n * import { defineSynthProfile } from \"@cosyte/synth\";\n * const acme = defineSynthProfile({ name: \"acme-hospital\", quirks: [] });\n * ```\n */\nexport function defineSynthProfile(spec: SynthProfileSpec): SynthProfile {\n if (typeof spec.name !== \"string\" || spec.name.trim().length === 0) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INVALID_PROFILE);\n }\n return Object.freeze({\n name: spec.name,\n ...(spec.givenNames ? { givenNames: Object.freeze([...spec.givenNames]) } : {}),\n ...(spec.familyNames ? { familyNames: Object.freeze([...spec.familyNames]) } : {}),\n quirks: Object.freeze([...(spec.quirks ?? [])]),\n });\n}\n","/**\n * The **quirk core**. Where the spec-clean generators prove\n * *synthetic-by-construction* through each parser's own builder, the quirk layer proves the mirror\n * property: a **deliberately off-spec** fixture round-trips to **exactly the intended parser warning\n * code(s)**, no more, no fewer. The quirk vocabulary **is the parsers' own profile systems**\n * (`hl7.defineProfile`, `ccda.defineCcdaProfile`, `astm.defineAstmProfile`): a quirk exercises exactly\n * the tolerance the corresponding parser profile encodes, so a quirk fixture is never a fiction, it\n * targets a documented, coded leniency (the **intended-warning contract**).\n *\n * This module is the **format-agnostic** part: the descriptor a quirk carries, the artifact a quirk\n * generator returns, the round-trip verdict shape, and the `SYNTH_UNSUPPORTED_QUIRK` fail-closed. Each\n * format's concrete quirk recipes + transforms live behind its own subpath (`@cosyte/synth/hl7`, …).\n *\n * @module\n */\n\nimport type { SynthFormat } from \"./corpus.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"./codes.js\";\nimport type { SynthProfile } from \"./profile.js\";\n\n/**\n * How the parser's matching profile treats a quirk once it is active: the three shapes the parsers'\n * profile systems actually exhibit (verified firsthand against each parser):\n *\n * - `\"suppressed\"`, the profile makes the warning **disappear** (HL7 v2: a `defineProfile`\n * `customSegments` claim suppresses `UNKNOWN_SEGMENT` for a declared Z-segment).\n * - `\"rebadged\"`, the profile **downgrades** the warning to the value-free `PROFILE_QUIRK_APPLIED`\n * marker with `expected: true` (C-CDA `defineCcdaProfile` / ASTM `defineAstmProfile`\n * `profileQuirkApplied`).\n * - `\"bare\"`, no shipped profile tolerates it; the quirk targets a real coded leniency a consumer can\n * tolerate via their own `defineProfile`/`defineAstmProfile`, but no built-in re-badges it.\n */\nexport type QuirkProfileDisposition = \"suppressed\" | \"rebadged\" | \"bare\";\n\n/**\n * The stable, value-free re-badge code the C-CDA and ASTM parsers emit when a profile tolerates a\n * quirk. HL7 v2 has no equivalent (it suppresses instead: see {@link QuirkProfileDisposition}).\n */\nexport const PROFILE_QUIRK_APPLIED = \"PROFILE_QUIRK_APPLIED\";\n\n/**\n * A public, grounded description of one vendor quirk: the metadata that binds a quirk recipe to a real\n * parser warning code and a **publicly-groundable** deviation (cited-public, never a private\n * vendor corpus).\n */\nexport interface QuirkDescriptor {\n /** The quirk recipe name (e.g. `\"unknown-zsegment\"`). Stable; part of the public contract. */\n readonly name: string;\n /** The format this quirk applies to. */\n readonly format: SynthFormat;\n /**\n * The **exact** parser warning code(s) a bare parse (no profile) surfaces for this quirk, the\n * intended-warning contract. A quirk that produces any other code, or none, is a generation bug.\n */\n readonly intendedWarnings: readonly string[];\n /**\n * The **public** grounding for this quirk, the spec clause or the parser's public profile that\n * documents the tolerance. Never a private vendor-attributed corpus.\n */\n readonly grounding: string;\n /** The parser profile that tolerates this quirk (when a built-in public one exists). */\n readonly toleratingProfile?: string;\n /** How {@link toleratingProfile} treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n}\n\n/** One generated quirk artifact: the off-spec wire text plus the contract it is meant to satisfy. */\nexport interface QuirkArtifact {\n /** The format this artifact belongs to. */\n readonly format: SynthFormat;\n /** The quirk recipe applied. */\n readonly quirk: string;\n /** The underlying spec-clean message kind the quirk was injected into (e.g. `\"ORU^R01\"`). */\n readonly kind: string;\n /** The **quirked** wire text (deterministic in the seed + quirk). */\n readonly content: string;\n /** The exact parser warning code(s) this artifact is meant to round-trip to. */\n readonly intendedWarnings: readonly string[];\n}\n\n/** The verdict of a bare parse under the tolerating profile, if any. */\nexport interface QuirkProfiledVerdict {\n /** The profile applied. */\n readonly profileName: string;\n /** How the profile treats the quirk. */\n readonly disposition: QuirkProfileDisposition;\n /** The warning codes the parser emitted with the profile active. */\n readonly warnings: readonly string[];\n /**\n * `true` iff the profile handled the quirk as its disposition declares: `\"suppressed\"` ⇒ the intended\n * code is gone; `\"rebadged\"` ⇒ the intended code is gone and `PROFILE_QUIRK_APPLIED` is present.\n */\n readonly tolerated: boolean;\n}\n\n/** The verdict of round-tripping a quirk artifact through its parser. */\nexport interface QuirkRoundTripResult {\n /** The quirked wire text that was parsed. */\n readonly content: string;\n /** The warning codes a **bare** parse (no profile) emitted. */\n readonly warnings: readonly string[];\n /** The exact code(s) the quirk is meant to produce. */\n readonly intendedWarnings: readonly string[];\n /**\n * `true` iff the bare parse produced **exactly** the intended code(s), the intended-warning contract.\n */\n readonly intendedWarningHeld: boolean;\n /** The verdict under the tolerating profile, when a built-in public one exists. */\n readonly withProfile?: QuirkProfiledVerdict;\n}\n\n/**\n * Exact multiset (order-independent) equality of two code lists: the intended-warning comparison.\n *\n * @param a - The first code list.\n * @param b - The second code list.\n * @returns `true` iff the two lists contain the same codes with the same multiplicities.\n * @example\n * ```ts\n * import { sameCodeSet } from \"@cosyte/synth\";\n * sameCodeSet([\"A\", \"B\"], [\"B\", \"A\"]); // true\n * ```\n */\nexport function sameCodeSet(a: readonly string[], b: readonly string[]): boolean {\n if (a.length !== b.length) return false;\n const counts = new Map<string, number>();\n for (const c of a) counts.set(c, (counts.get(c) ?? 0) + 1);\n for (const c of b) {\n const n = counts.get(c);\n if (n === undefined) return false;\n if (n === 1) counts.delete(c);\n else counts.set(c, n - 1);\n }\n return counts.size === 0;\n}\n\n/**\n * Resolve a requested quirk name against a format's registry, or **fail closed**. A quirk the format's\n * profile system does not support is a fatal `SYNTH_UNSUPPORTED_QUIRK`, never a silent no-op and never\n * a fabricated quirk with a made-up warning.\n *\n * The refusal names neither the request nor the registry. `registry`, `format` and `name` are all\n * caller-supplied, and a diagnostic that quotes its input is a diagnostic that can be made to carry\n * anything the caller was holding, which for a fixture generator wired into someone else's pipeline\n * is not a hypothetical. Branch on `err.code`; the supported set is the registry you passed\n * (`HL7_QUIRKS`, `CCDA_QUIRKS`, `ASTM_QUIRKS`), which you can enumerate directly.\n *\n * @param registry - The format's quirk descriptors, keyed by name.\n * @param format - The format being generated.\n * @param name - The requested quirk name.\n * @returns The matching {@link QuirkDescriptor}.\n * @throws SynthError with code `SYNTH_UNSUPPORTED_QUIRK` when `name` is not a supported quirk.\n * @example\n * ```ts\n * import { resolveQuirk } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * resolveQuirk(HL7_QUIRKS, \"hl7v2\", \"unknown-zsegment\").intendedWarnings; // [\"UNKNOWN_SEGMENT\"]\n * ```\n */\nexport function resolveQuirk(\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n name: string,\n): QuirkDescriptor {\n const descriptor = registry[name];\n // `format` is compared, never rendered. A descriptor found under the wrong format's registry is a\n // mislabeled fixture waiting to happen, so the mismatch fails closed on the same code.\n if (descriptor === undefined || descriptor.format !== format) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_UNSUPPORTED_QUIRK);\n }\n return descriptor;\n}\n\n/**\n * Evaluate whether a profiled parse tolerated a quirk as its disposition declares. Shared across the\n * formats so the \"suppressed vs re-badged\" logic lives in exactly one place.\n *\n * @param disposition - The quirk's declared profile disposition.\n * @param intendedWarnings - The bare-parse intended code(s).\n * @param warningsUnderProfile - The code(s) the parser emitted with the profile active.\n * @returns `true` iff the profile handled the quirk correctly for its disposition.\n * @example\n * ```ts\n * import { profileTolerated } from \"@cosyte/synth\";\n * profileTolerated(\"suppressed\", [\"UNKNOWN_SEGMENT\"], []); // true: the profile suppressed it\n * ```\n */\nexport function profileTolerated(\n disposition: QuirkProfileDisposition,\n intendedWarnings: readonly string[],\n warningsUnderProfile: readonly string[],\n): boolean {\n const stillHasIntended = intendedWarnings.some((c) => warningsUnderProfile.includes(c));\n switch (disposition) {\n case \"suppressed\":\n return !stillHasIntended;\n case \"rebadged\":\n return !stillHasIntended && warningsUnderProfile.includes(PROFILE_QUIRK_APPLIED);\n case \"bare\":\n return false;\n }\n}\n\n/**\n * Assert a freshly-generated quirk artifact **actually** round-trips to its intended warning(s), or\n * **fail closed**. This is the generator's self-check on the intended-warning contract: a\n * fixture whose bare parse does not produce exactly the declared code(s) is a *mislabeled* fixture, a\n * golden file that lies about the parser verdict it anchors, and must never be emitted. It is a\n * stronger guard than \"the transform changed some bytes\": a transform can mutate the wrong element (a\n * template a given document type does not key its warning on) and still change bytes while producing no\n * warning. Every format's `generate*Quirk` calls this after transforming, so the contract is enforced at\n * generation time, not merely at round-trip time.\n *\n * It no longer takes the quirk name. That parameter existed for one reason, to be interpolated into\n * the refusal, and a parameter whose only job is to reach a message is the exact shape this package\n * is removing, so it is gone rather than merely unused. The refusal names neither code list either;\n * both are caller-supplied, and the caller reads the comparison back off the arguments it holds.\n *\n * @param intendedWarnings - The declared intended code(s).\n * @param bareWarnings - The code(s) a bare parse of the generated artifact actually produced.\n * @throws SynthError `SYNTH_INTENDED_WARNING_MISMATCH` when the bare parse did not produce exactly\n * the intended code(s).\n * @example\n * ```ts\n * import { assertIntendedWarnings } from \"@cosyte/synth\";\n * assertIntendedWarnings([\"UNKNOWN_SEGMENT\"], [\"UNKNOWN_SEGMENT\"]); // ok\n * ```\n */\nexport function assertIntendedWarnings(\n intendedWarnings: readonly string[],\n bareWarnings: readonly string[],\n): void {\n if (!sameCodeSet(bareWarnings, intendedWarnings)) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_INTENDED_WARNING_MISMATCH);\n }\n}\n\n/**\n * Validate the quirk names carried by a {@link SynthProfile} against a format's registry, failing closed\n * on the first unsupported one. Lets a consumer author a fixture recipe with `defineSynthProfile` and\n * have its quirks checked against the *parser's* real tolerance before any fixture is generated.\n *\n * @param profile - The synth profile whose `quirks` to validate.\n * @param registry - The format's quirk descriptors.\n * @param format - The format being generated.\n * @returns The validated quirk names (the profile's, in order).\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` for the first unsupported quirk.\n * @example\n * ```ts\n * import { validateProfileQuirks, defineSynthProfile } from \"@cosyte/synth\";\n * import { HL7_QUIRKS } from \"@cosyte/synth/hl7\";\n * const p = defineSynthProfile({ name: \"site\", quirks: [\"unknown-zsegment\"] });\n * validateProfileQuirks(p, HL7_QUIRKS, \"hl7v2\"); // [\"unknown-zsegment\"]\n * ```\n */\nexport function validateProfileQuirks(\n profile: SynthProfile,\n registry: Readonly<Record<string, QuirkDescriptor>>,\n format: SynthFormat,\n): readonly string[] {\n for (const name of profile.quirks) resolveQuirk(registry, format, name);\n return profile.quirks;\n}\n","/**\n * C-CDA **vendor-quirk generation**. A quirk deviates the\n * *structure* of an otherwise spec-clean document (built through `@cosyte/ccda`'s `buildCcda`) so it\n * round-trips through `parseCcda` to **exactly** one intended, stable warning code: the tolerance a\n * `defineCcdaProfile` profile encodes. With the matching built-in profile active, that warning is\n * **re-badged** to the value-free `PROFILE_QUIRK_APPLIED` marker (`expected: true`, `toleratedCode` = the\n * original), exactly as the parser's `profileQuirkApplied` does.\n *\n * The deviation is applied **post-serialize**. Three quirks ship, each\n * publicly grounded and re-badged by a built-in public profile:\n *\n * - **`template-extension-absent`** → `TEMPLATE_EXTENSION_ABSENT` (profile `legacyR11`). The R2.1\n * `@extension=\"2015-08-01\"` version stamp is dropped from the document-type templateId: a legacy\n * R1.1-era document shape.\n * - **`deprecated-loinc`** → `DEPRECATED_LOINC` (profile `smartScorecard`). A result/vital observation\n * LOINC code is swapped to a known-deprecated LOINC (`41909-3`).\n * - **`deprecated-code-system`** → `DEPRECATED_CODE_SYSTEM` (profile `smartScorecard`). A problem\n * observation's value is swapped to a deprecated code system (ICD-9-CM `2.16.840.1.113883.6.103`).\n *\n * A quirk **never** introduces a real-looking value: it changes a template stamp or a code, never a PHI\n * locus, so the synthetic-safety gate still runs and stays zero.\n *\n * @module\n */\n\nimport { parseCcda, serializeCcda, ccdaProfiles, type CcdaProfile } from \"@cosyte/ccda\";\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\nimport { defineSynthProfile, type SynthProfile } from \"../profile.js\";\nimport { SYNTH_FATAL_CODES, SynthError } from \"../codes.js\";\nimport {\n resolveQuirk,\n sameCodeSet,\n profileTolerated,\n validateProfileQuirks,\n assertIntendedWarnings,\n type QuirkDescriptor,\n type QuirkArtifact,\n type QuirkRoundTripResult,\n} from \"../quirk.js\";\n\nimport { generateCcda, type CcdaDocumentType } from \"./ccd.js\";\n\n/** Every C-CDA quirk this package ships. */\nexport type CcdaQuirkName =\n | \"template-extension-absent\"\n | \"deprecated-loinc\"\n | \"deprecated-code-system\";\n\n/** The C-CDA quirk registry: each recipe bound to the exact `@cosyte/ccda` warning code it targets. */\nexport const CCDA_QUIRKS: Readonly<Record<CcdaQuirkName, QuirkDescriptor>> = Object.freeze({\n \"template-extension-absent\": Object.freeze({\n name: \"template-extension-absent\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"TEMPLATE_EXTENSION_ABSENT\"]),\n grounding:\n \"ONC 2015 Edition §170.315(b)(1) + HL7/C-CDA-Examples (CC0): legacy R1.1-era documents omit the \" +\n \"R2.1 @extension=2015-08-01 version stamp. Re-badged by @cosyte/ccda's public `legacyR11` profile.\",\n toleratingProfile: \"legacyR11\",\n disposition: \"rebadged\",\n }),\n \"deprecated-loinc\": Object.freeze({\n name: \"deprecated-loinc\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"DEPRECATED_LOINC\"]),\n grounding:\n \"SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: real documents carry deprecated LOINC codes \" +\n \"(e.g. 41909-3). Re-badged by @cosyte/ccda's public `smartScorecard` profile.\",\n toleratingProfile: \"smartScorecard\",\n disposition: \"rebadged\",\n }),\n \"deprecated-code-system\": Object.freeze({\n name: \"deprecated-code-system\",\n format: \"ccda\",\n intendedWarnings: Object.freeze([\"DEPRECATED_CODE_SYSTEM\"]),\n grounding:\n \"SMART C-CDA Scorecard + D'Amore et al., JAMIA 2014: legacy problem lists code diagnoses in \" +\n \"ICD-9-CM (2.16.840.1.113883.6.103). Re-badged by @cosyte/ccda's public `smartScorecard` profile.\",\n toleratingProfile: \"smartScorecard\",\n disposition: \"rebadged\",\n }),\n});\n\n/** The tolerating C-CDA profile object for a quirk. */\nfunction toleratingProfile(quirk: CcdaQuirkName): CcdaProfile {\n return quirk === \"template-extension-absent\"\n ? ccdaProfiles.legacyR11\n : ccdaProfiles.smartScorecard;\n}\n\n/**\n * The document-type templateId roots whose R2.1 `@extension` stamp the `legacyR11` quirk drops: the\n * US Realm Header (`…22.1.1`) **and** every document-type template `buildCcda` emits: CCD (`…22.1.2`)\n * and Referral Note (`…22.1.14`). The parser keys `TEMPLATE_EXTENSION_ABSENT` on the **document-type**\n * template, so this must cover each generable document type; dropping a root a given document does not\n * carry is a harmless no-op, and the generation-time contract assertion catches any type left uncovered.\n */\nconst DOC_TEMPLATE_ROOTS = [\n \"2.16.840.1.113883.10.20.22.1.1\",\n \"2.16.840.1.113883.10.20.22.1.2\",\n \"2.16.840.1.113883.10.20.22.1.14\",\n] as const;\n\n/**\n * Match the first Result-Observation (template `…22.4.2`) or Vital-Sign-Observation (`…22.4.27`) LOINC\n * `<code>`: its code value is the capture between groups 1 and 2. Structural, so it is seed-robust (it\n * never depends on which example LOINC a given seed drew).\n */\nconst RESULT_OR_VITAL_LOINC =\n /(<templateId root=\"2\\.16\\.840\\.1\\.113883\\.10\\.20\\.22\\.4\\.(?:2|27)\"[^>]*\\/>(?:(?!<templateId)[\\s\\S])*?<code code=\")[^\"]+(\" codeSystem=\"2\\.16\\.840\\.1\\.113883\\.6\\.1\")/;\n\n/** Match the first Problem-Observation (`…22.4.4`) SNOMED CD `<value>`: code + codeSystem are captured. */\nconst PROBLEM_VALUE_SNOMED =\n /(<templateId root=\"2\\.16\\.840\\.1\\.113883\\.10\\.20\\.22\\.4\\.4\"[\\s\\S]*?<value code=\")[^\"]+(\" codeSystem=\")2\\.16\\.840\\.1\\.113883\\.6\\.96(\"[^>]*xsi:type=\"CD\"\\/>)/;\n\n/** A known-deprecated LOINC (BMI, superseded by 39156-5): the `deprecated-loinc` target. */\nconst DEPRECATED_LOINC_CODE = \"41909-3\";\n\n/** The post-serialize XML transform for each quirk: a pure, deterministic function of the clean XML. */\nfunction applyQuirk(quirk: CcdaQuirkName, xml: string): string {\n switch (quirk) {\n case \"template-extension-absent\": {\n let out = xml;\n for (const root of DOC_TEMPLATE_ROOTS) {\n out = out.replace(\n `<templateId root=\"${root}\" extension=\"2015-08-01\"/>`,\n `<templateId root=\"${root}\"/>`,\n );\n }\n return out;\n }\n case \"deprecated-loinc\":\n return xml.replace(RESULT_OR_VITAL_LOINC, `$1${DEPRECATED_LOINC_CODE}$2`);\n case \"deprecated-code-system\":\n // ICD-9-CM hypertension (401.9) under the deprecated ICD-9-CM diagnosis code system.\n return xml.replace(PROBLEM_VALUE_SNOMED, `$1401.9$22.16.840.1.113883.6.103$3`);\n }\n}\n\n/**\n * Apply a C-CDA quirk transform to a spec-clean document, or **fail closed**. Refuses to return a\n * document that does not carry the intended deviation (a quirk whose structural anchor is absent):\n * a fixture that silently lost its quirk would test the wrong thing.\n *\n * @param quirk - The quirk to inject.\n * @param cleanXml - The spec-clean C-CDA XML.\n * @returns The quirked XML.\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` when `quirk` is not a supported C-CDA quirk.\n * @throws SynthError `SYNTH_QUIRK_ANCHOR_ABSENT` when the quirk found no structural anchor to mutate.\n * @example\n * ```ts\n * import { injectCcdaQuirk } from \"@cosyte/synth/ccda\";\n * injectCcdaQuirk(\"template-extension-absent\", cleanXml);\n * ```\n */\nexport function injectCcdaQuirk(quirk: CcdaQuirkName, cleanXml: string): string {\n // The union is erased at runtime, so an unrecognised name used to fall out of `applyQuirk`'s switch\n // as `undefined` and be returned as if it were a document. Resolve it against the registry first.\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", quirk);\n const content = applyQuirk(descriptor.name as CcdaQuirkName, cleanXml);\n if (content === cleanXml) {\n throw new SynthError(SYNTH_FATAL_CODES.SYNTH_QUIRK_ANCHOR_ABSENT);\n }\n return content;\n}\n\n/** Options for {@link generateCcdaQuirk}. */\nexport interface GenerateCcdaQuirkOptions {\n /** The seed: the same seed + quirk yields a byte-identical document. Defaults to `0`. */\n readonly seed?: number;\n /** The quirk to inject. Required. */\n readonly quirk: CcdaQuirkName;\n /** The spec-clean base document type. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\n/**\n * Generate one C-CDA **quirk** artifact: a spec-clean document (built through `@cosyte/ccda`'s\n * `buildCcda`) with the requested vendor deviation injected post-serialize. Deterministic in `seed` +\n * `quirk` + `documentType`.\n *\n * @param options - Seed, quirk, and base document type. See {@link GenerateCcdaQuirkOptions}.\n * @returns The {@link QuirkArtifact}: its `content` round-trips to `intendedWarnings` exactly.\n * @throws SynthError `SYNTH_UNSUPPORTED_QUIRK` if `quirk` is not a supported C-CDA quirk.\n * @throws Error if the base document does not contain the structural anchor the quirk targets.\n * @example\n * ```ts\n * import { generateCcdaQuirk, ccdaQuirkRoundTrip } from \"@cosyte/synth/ccda\";\n * const rt = ccdaQuirkRoundTrip(generateCcdaQuirk({ seed: 1, quirk: \"deprecated-loinc\" }));\n * rt.withProfile?.tolerated; // true, `smartScorecard` re-badges DEPRECATED_LOINC\n * ```\n */\nexport function generateCcdaQuirk(options: GenerateCcdaQuirkOptions): QuirkArtifact {\n const seed = options.seed ?? 0;\n const documentType = options.documentType ?? \"ccd\";\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", options.quirk);\n const clean = serializeCcda(generateCcda({ seed, documentType }));\n const content = injectCcdaQuirk(options.quirk, clean);\n // Self-check the intended-warning contract at generation time: never emit a mislabeled fixture (a\n // transform can change bytes on the wrong template and still produce no warning, e.g. a document\n // type whose document-type root is not in DOC_TEMPLATE_ROOTS).\n assertIntendedWarnings(\n descriptor.intendedWarnings,\n parseCcda(content).warnings.map((w) => String(w.code)),\n );\n return Object.freeze({\n format: \"ccda\" as const,\n quirk: descriptor.name,\n kind: documentType,\n content,\n intendedWarnings: descriptor.intendedWarnings,\n });\n}\n\n/**\n * Round-trip a C-CDA quirk artifact through `@cosyte/ccda` and report the intended-warning verdict: a bare\n * parse must produce **exactly** the intended code, and the matching public profile\n * must re-badge it to `PROFILE_QUIRK_APPLIED`.\n *\n * @param artifact - The quirk artifact (from {@link generateCcdaQuirk}).\n * @returns The {@link QuirkRoundTripResult}.\n * @example\n * ```ts\n * import { generateCcdaQuirk, ccdaQuirkRoundTrip } from \"@cosyte/synth/ccda\";\n * ccdaQuirkRoundTrip(generateCcdaQuirk({ seed: 1, quirk: \"deprecated-loinc\" })).intendedWarningHeld;\n * ```\n */\nexport function ccdaQuirkRoundTrip(artifact: QuirkArtifact): QuirkRoundTripResult {\n const quirk = artifact.quirk as CcdaQuirkName;\n const descriptor = resolveQuirk(CCDA_QUIRKS, \"ccda\", quirk);\n const bare = parseCcda(artifact.content).warnings.map((w) => String(w.code));\n const profile = toleratingProfile(quirk);\n const profiledWarnings = parseCcda(artifact.content, { profile }).warnings.map((w) =>\n String(w.code),\n );\n return {\n content: artifact.content,\n warnings: bare,\n intendedWarnings: artifact.intendedWarnings,\n intendedWarningHeld: sameCodeSet(bare, artifact.intendedWarnings),\n withProfile: {\n profileName: descriptor.toleratingProfile ?? profile.name,\n disposition: descriptor.disposition,\n warnings: profiledWarnings,\n tolerated: profileTolerated(\n descriptor.disposition,\n artifact.intendedWarnings,\n profiledWarnings,\n ),\n },\n };\n}\n\n/** Options for {@link ccdaQuirkCorpus}. */\nexport interface CcdaQuirkCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many quirk artifacts to generate. Defaults to the number of quirks. */\n readonly count?: number;\n /** The quirk names to cycle through. Defaults to every C-CDA quirk. Validated; unsupported ⇒ fatal. */\n readonly quirks?: readonly CcdaQuirkName[];\n /** A {@link SynthProfile} whose `quirks` drive the corpus (validated). Takes precedence over `quirks`. */\n readonly profile?: SynthProfile;\n /** The base document type each quirk is injected into. Defaults to `\"ccd\"`. */\n readonly documentType?: CcdaDocumentType;\n}\n\nconst ALL_CCDA_QUIRKS: readonly CcdaQuirkName[] = Object.freeze(\n Object.keys(CCDA_QUIRKS) as CcdaQuirkName[],\n);\n\n/**\n * Build a reproducible {@link Corpus} of C-CDA quirk artifacts. Each artifact's `warnings` record the\n * intended code for its quirk; the manifest lists the applied quirk names.\n *\n * @param options - Seed, count, and the quirk selection. See {@link CcdaQuirkCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ccdaQuirkCorpus } from \"@cosyte/synth/ccda\";\n * ccdaQuirkCorpus({ seed: 42 }).manifest.quirks; // the applied quirk names\n * ```\n */\nexport function ccdaQuirkCorpus(options: CcdaQuirkCorpusOptions): Corpus {\n const quirks: readonly string[] = options.profile\n ? validateProfileQuirks(options.profile, CCDA_QUIRKS, \"ccda\")\n : (options.quirks ?? ALL_CCDA_QUIRKS);\n const names = quirks.length > 0 ? quirks : ALL_CCDA_QUIRKS;\n // Resolve the WHOLE list here, not lazily per generated artifact. `count` can be below\n // `names.length`, and the tail then never reaches this module's own `resolveQuirk`\n // while still landing on `manifest.quirks` verbatim. A manifest that names a quirk the\n // corpus does not contain is the same mislabeled-fixture defect the intended-warning\n // contract exists to prevent, and `manifest.quirks` is a derived identifier.\n for (const name of names) resolveQuirk(CCDA_QUIRKS, \"ccda\", name);\n const documentType = options.documentType ?? \"ccd\";\n const count = options.count ?? names.length;\n const seedStream = createRng(options.seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const quirk = names[i % names.length] as CcdaQuirkName;\n const artifactSeed = seedStream.nextUint32();\n const artifact = generateCcdaQuirk({ seed: artifactSeed, quirk, documentType });\n return {\n format: \"ccda\" as const,\n kind: `${documentType}~${quirk}`,\n content: artifact.content,\n warnings: artifact.intendedWarnings,\n };\n });\n return makeCorpus(options.seed, artifacts, [...new Set(names)]);\n}\n\n/** A ready-made {@link SynthProfile} requesting every built-in C-CDA quirk. */\nexport const ccdaQuirkProfile: SynthProfile = defineSynthProfile({\n name: \"cosyte-ccda-quirks\",\n quirks: [...ALL_CCDA_QUIRKS],\n});\n","/**\n * `@cosyte/synth/ccda`: the C-CDA generation surface, exposed as its own subpath so importing the\n * package root does **not** pull `@cosyte/ccda`. This is the **lazy, per-format** boundary: a consumer\n * who only needs C-CDA fixtures imports `@cosyte/synth/ccda`; one who needs only the core primitives\n * never loads a parser.\n * `@cosyte/ccda` is an **optional peer dependency**, present only for this subpath.\n *\n * This subpath ships spec-clean C-CDA document generation via `@cosyte/ccda`'s\n * `buildCcda`: a **CCD** (`generateCcd`) and a **Referral Note** (`generateReferralNote`), each built\n * through the parser's own emitter so it round-trips through `parseCcda` with zero warnings, and each\n * drawing every identity value from the synthetic-safety providers.\n *\n * @module\n */\n\nimport { createRng } from \"../rng/rng.js\";\nimport { makeCorpus, type Corpus } from \"../corpus.js\";\n\nimport { generateCcda, type CcdaDocumentType } from \"./ccd.js\";\nimport { roundTrip } from \"./round-trip.js\";\nimport { resolveMix } from \"../select.js\";\n\nexport {\n generateCcda,\n generateCcd,\n generateReferralNote,\n type CcdaDocumentType,\n type GenerateCcdaOptions,\n} from \"./ccd.js\";\nexport { roundTrip, type RoundTripResult } from \"./round-trip.js\";\nexport { ccdaPatientIdentity, type CcdaPatientIdentity } from \"./identity.js\";\nexport {\n toBuildCode,\n quantityFor,\n PROBLEMS,\n ALLERGENS,\n ALLERGY_REACTIONS,\n MEDICATIONS,\n LAB_RESULTS,\n RESULT_PANELS,\n VITAL_SIGNS,\n VACCINES,\n PROCEDURES,\n SMOKING_STATUSES,\n ROUTES,\n} from \"./example-codes.js\";\nexport {\n generateCcdaQuirk,\n injectCcdaQuirk,\n ccdaQuirkRoundTrip,\n ccdaQuirkCorpus,\n ccdaQuirkProfile,\n CCDA_QUIRKS,\n type CcdaQuirkName,\n type GenerateCcdaQuirkOptions,\n type CcdaQuirkCorpusOptions,\n} from \"./quirk.js\";\n\n/** Every C-CDA document kind {@link ccdaCorpus} generates: the `documentType` used as the corpus `kind`. */\nexport type CcdaCorpusKind = CcdaDocumentType;\n\n/** Every kind {@link ccdaCorpus} accepts, and the default mix: one CCD and one Referral Note. */\nconst ALL_KINDS: readonly CcdaCorpusKind[] = Object.freeze([\"ccd\", \"referralNote\"]);\nconst DEFAULT_MIX = ALL_KINDS;\n\n/** Options for {@link ccdaCorpus}. */\nexport interface CcdaCorpusOptions {\n /** The seed for the whole corpus (deterministic). */\n readonly seed: number;\n /** How many documents to generate. Defaults to `1`. */\n readonly count?: number;\n /** The document types to cycle through. Defaults to one CCD + one Referral Note. */\n readonly mix?: readonly CcdaCorpusKind[];\n}\n\n/**\n * Build a reproducible {@link Corpus} of spec-clean C-CDA documents. Each document is generated from a\n * distinct sub-seed derived from the corpus seed (so the set is deterministic) and round-tripped through\n * `@cosyte/ccda`; the per-artifact `warnings` record the parser's verdict (empty ⇒ spec-clean).\n *\n * @param options - Seed, count, and the document mix. See {@link CcdaCorpusOptions}.\n * @returns A deep-frozen {@link Corpus}.\n * @example\n * ```ts\n * import { ccdaCorpus } from \"@cosyte/synth/ccda\";\n * const corpus = ccdaCorpus({ seed: 42, count: 4 });\n * corpus.artifacts.every((a) => a.warnings.length === 0); // true, spec-clean\n * ```\n */\nexport function ccdaCorpus(options: CcdaCorpusOptions): Corpus {\n const { seed, count = 1 } = options;\n const mix = resolveMix(ALL_KINDS, options.mix, DEFAULT_MIX);\n const seedStream = createRng(seed);\n const artifacts = Array.from({ length: count }, (_unused, i) => {\n const documentType = mix[i % mix.length] ?? \"ccd\";\n const docSeed = seedStream.nextUint32();\n const rt = roundTrip(generateCcda({ seed: docSeed, documentType }));\n return {\n format: \"ccda\" as const,\n kind: documentType,\n content: rt.content,\n warnings: rt.warnings,\n };\n });\n return makeCorpus(seed, artifacts);\n}\n"]}