@fitzzero/quickdraw-core 5.0.1 → 5.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/README.md +303 -32
  2. package/dist/{admin-CBlTY0do.d.ts → admin-DKwkIh5i.d.ts} +2 -2
  3. package/dist/{adminSchemas-zji11V74.d.ts → adminSchemas-2DUA_hZ8.d.ts} +1 -1
  4. package/dist/{auth-CMyRkfjZ.d.ts → auth-BhWqdyb-.d.ts} +2 -2
  5. package/dist/{caller-BqCYnpmC.d.ts → caller-CXTFswBO.d.ts} +27 -5
  6. package/dist/{chunk-2XJFNVHW.js → chunk-2PWMUVC7.js} +1 -1
  7. package/dist/{chunk-2XJFNVHW.js.map → chunk-2PWMUVC7.js.map} +1 -1
  8. package/dist/{chunk-O2PWC2YW.js → chunk-OECZPRPW.js} +3 -3
  9. package/dist/{chunk-3JNMVB2V.js → chunk-QCHKWIRS.js} +2 -2
  10. package/dist/{chunk-5YRQ26LF.js → chunk-RT6OILOI.js} +1 -1
  11. package/dist/chunk-RT6OILOI.js.map +1 -0
  12. package/dist/{chunk-NS5PUHIZ.js → chunk-RZTP4IEW.js} +130 -23
  13. package/dist/chunk-RZTP4IEW.js.map +1 -0
  14. package/dist/{chunk-HQ6WIRE2.js → chunk-SHEGLZEP.js} +4 -4
  15. package/dist/{chunk-WVIRXYI4.js → chunk-VSQBHPWH.js} +2 -2
  16. package/dist/{chunk-WVIRXYI4.js.map → chunk-VSQBHPWH.js.map} +1 -1
  17. package/dist/chunk-XNLWBZIG.js +9 -0
  18. package/dist/chunk-XNLWBZIG.js.map +1 -0
  19. package/dist/{chunk-ZACRRYWL.js → chunk-ZIVPHYRG.js} +4 -4
  20. package/dist/cli/quickdraw-docs.js +241 -27
  21. package/dist/cli/quickdraw-docs.js.map +1 -1
  22. package/dist/client/index.d.ts +7 -7
  23. package/dist/client/index.js +4 -4
  24. package/dist/{clientTypes-DuZW_8mb.d.ts → clientTypes-Bc-G8n-U.d.ts} +3 -3
  25. package/dist/{connection-DuN8GvcD.d.ts → connection-Cr1BU07W.d.ts} +2 -2
  26. package/dist/{createServer-CGsJlxM8.d.ts → createServer-CP9eDHZZ.d.ts} +30 -9
  27. package/dist/{createTestApp-Cg2CZa1g.d.ts → createTestApp-UKVGEmOf.d.ts} +6 -6
  28. package/dist/{envelope-nf5eGB-a.d.ts → envelope-Cp3YcVxC.d.ts} +1 -1
  29. package/dist/{http-D3fSFQ57.d.ts → http-Djj2Inuu.d.ts} +6 -6
  30. package/dist/index.d.ts +6 -6
  31. package/dist/index.js +26 -6
  32. package/dist/index.js.map +1 -1
  33. package/dist/{infer-Dw21kmLw.d.ts → infer-Teo1xpsd.d.ts} +17 -0
  34. package/dist/{metrics-C0WvB7-I.d.ts → metrics-BdBu5o8G.d.ts} +2 -2
  35. package/dist/prisma/index.d.ts +4 -4
  36. package/dist/server/auth/index.d.ts +3 -3
  37. package/dist/server/index.d.ts +47 -26
  38. package/dist/server/index.js +62 -36
  39. package/dist/server/index.js.map +1 -1
  40. package/dist/server/mcp/index.d.ts +51 -11
  41. package/dist/server/mcp/index.js +129 -8
  42. package/dist/server/mcp/index.js.map +1 -1
  43. package/dist/server/otel.d.ts +3 -3
  44. package/dist/{sharing-CoreezAq.d.ts → sharing-DVa8W-yR.d.ts} +3 -3
  45. package/dist/testing/client.d.ts +13 -13
  46. package/dist/testing/client.js +5 -5
  47. package/dist/testing/index.d.ts +156 -12
  48. package/dist/testing/index.js +1036 -21
  49. package/dist/testing/index.js.map +1 -1
  50. package/dist/testing/mock.d.ts +5 -5
  51. package/dist/testing/mock.js +4 -4
  52. package/dist/{types-Bwg3kIEc.d.ts → types-Cu0vmx7c.d.ts} +8 -2
  53. package/dist/utils/index.d.ts +1 -1
  54. package/package.json +1 -1
  55. package/dist/chunk-5YRQ26LF.js.map +0 -1
  56. package/dist/chunk-NS5PUHIZ.js.map +0 -1
  57. /package/dist/{chunk-O2PWC2YW.js.map → chunk-OECZPRPW.js.map} +0 -0
  58. /package/dist/{chunk-3JNMVB2V.js.map → chunk-QCHKWIRS.js.map} +0 -0
  59. /package/dist/{chunk-HQ6WIRE2.js.map → chunk-SHEGLZEP.js.map} +0 -0
  60. /package/dist/{chunk-ZACRRYWL.js.map → chunk-ZIVPHYRG.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/quickdraw-docs.ts","../../src/cli/docs.ts","../../src/cli/markdown.ts","../../src/cli/access.ts","../../src/cli/schemaText.ts","../../src/cli/render.ts"],"sourcesContent":["#!/usr/bin/env node\n// The `quickdraw-docs` command (bin in package.json): Markdown API docs from\n// an app's contracts. The work is in `docs.ts`; `quickdraw-docs --help`\n// prints the usage.\n\nimport process from \"node:process\";\nimport { main } from \"./docs\";\n\nprocess.exitCode = await main(process.argv.slice(2), {\n out: (text) => {\n process.stdout.write(text);\n },\n err: (text) => {\n process.stderr.write(text);\n },\n});\n","// `quickdraw-docs`: Markdown API docs generated from an app's contracts\n// (RFC 0003 sections 2 and 12.5), one page per service plus an index. It\n// loads a module, takes every contract it exports (alone, or in a map such\n// as the one given to `createQuickdrawClient`), and writes the pages; with\n// `--check` it writes nothing and exits 1 when the pages on disk differ. It\n// reads contracts, never source code, so what it documents is what clients\n// are typed from. With `--services <module>` (a module exporting the\n// services, each or in a list, as the server takes them) each page also says\n// who may call what: each method's access form and `rowless`, the service's\n// row policy, admin bypass, `watchAccess` and field levels, who may open a\n// collection's scope, a channel's access, a stream's computed seed\n// (`access.ts`); without it the pages are the contracts' alone.\n//\n// quickdraw-docs packages/shared/src/contracts/index.ts --out docs/api\n// quickdraw-docs packages/shared/src/contracts/index.ts --services apps/api/src/services/index.ts\n// quickdraw-docs packages/shared/src/contracts/index.ts --out docs/api --check\n//\n// A TypeScript module is imported as Node imports it (Node 24 strips types),\n// and through `tsx` when that fails and the project has `tsx` installed, so\n// extensionless imports and `tsconfig` paths work too. The services module\n// loads every module the server does, so a workspace package whose\n// `package.json` points at its build must be built first (finding F6.7 of\n// the quickdraw-chat migration): a missing built file is reported with that\n// hint (`buildHint`).\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join, relative, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { AnyContract } from \"../contract/defineContract\";\nimport { servicesOf, type ServiceDoc } from \"./access\";\nimport { fileOf, GENERATED_MARKER, renderIndex, renderService } from \"./render\";\n\nconst USAGE = `Usage: quickdraw-docs <module> [--services <module>] [--out <dir>] [--check]\n\n <module> a module exporting the app's contracts: each one, or a map of them\n --services <module> a module exporting the services (each, or a list of them): the pages\n then also say who may call each method, from the services' access\n --out <dir> where the pages go: one per service, plus README.md (default: docs/api)\n --check write nothing; exit 1 when the pages on disk differ from the contracts\n`;\n\n/** The index page's file name. */\nexport const INDEX_FILE = \"README.md\";\n\n/** Where `main` writes its output; the CLI passes the process's streams. */\nexport interface DocsOutput {\n out(text: string): void;\n err(text: string): void;\n}\n\nconst CONTRACT_KEYS = [\n \"projections\",\n \"fields\",\n \"methods\",\n \"collections\",\n \"streams\",\n \"channels\",\n \"events\",\n] as const;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True for what `defineContract` returns: a frozen object with a name and every member map. */\nexport function isContract(value: unknown): value is AnyContract {\n return (\n isRecord(value) &&\n Object.isFrozen(value) &&\n typeof value.name === \"string\" &&\n \"entity\" in value &&\n CONTRACT_KEYS.every((key) => isRecord(value[key]))\n );\n}\n\n/**\n * Every contract a module exports, directly or as the values of an exported\n * map (`{ task, project }`), in name order. Two different contracts with one\n * service name are an error, as they would be on a server.\n */\nexport function contractsOf(exports: Readonly<Record<string, unknown>>): AnyContract[] {\n const found = new Map<string, AnyContract>();\n const add = (contract: AnyContract): void => {\n const known = found.get(contract.name);\n if (known !== undefined && known !== contract) {\n throw new Error(`two different contracts are named \"${contract.name}\"`);\n }\n found.set(contract.name, contract);\n };\n for (const value of Object.values(exports)) {\n if (isContract(value)) {\n add(value);\n } else if (isRecord(value)) {\n Object.values(value).filter(isContract).forEach(add);\n }\n }\n return [...found.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\n/** Options of {@link generateDocs}. */\nexport interface GenerateOptions {\n /**\n * The app's services by name (`servicesOf`): each page then says who may\n * call what. A service no contract documents is an error.\n */\n readonly services?: ReadonlyMap<string, ServiceDoc>;\n}\n\n/** The pages for `contracts`: file name to content, the index included. */\nexport function generateDocs(\n contracts: readonly AnyContract[],\n options: GenerateOptions = {},\n): ReadonlyMap<string, string> {\n const { services } = options;\n if (services !== undefined) {\n const documented = new Set(contracts.map((contract) => contract.name));\n const strays = [...services.keys()].filter((name) => !documented.has(name));\n if (strays.length > 0) {\n throw new Error(\n `the services module defines ${strays.join(\", \")}, but the contracts module exports no contract of ${strays.length === 1 ? \"that name\" : \"those names\"}`,\n );\n }\n }\n const files = new Map<string, string>();\n for (const contract of contracts) {\n const file = fileOf(contract);\n if (file === INDEX_FILE || files.has(file)) {\n throw new Error(`the page of ${contract.name} would overwrite ${file}`);\n }\n files.set(\n file,\n renderService(\n contract,\n services === undefined ? undefined : { service: services.get(contract.name) },\n ),\n );\n }\n files.set(INDEX_FILE, renderIndex(contracts));\n return files;\n}\n\n/** What `syncDocs` found or did, file by file. */\nexport interface DocsReport {\n readonly written: readonly string[];\n readonly unchanged: readonly string[];\n readonly removed: readonly string[];\n}\n\nfunction readText(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** The generated pages already in `dir`: Markdown files that start with the marker. */\nfunction generatedIn(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".md\"))\n .filter((name) => readText(join(dir, name))?.startsWith(GENERATED_MARKER) === true)\n .sort();\n}\n\n/**\n * Brings `dir` in line with `files`: writes what differs and removes the\n * generated pages no contract makes any more. With `check`, it changes\n * nothing and reports the same as what it would do. A file that does not\n * start with the generated marker is never replaced or removed: one in the\n * way of a page fails the whole run before anything is written.\n */\nexport function syncDocs(\n files: ReadonlyMap<string, string>,\n dir: string,\n check: boolean,\n): DocsReport {\n const foreign = [...files.keys()].filter((name) => {\n const existing = readText(join(dir, name));\n return existing !== undefined && !existing.startsWith(GENERATED_MARKER);\n });\n if (foreign.length > 0) {\n throw new Error(\n `${foreign.join(\", \")} in ${dir} ${foreign.length === 1 ? \"was\" : \"were\"} not written by quickdraw-docs: move ${foreign.length === 1 ? \"it\" : \"them\"}, or write the pages to another --out`,\n );\n }\n const written: string[] = [];\n const unchanged: string[] = [];\n for (const [name, content] of files) {\n if (readText(join(dir, name)) === content) {\n unchanged.push(name);\n continue;\n }\n written.push(name);\n if (!check) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, name), content);\n }\n }\n const removed = generatedIn(dir).filter((name) => !files.has(name));\n if (!check) {\n for (const name of removed) {\n rmSync(join(dir, name));\n }\n }\n return { written, unchanged, removed };\n}\n\n/** `tsx`'s `tsImport`, from the project around `dir`, when it is installed there. */\nasync function tsxImport(\n dir: string,\n): Promise<((specifier: string, parent: string) => Promise<unknown>) | undefined> {\n let resolved: string;\n try {\n resolved = createRequire(join(dir, \"package.json\")).resolve(\"tsx/esm/api\");\n } catch {\n return undefined;\n }\n const api = (await import(pathToFileURL(resolved).href)) as { readonly tsImport?: unknown };\n return typeof api.tsImport === \"function\"\n ? (api.tsImport as (specifier: string, parent: string) => Promise<unknown>)\n : undefined;\n}\n\n/**\n * Node's codes for a module it could not resolve or load as written: an\n * extensionless import or a `tsconfig` path, a directory import, `.tsx`, or\n * TypeScript its type stripping cannot run. `tsx` may load those.\n */\nconst LOADER_ERRORS: ReadonlySet<string> = new Set([\n \"ERR_MODULE_NOT_FOUND\",\n \"ERR_UNSUPPORTED_DIR_IMPORT\",\n \"ERR_UNKNOWN_FILE_EXTENSION\",\n \"ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX\",\n \"ERR_INVALID_TYPESCRIPT_SYNTAX\",\n \"ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING\",\n]);\n\n/**\n * True when importing failed in Node's loader (see {@link LOADER_ERRORS}),\n * not in the module's own code: only then is the module loaded again\n * through `tsx`, so a module that throws runs once and reports its own error.\n */\nexport function failedToLoad(error: unknown): boolean {\n const code: unknown =\n typeof error === \"object\" && error !== null ? Reflect.get(error, \"code\") : undefined;\n return typeof code === \"string\" && LOADER_ERRORS.has(code);\n}\n\n/** A built file a package's `package.json` points at: under a `dist/` or `build/` directory. */\nconst BUILT_FILE = /[\\\\/](?:dist|build)[\\\\/]/;\n\n/**\n * `error` with a hint when it names a missing built file: a workspace\n * package the module imports was not built (`bun run build` first); else\n * `error` itself.\n */\nexport function buildHint(error: unknown, file: string, cwd: string): unknown {\n const message = error instanceof Error ? error.message : String(error);\n if (Reflect.get(Object(error), \"code\") !== \"ERR_MODULE_NOT_FOUND\" || !BUILT_FILE.test(message)) {\n return error;\n }\n return new Error(\n `could not import ${relative(cwd, file)}: ${message}. A workspace package it imports loads from its build, which is missing: build the workspace (bun run build) before generating the docs`,\n { cause: error },\n );\n}\n\n/** Imports the module at `file`: natively, then through `tsx` for TypeScript Node cannot load alone. */\nasync function importModule(file: string, cwd: string): Promise<Readonly<Record<string, unknown>>> {\n const url = pathToFileURL(file).href;\n try {\n return (await import(url)) as Readonly<Record<string, unknown>>;\n } catch (error) {\n if (!/\\.[cm]?tsx?$/.test(file) || !failedToLoad(error)) {\n throw buildHint(error, file, cwd);\n }\n const tsImport = await tsxImport(cwd);\n if (tsImport === undefined) {\n throw new Error(\n `could not import ${relative(cwd, file)} (${error instanceof Error ? error.message : String(error)}); install tsx in the project to load TypeScript with extensionless imports or tsconfig paths`,\n { cause: error },\n );\n }\n try {\n return (await tsImport(url, pathToFileURL(join(cwd, \"package.json\")).href)) as Readonly<\n Record<string, unknown>\n >;\n } catch (again) {\n throw buildHint(again, file, cwd);\n }\n }\n}\n\ninterface Options {\n readonly module: string;\n readonly services: string | undefined;\n readonly out: string;\n readonly check: boolean;\n}\n\n/** The options in `args`, or the usage problem. */\nfunction parseArgs(args: readonly string[]): Options | string {\n let target: string | undefined;\n let services: string | undefined;\n let out = \"docs/api\";\n let check = false;\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n const value = args[index + 1];\n if (arg === \"--check\") {\n check = true;\n } else if (arg === \"--out\" || arg === \"--services\") {\n if (value === undefined || value.startsWith(\"-\")) {\n return arg === \"--out\" ? \"--out needs a directory\" : \"--services needs a module\";\n }\n if (arg === \"--out\") {\n out = value;\n } else {\n services = value;\n }\n index += 1;\n } else if (arg !== undefined && !arg.startsWith(\"-\") && target === undefined) {\n target = arg;\n } else {\n return `unknown argument \"${String(arg)}\"`;\n }\n }\n return target === undefined\n ? \"name the module that exports the contracts\"\n : { module: target, services, out, check };\n}\n\nfunction report(result: DocsReport, out: string, check: boolean, io: DocsOutput): number {\n if (!check) {\n io.out(\n `quickdraw-docs: ${out}: ${result.written.length} written, ${result.unchanged.length} unchanged, ${result.removed.length} removed\\n`,\n );\n return 0;\n }\n const drift = [\n ...result.written.map((name) => `${name} differs from the contracts`),\n ...result.removed.map((name) => `${name} documents a service no contract has`),\n ];\n if (drift.length === 0) {\n io.out(`quickdraw-docs: ${out} matches the contracts\\n`);\n return 0;\n }\n io.err(\n `${drift.map((line) => `quickdraw-docs: ${out}/${line}\\n`).join(\"\")}quickdraw-docs: ${drift.length} page(s) out of date: run quickdraw-docs without --check\\n`,\n );\n return 1;\n}\n\n/**\n * Runs the command with `args` (the arguments after `quickdraw-docs`) in\n * `cwd`, and resolves with its exit code: 0, 1 when `--check` finds drift\n * or the module cannot be documented, 2 for a usage error.\n */\nexport async function main(\n args: readonly string[],\n io: DocsOutput,\n cwd: string = process.cwd(),\n): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n io.out(USAGE);\n return 0;\n }\n const options = parseArgs(args);\n if (typeof options === \"string\") {\n io.err(`quickdraw-docs: ${options}\\n\\n${USAGE}`);\n return 2;\n }\n try {\n const contracts = contractsOf(await importModule(resolve(cwd, options.module), cwd));\n if (contracts.length === 0) {\n throw new Error(`${options.module} exports no contract`);\n }\n const services =\n options.services === undefined\n ? undefined\n : servicesOf(await importModule(resolve(cwd, options.services), cwd));\n if (services?.size === 0) {\n throw new Error(`${String(options.services)} exports no service`);\n }\n const files = generateDocs(contracts, services === undefined ? {} : { services });\n const result = syncDocs(files, resolve(cwd, options.out), options.check);\n return report(result, options.out, options.check, io);\n } catch (error) {\n io.err(`quickdraw-docs: ${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n }\n}\n","// Markdown helpers the generators share (`quickdraw-docs` and\n// `quickdraw-protocol`). What they write is laid out the way oxfmt and\n// Prettier lay out Markdown (aligned tables, one blank line between blocks),\n// so formatting a generated file leaves it as it is and `--check` does not\n// report formatting as drift.\n\nconst WIDE =\n /[ᄀ-ᅟ⺀-꓏가-힣豈-﫿︰-﹏＀-⦆¢-₩\\u{1f300}-\\u{1f64f}\\u{1f900}-\\u{1f9ff}\\u{20000}-\\u{3fffd}]/u;\n\n/** How wide a table cell is, as Prettier measures it: wide characters count twice. */\nfunction widthOf(text: string): number {\n let width = 0;\n for (const char of text) {\n width += WIDE.test(char) ? 2 : 1;\n }\n return width;\n}\n\n/** A table cell: one line, with its pipes escaped. */\nfunction cell(text: string): string {\n return text.replace(/\\s*\\n\\s*/g, \" \").replace(/\\|/g, \"\\\\|\");\n}\n\n/** A Markdown table with its columns aligned. */\nexport function table(header: readonly string[], rows: readonly (readonly string[])[]): string[] {\n const cells = [header, ...rows].map((row) => header.map((_, column) => cell(row[column] ?? \"\")));\n const widths = header.map((_, column) =>\n Math.max(3, ...cells.map((row) => widthOf(row[column] ?? \"\"))),\n );\n const line = (row: readonly string[]): string =>\n `| ${row.map((text, column) => text + \" \".repeat((widths[column] ?? 3) - widthOf(text))).join(\" | \")} |`;\n const [head = [], ...body] = cells;\n return [\n line(head),\n `| ${widths.map((width) => \"-\".repeat(width)).join(\" | \")} |`,\n ...body.map(line),\n ];\n}\n\n/** Inline code, with a longer fence when the text holds a backtick. */\nexport function code(text: string): string {\n return text.includes(\"`\") ? `\\`\\` ${text} \\`\\`` : `\\`${text}\\``;\n}\n\n/** Names as inline code, separated by commas. */\nexport function list(names: readonly string[]): string {\n return names.map(code).join(\", \");\n}\n\n/** A paragraph of source text, trimmed line by line. */\nexport function paragraph(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\")\n .trim();\n}\n\n/** One section: a heading and its blocks, each followed by a blank line. */\nexport function section(\n heading: string,\n blocks: readonly (string | readonly string[])[],\n): string[] {\n const lines = [heading, \"\"];\n for (const block of blocks) {\n lines.push(...(typeof block === \"string\" ? [block] : block), \"\");\n }\n return lines;\n}\n","// Who may call what, for `quickdraw-docs --services` (finding F5.3 of the\n// quickdraw-chat migration: 4.x's generator printed each method's access\n// level, while 5.0's read contracts alone, which do not say). The services\n// module's `defineService` results are read as data: each method's access\n// form and `rowless`, the service's row policy, admin bypass and\n// `watchAccess`, who may open each collection, each channel's access, and\n// each stream's computed seed and validation. Functions (a `custom` check,\n// an `id` selector, a `resolver`) are named, never printed. A service is\n// recognized by its shape, not by identity, so a services module that loaded\n// its own copy of the framework is read as well.\n\nimport { code } from \"./markdown\";\n\ntype UnknownRecord = Readonly<Record<string, unknown>>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** One method of a defined service, as the docs read it. */\nexport interface MethodAccessDoc {\n /** Its access form, as `defineService` checked it. */\n readonly access: unknown;\n /** It said `rowless: true`. */\n readonly rowless: boolean;\n}\n\n/** What the docs read of one collection of a defined service. */\nexport interface CollectionAccessDoc {\n /** The level a subscriber needs on the anchor row. */\n readonly level: unknown;\n /** The contract of the rows scope values are ids of; `undefined` for a `\"self\"` scope. */\n readonly anchor: unknown;\n}\n\n/** What the docs read of one stream of a defined service. */\nexport interface StreamServiceDoc {\n /** The service computes each subscriber's seed. */\n readonly computedSeed: boolean;\n /** When pushed items are checked: `\"always\"` or `\"development\"`. */\n readonly validate: unknown;\n}\n\n/** What the docs read of one defined service. */\nexport interface ServiceDoc {\n readonly name: string;\n /** Its row policy, or `undefined` without one. */\n readonly policy: unknown;\n /** Whether a service-wide `Admin` grant passes every check. */\n readonly adminBypass: boolean;\n /** Who may watch its change topic, or `undefined`: closed. */\n readonly watchAccess: unknown;\n readonly methods: ReadonlyMap<string, MethodAccessDoc>;\n readonly collections: ReadonlyMap<string, CollectionAccessDoc>;\n /** Per channel: the access form its handler is called under. */\n readonly channels: ReadonlyMap<string, unknown>;\n readonly streams: ReadonlyMap<string, StreamServiceDoc>;\n}\n\n/** `value` as a map of named records, or `undefined` when it is not one. */\nfunction recordsOf(value: unknown): ReadonlyMap<string, UnknownRecord> | undefined {\n if (!(value instanceof Map)) {\n return undefined;\n }\n for (const [key, member] of value as Map<unknown, unknown>) {\n if (typeof key !== \"string\" || !isRecord(member)) {\n return undefined;\n }\n }\n return value as ReadonlyMap<string, UnknownRecord>;\n}\n\n/** Each named member of `records`, read by `read`. */\nfunction mapEach<T>(\n records: ReadonlyMap<string, UnknownRecord>,\n read: (record: UnknownRecord) => T,\n): ReadonlyMap<string, T> {\n return new Map([...records].map(([name, record]) => [name, read(record)]));\n}\n\n/**\n * The service `value` is, read as the docs need it, or `undefined` for\n * anything that is not what `defineService` returns: an object with a name,\n * a contract, one record per method (its access form and handler), and its\n * collections, channels and streams as maps.\n */\nexport function serviceDocOf(value: unknown): ServiceDoc | undefined {\n if (!isRecord(value) || typeof value.name !== \"string\" || !isRecord(value.contract)) {\n return undefined;\n }\n const { methods } = value;\n const collections = recordsOf(value.collections);\n const channels = recordsOf(value.channels);\n const streams = recordsOf(value.streams);\n if (\n !isRecord(methods) ||\n collections === undefined ||\n channels === undefined ||\n streams === undefined ||\n !Object.values(methods).every(\n (method) => isRecord(method) && typeof method.handler === \"function\" && \"access\" in method,\n )\n ) {\n return undefined;\n }\n return Object.freeze({\n name: value.name,\n policy: value.access,\n adminBypass: value.adminBypass !== false,\n watchAccess: value.watchAccess,\n methods: new Map(\n Object.entries(methods as Readonly<Record<string, UnknownRecord>>).map(([name, method]) => [\n name,\n { access: method.access, rowless: method.rowless === true },\n ]),\n ),\n collections: mapEach(collections, (collection) => ({\n level: collection.access,\n anchor: collection.anchor,\n })),\n channels: mapEach(channels, (channel) => channel.access),\n streams: mapEach(streams, (stream) => ({\n computedSeed: typeof stream.computeSeed === \"function\",\n validate: stream.validate,\n })),\n });\n}\n\n/**\n * Every service a module exports, directly or in an exported list or map,\n * by name. Two different services with one name are an error, as they would\n * be on a server.\n */\nexport function servicesOf(exports: UnknownRecord): ReadonlyMap<string, ServiceDoc> {\n const found = new Map<string, { readonly from: unknown; readonly doc: ServiceDoc }>();\n const add = (value: unknown): void => {\n const doc = serviceDocOf(value);\n if (doc === undefined) {\n return;\n }\n const known = found.get(doc.name);\n if (known !== undefined && known.from !== value) {\n throw new Error(`two different services are named \"${doc.name}\"`);\n }\n found.set(doc.name, { from: value, doc });\n };\n for (const value of Object.values(exports)) {\n if (serviceDocOf(value) !== undefined) {\n add(value);\n } else if (Array.isArray(value)) {\n value.forEach(add);\n } else if (isRecord(value)) {\n Object.values(value).forEach(add);\n }\n }\n return new Map(\n [...found]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, { doc }]) => [name, doc]),\n );\n}\n\n/** A contract's service name, for a form or policy that names one. */\nfunction serviceName(contract: unknown): string {\n return isRecord(contract) && typeof contract.name === \"string\"\n ? contract.name\n : \"another service\";\n}\n\n/** Which row an `entry` or `scope` form is about, as declared and in words. */\nfunction idOf(id: unknown): { readonly declared: string; readonly words: string } {\n if (id === undefined) {\n return { declared: \"\", words: code(\"input.id\") };\n }\n return typeof id === \"string\"\n ? { declared: `, id: \"${id}\"`, words: code(`input.${id}`) }\n : { declared: \", id: (input) => ...\", words: \"a function of the input\" };\n}\n\n/** A method's (or a topic's, or a channel's) access form, as declared, then in words. */\nexport function accessFormText(form: unknown): string {\n if (form === \"public\") {\n return `${code('\"public\"')}: anyone, signed in or not`;\n }\n if (form === \"authenticated\") {\n return `${code('\"authenticated\"')}: any signed-in caller`;\n }\n if (!isRecord(form)) {\n return \"not readable\";\n }\n if (form.kind === \"custom\") {\n return `${code(\"custom(check)\")}: a signed-in caller the service's own check lets through`;\n }\n const id = idOf(form.id);\n if (typeof form.scope === \"string\") {\n const of = serviceName(form.of);\n return `${code(`{ scope: \"${form.scope}\", of: ${of}${id.declared} }`)}: ${form.scope} or more on the ${code(of)} row ${id.words} names`;\n }\n const service = typeof form.service === \"string\" ? form.service : undefined;\n const entry = typeof form.entry === \"string\" ? form.entry : undefined;\n const declared = [\n service === undefined ? undefined : `service: \"${service}\"`,\n entry === undefined ? undefined : `entry: \"${entry}\"${id.declared}`,\n ].filter((part) => part !== undefined);\n const words = [\n service === undefined ? undefined : `a service-wide grant of ${service} or more`,\n entry === undefined ? undefined : `${entry} or more on the row ${id.words} names`,\n ].filter((part) => part !== undefined);\n return `${code(`{ ${declared.join(\", \")} }`)}: ${words.join(\", or \")}`;\n}\n\n/** How deep `anyOf` members are written out before they are only named. */\nconst MAX_POLICY_DEPTH = 3;\n\n/** A row policy, in words. */\nexport function policyText(policy: unknown, depth = 0): string {\n if (!isRecord(policy) || typeof policy.kind !== \"string\") {\n return \"none: its methods take no `entry` form\";\n }\n const column = (name: unknown): string => code(String(name));\n switch (policy.kind) {\n case \"owner\":\n return `${code(\"owner\")}: Admin for the user the ${column(policy.field)} column names`;\n case \"jsonAcl\": {\n const owner =\n typeof policy.owner === \"string\"\n ? `, and Admin for the user the ${column(policy.owner)} column names`\n : \"\";\n return `${code(\"jsonAcl\")}: the level the ${column(policy.field)} column lists for the user${owner}`;\n }\n case \"members\": {\n const read = isRecord(policy.membership) ? policy.membership : {};\n return `${code(\"members\")}: the role in the user's ${column(read.model)} row (${column(read.entry)} names the row, ${column(read.user)} the user, ${column(read.level)} the role)`;\n }\n case \"inherit\":\n return `${code(\"inherit\")}: the level on the ${code(serviceName(policy.from))} row the ${column(policy.via)} column names`;\n case \"anyOf\": {\n const members = Array.isArray(policy.policies) ? (policy.policies as unknown[]) : [];\n return depth >= MAX_POLICY_DEPTH\n ? code(\"anyOf\")\n : `${code(\"anyOf\")}: the highest level of ${members.map((member) => `(${policyText(member, depth + 1)})`).join(\", \")}`;\n }\n case \"resolver\":\n return `${code(\"resolver\")}: the service's own code`;\n case \"everyone\":\n return `${code(\"everyone\")}: ${String(policy.level)} for every signed-in user, on every row`;\n default:\n return code(policy.kind);\n }\n}\n\n/** Who may watch a service's change topic. */\nexport function watchAccessText(watch: unknown): string {\n return watch === undefined\n ? `closed: the service declares no ${code(\"watchAccess\")}`\n : accessFormText(watch);\n}\n\n/** Who may open a scope of a collection. */\nexport function collectionAccessText(collection: CollectionAccessDoc): string {\n if (collection.anchor === undefined) {\n return `the subscriber's own user id (${code('scopeAccess: \"self\"')})`;\n }\n return `${String(collection.level)} or more on the ${code(serviceName(collection.anchor))} row the scope names`;\n}\n","// Contract schemas as text for `quickdraw-docs`: each schema's Standard JSON\n// Schema (Zod 4.2 or later), drafted as draft-07 like the MCP bridge's tools,\n// written as a TypeScript-like type (`{ id: string; notes: string | null }`)\n// plus notes for the constraints a type cannot say (`1 to 200; default 50`).\n// A schema that cannot describe itself as JSON Schema (Zod 3, a hand-written\n// Standard Schema) is shown as such: the generator reads contracts, never\n// source code.\n\nimport { hasJsonSchema, isStandardSchema } from \"../contract/standardSchema\";\n\n/** A JSON Schema object, as a schema library wrote it. */\nexport type JsonSchema = Readonly<Record<string, unknown>>;\n\n/** One property of an object schema, as a row of a field table. */\nexport interface SchemaField {\n readonly name: string;\n readonly optional: boolean;\n readonly type: string;\n readonly notes: string;\n}\n\n/** What a schema cannot describe itself as: shown wherever its type would be. */\nexport const NO_JSON_SCHEMA = \"unknown (no JSON Schema)\";\n\nconst TARGET = \"draft-07\";\nconst MAX_DEPTH = 8;\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\n/** The `$ref` of the whole schema, which a recursive schema uses to refer to itself. */\nconst ROOT = \"#\";\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The JSON Schema of `schema`'s input or output, or `undefined` when the\n * schema cannot describe itself (no Standard JSON Schema, or it throws).\n */\nexport function jsonSchemaOf(schema: unknown, mode: \"input\" | \"output\"): JsonSchema | undefined {\n if (!isStandardSchema(schema) || !hasJsonSchema(schema)) {\n return undefined;\n }\n try {\n const json: unknown = schema[\"~standard\"].jsonSchema[mode]({ target: TARGET });\n return isRecord(json) ? json : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Where `$ref`s resolve, and the refs being written (a recursive schema prints its name). */\ninterface Scope {\n readonly root: JsonSchema;\n readonly open: readonly string[];\n readonly depth: number;\n}\n\nfunction definitionOf(root: JsonSchema, ref: string): JsonSchema | undefined {\n const match = /^#\\/(definitions|\\$defs)\\/(.+)$/.exec(ref);\n if (match === null) {\n return undefined;\n }\n const [, group = \"\", name = \"\"] = match;\n const definitions = root[group];\n const found = isRecord(definitions) ? definitions[decodeURIComponent(name)] : undefined;\n return isRecord(found) ? found : undefined;\n}\n\nfunction literal(value: unknown): string {\n return value === undefined ? \"undefined\" : JSON.stringify(value);\n}\n\nfunction joined(parts: readonly string[], separator: \" | \" | \" & \"): string {\n const unique = [...new Set(parts)];\n return unique.length === 0 ? \"never\" : unique.join(separator);\n}\n\nconst OPENING = new Set([\"{\", \"[\", \"(\", \"<\"]);\nconst CLOSING = new Set([\"}\", \"]\", \")\", \">\"]);\n\n/** `text` without the contents of its JSON string literals: `\"a | b\"` becomes `\"\"`. */\nfunction withoutStrings(text: string): string {\n return text.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, '\"\"');\n}\n\n/** True when `text` is a union or intersection at its top level, outside brackets and strings. */\nfunction isCompound(text: string): boolean {\n let depth = 0;\n const bare = withoutStrings(text);\n for (const [index, char] of [...bare].entries()) {\n if (OPENING.has(char)) {\n depth += 1;\n } else if (CLOSING.has(char)) {\n depth -= 1;\n } else if (depth === 0 && (char === \"|\" || char === \"&\") && bare[index - 1] === \" \") {\n return true;\n }\n }\n return false;\n}\n\n/** `T[]`, with a union or intersection in parentheses. */\nfunction arrayOf(item: string): string {\n return isCompound(item) ? `(${item})[]` : `${item}[]`;\n}\n\nfunction propertyName(name: string, optional: boolean): string {\n const key = IDENTIFIER.test(name) ? name : JSON.stringify(name);\n return optional ? `${key}?` : key;\n}\n\nfunction requiredOf(schema: JsonSchema): ReadonlySet<string> {\n return new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);\n}\n\nfunction objectText(schema: JsonSchema, scope: Scope): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = requiredOf(schema);\n const members = Object.entries(properties).map(\n ([name, value]) => `${propertyName(name, !required.has(name))}: ${textOf(value, scope)}`,\n );\n const extra = schema.additionalProperties;\n if (isRecord(extra)) {\n const value = textOf(extra, scope);\n if (members.length === 0) {\n return `Record<string, ${value}>`;\n }\n members.push(`[key: string]: ${value}`);\n }\n return members.length === 0 ? \"{}\" : `{ ${members.join(\"; \")} }`;\n}\n\nfunction arrayText(schema: JsonSchema, scope: Scope): string {\n const tuple = Array.isArray(schema.prefixItems)\n ? schema.prefixItems\n : Array.isArray(schema.items)\n ? schema.items\n : undefined;\n if (tuple !== undefined) {\n return `[${tuple.map((item) => textOf(item, scope)).join(\", \")}]`;\n }\n return arrayOf(schema.items === undefined ? \"unknown\" : textOf(schema.items, scope));\n}\n\nfunction typeNameText(type: string, schema: JsonSchema, scope: Scope): string {\n switch (type) {\n case \"object\":\n return objectText(schema, scope);\n case \"array\":\n return arrayText(schema, scope);\n case \"string\":\n case \"number\":\n case \"integer\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"unknown\";\n }\n}\n\n/** The members of a union or intersection keyword, written. */\nfunction combined(schema: JsonSchema, scope: Scope): string | undefined {\n for (const [keyword, separator] of [\n [\"anyOf\", \" | \"],\n [\"oneOf\", \" | \"],\n [\"allOf\", \" & \"],\n ] as const) {\n const options = schema[keyword];\n if (Array.isArray(options)) {\n return joined(\n options.map((option) => textOf(option, scope)),\n separator,\n );\n }\n }\n return undefined;\n}\n\n/** A `$ref`: the schema it names written out, or its name where it refers to itself. */\nfunction refText(ref: string, scope: Scope): string {\n const target = ref === ROOT ? scope.root : definitionOf(scope.root, ref);\n const title = target?.title;\n const name =\n typeof title === \"string\"\n ? title\n : ref === ROOT\n ? \"Self\"\n : decodeURIComponent(ref.replace(/^#\\/(definitions|\\$defs)\\//, \"\"));\n if (target === undefined || scope.open.includes(ref)) {\n return name;\n }\n return textOf(target, { ...scope, open: [...scope.open, ref] });\n}\n\n/** `schema` written as a TypeScript-like type. */\nfunction textOf(schema: unknown, scope: Scope): string {\n if (schema === true || (isRecord(schema) && Object.keys(schema).length === 0)) {\n return \"unknown\";\n }\n if (!isRecord(schema) || scope.depth > MAX_DEPTH) {\n return schema === false ? \"never\" : \"unknown\";\n }\n const inner: Scope = { ...scope, depth: scope.depth + 1 };\n if (typeof schema.$ref === \"string\") {\n return refText(schema.$ref, inner);\n }\n if (\"const\" in schema) {\n return literal(schema.const);\n }\n if (Array.isArray(schema.enum)) {\n return joined(schema.enum.map(literal), \" | \");\n }\n const union = combined(schema, inner);\n if (union !== undefined) {\n return union;\n }\n const { type } = schema;\n if (Array.isArray(type)) {\n return joined(\n type.map((name) => typeNameText(String(name), schema, inner)),\n \" | \",\n );\n }\n if (typeof type === \"string\") {\n return typeNameText(type, schema, inner);\n }\n return isRecord(schema.properties) ? objectText(schema, inner) : \"unknown\";\n}\n\n/** `schema` written as a TypeScript-like type: `{ id: string; title: string }`. */\nexport function schemaText(schema: JsonSchema): string {\n return textOf(schema, { root: schema, open: [ROOT], depth: 0 });\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === \"number\";\n}\n\n/** `count` and its unit, singular for 1: \"1 character\", \"20 items\". */\nfunction counted(count: number, unit: string): string {\n return `${count} ${count === 1 ? unit : `${unit}s`}`;\n}\n\n/** A length or size range: \"1 to 200 characters\", \"at least 1 character\", \"exactly 3 items\". */\nfunction sizeNote(low: unknown, high: unknown, unit: string): string | undefined {\n if (isNumber(low) && isNumber(high)) {\n return low === high ? `exactly ${counted(high, unit)}` : `${low} to ${counted(high, unit)}`;\n }\n if (isNumber(low)) {\n return `at least ${counted(low, unit)}`;\n }\n return isNumber(high) ? `at most ${counted(high, unit)}` : undefined;\n}\n\n/**\n * A bound of a number, or `undefined` for none: Zod writes the safe-integer\n * range as the bounds of every integer (`z.number().int()`), which says no\n * more than the type does.\n */\nfunction numberBound(value: unknown): number | undefined {\n return isNumber(value) && Math.abs(value) !== Number.MAX_SAFE_INTEGER ? value : undefined;\n}\n\n/** A number's lower bound in words: \"positive\", \"more than 5\", \"non-negative\", \"at least 1\". */\nfunction lowerNote(\n inclusive: number | undefined,\n exclusive: number | undefined,\n): string | undefined {\n if (exclusive !== undefined) {\n return exclusive === 0 ? \"positive\" : `more than ${exclusive}`;\n }\n if (inclusive === undefined) {\n return undefined;\n }\n return inclusive === 0 ? \"non-negative\" : `at least ${inclusive}`;\n}\n\n/** A number's upper bound in words: \"negative\", \"less than 5\", \"non-positive\", \"at most 10\". */\nfunction upperNote(\n inclusive: number | undefined,\n exclusive: number | undefined,\n): string | undefined {\n if (exclusive !== undefined) {\n return exclusive === 0 ? \"negative\" : `less than ${exclusive}`;\n }\n if (inclusive === undefined) {\n return undefined;\n }\n return inclusive === 0 ? \"non-positive\" : `at most ${inclusive}`;\n}\n\n/** A number's range: \"1 to 200\", \"non-negative\", \"positive\", \"at most 10\", \"more than 5\". */\nfunction numberNote(schema: JsonSchema): string | undefined {\n const low = numberBound(schema.minimum);\n const high = numberBound(schema.maximum);\n if (low !== undefined && high !== undefined) {\n return low === high ? `exactly ${low}` : `${low} to ${high}`;\n }\n const parts = [\n lowerNote(low, numberBound(schema.exclusiveMinimum)),\n upperNote(high, numberBound(schema.exclusiveMaximum)),\n ].filter((part) => part !== undefined);\n return parts.length === 0 ? undefined : parts.join(\", \");\n}\n\n/** The constraints of `schema` a type does not show: ranges, a format, a default, its description. */\nexport function schemaNotes(schema: JsonSchema): string {\n const notes = [\n sizeNote(schema.minLength, schema.maxLength, \"character\"),\n numberNote(schema),\n sizeNote(schema.minItems, schema.maxItems, \"item\"),\n typeof schema.format === \"string\" ? `format ${schema.format}` : undefined,\n \"default\" in schema ? `default ${literal(schema.default)}` : undefined,\n typeof schema.description === \"string\" ? schema.description : undefined,\n ];\n return notes.filter((note): note is string => note !== undefined && note !== \"\").join(\"; \");\n}\n\n/**\n * The properties of an object schema, one row each, or `undefined` when\n * `schema` is not an object with properties (its type is shown whole).\n */\nexport function schemaFields(schema: JsonSchema): readonly SchemaField[] | undefined {\n const properties = schema.properties;\n if (schema.type !== \"object\" || !isRecord(properties) || Object.keys(properties).length === 0) {\n return undefined;\n }\n const required = requiredOf(schema);\n const scope: Scope = { root: schema, open: [ROOT], depth: 1 };\n return Object.entries(properties).map(([name, value]) => ({\n name,\n optional: !required.has(name),\n type: textOf(value, scope),\n notes: isRecord(value) ? schemaNotes(value) : \"\",\n }));\n}\n","// The Markdown `quickdraw-docs` writes: one page per service and an index,\n// read from the contracts, laid out as oxfmt lays out Markdown\n// (`markdown.ts`), so `--check` does not report formatting as drift. With\n// `--services`, each page also says who may call what, read from the\n// services' definitions (`access.ts`).\n\nimport {\n DEFAULT_COLLECTION_LIMIT,\n DEFAULT_COLLECTION_MAX_LIMIT,\n type CollectionDef,\n} from \"../contract/collections\";\nimport type { AnyContract } from \"../contract/defineContract\";\nimport type { MethodDef, MethodOutput } from \"../contract/methods\";\nimport {\n CHANNEL_DEFAULT_RATE,\n isScopedStream,\n type ChannelDef,\n type EventDef,\n type StreamAccess,\n type StreamDef,\n} from \"../contract/realtime\";\nimport { isStandardSchema, type StandardSchemaV1 } from \"../contract/standardSchema\";\nimport {\n accessFormText,\n collectionAccessText,\n policyText,\n watchAccessText,\n type ServiceDoc,\n} from \"./access\";\nimport { code, list, paragraph, section, table } from \"./markdown\";\nimport {\n jsonSchemaOf,\n NO_JSON_SCHEMA,\n schemaFields,\n schemaText,\n type SchemaField,\n} from \"./schemaText\";\n\n/** The first line of every generated file; only files that start with it are ever replaced or removed. */\nexport const GENERATED_MARKER =\n \"<!-- Generated by quickdraw-docs from the app's contracts. Do not edit: change the contract and run quickdraw-docs again. -->\";\n\n/**\n * What `--services` adds to a page: who may call what, from the service the\n * services module defines under the contract's name (`undefined`: none).\n */\nexport interface AccessInfo {\n readonly service: ServiceDoc | undefined;\n}\n\n/** True when the schema accepts `undefined`: a method that takes no input. */\nfunction acceptsUndefined(schema: StandardSchemaV1): boolean {\n try {\n const result: unknown = schema[\"~standard\"].validate(undefined);\n return (\n typeof result === \"object\" &&\n result !== null &&\n !(\"then\" in result) &&\n (result as { readonly issues?: unknown }).issues === undefined\n );\n } catch {\n return false;\n }\n}\n\nfunction typeOf(schema: unknown, mode: \"input\" | \"output\"): string {\n const json = jsonSchemaOf(schema, mode);\n return json === undefined ? NO_JSON_SCHEMA : schemaText(json);\n}\n\n/** A field table: name, type, and the optional columns that hold something. */\nfunction fieldTable(\n fields: readonly SchemaField[],\n levels: Readonly<Record<string, string>> = {},\n): string[] {\n const hasLevels = fields.some((field) => levels[field.name] !== undefined);\n const hasNotes = fields.some((field) => field.notes !== \"\");\n const header = [\"Field\", \"Type\", ...(hasLevels ? [\"Level\"] : []), ...(hasNotes ? [\"Notes\"] : [])];\n const rows = fields.map((field) => [\n code(field.optional ? `${field.name}?` : field.name),\n code(field.type),\n ...(hasLevels ? [levels[field.name] ?? \"\"] : []),\n ...(hasNotes ? [field.notes] : []),\n ]);\n return table(header, rows);\n}\n\n/** A row schema's fields as a table, or its type when it has no properties. */\nfunction shapeBlock(\n schema: unknown,\n levels: Readonly<Record<string, string>> = {},\n): string | string[] {\n const json = jsonSchemaOf(schema, \"output\");\n if (json === undefined) {\n return `Its schema cannot describe itself as JSON Schema: ${code(NO_JSON_SCHEMA)}.`;\n }\n const fields = schemaFields(json);\n return fields === undefined ? code(schemaText(json)) : fieldTable(fields, levels);\n}\n\nfunction entitySection(contract: AnyContract): string[] {\n if (contract.entity === undefined) {\n return section(\"## Entity\", [\n \"None: an RPC-only service, without projections, field levels or collections.\",\n ]);\n }\n const levels = contract.fields;\n const tiers =\n Object.keys(levels).length === 0\n ? []\n : [\"A caller receives a field only with at least its level on the row.\"];\n return section(\"## Entity\", [shapeBlock(contract.entity, levels), ...tiers]);\n}\n\nfunction projectionsSection(contract: AnyContract): string[] {\n const names = Object.keys(contract.projections);\n if (names.length === 0) {\n return [];\n }\n return [\n \"## Projections\",\n \"\",\n ...names.flatMap((name) =>\n section(`### ${code(name)}`, [shapeBlock(contract.projections[name])]),\n ),\n ];\n}\n\nfunction outputText(output: MethodOutput): string {\n if (isStandardSchema(output)) {\n return code(typeOf(output, \"output\"));\n }\n if (typeof output === \"string\") {\n return `one row as the ${code(output)} projection`;\n }\n return output.kind === \"nullable\"\n ? `one row as the ${code(output.projection)} projection, or ${code(\"null\")}`\n : `rows as the ${code(output.projection)} projection`;\n}\n\nfunction inputBlocks(method: MethodDef): (string | string[])[] {\n const json = jsonSchemaOf(method.input, \"input\");\n if (json === undefined) {\n return [acceptsUndefined(method.input) ? \"Input: none.\" : `Input: ${code(NO_JSON_SCHEMA)}.`];\n }\n const fields = schemaFields(json);\n return fields === undefined\n ? [`Input: ${code(schemaText(json))}.`]\n : [\"Input:\", fieldTable(fields)];\n}\n\nfunction kindLine(method: MethodDef): string {\n if (method.watch === undefined) {\n return method.kind === \"query\" ? \"A query.\" : \"A mutation.\";\n }\n if (method.watch === \"service\") {\n return \"A query that watches its service: a cached result is fetched again after every change to the service's rows, collections or the models it writes.\";\n }\n if (\"service\" in method.watch) {\n const models = method.watch.service.map(code).join(\", \");\n return `A query that watches its service's writes to ${models}: a cached result is fetched again after a change to one of them.`;\n }\n return `A query that watches the ${code(method.watch.collection)} collection: a cached result is fetched again when the scope its input names changes.`;\n}\n\n/** Who may call a method, and its `rowless`, when the page documents access. */\nfunction methodAccess(name: string, access: AccessInfo | undefined): string[] {\n const method = access?.service?.methods.get(name);\n if (method === undefined) {\n return [];\n }\n const rowless = method.rowless\n ? [\n `${code(\"rowless\")}: every caller the form admits may reach any row its input names, on purpose.`,\n ]\n : [];\n return [`Access: ${accessFormText(method.access)}.`, ...rowless];\n}\n\nfunction methodSection(name: string, method: MethodDef, access: AccessInfo | undefined): string[] {\n const described = method.describe === undefined ? [] : [paragraph(method.describe)];\n return section(`### ${code(name)}`, [\n ...described,\n kindLine(method),\n ...methodAccess(name, access),\n ...inputBlocks(method),\n `Output: ${outputText(method.output)}.`,\n ]);\n}\n\nfunction methodsSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n const entries = Object.entries(contract.methods);\n if (entries.length === 0) {\n return [];\n }\n return [\n \"## Methods\",\n \"\",\n ...entries.flatMap(([name, method]) => methodSection(name, method, access)),\n ];\n}\n\nfunction scopeText(scope: CollectionDef[\"scope\"]): string {\n if (typeof scope === \"string\") {\n return `the ${code(scope)} column`;\n }\n const via = `${code(scope.scope)} of the ${code(scope.model)} rows whose ${code(scope.entry)} is the item's id`;\n return scope.refreshEntry === true\n ? `${via}; a write to those rows sends the item again to every scope that holds it`\n : via;\n}\n\nfunction whereText(where: CollectionDef[\"where\"]): string | undefined {\n if (where === undefined || Object.keys(where).length === 0) {\n return undefined;\n }\n return Object.entries(where)\n .map(([column, value]) => code(`${column} = ${JSON.stringify(value)}`))\n .join(\", \");\n}\n\nfunction optionTable(rows: readonly (readonly [string, string | undefined])[]): string[] {\n return table(\n [\"Option\", \"Value\"],\n rows.filter((row): row is readonly [string, string] => row[1] !== undefined),\n );\n}\n\nfunction collectionSection(\n name: string,\n collection: CollectionDef,\n access: AccessInfo | undefined,\n): string[] {\n const views = collection.views === undefined ? [] : Object.keys(collection.views);\n const limit = collection.limit ?? DEFAULT_COLLECTION_LIMIT;\n const maxLimit = collection.maxLimit ?? DEFAULT_COLLECTION_MAX_LIMIT;\n const served = access?.service?.collections.get(name);\n return section(`### ${code(name)}`, [\n optionTable([\n [\"Scope\", scopeText(collection.scope)],\n [\"Item\", code(collection.item)],\n [\n \"Order\",\n collection.order.map(([column, direction]) => `${code(column)} ${direction}`).join(\", \"),\n ],\n [\"Where\", whereText(collection.where)],\n [\"Index\", collection.index === undefined ? undefined : list(collection.index)],\n [\"Views\", views.length === 0 ? undefined : list(views)],\n [\n \"Access\",\n served === undefined\n ? (collection.access ?? \"Read (default)\")\n : collectionAccessText(served),\n ],\n [\"Page size\", `${limit}, at most ${maxLimit}`],\n ]),\n ]);\n}\n\nfunction collectionsSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n const entries = Object.entries(contract.collections);\n if (entries.length === 0) {\n return [];\n }\n return [\n \"## Collections\",\n \"\",\n \"Live lists of the service's rows, one per scope value.\",\n \"\",\n ...entries.flatMap(([name, collection]) => collectionSection(name, collection, access)),\n ];\n}\n\nfunction accessText(access: StreamAccess | undefined): string {\n if (access === undefined) {\n return \"none: closed to every client\";\n }\n if (typeof access === \"string\") {\n return code(JSON.stringify(access));\n }\n if (access.room !== undefined) {\n const { room } = access;\n if (typeof room === \"string\") {\n return code(`{ room: \"${room}\" }`);\n }\n return typeof room === \"function\"\n ? code(\"{ room: (scope) => ... }\")\n : code(`{ room: { prefix: \"${room.prefix}\" } }`);\n }\n if (access.scope !== undefined) {\n return code(`{ scope: \"${access.scope}\", of: ${access.of.name} }`);\n }\n const parts = [\n access.service === undefined ? undefined : `service: \"${access.service}\"`,\n access.entry === undefined ? undefined : `entry: \"${access.entry}\"`,\n ].filter((part) => part !== undefined);\n return code(`{ ${parts.join(\", \")} }`);\n}\n\n/**\n * What a subscriber starts from (finding F6.8 of the quickdraw-chat\n * migration): the contract's `seed`, or a seed the service computes, which\n * only a page made with `--services` (`known`) can tell from none.\n */\nfunction seedText(seed: number | undefined, computed: boolean, known: boolean): string {\n if (computed) {\n return \"computed by the service when a socket subscribes\";\n }\n if (seed === undefined) {\n return known ? \"none (default)\" : \"none in the contract; the service may compute one\";\n }\n if (seed === 0) {\n return \"none\";\n }\n return seed === 1 ? \"the latest item\" : `the latest ${seed} items`;\n}\n\nfunction streamSection(name: string, stream: StreamDef, access: AccessInfo | undefined): string[] {\n const scoped = isScopedStream(stream);\n const served = access?.service?.streams.get(name);\n return section(`### ${code(name)}`, [\n optionTable([\n [\"Item\", code(typeOf(stream.item, \"output\"))],\n [\"Scope\", scoped ? `one feed per ${code(stream.scope ?? \"\")}` : \"one global feed\"],\n [\"Seed\", seedText(stream.seed, served?.computedSeed === true, served !== undefined)],\n [\"Volatile\", stream.volatile === true ? \"yes\" : \"no\"],\n [\"Access\", accessText(stream.access)],\n [\n \"Checked\",\n served === undefined\n ? undefined\n : served.validate === \"development\"\n ? `in development only (${code('validate: \"development\"')})`\n : \"always\",\n ],\n ]),\n ]);\n}\n\nfunction requiresText(requires: ChannelDef[\"requires\"]): string | undefined {\n if (requires === undefined) {\n return undefined;\n }\n const selector = (value: unknown): string =>\n typeof value === \"string\" ? code(value) : \"a function of the payload\";\n if (requires.room !== undefined) {\n return typeof requires.room === \"string\"\n ? `the sending socket in the app room ${code(requires.room)}`\n : \"the sending socket in the app room a function of the payload names\";\n }\n return requires.collection === undefined\n ? `a subscription to the row ${selector(requires.entity)} names`\n : `a subscription to the ${code(requires.collection)} scope ${selector(requires.scope)} names`;\n}\n\nfunction channelSection(\n name: string,\n channel: ChannelDef,\n access: AccessInfo | undefined,\n): string[] {\n const rate = channel.ratePerSecond ?? CHANNEL_DEFAULT_RATE;\n const served = access?.service?.channels.has(name) === true;\n return section(`### ${code(name)}`, [\n optionTable([\n [\"Payload\", code(typeOf(channel.payload, \"input\"))],\n [\n \"Rate\",\n `${rate} a second per socket${channel.ratePerSecond === undefined ? \" (default)\" : \"\"}`,\n ],\n [\n \"Burst\",\n channel.burst === undefined ? `${Math.max(1, 2 * rate)} (default)` : String(channel.burst),\n ],\n [\"Requires\", requiresText(channel.requires)],\n [\"Access\", served ? accessFormText(access?.service?.channels.get(name)) : undefined],\n ]),\n ]);\n}\n\nfunction eventSection(name: string, event: EventDef): string[] {\n return section(`### ${code(name)}`, [\n optionTable([[\"Payload\", code(typeOf(event.payload, \"output\"))]]),\n ]);\n}\n\nfunction membersSection<Def>(\n heading: string,\n intro: string,\n members: Readonly<Record<string, Def>>,\n render: (name: string, def: Def) => string[],\n): string[] {\n const entries = Object.entries(members);\n return entries.length === 0\n ? []\n : [heading, \"\", intro, \"\", ...entries.flatMap(([name, def]) => render(name, def))];\n}\n\n/** The fields a caller needs a level on the row to receive, as `name` (level). */\nfunction fieldLevelsText(contract: AnyContract): string {\n const tiers = Object.entries(contract.fields);\n return tiers.length === 0\n ? \"none: every caller who may read a row receives all of it\"\n : tiers.map(([field, level]) => `${code(field)}: ${String(level)}`).join(\", \");\n}\n\n/** The page's \"Access\" section, with `--services`: the service's policy, bypass, topic and field levels. */\nfunction accessSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n if (access === undefined) {\n return [];\n }\n const { service } = access;\n if (service === undefined) {\n return section(\"## Access\", [\n `The services module defines no ${code(contract.name)}: who may call its methods is not documented.`,\n ]);\n }\n return section(\"## Access\", [\n optionTable([\n [\"Row policy\", policyText(service.policy)],\n [\n \"Service-wide Admin\",\n service.adminBypass\n ? \"passes every check of the service\"\n : `passes only the forms that name ${code(\"service\")} (${code(\"adminBypass: false\")})`,\n ],\n [\"Change topic\", watchAccessText(service.watchAccess)],\n [\"Field levels\", fieldLevelsText(contract)],\n ]),\n \"Each method below says who may call it.\",\n ]);\n}\n\n/**\n * One service's page: its entity, projections, methods, collections,\n * streams, channels and events, and with `access` (`--services`) who may\n * call what.\n */\nexport function renderService(contract: AnyContract, access?: AccessInfo): string {\n const lines = [\n GENERATED_MARKER,\n \"\",\n `# ${contract.name}`,\n \"\",\n ...accessSection(contract, access),\n ...entitySection(contract),\n ...projectionsSection(contract),\n ...methodsSection(contract, access),\n ...collectionsSection(contract, access),\n ...membersSection(\n \"## Streams\",\n \"Feeds of items the server appends; a subscriber starts from the stream's seed.\",\n contract.streams,\n (name, stream: StreamDef) => streamSection(name, stream, access),\n ),\n ...membersSection(\n \"## Channels\",\n \"Fire-and-forget messages from clients, dropped over the rate.\",\n contract.channels,\n (name, channel: ChannelDef) => channelSection(name, channel, access),\n ),\n ...membersSection(\n \"## Events\",\n \"Typed events the server sends to the sockets in a room.\",\n contract.events,\n eventSection,\n ),\n ];\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** The file a service's page is written to: its name, made safe for a file name. */\nexport function fileOf(contract: AnyContract): string {\n return `${contract.name.replace(/[^\\w.-]/g, \"-\")}.md`;\n}\n\n/** The index page: every service with a link to its page and its members counted. */\nexport function renderIndex(contracts: readonly AnyContract[]): string {\n const count = (members: object): string => String(Object.keys(members).length);\n const rows = contracts.map((contract) => [\n `[${contract.name}](${fileOf(contract)})`,\n count(contract.methods),\n count(contract.collections),\n count(contract.streams),\n count(contract.channels),\n count(contract.events),\n ]);\n const lines = [\n GENERATED_MARKER,\n \"\",\n \"# API reference\",\n \"\",\n \"One page per service, generated from its contract by `quickdraw-docs`.\",\n \"\",\n ...table([\"Service\", \"Methods\", \"Collections\", \"Streams\", \"Channels\", \"Events\"], rows),\n ];\n return `${lines.join(\"\\n\")}\\n`;\n}\n"],"mappings":"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","names":["process","isRecord","isRecord","code","process"]}
1
+ {"version":3,"sources":["../../src/cli/quickdraw-docs.ts","../../src/cli/docs.ts","../../src/cli/markdown.ts","../../src/cli/access.ts","../../src/cli/dependencies.ts","../../src/cli/schemaText.ts","../../src/cli/render.ts"],"sourcesContent":["#!/usr/bin/env node\n// The `quickdraw-docs` command (bin in package.json): Markdown API docs from\n// an app's contracts. The work is in `docs.ts`; `quickdraw-docs --help`\n// prints the usage.\n\nimport process from \"node:process\";\nimport { main } from \"./docs\";\n\nprocess.exitCode = await main(process.argv.slice(2), {\n out: (text) => {\n process.stdout.write(text);\n },\n err: (text) => {\n process.stderr.write(text);\n },\n});\n","// `quickdraw-docs`: Markdown API docs generated from an app's contracts\n// (RFC 0003 sections 2 and 12.5), one page per service plus an index. It\n// loads a module, takes every contract it exports (alone, or in a map such\n// as the one given to `createQuickdrawClient`), and writes the pages; with\n// `--check` it writes nothing and exits 1 when the pages on disk differ. It\n// reads contracts, never source code, so what it documents is what clients\n// are typed from. With `--services <module>` (a module exporting the\n// services, each or in a list, as the server takes them) each page also says\n// who may call what: each method's access form and `rowless`, the service's\n// row policy, admin bypass, `watchAccess` and field levels, who may open a\n// collection's scope, a channel's access, a stream's computed seed\n// (`access.ts`), and which other services it depends on, with a graph of\n// those on the index (`dependencies.ts`); without it the pages are the\n// contracts' alone.\n//\n// quickdraw-docs packages/shared/src/contracts/index.ts --out docs/api\n// quickdraw-docs packages/shared/src/contracts/index.ts --services apps/api/src/services/index.ts\n// quickdraw-docs packages/shared/src/contracts/index.ts --out docs/api --check\n//\n// A TypeScript module is imported as Node imports it (Node 24 strips types),\n// and through `tsx` when that fails and the project has `tsx` installed, so\n// extensionless imports and `tsconfig` paths work too. The services module\n// loads every module the server does, so a workspace package whose\n// `package.json` points at its build must be built first (finding F6.7 of\n// the quickdraw-chat migration): a missing built file is reported with that\n// hint (`buildHint`).\n\nimport { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { join, relative, resolve } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport type { AnyContract } from \"../contract/defineContract\";\nimport { servicesOf, type ServiceDoc } from \"./access\";\nimport { dependenciesOf } from \"./dependencies\";\nimport { fileOf, GENERATED_MARKER, renderIndex, renderService } from \"./render\";\n\nconst USAGE = `Usage: quickdraw-docs <module> [--services <module>] [--out <dir>] [--check]\n\n <module> a module exporting the app's contracts: each one, or a map of them\n --services <module> a module exporting the services (each, or a list of them): the pages\n then also say who may call each method, from the services' access,\n and which services each depends on, with a graph on the index\n --out <dir> where the pages go: one per service, plus README.md (default: docs/api)\n --check write nothing; exit 1 when the pages on disk differ from the contracts\n`;\n\n/** The index page's file name. */\nexport const INDEX_FILE = \"README.md\";\n\n/** Where `main` writes its output; the CLI passes the process's streams. */\nexport interface DocsOutput {\n out(text: string): void;\n err(text: string): void;\n}\n\nconst CONTRACT_KEYS = [\n \"projections\",\n \"fields\",\n \"methods\",\n \"collections\",\n \"streams\",\n \"channels\",\n \"events\",\n] as const;\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** True for what `defineContract` returns: a frozen object with a name and every member map. */\nexport function isContract(value: unknown): value is AnyContract {\n return (\n isRecord(value) &&\n Object.isFrozen(value) &&\n typeof value.name === \"string\" &&\n \"entity\" in value &&\n CONTRACT_KEYS.every((key) => isRecord(value[key]))\n );\n}\n\n/**\n * Every contract a module exports, directly or as the values of an exported\n * map (`{ task, project }`), in name order. Two different contracts with one\n * service name are an error, as they would be on a server.\n */\nexport function contractsOf(exports: Readonly<Record<string, unknown>>): AnyContract[] {\n const found = new Map<string, AnyContract>();\n const add = (contract: AnyContract): void => {\n const known = found.get(contract.name);\n if (known !== undefined && known !== contract) {\n throw new Error(`two different contracts are named \"${contract.name}\"`);\n }\n found.set(contract.name, contract);\n };\n for (const value of Object.values(exports)) {\n if (isContract(value)) {\n add(value);\n } else if (isRecord(value)) {\n Object.values(value).filter(isContract).forEach(add);\n }\n }\n return [...found.values()].sort((a, b) => (a.name < b.name ? -1 : a.name > b.name ? 1 : 0));\n}\n\n/** Options of {@link generateDocs}. */\nexport interface GenerateOptions {\n /**\n * The app's services by name (`servicesOf`): each page then says who may\n * call what. A service no contract documents is an error.\n */\n readonly services?: ReadonlyMap<string, ServiceDoc>;\n}\n\n/** The pages for `contracts`: file name to content, the index included. */\nexport function generateDocs(\n contracts: readonly AnyContract[],\n options: GenerateOptions = {},\n): ReadonlyMap<string, string> {\n const { services } = options;\n if (services !== undefined) {\n const documented = new Set(contracts.map((contract) => contract.name));\n const strays = [...services.keys()].filter((name) => !documented.has(name));\n if (strays.length > 0) {\n throw new Error(\n `the services module defines ${strays.join(\", \")}, but the contracts module exports no contract of ${strays.length === 1 ? \"that name\" : \"those names\"}`,\n );\n }\n }\n const dependencies = services === undefined ? undefined : dependenciesOf(contracts, services);\n const files = new Map<string, string>();\n for (const contract of contracts) {\n const file = fileOf(contract);\n if (file === INDEX_FILE || files.has(file)) {\n throw new Error(`the page of ${contract.name} would overwrite ${file}`);\n }\n files.set(\n file,\n renderService(\n contract,\n services === undefined\n ? undefined\n : {\n service: services.get(contract.name),\n dependencies: dependencies?.get(contract.name),\n },\n ),\n );\n }\n files.set(INDEX_FILE, renderIndex(contracts, dependencies));\n return files;\n}\n\n/** What `syncDocs` found or did, file by file. */\nexport interface DocsReport {\n readonly written: readonly string[];\n readonly unchanged: readonly string[];\n readonly removed: readonly string[];\n}\n\nfunction readText(path: string): string | undefined {\n try {\n return readFileSync(path, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** The generated pages already in `dir`: Markdown files that start with the marker. */\nfunction generatedIn(dir: string): string[] {\n if (!existsSync(dir)) {\n return [];\n }\n return readdirSync(dir)\n .filter((name) => name.endsWith(\".md\"))\n .filter((name) => readText(join(dir, name))?.startsWith(GENERATED_MARKER) === true)\n .sort();\n}\n\n/**\n * Brings `dir` in line with `files`: writes what differs and removes the\n * generated pages no contract makes any more. With `check`, it changes\n * nothing and reports the same as what it would do. A file that does not\n * start with the generated marker is never replaced or removed: one in the\n * way of a page fails the whole run before anything is written.\n */\nexport function syncDocs(\n files: ReadonlyMap<string, string>,\n dir: string,\n check: boolean,\n): DocsReport {\n const foreign = [...files.keys()].filter((name) => {\n const existing = readText(join(dir, name));\n return existing !== undefined && !existing.startsWith(GENERATED_MARKER);\n });\n if (foreign.length > 0) {\n throw new Error(\n `${foreign.join(\", \")} in ${dir} ${foreign.length === 1 ? \"was\" : \"were\"} not written by quickdraw-docs: move ${foreign.length === 1 ? \"it\" : \"them\"}, or write the pages to another --out`,\n );\n }\n const written: string[] = [];\n const unchanged: string[] = [];\n for (const [name, content] of files) {\n if (readText(join(dir, name)) === content) {\n unchanged.push(name);\n continue;\n }\n written.push(name);\n if (!check) {\n mkdirSync(dir, { recursive: true });\n writeFileSync(join(dir, name), content);\n }\n }\n const removed = generatedIn(dir).filter((name) => !files.has(name));\n if (!check) {\n for (const name of removed) {\n rmSync(join(dir, name));\n }\n }\n return { written, unchanged, removed };\n}\n\n/** `tsx`'s `tsImport`, from the project around `dir`, when it is installed there. */\nasync function tsxImport(\n dir: string,\n): Promise<((specifier: string, parent: string) => Promise<unknown>) | undefined> {\n let resolved: string;\n try {\n resolved = createRequire(join(dir, \"package.json\")).resolve(\"tsx/esm/api\");\n } catch {\n return undefined;\n }\n const api = (await import(pathToFileURL(resolved).href)) as { readonly tsImport?: unknown };\n return typeof api.tsImport === \"function\"\n ? (api.tsImport as (specifier: string, parent: string) => Promise<unknown>)\n : undefined;\n}\n\n/**\n * Node's codes for a module it could not resolve or load as written: an\n * extensionless import or a `tsconfig` path, a directory import, `.tsx`, or\n * TypeScript its type stripping cannot run. `tsx` may load those.\n */\nconst LOADER_ERRORS: ReadonlySet<string> = new Set([\n \"ERR_MODULE_NOT_FOUND\",\n \"ERR_UNSUPPORTED_DIR_IMPORT\",\n \"ERR_UNKNOWN_FILE_EXTENSION\",\n \"ERR_UNSUPPORTED_TYPESCRIPT_SYNTAX\",\n \"ERR_INVALID_TYPESCRIPT_SYNTAX\",\n \"ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING\",\n]);\n\n/**\n * True when importing failed in Node's loader (see {@link LOADER_ERRORS}),\n * not in the module's own code: only then is the module loaded again\n * through `tsx`, so a module that throws runs once and reports its own error.\n */\nexport function failedToLoad(error: unknown): boolean {\n const code: unknown =\n typeof error === \"object\" && error !== null ? Reflect.get(error, \"code\") : undefined;\n return typeof code === \"string\" && LOADER_ERRORS.has(code);\n}\n\n/** A built file a package's `package.json` points at: under a `dist/` or `build/` directory. */\nconst BUILT_FILE = /[\\\\/](?:dist|build)[\\\\/]/;\n\n/**\n * `error` with a hint when it names a missing built file: a workspace\n * package the module imports was not built (`bun run build` first); else\n * `error` itself.\n */\nexport function buildHint(error: unknown, file: string, cwd: string): unknown {\n const message = error instanceof Error ? error.message : String(error);\n if (Reflect.get(Object(error), \"code\") !== \"ERR_MODULE_NOT_FOUND\" || !BUILT_FILE.test(message)) {\n return error;\n }\n return new Error(\n `could not import ${relative(cwd, file)}: ${message}. A workspace package it imports loads from its build, which is missing: build the workspace (bun run build) before generating the docs`,\n { cause: error },\n );\n}\n\n/** Imports the module at `file`: natively, then through `tsx` for TypeScript Node cannot load alone. */\nasync function importModule(file: string, cwd: string): Promise<Readonly<Record<string, unknown>>> {\n const url = pathToFileURL(file).href;\n try {\n return (await import(url)) as Readonly<Record<string, unknown>>;\n } catch (error) {\n if (!/\\.[cm]?tsx?$/.test(file) || !failedToLoad(error)) {\n throw buildHint(error, file, cwd);\n }\n const tsImport = await tsxImport(cwd);\n if (tsImport === undefined) {\n throw new Error(\n `could not import ${relative(cwd, file)} (${error instanceof Error ? error.message : String(error)}); install tsx in the project to load TypeScript with extensionless imports or tsconfig paths`,\n { cause: error },\n );\n }\n try {\n return (await tsImport(url, pathToFileURL(join(cwd, \"package.json\")).href)) as Readonly<\n Record<string, unknown>\n >;\n } catch (again) {\n throw buildHint(again, file, cwd);\n }\n }\n}\n\ninterface Options {\n readonly module: string;\n readonly services: string | undefined;\n readonly out: string;\n readonly check: boolean;\n}\n\n/** The options in `args`, or the usage problem. */\nfunction parseArgs(args: readonly string[]): Options | string {\n let target: string | undefined;\n let services: string | undefined;\n let out = \"docs/api\";\n let check = false;\n for (let index = 0; index < args.length; index += 1) {\n const arg = args[index];\n const value = args[index + 1];\n if (arg === \"--check\") {\n check = true;\n } else if (arg === \"--out\" || arg === \"--services\") {\n if (value === undefined || value.startsWith(\"-\")) {\n return arg === \"--out\" ? \"--out needs a directory\" : \"--services needs a module\";\n }\n if (arg === \"--out\") {\n out = value;\n } else {\n services = value;\n }\n index += 1;\n } else if (arg !== undefined && !arg.startsWith(\"-\") && target === undefined) {\n target = arg;\n } else {\n return `unknown argument \"${String(arg)}\"`;\n }\n }\n return target === undefined\n ? \"name the module that exports the contracts\"\n : { module: target, services, out, check };\n}\n\nfunction report(result: DocsReport, out: string, check: boolean, io: DocsOutput): number {\n if (!check) {\n io.out(\n `quickdraw-docs: ${out}: ${result.written.length} written, ${result.unchanged.length} unchanged, ${result.removed.length} removed\\n`,\n );\n return 0;\n }\n const drift = [\n ...result.written.map((name) => `${name} differs from the contracts`),\n ...result.removed.map((name) => `${name} documents a service no contract has`),\n ];\n if (drift.length === 0) {\n io.out(`quickdraw-docs: ${out} matches the contracts\\n`);\n return 0;\n }\n io.err(\n `${drift.map((line) => `quickdraw-docs: ${out}/${line}\\n`).join(\"\")}quickdraw-docs: ${drift.length} page(s) out of date: run quickdraw-docs without --check\\n`,\n );\n return 1;\n}\n\n/**\n * Runs the command with `args` (the arguments after `quickdraw-docs`) in\n * `cwd`, and resolves with its exit code: 0, 1 when `--check` finds drift\n * or the module cannot be documented, 2 for a usage error.\n */\nexport async function main(\n args: readonly string[],\n io: DocsOutput,\n cwd: string = process.cwd(),\n): Promise<number> {\n if (args.includes(\"--help\") || args.includes(\"-h\")) {\n io.out(USAGE);\n return 0;\n }\n const options = parseArgs(args);\n if (typeof options === \"string\") {\n io.err(`quickdraw-docs: ${options}\\n\\n${USAGE}`);\n return 2;\n }\n try {\n const contracts = contractsOf(await importModule(resolve(cwd, options.module), cwd));\n if (contracts.length === 0) {\n throw new Error(`${options.module} exports no contract`);\n }\n const services =\n options.services === undefined\n ? undefined\n : servicesOf(await importModule(resolve(cwd, options.services), cwd));\n if (services?.size === 0) {\n throw new Error(`${String(options.services)} exports no service`);\n }\n const files = generateDocs(contracts, services === undefined ? {} : { services });\n const result = syncDocs(files, resolve(cwd, options.out), options.check);\n return report(result, options.out, options.check, io);\n } catch (error) {\n io.err(`quickdraw-docs: ${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n }\n}\n","// Markdown helpers the generators share (`quickdraw-docs` and\n// `quickdraw-protocol`). What they write is laid out the way oxfmt and\n// Prettier lay out Markdown (aligned tables, one blank line between blocks),\n// so formatting a generated file leaves it as it is and `--check` does not\n// report formatting as drift.\n\nconst WIDE =\n /[ᄀ-ᅟ⺀-꓏가-힣豈-﫿︰-﹏＀-⦆¢-₩\\u{1f300}-\\u{1f64f}\\u{1f900}-\\u{1f9ff}\\u{20000}-\\u{3fffd}]/u;\n\n/** How wide a table cell is, as Prettier measures it: wide characters count twice. */\nfunction widthOf(text: string): number {\n let width = 0;\n for (const char of text) {\n width += WIDE.test(char) ? 2 : 1;\n }\n return width;\n}\n\n/** A table cell: one line, with its pipes escaped. */\nfunction cell(text: string): string {\n return text.replace(/\\s*\\n\\s*/g, \" \").replace(/\\|/g, \"\\\\|\");\n}\n\n/** A Markdown table with its columns aligned. */\nexport function table(header: readonly string[], rows: readonly (readonly string[])[]): string[] {\n const cells = [header, ...rows].map((row) => header.map((_, column) => cell(row[column] ?? \"\")));\n const widths = header.map((_, column) =>\n Math.max(3, ...cells.map((row) => widthOf(row[column] ?? \"\"))),\n );\n const line = (row: readonly string[]): string =>\n `| ${row.map((text, column) => text + \" \".repeat((widths[column] ?? 3) - widthOf(text))).join(\" | \")} |`;\n const [head = [], ...body] = cells;\n return [\n line(head),\n `| ${widths.map((width) => \"-\".repeat(width)).join(\" | \")} |`,\n ...body.map(line),\n ];\n}\n\n/** Inline code, with a longer fence when the text holds a backtick. */\nexport function code(text: string): string {\n return text.includes(\"`\") ? `\\`\\` ${text} \\`\\`` : `\\`${text}\\``;\n}\n\n/** Names as inline code, separated by commas. */\nexport function list(names: readonly string[]): string {\n return names.map(code).join(\", \");\n}\n\n/** A paragraph of source text, trimmed line by line. */\nexport function paragraph(text: string): string {\n return text\n .split(\"\\n\")\n .map((line) => line.trim())\n .join(\"\\n\")\n .trim();\n}\n\n/** One section: a heading and its blocks, each followed by a blank line. */\nexport function section(\n heading: string,\n blocks: readonly (string | readonly string[])[],\n): string[] {\n const lines = [heading, \"\"];\n for (const block of blocks) {\n lines.push(...(typeof block === \"string\" ? [block] : block), \"\");\n }\n return lines;\n}\n","// Who may call what, for `quickdraw-docs --services` (finding F5.3 of the\n// quickdraw-chat migration: 4.x's generator printed each method's access\n// level, while 5.0's read contracts alone, which do not say). The services\n// module's `defineService` results are read as data: each method's access\n// form, `rowless` and principal kinds, the service's row policy, admin\n// bypass, kinds and `watchAccess`, its `model`, `writes` and `affects`\n// (`dependencies.ts`), who may open each collection, each channel's access,\n// and each stream's computed seed and validation. Functions (a `custom` check,\n// an `id` selector, a `resolver`) are named, never printed. A service is\n// recognized by its shape, not by identity, so a services module that loaded\n// its own copy of the framework is read as well.\n\nimport { code } from \"./markdown\";\n\ntype UnknownRecord = Readonly<Record<string, unknown>>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** One method of a defined service, as the docs read it. */\nexport interface MethodAccessDoc {\n /** Its access form, as `defineService` checked it. */\n readonly access: unknown;\n /** It said `rowless: true`. */\n readonly rowless: boolean;\n /** The kinds of principal that may call it (its own, its service's or the app's); `undefined`: every kind. */\n readonly kinds: readonly string[] | undefined;\n}\n\n/** What the docs read of one collection of a defined service. */\nexport interface CollectionAccessDoc {\n /** The level a subscriber needs on the anchor row. */\n readonly level: unknown;\n /** The contract of the rows scope values are ids of; `undefined` for a `\"self\"` scope. */\n readonly anchor: unknown;\n}\n\n/** What the docs read of one stream of a defined service. */\nexport interface StreamServiceDoc {\n /** The service computes each subscriber's seed. */\n readonly computedSeed: boolean;\n /** When pushed items are checked: `\"always\"` or `\"development\"`. */\n readonly validate: unknown;\n}\n\n/** What the docs read of one defined service. */\nexport interface ServiceDoc {\n readonly name: string;\n /** The database model its rows live in, or `undefined` without one. */\n readonly model: string | undefined;\n /** The other models its handlers write (`writes`). */\n readonly writes: readonly string[];\n /** The services whose rows a write to one of its own changes too (`affects`), by name. */\n readonly affects: readonly string[];\n /** Its row policy, or `undefined` without one. */\n readonly policy: unknown;\n /** Whether a service-wide `Admin` grant passes every check. */\n readonly adminBypass: boolean;\n /** The kinds of principal it admits (its own or the app's); `undefined`: every kind. */\n readonly kinds: readonly string[] | undefined;\n /** Who may watch its change topic, or `undefined`: closed. */\n readonly watchAccess: unknown;\n readonly methods: ReadonlyMap<string, MethodAccessDoc>;\n readonly collections: ReadonlyMap<string, CollectionAccessDoc>;\n /** Per channel: the access form its handler is called under. */\n readonly channels: ReadonlyMap<string, unknown>;\n readonly streams: ReadonlyMap<string, StreamServiceDoc>;\n}\n\n/** `value` as a map of named records, or `undefined` when it is not one. */\nfunction recordsOf(value: unknown): ReadonlyMap<string, UnknownRecord> | undefined {\n if (!(value instanceof Map)) {\n return undefined;\n }\n for (const [key, member] of value as Map<unknown, unknown>) {\n if (typeof key !== \"string\" || !isRecord(member)) {\n return undefined;\n }\n }\n return value as ReadonlyMap<string, UnknownRecord>;\n}\n\n/** A `kinds` list as a service holds it, or `undefined` for anything else (every kind). */\nfunction kindsOf(value: unknown): readonly string[] | undefined {\n return Array.isArray(value) && value.every((kind) => typeof kind === \"string\")\n ? (value as readonly string[])\n : undefined;\n}\n\n/** A list of names as a service holds it (`writes`), or none for anything else. */\nfunction namesOf(value: unknown): readonly string[] {\n return Array.isArray(value) ? value.filter((name) => typeof name === \"string\") : [];\n}\n\n/** Each named member of `records`, read by `read`. */\nfunction mapEach<T>(\n records: ReadonlyMap<string, UnknownRecord>,\n read: (record: UnknownRecord) => T,\n): ReadonlyMap<string, T> {\n return new Map([...records].map(([name, record]) => [name, read(record)]));\n}\n\n/**\n * The service `value` is, read as the docs need it, or `undefined` for\n * anything that is not what `defineService` returns: an object with a name,\n * a contract, one record per method (its access form and handler), and its\n * collections, channels and streams as maps.\n */\nexport function serviceDocOf(value: unknown): ServiceDoc | undefined {\n if (!isRecord(value) || typeof value.name !== \"string\" || !isRecord(value.contract)) {\n return undefined;\n }\n const { methods } = value;\n const collections = recordsOf(value.collections);\n const channels = recordsOf(value.channels);\n const streams = recordsOf(value.streams);\n if (\n !isRecord(methods) ||\n collections === undefined ||\n channels === undefined ||\n streams === undefined ||\n !Object.values(methods).every(\n (method) => isRecord(method) && typeof method.handler === \"function\" && \"access\" in method,\n )\n ) {\n return undefined;\n }\n return Object.freeze({\n name: value.name,\n model: typeof value.model === \"string\" ? value.model : undefined,\n writes: namesOf(value.writes),\n affects: Array.isArray(value.affects)\n ? value.affects\n .map((link: unknown) => contractName(isRecord(link) ? link.service : undefined))\n .filter((name) => name !== undefined)\n : [],\n policy: value.access,\n adminBypass: value.adminBypass !== false,\n kinds: kindsOf(value.kinds),\n watchAccess: value.watchAccess,\n methods: new Map(\n Object.entries(methods as Readonly<Record<string, UnknownRecord>>).map(([name, method]) => [\n name,\n { access: method.access, rowless: method.rowless === true, kinds: kindsOf(method.kinds) },\n ]),\n ),\n collections: mapEach(collections, (collection) => ({\n level: collection.access,\n anchor: collection.anchor,\n })),\n channels: mapEach(channels, (channel) => channel.access),\n streams: mapEach(streams, (stream) => ({\n computedSeed: typeof stream.computeSeed === \"function\",\n validate: stream.validate,\n })),\n });\n}\n\n/**\n * Every service a module exports, directly or in an exported list or map,\n * by name. Two different services with one name are an error, as they would\n * be on a server.\n */\nexport function servicesOf(exports: UnknownRecord): ReadonlyMap<string, ServiceDoc> {\n const found = new Map<string, { readonly from: unknown; readonly doc: ServiceDoc }>();\n const add = (value: unknown): void => {\n const doc = serviceDocOf(value);\n if (doc === undefined) {\n return;\n }\n const known = found.get(doc.name);\n if (known !== undefined && known.from !== value) {\n throw new Error(`two different services are named \"${doc.name}\"`);\n }\n found.set(doc.name, { from: value, doc });\n };\n for (const value of Object.values(exports)) {\n if (serviceDocOf(value) !== undefined) {\n add(value);\n } else if (Array.isArray(value)) {\n value.forEach(add);\n } else if (isRecord(value)) {\n Object.values(value).forEach(add);\n }\n }\n return new Map(\n [...found]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, { doc }]) => [name, doc]),\n );\n}\n\n/** The service name of `contract`, or `undefined` when it is not a contract. */\nexport function contractName(contract: unknown): string | undefined {\n return isRecord(contract) && typeof contract.name === \"string\" ? contract.name : undefined;\n}\n\n/** A contract's service name, for a form or policy that names one. */\nfunction serviceName(contract: unknown): string {\n return contractName(contract) ?? \"another service\";\n}\n\n/** Which row an `entry` or `scope` form is about, as declared and in words. */\nfunction idOf(id: unknown): { readonly declared: string; readonly words: string } {\n if (id === undefined) {\n return { declared: \"\", words: code(\"input.id\") };\n }\n return typeof id === \"string\"\n ? { declared: `, id: \"${id}\"`, words: code(`input.${id}`) }\n : { declared: \", id: (input) => ...\", words: \"a function of the input\" };\n}\n\n/** A method's (or a topic's, or a channel's) access form, as declared, then in words. */\nexport function accessFormText(form: unknown): string {\n if (form === \"public\") {\n return `${code('\"public\"')}: anyone, signed in or not`;\n }\n if (form === \"authenticated\") {\n return `${code('\"authenticated\"')}: any signed-in caller`;\n }\n if (!isRecord(form)) {\n return \"not readable\";\n }\n if (form.kind === \"custom\") {\n return `${code(\"custom(check)\")}: a signed-in caller the service's own check lets through`;\n }\n const id = idOf(form.id);\n if (typeof form.scope === \"string\") {\n const of = serviceName(form.of);\n return `${code(`{ scope: \"${form.scope}\", of: ${of}${id.declared} }`)}: ${form.scope} or more on the ${code(of)} row ${id.words} names`;\n }\n const service = typeof form.service === \"string\" ? form.service : undefined;\n const entry = typeof form.entry === \"string\" ? form.entry : undefined;\n const declared = [\n service === undefined ? undefined : `service: \"${service}\"`,\n entry === undefined ? undefined : `entry: \"${entry}\"${id.declared}`,\n ].filter((part) => part !== undefined);\n const words = [\n service === undefined ? undefined : `a service-wide grant of ${service} or more`,\n entry === undefined ? undefined : `${entry} or more on the row ${id.words} names`,\n ].filter((part) => part !== undefined);\n return `${code(`{ ${declared.join(\", \")} }`)}: ${words.join(\", or \")}`;\n}\n\n/** How deep `anyOf` members are written out before they are only named. */\nconst MAX_POLICY_DEPTH = 3;\n\n/** A row policy, in words. */\nexport function policyText(policy: unknown, depth = 0): string {\n if (!isRecord(policy) || typeof policy.kind !== \"string\") {\n return \"none: its methods take no `entry` form\";\n }\n const column = (name: unknown): string => code(String(name));\n switch (policy.kind) {\n case \"owner\":\n return `${code(\"owner\")}: Admin for the user the ${column(policy.field)} column names`;\n case \"jsonAcl\": {\n const owner =\n typeof policy.owner === \"string\"\n ? `, and Admin for the user the ${column(policy.owner)} column names`\n : \"\";\n return `${code(\"jsonAcl\")}: the level the ${column(policy.field)} column lists for the user${owner}`;\n }\n case \"members\": {\n const read = isRecord(policy.membership) ? policy.membership : {};\n return `${code(\"members\")}: the role in the user's ${column(read.model)} row (${column(read.entry)} names the row, ${column(read.user)} the user, ${column(read.level)} the role)`;\n }\n case \"inherit\":\n return `${code(\"inherit\")}: the level on the ${code(serviceName(policy.from))} row the ${column(policy.via)} column names`;\n case \"anyOf\": {\n const members = Array.isArray(policy.policies) ? (policy.policies as unknown[]) : [];\n return depth >= MAX_POLICY_DEPTH\n ? code(\"anyOf\")\n : `${code(\"anyOf\")}: the highest level of ${members.map((member) => `(${policyText(member, depth + 1)})`).join(\", \")}`;\n }\n case \"resolver\":\n return `${code(\"resolver\")}: the service's own code`;\n case \"everyone\":\n return `${code(\"everyone\")}: ${String(policy.level)} for every signed-in user, on every row`;\n default:\n return code(policy.kind);\n }\n}\n\n/** Who may watch a service's change topic. */\nexport function watchAccessText(watch: unknown): string {\n return watch === undefined\n ? `closed: the service declares no ${code(\"watchAccess\")}`\n : accessFormText(watch);\n}\n\n/** Who may open a scope of a collection. */\nexport function collectionAccessText(collection: CollectionAccessDoc): string {\n if (collection.anchor === undefined) {\n return `the subscriber's own user id (${code('scopeAccess: \"self\"')})`;\n }\n return `${String(collection.level)} or more on the ${code(serviceName(collection.anchor))} row the scope names`;\n}\n","// Which services depend on which, for `quickdraw-docs --services`: the other\n// services each one's declarations name. A service depends on another when\n// its row policy `inherit`s from it (inside `anyOf` too), it `writes` the\n// model that service's rows live in, a write to its rows `affects` that\n// service's, a method, channel or stream takes a `{ scope, of }` form of it,\n// or a collection is anchored on its rows. Only declarations are read, never\n// source: a handler that reads another service's rows without declaring it\n// shows nothing here. A page writes them as its \"Depends on\" section, and\n// the index as a Mermaid graph (`render.ts`).\n\nimport type { AnyContract } from \"../contract/defineContract\";\nimport { contractName, type ServiceDoc } from \"./access\";\nimport { code, list, section, table } from \"./markdown\";\n\n/** How one service names another, as the graph's edge labels say it. */\nexport type DependencyKind = \"inherit\" | \"writes\" | \"affects\" | \"scope\" | \"anchor\";\n\n/** The order kinds are written in, on a page and on an edge. */\nconst KINDS: readonly DependencyKind[] = [\"inherit\", \"writes\", \"affects\", \"scope\", \"anchor\"];\n\n/** One declaration that names another service. */\nexport interface DependencyReason {\n readonly kind: DependencyKind;\n /** The declaration, in words (Markdown). */\n readonly text: string;\n}\n\n/** Another service one service depends on, and every declaration that says so. */\nexport interface ServiceDependency {\n readonly service: string;\n readonly reasons: readonly DependencyReason[];\n}\n\n/** What one service depends on. */\nexport interface ServiceDependencies {\n /** The services its declarations name, by name. */\n readonly services: readonly ServiceDependency[];\n /** The models it `writes` that no service's rows live in. */\n readonly models: readonly string[];\n}\n\ntype UnknownRecord = Readonly<Record<string, unknown>>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/** A model name in the client's spelling, as `modelKey` writes it: `\"TaskLabel\"` is `\"taskLabel\"`. */\nfunction modelKey(model: string): string {\n return `${model.charAt(0).toLowerCase()}${model.slice(1)}`;\n}\n\n/** How deep `anyOf` policies are searched for an `inherit`, as `policyText` writes them. */\nconst MAX_POLICY_DEPTH = 3;\n\n/** Every `inherit` of a row policy, with its parent's name and the column that names the parent row. */\nfunction inheritsOf(policy: unknown, depth = 0): { readonly from: string; readonly via: string }[] {\n if (!isRecord(policy)) {\n return [];\n }\n if (policy.kind === \"inherit\") {\n const from = contractName(policy.from);\n return from === undefined ? [] : [{ from, via: String(policy.via) }];\n }\n if (policy.kind === \"anyOf\" && Array.isArray(policy.policies) && depth < MAX_POLICY_DEPTH) {\n return policy.policies.flatMap((member: unknown) => inheritsOf(member, depth + 1));\n }\n return [];\n}\n\n/** The service a `{ scope, of }` form names, or `undefined` for every other form. */\nfunction scopeOf(form: unknown): string | undefined {\n return isRecord(form) && typeof form.scope === \"string\" ? contractName(form.of) : undefined;\n}\n\n/** The services one service's declarations name, with the model owners `writes` resolves through. */\nfunction dependenciesOfService(\n service: ServiceDoc,\n contract: AnyContract | undefined,\n owners: ReadonlyMap<string, readonly string[]>,\n): ServiceDependencies {\n const found = new Map<string, DependencyReason[]>();\n const add = (target: string | undefined, kind: DependencyKind, text: string): void => {\n if (target === undefined || target === service.name) {\n return;\n }\n found.set(target, [...(found.get(target) ?? []), { kind, text }]);\n };\n for (const { from, via } of inheritsOf(service.policy)) {\n add(from, \"inherit\", `row policy: ${code(\"inherit\")} through the ${code(via)} column`);\n }\n const models: string[] = [];\n for (const model of service.writes) {\n const serving = owners.get(modelKey(model)) ?? [];\n if (serving.length === 0) {\n models.push(model);\n }\n for (const owner of serving) {\n add(owner, \"writes\", `${code(\"writes\")}: its ${code(model)} model`);\n }\n }\n for (const target of new Set(service.affects)) {\n add(target, \"affects\", `${code(\"affects\")}: a write to a row here changes its rows`);\n }\n for (const [name, method] of service.methods) {\n add(scopeOf(method.access), \"scope\", `method ${code(name)}: ${code(\"{ scope, of }\")}`);\n }\n for (const [name, access] of service.channels) {\n add(scopeOf(access), \"scope\", `channel ${code(name)}: ${code(\"{ scope, of }\")}`);\n }\n for (const [name, stream] of Object.entries(contract?.streams ?? {})) {\n add(scopeOf(stream.access), \"scope\", `stream ${code(name)}: ${code(\"{ scope, of }\")}`);\n }\n for (const [name, collection] of service.collections) {\n add(\n contractName(collection.anchor),\n \"anchor\",\n `collection ${code(name)}: anchored on its rows`,\n );\n }\n return {\n services: [...found]\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([name, reasons]) => ({\n service: name,\n reasons: KINDS.flatMap((kind) => reasons.filter((reason) => reason.kind === kind)),\n })),\n models,\n };\n}\n\n/**\n * What each service depends on, by name: the services its declarations name,\n * a model it `writes` resolved to the services whose `model` it is.\n */\nexport function dependenciesOf(\n contracts: readonly AnyContract[],\n services: ReadonlyMap<string, ServiceDoc>,\n): ReadonlyMap<string, ServiceDependencies> {\n const owners = new Map<string, string[]>();\n for (const service of services.values()) {\n if (service.model !== undefined) {\n const key = modelKey(service.model);\n owners.set(key, [...(owners.get(key) ?? []), service.name]);\n }\n }\n const byName = new Map(contracts.map((contract) => [contract.name, contract]));\n return new Map(\n [...services.values()].map((service) => [\n service.name,\n dependenciesOfService(service, byName.get(service.name), owners),\n ]),\n );\n}\n\n/** The kinds of a dependency's reasons, once each, in order: an edge's label. */\nfunction kindsOf(dependency: ServiceDependency): readonly DependencyKind[] {\n return KINDS.filter((kind) => dependency.reasons.some((reason) => reason.kind === kind));\n}\n\n/** The page's \"Depends on\" section, with `--services`: the services its declarations name. */\nexport function dependsOnSection(dependencies: ServiceDependencies): string[] {\n const { services, models } = dependencies;\n const unserved =\n models.length === 0\n ? []\n : [`It also ${code(\"writes\")} models no service's rows live in: ${list(models)}.`];\n if (services.length === 0) {\n return section(\"## Depends on\", [\"No other service: its declarations name none.\", ...unserved]);\n }\n return section(\"## Depends on\", [\n `The other services its declarations name: its row policy, ${code(\"writes\")}, ${code(\"affects\")}, ${code(\"{ scope, of }\")} access forms and collection anchors. A handler's undeclared reads are not listed.`,\n table(\n [\"Service\", \"Declared by\"],\n services.map(({ service, reasons }) => [\n code(service),\n reasons.map((reason) => reason.text).join(\"; \"),\n ]),\n ),\n ...unserved,\n ]);\n}\n\n/** A Mermaid node id for each service name: the name, made safe, and unique. */\nfunction nodeIds(names: readonly string[]): ReadonlyMap<string, string> {\n const ids = new Map<string, string>();\n const taken = new Set<string>();\n for (const name of names) {\n const safe = name.replace(/\\W/g, \"_\");\n let id = /^end$/i.test(safe) ? `${safe}_` : safe;\n for (let n = 2; taken.has(id); n += 1) {\n id = `${safe}_${n}`;\n }\n taken.add(id);\n ids.set(name, id);\n }\n return ids;\n}\n\n/**\n * The index's \"Dependencies\" section, with `--services`: a Mermaid graph\n * with an arrow from each service to each one its declarations name,\n * labelled with how.\n */\nexport function dependencyGraph(dependencies: ReadonlyMap<string, ServiceDependencies>): string[] {\n const edges = [...dependencies].flatMap(([from, { services }]) =>\n services.map((dependency) => ({\n from,\n to: dependency.service,\n label: kindsOf(dependency).join(\", \"),\n })),\n );\n if (edges.length === 0) {\n return section(\"## Dependencies\", [\"No service's declarations name another service.\"]);\n }\n const names = [...new Set(edges.flatMap(({ from, to }) => [from, to]))].sort();\n const ids = nodeIds(names);\n const id = (name: string): string => ids.get(name) ?? name;\n const nodes = names\n .filter((name) => id(name) !== name)\n .map((name) => ` ${id(name)}[\"${name.replace(/\"/g, \"#quot;\")}\"]`);\n return section(\"## Dependencies\", [\n `An arrow points from a service to another its declarations name: ${code(\"inherit\")} (its row policy), ${code(\"writes\")} (that service's model), ${code(\"affects\")}, ${code(\"scope\")} (a ${code(\"{ scope, of }\")} access form) or ${code(\"anchor\")} (a collection's anchor). Each service's page lists them.`,\n [\n \"```mermaid\",\n \"graph LR\",\n ...nodes,\n ...edges.map(({ from, to, label }) => ` ${id(from)} -->|${label}| ${id(to)}`),\n \"```\",\n ],\n ]);\n}\n","// Contract schemas as text for `quickdraw-docs`: each schema's Standard JSON\n// Schema (Zod 4.2 or later), drafted as draft-07 like the MCP bridge's tools,\n// written as a TypeScript-like type (`{ id: string; notes: string | null }`)\n// plus notes for the constraints a type cannot say (`1 to 200; default 50`).\n// A schema that cannot describe itself as JSON Schema (Zod 3, a hand-written\n// Standard Schema) is shown as such: the generator reads contracts, never\n// source code.\n\nimport { hasJsonSchema, isStandardSchema } from \"../contract/standardSchema\";\n\n/** A JSON Schema object, as a schema library wrote it. */\nexport type JsonSchema = Readonly<Record<string, unknown>>;\n\n/** One property of an object schema, as a row of a field table. */\nexport interface SchemaField {\n readonly name: string;\n readonly optional: boolean;\n readonly type: string;\n readonly notes: string;\n}\n\n/** What a schema cannot describe itself as: shown wherever its type would be. */\nexport const NO_JSON_SCHEMA = \"unknown (no JSON Schema)\";\n\nconst TARGET = \"draft-07\";\nconst MAX_DEPTH = 8;\nconst IDENTIFIER = /^[A-Za-z_$][\\w$]*$/;\n/** The `$ref` of the whole schema, which a recursive schema uses to refer to itself. */\nconst ROOT = \"#\";\n\nfunction isRecord(value: unknown): value is JsonSchema {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * The JSON Schema of `schema`'s input or output, or `undefined` when the\n * schema cannot describe itself (no Standard JSON Schema, or it throws).\n */\nexport function jsonSchemaOf(schema: unknown, mode: \"input\" | \"output\"): JsonSchema | undefined {\n if (!isStandardSchema(schema) || !hasJsonSchema(schema)) {\n return undefined;\n }\n try {\n const json: unknown = schema[\"~standard\"].jsonSchema[mode]({ target: TARGET });\n return isRecord(json) ? json : undefined;\n } catch {\n return undefined;\n }\n}\n\n/** Where `$ref`s resolve, and the refs being written (a recursive schema prints its name). */\ninterface Scope {\n readonly root: JsonSchema;\n readonly open: readonly string[];\n readonly depth: number;\n}\n\nfunction definitionOf(root: JsonSchema, ref: string): JsonSchema | undefined {\n const match = /^#\\/(definitions|\\$defs)\\/(.+)$/.exec(ref);\n if (match === null) {\n return undefined;\n }\n const [, group = \"\", name = \"\"] = match;\n const definitions = root[group];\n const found = isRecord(definitions) ? definitions[decodeURIComponent(name)] : undefined;\n return isRecord(found) ? found : undefined;\n}\n\nfunction literal(value: unknown): string {\n return value === undefined ? \"undefined\" : JSON.stringify(value);\n}\n\nfunction joined(parts: readonly string[], separator: \" | \" | \" & \"): string {\n const unique = [...new Set(parts)];\n return unique.length === 0 ? \"never\" : unique.join(separator);\n}\n\nconst OPENING = new Set([\"{\", \"[\", \"(\", \"<\"]);\nconst CLOSING = new Set([\"}\", \"]\", \")\", \">\"]);\n\n/** `text` without the contents of its JSON string literals: `\"a | b\"` becomes `\"\"`. */\nfunction withoutStrings(text: string): string {\n return text.replace(/\"(?:[^\"\\\\]|\\\\.)*\"/g, '\"\"');\n}\n\n/** True when `text` is a union or intersection at its top level, outside brackets and strings. */\nfunction isCompound(text: string): boolean {\n let depth = 0;\n const bare = withoutStrings(text);\n for (const [index, char] of [...bare].entries()) {\n if (OPENING.has(char)) {\n depth += 1;\n } else if (CLOSING.has(char)) {\n depth -= 1;\n } else if (depth === 0 && (char === \"|\" || char === \"&\") && bare[index - 1] === \" \") {\n return true;\n }\n }\n return false;\n}\n\n/** `T[]`, with a union or intersection in parentheses. */\nfunction arrayOf(item: string): string {\n return isCompound(item) ? `(${item})[]` : `${item}[]`;\n}\n\nfunction propertyName(name: string, optional: boolean): string {\n const key = IDENTIFIER.test(name) ? name : JSON.stringify(name);\n return optional ? `${key}?` : key;\n}\n\nfunction requiredOf(schema: JsonSchema): ReadonlySet<string> {\n return new Set(Array.isArray(schema.required) ? schema.required.map(String) : []);\n}\n\nfunction objectText(schema: JsonSchema, scope: Scope): string {\n const properties = isRecord(schema.properties) ? schema.properties : {};\n const required = requiredOf(schema);\n const members = Object.entries(properties).map(\n ([name, value]) => `${propertyName(name, !required.has(name))}: ${textOf(value, scope)}`,\n );\n const extra = schema.additionalProperties;\n if (isRecord(extra)) {\n const value = textOf(extra, scope);\n if (members.length === 0) {\n return `Record<string, ${value}>`;\n }\n members.push(`[key: string]: ${value}`);\n }\n return members.length === 0 ? \"{}\" : `{ ${members.join(\"; \")} }`;\n}\n\nfunction arrayText(schema: JsonSchema, scope: Scope): string {\n const tuple = Array.isArray(schema.prefixItems)\n ? schema.prefixItems\n : Array.isArray(schema.items)\n ? schema.items\n : undefined;\n if (tuple !== undefined) {\n return `[${tuple.map((item) => textOf(item, scope)).join(\", \")}]`;\n }\n return arrayOf(schema.items === undefined ? \"unknown\" : textOf(schema.items, scope));\n}\n\nfunction typeNameText(type: string, schema: JsonSchema, scope: Scope): string {\n switch (type) {\n case \"object\":\n return objectText(schema, scope);\n case \"array\":\n return arrayText(schema, scope);\n case \"string\":\n case \"number\":\n case \"integer\":\n case \"boolean\":\n case \"null\":\n return type;\n default:\n return \"unknown\";\n }\n}\n\n/** The members of a union or intersection keyword, written. */\nfunction combined(schema: JsonSchema, scope: Scope): string | undefined {\n for (const [keyword, separator] of [\n [\"anyOf\", \" | \"],\n [\"oneOf\", \" | \"],\n [\"allOf\", \" & \"],\n ] as const) {\n const options = schema[keyword];\n if (Array.isArray(options)) {\n return joined(\n options.map((option) => textOf(option, scope)),\n separator,\n );\n }\n }\n return undefined;\n}\n\n/** A `$ref`: the schema it names written out, or its name where it refers to itself. */\nfunction refText(ref: string, scope: Scope): string {\n const target = ref === ROOT ? scope.root : definitionOf(scope.root, ref);\n const title = target?.title;\n const name =\n typeof title === \"string\"\n ? title\n : ref === ROOT\n ? \"Self\"\n : decodeURIComponent(ref.replace(/^#\\/(definitions|\\$defs)\\//, \"\"));\n if (target === undefined || scope.open.includes(ref)) {\n return name;\n }\n return textOf(target, { ...scope, open: [...scope.open, ref] });\n}\n\n/** `schema` written as a TypeScript-like type. */\nfunction textOf(schema: unknown, scope: Scope): string {\n if (schema === true || (isRecord(schema) && Object.keys(schema).length === 0)) {\n return \"unknown\";\n }\n if (!isRecord(schema) || scope.depth > MAX_DEPTH) {\n return schema === false ? \"never\" : \"unknown\";\n }\n const inner: Scope = { ...scope, depth: scope.depth + 1 };\n if (typeof schema.$ref === \"string\") {\n return refText(schema.$ref, inner);\n }\n if (\"const\" in schema) {\n return literal(schema.const);\n }\n if (Array.isArray(schema.enum)) {\n return joined(schema.enum.map(literal), \" | \");\n }\n const union = combined(schema, inner);\n if (union !== undefined) {\n return union;\n }\n const { type } = schema;\n if (Array.isArray(type)) {\n return joined(\n type.map((name) => typeNameText(String(name), schema, inner)),\n \" | \",\n );\n }\n if (typeof type === \"string\") {\n return typeNameText(type, schema, inner);\n }\n return isRecord(schema.properties) ? objectText(schema, inner) : \"unknown\";\n}\n\n/** `schema` written as a TypeScript-like type: `{ id: string; title: string }`. */\nexport function schemaText(schema: JsonSchema): string {\n return textOf(schema, { root: schema, open: [ROOT], depth: 0 });\n}\n\nfunction isNumber(value: unknown): value is number {\n return typeof value === \"number\";\n}\n\n/** `count` and its unit, singular for 1: \"1 character\", \"20 items\". */\nfunction counted(count: number, unit: string): string {\n return `${count} ${count === 1 ? unit : `${unit}s`}`;\n}\n\n/** A length or size range: \"1 to 200 characters\", \"at least 1 character\", \"exactly 3 items\". */\nfunction sizeNote(low: unknown, high: unknown, unit: string): string | undefined {\n if (isNumber(low) && isNumber(high)) {\n return low === high ? `exactly ${counted(high, unit)}` : `${low} to ${counted(high, unit)}`;\n }\n if (isNumber(low)) {\n return `at least ${counted(low, unit)}`;\n }\n return isNumber(high) ? `at most ${counted(high, unit)}` : undefined;\n}\n\n/**\n * A bound of a number, or `undefined` for none: Zod writes the safe-integer\n * range as the bounds of every integer (`z.number().int()`), which says no\n * more than the type does.\n */\nfunction numberBound(value: unknown): number | undefined {\n return isNumber(value) && Math.abs(value) !== Number.MAX_SAFE_INTEGER ? value : undefined;\n}\n\n/** A number's lower bound in words: \"positive\", \"more than 5\", \"non-negative\", \"at least 1\". */\nfunction lowerNote(\n inclusive: number | undefined,\n exclusive: number | undefined,\n): string | undefined {\n if (exclusive !== undefined) {\n return exclusive === 0 ? \"positive\" : `more than ${exclusive}`;\n }\n if (inclusive === undefined) {\n return undefined;\n }\n return inclusive === 0 ? \"non-negative\" : `at least ${inclusive}`;\n}\n\n/** A number's upper bound in words: \"negative\", \"less than 5\", \"non-positive\", \"at most 10\". */\nfunction upperNote(\n inclusive: number | undefined,\n exclusive: number | undefined,\n): string | undefined {\n if (exclusive !== undefined) {\n return exclusive === 0 ? \"negative\" : `less than ${exclusive}`;\n }\n if (inclusive === undefined) {\n return undefined;\n }\n return inclusive === 0 ? \"non-positive\" : `at most ${inclusive}`;\n}\n\n/** A number's range: \"1 to 200\", \"non-negative\", \"positive\", \"at most 10\", \"more than 5\". */\nfunction numberNote(schema: JsonSchema): string | undefined {\n const low = numberBound(schema.minimum);\n const high = numberBound(schema.maximum);\n if (low !== undefined && high !== undefined) {\n return low === high ? `exactly ${low}` : `${low} to ${high}`;\n }\n const parts = [\n lowerNote(low, numberBound(schema.exclusiveMinimum)),\n upperNote(high, numberBound(schema.exclusiveMaximum)),\n ].filter((part) => part !== undefined);\n return parts.length === 0 ? undefined : parts.join(\", \");\n}\n\n/** The constraints of `schema` a type does not show: ranges, a format, a default, its description. */\nexport function schemaNotes(schema: JsonSchema): string {\n const notes = [\n sizeNote(schema.minLength, schema.maxLength, \"character\"),\n numberNote(schema),\n sizeNote(schema.minItems, schema.maxItems, \"item\"),\n typeof schema.format === \"string\" ? `format ${schema.format}` : undefined,\n \"default\" in schema ? `default ${literal(schema.default)}` : undefined,\n typeof schema.description === \"string\" ? schema.description : undefined,\n ];\n return notes.filter((note): note is string => note !== undefined && note !== \"\").join(\"; \");\n}\n\n/**\n * The properties of an object schema, one row each, or `undefined` when\n * `schema` is not an object with properties (its type is shown whole).\n */\nexport function schemaFields(schema: JsonSchema): readonly SchemaField[] | undefined {\n const properties = schema.properties;\n if (schema.type !== \"object\" || !isRecord(properties) || Object.keys(properties).length === 0) {\n return undefined;\n }\n const required = requiredOf(schema);\n const scope: Scope = { root: schema, open: [ROOT], depth: 1 };\n return Object.entries(properties).map(([name, value]) => ({\n name,\n optional: !required.has(name),\n type: textOf(value, scope),\n notes: isRecord(value) ? schemaNotes(value) : \"\",\n }));\n}\n","// The Markdown `quickdraw-docs` writes: one page per service and an index,\n// read from the contracts, laid out as oxfmt lays out Markdown\n// (`markdown.ts`), so `--check` does not report formatting as drift. With\n// `--services`, each page also says who may call what, read from the\n// services' definitions (`access.ts`), and which other services it depends\n// on, with a graph of those on the index (`dependencies.ts`).\n\nimport {\n DEFAULT_COLLECTION_LIMIT,\n DEFAULT_COLLECTION_MAX_LIMIT,\n type CollectionDef,\n} from \"../contract/collections\";\nimport type { AnyContract } from \"../contract/defineContract\";\nimport type { MethodDef, MethodOutput } from \"../contract/methods\";\nimport { defaultToolName } from \"../contract/toolName\";\nimport {\n CHANNEL_DEFAULT_RATE,\n isScopedStream,\n type ChannelDef,\n type EventDef,\n type StreamAccess,\n type StreamDef,\n} from \"../contract/realtime\";\nimport { isStandardSchema, type StandardSchemaV1 } from \"../contract/standardSchema\";\nimport {\n accessFormText,\n collectionAccessText,\n policyText,\n watchAccessText,\n type ServiceDoc,\n} from \"./access\";\nimport { dependencyGraph, dependsOnSection, type ServiceDependencies } from \"./dependencies\";\nimport { code, list, paragraph, section, table } from \"./markdown\";\nimport {\n jsonSchemaOf,\n NO_JSON_SCHEMA,\n schemaFields,\n schemaText,\n type SchemaField,\n} from \"./schemaText\";\n\n/** The first line of every generated file; only files that start with it are ever replaced or removed. */\nexport const GENERATED_MARKER =\n \"<!-- Generated by quickdraw-docs from the app's contracts. Do not edit: change the contract and run quickdraw-docs again. -->\";\n\n/**\n * What `--services` adds to a page: who may call what, from the service the\n * services module defines under the contract's name (`undefined`: none).\n */\nexport interface AccessInfo {\n readonly service: ServiceDoc | undefined;\n /** The services the service's declarations name (`dependenciesOf`); `undefined` without a service. */\n readonly dependencies?: ServiceDependencies | undefined;\n}\n\n/** True when the schema accepts `undefined`: a method that takes no input. */\nfunction acceptsUndefined(schema: StandardSchemaV1): boolean {\n try {\n const result: unknown = schema[\"~standard\"].validate(undefined);\n return (\n typeof result === \"object\" &&\n result !== null &&\n !(\"then\" in result) &&\n (result as { readonly issues?: unknown }).issues === undefined\n );\n } catch {\n return false;\n }\n}\n\nfunction typeOf(schema: unknown, mode: \"input\" | \"output\"): string {\n const json = jsonSchemaOf(schema, mode);\n return json === undefined ? NO_JSON_SCHEMA : schemaText(json);\n}\n\n/** A field table: name, type, and the optional columns that hold something. */\nfunction fieldTable(\n fields: readonly SchemaField[],\n levels: Readonly<Record<string, string>> = {},\n): string[] {\n const hasLevels = fields.some((field) => levels[field.name] !== undefined);\n const hasNotes = fields.some((field) => field.notes !== \"\");\n const header = [\"Field\", \"Type\", ...(hasLevels ? [\"Level\"] : []), ...(hasNotes ? [\"Notes\"] : [])];\n const rows = fields.map((field) => [\n code(field.optional ? `${field.name}?` : field.name),\n code(field.type),\n ...(hasLevels ? [levels[field.name] ?? \"\"] : []),\n ...(hasNotes ? [field.notes] : []),\n ]);\n return table(header, rows);\n}\n\n/** A row schema's fields as a table, or its type when it has no properties. */\nfunction shapeBlock(\n schema: unknown,\n levels: Readonly<Record<string, string>> = {},\n): string | string[] {\n const json = jsonSchemaOf(schema, \"output\");\n if (json === undefined) {\n return `Its schema cannot describe itself as JSON Schema: ${code(NO_JSON_SCHEMA)}.`;\n }\n const fields = schemaFields(json);\n return fields === undefined ? code(schemaText(json)) : fieldTable(fields, levels);\n}\n\nfunction entitySection(contract: AnyContract): string[] {\n if (contract.entity === undefined) {\n return section(\"## Entity\", [\n \"None: an RPC-only service, without projections, field levels or collections.\",\n ]);\n }\n const levels = contract.fields;\n const tiers =\n Object.keys(levels).length === 0\n ? []\n : [\"A caller receives a field only with at least its level on the row.\"];\n return section(\"## Entity\", [shapeBlock(contract.entity, levels), ...tiers]);\n}\n\nfunction projectionsSection(contract: AnyContract): string[] {\n const names = Object.keys(contract.projections);\n if (names.length === 0) {\n return [];\n }\n return [\n \"## Projections\",\n \"\",\n ...names.flatMap((name) =>\n section(`### ${code(name)}`, [shapeBlock(contract.projections[name])]),\n ),\n ];\n}\n\nfunction outputText(output: MethodOutput): string {\n if (isStandardSchema(output)) {\n return code(typeOf(output, \"output\"));\n }\n if (typeof output === \"string\") {\n return `one row as the ${code(output)} projection`;\n }\n return output.kind === \"nullable\"\n ? `one row as the ${code(output.projection)} projection, or ${code(\"null\")}`\n : `rows as the ${code(output.projection)} projection`;\n}\n\nfunction inputBlocks(method: MethodDef): (string | string[])[] {\n const json = jsonSchemaOf(method.input, \"input\");\n if (json === undefined) {\n return [acceptsUndefined(method.input) ? \"Input: none.\" : `Input: ${code(NO_JSON_SCHEMA)}.`];\n }\n const fields = schemaFields(json);\n return fields === undefined\n ? [`Input: ${code(schemaText(json))}.`]\n : [\"Input:\", fieldTable(fields)];\n}\n\nfunction kindLine(method: MethodDef): string {\n if (method.watch === undefined) {\n return method.kind === \"query\" ? \"A query.\" : \"A mutation.\";\n }\n if (method.watch === \"service\") {\n return \"A query that watches its service: a cached result is fetched again after every change to the service's rows, collections or the models it writes.\";\n }\n if (\"service\" in method.watch) {\n const models = method.watch.service.map(code).join(\", \");\n return `A query that watches its service's writes to ${models}: a cached result is fetched again after a change to one of them.`;\n }\n return `A query that watches the ${code(method.watch.collection)} collection: a cached result is fetched again when the scope its input names changes.`;\n}\n\n/** A member's `describe`, as the paragraph that opens its section, or nothing. */\nfunction described(text: string | undefined): string[] {\n return text === undefined ? [] : [paragraph(text)];\n}\n\n/**\n * Who may call a method by the kind of principal, with `--services`, when its\n * service or the app limits it: the kinds, and for a `\"public\"` method the\n * anonymous callers its form admits besides. Nothing when every kind may.\n */\nfunction callableBy(name: string, access: AccessInfo | undefined): string[] {\n const method = access?.service?.methods.get(name);\n if (method?.kinds === undefined) {\n return [];\n }\n const anonymous = method.access === \"public\" ? \", or anonymously\" : \"\";\n return [`- Callable by: ${list(method.kinds)}${anonymous}`];\n}\n\n/**\n * Facts about a method, as a list: the name the MCP bridge gives its tool\n * when the registry has no `name` option (the docs cannot see the app's\n * registry), for a query the read-only hint that tool carries, and with\n * `--services` the kinds of principal that may call it.\n */\nfunction methodFacts(\n service: string,\n name: string,\n method: MethodDef,\n access: AccessInfo | undefined,\n): string[] {\n return [\n `- MCP tool (default name): ${code(defaultToolName(service, name))}`,\n ...(method.kind === \"query\" ? [\"- MCP read-only hint: yes, as on every query's tool\"] : []),\n ...callableBy(name, access),\n ];\n}\n\n/** Who may call a method, and its `rowless`, when the page documents access. */\nfunction methodAccess(name: string, access: AccessInfo | undefined): string[] {\n const method = access?.service?.methods.get(name);\n if (method === undefined) {\n return [];\n }\n const rowless = method.rowless\n ? [\n `${code(\"rowless\")}: every caller the form admits may reach any row its input names, on purpose.`,\n ]\n : [];\n return [`Access: ${accessFormText(method.access)}.`, ...rowless];\n}\n\nfunction methodSection(\n service: string,\n name: string,\n method: MethodDef,\n access: AccessInfo | undefined,\n): string[] {\n return section(`### ${code(name)}`, [\n ...described(method.describe),\n kindLine(method),\n methodFacts(service, name, method, access),\n ...methodAccess(name, access),\n ...inputBlocks(method),\n `Output: ${outputText(method.output)}.`,\n ]);\n}\n\nfunction methodsSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n const entries = Object.entries(contract.methods);\n if (entries.length === 0) {\n return [];\n }\n return [\n \"## Methods\",\n \"\",\n ...entries.flatMap(([name, method]) => methodSection(contract.name, name, method, access)),\n ];\n}\n\nfunction scopeText(scope: CollectionDef[\"scope\"]): string {\n if (typeof scope === \"string\") {\n return `the ${code(scope)} column`;\n }\n const via = `${code(scope.scope)} of the ${code(scope.model)} rows whose ${code(scope.entry)} is the item's id`;\n return scope.refreshEntry === true\n ? `${via}; a write to those rows sends the item again to every scope that holds it`\n : via;\n}\n\nfunction whereText(where: CollectionDef[\"where\"]): string | undefined {\n if (where === undefined || Object.keys(where).length === 0) {\n return undefined;\n }\n return Object.entries(where)\n .map(([column, value]) => code(`${column} = ${JSON.stringify(value)}`))\n .join(\", \");\n}\n\nfunction optionTable(rows: readonly (readonly [string, string | undefined])[]): string[] {\n return table(\n [\"Option\", \"Value\"],\n rows.filter((row): row is readonly [string, string] => row[1] !== undefined),\n );\n}\n\nfunction collectionSection(\n name: string,\n collection: CollectionDef,\n access: AccessInfo | undefined,\n): string[] {\n const views = collection.views === undefined ? [] : Object.keys(collection.views);\n const limit = collection.limit ?? DEFAULT_COLLECTION_LIMIT;\n const maxLimit = collection.maxLimit ?? DEFAULT_COLLECTION_MAX_LIMIT;\n const served = access?.service?.collections.get(name);\n return section(`### ${code(name)}`, [\n ...described(collection.describe),\n optionTable([\n [\"Scope\", scopeText(collection.scope)],\n [\"Item\", code(collection.item)],\n [\n \"Order\",\n collection.order.map(([column, direction]) => `${code(column)} ${direction}`).join(\", \"),\n ],\n [\"Where\", whereText(collection.where)],\n [\"Index\", collection.index === undefined ? undefined : list(collection.index)],\n [\"Views\", views.length === 0 ? undefined : list(views)],\n [\n \"Access\",\n served === undefined\n ? (collection.access ?? \"Read (default)\")\n : collectionAccessText(served),\n ],\n [\"Page size\", `${limit}, at most ${maxLimit}`],\n ]),\n ]);\n}\n\nfunction collectionsSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n const entries = Object.entries(contract.collections);\n if (entries.length === 0) {\n return [];\n }\n return [\n \"## Collections\",\n \"\",\n \"Live lists of the service's rows, one per scope value.\",\n \"\",\n ...entries.flatMap(([name, collection]) => collectionSection(name, collection, access)),\n ];\n}\n\nfunction accessText(access: StreamAccess | undefined): string {\n if (access === undefined) {\n return \"none: closed to every client\";\n }\n if (typeof access === \"string\") {\n return code(JSON.stringify(access));\n }\n if (access.room !== undefined) {\n const { room } = access;\n if (typeof room === \"string\") {\n return code(`{ room: \"${room}\" }`);\n }\n return typeof room === \"function\"\n ? code(\"{ room: (scope) => ... }\")\n : code(`{ room: { prefix: \"${room.prefix}\" } }`);\n }\n if (access.scope !== undefined) {\n return code(`{ scope: \"${access.scope}\", of: ${access.of.name} }`);\n }\n const parts = [\n access.service === undefined ? undefined : `service: \"${access.service}\"`,\n access.entry === undefined ? undefined : `entry: \"${access.entry}\"`,\n ].filter((part) => part !== undefined);\n return code(`{ ${parts.join(\", \")} }`);\n}\n\n/**\n * What a subscriber starts from (finding F6.8 of the quickdraw-chat\n * migration): the contract's `seed`, or a seed the service computes, which\n * only a page made with `--services` (`known`) can tell from none.\n */\nfunction seedText(seed: number | undefined, computed: boolean, known: boolean): string {\n if (computed) {\n return \"computed by the service when a socket subscribes\";\n }\n if (seed === undefined) {\n return known ? \"none (default)\" : \"none in the contract; the service may compute one\";\n }\n if (seed === 0) {\n return \"none\";\n }\n return seed === 1 ? \"the latest item\" : `the latest ${seed} items`;\n}\n\nfunction streamSection(name: string, stream: StreamDef, access: AccessInfo | undefined): string[] {\n const scoped = isScopedStream(stream);\n const served = access?.service?.streams.get(name);\n return section(`### ${code(name)}`, [\n ...described(stream.describe),\n optionTable([\n [\"Item\", code(typeOf(stream.item, \"output\"))],\n [\"Scope\", scoped ? `one feed per ${code(stream.scope ?? \"\")}` : \"one global feed\"],\n [\"Seed\", seedText(stream.seed, served?.computedSeed === true, served !== undefined)],\n [\"Volatile\", stream.volatile === true ? \"yes\" : \"no\"],\n [\"Access\", accessText(stream.access)],\n [\n \"Checked\",\n served === undefined\n ? undefined\n : served.validate === \"development\"\n ? `in development only (${code('validate: \"development\"')})`\n : \"always\",\n ],\n ]),\n ]);\n}\n\nfunction requiresText(requires: ChannelDef[\"requires\"]): string | undefined {\n if (requires === undefined) {\n return undefined;\n }\n const selector = (value: unknown): string =>\n typeof value === \"string\" ? code(value) : \"a function of the payload\";\n if (requires.room !== undefined) {\n return typeof requires.room === \"string\"\n ? `the sending socket in the app room ${code(requires.room)}`\n : \"the sending socket in the app room a function of the payload names\";\n }\n return requires.collection === undefined\n ? `a subscription to the row ${selector(requires.entity)} names`\n : `a subscription to the ${code(requires.collection)} scope ${selector(requires.scope)} names`;\n}\n\nfunction channelSection(\n name: string,\n channel: ChannelDef,\n access: AccessInfo | undefined,\n): string[] {\n const rate = channel.ratePerSecond ?? CHANNEL_DEFAULT_RATE;\n const served = access?.service?.channels.has(name) === true;\n return section(`### ${code(name)}`, [\n ...described(channel.describe),\n optionTable([\n [\"Payload\", code(typeOf(channel.payload, \"input\"))],\n [\n \"Rate\",\n `${rate} a second per socket${channel.ratePerSecond === undefined ? \" (default)\" : \"\"}`,\n ],\n [\n \"Burst\",\n channel.burst === undefined ? `${Math.max(1, 2 * rate)} (default)` : String(channel.burst),\n ],\n [\"Requires\", requiresText(channel.requires)],\n [\"Access\", served ? accessFormText(access?.service?.channels.get(name)) : undefined],\n ]),\n ]);\n}\n\nfunction eventSection(name: string, event: EventDef): string[] {\n return section(`### ${code(name)}`, [\n ...described(event.describe),\n optionTable([[\"Payload\", code(typeOf(event.payload, \"output\"))]]),\n ]);\n}\n\nfunction membersSection<Def>(\n heading: string,\n intro: string,\n members: Readonly<Record<string, Def>>,\n render: (name: string, def: Def) => string[],\n): string[] {\n const entries = Object.entries(members);\n return entries.length === 0\n ? []\n : [heading, \"\", intro, \"\", ...entries.flatMap(([name, def]) => render(name, def))];\n}\n\n/** The fields a caller needs a level on the row to receive, as `name` (level). */\nfunction fieldLevelsText(contract: AnyContract): string {\n const tiers = Object.entries(contract.fields);\n return tiers.length === 0\n ? \"none: every caller who may read a row receives all of it\"\n : tiers.map(([field, level]) => `${code(field)}: ${String(level)}`).join(\", \");\n}\n\n/** The page's \"Access\" section, with `--services`: the service's policy, bypass, kinds, topic and field levels. */\nfunction accessSection(contract: AnyContract, access: AccessInfo | undefined): string[] {\n if (access === undefined) {\n return [];\n }\n const { service } = access;\n if (service === undefined) {\n return section(\"## Access\", [\n `The services module defines no ${code(contract.name)}: who may call its methods is not documented.`,\n ]);\n }\n return section(\"## Access\", [\n optionTable([\n [\"Row policy\", policyText(service.policy)],\n [\n \"Service-wide Admin\",\n service.adminBypass\n ? \"passes every check of the service\"\n : `passes only the forms that name ${code(\"service\")} (${code(\"adminBypass: false\")})`,\n ],\n [\n \"Principal kinds\",\n service.kinds === undefined\n ? undefined\n : `${list(service.kinds)}: its methods, subscriptions and channels refuse every other kind`,\n ],\n [\"Change topic\", watchAccessText(service.watchAccess)],\n [\"Field levels\", fieldLevelsText(contract)],\n ]),\n \"Each method below says who may call it.\",\n ]);\n}\n\n/**\n * One service's page: its `describe`, entity, projections, methods,\n * collections, streams, channels and events, and with `access`\n * (`--services`) who may call what and which services it depends on.\n */\nexport function renderService(contract: AnyContract, access?: AccessInfo): string {\n const lines = [\n GENERATED_MARKER,\n \"\",\n `# ${contract.name}`,\n \"\",\n ...described(contract.describe).flatMap((text) => [text, \"\"]),\n ...accessSection(contract, access),\n ...(access?.dependencies === undefined ? [] : dependsOnSection(access.dependencies)),\n ...entitySection(contract),\n ...projectionsSection(contract),\n ...methodsSection(contract, access),\n ...collectionsSection(contract, access),\n ...membersSection(\n \"## Streams\",\n \"Feeds of items the server appends; a subscriber starts from the stream's seed.\",\n contract.streams,\n (name, stream: StreamDef) => streamSection(name, stream, access),\n ),\n ...membersSection(\n \"## Channels\",\n \"Fire-and-forget messages from clients, dropped over the rate.\",\n contract.channels,\n (name, channel: ChannelDef) => channelSection(name, channel, access),\n ),\n ...membersSection(\n \"## Events\",\n \"Typed events the server sends to the sockets in a room.\",\n contract.events,\n eventSection,\n ),\n ];\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n\n/** The file a service's page is written to: its name, made safe for a file name. */\nexport function fileOf(contract: AnyContract): string {\n return `${contract.name.replace(/[^\\w.-]/g, \"-\")}.md`;\n}\n\n/**\n * The index page: every service with a link to its page, its members\n * counted, and its `describe` when any service has one; with `dependencies`\n * (`--services`), a graph of which services depend on which.\n */\nexport function renderIndex(\n contracts: readonly AnyContract[],\n dependencies?: ReadonlyMap<string, ServiceDependencies>,\n): string {\n const count = (members: object): string => String(Object.keys(members).length);\n const hasDescribe = contracts.some((contract) => contract.describe !== undefined);\n const rows = contracts.map((contract) => [\n `[${contract.name}](${fileOf(contract)})`,\n ...(hasDescribe ? [contract.describe ?? \"\"] : []),\n count(contract.methods),\n count(contract.collections),\n count(contract.streams),\n count(contract.channels),\n count(contract.events),\n ]);\n const lines = [\n GENERATED_MARKER,\n \"\",\n \"# API reference\",\n \"\",\n \"One page per service, generated from its contract by `quickdraw-docs`.\",\n \"\",\n ...table(\n [\n \"Service\",\n ...(hasDescribe ? [\"Description\"] : []),\n \"Methods\",\n \"Collections\",\n \"Streams\",\n \"Channels\",\n \"Events\",\n ],\n rows,\n ),\n ...(dependencies === undefined ? [] : [\"\", ...dependencyGraph(dependencies)]),\n ];\n return `${lines.join(\"\\n\").trimEnd()}\\n`;\n}\n"],"mappings":"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","names":["process","isRecord","MAX_POLICY_DEPTH","kindsOf","isRecord","isRecord","code","process"]}
@@ -1,15 +1,15 @@
1
1
  export { BreadcrumbItem, JWTPayload, NavItem, ServerCallOptions, ServerCaller, ServerCallerHeaders, ServerCallerOptions, ServerMethod, ServerMutation, ServerQuery, buildBreadcrumbs, createServerCaller, findNavItemByHref, findParentNavItem, formatCurrency, formatDate, formatDateTime, formatNumber, formatPercent, parseJWTPayload, routeRequiresAuth, truncate } from '../utils/index.js';
2
2
  import { C as CollectionQueryKey, M as MethodQueryKey } from '../keys-CqKkljVN.js';
3
3
  export { E as EntityQueryKey, K as KEY_ROOT, b as MethodKeyPrefix, S as ServiceKeyPrefix, c as collectionKey, e as entityKey, m as methodKey, a as methodKeyPrefix, s as serviceKeyPrefix } from '../keys-CqKkljVN.js';
4
- import { Q as QuickdrawConnection, a as QuickdrawConnectionOptions, C as ConnectionAuth, b as ConnectionStatus, c as ConnectionRefusal } from '../connection-DuN8GvcD.js';
5
- export { B as BackoffKind, g as BackoffWindows, e as ConnectionState, D as DEFAULT_BACKOFF_MS, h as DEFAULT_SUBSCRIPTION_LANE, J as JoinWait, L as LaneCallback, f as QuickdrawSocket, S as SocketClientOptions, i as SubscriptionEvent, j as SubscriptionLane, T as TopicWatch, d as createQuickdrawConnection } from '../connection-DuN8GvcD.js';
6
- import { k as MethodKind, O as OrderBy, C as CollectionDef, ae as ContractMap, A as AccessLevel, z as SortDirection } from '../infer-Dw21kmLw.js';
7
- import { ad as Version, y as CallSuccess, w as CallNotModified, n as ProtocolMismatch, a5 as Revision, F as CollectionDelta, G as CollectionFrame, a7 as RevokeReason, k as HelloFrame } from '../envelope-nf5eGB-a.js';
4
+ import { Q as QuickdrawConnection, a as QuickdrawConnectionOptions, C as ConnectionAuth, b as ConnectionStatus, c as ConnectionRefusal } from '../connection-Cr1BU07W.js';
5
+ export { B as BackoffKind, g as BackoffWindows, e as ConnectionState, D as DEFAULT_BACKOFF_MS, h as DEFAULT_SUBSCRIPTION_LANE, J as JoinWait, L as LaneCallback, f as QuickdrawSocket, S as SocketClientOptions, i as SubscriptionEvent, j as SubscriptionLane, T as TopicWatch, d as createQuickdrawConnection } from '../connection-Cr1BU07W.js';
6
+ import { k as MethodKind, O as OrderBy, C as CollectionDef, ae as ContractMap, A as AccessLevel, z as SortDirection } from '../infer-Teo1xpsd.js';
7
+ import { ad as Version, y as CallSuccess, w as CallNotModified, n as ProtocolMismatch, a5 as Revision, F as CollectionDelta, G as CollectionFrame, a7 as RevokeReason, k as HelloFrame } from '../envelope-Cp3YcVxC.js';
8
8
  import { QueryClient, QueryKey, Query, UseQueryResult, UseMutationResult } from '@tanstack/react-query';
9
- import { Q as QuickdrawClient, M as MethodQueryOptions, a as QueryCallOptions, b as MethodMutationOptions, c as MutationCallOptions } from '../clientTypes-DuZW_8mb.js';
10
- export { A as AddItemOptions, h as AdminMembers, u as ChannelMember, C as CollectionMember, E as EntityMembers, v as EventMember, G as GlobalStreamMember, L as LiveMembers, i as MethodMember, j as MutationMember, k as MutationVariables, O as OnRefused, d as OptimisticCache, l as OptimisticCacheOf, e as OptimisticUpdate, f as OverlayStore, g as OverlayView, m as QueryMember, n as QuickdrawInvalidate, w as RealtimeMembers, R as RefusedAddition, p as RefusedItem, x as ScopedStreamMember, H as SearchMember, I as SearchMemberOf, S as ServiceClient, y as StreamMember, z as UseChannelResult, U as UseCollectionOptions, q as UseCollectionResult, r as UseEntitiesResult, s as UseEntityOptions, t as UseEntityResult, B as UseEventOptions, J as UseSearchOptions, K as UseSearchResult, D as UseStreamOptions, F as UseStreamResult, o as overlaysOf } from '../clientTypes-DuZW_8mb.js';
9
+ import { Q as QuickdrawClient, M as MethodQueryOptions, a as QueryCallOptions, b as MethodMutationOptions, c as MutationCallOptions } from '../clientTypes-Bc-G8n-U.js';
10
+ export { A as AddItemOptions, h as AdminMembers, u as ChannelMember, C as CollectionMember, E as EntityMembers, v as EventMember, G as GlobalStreamMember, L as LiveMembers, i as MethodMember, j as MutationMember, k as MutationVariables, O as OnRefused, d as OptimisticCache, l as OptimisticCacheOf, e as OptimisticUpdate, f as OverlayStore, g as OverlayView, m as QueryMember, n as QuickdrawInvalidate, w as RealtimeMembers, R as RefusedAddition, p as RefusedItem, x as ScopedStreamMember, H as SearchMember, I as SearchMemberOf, S as ServiceClient, y as StreamMember, z as UseChannelResult, U as UseCollectionOptions, q as UseCollectionResult, r as UseEntitiesResult, s as UseEntityOptions, t as UseEntityResult, B as UseEventOptions, J as UseSearchOptions, K as UseSearchResult, D as UseStreamOptions, F as UseStreamResult, o as overlaysOf } from '../clientTypes-Bc-G8n-U.js';
11
11
  import { Q as QuickdrawError } from '../errors-S-bxEIBC.js';
12
- import { n as AdminServiceMeta, F as FilterValue, y as AdminPage, z as AdminSubscribers } from '../adminSchemas-zji11V74.js';
12
+ import { n as AdminServiceMeta, F as FilterValue, y as AdminPage, z as AdminSubscribers } from '../adminSchemas-2DUA_hZ8.js';
13
13
  import * as React from 'react';
14
14
  import 'socket.io-client';
15
15
 
@@ -10,7 +10,7 @@ import {
10
10
  shouldRetry,
11
11
  useLiveData,
12
12
  useQuickdraw
13
- } from "../chunk-ZACRRYWL.js";
13
+ } from "../chunk-ZIVPHYRG.js";
14
14
  import {
15
15
  DEFAULT_BACKOFF_MS,
16
16
  DEFAULT_INVALIDATION_WINDOW_MS,
@@ -40,10 +40,10 @@ import {
40
40
  useAdminServices,
41
41
  useConnectionState,
42
42
  useQuickdrawContext
43
- } from "../chunk-O2PWC2YW.js";
43
+ } from "../chunk-OECZPRPW.js";
44
44
  import "../chunk-CDKG4TFA.js";
45
- import "../chunk-WVIRXYI4.js";
46
- import "../chunk-5YRQ26LF.js";
45
+ import "../chunk-VSQBHPWH.js";
46
+ import "../chunk-RT6OILOI.js";
47
47
  import "../chunk-47AEXVDM.js";
48
48
  import "../chunk-Z2LZ7IZ7.js";
49
49
  import "../chunk-YSWH776Y.js";
@@ -1,9 +1,9 @@
1
1
  import { QueryClient, UseMutationOptions, UseQueryOptions, UseQueryResult, Updater, UseMutationResult, QueryKey } from '@tanstack/react-query';
2
- import { J as AnyContract, az as StreamName, am as IsScopedStream, ay as StreamItemOf, aa as ChannelName, a9 as ChannelInputOf, ag as EventName, ah as EventPayloadOf, ap as MethodName, aq as MethodOf, ar as OutputOf, al as InputOf, ae as ContractMap, ao as KindOf, af as EntityOf, ac as CollectionName, an as ItemOf, aw as ScopeOf, aA as ViewName, ak as IndexRowOf } from './infer-Dw21kmLw.js';
2
+ import { J as AnyContract, az as StreamName, am as IsScopedStream, ay as StreamItemOf, aa as ChannelName, a9 as ChannelInputOf, ag as EventName, ah as EventPayloadOf, ap as MethodName, aq as MethodOf, ar as OutputOf, al as InputOf, ae as ContractMap, ao as KindOf, af as EntityOf, ac as CollectionName, an as ItemOf, aw as ScopeOf, aA as ViewName, ak as IndexRowOf } from './infer-Teo1xpsd.js';
3
3
  import { Q as QuickdrawError } from './errors-S-bxEIBC.js';
4
4
  import { M as MethodQueryKey } from './keys-CqKkljVN.js';
5
- import { i as SearchPage } from './adminSchemas-zji11V74.js';
6
- import { a5 as Revision } from './envelope-nf5eGB-a.js';
5
+ import { i as SearchPage } from './adminSchemas-2DUA_hZ8.js';
6
+ import { a5 as Revision } from './envelope-Cp3YcVxC.js';
7
7
 
8
8
  /** A row as additions keep it: any object with a string `id`. */
9
9
  type AddedRow = Readonly<Record<string, unknown>> & {
@@ -1,5 +1,5 @@
1
- import { C as CLIENT_EVENTS, a9 as ServerToClientEvents, E as ClientToServerEvents, B as ChangedFrame, n as ProtocolMismatch, k as HelloFrame, A as AuthenticationRefused } from './envelope-nf5eGB-a.js';
2
- import { k as MethodKind } from './infer-Dw21kmLw.js';
1
+ import { C as CLIENT_EVENTS, a9 as ServerToClientEvents, E as ClientToServerEvents, B as ChangedFrame, n as ProtocolMismatch, k as HelloFrame, A as AuthenticationRefused } from './envelope-Cp3YcVxC.js';
2
+ import { k as MethodKind } from './infer-Teo1xpsd.js';
3
3
  import { ManagerOptions, SocketOptions, Socket } from 'socket.io-client';
4
4
 
5
5
  /** The kinds of work that back off separately: method calls by kind, and subscription events. */