@reliantlabs/forge-web-runtime 0.13.3 → 0.13.5
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.
- package/dist/mock-rules.d.ts +61 -0
- package/dist/mock-rules.js +333 -0
- package/dist/mock-rules.js.map +1 -0
- package/dist/mock-transport.d.ts +8 -0
- package/dist/mock-transport.js +47 -15
- package/dist/mock-transport.js.map +1 -1
- package/dist/mock-values.d.ts +132 -0
- package/dist/mock-values.js +1222 -0
- package/dist/mock-values.js.map +1 -0
- package/dist/service-hooks.d.ts +51 -1
- package/dist/service-hooks.js +40 -0
- package/dist/service-hooks.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-values.js","sourceRoot":"","sources":["../src/mock-values.ts"],"names":[],"mappings":"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","sourcesContent":["// Part of @reliantlabs/forge-web-runtime — the web twin of forge/pkg.\n//\n// Default mock responses for ANY Connect service, built from its descriptor.\n//\n// The entity fixtures (mock-transport.ts) serve generated CRUD only: every\n// other RPC — a dashboard read, a search, a stream — used to need a\n// hand-written scenario handler before a mocked page rendered anything at\n// all. This module answers every RPC of every service with a deterministic,\n// schema-valid message, so a scenario writes only what it wants to SAY, not\n// the shape of the whole response:\n//\n// serviceDefaults(Service) every RPC's default handler (the generated\n// src/mocks/services/*_gen.ts call this)\n// mockService(Service, {...}) typed per-RPC overrides for a scenario,\n// each handed the defaults to start from\n// patch(message, {...}) deep-merge a change onto a default\n// mockValue(Schema) one message, for a test or a factory\n//\n// Values are built at RUNTIME from the descriptor, not emitted as literals.\n// protoc-gen-es embeds every file's FileDescriptorProto — options included —\n// in its `_pb.ts`, so the protovalidate rules (min/max, len, pattern, `in`,\n// formats) are read off `field.proto.options` (mock-rules.ts), with no buf.validate\n// TypeScript in the app and no per-project codegen beyond one import per\n// service. A vendored contract (another repo's protos, generated by its own\n// buf template) works the same as the project's own.\n//\n// What a value is, by field (the field's NAME is a hint, never vocabulary —\n// forge does not invent a domain the schema does not declare):\n//\n// `id` / `*_id` a stable id: `<thing>-<8 hex>`; `trace_id` and\n// `span_id` are 32/16 hex, as OpenTelemetry's are\n// Timestamp, `*_at` recent times; list items newest first; within one\n// message, `start*`/`created*` precede `end*`/`updated*`\n// `email`, `url`, ... example.com addresses and links\n// `name`, `title` \"<Message> <n>\", numbered by list position\n// other strings \"<field>-<n>\"\n// numbers a range the name suggests (`*_ms`, `count`, `port`,\n// `percent`, `*_bytes`, ...), else 1..100\n// enums cycle through the defined values (skipping the\n// zero UNSPECIFIED) across a list's items\n// repeated 3–10 items; maps 3–5 entries\n// oneof one member, chosen by the seed\n// Duration, Struct, Value, wrappers handled as their JSON forms suggest\n// `next_page_token` always \"\" — a mock that pages forever is a bug\n//\n// Then the field's protovalidate rules constrain it: `const` and `in` win,\n// numbers are clamped into gt/gte/lt/lte, strings meet len/min_len/max_len,\n// prefix/suffix/contains, the well-known formats (email, uri, uuid, hostname,\n// ip, ulid) and, where it is cheap, `pattern`. Repeated and map sizes honour\n// min_items/max_items and min_pairs/max_pairs. CEL rules are not evaluated.\n//\n// Determinism: every value is a function of (seed, field path). The seed of a\n// default handler is the method plus the request's wire bytes, so the same\n// request always gets the same answer, and a field added to a message does not\n// reshuffle the others. Scalar fields that the REQUEST also carries (by name\n// and type) echo the request — `GetWorkload{id}` answers that id, and a filter\n// field reads back as filtered — except paging and query controls.\nimport {\n create,\n isMessage,\n ScalarType,\n toBinary,\n type DescEnum,\n type DescField,\n type DescMessage,\n type DescMethod,\n type DescService,\n type JsonObject,\n type Message,\n type MessageInitShape,\n type MessageShape,\n} from \"@bufbuild/protobuf\";\nimport {\n rulesOf,\n type FieldRules,\n type NumRules,\n type StrFormat,\n type StrRules,\n} from \"./mock-rules.js\";\n\n// ── Options ─────────────────────────────────────────────────────────────\n\n/** Change how one message type is generated, wherever it appears. */\nexport interface MockFactory<Desc extends DescMessage = DescMessage> {\n readonly schema: Desc;\n readonly build: (ctx: MockFactoryContext<Desc>) => MockResult<Desc>;\n}\n\nexport interface MockFactoryContext<Desc extends DescMessage> {\n /** The default the engine built for this position. */\n readonly base: MessageShape<Desc>;\n /** Position in the enclosing list, or -1 outside one. */\n readonly index: number;\n /** The seed of this position: stable for the same request and path. */\n readonly seed: string;\n}\n\n/**\n * A factory's or handler's answer: a full message passes through; a plain\n * object is a PATCH onto the default (factories) or the full response\n * completed with zero values (handlers), as the engine's F5 contract says.\n */\nexport type MockResult<Desc extends DescMessage> =\n | MessageShape<Desc>\n | MessageInitShape<Desc>;\n\n/**\n * Typed factory helper: `mockFactory(TraceSummarySchema, ({ base, index }) =>\n * ({ rootService: index % 2 ? \"web\" : \"api\" }))` — the result is patched onto\n * the default for every TraceSummary the engine builds.\n */\nexport function mockFactory<Desc extends DescMessage>(\n schema: Desc,\n build: (ctx: MockFactoryContext<Desc>) => MockResult<Desc>,\n): MockFactory<Desc> {\n return { schema, build };\n}\n\nexport interface MockValueOptions {\n /** Seed of the value. Default: the schema's type name. */\n seed?: string;\n /**\n * The instant \"recent\" is measured from. Default: the minute the engine was\n * first used in this page, so values hold still for the session.\n */\n now?: Date | number;\n /** Nesting depth past which messages are left unset and lists empty. Default 6. */\n maxDepth?: number;\n /** Per-message-type overrides, applied wherever that type is built. */\n factories?: readonly MockFactory<DescMessage>[];\n}\n\n// ── Determinism ─────────────────────────────────────────────────────────\n\n/** FNV-1a, 32-bit: small, fast, and stable across engines. */\nfunction fnv1a(input: string | Uint8Array): number {\n let h = 0x811c9dc5;\n if (typeof input === \"string\") {\n for (let i = 0; i < input.length; i++) {\n h ^= input.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n } else {\n for (const b of input) {\n h ^= b;\n h = Math.imul(h, 0x01000193);\n }\n }\n return h >>> 0;\n}\n\n/** mulberry32 over an FNV-1a seed: a deterministic stream per (seed, path). */\nclass Rng {\n private state: number;\n constructor(seed: string) {\n this.state = fnv1a(seed) || 0x9e3779b9;\n }\n next(): number {\n this.state = (this.state + 0x6d2b79f5) | 0;\n let t = this.state;\n t = Math.imul(t ^ (t >>> 15), t | 1);\n t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n }\n /** An integer in [lo, hi], inclusive. */\n int(lo: number, hi: number): number {\n if (hi <= lo) return lo;\n return lo + Math.floor(this.next() * (hi - lo + 1));\n }\n pick<T>(items: readonly T[]): T {\n return items[this.int(0, items.length - 1)] as T;\n }\n hex(n: number): string {\n let out = \"\";\n while (out.length < n) out += this.int(0, 15).toString(16);\n return out;\n }\n}\n\nlet sessionNow: number | undefined;\n\nfunction anchorMs(now: Date | number | undefined): number {\n if (now !== undefined) return typeof now === \"number\" ? now : now.getTime();\n sessionNow ??= Math.floor(Date.now() / 60_000) * 60_000;\n return sessionNow;\n}\n\n// ── Names ───────────────────────────────────────────────────────────────\n\nconst words = (s: string) =>\n s\n .replace(/([a-z0-9])([A-Z])/g, \"$1_$2\")\n .toLowerCase()\n .split(/[^a-z0-9]+/)\n .filter(Boolean);\n\nconst kebab = (s: string) => words(s).join(\"-\");\n\n/** `labels` → `label`, `entries` → `entry`: a list item is one of the list. */\nfunction singularOf(s: string): string {\n if (/ies$/.test(s)) return s.slice(0, -3) + \"y\";\n if (/(ss|us|is)$/.test(s)) return s;\n return s.replace(/s$/, \"\");\n}\n\nfunction human(s: string): string {\n const w = words(s).join(\" \");\n return w.charAt(0).toUpperCase() + w.slice(1);\n}\n\n/** The thing a message stands for: `ListTracesResponse` → `List traces`. */\nfunction messageNoun(desc: DescMessage): string {\n return desc.name.replace(/(Request|Response)$/, \"\") || desc.name;\n}\n\nfunction hasWord(name: string, ...candidates: string[]): boolean {\n const w = words(name);\n return candidates.some((c) => w.includes(c));\n}\n\n// ── Strings ─────────────────────────────────────────────────────────────\n\n/** Paging and query controls: echoing or inventing them misleads the caller. */\nconst CONTROL_FIELDS = new Set([\n \"page_size\",\n \"page_token\",\n \"next_page_token\",\n \"order_by\",\n \"query\",\n \"search\",\n \"filter\",\n \"limit\",\n \"offset\",\n \"cursor\",\n]);\n\nfunction uuidFrom(rng: Rng): string {\n const h = rng.hex(32);\n return `${h.slice(0, 8)}-${h.slice(8, 12)}-4${h.slice(13, 16)}-${\"89ab\"[rng.int(0, 3)]}${h.slice(17, 20)}-${h.slice(20)}`;\n}\n\nfunction formatted(format: StrFormat, rng: Rng, n: number): string {\n switch (format) {\n case \"email\":\n return `user-${n}@example.com`;\n case \"uri\":\n return `https://example.com/${rng.hex(8)}`;\n case \"hostname\":\n case \"address\":\n return `host-${n}.example.com`;\n case \"hostAndPort\":\n return `host-${n}.example.com:8080`;\n case \"ip\":\n case \"ipv4\":\n return `10.${rng.int(0, 255)}.${rng.int(0, 255)}.${rng.int(1, 254)}`;\n case \"ipv6\":\n return `fd00::${rng.hex(4)}`;\n case \"ipPrefix\":\n return `10.${rng.int(0, 255)}.0.0/16`;\n case \"uuid\":\n return uuidFrom(rng);\n case \"tuuid\":\n return rng.hex(32);\n case \"ulid\": {\n const alphabet = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\";\n let s = \"01\";\n while (s.length < 26) s += alphabet[rng.int(0, 31)];\n return s;\n }\n }\n}\n\n/** A string for a field, from its name alone (before any rule applies). */\nfunction stringByName(\n name: string,\n owner: DescMessage,\n n: number,\n rng: Rng,\n listItem = false,\n): string {\n const w = words(name);\n const last = w[w.length - 1] ?? \"\";\n if (\n name === \"next_page_token\" ||\n name === \"page_token\" ||\n name === \"cursor\"\n ) {\n return \"\";\n }\n if (name === \"trace_id\") return rng.hex(32);\n if (name === \"span_id\" || name === \"parent_span_id\") return rng.hex(16);\n if (last === \"uuid\") return uuidFrom(rng);\n if (name === \"id\") return `${kebab(messageNoun(owner))}-${rng.hex(8)}`;\n if (last === \"id\" || last === \"ids\") {\n const thing = w.slice(0, -1).join(\"-\") || \"id\";\n return `${thing}-${rng.hex(8)}`;\n }\n if (last === \"email\" || last === \"emails\") return `user-${n}@example.com`;\n if ([\"url\", \"uri\", \"link\", \"href\", \"endpoint\", \"website\"].includes(last)) {\n return `https://example.com/${w.slice(0, -1).join(\"-\") || \"item\"}/${n}`;\n }\n if ([\"host\", \"hostname\", \"domain\", \"fqdn\"].includes(last)) {\n return `host-${n}.example.com`;\n }\n if (last === \"ip\" || name === \"ip_address\") {\n return `10.0.${rng.int(0, 255)}.${rng.int(1, 254)}`;\n }\n if (last === \"phone\") return `+1-555-01${String(n % 100).padStart(2, \"0\")}`;\n if (last === \"version\") return `1.${rng.int(0, 20)}.${rng.int(0, 9)}`;\n if (last === \"color\" || last === \"colour\") return `#${rng.hex(6)}`;\n if ([\"sha\", \"commit\", \"hash\", \"etag\", \"fingerprint\"].includes(last))\n return rng.hex(40);\n if (last === \"digest\") return `sha256:${rng.hex(64)}`;\n if (\n last === \"token\" ||\n last === \"secret\" ||\n (last === \"key\" && w.includes(\"api\"))\n ) {\n return `tok_${rng.hex(24)}`;\n }\n if (last === \"json\") return \"{}\";\n if (last === \"locale\" || last === \"language\") return \"en-US\";\n if (last === \"currency\") return \"USD\";\n if (last === \"country\") return \"US\";\n if (last === \"timezone\" || name === \"tz\") return \"UTC\";\n if ([\"name\", \"title\", \"label\"].includes(name) || name === \"display_name\") {\n return `${human(messageNoun(owner))} ${n}`;\n }\n if (last === \"name\" || last === \"title\") {\n return `${human(w.slice(0, -1).join(\"_\"))} ${n}`;\n }\n if (\n [\n \"description\",\n \"summary\",\n \"message\",\n \"body\",\n \"text\",\n \"details\",\n \"detail\",\n \"reason\",\n \"comment\",\n \"note\",\n \"notes\",\n \"content\",\n \"error\",\n ].includes(last)\n ) {\n return `Sample ${human(messageNoun(owner)).toLowerCase()} ${w.join(\" \")} ${n}.`;\n }\n return `${kebab(listItem ? singularOf(name) : name)}-${n}`;\n}\n\n/** The smallest string matching a cheap regex, or undefined when it is not cheap. */\nfunction fromPattern(pattern: string, rng: Rng): string | undefined {\n let i = 0;\n const src = pattern;\n\n type Node = () => string;\n\n const charClass = (): Node => {\n // At \"[\" — collect ranges; a negated class picks the first printable miss.\n i++;\n const negate = src[i] === \"^\";\n if (negate) i++;\n const ranges: Array<[number, number]> = [];\n let first = true;\n while (i < src.length && (src[i] !== \"]\" || first)) {\n first = false;\n let c = src[i++] as string;\n if (c === \"\\\\\") {\n const e = src[i++] as string;\n if (e === \"d\") {\n ranges.push([48, 57]);\n continue;\n }\n if (e === \"w\") {\n ranges.push([97, 122], [65, 90], [48, 57], [95, 95]);\n continue;\n }\n if (e === \"s\") {\n ranges.push([32, 32]);\n continue;\n }\n c = e;\n }\n if (src[i] === \"-\" && src[i + 1] !== \"]\" && i + 1 < src.length) {\n i++;\n let hi = src[i++] as string;\n if (hi === \"\\\\\") hi = src[i++] as string;\n ranges.push([c.charCodeAt(0), hi.charCodeAt(0)]);\n } else {\n ranges.push([c.charCodeAt(0), c.charCodeAt(0)]);\n }\n }\n i++; // \"]\"\n if (negate) {\n return () => {\n for (let code = 97; code < 127; code++) {\n if (!ranges.some(([lo, hi]) => code >= lo && code <= hi)) {\n return String.fromCharCode(code);\n }\n }\n return \"_\";\n };\n }\n return () => {\n const [lo, hi] = rng.pick(ranges);\n return String.fromCharCode(rng.int(lo, hi));\n };\n };\n\n const atom = (): Node | undefined => {\n const c = src[i];\n if (c === \"(\") {\n i++;\n if (src[i] === \"?\") {\n if (src[i + 1] !== \":\") return undefined; // lookarounds: not cheap\n i += 2;\n }\n const inner = alternation();\n if (src[i] !== \")\" || !inner) return undefined;\n i++;\n return inner;\n }\n if (c === \"[\") return charClass();\n if (c === \".\") {\n i++;\n return () => String.fromCharCode(rng.int(97, 122));\n }\n if (c === \"\\\\\") {\n const e = src[i + 1] as string;\n i += 2;\n if (e === \"d\") return () => String(rng.int(0, 9));\n if (e === \"w\") return () => String.fromCharCode(rng.int(97, 122));\n if (e === \"s\") return () => \" \";\n if (/[A-Za-z]/.test(e)) return undefined; // \\b, \\p{..}, ...: not cheap\n return () => e;\n }\n i++;\n return () => c as string;\n };\n\n const sequence = (): Node | undefined => {\n const parts: Node[] = [];\n while (i < src.length && src[i] !== \"|\" && src[i] !== \")\") {\n if (src[i] === \"^\" || src[i] === \"$\") {\n i++;\n continue;\n }\n const a = atom();\n if (!a) return undefined;\n let min = 1;\n let max = 1;\n const q = src[i];\n if (q === \"?\" || q === \"*\" || q === \"+\") {\n i++;\n min = q === \"+\" ? 1 : 0;\n max = q === \"?\" ? 1 : min + 3;\n } else if (q === \"{\") {\n const m = /^\\{(\\d+)(,(\\d*))?\\}/.exec(src.slice(i));\n if (!m) return undefined;\n i += m[0].length;\n min = Number(m[1]);\n max = m[2] ? (m[3] ? Number(m[3]) : min + 3) : min;\n }\n if (src[i] === \"?\") i++; // lazy: same strings\n const lo = min;\n const hi = Math.min(max, min + 3);\n parts.push(() => {\n let s = \"\";\n const count = rng.int(Math.max(lo, 1), Math.max(hi, 1));\n for (let k = 0; k < (lo === 0 && hi === 0 ? 0 : count); k++) s += a();\n return s;\n });\n }\n return () => parts.map((p) => p()).join(\"\");\n };\n\n const alternation = (): Node | undefined => {\n const branches: Node[] = [];\n for (;;) {\n const s = sequence();\n if (!s) return undefined;\n branches.push(s);\n if (src[i] !== \"|\") break;\n i++;\n }\n return () => rng.pick(branches)();\n };\n\n try {\n const re = new RegExp(pattern, \"u\");\n const node = alternation();\n if (!node || i < src.length) return undefined;\n for (let attempt = 0; attempt < 8; attempt++) {\n const s = node();\n if (re.test(s)) return s;\n }\n } catch {\n // An RE2 construct JavaScript does not accept: not cheap.\n }\n return undefined;\n}\n\nfunction applyStringRules(\n value: string,\n rules: StrRules,\n rng: Rng,\n n: number,\n): string {\n if (rules.const !== undefined) return rules.const;\n if (rules.in?.length) return rng.pick(rules.in);\n let s = value;\n if (rules.format) s = formatted(rules.format, rng, n);\n if (rules.pattern) {\n let ok = false;\n try {\n ok = new RegExp(rules.pattern, \"u\").test(s);\n } catch {\n ok = true; // not JavaScript-parsable: leave the value alone\n }\n if (!ok) s = fromPattern(rules.pattern, rng) ?? s;\n }\n if (rules.prefix && !s.startsWith(rules.prefix)) s = rules.prefix + s;\n if (rules.suffix && !s.endsWith(rules.suffix)) s = s + rules.suffix;\n if (rules.contains && !s.includes(rules.contains)) s = s + rules.contains;\n if (rules.notIn?.includes(s)) s = `${s}-${n}`;\n const min = rules.len ?? rules.minLen;\n const max = rules.len ?? rules.maxLen;\n const chars = [...s];\n if (max !== undefined && chars.length > max) {\n s = chars.slice(0, max).join(\"\");\n } else if (min !== undefined && chars.length < min) {\n s = s + \"x\".repeat(min - chars.length);\n }\n return s;\n}\n\n// ── Numbers ─────────────────────────────────────────────────────────────\n\nconst INT_LIMITS: Partial<Record<ScalarType, [number, number]>> = {\n [ScalarType.INT32]: [-2147483648, 2147483647],\n [ScalarType.SINT32]: [-2147483648, 2147483647],\n [ScalarType.SFIXED32]: [-2147483648, 2147483647],\n [ScalarType.UINT32]: [0, 4294967295],\n [ScalarType.FIXED32]: [0, 4294967295],\n [ScalarType.UINT64]: [0, Number.MAX_SAFE_INTEGER],\n [ScalarType.FIXED64]: [0, Number.MAX_SAFE_INTEGER],\n [ScalarType.INT64]: [-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n [ScalarType.SINT64]: [-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n [ScalarType.SFIXED64]: [-Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER],\n};\n\nconst isFloat = (t: ScalarType) =>\n t === ScalarType.DOUBLE || t === ScalarType.FLOAT;\nconst is64 = (t: ScalarType) =>\n t === ScalarType.INT64 ||\n t === ScalarType.UINT64 ||\n t === ScalarType.SINT64 ||\n t === ScalarType.FIXED64 ||\n t === ScalarType.SFIXED64;\n\n/** Epoch unit a time-valued integer field is in, from its name. */\nfunction epochUnit(name: string): number | undefined {\n const w = words(name);\n const timeish =\n hasWord(name, \"unix\", \"epoch\", \"timestamp\", \"at\") ||\n (w[w.length - 1] === \"time\" && !hasWord(name, \"duration\", \"elapsed\")) ||\n (w.includes(\"time\") &&\n hasWord(name, \"nano\", \"nanos\", \"ns\", \"ms\", \"millis\"));\n if (!timeish || hasWord(name, \"duration\", \"latency\", \"elapsed\", \"took\"))\n return undefined;\n if (hasWord(name, \"nano\", \"nanos\", \"ns\")) return 1e6;\n if (hasWord(name, \"us\", \"micros\")) return 1e3;\n if (hasWord(name, \"ms\", \"millis\")) return 1;\n return 1e-3;\n}\n\n/** The range a number's name suggests: [lo, hi]. */\nfunction numberRange(name: string, float: boolean): [number, number] {\n const durationish = hasWord(\n name,\n \"duration\",\n \"latency\",\n \"elapsed\",\n \"took\",\n \"time\",\n );\n if (durationish || hasWord(name, \"ms\", \"millis\")) {\n if (hasWord(name, \"ns\", \"nanos\", \"nano\")) return [100_000, 2_000_000_000];\n if (hasWord(name, \"us\", \"micros\")) return [100, 2_000_000];\n if (hasWord(name, \"seconds\", \"secs\", \"s\", \"sec\"))\n return float ? [0.01, 5] : [1, 120];\n return [1, 2000];\n }\n if (hasWord(name, \"seconds\", \"secs\")) return [1, 3600];\n if (hasWord(name, \"percent\", \"pct\", \"percentage\")) return [0, 100];\n if (\n hasWord(name, \"ratio\", \"fraction\", \"share\", \"probability\", \"rate\") &&\n float\n )\n return [0, 1];\n if (hasWord(name, \"rate\")) return [0, 100];\n if (hasWord(name, \"bytes\", \"size\") && !hasWord(name, \"page\"))\n return [1024, 104_857_600];\n if (hasWord(name, \"port\")) return [1024, 65535];\n if (hasWord(name, \"year\")) return [2020, 2026];\n if (hasWord(name, \"month\")) return [1, 12];\n if (hasWord(name, \"day\")) return [1, 28];\n if (hasWord(name, \"hour\")) return [0, 23];\n if (hasWord(name, \"minute\", \"second\")) return [0, 59];\n if (hasWord(name, \"lat\", \"latitude\")) return [-90, 90];\n if (hasWord(name, \"lng\", \"lon\", \"longitude\")) return [-180, 180];\n if (\n hasWord(\n name,\n \"version\",\n \"revision\",\n \"generation\",\n \"attempt\",\n \"attempts\",\n \"retry\",\n \"retries\",\n \"priority\",\n \"level\",\n \"rank\",\n )\n ) {\n return [1, 10];\n }\n if (name === \"severity_number\") return [1, 24];\n if (hasWord(name, \"cents\", \"price\", \"amount\", \"cost\"))\n return float ? [1, 1000] : [100, 100_000];\n if (\n hasWord(\n name,\n \"count\",\n \"total\",\n \"num\",\n \"number\",\n \"length\",\n \"requests\",\n \"errors\",\n \"hits\",\n \"calls\",\n \"events\",\n \"items\",\n \"value\",\n )\n ) {\n return [0, 1000];\n }\n return float ? [0, 1000] : [1, 100];\n}\n\n/** Clamp/choose a number by its rules. `step` is 1 for integers. */\nfunction applyNumRules(\n value: number,\n rules: NumRules | undefined,\n rng: Rng,\n float: boolean,\n): number {\n if (!rules) return value;\n if (rules.const !== undefined) return rules.const;\n if (rules.in?.length) return rng.pick(rules.in);\n const eps = float ? 0.01 : 1;\n let lo = -Infinity;\n let hi = Infinity;\n if (rules.gte !== undefined) lo = rules.gte;\n if (rules.gt !== undefined) lo = Math.max(lo, rules.gt + eps);\n if (rules.lte !== undefined) hi = rules.lte;\n if (rules.lt !== undefined) hi = Math.min(hi, rules.lt - eps);\n let v = value;\n // protovalidate allows an exclusive range (gt > lt: outside the band); then\n // either side is valid, and the value already on one side is kept.\n const exclusive = lo > hi;\n if (!exclusive) {\n if (v < lo || v > hi) {\n const width = Number.isFinite(hi - lo) ? hi - lo : 100;\n v =\n lo === -Infinity\n ? hi - rng.next() * Math.min(width, 100)\n : lo + rng.next() * Math.min(width, 100);\n }\n v = Math.min(Math.max(v, lo), hi);\n } else if (v < lo && v > hi) {\n v = lo;\n }\n if (!float) v = Math.round(v);\n if (!float && rules.gt !== undefined && v <= rules.gt) v = rules.gt + 1;\n if (!float && rules.lt !== undefined && v >= rules.lt) v = rules.lt - 1;\n for (let k = 0; rules.notIn?.includes(v) && k < 100; k++) v += eps;\n return v;\n}\n\n/** Two decimals, unless rounding would step outside the rules' bounds. */\nfunction roundWithin(v: number, rules: NumRules | undefined): number {\n if (rules?.const !== undefined || rules?.in?.length) return v;\n const r = Math.round(v * 100) / 100;\n const lo = rules?.gt ?? rules?.gte ?? -Infinity;\n const hi = rules?.lt ?? rules?.lte ?? Infinity;\n const inside = r >= lo && r <= hi && r !== rules?.gt && r !== rules?.lt;\n return inside ? r : v;\n}\n\n// ── The walk ────────────────────────────────────────────────────────────\n\ninterface Ctx {\n seed: string;\n path: string;\n /** Position in the nearest enclosing list, or -1. */\n index: number;\n depth: number;\n maxDepth: number;\n now: number;\n /** Time the current message's own timestamps are anchored at. */\n baseTime: number;\n stack: readonly string[];\n echo: ReadonlyMap<string, Echo>;\n factories: ReadonlyMap<string, MockFactory<DescMessage>>;\n}\n\ninterface Echo {\n value: unknown;\n scalar?: ScalarType;\n enumType?: string;\n}\n\nconst rngAt = (ctx: Ctx, key: string) =>\n new Rng(`${ctx.seed}|${ctx.path}.${key}`);\n\n/** The number list items are labelled with: their position, else a small stable one. */\nconst ordinal = (ctx: Ctx, rng: Rng) =>\n ctx.index >= 0 ? ctx.index + 1 : rng.int(1, 9);\n\n/** Schemas the engine has walked, so `patch` can rebuild a nested message. */\nconst knownSchemas = new Map<string, DescMessage>();\n\nfunction collectEcho(schema: DescMessage, message: Message): Map<string, Echo> {\n const out = new Map<string, Echo>();\n const walk = (\n desc: DescMessage,\n msg: Record<string, unknown>,\n depth: number,\n ) => {\n for (const f of desc.fields) {\n if (f.oneof) continue;\n const v = msg[f.localName];\n if (v == null) continue;\n if (f.fieldKind === \"scalar\") {\n if (f.scalar === ScalarType.BOOL || f.scalar === ScalarType.BYTES)\n continue;\n if (v === \"\" || v === 0 || v === 0n || CONTROL_FIELDS.has(f.name))\n continue;\n if (!out.has(f.name)) out.set(f.name, { value: v, scalar: f.scalar });\n } else if (f.fieldKind === \"enum\") {\n if (v === 0) continue;\n if (!out.has(f.name))\n out.set(f.name, { value: v, enumType: f.enum.typeName });\n } else if (f.fieldKind === \"message\" && depth < 2 && isMessage(v)) {\n walk(f.message, v as unknown as Record<string, unknown>, depth + 1);\n }\n }\n };\n walk(schema, message as unknown as Record<string, unknown>, 0);\n return out;\n}\n\nfunction echoFor(\n ctx: Ctx,\n name: string,\n scalar?: ScalarType,\n enumType?: string,\n): Echo | undefined {\n // A bare `id` is the record's own key: echo it only on the answer's top\n // record, never on list items or nested records (they would all collide).\n if (name === \"id\" && (ctx.index >= 0 || ctx.depth > 1)) return undefined;\n if (CONTROL_FIELDS.has(name)) return undefined;\n const e = ctx.echo.get(name);\n if (!e) return undefined;\n if (scalar !== undefined && e.scalar !== scalar) {\n // Same family is good enough: an int32 filter echoes into an int64 field.\n const fam = (t: ScalarType | undefined) =>\n t === undefined\n ? \"?\"\n : t === ScalarType.STRING\n ? \"s\"\n : isFloat(t)\n ? \"f\"\n : \"i\";\n if (fam(e.scalar) !== fam(scalar)) return undefined;\n }\n if (enumType !== undefined && e.enumType !== enumType) return undefined;\n return e;\n}\n\nfunction scalarValue(\n scalar: ScalarType,\n name: string,\n owner: DescMessage,\n rules: FieldRules | undefined,\n ctx: Ctx,\n longAsString: boolean,\n): unknown {\n const rng = rngAt(ctx, name);\n const n = ordinal(ctx, rng);\n const echo = echoFor(ctx, name, scalar);\n if (echo) return coerceScalar(scalar, echo.value, longAsString);\n\n switch (scalar) {\n case ScalarType.STRING: {\n const s = stringByName(name, owner, n, rng, ctx.index >= 0);\n return rules?.str ? applyStringRules(s, rules.str, rng, n) : s;\n }\n case ScalarType.BOOL: {\n if (rules?.bool !== undefined) return rules.bool;\n const likely = hasWord(\n name,\n \"enabled\",\n \"active\",\n \"healthy\",\n \"success\",\n \"ok\",\n \"valid\",\n \"available\",\n \"ready\",\n \"visible\",\n \"verified\",\n \"public\",\n );\n const rare = hasWord(\n name,\n \"deleted\",\n \"disabled\",\n \"failed\",\n \"error\",\n \"errors\",\n \"truncated\",\n \"partial\",\n \"archived\",\n \"hidden\",\n \"locked\",\n \"null\",\n \"unknown\",\n \"expired\",\n \"revoked\",\n \"blocked\",\n \"provisional\",\n \"only\",\n );\n return rng.next() < (likely ? 0.85 : rare ? 0.15 : 0.5);\n }\n case ScalarType.BYTES: {\n const len = bytesLength(owner, name, rules?.bytes);\n const out = new Uint8Array(len);\n for (let k = 0; k < len; k++) out[k] = rng.int(0, 255);\n return out;\n }\n default: {\n const float = isFloat(scalar);\n const unit = float ? undefined : epochUnit(name);\n let v: number;\n if (unit !== undefined && is64(scalar)) {\n // Epoch values: exact, so they are generated in bigint space.\n const ms = ctx.baseTime - rng.int(0, 30_000);\n const big =\n unit >= 1 ? BigInt(ms) * BigInt(unit) : BigInt(Math.floor(ms / 1000));\n return longAsString ? big.toString() : big;\n } else if (unit !== undefined) {\n v = Math.floor((ctx.baseTime - rng.int(0, 30_000)) / 1000);\n } else {\n const [lo, hi] = numberRange(name, float);\n v = float\n ? Math.round((lo + rng.next() * (hi - lo)) * 100) / 100\n : rng.int(lo, hi);\n }\n v = applyNumRules(v, rules?.num, rng, float);\n if (float) v = roundWithin(v, rules?.num);\n const limits = INT_LIMITS[scalar];\n if (limits) v = Math.min(Math.max(Math.round(v), limits[0]), limits[1]);\n return coerceScalar(scalar, v, longAsString);\n }\n }\n}\n\n/**\n * Length of a generated bytes value: 16 unless the rules say otherwise.\n * Bounds no value can satisfy throw, naming the field, rather than emit a\n * value the server's protovalidate would reject.\n */\nfunction bytesLength(\n owner: DescMessage,\n name: string,\n b: FieldRules[\"bytes\"],\n): number {\n const min = Math.max(b?.len ?? 0, b?.minLen ?? 0);\n const max = Math.min(b?.len ?? Infinity, b?.maxLen ?? Infinity);\n if (min > max)\n throw new Error(\n `mock values: ${owner.typeName}.${name} has bytes rules no value satisfies ` +\n `(len ${b?.len ?? \"-\"}, min_len ${b?.minLen ?? \"-\"}, max_len ${b?.maxLen ?? \"-\"})`,\n );\n return Math.min(Math.max(16, min), max);\n}\n\nfunction coerceScalar(\n scalar: ScalarType,\n v: unknown,\n longAsString: boolean,\n): unknown {\n if (is64(scalar)) {\n const big = typeof v === \"bigint\" ? v : BigInt(Math.round(Number(v)));\n return longAsString ? big.toString() : big;\n }\n if (scalar === ScalarType.STRING) return String(v);\n if (typeof v === \"bigint\") return Number(v);\n return v;\n}\n\nfunction enumValue(\n e: DescEnum,\n name: string,\n rules: FieldRules | undefined,\n ctx: Ctx,\n): number {\n const echo = echoFor(ctx, name, undefined, e.typeName);\n if (echo) return echo.value as number;\n const r = rules?.enm;\n if (r?.const !== undefined) return r.const;\n let values = e.values.map((v) => v.number);\n // Skip the proto3 zero (\"UNSPECIFIED\") when anything else is defined.\n if (values.length > 1) values = values.filter((v) => v !== 0);\n if (r?.in?.length) values = values.filter((v) => r.in!.includes(v));\n if (r?.notIn?.length) values = values.filter((v) => !r.notIn!.includes(v));\n if (values.length === 0) return r?.in?.[0] ?? e.values[0]?.number ?? 0;\n // Cycle across a list: item i takes value (offset + i), so a list of n\n // items shows every value once before any repeats.\n const offset = new Rng(\n `${ctx.seed}|${ctx.path.replace(/\\[\\d+\\]/g, \"\")}.${name}`,\n ).int(0, values.length - 1);\n const i = ctx.index >= 0 ? ctx.index : 0;\n return values[(offset + i) % values.length] as number;\n}\n\n/** Recent instant for a Timestamp field, respecting start/end order and rules. */\nfunction timestampMs(\n name: string,\n rules: FieldRules | undefined,\n ctx: Ctx,\n): number {\n const rng = rngAt(ctx, name);\n let ms: number;\n if (\n hasWord(\n name,\n \"end\",\n \"ended\",\n \"finish\",\n \"finished\",\n \"completed\",\n \"updated\",\n \"last\",\n \"stop\",\n \"stopped\",\n \"until\",\n \"to\",\n \"modified\",\n \"resolved\",\n \"closed\",\n )\n ) {\n ms = ctx.baseTime;\n } else if (\n hasWord(\n name,\n \"start\",\n \"started\",\n \"created\",\n \"first\",\n \"since\",\n \"from\",\n \"begin\",\n \"opened\",\n \"submitted\",\n )\n ) {\n ms = ctx.baseTime - rng.int(1_000, 120_000);\n } else if (\n hasWord(\n name,\n \"expires\",\n \"expiry\",\n \"expiration\",\n \"deadline\",\n \"due\",\n \"next\",\n \"scheduled\",\n )\n ) {\n ms = ctx.now + rng.int(3_600_000, 7 * 86_400_000);\n } else {\n ms = ctx.baseTime - rng.int(0, 30_000);\n }\n const t = rules?.timestamp;\n if (t) {\n if (t.const !== undefined) return t.const;\n if (t.gtNow) ms = Math.max(ms, ctx.now + rng.int(60_000, 86_400_000));\n if (t.ltNow) ms = Math.min(ms, ctx.now - 1_000);\n if (t.withinMs !== undefined)\n ms = Math.min(\n Math.max(ms, ctx.now - t.withinMs + 1_000),\n ctx.now + t.withinMs - 1_000,\n );\n ms = applyNumRules(ms, t, rng, false);\n }\n return ms;\n}\n\nfunction timestampInit(ms: number) {\n const seconds = Math.floor(ms / 1000);\n return { seconds: BigInt(seconds), nanos: (ms - seconds * 1000) * 1_000_000 };\n}\n\nfunction durationInit(name: string, rules: FieldRules | undefined, ctx: Ctx) {\n const rng = rngAt(ctx, name);\n let seconds = hasWord(\n name,\n \"timeout\",\n \"ttl\",\n \"interval\",\n \"period\",\n \"window\",\n \"retention\",\n \"expiry\",\n \"max\",\n \"age\",\n )\n ? rng.int(30, 3600)\n : Math.round((0.005 + rng.next() * 5) * 1000) / 1000;\n seconds = applyNumRules(seconds, rules?.duration, rng, true);\n const ms = Math.round(seconds * 1000) / 1000;\n const d = rules?.duration;\n if (\n (d?.gt === undefined || ms > d.gt) &&\n (d?.gte === undefined || ms >= d.gte) &&\n (d?.lt === undefined || ms < d.lt) &&\n (d?.lte === undefined || ms <= d.lte)\n ) {\n seconds = ms;\n }\n const whole = Math.floor(seconds);\n return { seconds: BigInt(whole), nanos: Math.round((seconds - whole) * 1e9) };\n}\n\nfunction jsonObject(name: string, ctx: Ctx): JsonObject {\n const rng = rngAt(ctx, name);\n const out: JsonObject = {};\n const stem = kebab(name).replace(/s$/, \"\") || \"key\";\n const count = rng.int(2, 4);\n for (let k = 1; k <= count; k++) out[`${stem}-${k}`] = `value-${k}`;\n return out;\n}\n\nconst WKT_TIMESTAMP = \"google.protobuf.Timestamp\";\nconst WKT_DURATION = \"google.protobuf.Duration\";\nconst WKT_STRUCT = \"google.protobuf.Struct\";\nconst WKT_VALUE = \"google.protobuf.Value\";\nconst WKT_LIST_VALUE = \"google.protobuf.ListValue\";\nconst WRAPPERS = new Set([\n \"google.protobuf.DoubleValue\",\n \"google.protobuf.FloatValue\",\n \"google.protobuf.Int64Value\",\n \"google.protobuf.UInt64Value\",\n \"google.protobuf.Int32Value\",\n \"google.protobuf.UInt32Value\",\n \"google.protobuf.BoolValue\",\n \"google.protobuf.StringValue\",\n \"google.protobuf.BytesValue\",\n]);\nconst LEAVE_UNSET = new Set([\n \"google.protobuf.Any\",\n \"google.protobuf.FieldMask\",\n \"google.protobuf.Empty\",\n]);\n\n/**\n * The init value for one message-typed position. `unboxed` is true where\n * protobuf-es represents a wrapper as its primitive and a Struct as a\n * JsonObject (a singular field outside a oneof; Struct in lists too).\n */\nfunction messageAt(\n msg: DescMessage,\n name: string,\n owner: DescMessage,\n rules: FieldRules | undefined,\n ctx: Ctx,\n unboxed: boolean,\n): unknown {\n switch (msg.typeName) {\n case WKT_TIMESTAMP:\n return timestampInit(timestampMs(name, rules, ctx));\n case WKT_DURATION:\n return durationInit(name, rules, ctx);\n case WKT_STRUCT:\n return unboxed ? jsonObject(name, ctx) : undefined;\n case WKT_VALUE:\n return {\n kind: {\n case: \"stringValue\",\n value: `${kebab(name)}-${ordinal(ctx, rngAt(ctx, name))}`,\n },\n };\n case WKT_LIST_VALUE:\n return {\n values: [1, 2, 3].map((k) => ({\n kind: { case: \"stringValue\", value: `${kebab(name)}-${k}` },\n })),\n };\n }\n if (WRAPPERS.has(msg.typeName)) {\n const inner = msg.fields[0];\n if (!inner || inner.fieldKind !== \"scalar\") return undefined;\n const v = scalarValue(\n inner.scalar,\n name,\n owner,\n rules,\n ctx,\n inner.longAsString,\n );\n return unboxed ? v : { value: v };\n }\n if (LEAVE_UNSET.has(msg.typeName)) return undefined;\n // Depth and recursion guards: a self-referencing type nests once.\n if (ctx.depth >= ctx.maxDepth) return undefined;\n if (ctx.stack.filter((t) => t === msg.typeName).length >= 2) return undefined;\n return buildMessage(msg, ctx);\n}\n\nfunction singular(\n field: DescField,\n owner: DescMessage,\n rules: FieldRules | undefined,\n ctx: Ctx,\n index: number,\n unboxed: boolean,\n): unknown {\n // A list item or map value is generated at its own path, so items differ.\n const at: Ctx =\n index >= 0 ? { ...ctx, index, path: `${ctx.path}[${index}]` } : ctx;\n const f = field as {\n scalar?: ScalarType;\n enum?: DescEnum;\n message?: DescMessage;\n longAsString?: boolean;\n };\n const kind =\n field.fieldKind === \"list\"\n ? field.listKind\n : field.fieldKind === \"map\"\n ? field.mapKind\n : field.fieldKind;\n switch (kind) {\n case \"scalar\":\n return scalarValue(\n f.scalar as ScalarType,\n field.name,\n owner,\n rules,\n at,\n f.longAsString ?? false,\n );\n case \"enum\":\n return enumValue(f.enum as DescEnum, field.name, rules, at);\n default: {\n const msg = f.message as DescMessage;\n const c: Ctx = {\n ...at,\n path: `${at.path}.${field.name}`,\n depth: ctx.depth + 1,\n stack: [...ctx.stack, msg.typeName],\n };\n return messageAt(msg, field.name, owner, rules, c, unboxed);\n }\n }\n}\n\nfunction listCount(\n rules: FieldRules | undefined,\n ctx: Ctx,\n name: string,\n fallbackMax: number,\n): number {\n const rng = rngAt(ctx, `${name}#count`);\n const r = rules?.repeated;\n const min = r?.minItems ?? 0;\n const max = r?.maxItems ?? Infinity;\n // Past half the depth budget lists shrink to their minimum, so a deep tree\n // of repeated messages stays a few hundred values rather than thousands.\n if (ctx.depth * 2 > ctx.maxDepth) return min;\n const n = rng.int(3, fallbackMax);\n return Math.max(min, Math.min(max, n));\n}\n\nfunction buildMessage(desc: DescMessage, ctx: Ctx): MessageShape<DescMessage> {\n knownSchemas.set(desc.typeName, desc);\n const rng = rngAt(ctx, \"#time\");\n // Newest first across a list: item i sits ~i·4 minutes before the anchor.\n const baseTime =\n ctx.index >= 0\n ? ctx.now - ctx.index * 240_000 - rng.int(0, 120_000)\n : ctx.now - rng.int(0, 3_600_000);\n const here: Ctx = { ...ctx, baseTime };\n const init: Record<string, unknown> = {};\n\n for (const member of desc.members) {\n if (member.kind === \"oneof\") {\n const fields = member.fields;\n if (fields.length === 0) continue;\n const pick = fields[\n rngAt(here, `${member.name}#case`).int(0, fields.length - 1)\n ] as DescField;\n const value = singular(pick, desc, rulesOf(pick), here, -1, false);\n if (value !== undefined)\n init[member.localName] = { case: pick.localName, value };\n continue;\n }\n const field = member;\n const rules = rulesOf(field);\n if (field.fieldKind === \"list\") {\n const count = listCount(rules, here, field.name, 10);\n const itemRules = rules?.repeated?.items;\n const items: unknown[] = [];\n for (let i = 0; i < count; i++) {\n const v = singular(\n field,\n desc,\n itemRules,\n here,\n i,\n field.listKind === \"message\" && field.message.typeName === WKT_STRUCT,\n );\n if (v !== undefined) items.push(v);\n }\n init[field.localName] = items;\n } else if (field.fieldKind === \"map\") {\n const r = rules?.map;\n const mrng = rngAt(here, `${field.name}#pairs`);\n let count = mrng.int(3, 5);\n if (here.depth * 2 > here.maxDepth) count = 0;\n count = Math.max(\n r?.minPairs ?? 0,\n Math.min(r?.maxPairs ?? Infinity, count),\n );\n const out: Record<string, unknown> = {};\n const stem = kebab(field.name).replace(/s$/, \"\") || \"key\";\n for (let i = 0; i < count; i++) {\n let key: string;\n if (field.mapKey === ScalarType.STRING) {\n key = `${stem}-${i + 1}`;\n if (r?.keys?.str)\n key = applyStringRules(key, r.keys.str, mrng, i + 1);\n } else if (field.mapKey === ScalarType.BOOL) {\n if (i > 1) break;\n key = String(i === 0);\n } else {\n key = String(applyNumRules(i + 1, r?.keys?.num, mrng, false));\n }\n const at: Ctx = { ...here, path: `${here.path}.${field.name}{${key}}` };\n const v =\n field.mapKind === \"scalar\" && field.scalar === ScalarType.STRING\n ? applyStringRules(\n `value-${i + 1}`,\n r?.values?.str ?? {},\n rngAt(at, \"value\"),\n i + 1,\n )\n : singular(field, desc, r?.values, at, i, false);\n if (v !== undefined) out[key] = v;\n }\n init[field.localName] = out;\n } else {\n const v = singular(\n field,\n desc,\n rules,\n here,\n -1,\n field.fieldKind === \"message\",\n );\n if (v !== undefined) init[field.localName] = v;\n }\n }\n\n // A count beside the one list it counts reads as that list's length.\n const lists = desc.fields.filter(\n (f) => f.fieldKind === \"list\" && f.listKind === \"message\",\n );\n if (lists.length === 1) {\n const total = desc.fields.find(\n (f) =>\n f.fieldKind === \"scalar\" &&\n [\"total_count\", \"total_size\", \"total\", \"total_items\"].includes(f.name),\n );\n if (total && total.fieldKind === \"scalar\") {\n const len = (init[(lists[0] as DescField).localName] as unknown[]).length;\n init[total.localName] = coerceScalar(\n total.scalar,\n len,\n total.longAsString,\n );\n }\n }\n\n let message = create(desc, init as MessageInitShape<DescMessage>);\n const factory = ctx.factories.get(desc.typeName);\n if (factory) {\n const result = factory.build({\n base: message,\n index: ctx.index,\n seed: `${ctx.seed}|${ctx.path}`,\n });\n message = isMessage(result)\n ? (result as MessageShape<DescMessage>)\n : patch(message, result as PatchShape<Message>);\n }\n return message;\n}\n\n/**\n * One deterministic, schema-valid message of `schema` — see the header for\n * what each field becomes. Same options, same message.\n */\nexport function mockValue<Desc extends DescMessage>(\n schema: Desc,\n options: MockValueOptions = {},\n): MessageShape<Desc> {\n return buildValue(schema, options);\n}\n\n/** mockValue, echoing `echo`'s scalar fields (the default handlers pass the request). */\nfunction buildValue<Desc extends DescMessage>(\n schema: Desc,\n options: MockValueOptions,\n echo?: { schema: DescMessage; message: Message },\n): MessageShape<Desc> {\n const now = anchorMs(options.now);\n const ctx: Ctx = {\n seed: options.seed ?? schema.typeName,\n path: \"\",\n index: -1,\n depth: 0,\n maxDepth: options.maxDepth ?? 6,\n now,\n baseTime: now,\n stack: [schema.typeName],\n echo: echo ? collectEcho(echo.schema, echo.message) : new Map(),\n factories: new Map(\n (options.factories ?? []).map((f) => [f.schema.typeName, f]),\n ),\n };\n return buildMessage(schema, ctx) as MessageShape<Desc>;\n}\n\nfunction knownSchemaOf(message: Message): DescMessage | undefined {\n return knownSchemas.get(message.$typeName);\n}\n\n// ── patch ───────────────────────────────────────────────────────────────\n\ntype PatchValue<V> = V extends Message\n ? PatchShape<V> | V\n : V extends readonly (infer E)[]\n ? E extends Message\n ? readonly (E | PatchShape<E>)[]\n : V\n : V;\n\n/** A deep partial of a message: nested messages merge, lists and maps replace. */\nexport type PatchShape<T extends Message> = {\n [K in Exclude<keyof T, \"$typeName\" | \"$unknown\">]?: PatchValue<T[K]>;\n};\n\nfunction isPlainObject(v: unknown): v is Record<string, unknown> {\n return (\n typeof v === \"object\" &&\n v !== null &&\n !Array.isArray(v) &&\n !(v instanceof Uint8Array) &&\n !isMessage(v)\n );\n}\n\n/**\n * Deep-merge `changes` onto `base` and return a NEW message (base is not\n * mutated). A nested message merges field by field; a list, a map, a oneof\n * and a scalar are replaced. Partial list items are completed with zero\n * values, as `create()` would.\n *\n * const res = defaults.listTraces(req);\n * return patch(res, { traces: res.traces.slice(0, 2), red: { errorRate: 0.5 } });\n */\nexport function patch<T extends Message>(base: T, changes: PatchShape<T>): T {\n const desc = knownSchemaOf(base);\n const merged = mergeInit(\n desc,\n base as unknown as Record<string, unknown>,\n changes as Record<string, unknown>,\n );\n return (desc ? rebuild(desc, merged) : merged) as unknown as T;\n}\n\n/**\n * create() over a merged init. The init still carries the base's $typeName,\n * and create() returns anything that looks like a message untouched — which\n * would leave a partial list item uncompleted — so the marker is dropped.\n */\nfunction rebuild(desc: DescMessage, init: Record<string, unknown>): Message {\n const { $typeName: _drop, ...fields } = init;\n return create(desc, fields as MessageInitShape<DescMessage>);\n}\n\nfunction mergeInit(\n desc: DescMessage | undefined,\n base: Record<string, unknown>,\n changes: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...base };\n for (const [key, value] of Object.entries(changes)) {\n if (value === undefined) continue;\n const field = desc?.fields.find((f) => f.localName === key);\n const current = base[key];\n if (\n isPlainObject(value) &&\n isMessage(current) &&\n (!field || (field.fieldKind === \"message\" && !field.oneof))\n ) {\n const nested =\n field?.fieldKind === \"message\" ? field.message : knownSchemaOf(current);\n const m = mergeInit(\n nested,\n current as unknown as Record<string, unknown>,\n value,\n );\n out[key] = nested ? rebuild(nested, m) : m;\n } else {\n out[key] = value;\n }\n }\n return out;\n}\n\n// ── Services ────────────────────────────────────────────────────────────\n\ntype MethodsOf<S extends DescService> = S[\"method\"];\ntype InputOf<M> = M extends { input: infer I extends DescMessage }\n ? I\n : DescMessage;\ntype OutputOf<M> = M extends { output: infer O extends DescMessage }\n ? O\n : DescMessage;\ntype Streams<M> = M extends {\n methodKind: \"server_streaming\" | \"bidi_streaming\";\n}\n ? true\n : false;\n\n/** A request as a default handler accepts it: the message, an init shape, or nothing. */\nexport type MockRequest<M> =\n | MessageShape<InputOf<M>>\n | MessageInitShape<InputOf<M>>;\n\n/** One RPC's default: a response, or — for a server or bidi stream — a short stream of them. */\nexport type DefaultHandler<M> =\n Streams<M> extends true\n ? (\n req?: MockRequest<M> | readonly MockRequest<M>[],\n ) => MessageShape<OutputOf<M>>[]\n : (\n req?: MockRequest<M> | readonly MockRequest<M>[],\n ) => MessageShape<OutputOf<M>>;\n\n/**\n * Every RPC of a service, answered from its descriptor. `$service` names the\n * service (non-enumerable, so the object spreads as its handlers alone).\n */\nexport type ServiceDefaults<S extends DescService = DescService> = {\n readonly [K in keyof MethodsOf<S>]: DefaultHandler<MethodsOf<S>[K]>;\n} & { readonly $service: S };\n\n/** Messages in a default stream. */\nconst STREAM_LENGTH = 3;\n\nconst defaultsCache = new WeakMap<DescService, ServiceDefaults>();\n\nfunction requestMessage(method: DescMethod, req: unknown): Message {\n return isMessage(req)\n ? req\n : create(method.input, (req ?? {}) as MessageInitShape<DescMessage>);\n}\n\n/** The seed of one call: the method plus the request's wire bytes. */\nfunction callSeed(method: DescMethod, reqs: readonly Message[]): string {\n let digest = \"\";\n for (const r of reqs) {\n try {\n digest += fnv1a(toBinary(method.input, r)).toString(16) + \".\";\n } catch {\n digest += \"?.\";\n }\n }\n return `${method.parent.typeName}/${method.name}:${digest}`;\n}\n\n/**\n * The default handlers of every RPC of `service`: a deterministic,\n * schema-valid response per request (a 3-message stream for server and bidi\n * streams). Generated `src/mocks/services/*_gen.ts` modules export one per\n * service, and the mock transport serves them for any RPC that no scenario,\n * passthrough or entity fixture answered.\n *\n * Without options the result is memoized per service, so every caller shares\n * one object.\n */\nexport function serviceDefaults<S extends DescService>(\n service: S,\n options: Omit<MockValueOptions, \"seed\"> = {},\n): ServiceDefaults<S> {\n const plain =\n options.now === undefined &&\n options.maxDepth === undefined &&\n !options.factories?.length;\n if (plain) {\n const cached = defaultsCache.get(service);\n if (cached) return cached as unknown as ServiceDefaults<S>;\n }\n const out: Record<string, unknown> = {};\n for (const method of service.methods) {\n const streams =\n method.methodKind === \"server_streaming\" ||\n method.methodKind === \"bidi_streaming\";\n out[method.localName] = (req?: unknown) => {\n const reqs = (Array.isArray(req) ? req : [req]).map((r) =>\n requestMessage(method, r),\n );\n const seed = callSeed(method, reqs);\n const last = reqs[reqs.length - 1];\n const echo = last ? { schema: method.input, message: last } : undefined;\n const one = (s: string) =>\n buildValue(method.output, { ...options, seed: s }, echo);\n if (!streams) return one(seed);\n return Array.from({ length: STREAM_LENGTH }, (_, i) =>\n one(`${seed}#${i}`),\n );\n };\n }\n Object.defineProperty(out, \"$service\", { value: service, enumerable: false });\n const defaults = out as unknown as ServiceDefaults<S>;\n if (plain) defaultsCache.set(service, defaults as unknown as ServiceDefaults);\n return defaults;\n}\n\n/**\n * Any service's defaults, as the transport and the generated registry hold\n * them: a list of ServiceDefaults<S> for different S has only `$service` in\n * common (their handlers' request types differ).\n */\nexport interface AnyServiceDefaults {\n readonly $service: DescService;\n}\n\n/** True for what {@link serviceDefaults} returns — how the generated registry finds them. */\nexport function isServiceDefaults(value: unknown): value is AnyServiceDefaults {\n if (typeof value !== \"object\" || value === null) return false;\n const service = (value as { $service?: { kind?: unknown } }).$service;\n return (\n typeof service === \"object\" &&\n service !== null &&\n service.kind === \"service\"\n );\n}\n\ntype Awaitable<T> = T | Promise<T>;\n\n/** One RPC's override: handed the typed request and the service's defaults. */\nexport type MockOverride<S extends DescService, M> =\n Streams<M> extends true\n ? (\n req: MessageShape<InputOf<M>>,\n defaults: ServiceDefaults<S>,\n ) =>\n | Awaitable<Iterable<MockResult<OutputOf<M>>>>\n | AsyncIterable<MockResult<OutputOf<M>>>\n : (\n req: MessageShape<InputOf<M>>,\n defaults: ServiceDefaults<S>,\n ) => Awaitable<MockResult<OutputOf<M>>>;\n\nexport type MockOverrides<S extends DescService> = {\n readonly [K in keyof MethodsOf<S>]?: MockOverride<S, MethodsOf<S>[K]>;\n};\n\n/**\n * Scenario handlers, keyed `${serviceTypeName}/${methodName}` — spread into a\n * scenario's `handlers`, or a test's `mockTransport({...})`. The handlers'\n * request parameter is typed by the override that produced them; the map's\n * own type stays open so it spreads into any handler table.\n */\nexport type MockHandlers = Record<string, (req: any) => any>;\n\n/**\n * Typed overrides for one service, as scenario handlers:\n *\n * handlers: {\n * ...mockService(ObservabilityService, {\n * listTraces: (req, d) => patch(d.listTraces(req), { traces: [] }),\n * }),\n * }\n *\n * Each override receives the typed request and the service's defaults (built\n * with `options.factories` when given). Only overridden RPCs get a handler —\n * the rest fall through to the transport's own defaults — unless factories\n * are given, in which case every RPC is answered with them.\n */\nexport function mockService<S extends DescService>(\n service: S,\n overrides: MockOverrides<S>,\n options: Omit<MockValueOptions, \"seed\"> = {},\n): MockHandlers {\n const defaults = serviceDefaults(service, options);\n const out: MockHandlers = {};\n const everyMethod = (options.factories?.length ?? 0) > 0;\n for (const method of service.methods) {\n const override = (\n overrides as Record<\n string,\n ((req: unknown, d: unknown) => unknown) | undefined\n >\n )[method.localName];\n const fallback = (\n defaults as unknown as Record<string, (req: unknown) => unknown>\n )[method.localName];\n if (!override && !everyMethod) continue;\n out[`${service.typeName}/${method.name}`] = override\n ? (req: unknown) => override(requestMessage(method, req), defaults)\n : (req: unknown) => fallback?.(req);\n }\n return out;\n}\n"]}
|
package/dist/service-hooks.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { type DescMessage, type MessageInitShape } from "@bufbuild/protobuf";
|
|
2
|
-
import { type DataTag, type InfiniteData, type UseInfiniteQueryOptions, type UseInfiniteQueryResult, type UseMutationOptions, type UseMutationResult, type UseQueryOptions, type UseQueryResult } from "@tanstack/react-query";
|
|
2
|
+
import { type DataTag, type InfiniteData, type QueryClient, type UseInfiniteQueryOptions, type UseInfiniteQueryResult, type UseMutationOptions, type UseMutationResult, type UseQueryOptions, type UseQueryResult } from "@tanstack/react-query";
|
|
3
3
|
import type { ConnectClientError } from "./errors.js";
|
|
4
4
|
/**
|
|
5
5
|
* A generated query key. The tuple is [service, entity?, method,
|
|
@@ -263,4 +263,54 @@ export declare function createInfiniteQueryHook<Schema extends DescMessage, Resp
|
|
|
263
263
|
* spread over a default onSuccess would do.
|
|
264
264
|
*/
|
|
265
265
|
export declare function createMutationHook<Schema extends DescMessage, Response>(invalidateKey: ServiceQueryKey, call: (req: MessageInitShape<Schema>) => Promise<Response>): ServiceMutationHook<Schema, Response>;
|
|
266
|
+
/** What a generated imperative write takes beside its request. */
|
|
267
|
+
export interface ServiceMutationCallOptions {
|
|
268
|
+
/** Aborts the RPC. An aborted write rejects and invalidates nothing. */
|
|
269
|
+
signal?: AbortSignal;
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* A generated imperative write:
|
|
273
|
+
* `orderServiceMutations(queryClient).createOrder(req, options?)`. It
|
|
274
|
+
* resolves with the response and rejects with the ConnectClientError the
|
|
275
|
+
* transport throws.
|
|
276
|
+
*/
|
|
277
|
+
export type ServiceMutationCall<Schema extends DescMessage, Response> = (req: MessageInitShape<Schema>, options?: ServiceMutationCallOptions) => Promise<Response>;
|
|
278
|
+
/**
|
|
279
|
+
* One write's definition, before it is bound to a QueryClient — an entry of
|
|
280
|
+
* the table a generated `<service>Mutations` is built from.
|
|
281
|
+
*/
|
|
282
|
+
export type ServiceMutationDefinition<Schema extends DescMessage, Response> = (queryClient: QueryClient) => ServiceMutationCall<Schema, Response>;
|
|
283
|
+
/**
|
|
284
|
+
* createMutationCall builds one write for code outside React — a store, a
|
|
285
|
+
* sync service, an OAuth callback, a stream handler — where
|
|
286
|
+
* createMutationHook's hook cannot run.
|
|
287
|
+
*
|
|
288
|
+
* It is the hook's contract without the hook: call the rpc, and on success
|
|
289
|
+
* invalidate `invalidateKey`, the same scope the generated file hands the
|
|
290
|
+
* rpc's createMutationHook. So a write made here refetches exactly the reads
|
|
291
|
+
* a write made through the hook would, and code outside React never copies a
|
|
292
|
+
* client call and an invalidateQueries that then drift from the hook's.
|
|
293
|
+
*
|
|
294
|
+
* Like the hook, it does not wait for the refetch: the promise settles with
|
|
295
|
+
* the rpc, and the invalidated reads refetch behind it. A failed write
|
|
296
|
+
* invalidates nothing. It does NOT run through React Query's MutationCache,
|
|
297
|
+
* so an app-wide MutationCache onError (the scaffold's error toast) does not
|
|
298
|
+
* see it: the rejection is the caller's to handle, which is what a
|
|
299
|
+
* background caller wants.
|
|
300
|
+
*/
|
|
301
|
+
export declare function createMutationCall<Schema extends DescMessage, Response>(invalidateKey: ServiceQueryKey, call: ServiceCall<Schema, Response>): ServiceMutationDefinition<Schema, Response>;
|
|
302
|
+
/**
|
|
303
|
+
* The writes of one `<service>Mutations(queryClient)`: each definition bound
|
|
304
|
+
* to that client.
|
|
305
|
+
*/
|
|
306
|
+
export type ServiceMutations<Definitions extends Record<string, (queryClient: QueryClient) => unknown>> = {
|
|
307
|
+
[K in keyof Definitions]: ReturnType<Definitions[K]>;
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* createServiceMutations builds a generated `<service>Mutations` from its
|
|
311
|
+
* table of createMutationCall definitions: a function of the QueryClient
|
|
312
|
+
* whose invalidations the writes should reach — the app's, normally the
|
|
313
|
+
* singleton in src/lib/query-client.ts.
|
|
314
|
+
*/
|
|
315
|
+
export declare function createServiceMutations<Definitions extends Record<string, (queryClient: QueryClient) => unknown>>(definitions: Definitions): (queryClient: QueryClient) => ServiceMutations<Definitions>;
|
|
266
316
|
export {};
|
package/dist/service-hooks.js
CHANGED
|
@@ -200,4 +200,44 @@ export function createMutationHook(invalidateKey, call) {
|
|
|
200
200
|
});
|
|
201
201
|
};
|
|
202
202
|
}
|
|
203
|
+
/**
|
|
204
|
+
* createMutationCall builds one write for code outside React — a store, a
|
|
205
|
+
* sync service, an OAuth callback, a stream handler — where
|
|
206
|
+
* createMutationHook's hook cannot run.
|
|
207
|
+
*
|
|
208
|
+
* It is the hook's contract without the hook: call the rpc, and on success
|
|
209
|
+
* invalidate `invalidateKey`, the same scope the generated file hands the
|
|
210
|
+
* rpc's createMutationHook. So a write made here refetches exactly the reads
|
|
211
|
+
* a write made through the hook would, and code outside React never copies a
|
|
212
|
+
* client call and an invalidateQueries that then drift from the hook's.
|
|
213
|
+
*
|
|
214
|
+
* Like the hook, it does not wait for the refetch: the promise settles with
|
|
215
|
+
* the rpc, and the invalidated reads refetch behind it. A failed write
|
|
216
|
+
* invalidates nothing. It does NOT run through React Query's MutationCache,
|
|
217
|
+
* so an app-wide MutationCache onError (the scaffold's error toast) does not
|
|
218
|
+
* see it: the rejection is the caller's to handle, which is what a
|
|
219
|
+
* background caller wants.
|
|
220
|
+
*/
|
|
221
|
+
export function createMutationCall(invalidateKey, call) {
|
|
222
|
+
return (queryClient) => async (req, options) => {
|
|
223
|
+
const response = await call(req, options?.signal);
|
|
224
|
+
void queryClient.invalidateQueries({ queryKey: invalidateKey });
|
|
225
|
+
return response;
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* createServiceMutations builds a generated `<service>Mutations` from its
|
|
230
|
+
* table of createMutationCall definitions: a function of the QueryClient
|
|
231
|
+
* whose invalidations the writes should reach — the app's, normally the
|
|
232
|
+
* singleton in src/lib/query-client.ts.
|
|
233
|
+
*/
|
|
234
|
+
export function createServiceMutations(definitions) {
|
|
235
|
+
return (queryClient) => {
|
|
236
|
+
const bound = {};
|
|
237
|
+
for (const [name, define] of Object.entries(definitions)) {
|
|
238
|
+
bound[name] = define(queryClient);
|
|
239
|
+
}
|
|
240
|
+
return bound;
|
|
241
|
+
};
|
|
242
|
+
}
|
|
203
243
|
//# sourceMappingURL=service-hooks.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service-hooks.js","sourceRoot":"","sources":["../src/service-hooks.ts"],"names":[],"mappings":"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","sourcesContent":["\"use client\";\n\n// Part of @reliantlabs/forge-web-runtime — the web twin of forge/pkg.\n//\n// Every export below is a React hook or builds one, so this module belongs in\n// the CLIENT graph. Without the directive the Next.js App Router compiles it\n// into the SERVER graph, where it binds a SECOND @tanstack/react-query\n// instance and every generated hook throws \"No QueryClient set\" at runtime —\n// invisible to tsc, eslint AND `next build`. published-surface.test.ts asserts\n// the directive survives into dist/. It is NOT applied package-wide: the\n// ./interceptors subpath exists to be importable without React.\n//\n// The React Query wrapper machinery behind forge's generated per-service hook\n// files (`src/hooks/<svc>-service-hooks_gen.ts`).\n//\n// WHAT WAS HERE BEFORE. Each generated file re-emitted the same three things\n// per RPC: a query-key entry, a useQuery or useMutation wrapper, and — for\n// mutations — the entity-scoped invalidateQueries plus the onSuccess\n// composition, with the reasoning for each re-inlined as comments. A\n// five-service project rendered five copies of machinery that differed only in\n// RPC names and message types. This module IS that machinery, written once.\n// The generated file keeps exactly what varies per RPC: the name, the request\n// schema, the response type, query-vs-mutation, and the entity scope.\n//\n// WHY A SUBPATH AND NOT THE BARREL. This module imports @tanstack/react-query.\n// Every browser frontend forge scaffolds depends on it — but the barrel is\n// also what a consumer imports for interceptors and errors alone, and\n// anchoring React Query there would make a non-React consumer resolve a\n// package it never installed. Same reasoning as ./mock-transport and ./otel:\n// an engine with its own dependency footprint gets its own entry point, and\n// React Query is an OPTIONAL peer.\n//\n// WHAT IT DELIBERATELY DOES NOT DO. It does not emit error toasts — they\n// belong to one app-wide chokepoint, a MutationCache onError on the app's\n// QueryClient (a forge scaffold installs it in src/lib/query-client.ts, and\n// pages that render errors inline pass `meta: { silenceErrorToast: true }`);\n// an app without one handles errors at the call site. It never defaults\n// success-side UX either: \"CreateOrder succeeded\" leaks RPC names into the\n// UI, so the toast / redirect / inline confirmation stays the call site's via\n// options.onSuccess.\nimport {\n create,\n toJson,\n type DescMessage,\n type MessageInitShape,\n} from \"@bufbuild/protobuf\";\nimport {\n infiniteQueryOptions,\n queryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type DataTag,\n type InfiniteData,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\n\nimport type { ConnectClientError } from \"./errors.js\";\n\n/**\n * A generated query key. The tuple is [service, entity?, method,\n * protojson(req)] for a method key and [service] / [service, entity] for the\n * broader scopes.\n */\nexport type ServiceQueryKey = readonly unknown[];\n\n/**\n * requestKey projects a request init into protojson for use inside a query\n * key. Two reasons this is not the raw request object:\n *\n * - React Query's default hasher is JSON.stringify, which THROWS on bigint\n * fields (any proto int64) — the raw message crashes the cache.\n * - protojson normalizes representations, so { id: 1 } and { id: \"1\" } land\n * in ONE cache entry instead of silently splitting the cache.\n *\n * Exported because a hand-written hook that wants to share a generated hook's\n * cache entry has to hash its request the identical way.\n */\nexport function requestKey<Schema extends DescMessage>(\n schema: Schema,\n req: MessageInitShape<Schema>,\n): unknown {\n return toJson(schema, create(schema, req));\n}\n\n/**\n * One read's key entry in a generated factory: `orderServiceKeys.getOrder`.\n *\n * Called, it is that request's key, [service, entity?, method,\n * protojson(req)]. Its `.all` is the rpc's scope, [service, entity?,\n * method]: a prefix of every key the rpc caches under — every request, the\n * plain query and the `<method>Infinite` read alike — and of no other rpc's.\n *\n * queryClient.invalidateQueries({ queryKey: orderServiceKeys.listOrders.all })\n * queryClient.setQueriesData({ queryKey: orderServiceKeys.getOrder.all }, patch)\n *\n * It exists so code never names a key's tuple positions. A predicate like\n * `query.queryKey[1] === \"listOrders\"` breaks silently when a\n * `// forge:query-scope` marker inserts the entity at index 1; `.all` is\n * built by the same function that builds the keys, so it moves with them.\n *\n * `.all` is not data-tagged. It names a SET of entries, and for a paged\n * read that set holds two shapes (the response, and the infinite read's\n * `{ pages, pageParams }`), so a `setQueriesData` updater over it must\n * handle both.\n */\nexport type ServiceMethodKey<Schema extends DescMessage> = ((\n req: MessageInitShape<Schema>,\n) => ServiceQueryKey) & {\n /** Every cached request of this rpc: [service, entity?, method]. */\n readonly all: ServiceQueryKey;\n};\n\n/** The three key-scope builders a generated key factory is assembled from. */\nexport interface ServiceKeyBuilders {\n /** Every query on this service: [service]. */\n readonly all: readonly [string];\n /** Every query for one CRUD entity: [service, entity]. Mutations invalidate this. */\n entity(name: string): readonly [string, string];\n /**\n * One query: [service, entity?, method, protojson(req)]. Returns the\n * per-request key FUNCTION, which is what both the query hook and any\n * call-site prefetch/setQueryData use, with the rpc's scope\n * [service, entity?, method] on it as `.all` (ServiceMethodKey).\n */\n query<Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): ServiceMethodKey<Schema>;\n /**\n * One paged read: [service, entity?, method, protojson(req), \"infinite\"],\n * where req is the request WITHOUT its page token — the hook owns the\n * token, so every page of one listing shares one cache entry.\n *\n * It nests under the same scopes as `query`, so an entity or service-wide\n * invalidation refetches it. The \"infinite\" suffix keeps it OFF the plain\n * query's entry for the same request: an infinite query caches\n * `{ pages, pageParams }`, not one response, and a plain hook reading that\n * entry would get the wrong shape.\n */\n infinite<Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): (req: PageRequest<Schema>) => ServiceQueryKey;\n}\n\n/**\n * Omit distributed over a union. MessageInitShape is `Message | init\n * object`, and a plain Omit over a union keeps only the keys both members\n * share — which would silently drop every field from the init side.\n */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\n\n/**\n * The request a generated infinite hook takes: the rpc's request without\n * `pageToken`, which the hook supplies page by page.\n */\nexport type PageRequest<Schema extends DescMessage> = DistributiveOmit<\n MessageInitShape<Schema>,\n \"pageToken\"\n>;\n\n/**\n * The response shape forge's list-pagination convention (AIP-158) gives a\n * paged read: `string next_page_token`, empty on the last page. Optional so\n * an `optional string next_page_token` response satisfies it too.\n */\nexport interface PagedResponse {\n nextPageToken?: string;\n}\n\n/**\n * pageRequestKey is requestKey with the page token dropped, so every page of\n * one listing hashes to one key even when a caller (JS, or a cast) passes a\n * token anyway. It is dropped from the protojson rather than from the init\n * object: a spread Message keeps its $typeName, and create() would hand that\n * token-less copy back as if it were a complete message.\n */\nfunction pageRequestKey<Schema extends DescMessage>(\n schema: Schema,\n req: PageRequest<Schema>,\n): unknown {\n const json = requestKey(schema, req as unknown as MessageInitShape<Schema>);\n if (json === null || typeof json !== \"object\" || Array.isArray(json)) {\n return json;\n }\n const { pageToken: _pageToken, ...rest } = json as Record<string, unknown>;\n return rest;\n}\n\n/**\n * serviceKeys returns the builders for one service's query-key factory.\n *\n * Cache-key semantics are a compatibility contract, not an implementation\n * detail: an existing app's\n * `invalidateQueries({ queryKey: orderServiceKeys.order })` has to keep\n * matching the keys its queries were registered under across a version bump.\n * So the tuple order and contents produced here are fixed, and identical to\n * what forge previously inlined into every generated hook file.\n */\nexport function serviceKeys(service: string): ServiceKeyBuilders {\n // The rpc scope every key below starts with. Both builders derive their\n // keys from it, so `.all` is a prefix of them by construction, not by a\n // second copy of the tuple layout.\n const rpcScope = (method: string, entityScope?: string): ServiceQueryKey =>\n entityScope === undefined\n ? ([service, method] as const)\n : ([service, entityScope, method] as const);\n return {\n all: [service] as const,\n entity: (name: string) => [service, name] as const,\n query: <Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): ServiceMethodKey<Schema> => {\n const all = rpcScope(method, entityScope);\n return Object.assign(\n (req: MessageInitShape<Schema>): ServiceQueryKey => [\n ...all,\n requestKey(schema, req),\n ],\n { all },\n );\n },\n infinite:\n <Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ) =>\n (req: PageRequest<Schema>): ServiceQueryKey => [\n ...rpcScope(method, entityScope),\n pageRequestKey(schema, req),\n \"infinite\",\n ],\n };\n}\n\n/**\n * How a generated file calls one rpc. `signal` is React Query's: a query\n * that is unmounted or superseded (a new key while typing) aborts its\n * request instead of letting it land on a cache entry nobody reads.\n */\nexport type ServiceCall<Schema extends DescMessage, Response> = (\n req: MessageInitShape<Schema>,\n signal?: AbortSignal,\n) => Promise<Response>;\n\n/**\n * The options a generated read takes — its hook (`useGetOrder(req,\n * options?)`) and its query-options builder\n * (`orderServiceQueries.getOrder(req, options?)`) alike: React Query's own,\n * minus the two the read owns, the key and the fetch. Everything else\n * (`select`, `enabled`, `staleTime`, `placeholderData`, …) passes through.\n *\n * TData is what `data` is, exactly as in React Query's own useQuery: the\n * response by default, or whatever `select` returns. A call site mapping the\n * proto response to a view model passes `select: (r) => toView(r)` and gets\n * `data: View` — no useMemo over `data`, and React Query re-runs the mapping\n * only when the response changes (or when `select` itself does, so hoist it\n * or wrap it in useCallback when it is expensive).\n */\nexport type ServiceQueryInput<Response, TData = Response> = Partial<\n Omit<\n UseQueryOptions<Response, ConnectClientError, TData, ServiceQueryKey>,\n \"queryKey\" | \"queryFn\"\n >\n>;\n\n/**\n * What a query-options builder returns: TanStack's `queryOptions(...)`\n * result, so it goes anywhere React Query takes one —\n * `queryClient.fetchQuery`, `ensureQueryData`, `prefetchQuery`,\n * `useQueries({ queries })`, `useQuery`, `useSuspenseQuery`. Its `queryKey`\n * is data-tagged, so `queryClient.getQueryData(opts.queryKey)` and\n * `setQueryData` are typed as the response with no annotation.\n *\n * fetchQuery / ensureQueryData resolve to the RESPONSE, not to `select`'s\n * TData: they return what the cache holds, and `select` is an observer\n * option that only a hook or useQueries applies.\n */\nexport type ServiceQueryOptions<Response, TData = Response> = UseQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey\n> & {\n queryKey: DataTag<ServiceQueryKey, Response, ConnectClientError>;\n};\n\n/**\n * A generated query-options builder: `orderServiceQueries.getOrder(req,\n * options?)`. It is the read's single definition — the generated hook\n * `useGetOrder` is `useQuery` over exactly this — so code outside React (an\n * imperative action, a stream handler, a router loader, a prefetch) shares\n * the hook's cache entry and fetch by construction rather than by copying\n * its key and its client call.\n */\nexport type ServiceQueryOptionsBuilder<Schema extends DescMessage, Response> = <\n TData = Response,\n>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n) => ServiceQueryOptions<Response, TData>;\n\n/**\n * A generated query hook: `useGetOrder(req, options?)` — `useQuery` over the\n * service's query-options builder for the same rpc. TData is inferred from\n * `select` and is a parameter of the HOOK, not of the factory, so every call\n * site picks its own.\n */\nexport type ServiceQueryHook<Schema extends DescMessage, Response> = <\n TData = Response,\n>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n) => UseQueryResult<TData, ConnectClientError>;\n\n/**\n * The options a generated infinite read takes: React Query's own, minus the\n * three the read owns — the key, the fetch, and the first page param.\n * `getNextPageParam` defaults to the response's `nextPageToken` (empty means\n * last page) and may be overridden; everything else (`select`,\n * `placeholderData`, `staleTime`, `enabled`, `maxPages`, …) passes through.\n */\nexport type ServiceInfiniteQueryInput<Response, TData> = Partial<\n Omit<\n UseInfiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\"\n >\n>;\n\n/**\n * What an infinite query-options builder returns: TanStack's\n * `infiniteQueryOptions(...)` result, for `queryClient.fetchInfiniteQuery`,\n * `prefetchInfiniteQuery`, `ensureInfiniteQueryData` and\n * `useInfiniteQuery`. Its key is data-tagged as `InfiniteData<Response,\n * string>`, the `{ pages, pageParams }` the cache holds.\n */\nexport type ServiceInfiniteQueryOptions<\n Response,\n TData = InfiniteData<Response, string>,\n> = UseInfiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n> & {\n queryKey: DataTag<\n ServiceQueryKey,\n InfiniteData<Response, string>,\n ConnectClientError\n >;\n};\n\n/**\n * A generated infinite query-options builder:\n * `orderServiceQueries.listOrdersInfinite(req, options?)`, for a read that\n * follows forge's list-pagination shape. `useListOrdersInfinite` is\n * `useInfiniteQuery` over exactly this.\n */\nexport type ServiceInfiniteQueryOptionsBuilder<\n Schema extends DescMessage,\n Response extends PagedResponse,\n> = <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n) => ServiceInfiniteQueryOptions<Response, TData>;\n\n/**\n * A generated infinite-query hook: `useListOrdersInfinite(req, options?)`,\n * for a read that follows forge's list-pagination shape (`string page_token`\n * on the request, `string next_page_token` on the response).\n *\n * `req` is the first page's request without its token. `data` is React\n * Query's `{ pages, pageParams }` by default; `select` reshapes it, so\n * flattening the pages into one list is\n * `select: (d) => d.pages.flatMap((p) => p.orders)`.\n */\nexport type ServiceInfiniteQueryHook<\n Schema extends DescMessage,\n Response extends PagedResponse,\n> = <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n) => UseInfiniteQueryResult<TData, ConnectClientError>;\n\n/**\n * A generated mutation hook: `useCreateOrder(options?)`.\n *\n * TContext is React Query's fourth type parameter — what `onMutate` returns\n * and `onError` / `onSettled` receive back. It is a parameter of the HOOK,\n * not of the factory, so each call site gets its own: TypeScript infers it\n * from the `onMutate` the caller passes, and an optimistic update reads its\n * rollback off `context` with no cast. Fixing it at the factory (or leaving\n * it out, which pinned it to `unknown`) forced every such call site to\n * narrow `unknown` by hand. It defaults to `unknown`, so a call without\n * `onMutate` types exactly as before.\n */\nexport type ServiceMutationHook<Schema extends DescMessage, Response> = <\n TContext = unknown,\n>(\n options?: Partial<\n UseMutationOptions<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >\n >,\n) => UseMutationResult<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n>;\n\n/**\n * createQueryOptions builds one read's query-options builder — the single\n * definition of its cache key and its fetch that the generated hook, and\n * every caller outside React, share.\n *\n * The error is typed as ConnectClientError rather than React Query's default\n * `Error`, on the options themselves, because React Query takes a result's\n * error type from the TError it reads there: `query.error` is a\n * ConnectClientError at every call site with nothing to pass. Typing it as\n * `Error` hid `.reason`, `.codeName`, `.status` and `.retryable`, and left\n * `err.message.includes(...)` as the only expression that compiled — the one\n * thing the error contract forbids.\n *\n * The caller's options are spread BEFORE the key and the fetch: a caller may\n * set anything else, never the two that make this read this read.\n */\nexport function createQueryOptions<Schema extends DescMessage, Response>(\n keyFor: (req: MessageInitShape<Schema>) => ServiceQueryKey,\n call: ServiceCall<Schema, Response>,\n): ServiceQueryOptionsBuilder<Schema, Response> {\n return <TData = Response>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n ): ServiceQueryOptions<Response, TData> =>\n queryOptions<Response, ConnectClientError, TData, ServiceQueryKey>({\n ...options,\n queryKey: keyFor(req),\n queryFn: ({ signal }) => call(req, signal),\n }) as ServiceQueryOptions<Response, TData>;\n}\n\n/**\n * createQueryHook builds one useQuery wrapper over a read's query-options\n * builder. It adds nothing to the options: a hook and a `fetchQuery` of the\n * same request therefore read and write one cache entry with one fetch.\n */\nexport function createQueryHook<Schema extends DescMessage, Response>(\n optionsFor: ServiceQueryOptionsBuilder<Schema, Response>,\n): ServiceQueryHook<Schema, Response> {\n return <TData = Response>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n ) => useQuery(optionsFor(req, options));\n}\n\n/**\n * createInfiniteQueryOptions builds one paged read's infinite query-options\n * builder.\n *\n * The page token is the builder's: the first page is fetched with the\n * caller's request as given (no token, so an `optional string page_token`\n * stays unset), each later one with the previous response's\n * `nextPageToken`, and an empty token ends the listing. The key is\n * `keys.infinite(...)`, which strips the token and sits under the service and\n * entity scopes, so the mutations that invalidate a plain list refetch this\n * one too.\n *\n * The caller's options are spread BETWEEN the default getNextPageParam and\n * the three fields the read owns: a caller may replace the default, never the\n * key, the fetch or the first page.\n */\nexport function createInfiniteQueryOptions<\n Schema extends DescMessage,\n Response extends PagedResponse,\n>(\n keyFor: (req: PageRequest<Schema>) => ServiceQueryKey,\n call: ServiceCall<Schema, Response>,\n): ServiceInfiniteQueryOptionsBuilder<Schema, Response> {\n return <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n ): ServiceInfiniteQueryOptions<Response, TData> =>\n infiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n >({\n getNextPageParam: (last) => last.nextPageToken || undefined,\n ...options,\n queryKey: keyFor(req),\n queryFn: ({ pageParam, signal }) =>\n call(\n (pageParam === \"\"\n ? req\n : {\n ...req,\n pageToken: pageParam,\n }) as unknown as MessageInitShape<Schema>,\n signal,\n ),\n initialPageParam: \"\",\n }) as ServiceInfiniteQueryOptions<Response, TData>;\n}\n\n/**\n * createInfiniteQueryHook builds one useInfiniteQuery wrapper over a paged\n * read's infinite query-options builder, adding nothing to it — so a hook\n * and a `fetchInfiniteQuery` of the same request share one cache entry.\n */\nexport function createInfiniteQueryHook<\n Schema extends DescMessage,\n Response extends PagedResponse,\n>(\n optionsFor: ServiceInfiniteQueryOptionsBuilder<Schema, Response>,\n): ServiceInfiniteQueryHook<Schema, Response> {\n return <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n ) => useInfiniteQuery(optionsFor(req, options));\n}\n\n/**\n * createMutationHook builds one useMutation wrapper with scoped invalidation.\n *\n * invalidateKey is the entity scope when the RPC maps to a CRUD entity, and\n * the whole-service scope otherwise — a bespoke mutation may touch anything,\n * so over-invalidating is the safe default there.\n *\n * The invalidation is composed BEFORE the caller's onSuccess and is never\n * replaced by it: onSuccess is destructured out and re-invoked after the\n * invalidate, while the rest of the options object is spread separately. A\n * caller passing onSuccess therefore ADDS behaviour, rather than silently\n * disabling the cache refresh — which is exactly what a plain `...options`\n * spread over a default onSuccess would do.\n */\nexport function createMutationHook<Schema extends DescMessage, Response>(\n invalidateKey: ServiceQueryKey,\n call: (req: MessageInitShape<Schema>) => Promise<Response>,\n): ServiceMutationHook<Schema, Response> {\n return <TContext = unknown>(\n options?: Partial<\n UseMutationOptions<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >\n >,\n ) => {\n const queryClient = useQueryClient();\n const { onSuccess, ...rest } = options ?? {};\n return useMutation<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >({\n mutationFn: (req: MessageInitShape<Schema>) => call(req),\n onSuccess: (...args) => {\n queryClient.invalidateQueries({ queryKey: invalidateKey });\n onSuccess?.(...args);\n },\n ...rest,\n });\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"service-hooks.js","sourceRoot":"","sources":["../src/service-hooks.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,sEAAsE;AACtE,EAAE;AACF,8EAA8E;AAC9E,6EAA6E;AAC7E,uEAAuE;AACvE,6EAA6E;AAC7E,+EAA+E;AAC/E,yEAAyE;AACzE,gEAAgE;AAChE,EAAE;AACF,8EAA8E;AAC9E,kDAAkD;AAClD,EAAE;AACF,6EAA6E;AAC7E,2EAA2E;AAC3E,qEAAqE;AACrE,qEAAqE;AACrE,+EAA+E;AAC/E,4EAA4E;AAC5E,8EAA8E;AAC9E,sEAAsE;AACtE,EAAE;AACF,+EAA+E;AAC/E,2EAA2E;AAC3E,sEAAsE;AACtE,wEAAwE;AACxE,6EAA6E;AAC7E,4EAA4E;AAC5E,mCAAmC;AACnC,EAAE;AACF,yEAAyE;AACzE,0EAA0E;AAC1E,4EAA4E;AAC5E,6EAA6E;AAC7E,wEAAwE;AACxE,2EAA2E;AAC3E,8EAA8E;AAC9E,qBAAqB;AACrB,OAAO,EACL,MAAM,EACN,MAAM,GAGP,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EACpB,YAAY,EACZ,gBAAgB,EAChB,WAAW,EACX,QAAQ,EACR,cAAc,GAUf,MAAM,uBAAuB,CAAC;AAW/B;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,UAAU,CACxB,MAAc,EACd,GAA6B;IAE7B,OAAO,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC;AAC7C,CAAC;AA4FD;;;;;;GAMG;AACH,SAAS,cAAc,CACrB,MAAc,EACd,GAAwB;IAExB,MAAM,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,GAA0C,CAAC,CAAC;IAC5E,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,GAAG,IAA+B,CAAC;IAC3E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,wEAAwE;IACxE,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,QAAQ,GAAG,CAAC,MAAc,EAAE,WAAoB,EAAmB,EAAE,CACzE,WAAW,KAAK,SAAS;QACvB,CAAC,CAAE,CAAC,OAAO,EAAE,MAAM,CAAW;QAC9B,CAAC,CAAE,CAAC,OAAO,EAAE,WAAW,EAAE,MAAM,CAAW,CAAC;IAChD,OAAO;QACL,GAAG,EAAE,CAAC,OAAO,CAAU;QACvB,MAAM,EAAE,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,IAAI,CAAU;QAClD,KAAK,EAAE,CACL,MAAc,EACd,MAAc,EACd,WAAoB,EACM,EAAE;YAC5B,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;YAC1C,OAAO,MAAM,CAAC,MAAM,CAClB,CAAC,GAA6B,EAAmB,EAAE,CAAC;gBAClD,GAAG,GAAG;gBACN,UAAU,CAAC,MAAM,EAAE,GAAG,CAAC;aACxB,EACD,EAAE,GAAG,EAAE,CACR,CAAC;QACJ,CAAC;QACD,QAAQ,EACN,CACE,MAAc,EACd,MAAc,EACd,WAAoB,EACpB,EAAE,CACJ,CAAC,GAAwB,EAAmB,EAAE,CAAC;YAC7C,GAAG,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;YAChC,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC;YAC3B,UAAU;SACX;KACJ,CAAC;AACJ,CAAC;AA4LD;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,kBAAkB,CAChC,MAA0D,EAC1D,IAAmC;IAEnC,OAAO,CACL,GAA6B,EAC7B,OAA4C,EACN,EAAE,CACxC,YAAY,CAAuD;QACjE,GAAG,OAAO;QACV,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;QACrB,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC;KAC3C,CAAyC,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,UAAwD;IAExD,OAAO,CACL,GAA6B,EAC7B,OAA4C,EAC5C,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,0BAA0B,CAIxC,MAAqD,EACrD,IAAmC;IAEnC,OAAO,CACL,GAAwB,EACxB,OAAoD,EACN,EAAE,CAChD,oBAAoB,CAMlB;QACA,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,aAAa,IAAI,SAAS;QAC3D,GAAG,OAAO;QACV,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC;QACrB,OAAO,EAAE,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,CACjC,IAAI,CACF,CAAC,SAAS,KAAK,EAAE;YACf,CAAC,CAAC,GAAG;YACL,CAAC,CAAC;gBACE,GAAG,GAAG;gBACN,SAAS,EAAE,SAAS;aACrB,CAAwC,EAC7C,MAAM,CACP;QACH,gBAAgB,EAAE,EAAE;KACrB,CAAiD,CAAC;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAIrC,UAAgE;IAEhE,OAAO,CACL,GAAwB,EACxB,OAAoD,EACpD,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;AAClD,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAA8B,EAC9B,IAA0D;IAE1D,OAAO,CACL,OAOC,EACD,EAAE;QACF,MAAM,WAAW,GAAG,cAAc,EAAE,CAAC;QACrC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,IAAI,EAAE,CAAC;QAC7C,OAAO,WAAW,CAKhB;YACA,UAAU,EAAE,CAAC,GAA6B,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC;YACxD,SAAS,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;gBACrB,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;gBAC3D,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC;YACvB,CAAC;YACD,GAAG,IAAI;SACR,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AA2BD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,UAAU,kBAAkB,CAChC,aAA8B,EAC9B,IAAmC;IAEnC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QAClD,KAAK,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,CAAC,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;AACJ,CAAC;AAUD;;;;;GAKG;AACH,MAAM,UAAU,sBAAsB,CAGpC,WAAwB;IAExB,OAAO,CAAC,WAAW,EAAE,EAAE;QACrB,MAAM,KAAK,GAA4B,EAAE,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,KAAsC,CAAC;IAChD,CAAC,CAAC;AACJ,CAAC","sourcesContent":["\"use client\";\n\n// Part of @reliantlabs/forge-web-runtime — the web twin of forge/pkg.\n//\n// Every export below is a React hook or builds one, so this module belongs in\n// the CLIENT graph. Without the directive the Next.js App Router compiles it\n// into the SERVER graph, where it binds a SECOND @tanstack/react-query\n// instance and every generated hook throws \"No QueryClient set\" at runtime —\n// invisible to tsc, eslint AND `next build`. published-surface.test.ts asserts\n// the directive survives into dist/. It is NOT applied package-wide: the\n// ./interceptors subpath exists to be importable without React.\n//\n// The React Query wrapper machinery behind forge's generated per-service hook\n// files (`src/hooks/<svc>-service-hooks_gen.ts`).\n//\n// WHAT WAS HERE BEFORE. Each generated file re-emitted the same three things\n// per RPC: a query-key entry, a useQuery or useMutation wrapper, and — for\n// mutations — the entity-scoped invalidateQueries plus the onSuccess\n// composition, with the reasoning for each re-inlined as comments. A\n// five-service project rendered five copies of machinery that differed only in\n// RPC names and message types. This module IS that machinery, written once.\n// The generated file keeps exactly what varies per RPC: the name, the request\n// schema, the response type, query-vs-mutation, and the entity scope.\n//\n// WHY A SUBPATH AND NOT THE BARREL. This module imports @tanstack/react-query.\n// Every browser frontend forge scaffolds depends on it — but the barrel is\n// also what a consumer imports for interceptors and errors alone, and\n// anchoring React Query there would make a non-React consumer resolve a\n// package it never installed. Same reasoning as ./mock-transport and ./otel:\n// an engine with its own dependency footprint gets its own entry point, and\n// React Query is an OPTIONAL peer.\n//\n// WHAT IT DELIBERATELY DOES NOT DO. It does not emit error toasts — they\n// belong to one app-wide chokepoint, a MutationCache onError on the app's\n// QueryClient (a forge scaffold installs it in src/lib/query-client.ts, and\n// pages that render errors inline pass `meta: { silenceErrorToast: true }`);\n// an app without one handles errors at the call site. It never defaults\n// success-side UX either: \"CreateOrder succeeded\" leaks RPC names into the\n// UI, so the toast / redirect / inline confirmation stays the call site's via\n// options.onSuccess.\nimport {\n create,\n toJson,\n type DescMessage,\n type MessageInitShape,\n} from \"@bufbuild/protobuf\";\nimport {\n infiniteQueryOptions,\n queryOptions,\n useInfiniteQuery,\n useMutation,\n useQuery,\n useQueryClient,\n type DataTag,\n type InfiniteData,\n type QueryClient,\n type UseInfiniteQueryOptions,\n type UseInfiniteQueryResult,\n type UseMutationOptions,\n type UseMutationResult,\n type UseQueryOptions,\n type UseQueryResult,\n} from \"@tanstack/react-query\";\n\nimport type { ConnectClientError } from \"./errors.js\";\n\n/**\n * A generated query key. The tuple is [service, entity?, method,\n * protojson(req)] for a method key and [service] / [service, entity] for the\n * broader scopes.\n */\nexport type ServiceQueryKey = readonly unknown[];\n\n/**\n * requestKey projects a request init into protojson for use inside a query\n * key. Two reasons this is not the raw request object:\n *\n * - React Query's default hasher is JSON.stringify, which THROWS on bigint\n * fields (any proto int64) — the raw message crashes the cache.\n * - protojson normalizes representations, so { id: 1 } and { id: \"1\" } land\n * in ONE cache entry instead of silently splitting the cache.\n *\n * Exported because a hand-written hook that wants to share a generated hook's\n * cache entry has to hash its request the identical way.\n */\nexport function requestKey<Schema extends DescMessage>(\n schema: Schema,\n req: MessageInitShape<Schema>,\n): unknown {\n return toJson(schema, create(schema, req));\n}\n\n/**\n * One read's key entry in a generated factory: `orderServiceKeys.getOrder`.\n *\n * Called, it is that request's key, [service, entity?, method,\n * protojson(req)]. Its `.all` is the rpc's scope, [service, entity?,\n * method]: a prefix of every key the rpc caches under — every request, the\n * plain query and the `<method>Infinite` read alike — and of no other rpc's.\n *\n * queryClient.invalidateQueries({ queryKey: orderServiceKeys.listOrders.all })\n * queryClient.setQueriesData({ queryKey: orderServiceKeys.getOrder.all }, patch)\n *\n * It exists so code never names a key's tuple positions. A predicate like\n * `query.queryKey[1] === \"listOrders\"` breaks silently when a\n * `// forge:query-scope` marker inserts the entity at index 1; `.all` is\n * built by the same function that builds the keys, so it moves with them.\n *\n * `.all` is not data-tagged. It names a SET of entries, and for a paged\n * read that set holds two shapes (the response, and the infinite read's\n * `{ pages, pageParams }`), so a `setQueriesData` updater over it must\n * handle both.\n */\nexport type ServiceMethodKey<Schema extends DescMessage> = ((\n req: MessageInitShape<Schema>,\n) => ServiceQueryKey) & {\n /** Every cached request of this rpc: [service, entity?, method]. */\n readonly all: ServiceQueryKey;\n};\n\n/** The three key-scope builders a generated key factory is assembled from. */\nexport interface ServiceKeyBuilders {\n /** Every query on this service: [service]. */\n readonly all: readonly [string];\n /** Every query for one CRUD entity: [service, entity]. Mutations invalidate this. */\n entity(name: string): readonly [string, string];\n /**\n * One query: [service, entity?, method, protojson(req)]. Returns the\n * per-request key FUNCTION, which is what both the query hook and any\n * call-site prefetch/setQueryData use, with the rpc's scope\n * [service, entity?, method] on it as `.all` (ServiceMethodKey).\n */\n query<Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): ServiceMethodKey<Schema>;\n /**\n * One paged read: [service, entity?, method, protojson(req), \"infinite\"],\n * where req is the request WITHOUT its page token — the hook owns the\n * token, so every page of one listing shares one cache entry.\n *\n * It nests under the same scopes as `query`, so an entity or service-wide\n * invalidation refetches it. The \"infinite\" suffix keeps it OFF the plain\n * query's entry for the same request: an infinite query caches\n * `{ pages, pageParams }`, not one response, and a plain hook reading that\n * entry would get the wrong shape.\n */\n infinite<Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): (req: PageRequest<Schema>) => ServiceQueryKey;\n}\n\n/**\n * Omit distributed over a union. MessageInitShape is `Message | init\n * object`, and a plain Omit over a union keeps only the keys both members\n * share — which would silently drop every field from the init side.\n */\ntype DistributiveOmit<T, K extends PropertyKey> = T extends unknown\n ? Omit<T, K>\n : never;\n\n/**\n * The request a generated infinite hook takes: the rpc's request without\n * `pageToken`, which the hook supplies page by page.\n */\nexport type PageRequest<Schema extends DescMessage> = DistributiveOmit<\n MessageInitShape<Schema>,\n \"pageToken\"\n>;\n\n/**\n * The response shape forge's list-pagination convention (AIP-158) gives a\n * paged read: `string next_page_token`, empty on the last page. Optional so\n * an `optional string next_page_token` response satisfies it too.\n */\nexport interface PagedResponse {\n nextPageToken?: string;\n}\n\n/**\n * pageRequestKey is requestKey with the page token dropped, so every page of\n * one listing hashes to one key even when a caller (JS, or a cast) passes a\n * token anyway. It is dropped from the protojson rather than from the init\n * object: a spread Message keeps its $typeName, and create() would hand that\n * token-less copy back as if it were a complete message.\n */\nfunction pageRequestKey<Schema extends DescMessage>(\n schema: Schema,\n req: PageRequest<Schema>,\n): unknown {\n const json = requestKey(schema, req as unknown as MessageInitShape<Schema>);\n if (json === null || typeof json !== \"object\" || Array.isArray(json)) {\n return json;\n }\n const { pageToken: _pageToken, ...rest } = json as Record<string, unknown>;\n return rest;\n}\n\n/**\n * serviceKeys returns the builders for one service's query-key factory.\n *\n * Cache-key semantics are a compatibility contract, not an implementation\n * detail: an existing app's\n * `invalidateQueries({ queryKey: orderServiceKeys.order })` has to keep\n * matching the keys its queries were registered under across a version bump.\n * So the tuple order and contents produced here are fixed, and identical to\n * what forge previously inlined into every generated hook file.\n */\nexport function serviceKeys(service: string): ServiceKeyBuilders {\n // The rpc scope every key below starts with. Both builders derive their\n // keys from it, so `.all` is a prefix of them by construction, not by a\n // second copy of the tuple layout.\n const rpcScope = (method: string, entityScope?: string): ServiceQueryKey =>\n entityScope === undefined\n ? ([service, method] as const)\n : ([service, entityScope, method] as const);\n return {\n all: [service] as const,\n entity: (name: string) => [service, name] as const,\n query: <Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ): ServiceMethodKey<Schema> => {\n const all = rpcScope(method, entityScope);\n return Object.assign(\n (req: MessageInitShape<Schema>): ServiceQueryKey => [\n ...all,\n requestKey(schema, req),\n ],\n { all },\n );\n },\n infinite:\n <Schema extends DescMessage>(\n method: string,\n schema: Schema,\n entityScope?: string,\n ) =>\n (req: PageRequest<Schema>): ServiceQueryKey => [\n ...rpcScope(method, entityScope),\n pageRequestKey(schema, req),\n \"infinite\",\n ],\n };\n}\n\n/**\n * How a generated file calls one rpc. `signal` is React Query's: a query\n * that is unmounted or superseded (a new key while typing) aborts its\n * request instead of letting it land on a cache entry nobody reads.\n */\nexport type ServiceCall<Schema extends DescMessage, Response> = (\n req: MessageInitShape<Schema>,\n signal?: AbortSignal,\n) => Promise<Response>;\n\n/**\n * The options a generated read takes — its hook (`useGetOrder(req,\n * options?)`) and its query-options builder\n * (`orderServiceQueries.getOrder(req, options?)`) alike: React Query's own,\n * minus the two the read owns, the key and the fetch. Everything else\n * (`select`, `enabled`, `staleTime`, `placeholderData`, …) passes through.\n *\n * TData is what `data` is, exactly as in React Query's own useQuery: the\n * response by default, or whatever `select` returns. A call site mapping the\n * proto response to a view model passes `select: (r) => toView(r)` and gets\n * `data: View` — no useMemo over `data`, and React Query re-runs the mapping\n * only when the response changes (or when `select` itself does, so hoist it\n * or wrap it in useCallback when it is expensive).\n */\nexport type ServiceQueryInput<Response, TData = Response> = Partial<\n Omit<\n UseQueryOptions<Response, ConnectClientError, TData, ServiceQueryKey>,\n \"queryKey\" | \"queryFn\"\n >\n>;\n\n/**\n * What a query-options builder returns: TanStack's `queryOptions(...)`\n * result, so it goes anywhere React Query takes one —\n * `queryClient.fetchQuery`, `ensureQueryData`, `prefetchQuery`,\n * `useQueries({ queries })`, `useQuery`, `useSuspenseQuery`. Its `queryKey`\n * is data-tagged, so `queryClient.getQueryData(opts.queryKey)` and\n * `setQueryData` are typed as the response with no annotation.\n *\n * fetchQuery / ensureQueryData resolve to the RESPONSE, not to `select`'s\n * TData: they return what the cache holds, and `select` is an observer\n * option that only a hook or useQueries applies.\n */\nexport type ServiceQueryOptions<Response, TData = Response> = UseQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey\n> & {\n queryKey: DataTag<ServiceQueryKey, Response, ConnectClientError>;\n};\n\n/**\n * A generated query-options builder: `orderServiceQueries.getOrder(req,\n * options?)`. It is the read's single definition — the generated hook\n * `useGetOrder` is `useQuery` over exactly this — so code outside React (an\n * imperative action, a stream handler, a router loader, a prefetch) shares\n * the hook's cache entry and fetch by construction rather than by copying\n * its key and its client call.\n */\nexport type ServiceQueryOptionsBuilder<Schema extends DescMessage, Response> = <\n TData = Response,\n>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n) => ServiceQueryOptions<Response, TData>;\n\n/**\n * A generated query hook: `useGetOrder(req, options?)` — `useQuery` over the\n * service's query-options builder for the same rpc. TData is inferred from\n * `select` and is a parameter of the HOOK, not of the factory, so every call\n * site picks its own.\n */\nexport type ServiceQueryHook<Schema extends DescMessage, Response> = <\n TData = Response,\n>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n) => UseQueryResult<TData, ConnectClientError>;\n\n/**\n * The options a generated infinite read takes: React Query's own, minus the\n * three the read owns — the key, the fetch, and the first page param.\n * `getNextPageParam` defaults to the response's `nextPageToken` (empty means\n * last page) and may be overridden; everything else (`select`,\n * `placeholderData`, `staleTime`, `enabled`, `maxPages`, …) passes through.\n */\nexport type ServiceInfiniteQueryInput<Response, TData> = Partial<\n Omit<\n UseInfiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n >,\n \"queryKey\" | \"queryFn\" | \"initialPageParam\"\n >\n>;\n\n/**\n * What an infinite query-options builder returns: TanStack's\n * `infiniteQueryOptions(...)` result, for `queryClient.fetchInfiniteQuery`,\n * `prefetchInfiniteQuery`, `ensureInfiniteQueryData` and\n * `useInfiniteQuery`. Its key is data-tagged as `InfiniteData<Response,\n * string>`, the `{ pages, pageParams }` the cache holds.\n */\nexport type ServiceInfiniteQueryOptions<\n Response,\n TData = InfiniteData<Response, string>,\n> = UseInfiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n> & {\n queryKey: DataTag<\n ServiceQueryKey,\n InfiniteData<Response, string>,\n ConnectClientError\n >;\n};\n\n/**\n * A generated infinite query-options builder:\n * `orderServiceQueries.listOrdersInfinite(req, options?)`, for a read that\n * follows forge's list-pagination shape. `useListOrdersInfinite` is\n * `useInfiniteQuery` over exactly this.\n */\nexport type ServiceInfiniteQueryOptionsBuilder<\n Schema extends DescMessage,\n Response extends PagedResponse,\n> = <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n) => ServiceInfiniteQueryOptions<Response, TData>;\n\n/**\n * A generated infinite-query hook: `useListOrdersInfinite(req, options?)`,\n * for a read that follows forge's list-pagination shape (`string page_token`\n * on the request, `string next_page_token` on the response).\n *\n * `req` is the first page's request without its token. `data` is React\n * Query's `{ pages, pageParams }` by default; `select` reshapes it, so\n * flattening the pages into one list is\n * `select: (d) => d.pages.flatMap((p) => p.orders)`.\n */\nexport type ServiceInfiniteQueryHook<\n Schema extends DescMessage,\n Response extends PagedResponse,\n> = <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n) => UseInfiniteQueryResult<TData, ConnectClientError>;\n\n/**\n * A generated mutation hook: `useCreateOrder(options?)`.\n *\n * TContext is React Query's fourth type parameter — what `onMutate` returns\n * and `onError` / `onSettled` receive back. It is a parameter of the HOOK,\n * not of the factory, so each call site gets its own: TypeScript infers it\n * from the `onMutate` the caller passes, and an optimistic update reads its\n * rollback off `context` with no cast. Fixing it at the factory (or leaving\n * it out, which pinned it to `unknown`) forced every such call site to\n * narrow `unknown` by hand. It defaults to `unknown`, so a call without\n * `onMutate` types exactly as before.\n */\nexport type ServiceMutationHook<Schema extends DescMessage, Response> = <\n TContext = unknown,\n>(\n options?: Partial<\n UseMutationOptions<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >\n >,\n) => UseMutationResult<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n>;\n\n/**\n * createQueryOptions builds one read's query-options builder — the single\n * definition of its cache key and its fetch that the generated hook, and\n * every caller outside React, share.\n *\n * The error is typed as ConnectClientError rather than React Query's default\n * `Error`, on the options themselves, because React Query takes a result's\n * error type from the TError it reads there: `query.error` is a\n * ConnectClientError at every call site with nothing to pass. Typing it as\n * `Error` hid `.reason`, `.codeName`, `.status` and `.retryable`, and left\n * `err.message.includes(...)` as the only expression that compiled — the one\n * thing the error contract forbids.\n *\n * The caller's options are spread BEFORE the key and the fetch: a caller may\n * set anything else, never the two that make this read this read.\n */\nexport function createQueryOptions<Schema extends DescMessage, Response>(\n keyFor: (req: MessageInitShape<Schema>) => ServiceQueryKey,\n call: ServiceCall<Schema, Response>,\n): ServiceQueryOptionsBuilder<Schema, Response> {\n return <TData = Response>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n ): ServiceQueryOptions<Response, TData> =>\n queryOptions<Response, ConnectClientError, TData, ServiceQueryKey>({\n ...options,\n queryKey: keyFor(req),\n queryFn: ({ signal }) => call(req, signal),\n }) as ServiceQueryOptions<Response, TData>;\n}\n\n/**\n * createQueryHook builds one useQuery wrapper over a read's query-options\n * builder. It adds nothing to the options: a hook and a `fetchQuery` of the\n * same request therefore read and write one cache entry with one fetch.\n */\nexport function createQueryHook<Schema extends DescMessage, Response>(\n optionsFor: ServiceQueryOptionsBuilder<Schema, Response>,\n): ServiceQueryHook<Schema, Response> {\n return <TData = Response>(\n req: MessageInitShape<Schema>,\n options?: ServiceQueryInput<Response, TData>,\n ) => useQuery(optionsFor(req, options));\n}\n\n/**\n * createInfiniteQueryOptions builds one paged read's infinite query-options\n * builder.\n *\n * The page token is the builder's: the first page is fetched with the\n * caller's request as given (no token, so an `optional string page_token`\n * stays unset), each later one with the previous response's\n * `nextPageToken`, and an empty token ends the listing. The key is\n * `keys.infinite(...)`, which strips the token and sits under the service and\n * entity scopes, so the mutations that invalidate a plain list refetch this\n * one too.\n *\n * The caller's options are spread BETWEEN the default getNextPageParam and\n * the three fields the read owns: a caller may replace the default, never the\n * key, the fetch or the first page.\n */\nexport function createInfiniteQueryOptions<\n Schema extends DescMessage,\n Response extends PagedResponse,\n>(\n keyFor: (req: PageRequest<Schema>) => ServiceQueryKey,\n call: ServiceCall<Schema, Response>,\n): ServiceInfiniteQueryOptionsBuilder<Schema, Response> {\n return <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n ): ServiceInfiniteQueryOptions<Response, TData> =>\n infiniteQueryOptions<\n Response,\n ConnectClientError,\n TData,\n ServiceQueryKey,\n string\n >({\n getNextPageParam: (last) => last.nextPageToken || undefined,\n ...options,\n queryKey: keyFor(req),\n queryFn: ({ pageParam, signal }) =>\n call(\n (pageParam === \"\"\n ? req\n : {\n ...req,\n pageToken: pageParam,\n }) as unknown as MessageInitShape<Schema>,\n signal,\n ),\n initialPageParam: \"\",\n }) as ServiceInfiniteQueryOptions<Response, TData>;\n}\n\n/**\n * createInfiniteQueryHook builds one useInfiniteQuery wrapper over a paged\n * read's infinite query-options builder, adding nothing to it — so a hook\n * and a `fetchInfiniteQuery` of the same request share one cache entry.\n */\nexport function createInfiniteQueryHook<\n Schema extends DescMessage,\n Response extends PagedResponse,\n>(\n optionsFor: ServiceInfiniteQueryOptionsBuilder<Schema, Response>,\n): ServiceInfiniteQueryHook<Schema, Response> {\n return <TData = InfiniteData<Response, string>>(\n req: PageRequest<Schema>,\n options?: ServiceInfiniteQueryInput<Response, TData>,\n ) => useInfiniteQuery(optionsFor(req, options));\n}\n\n/**\n * createMutationHook builds one useMutation wrapper with scoped invalidation.\n *\n * invalidateKey is the entity scope when the RPC maps to a CRUD entity, and\n * the whole-service scope otherwise — a bespoke mutation may touch anything,\n * so over-invalidating is the safe default there.\n *\n * The invalidation is composed BEFORE the caller's onSuccess and is never\n * replaced by it: onSuccess is destructured out and re-invoked after the\n * invalidate, while the rest of the options object is spread separately. A\n * caller passing onSuccess therefore ADDS behaviour, rather than silently\n * disabling the cache refresh — which is exactly what a plain `...options`\n * spread over a default onSuccess would do.\n */\nexport function createMutationHook<Schema extends DescMessage, Response>(\n invalidateKey: ServiceQueryKey,\n call: (req: MessageInitShape<Schema>) => Promise<Response>,\n): ServiceMutationHook<Schema, Response> {\n return <TContext = unknown>(\n options?: Partial<\n UseMutationOptions<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >\n >,\n ) => {\n const queryClient = useQueryClient();\n const { onSuccess, ...rest } = options ?? {};\n return useMutation<\n Response,\n ConnectClientError,\n MessageInitShape<Schema>,\n TContext\n >({\n mutationFn: (req: MessageInitShape<Schema>) => call(req),\n onSuccess: (...args) => {\n queryClient.invalidateQueries({ queryKey: invalidateKey });\n onSuccess?.(...args);\n },\n ...rest,\n });\n };\n}\n\n/** What a generated imperative write takes beside its request. */\nexport interface ServiceMutationCallOptions {\n /** Aborts the RPC. An aborted write rejects and invalidates nothing. */\n signal?: AbortSignal;\n}\n\n/**\n * A generated imperative write:\n * `orderServiceMutations(queryClient).createOrder(req, options?)`. It\n * resolves with the response and rejects with the ConnectClientError the\n * transport throws.\n */\nexport type ServiceMutationCall<Schema extends DescMessage, Response> = (\n req: MessageInitShape<Schema>,\n options?: ServiceMutationCallOptions,\n) => Promise<Response>;\n\n/**\n * One write's definition, before it is bound to a QueryClient — an entry of\n * the table a generated `<service>Mutations` is built from.\n */\nexport type ServiceMutationDefinition<Schema extends DescMessage, Response> = (\n queryClient: QueryClient,\n) => ServiceMutationCall<Schema, Response>;\n\n/**\n * createMutationCall builds one write for code outside React — a store, a\n * sync service, an OAuth callback, a stream handler — where\n * createMutationHook's hook cannot run.\n *\n * It is the hook's contract without the hook: call the rpc, and on success\n * invalidate `invalidateKey`, the same scope the generated file hands the\n * rpc's createMutationHook. So a write made here refetches exactly the reads\n * a write made through the hook would, and code outside React never copies a\n * client call and an invalidateQueries that then drift from the hook's.\n *\n * Like the hook, it does not wait for the refetch: the promise settles with\n * the rpc, and the invalidated reads refetch behind it. A failed write\n * invalidates nothing. It does NOT run through React Query's MutationCache,\n * so an app-wide MutationCache onError (the scaffold's error toast) does not\n * see it: the rejection is the caller's to handle, which is what a\n * background caller wants.\n */\nexport function createMutationCall<Schema extends DescMessage, Response>(\n invalidateKey: ServiceQueryKey,\n call: ServiceCall<Schema, Response>,\n): ServiceMutationDefinition<Schema, Response> {\n return (queryClient) => async (req, options) => {\n const response = await call(req, options?.signal);\n void queryClient.invalidateQueries({ queryKey: invalidateKey });\n return response;\n };\n}\n\n/**\n * The writes of one `<service>Mutations(queryClient)`: each definition bound\n * to that client.\n */\nexport type ServiceMutations<\n Definitions extends Record<string, (queryClient: QueryClient) => unknown>,\n> = { [K in keyof Definitions]: ReturnType<Definitions[K]> };\n\n/**\n * createServiceMutations builds a generated `<service>Mutations` from its\n * table of createMutationCall definitions: a function of the QueryClient\n * whose invalidations the writes should reach — the app's, normally the\n * singleton in src/lib/query-client.ts.\n */\nexport function createServiceMutations<\n Definitions extends Record<string, (queryClient: QueryClient) => unknown>,\n>(\n definitions: Definitions,\n): (queryClient: QueryClient) => ServiceMutations<Definitions> {\n return (queryClient) => {\n const bound: Record<string, unknown> = {};\n for (const [name, define] of Object.entries(definitions)) {\n bound[name] = define(queryClient);\n }\n return bound as ServiceMutations<Definitions>;\n };\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@reliantlabs/forge-web-runtime",
|
|
3
|
-
"version": "0.13.
|
|
3
|
+
"version": "0.13.5",
|
|
4
4
|
"description": "The forge frontend runtime: Connect interceptor stack, session, error boundary, toast queue, <Resource> container, W3C trace propagation and the HyperDX browser SDK wiring (errors, console, network, traces; replay off by default). The web twin of forge/pkg.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"//repository note": "REQUIRED for `npm publish --provenance`, not decoration. npm cross-checks this against the repository in the signed provenance statement and rejects the publish with a 422 if they disagree — an absent field reads as \"\" and fails that comparison. `directory` names the subdirectory this package lives in, so the provenance points at the real source. Omitting this is what made the first 0.3.1 publish fail AFTER the tarball had been signed and written to the sigstore transparency log.",
|