@contractkit/cli
Advanced tools
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for resolve-plugin-files.ts</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> resolve-plugin-files.ts</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>13/13</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>4/4</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>1/1</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>12/12</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">import { existsSync, readFileSync } from 'node:fs'; | ||
| import { resolve, dirname } from 'node:path'; | ||
| import type { OpRootNode } from '@contractkit/core'; | ||
| import type { DiagnosticCollector } from '@contractkit/core'; | ||
| | ||
| /** | ||
| * Resolves plugin file references in operation `plugins` blocks. | ||
| * | ||
| * For each operation that declares `plugins: { name: "path.yml" }`, reads the | ||
| * referenced file (resolved relative to the operation's source `.ck` file) and | ||
| * stores the content in `op.pluginFiles[name]`. Emits a warning and skips if | ||
| * the file is not found. | ||
| */ | ||
| export function resolvePluginFiles(roots: OpRootNode[], rootDir: string, diag: DiagnosticCollector): void { | ||
| for (const root of roots) { | ||
| const contractDir = dirname(resolve(rootDir, root.file)); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| if (!op.plugins) continue; | ||
| for (const [name, value] of Object.entries(op.plugins)) { | ||
| const absPath = resolve(contractDir, value); | ||
| if (!existsSync(absPath)) { | ||
| diag.warn(root.file, op.loc.line, `plugins.${name}: file not found: ${value}`); | ||
| continue; | ||
| } | ||
| op.pluginFiles ??= {}; | ||
| op.pluginFiles[name] = readFileSync(absPath, 'utf-8'); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2026-05-01T17:30:38.384Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
+94
| # @contractkit/cli | ||
| The `contractkit` binary — orchestrates parsing, plugin loading, incremental caching, and prettier formatting for `.ck` contract files. | ||
| ## Installation | ||
| ```bash | ||
| pnpm add -D @contractkit/cli | ||
| ``` | ||
| This package only handles file discovery, configuration, caching, and dispatch to plugins. **All code generation lives in plugins** that you list under `"plugins"` in `contractkit.config.json`. | ||
| ## Usage | ||
| ```bash | ||
| contractkit [options] | ||
| Options: | ||
| -c, --config <path> Path to config file (default: searches for contractkit.config.json) | ||
| -w, --watch Watch for changes and recompile | ||
| --force Skip incremental cache, recompile all | ||
| -h, --help Show help | ||
| ``` | ||
| The CLI walks upward from the current directory looking for `contractkit.config.json` if `-c` is not provided. | ||
| ## Configuration | ||
| Create `contractkit.config.json` at your project root: | ||
| ```json | ||
| { | ||
| "rootDir": ".", | ||
| "cache": true, | ||
| "prettier": true, | ||
| "patterns": ["contracts/**/*.ck"], | ||
| "plugins": { | ||
| "@contractkit/plugin-typescript": { | ||
| "server": { | ||
| "baseDir": "apps/api/", | ||
| "zod": true, | ||
| "output": { | ||
| "routes": "src/routes/{filename}.router.ts", | ||
| "types": "src/modules/{area}/types/{filename}.ts" | ||
| }, | ||
| "servicePathTemplate": "#modules/{module}/{module}.service.js" | ||
| } | ||
| }, | ||
| "@contractkit/plugin-openapi": { | ||
| "baseDir": "docs/api/", | ||
| "output": "openapi.yaml", | ||
| "info": { "title": "My API", "version": "1.0.0" } | ||
| } | ||
| } | ||
| } | ||
| ``` | ||
| ### Top-level fields | ||
| | Field | Type | Description | | ||
| | --- | --- | --- | | ||
| | `rootDir` | `string` | Base directory for resolving relative paths. Supports `~` for `$HOME`. Default: `.` | | ||
| | `cache` | `boolean \| string` | Enable incremental compilation cache. Pass a string to use a custom cache filename. Default: `false`. | | ||
| | `prettier` | `boolean` | Format generated TypeScript files with the project's local prettier. Default: `false`. | | ||
| | `patterns` | `string[]` | Glob patterns for `.ck` files to compile, relative to `rootDir`. | | ||
| | `plugins` | `object` | Map of plugin package name → options. The CLI loads each key as a plugin and passes its value to the plugin as `ctx.options`. | | ||
| ## Incremental cache | ||
| When `"cache": true`, the CLI hashes each `.ck` file plus the resolved plugin config and skips files whose inputs haven't changed since the last run. The cache lives at `.contractkit-cache.json` (or the path you provide). Use `--force` to bypass it. | ||
| ## Built-in plugins | ||
| Each plugin is its own npm package, listed under `"plugins"`: | ||
| | Package | Generates | | ||
| | --- | --- | | ||
| | [`@contractkit/plugin-typescript`](../../packages/plugin-typescript) | Koa routers, TypeScript SDK clients, Zod schemas, plain TS types | | ||
| | [`@contractkit/plugin-openapi`](../../packages/plugin-openapi) | OpenAPI 3.0 YAML | | ||
| | [`@contractkit/plugin-markdown`](../../packages/plugin-markdown) | Markdown API reference | | ||
| | [`@contractkit/plugin-bruno`](../../packages/plugin-bruno) | Bruno REST collection | | ||
| | [`@contractkit/plugin-python`](../../packages/plugin-python) | Python SDK client (Pydantic v2 + httpx) | | ||
| For writing your own plugin, see [@contractkit/core](../../packages/contractkit#plugin-api). | ||
| ## Subcommands | ||
| Plugins can register additional CLI subcommands via the `command` hook. For example, `@contractkit/openapi-to-ck` registers `contractkit openapi-to-ck` for converting an OpenAPI YAML file back into `.ck` files. | ||
| ```bash | ||
| contractkit openapi-to-ck --input openapi.yaml --output contracts/ | ||
| ``` | ||
| Run `contractkit --help` to list registered subcommands. |
| import { existsSync, readFileSync } from 'node:fs'; | ||
| import { resolve, dirname } from 'node:path'; | ||
| import type { OpRootNode } from '@contractkit/core'; | ||
| import type { DiagnosticCollector } from '@contractkit/core'; | ||
| /** | ||
| * Resolves plugin file references in operation `plugins` blocks. | ||
| * | ||
| * For each operation that declares `plugins: { name: "path.yml" }`, reads the | ||
| * referenced file (resolved relative to the operation's source `.ck` file) and | ||
| * stores the content in `op.pluginFiles[name]`. Emits a warning and skips if | ||
| * the file is not found. | ||
| */ | ||
| export function resolvePluginFiles(roots: OpRootNode[], rootDir: string, diag: DiagnosticCollector): void { | ||
| for (const root of roots) { | ||
| const contractDir = dirname(resolve(rootDir, root.file)); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| if (!op.plugins) continue; | ||
| for (const [name, value] of Object.entries(op.plugins)) { | ||
| const absPath = resolve(contractDir, value); | ||
| if (!existsSync(absPath)) { | ||
| diag.warn(root.file, op.loc.line, `plugins.${name}: file not found: ${value}`); | ||
| continue; | ||
| } | ||
| op.pluginFiles ??= {}; | ||
| op.pluginFiles[name] = readFileSync(absPath, 'utf-8'); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } |
| import { describe, it, expect, beforeEach, afterEach } from 'vitest'; | ||
| import { writeFileSync, mkdirSync, rmSync } from 'node:fs'; | ||
| import { join } from 'node:path'; | ||
| import { tmpdir } from 'node:os'; | ||
| import { DiagnosticCollector } from '@contractkit/core'; | ||
| import type { OpRootNode, OpRouteNode, OpOperationNode } from '@contractkit/core'; | ||
| import { resolvePluginFiles } from '../src/resolve-plugin-files.js'; | ||
| function makeOp(overrides: Partial<OpOperationNode> = {}): OpOperationNode { | ||
| return { | ||
| method: 'get', | ||
| responses: [], | ||
| loc: { file: 'test.ck', line: 1 }, | ||
| ...overrides, | ||
| }; | ||
| } | ||
| function makeRoute(path: string, operations: OpOperationNode[]): OpRouteNode { | ||
| return { path, operations, loc: { file: 'test.ck', line: 1 } }; | ||
| } | ||
| function makeRoot(file: string, routes: OpRouteNode[]): OpRootNode { | ||
| return { kind: 'opRoot', meta: {}, routes, file }; | ||
| } | ||
| describe('resolvePluginFiles', () => { | ||
| let tmpDir: string; | ||
| beforeEach(() => { | ||
| tmpDir = join(tmpdir(), `contractkit-resolve-test-${Date.now()}`); | ||
| mkdirSync(tmpDir, { recursive: true }); | ||
| }); | ||
| afterEach(() => { | ||
| rmSync(tmpDir, { recursive: true, force: true }); | ||
| }); | ||
| it('reads file content into op.pluginFiles when file exists', () => { | ||
| const content = 'info:\n name: Custom Request\n type: http\n'; | ||
| writeFileSync(join(tmpDir, 'stub.yml'), content, 'utf-8'); | ||
| const op = makeOp({ plugins: { bruno: 'stub.yml' } }); | ||
| const root = makeRoot(join(tmpDir, 'api.ck'), [makeRoute('/users', [op])]); | ||
| const diag = new DiagnosticCollector(); | ||
| resolvePluginFiles([root], tmpDir, diag); | ||
| expect(op.pluginFiles).toBeDefined(); | ||
| expect(op.pluginFiles!['bruno']).toBe(content); | ||
| expect(diag.hasErrors()).toBe(false); | ||
| }); | ||
| it('emits a warning and leaves pluginFiles unset for missing file', () => { | ||
| const op = makeOp({ plugins: { bruno: 'missing.yml' } }); | ||
| const root = makeRoot(join(tmpDir, 'api.ck'), [makeRoute('/users', [op])]); | ||
| const diag = new DiagnosticCollector(); | ||
| resolvePluginFiles([root], tmpDir, diag); | ||
| expect(op.pluginFiles).toBeUndefined(); | ||
| const warnings = diag.getAll().filter(d => d.severity === 'warning'); | ||
| expect(warnings).toHaveLength(1); | ||
| expect(warnings[0]!.message).toContain('missing.yml'); | ||
| }); | ||
| it('resolves plugin file path relative to the contract file directory', () => { | ||
| const subDir = join(tmpDir, 'contracts'); | ||
| mkdirSync(subDir, { recursive: true }); | ||
| writeFileSync(join(subDir, 'override.yml'), 'content', 'utf-8'); | ||
| const op = makeOp({ plugins: { bruno: 'override.yml' } }); | ||
| const root = makeRoot(join(subDir, 'users.ck'), [makeRoute('/users', [op])]); | ||
| const diag = new DiagnosticCollector(); | ||
| resolvePluginFiles([root], tmpDir, diag); | ||
| expect(op.pluginFiles!['bruno']).toBe('content'); | ||
| expect(diag.hasErrors()).toBe(false); | ||
| }); | ||
| it('skips ops without a plugins block', () => { | ||
| const op = makeOp(); | ||
| const root = makeRoot(join(tmpDir, 'api.ck'), [makeRoute('/users', [op])]); | ||
| const diag = new DiagnosticCollector(); | ||
| resolvePluginFiles([root], tmpDir, diag); | ||
| expect(op.pluginFiles).toBeUndefined(); | ||
| expect(diag.getAll()).toHaveLength(0); | ||
| }); | ||
| it('resolves multiple plugin entries on the same op', () => { | ||
| writeFileSync(join(tmpDir, 'a.yml'), 'aaa', 'utf-8'); | ||
| writeFileSync(join(tmpDir, 'b.yml'), 'bbb', 'utf-8'); | ||
| const op = makeOp({ plugins: { bruno: 'a.yml', other: 'b.yml' } }); | ||
| const root = makeRoot(join(tmpDir, 'api.ck'), [makeRoute('/users', [op])]); | ||
| const diag = new DiagnosticCollector(); | ||
| resolvePluginFiles([root], tmpDir, diag); | ||
| expect(op.pluginFiles!['bruno']).toBe('aaa'); | ||
| expect(op.pluginFiles!['other']).toBe('bbb'); | ||
| }); | ||
| }); |
| > @contractkit/cli@0.5.0 build:ci /Users/robert/projects/contractkit/apps/cli | ||
| > @contractkit/cli@0.6.0 build:ci /home/runner/work/ContractKit/ContractKit/apps/cli | ||
| > eslint --max-warnings=0 && pnpm run build | ||
| ============= | ||
| WARNING: You are currently running a version of TypeScript which is not officially supported by @typescript-eslint/typescript-estree. | ||
| * @typescript-eslint/typescript-estree version: 8.57.2 | ||
| * Supported TypeScript versions: >=4.8.4 <6.0.0 | ||
| * Your TypeScript version: 6.0.2 | ||
| Please only submit bug reports when using the officially supported version. | ||
| ============= | ||
| > @contractkit/cli@0.5.0 build /Users/robert/projects/contractkit/apps/cli | ||
| > @contractkit/cli@0.6.0 build /home/runner/work/ContractKit/ContractKit/apps/cli | ||
| > tsup src/cli.ts --format esm --sourcemap | ||
@@ -30,4 +14,4 @@ | ||
| [34mESM[39m Build start | ||
| [32mESM[39m [1mdist/cli.js [22m[32m14.13 KB[39m | ||
| [32mESM[39m [1mdist/cli.js.map [22m[32m33.55 KB[39m | ||
| [32mESM[39m ⚡️ Build success in 18ms | ||
| [32mESM[39m [1mdist/cli.js [22m[32m15.08 KB[39m | ||
| [32mESM[39m [1mdist/cli.js.map [22m[32m36.32 KB[39m | ||
| [32mESM[39m ⚡️ Build success in 35ms |
| > @contractkit/cli@0.5.0 test:ci /Users/robert/projects/contractkit/apps/cli | ||
| > @contractkit/cli@0.6.0 test:ci /home/runner/work/ContractKit/ContractKit/apps/cli | ||
| > vitest run --coverage | ||
| [?25l | ||
| [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/Users/robert/projects/contractkit/apps/cli[39m | ||
| [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/home/runner/work/ContractKit/ContractKit/apps/cli[39m | ||
| [2mCoverage enabled with [22m[33mv8[39m | ||
| [?2026h | ||
| [1m[33m ❯ [39m[22mtests/config.test.ts[2m [queued][22m | ||
| [32m✓[39m tests/config.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 11[2mms[22m[39m | ||
| [32m✓[39m tests/resolve-plugin-files.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 8[2mms[22m[39m | ||
| [2m Test Files [22m[1m[32m0 passed[39m[22m[90m (1)[39m | ||
| [2m Tests [22m[1m[32m0 passed[39m[22m[90m (0)[39m | ||
| [2m Start at [22m08:51:10 | ||
| [2m Duration [22m101ms | ||
| [?2026l[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K[1A[K [32m✓[39m tests/config.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 3[2mms[22m[39m | ||
| [32m✓[39m mergeConfig [2m(13)[22m | ||
| [32m✓[39m uses patterns from top-level patterns field[32m 1[2mms[22m[39m | ||
| [32m✓[39m returns empty patterns when config has no patterns[32m 0[2mms[22m[39m | ||
| [32m✓[39m resolves rootDir defaulting to cwd[32m 0[2mms[22m[39m | ||
| [32m✓[39m passes through force flag[32m 0[2mms[22m[39m | ||
| [32m✓[39m passes through watch flag[32m 0[2mms[22m[39m | ||
| [32m✓[39m resolves cache config from boolean[32m 0[2mms[22m[39m | ||
| [32m✓[39m resolves cache config from string[32m 0[2mms[22m[39m | ||
| [32m✓[39m disables cache by default[32m 0[2mms[22m[39m | ||
| [32m✓[39m defaults prettier to false[32m 0[2mms[22m[39m | ||
| [32m✓[39m passes through prettier: true[32m 0[2mms[22m[39m | ||
| [32m✓[39m passes through prettier: false explicitly[32m 0[2mms[22m[39m | ||
| [32m✓[39m normalizes plugins from record format[32m 1[2mms[22m[39m | ||
| [32m✓[39m returns empty plugins when none configured[32m 0[2mms[22m[39m | ||
| [2m Test Files [22m [1m[32m2 passed[39m[22m[90m (2)[39m | ||
| [2m Tests [22m [1m[32m18 passed[39m[22m[90m (18)[39m | ||
| [2m Start at [22m 17:30:37 | ||
| [2m Duration [22m 659ms[2m (transform 268ms, setup 0ms, import 597ms, tests 19ms, environment 0ms)[22m | ||
| [2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m | ||
| [2m Tests [22m [1m[32m13 passed[39m[22m[90m (13)[39m | ||
| [2m Start at [22m 08:51:10 | ||
| [2m Duration [22m 165ms[2m (transform 19ms, setup 0ms, import 27ms, tests 3ms, environment 0ms)[22m | ||
| [34m % [39m[2mCoverage report from [22m[33mv8[39m | ||
| -----------|---------|----------|---------|---------|------------------- | ||
| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | ||
| -----------|---------|----------|---------|---------|------------------- | ||
| [31;1mAll files [0m | [31;1m 25[0m | [33;1m 54.54[0m | [31;1m 37.5[0m | [31;1m 22.22[0m | [31;1m [0m | ||
| [31;1m cache.ts [0m | [31;1m 7.69[0m | [31;1m 0[0m | [31;1m 0[0m | [31;1m 8.33[0m | [31;1m12-33 [0m | ||
| [31;1m config.ts[0m | [31;1m 33.33[0m | [33;1m 66.66[0m | [33;1m 75[0m | [31;1m 29.16[0m | [31;1m39-63,91 [0m | ||
| -----------|---------|----------|---------|---------|------------------- | ||
| [?25h | ||
| -------------------|---------|----------|---------|---------|------------------- | ||
| File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s | ||
| -------------------|---------|----------|---------|---------|------------------- | ||
| All files | 43.39 | 61.53 | 44.44 | 41.66 | | ||
| cache.ts | 7.69 | 0 | 0 | 8.33 | 12-33 | ||
| config.ts | 33.33 | 66.66 | 75 | 29.16 | 39-63,91 | ||
| ...lugin-files.ts | 100 | 100 | 100 | 100 | | ||
| -------------------|---------|----------|---------|---------|------------------- |
+23
-0
| # @contractkit/cli | ||
| ## 0.6.0 | ||
| ### Minor Changes | ||
| - 876696f: Add a `plugins` block to operations for attaching external files to individual code-generators. | ||
| ``` | ||
| post: { | ||
| plugins: { | ||
| bruno: "request-token.yml" | ||
| } | ||
| } | ||
| ``` | ||
| Each entry maps a plugin name to a path relative to the contract's `.ck` file. The CLI resolves the path before plugins run and exposes the file content on the AST as `op.pluginFiles[name]`; missing files emit a warning. Plugins keyed by their own `name` can read their entry to override or augment generated output. The raw paths remain on `op.plugins` for round-trip use cases (the prettier plugin and VS Code syntax highlighting consume the raw form). | ||
| ### Patch Changes | ||
| - 876696f: Print all warnings and errors once at the end of the run, after file writes, instead of interleaving them with intermediate compilation phases. Errors that previously appeared twice (once at parse-time, once at the end) now appear only at the bottom of the output where they're easier to spot. | ||
| - Updated dependencies [876696f] | ||
| - @contractkit/core@0.12.0 | ||
| - @contractkit/openapi-to-ck@0.7.2 | ||
| ## 0.5.1 | ||
@@ -4,0 +27,0 @@ |
@@ -175,3 +175,3 @@ | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2026-04-29T12:51:10.856Z | ||
| at 2026-05-01T17:30:38.384Z | ||
| </div> | ||
@@ -178,0 +178,0 @@ <script src="prettify.js"></script> |
+20
-5
| <?xml version="1.0" encoding="UTF-8"?> | ||
| <coverage generated="1777467070860" clover="3.2.0"> | ||
| <project timestamp="1777467070860" name="All files"> | ||
| <metrics statements="36" coveredstatements="8" conditionals="22" coveredconditionals="12" methods="8" coveredmethods="3" elements="66" coveredelements="23" complexity="0" loc="36" ncloc="36" packages="1" files="2" classes="2"/> | ||
| <file name="cache.ts" path="/Users/robert/projects/contractkit/apps/cli/src/cache.ts"> | ||
| <coverage generated="1777656638389" clover="3.2.0"> | ||
| <project timestamp="1777656638389" name="All files"> | ||
| <metrics statements="48" coveredstatements="20" conditionals="26" coveredconditionals="16" methods="9" coveredmethods="4" elements="83" coveredelements="40" complexity="0" loc="48" ncloc="48" packages="1" files="3" classes="3"/> | ||
| <file name="cache.ts" path="/home/runner/work/ContractKit/ContractKit/apps/cli/src/cache.ts"> | ||
| <metrics statements="12" coveredstatements="1" conditionals="4" coveredconditionals="0" methods="4" coveredmethods="0"/> | ||
@@ -20,3 +20,3 @@ <line num="5" count="1" type="stmt"/> | ||
| </file> | ||
| <file name="config.ts" path="/Users/robert/projects/contractkit/apps/cli/src/config.ts"> | ||
| <file name="config.ts" path="/home/runner/work/ContractKit/ContractKit/apps/cli/src/config.ts"> | ||
| <metrics statements="24" coveredstatements="7" conditionals="18" coveredconditionals="12" methods="4" coveredmethods="3"/> | ||
@@ -48,3 +48,18 @@ <line num="32" count="1" type="stmt"/> | ||
| </file> | ||
| <file name="resolve-plugin-files.ts" path="/home/runner/work/ContractKit/ContractKit/apps/cli/src/resolve-plugin-files.ts"> | ||
| <metrics statements="12" coveredstatements="12" conditionals="4" coveredconditionals="4" methods="1" coveredmethods="1"/> | ||
| <line num="15" count="5" type="stmt"/> | ||
| <line num="16" count="5" type="stmt"/> | ||
| <line num="17" count="5" type="stmt"/> | ||
| <line num="18" count="5" type="stmt"/> | ||
| <line num="19" count="5" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="20" count="4" type="stmt"/> | ||
| <line num="21" count="5" type="stmt"/> | ||
| <line num="22" count="5" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="23" count="1" type="stmt"/> | ||
| <line num="24" count="1" type="stmt"/> | ||
| <line num="26" count="4" type="stmt"/> | ||
| <line num="27" count="4" type="stmt"/> | ||
| </file> | ||
| </project> | ||
| </coverage> |
@@ -385,3 +385,3 @@ | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2026-04-29T12:51:10.856Z | ||
| at 2026-05-01T17:30:38.384Z | ||
| </div> | ||
@@ -388,0 +388,0 @@ <script src="prettify.js"></script> |
@@ -1,3 +0,4 @@ | ||
| {"/Users/robert/projects/contractkit/apps/cli/src/cache.ts": {"path":"/Users/robert/projects/contractkit/apps/cli/src/cache.ts","statementMap":{"0":{"start":{"line":5,"column":38},"end":{"line":5,"column":null}},"1":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"2":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"3":{"start":{"line":17,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"6":{"start":{"line":25,"column":10},"end":{"line":25,"column":null}},"7":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"8":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"9":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"10":{"start":{"line":31,"column":30},"end":{"line":31,"column":null}},"11":{"start":{"line":32,"column":24},"end":{"line":32,"column":null}},"12":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}}},"fnMap":{"0":{"name":"computeHash","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":43},"end":{"line":13,"column":null}},"line":11},"1":{"name":"loadCache","decl":{"start":{"line":15,"column":16},"end":{"line":15,"column":26}},"loc":{"start":{"line":15,"column":80},"end":{"line":22,"column":null}},"line":15},"2":{"name":"saveCache","decl":{"start":{"line":24,"column":16},"end":{"line":24,"column":26}},"loc":{"start":{"line":24,"column":100},"end":{"line":28,"column":null}},"line":24},"3":{"name":"isFileChanged","decl":{"start":{"line":30,"column":16},"end":{"line":30,"column":30}},"loc":{"start":{"line":30,"column":100},"end":{"line":34,"column":null}},"line":30}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":39},"end":{"line":15,"column":80}},"type":"default-arg","locations":[{"start":{"line":15,"column":58},"end":{"line":15,"column":80}}],"line":15},"1":{"loc":{"start":{"line":24,"column":59},"end":{"line":24,"column":100}},"type":"default-arg","locations":[{"start":{"line":24,"column":78},"end":{"line":24,"column":100}}],"line":24},"2":{"loc":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},{"start":{},"end":{}}],"line":31}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0],"2":[0,0]},"meta":{"lastBranch":3,"lastFunction":4,"lastStatement":13,"seen":{"s:5:38:5:Infinity":0,"f:11:16:11:28":0,"s:12:4:12:Infinity":1,"f:15:16:15:26":1,"b:15:58:15:80":0,"s:16:10:16:Infinity":2,"s:17:4:21:Infinity":3,"s:18:8:18:Infinity":4,"s:20:8:20:Infinity":5,"f:24:16:24:26":2,"b:24:78:24:100":1,"s:25:10:25:Infinity":6,"s:26:4:26:Infinity":7,"s:27:4:27:Infinity":8,"f:30:16:30:30":3,"b:31:4:31:Infinity:undefined:undefined:undefined:undefined":2,"s:31:4:31:Infinity":9,"s:31:30:31:Infinity":10,"s:32:24:32:Infinity":11,"s:33:4:33:Infinity":12}}} | ||
| ,"/Users/robert/projects/contractkit/apps/cli/src/config.ts": {"path":"/Users/robert/projects/contractkit/apps/cli/src/config.ts","statementMap":{"0":{"start":{"line":32,"column":24},"end":{"line":32,"column":null}},"1":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"2":{"start":{"line":40,"column":14},"end":{"line":40,"column":null}},"3":{"start":{"line":41,"column":8},"end":{"line":46,"column":null}},"4":{"start":{"line":42,"column":18},"end":{"line":42,"column":null}},"5":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"6":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"7":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"8":{"start":{"line":50,"column":4},"end":{"line":61,"column":null}},"9":{"start":{"line":51,"column":14},"end":{"line":51,"column":null}},"10":{"start":{"line":52,"column":8},"end":{"line":57,"column":null}},"11":{"start":{"line":53,"column":18},"end":{"line":53,"column":null}},"12":{"start":{"line":54,"column":12},"end":{"line":54,"column":null}},"13":{"start":{"line":58,"column":14},"end":{"line":58,"column":null}},"14":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"15":{"start":{"line":59,"column":28},"end":{"line":59,"column":null}},"16":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"17":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"18":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"19":{"start":{"line":78,"column":18},"end":{"line":78,"column":null}},"20":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"21":{"start":{"line":79,"column":61},"end":{"line":79,"column":null}},"22":{"start":{"line":85,"column":8},"end":{"line":87,"column":null}},"23":{"start":{"line":89,"column":18},"end":{"line":89,"column":null}},"24":{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},"25":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"26":{"start":{"line":94,"column":4},"end":{"line":103,"column":null}}},"fnMap":{"0":{"name":"loadConfig","decl":{"start":{"line":38,"column":16},"end":{"line":38,"column":27}},"loc":{"start":{"line":38,"column":80},"end":{"line":64,"column":null}},"line":38},"1":{"name":"normalizePlugins","decl":{"start":{"line":77,"column":9},"end":{"line":77,"column":26}},"loc":{"start":{"line":77,"column":60},"end":{"line":80,"column":null}},"line":77},"2":{"name":"(anonymous_2)","decl":{"start":{"line":79,"column":39},"end":{"line":79,"column":40}},"loc":{"start":{"line":79,"column":61},"end":{"line":79,"column":null}},"line":79},"3":{"name":"mergeConfig","decl":{"start":{"line":83,"column":16},"end":{"line":83,"column":28}},"loc":{"start":{"line":83,"column":125},"end":{"line":104,"column":null}},"line":83}},"branchMap":{"0":{"loc":{"start":{"line":38,"column":48},"end":{"line":38,"column":80}},"type":"default-arg","locations":[{"start":{"line":38,"column":67},"end":{"line":38,"column":80}}],"line":38},"1":{"loc":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},{"start":{},"end":{}}],"line":39},"2":{"loc":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},{"start":{},"end":{}}],"line":59},"3":{"loc":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},{"start":{},"end":{}}],"line":78},"4":{"loc":{"start":{"line":83,"column":92},"end":{"line":83,"column":125}},"type":"default-arg","locations":[{"start":{"line":83,"column":112},"end":{"line":83,"column":125}}],"line":83},"5":{"loc":{"start":{"line":85,"column":8},"end":{"line":87,"column":null}},"type":"cond-expr","locations":[{"start":{"line":86,"column":14},"end":{"line":86,"column":null}},{"start":{"line":87,"column":14},"end":{"line":87,"column":null}}],"line":85},"6":{"loc":{"start":{"line":89,"column":18},"end":{"line":89,"column":null}},"type":"binary-expr","locations":[{"start":{"line":89,"column":18},"end":{"line":89,"column":32}},{"start":{"line":89,"column":36},"end":{"line":89,"column":null}}],"line":89},"7":{"loc":{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},{"start":{},"end":{}}],"line":90},"8":{"loc":{"start":{"line":95,"column":18},"end":{"line":95,"column":39}},"type":"binary-expr","locations":[{"start":{"line":95,"column":18},"end":{"line":95,"column":33}},{"start":{"line":95,"column":37},"end":{"line":95,"column":39}}],"line":95},"9":{"loc":{"start":{"line":100,"column":18},"end":{"line":100,"column":null}},"type":"binary-expr","locations":[{"start":{"line":100,"column":18},"end":{"line":100,"column":33}},{"start":{"line":100,"column":37},"end":{"line":100,"column":null}}],"line":100}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":13,"19":12,"20":1,"21":1,"22":13,"23":13,"24":13,"25":0,"26":13},"f":{"0":0,"1":13,"2":1,"3":13},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[12,1],"4":[13],"5":[1,12],"6":[13,13],"7":[0,13],"8":[13,12],"9":[13,11]},"meta":{"lastBranch":10,"lastFunction":4,"lastStatement":27,"seen":{"s:32:24:32:Infinity":0,"f:38:16:38:27":0,"b:38:67:38:80":0,"b:39:4:47:Infinity:undefined:undefined:undefined:undefined":1,"s:39:4:47:Infinity":1,"s:40:14:40:Infinity":2,"s:41:8:46:Infinity":3,"s:42:18:42:Infinity":4,"s:43:12:43:Infinity":5,"s:45:12:45:Infinity":6,"s:49:8:49:Infinity":7,"s:50:4:61:Infinity":8,"s:51:14:51:Infinity":9,"s:52:8:57:Infinity":10,"s:53:18:53:Infinity":11,"s:54:12:54:Infinity":12,"s:58:14:58:Infinity":13,"b:59:8:59:Infinity:undefined:undefined:undefined:undefined":2,"s:59:8:59:Infinity":14,"s:59:28:59:Infinity":15,"s:60:8:60:Infinity":16,"s:63:4:63:Infinity":17,"f:77:9:77:26":1,"b:78:4:78:Infinity:undefined:undefined:undefined:undefined":3,"s:78:4:78:Infinity":18,"s:78:18:78:Infinity":19,"s:79:4:79:Infinity":20,"f:79:39:79:40":2,"s:79:61:79:Infinity":21,"f:83:16:83:28":3,"b:83:112:83:125":4,"s:85:8:87:Infinity":22,"b:86:14:86:Infinity:87:14:87:Infinity":5,"s:89:18:89:Infinity":23,"b:89:18:89:32:89:36:89:Infinity":6,"b:90:4:92:Infinity:undefined:undefined:undefined:undefined":7,"s:90:4:92:Infinity":24,"s:91:8:91:Infinity":25,"s:94:4:103:Infinity":26,"b:95:18:95:33:95:37:95:39":8,"b:100:18:100:33:100:37:100:Infinity":9}}} | ||
| {"/home/runner/work/ContractKit/ContractKit/apps/cli/src/cache.ts": {"path":"/home/runner/work/ContractKit/ContractKit/apps/cli/src/cache.ts","statementMap":{"0":{"start":{"line":5,"column":38},"end":{"line":5,"column":null}},"1":{"start":{"line":12,"column":4},"end":{"line":12,"column":null}},"2":{"start":{"line":16,"column":10},"end":{"line":16,"column":null}},"3":{"start":{"line":17,"column":4},"end":{"line":21,"column":null}},"4":{"start":{"line":18,"column":8},"end":{"line":18,"column":null}},"5":{"start":{"line":20,"column":8},"end":{"line":20,"column":null}},"6":{"start":{"line":25,"column":10},"end":{"line":25,"column":null}},"7":{"start":{"line":26,"column":4},"end":{"line":26,"column":null}},"8":{"start":{"line":27,"column":4},"end":{"line":27,"column":null}},"9":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"10":{"start":{"line":31,"column":30},"end":{"line":31,"column":null}},"11":{"start":{"line":32,"column":24},"end":{"line":32,"column":null}},"12":{"start":{"line":33,"column":4},"end":{"line":33,"column":null}}},"fnMap":{"0":{"name":"computeHash","decl":{"start":{"line":11,"column":16},"end":{"line":11,"column":28}},"loc":{"start":{"line":11,"column":43},"end":{"line":13,"column":null}},"line":11},"1":{"name":"loadCache","decl":{"start":{"line":15,"column":16},"end":{"line":15,"column":26}},"loc":{"start":{"line":15,"column":80},"end":{"line":22,"column":null}},"line":15},"2":{"name":"saveCache","decl":{"start":{"line":24,"column":16},"end":{"line":24,"column":26}},"loc":{"start":{"line":24,"column":100},"end":{"line":28,"column":null}},"line":24},"3":{"name":"isFileChanged","decl":{"start":{"line":30,"column":16},"end":{"line":30,"column":30}},"loc":{"start":{"line":30,"column":100},"end":{"line":34,"column":null}},"line":30}},"branchMap":{"0":{"loc":{"start":{"line":15,"column":39},"end":{"line":15,"column":80}},"type":"default-arg","locations":[{"start":{"line":15,"column":58},"end":{"line":15,"column":80}}],"line":15},"1":{"loc":{"start":{"line":24,"column":59},"end":{"line":24,"column":100}},"type":"default-arg","locations":[{"start":{"line":24,"column":78},"end":{"line":24,"column":100}}],"line":24},"2":{"loc":{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},"type":"if","locations":[{"start":{"line":31,"column":4},"end":{"line":31,"column":null}},{"start":{},"end":{}}],"line":31}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0},"f":{"0":0,"1":0,"2":0,"3":0},"b":{"0":[0],"1":[0],"2":[0,0]},"meta":{"lastBranch":3,"lastFunction":4,"lastStatement":13,"seen":{"s:5:38:5:Infinity":0,"f:11:16:11:28":0,"s:12:4:12:Infinity":1,"f:15:16:15:26":1,"b:15:58:15:80":0,"s:16:10:16:Infinity":2,"s:17:4:21:Infinity":3,"s:18:8:18:Infinity":4,"s:20:8:20:Infinity":5,"f:24:16:24:26":2,"b:24:78:24:100":1,"s:25:10:25:Infinity":6,"s:26:4:26:Infinity":7,"s:27:4:27:Infinity":8,"f:30:16:30:30":3,"b:31:4:31:Infinity:undefined:undefined:undefined:undefined":2,"s:31:4:31:Infinity":9,"s:31:30:31:Infinity":10,"s:32:24:32:Infinity":11,"s:33:4:33:Infinity":12}}} | ||
| ,"/home/runner/work/ContractKit/ContractKit/apps/cli/src/config.ts": {"path":"/home/runner/work/ContractKit/ContractKit/apps/cli/src/config.ts","statementMap":{"0":{"start":{"line":32,"column":24},"end":{"line":32,"column":null}},"1":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"2":{"start":{"line":40,"column":14},"end":{"line":40,"column":null}},"3":{"start":{"line":41,"column":8},"end":{"line":46,"column":null}},"4":{"start":{"line":42,"column":18},"end":{"line":42,"column":null}},"5":{"start":{"line":43,"column":12},"end":{"line":43,"column":null}},"6":{"start":{"line":45,"column":12},"end":{"line":45,"column":null}},"7":{"start":{"line":49,"column":8},"end":{"line":49,"column":null}},"8":{"start":{"line":50,"column":4},"end":{"line":61,"column":null}},"9":{"start":{"line":51,"column":14},"end":{"line":51,"column":null}},"10":{"start":{"line":52,"column":8},"end":{"line":57,"column":null}},"11":{"start":{"line":53,"column":18},"end":{"line":53,"column":null}},"12":{"start":{"line":54,"column":12},"end":{"line":54,"column":null}},"13":{"start":{"line":58,"column":14},"end":{"line":58,"column":null}},"14":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"15":{"start":{"line":59,"column":28},"end":{"line":59,"column":null}},"16":{"start":{"line":60,"column":8},"end":{"line":60,"column":null}},"17":{"start":{"line":63,"column":4},"end":{"line":63,"column":null}},"18":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"19":{"start":{"line":78,"column":18},"end":{"line":78,"column":null}},"20":{"start":{"line":79,"column":4},"end":{"line":79,"column":null}},"21":{"start":{"line":79,"column":61},"end":{"line":79,"column":null}},"22":{"start":{"line":85,"column":8},"end":{"line":87,"column":null}},"23":{"start":{"line":89,"column":18},"end":{"line":89,"column":null}},"24":{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},"25":{"start":{"line":91,"column":8},"end":{"line":91,"column":null}},"26":{"start":{"line":94,"column":4},"end":{"line":103,"column":null}}},"fnMap":{"0":{"name":"loadConfig","decl":{"start":{"line":38,"column":16},"end":{"line":38,"column":27}},"loc":{"start":{"line":38,"column":80},"end":{"line":64,"column":null}},"line":38},"1":{"name":"normalizePlugins","decl":{"start":{"line":77,"column":9},"end":{"line":77,"column":26}},"loc":{"start":{"line":77,"column":60},"end":{"line":80,"column":null}},"line":77},"2":{"name":"(anonymous_2)","decl":{"start":{"line":79,"column":39},"end":{"line":79,"column":40}},"loc":{"start":{"line":79,"column":61},"end":{"line":79,"column":null}},"line":79},"3":{"name":"mergeConfig","decl":{"start":{"line":83,"column":16},"end":{"line":83,"column":28}},"loc":{"start":{"line":83,"column":125},"end":{"line":104,"column":null}},"line":83}},"branchMap":{"0":{"loc":{"start":{"line":38,"column":48},"end":{"line":38,"column":80}},"type":"default-arg","locations":[{"start":{"line":38,"column":67},"end":{"line":38,"column":80}}],"line":38},"1":{"loc":{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},"type":"if","locations":[{"start":{"line":39,"column":4},"end":{"line":47,"column":null}},{"start":{},"end":{}}],"line":39},"2":{"loc":{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},"type":"if","locations":[{"start":{"line":59,"column":8},"end":{"line":59,"column":null}},{"start":{},"end":{}}],"line":59},"3":{"loc":{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},"type":"if","locations":[{"start":{"line":78,"column":4},"end":{"line":78,"column":null}},{"start":{},"end":{}}],"line":78},"4":{"loc":{"start":{"line":83,"column":92},"end":{"line":83,"column":125}},"type":"default-arg","locations":[{"start":{"line":83,"column":112},"end":{"line":83,"column":125}}],"line":83},"5":{"loc":{"start":{"line":85,"column":8},"end":{"line":87,"column":null}},"type":"cond-expr","locations":[{"start":{"line":86,"column":14},"end":{"line":86,"column":null}},{"start":{"line":87,"column":14},"end":{"line":87,"column":null}}],"line":85},"6":{"loc":{"start":{"line":89,"column":18},"end":{"line":89,"column":null}},"type":"binary-expr","locations":[{"start":{"line":89,"column":18},"end":{"line":89,"column":32}},{"start":{"line":89,"column":36},"end":{"line":89,"column":null}}],"line":89},"7":{"loc":{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},"type":"if","locations":[{"start":{"line":90,"column":4},"end":{"line":92,"column":null}},{"start":{},"end":{}}],"line":90},"8":{"loc":{"start":{"line":95,"column":18},"end":{"line":95,"column":39}},"type":"binary-expr","locations":[{"start":{"line":95,"column":18},"end":{"line":95,"column":33}},{"start":{"line":95,"column":37},"end":{"line":95,"column":39}}],"line":95},"9":{"loc":{"start":{"line":100,"column":18},"end":{"line":100,"column":null}},"type":"binary-expr","locations":[{"start":{"line":100,"column":18},"end":{"line":100,"column":33}},{"start":{"line":100,"column":37},"end":{"line":100,"column":null}}],"line":100}},"s":{"0":1,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":13,"19":12,"20":1,"21":1,"22":13,"23":13,"24":13,"25":0,"26":13},"f":{"0":0,"1":13,"2":1,"3":13},"b":{"0":[0],"1":[0,0],"2":[0,0],"3":[12,1],"4":[13],"5":[1,12],"6":[13,13],"7":[0,13],"8":[13,12],"9":[13,11]},"meta":{"lastBranch":10,"lastFunction":4,"lastStatement":27,"seen":{"s:32:24:32:Infinity":0,"f:38:16:38:27":0,"b:38:67:38:80":0,"b:39:4:47:Infinity:undefined:undefined:undefined:undefined":1,"s:39:4:47:Infinity":1,"s:40:14:40:Infinity":2,"s:41:8:46:Infinity":3,"s:42:18:42:Infinity":4,"s:43:12:43:Infinity":5,"s:45:12:45:Infinity":6,"s:49:8:49:Infinity":7,"s:50:4:61:Infinity":8,"s:51:14:51:Infinity":9,"s:52:8:57:Infinity":10,"s:53:18:53:Infinity":11,"s:54:12:54:Infinity":12,"s:58:14:58:Infinity":13,"b:59:8:59:Infinity:undefined:undefined:undefined:undefined":2,"s:59:8:59:Infinity":14,"s:59:28:59:Infinity":15,"s:60:8:60:Infinity":16,"s:63:4:63:Infinity":17,"f:77:9:77:26":1,"b:78:4:78:Infinity:undefined:undefined:undefined:undefined":3,"s:78:4:78:Infinity":18,"s:78:18:78:Infinity":19,"s:79:4:79:Infinity":20,"f:79:39:79:40":2,"s:79:61:79:Infinity":21,"f:83:16:83:28":3,"b:83:112:83:125":4,"s:85:8:87:Infinity":22,"b:86:14:86:Infinity:87:14:87:Infinity":5,"s:89:18:89:Infinity":23,"b:89:18:89:32:89:36:89:Infinity":6,"b:90:4:92:Infinity:undefined:undefined:undefined:undefined":7,"s:90:4:92:Infinity":24,"s:91:8:91:Infinity":25,"s:94:4:103:Infinity":26,"b:95:18:95:33:95:37:95:39":8,"b:100:18:100:33:100:37:100:Infinity":9}}} | ||
| ,"/home/runner/work/ContractKit/ContractKit/apps/cli/src/resolve-plugin-files.ts": {"path":"/home/runner/work/ContractKit/ContractKit/apps/cli/src/resolve-plugin-files.ts","statementMap":{"0":{"start":{"line":15,"column":4},"end":{"line":31,"column":null}},"1":{"start":{"line":16,"column":14},"end":{"line":16,"column":null}},"2":{"start":{"line":17,"column":8},"end":{"line":30,"column":null}},"3":{"start":{"line":18,"column":12},"end":{"line":29,"column":null}},"4":{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},"5":{"start":{"line":19,"column":33},"end":{"line":19,"column":null}},"6":{"start":{"line":20,"column":16},"end":{"line":28,"column":null}},"7":{"start":{"line":21,"column":26},"end":{"line":21,"column":null}},"8":{"start":{"line":22,"column":20},"end":{"line":25,"column":null}},"9":{"start":{"line":23,"column":24},"end":{"line":23,"column":null}},"10":{"start":{"line":24,"column":24},"end":{"line":24,"column":null}},"11":{"start":{"line":26,"column":20},"end":{"line":26,"column":null}},"12":{"start":{"line":27,"column":20},"end":{"line":27,"column":null}}},"fnMap":{"0":{"name":"resolvePluginFiles","decl":{"start":{"line":14,"column":16},"end":{"line":14,"column":35}},"loc":{"start":{"line":14,"column":98},"end":{"line":32,"column":null}},"line":14}},"branchMap":{"0":{"loc":{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},"type":"if","locations":[{"start":{"line":19,"column":16},"end":{"line":19,"column":null}},{"start":{},"end":{}}],"line":19},"1":{"loc":{"start":{"line":22,"column":20},"end":{"line":25,"column":null}},"type":"if","locations":[{"start":{"line":22,"column":20},"end":{"line":25,"column":null}},{"start":{},"end":{}}],"line":22}},"s":{"0":5,"1":5,"2":5,"3":5,"4":5,"5":1,"6":4,"7":5,"8":5,"9":1,"10":1,"11":4,"12":4},"f":{"0":5},"b":{"0":[1,4],"1":[1,4]},"meta":{"lastBranch":2,"lastFunction":1,"lastStatement":13,"seen":{"f:14:16:14:35":0,"s:15:4:31:Infinity":0,"s:16:14:16:Infinity":1,"s:17:8:30:Infinity":2,"s:18:12:29:Infinity":3,"b:19:16:19:Infinity:undefined:undefined:undefined:undefined":0,"s:19:16:19:Infinity":4,"s:19:33:19:Infinity":5,"s:20:16:28:Infinity":6,"s:21:26:21:Infinity":7,"b:22:20:25:Infinity:undefined:undefined:undefined:undefined":1,"s:22:20:25:Infinity":8,"s:23:24:23:Infinity":9,"s:24:24:24:Infinity":10,"s:26:20:26:Infinity":11,"s:27:20:27:Infinity":12}}} | ||
| } |
+24
-9
@@ -26,5 +26,5 @@ | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">25% </span> | ||
| <span class="strong">43.39% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>10/40</span> | ||
| <span class='fraction'>23/53</span> | ||
| </div> | ||
@@ -34,5 +34,5 @@ | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">54.54% </span> | ||
| <span class="strong">61.53% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>12/22</span> | ||
| <span class='fraction'>16/26</span> | ||
| </div> | ||
@@ -42,5 +42,5 @@ | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">37.5% </span> | ||
| <span class="strong">44.44% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/8</span> | ||
| <span class='fraction'>4/9</span> | ||
| </div> | ||
@@ -50,5 +50,5 @@ | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">22.22% </span> | ||
| <span class="strong">41.66% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/36</span> | ||
| <span class='fraction'>20/48</span> | ||
| </div> | ||
@@ -115,2 +115,17 @@ | ||
| <tr> | ||
| <td class="file high" data-value="resolve-plugin-files.ts"><a href="resolve-plugin-files.ts.html">resolve-plugin-files.ts</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="13" class="abs high">13/13</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="4" class="abs high">4/4</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="1" class="abs high">1/1</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="12" class="abs high">12/12</td> | ||
| </tr> | ||
| </tbody> | ||
@@ -124,3 +139,3 @@ </table> | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2026-04-29T12:51:10.856Z | ||
| at 2026-05-01T17:30:38.384Z | ||
| </div> | ||
@@ -127,0 +142,0 @@ <script src="prettify.js"></script> |
+34
-8
@@ -7,4 +7,4 @@ #!/usr/bin/env node | ||
| import { default as importOpenApiPlugin } from "@contractkit/openapi-to-ck/plugin"; | ||
| import { readFileSync as readFileSync3, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "fs"; | ||
| import { resolve as resolve3, join as join3, dirname as dirname3 } from "path"; | ||
| import { readFileSync as readFileSync4, writeFileSync as writeFileSync2, mkdirSync as mkdirSync2 } from "fs"; | ||
| import { resolve as resolve4, join as join3, dirname as dirname4 } from "path"; | ||
| import { glob } from "glob"; | ||
@@ -168,2 +168,26 @@ import { DiagnosticCollector, parseCk, decomposeCk, validateOp, validateRefs, validateInheritance, applyOptionsDefaults, computeModelsWithInput, computeModelsWithOutput } from "@contractkit/core"; | ||
| // src/resolve-plugin-files.ts | ||
| import { existsSync as existsSync3, readFileSync as readFileSync3 } from "fs"; | ||
| import { resolve as resolve3, dirname as dirname3 } from "path"; | ||
| function resolvePluginFiles(roots, rootDir, diag) { | ||
| for (const root of roots) { | ||
| const contractDir = dirname3(resolve3(rootDir, root.file)); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| if (!op.plugins) continue; | ||
| for (const [name, value] of Object.entries(op.plugins)) { | ||
| const absPath = resolve3(contractDir, value); | ||
| if (!existsSync3(absPath)) { | ||
| diag.warn(root.file, op.loc.line, `plugins.${name}: file not found: ${value}`); | ||
| continue; | ||
| } | ||
| op.pluginFiles ??= {}; | ||
| op.pluginFiles[name] = readFileSync3(absPath, "utf-8"); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| __name(resolvePluginFiles, "resolvePluginFiles"); | ||
| // src/cli.ts | ||
@@ -223,3 +247,3 @@ var BUILTIN_COMMAND_PLUGINS = [ | ||
| absolute: true, | ||
| cwd: resolve3(rootDir) | ||
| cwd: resolve4(rootDir) | ||
| }); | ||
@@ -296,3 +320,3 @@ files.push(...matches); | ||
| const diag = new DiagnosticCollector(); | ||
| const resolvedBase = resolve3(config.rootDir); | ||
| const resolvedBase = resolve4(config.rootDir); | ||
| const cacheEnabled = config.cache.enabled && !config.force; | ||
@@ -308,3 +332,3 @@ const cache = cacheEnabled ? loadCache(resolvedBase, config.cache.filename) : {}; | ||
| } | ||
| const source = readFileSync3(filePath, "utf-8"); | ||
| const source = readFileSync4(filePath, "utf-8"); | ||
| newCache[filePath] = computeHash(source); | ||
@@ -334,2 +358,3 @@ let ckAst = parseCk(source, filePath, diag); | ||
| } | ||
| resolvePluginFiles(allOps, resolvedBase, diag); | ||
| const modelsWithInput = computeModelsWithInput(allContracts.flatMap((r) => r.models)); | ||
@@ -393,4 +418,4 @@ const modelsWithOutput = computeModelsWithOutput(allContracts.flatMap((r) => r.models)); | ||
| } | ||
| diag.report(); | ||
| if (diag.hasErrors()) { | ||
| diag.report(); | ||
| console.error("\nCompilation failed."); | ||
@@ -407,3 +432,3 @@ process.exitCode = 1; | ||
| for (const { outPath, content } of results) { | ||
| mkdirSync2(dirname3(outPath), { | ||
| mkdirSync2(dirname4(outPath), { | ||
| recursive: true | ||
@@ -417,2 +442,3 @@ }); | ||
| } | ||
| diag.report(); | ||
| console.log(` | ||
@@ -425,3 +451,3 @@ Compiled ${results.length} file(s).`); | ||
| const watchFiles = await resolveFiles(config.patterns, config.rootDir); | ||
| const allDirs = new Set(watchFiles.map((f) => dirname3(f))); | ||
| const allDirs = new Set(watchFiles.map((f) => dirname4(f))); | ||
| console.log("\nWatching for changes..."); | ||
@@ -428,0 +454,0 @@ for (const dir of allDirs) { |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/cache.ts","../src/plugin.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// ─── Built-in command plugins ─────────────────────────────────────────────\n// Each plugin may expose a `command` hook — the CLI dispatches subcommands\n// to the first plugin whose command.name matches argv[2].\nimport { default as importOpenApiPlugin } from '@contractkit/openapi-to-ck/plugin';\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, join, dirname } from 'node:path';\nimport { glob } from 'glob';\nimport {\n DiagnosticCollector,\n parseCk,\n decomposeCk,\n validateOp,\n validateRefs,\n validateInheritance,\n applyOptionsDefaults,\n computeModelsWithInput,\n computeModelsWithOutput,\n} from '@contractkit/core';\nimport type { ContractRootNode, OpRootNode } from '@contractkit/core';\nimport { loadConfig, mergeConfig } from './config.js';\nimport { loadCache, saveCache, computeHash } from './cache.js';\nimport { loadPlugins, makePluginContext, computePluginFingerprint, pluginOutputsExist } from './plugin.js';\nimport type { FileHashMap } from './cache.js';\n\n// ─── Arg parsing ───────────────────────────────────────────────────────────\n\ninterface CliArgs {\n config?: string;\n watch: boolean;\n force: boolean;\n help: boolean;\n}\n\nconst BUILTIN_COMMAND_PLUGINS = [importOpenApiPlugin];\n\nfunction printHelp(): void {\n console.log('Usage: contractkit [command] [options]');\n console.log('');\n console.log('Commands:');\n for (const plugin of BUILTIN_COMMAND_PLUGINS) {\n if (plugin.command) {\n console.log(` ${plugin.command.name.padEnd(20)} ${plugin.command.description}`);\n }\n }\n console.log('');\n console.log('Options:');\n console.log(' -c, --config <path> Path to config file (default: contractkit.config.json)');\n console.log(' -w, --watch Watch for changes and recompile');\n console.log(' --force Skip cache and recompile all files');\n console.log(' -h, --help Show this help message');\n console.log('');\n console.log('Configure patterns, output dirs, and plugins in contractkit.config.json.');\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let config: string | undefined;\n let watch = false;\n let force = false;\n let help = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--config' || arg === '-c') {\n config = args[++i];\n } else if (arg === '--watch' || arg === '-w') {\n watch = true;\n } else if (arg === '--force') {\n force = true;\n } else if (arg === '--help' || arg === '-h') {\n help = true;\n }\n }\n\n return { config, watch, force, help };\n}\n\n// ─── File resolution ───────────────────────────────────────────────────────\n\nasync function resolveFiles(patterns: string[], rootDir: string): Promise<string[]> {\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, { absolute: true, cwd: resolve(rootDir) });\n files.push(...matches);\n }\n return [...new Set(files)];\n}\n\n// ─── Prettier formatting ──────────────────────────────────────────────────\n\nasync function formatWithPrettier(results: { outPath: string; content: string }[]): Promise<void> {\n let prettier: typeof import('prettier');\n try {\n prettier = await import('prettier');\n } catch {\n console.warn(' ⚠ prettier not found — skipping format step');\n return;\n }\n for (const result of results) {\n try {\n const options = (await prettier.resolveConfig(result.outPath)) ?? {};\n result.content = await prettier.format(result.content, {\n ...options,\n filepath: result.outPath,\n });\n } catch {\n // Leave content unformatted if prettier fails (e.g. unsupported parser)\n }\n }\n}\n\n// ─── Main ─────────────────────────────────────────────────────────────────\n\nasync function main() {\n const cliArgs = parseArgs(process.argv);\n\n if (cliArgs.help) {\n printHelp();\n process.exit(0);\n }\n\n // ── Built-in subcommand dispatch ──────────────────────────────────────\n const subcommand = process.argv[2];\n if (subcommand && !subcommand.startsWith('-')) {\n const matched = BUILTIN_COMMAND_PLUGINS.find(p => p.command?.name === subcommand);\n if (matched?.command) {\n const subArgs = process.argv.slice(3);\n if (subArgs.includes('--help') || subArgs.includes('-h')) {\n console.log(matched.command.usage);\n process.exit(0);\n }\n const { config: fileConfig, configDir } = loadConfig(cliArgs.config);\n const resolved = mergeConfig(fileConfig, { watch: false, force: false }, configDir);\n await matched.command.run(subArgs, { rootDir: resolved.rootDir, configDir });\n process.exit(0);\n }\n console.error(`Unknown command: \"${subcommand}\". Run \"contractkit --help\" for usage.`);\n process.exit(1);\n }\n\n const { config: fileConfig, configDir } = loadConfig(cliArgs.config);\n const config = mergeConfig(fileConfig, cliArgs, configDir);\n const plugins = await loadPlugins(config.plugins, config.configDir);\n\n if (config.patterns.length === 0) {\n printHelp();\n process.exit(1);\n }\n\n const run = async () => {\n const files = await resolveFiles(config.patterns, config.rootDir);\n\n if (files.length === 0) {\n console.warn(`No matching files found for patterns:`, config.patterns.join(', '));\n return;\n }\n\n const diag = new DiagnosticCollector();\n const resolvedBase = resolve(config.rootDir);\n const cacheEnabled = config.cache.enabled && !config.force;\n const cache: FileHashMap = cacheEnabled ? loadCache(resolvedBase, config.cache.filename) : {};\n const newCache: FileHashMap = {};\n\n // ── Parse all .ck files ────────────────────────────────────────\n const allContracts: ContractRootNode[] = [];\n const allOps: OpRootNode[] = [];\n\n for (const filePath of files) {\n if (!filePath.endsWith('.ck')) {\n diag.warn(filePath, 0, `Skipping unknown file extension (expected .ck)`);\n continue;\n }\n\n const source = readFileSync(filePath, 'utf-8');\n newCache[filePath] = computeHash(source);\n\n let ckAst = parseCk(source, filePath, diag);\n // Merge options-level header globals into each operation before plugins run,\n // so transform/validate hooks see the fully-resolved AST.\n applyOptionsDefaults(ckAst, diag);\n\n // Plugin: validate + transform hooks (run before decompose and cross-file validation)\n for (const { plugin, entry } of plugins) {\n const ctx = makePluginContext(entry, config);\n if (plugin.validate) {\n try {\n await plugin.validate(ckAst, ctx);\n } catch (err) {\n diag.error(filePath, 0, `[plugin:${plugin.name}] ${(err as Error).message}`);\n }\n }\n if (plugin.transform) {\n try {\n ckAst = await plugin.transform(ckAst, ctx);\n } catch (err) {\n diag.error(filePath, 0, `[plugin:${plugin.name}] ${(err as Error).message}`);\n }\n }\n }\n\n const { contract, op } = decomposeCk(ckAst);\n if (contract.models.length > 0) allContracts.push(contract);\n if (op.routes.length > 0) allOps.push(op);\n }\n\n // ── Compute cross-file semantics ───────────────────────────────\n // modelsWithInput: which model names need an Input variant (have readonly/writeonly\n // fields, or transitively reference models that do). Used by all code generators.\n const modelsWithInput = computeModelsWithInput(allContracts.flatMap(r => r.models));\n // modelsWithOutput: which model names need an Output variant (have format(output=...),\n // or transitively reference models that do). Used by codegen for the post-transform\n // wire shape on response bodies.\n const modelsWithOutput = computeModelsWithOutput(allContracts.flatMap(r => r.models));\n\n // ── Dependency fingerprint ─────────────────────────────────────\n const depsFingerprint = computeHash([...modelsWithInput].sort().join(',') + '|' + [...modelsWithOutput].sort().join(','));\n const depsChanged = cacheEnabled && cache['__deps__'] !== depsFingerprint;\n newCache['__deps__'] = depsFingerprint;\n\n if (diag.hasErrors()) {\n diag.report();\n console.error('\\nCompilation failed.');\n process.exitCode = 1;\n return;\n }\n\n // ── Cross-file validation ──────────────────────────────────────\n validateRefs(allContracts, allOps, diag);\n validateInheritance(allContracts, diag);\n\n for (const op of allOps) {\n validateOp(op, diag);\n }\n\n // ── Generate via plugins ───────────────────────────────────────\n const results: { outPath: string; content: string }[] = [];\n\n for (const { plugin, entry } of plugins) {\n if (!plugin.generateTargets) continue;\n\n const optionsSuffix = entry.options && Object.keys(entry.options).length > 0 ? `:${JSON.stringify(entry.options)}` : '';\n const cacheKey = plugin.cacheKey ? `${plugin.cacheKey}${optionsSuffix}` : undefined;\n if (cacheKey && !config.force && cacheEnabled && !depsChanged) {\n const fingerprint = computePluginFingerprint(newCache, cacheKey);\n if (cache[`__plugin_${cacheKey}__`] === fingerprint && pluginOutputsExist(cache, cacheKey)) {\n console.log(` - [plugin:${plugin.name}] (unchanged)`);\n newCache[`__plugin_${cacheKey}__`] = fingerprint;\n newCache[`__plugin_${cacheKey}__files__`] = cache[`__plugin_${cacheKey}__files__`] ?? '';\n continue;\n }\n }\n\n const pluginEmitted: { outPath: string; content: string }[] = [];\n const ctx = makePluginContext(entry, config, (outPath, content) => {\n pluginEmitted.push({ outPath, content });\n });\n\n try {\n await plugin.generateTargets(\n {\n contractRoots: allContracts,\n opRoots: allOps,\n modelsWithInput,\n modelsWithOutput,\n },\n ctx,\n );\n } catch (err) {\n diag.error('', 0, `[plugin:${plugin.name}] generateTargets failed: ${(err as Error).message}`);\n continue;\n }\n\n results.push(...pluginEmitted);\n\n if (cacheKey) {\n newCache[`__plugin_${cacheKey}__`] = computePluginFingerprint(newCache, cacheKey);\n newCache[`__plugin_${cacheKey}__files__`] = pluginEmitted.map(f => f.outPath).join('|');\n }\n }\n\n diag.report();\n\n if (diag.hasErrors()) {\n console.error('\\nCompilation failed.');\n process.exitCode = 1;\n return;\n }\n\n // ── Format with prettier (opt-in) ────────────────────────────\n if (config.prettier && results.length > 0) {\n await formatWithPrettier(results);\n }\n\n // ── Write output files ──────────────────────────────────────\n mkdirSync(resolvedBase, { recursive: true });\n\n for (const { outPath, content } of results) {\n mkdirSync(dirname(outPath), { recursive: true });\n writeFileSync(outPath, content, 'utf-8');\n console.log(` ✓ ${outPath}`);\n }\n\n // Save cache\n if (config.cache.enabled) {\n saveCache(resolvedBase, newCache, config.cache.filename);\n }\n\n console.log(`\\nCompiled ${results.length} file(s).`);\n };\n\n await run();\n\n if (config.watch) {\n const { watch } = await import('node:fs');\n const watchFiles = await resolveFiles(config.patterns, config.rootDir);\n const allDirs = new Set(watchFiles.map(f => dirname(f)));\n console.log('\\nWatching for changes...');\n for (const dir of allDirs) {\n watch(dir, { recursive: false }, async (event, filename) => {\n if (!filename) return;\n const full = join(dir, filename);\n if (!full.endsWith('.ck')) return;\n console.log(`\\nChange detected: ${filename}`);\n await run();\n });\n }\n }\n}\n\nmain().catch(err => {\n console.error('Unexpected error:', err);\n process.exit(1);\n});\n","import { readFileSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { DEFAULT_CACHE_FILENAME } from './cache.js';\nimport { homedir } from 'node:os';\n\nexport interface PluginEntry {\n /** npm package name or local path relative to contractkit.config.json */\n plugin: string;\n /** Plugin-specific options passed as ctx.options */\n options?: Record<string, unknown>;\n}\n\n/** Record-keyed plugin config: each key is the plugin package name, value is options. */\nexport type PluginsConfig = Record<string, Record<string, unknown>>;\n\nexport interface DslConfig {\n rootDir?: string;\n cache?: boolean | string;\n /** Glob patterns for .ck files to compile, relative to rootDir. */\n patterns?: string[];\n /** Run prettier on generated TypeScript files after compilation. Default: false. */\n prettier?: boolean;\n /** Plugins to load: each key is the plugin package name, value is its options. */\n plugins?: PluginsConfig;\n}\n\nexport interface ResolvedCacheConfig {\n enabled: boolean;\n filename: string;\n}\n\nconst CONFIG_FILENAME = 'contractkit.config.json';\n\n/**\n * Load config from an explicit path, or search upward from `startDir`\n * for contractkit.config.json.\n */\nexport function loadConfig(configPath?: string, startDir: string = process.cwd()): { config: DslConfig; configDir: string } {\n if (configPath) {\n const resolved = resolve(configPath);\n try {\n const text = readFileSync(resolved, 'utf-8');\n return { config: JSON.parse(text) as DslConfig, configDir: dirname(resolved) };\n } catch (err) {\n throw new Error(`Failed to load config from ${resolved}: ${(err as Error).message}`, { cause: err });\n }\n }\n\n let dir = resolve(startDir);\n while (true) {\n const candidate = join(dir, CONFIG_FILENAME);\n try {\n const text = readFileSync(candidate, 'utf-8');\n return { config: JSON.parse(text) as DslConfig, configDir: dir };\n } catch {\n // File not found or invalid -- walk up\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return { config: {}, configDir: resolve(startDir) };\n}\n\nexport interface ResolvedConfig {\n patterns: string[];\n rootDir: string;\n cache: ResolvedCacheConfig;\n watch: boolean;\n force: boolean;\n prettier: boolean;\n plugins: PluginEntry[];\n configDir: string;\n}\n\nfunction normalizePlugins(plugins: PluginsConfig | undefined): PluginEntry[] {\n if (!plugins) return [];\n return Object.entries(plugins).map(([name, options]) => ({ plugin: name, options }));\n}\n\n/** Merge config file values with CLI flags. */\nexport function mergeConfig(config: DslConfig, cliArgs: { watch: boolean; force: boolean }, configDir: string = process.cwd()): ResolvedConfig {\n const cache: ResolvedCacheConfig =\n typeof config.cache === 'string'\n ? { enabled: true, filename: config.cache }\n : { enabled: config.cache === true, filename: DEFAULT_CACHE_FILENAME };\n\n let rootDir = config.rootDir ?? '.';\n if (rootDir.startsWith('~')) {\n rootDir = homedir() + rootDir.slice(1);\n }\n\n return {\n patterns: config.patterns ?? [],\n rootDir: resolve(rootDir),\n cache,\n watch: cliArgs.watch,\n force: cliArgs.force,\n prettier: config.prettier ?? false,\n plugins: normalizePlugins(config.plugins),\n configDir,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport { join, dirname } from 'node:path';\n\nexport const DEFAULT_CACHE_FILENAME = '.contractkit-cache';\n\nexport interface FileHashMap {\n [filePath: string]: string; // path -> sha256 hex\n}\n\nexport function computeHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function loadCache(dir: string, filename: string = DEFAULT_CACHE_FILENAME): FileHashMap {\n const cachePath = join(dir, filename);\n try {\n return JSON.parse(readFileSync(cachePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function saveCache(dir: string, cache: FileHashMap, filename: string = DEFAULT_CACHE_FILENAME): void {\n const cachePath = join(dir, filename);\n mkdirSync(dirname(cachePath), { recursive: true });\n writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf-8');\n}\n\nexport function isFileChanged(filePath: string, content: string, outPath: string, cache: FileHashMap): boolean {\n if (!existsSync(outPath)) return true;\n const currentHash = computeHash(content);\n return cache[filePath] !== currentHash;\n}\n","import { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { computeHash } from './cache.js';\nimport type { PluginEntry, ResolvedConfig } from './config.js';\nimport type { ContractKitPlugin, PluginContext } from '@contractkit/core';\nimport type { FileHashMap } from './cache.js';\n\nexport type { ContractKitPlugin };\n\nexport interface LoadedPlugin {\n plugin: ContractKitPlugin;\n entry: PluginEntry;\n}\n\nexport async function loadPlugins(entries: PluginEntry[], configDir: string): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n for (const entry of entries) {\n const { plugin: specifier } = entry;\n const modulePath =\n specifier.startsWith('.') || specifier.startsWith('/') || isAbsolute(specifier)\n ? resolve(configDir, specifier)\n : createRequire(resolve(configDir, 'package.json')).resolve(specifier);\n let mod: unknown;\n try {\n mod = await import(modulePath);\n } catch (err) {\n throw new Error(`Failed to load plugin \"${specifier}\": ${(err as Error).message}`, { cause: err });\n }\n const raw =\n (mod as { default?: ContractKitPlugin; plugin?: ContractKitPlugin }).default ?? (mod as { plugin?: ContractKitPlugin }).plugin ?? mod;\n if (!raw || typeof raw !== 'object' || typeof (raw as { name?: string }).name !== 'string') {\n throw new Error(`Plugin \"${specifier}\" must export a ContractKitPlugin object with a \"name\" field.`);\n }\n loaded.push({ plugin: raw as ContractKitPlugin, entry });\n }\n return loaded;\n}\n\nexport function makePluginContext(entry: PluginEntry, config: ResolvedConfig, emitFile?: (outPath: string, content: string) => void): PluginContext {\n return {\n rootDir: config.rootDir,\n options: entry.options ?? {},\n emitFile:\n emitFile ??\n (() => {\n throw new Error('emitFile is only available in generateTargets');\n }),\n };\n}\n\nexport function computePluginFingerprint(newCache: FileHashMap, cacheKey: string): string {\n const allHashes = Object.values(newCache).sort().join('|') + '|' + cacheKey;\n return computeHash(allHashes);\n}\n\nexport function pluginOutputsExist(cache: FileHashMap, cacheKey: string): boolean {\n const raw = cache[`__plugin_${cacheKey}__files__`];\n if (!raw) return false;\n const files = (raw as string).split('|').filter(Boolean);\n return files.length > 0 && files.every(f => existsSync(f));\n}\n"],"mappings":"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","names":["default","importOpenApiPlugin","readFileSync","writeFileSync","mkdirSync","resolve","join","dirname","glob","DiagnosticCollector","parseCk","decomposeCk","validateOp","validateRefs","validateInheritance","applyOptionsDefaults","computeModelsWithInput","computeModelsWithOutput","readFileSync","resolve","dirname","join","readFileSync","writeFileSync","mkdirSync","existsSync","createHash","join","dirname","DEFAULT_CACHE_FILENAME","computeHash","content","createHash","update","digest","loadCache","dir","filename","cachePath","join","JSON","parse","readFileSync","saveCache","cache","mkdirSync","dirname","recursive","writeFileSync","stringify","homedir","CONFIG_FILENAME","loadConfig","configPath","startDir","process","cwd","resolved","resolve","text","readFileSync","config","JSON","parse","configDir","dirname","err","Error","message","cause","dir","candidate","join","parent","normalizePlugins","plugins","Object","entries","map","name","options","plugin","mergeConfig","cliArgs","cache","enabled","filename","DEFAULT_CACHE_FILENAME","rootDir","startsWith","homedir","slice","patterns","watch","force","prettier","resolve","isAbsolute","existsSync","createRequire","loadPlugins","entries","configDir","loaded","entry","plugin","specifier","modulePath","startsWith","isAbsolute","resolve","createRequire","mod","err","Error","message","cause","raw","default","name","push","makePluginContext","config","emitFile","rootDir","options","computePluginFingerprint","newCache","cacheKey","allHashes","Object","values","sort","join","computeHash","pluginOutputsExist","cache","files","split","filter","Boolean","length","every","f","existsSync","BUILTIN_COMMAND_PLUGINS","importOpenApiPlugin","printHelp","console","log","plugin","command","name","padEnd","description","parseArgs","argv","args","slice","config","watch","force","help","i","length","arg","resolveFiles","patterns","rootDir","files","pattern","matches","glob","absolute","cwd","resolve","push","Set","formatWithPrettier","results","prettier","warn","result","options","resolveConfig","outPath","content","format","filepath","main","cliArgs","process","exit","subcommand","startsWith","matched","find","p","subArgs","includes","usage","fileConfig","configDir","loadConfig","resolved","mergeConfig","run","error","plugins","loadPlugins","join","diag","DiagnosticCollector","resolvedBase","cacheEnabled","cache","enabled","loadCache","filename","newCache","allContracts","allOps","filePath","endsWith","source","readFileSync","computeHash","ckAst","parseCk","applyOptionsDefaults","entry","ctx","makePluginContext","validate","err","message","transform","contract","op","decomposeCk","models","routes","modelsWithInput","computeModelsWithInput","flatMap","r","modelsWithOutput","computeModelsWithOutput","depsFingerprint","sort","depsChanged","hasErrors","report","exitCode","validateRefs","validateInheritance","validateOp","generateTargets","optionsSuffix","Object","keys","JSON","stringify","cacheKey","undefined","fingerprint","computePluginFingerprint","pluginOutputsExist","pluginEmitted","contractRoots","opRoots","map","f","mkdirSync","recursive","dirname","writeFileSync","saveCache","watchFiles","allDirs","dir","event","full","catch"]} | ||
| {"version":3,"sources":["../src/cli.ts","../src/config.ts","../src/cache.ts","../src/plugin.ts","../src/resolve-plugin-files.ts"],"sourcesContent":["#!/usr/bin/env node\n\n// ─── Built-in command plugins ─────────────────────────────────────────────\n// Each plugin may expose a `command` hook — the CLI dispatches subcommands\n// to the first plugin whose command.name matches argv[2].\nimport { default as importOpenApiPlugin } from '@contractkit/openapi-to-ck/plugin';\n\nimport { readFileSync, writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, join, dirname } from 'node:path';\nimport { glob } from 'glob';\nimport {\n DiagnosticCollector,\n parseCk,\n decomposeCk,\n validateOp,\n validateRefs,\n validateInheritance,\n applyOptionsDefaults,\n computeModelsWithInput,\n computeModelsWithOutput,\n} from '@contractkit/core';\nimport type { ContractRootNode, OpRootNode } from '@contractkit/core';\nimport { loadConfig, mergeConfig } from './config.js';\nimport { loadCache, saveCache, computeHash } from './cache.js';\nimport { loadPlugins, makePluginContext, computePluginFingerprint, pluginOutputsExist } from './plugin.js';\nimport { resolvePluginFiles } from './resolve-plugin-files.js';\nimport type { FileHashMap } from './cache.js';\n\n// ─── Arg parsing ───────────────────────────────────────────────────────────\n\ninterface CliArgs {\n config?: string;\n watch: boolean;\n force: boolean;\n help: boolean;\n}\n\nconst BUILTIN_COMMAND_PLUGINS = [importOpenApiPlugin];\n\nfunction printHelp(): void {\n console.log('Usage: contractkit [command] [options]');\n console.log('');\n console.log('Commands:');\n for (const plugin of BUILTIN_COMMAND_PLUGINS) {\n if (plugin.command) {\n console.log(` ${plugin.command.name.padEnd(20)} ${plugin.command.description}`);\n }\n }\n console.log('');\n console.log('Options:');\n console.log(' -c, --config <path> Path to config file (default: contractkit.config.json)');\n console.log(' -w, --watch Watch for changes and recompile');\n console.log(' --force Skip cache and recompile all files');\n console.log(' -h, --help Show this help message');\n console.log('');\n console.log('Configure patterns, output dirs, and plugins in contractkit.config.json.');\n}\n\nfunction parseArgs(argv: string[]): CliArgs {\n const args = argv.slice(2);\n let config: string | undefined;\n let watch = false;\n let force = false;\n let help = false;\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--config' || arg === '-c') {\n config = args[++i];\n } else if (arg === '--watch' || arg === '-w') {\n watch = true;\n } else if (arg === '--force') {\n force = true;\n } else if (arg === '--help' || arg === '-h') {\n help = true;\n }\n }\n\n return { config, watch, force, help };\n}\n\n// ─── File resolution ───────────────────────────────────────────────────────\n\nasync function resolveFiles(patterns: string[], rootDir: string): Promise<string[]> {\n const files: string[] = [];\n for (const pattern of patterns) {\n const matches = await glob(pattern, { absolute: true, cwd: resolve(rootDir) });\n files.push(...matches);\n }\n return [...new Set(files)];\n}\n\n// ─── Prettier formatting ──────────────────────────────────────────────────\n\nasync function formatWithPrettier(results: { outPath: string; content: string }[]): Promise<void> {\n let prettier: typeof import('prettier');\n try {\n prettier = await import('prettier');\n } catch {\n console.warn(' ⚠ prettier not found — skipping format step');\n return;\n }\n for (const result of results) {\n try {\n const options = (await prettier.resolveConfig(result.outPath)) ?? {};\n result.content = await prettier.format(result.content, {\n ...options,\n filepath: result.outPath,\n });\n } catch {\n // Leave content unformatted if prettier fails (e.g. unsupported parser)\n }\n }\n}\n\n// ─── Main ─────────────────────────────────────────────────────────────────\n\nasync function main() {\n const cliArgs = parseArgs(process.argv);\n\n if (cliArgs.help) {\n printHelp();\n process.exit(0);\n }\n\n // ── Built-in subcommand dispatch ──────────────────────────────────────\n const subcommand = process.argv[2];\n if (subcommand && !subcommand.startsWith('-')) {\n const matched = BUILTIN_COMMAND_PLUGINS.find(p => p.command?.name === subcommand);\n if (matched?.command) {\n const subArgs = process.argv.slice(3);\n if (subArgs.includes('--help') || subArgs.includes('-h')) {\n console.log(matched.command.usage);\n process.exit(0);\n }\n const { config: fileConfig, configDir } = loadConfig(cliArgs.config);\n const resolved = mergeConfig(fileConfig, { watch: false, force: false }, configDir);\n await matched.command.run(subArgs, { rootDir: resolved.rootDir, configDir });\n process.exit(0);\n }\n console.error(`Unknown command: \"${subcommand}\". Run \"contractkit --help\" for usage.`);\n process.exit(1);\n }\n\n const { config: fileConfig, configDir } = loadConfig(cliArgs.config);\n const config = mergeConfig(fileConfig, cliArgs, configDir);\n const plugins = await loadPlugins(config.plugins, config.configDir);\n\n if (config.patterns.length === 0) {\n printHelp();\n process.exit(1);\n }\n\n const run = async () => {\n const files = await resolveFiles(config.patterns, config.rootDir);\n\n if (files.length === 0) {\n console.warn(`No matching files found for patterns:`, config.patterns.join(', '));\n return;\n }\n\n const diag = new DiagnosticCollector();\n const resolvedBase = resolve(config.rootDir);\n const cacheEnabled = config.cache.enabled && !config.force;\n const cache: FileHashMap = cacheEnabled ? loadCache(resolvedBase, config.cache.filename) : {};\n const newCache: FileHashMap = {};\n\n // ── Parse all .ck files ────────────────────────────────────────\n const allContracts: ContractRootNode[] = [];\n const allOps: OpRootNode[] = [];\n\n for (const filePath of files) {\n if (!filePath.endsWith('.ck')) {\n diag.warn(filePath, 0, `Skipping unknown file extension (expected .ck)`);\n continue;\n }\n\n const source = readFileSync(filePath, 'utf-8');\n newCache[filePath] = computeHash(source);\n\n let ckAst = parseCk(source, filePath, diag);\n // Merge options-level header globals into each operation before plugins run,\n // so transform/validate hooks see the fully-resolved AST.\n applyOptionsDefaults(ckAst, diag);\n\n // Plugin: validate + transform hooks (run before decompose and cross-file validation)\n for (const { plugin, entry } of plugins) {\n const ctx = makePluginContext(entry, config);\n if (plugin.validate) {\n try {\n await plugin.validate(ckAst, ctx);\n } catch (err) {\n diag.error(filePath, 0, `[plugin:${plugin.name}] ${(err as Error).message}`);\n }\n }\n if (plugin.transform) {\n try {\n ckAst = await plugin.transform(ckAst, ctx);\n } catch (err) {\n diag.error(filePath, 0, `[plugin:${plugin.name}] ${(err as Error).message}`);\n }\n }\n }\n\n const { contract, op } = decomposeCk(ckAst);\n if (contract.models.length > 0) allContracts.push(contract);\n if (op.routes.length > 0) allOps.push(op);\n }\n\n // ── Resolve plugin file references ────────────────────────────\n resolvePluginFiles(allOps, resolvedBase, diag);\n\n // ── Compute cross-file semantics ───────────────────────────────\n // modelsWithInput: which model names need an Input variant (have readonly/writeonly\n // fields, or transitively reference models that do). Used by all code generators.\n const modelsWithInput = computeModelsWithInput(allContracts.flatMap(r => r.models));\n // modelsWithOutput: which model names need an Output variant (have format(output=...),\n // or transitively reference models that do). Used by codegen for the post-transform\n // wire shape on response bodies.\n const modelsWithOutput = computeModelsWithOutput(allContracts.flatMap(r => r.models));\n\n // ── Dependency fingerprint ─────────────────────────────────────\n const depsFingerprint = computeHash([...modelsWithInput].sort().join(',') + '|' + [...modelsWithOutput].sort().join(','));\n const depsChanged = cacheEnabled && cache['__deps__'] !== depsFingerprint;\n newCache['__deps__'] = depsFingerprint;\n\n if (diag.hasErrors()) {\n diag.report();\n console.error('\\nCompilation failed.');\n process.exitCode = 1;\n return;\n }\n\n // ── Cross-file validation ──────────────────────────────────────\n validateRefs(allContracts, allOps, diag);\n validateInheritance(allContracts, diag);\n\n for (const op of allOps) {\n validateOp(op, diag);\n }\n\n // ── Generate via plugins ───────────────────────────────────────\n const results: { outPath: string; content: string }[] = [];\n\n for (const { plugin, entry } of plugins) {\n if (!plugin.generateTargets) continue;\n\n const optionsSuffix = entry.options && Object.keys(entry.options).length > 0 ? `:${JSON.stringify(entry.options)}` : '';\n const cacheKey = plugin.cacheKey ? `${plugin.cacheKey}${optionsSuffix}` : undefined;\n if (cacheKey && !config.force && cacheEnabled && !depsChanged) {\n const fingerprint = computePluginFingerprint(newCache, cacheKey);\n if (cache[`__plugin_${cacheKey}__`] === fingerprint && pluginOutputsExist(cache, cacheKey)) {\n console.log(` - [plugin:${plugin.name}] (unchanged)`);\n newCache[`__plugin_${cacheKey}__`] = fingerprint;\n newCache[`__plugin_${cacheKey}__files__`] = cache[`__plugin_${cacheKey}__files__`] ?? '';\n continue;\n }\n }\n\n const pluginEmitted: { outPath: string; content: string }[] = [];\n const ctx = makePluginContext(entry, config, (outPath, content) => {\n pluginEmitted.push({ outPath, content });\n });\n\n try {\n await plugin.generateTargets(\n {\n contractRoots: allContracts,\n opRoots: allOps,\n modelsWithInput,\n modelsWithOutput,\n },\n ctx,\n );\n } catch (err) {\n diag.error('', 0, `[plugin:${plugin.name}] generateTargets failed: ${(err as Error).message}`);\n continue;\n }\n\n results.push(...pluginEmitted);\n\n if (cacheKey) {\n newCache[`__plugin_${cacheKey}__`] = computePluginFingerprint(newCache, cacheKey);\n newCache[`__plugin_${cacheKey}__files__`] = pluginEmitted.map(f => f.outPath).join('|');\n }\n }\n\n if (diag.hasErrors()) {\n diag.report();\n console.error('\\nCompilation failed.');\n process.exitCode = 1;\n return;\n }\n\n // ── Format with prettier (opt-in) ────────────────────────────\n if (config.prettier && results.length > 0) {\n await formatWithPrettier(results);\n }\n\n // ── Write output files ──────────────────────────────────────\n mkdirSync(resolvedBase, { recursive: true });\n\n for (const { outPath, content } of results) {\n mkdirSync(dirname(outPath), { recursive: true });\n writeFileSync(outPath, content, 'utf-8');\n console.log(` ✓ ${outPath}`);\n }\n\n // Save cache\n if (config.cache.enabled) {\n saveCache(resolvedBase, newCache, config.cache.filename);\n }\n\n // Report all collected warnings/errors after file writes so they\n // appear at the bottom of the output and are easy to spot.\n diag.report();\n\n console.log(`\\nCompiled ${results.length} file(s).`);\n };\n\n await run();\n\n if (config.watch) {\n const { watch } = await import('node:fs');\n const watchFiles = await resolveFiles(config.patterns, config.rootDir);\n const allDirs = new Set(watchFiles.map(f => dirname(f)));\n console.log('\\nWatching for changes...');\n for (const dir of allDirs) {\n watch(dir, { recursive: false }, async (event, filename) => {\n if (!filename) return;\n const full = join(dir, filename);\n if (!full.endsWith('.ck')) return;\n console.log(`\\nChange detected: ${filename}`);\n await run();\n });\n }\n }\n}\n\nmain().catch(err => {\n console.error('Unexpected error:', err);\n process.exit(1);\n});\n","import { readFileSync } from 'node:fs';\nimport { resolve, dirname, join } from 'node:path';\nimport { DEFAULT_CACHE_FILENAME } from './cache.js';\nimport { homedir } from 'node:os';\n\nexport interface PluginEntry {\n /** npm package name or local path relative to contractkit.config.json */\n plugin: string;\n /** Plugin-specific options passed as ctx.options */\n options?: Record<string, unknown>;\n}\n\n/** Record-keyed plugin config: each key is the plugin package name, value is options. */\nexport type PluginsConfig = Record<string, Record<string, unknown>>;\n\nexport interface DslConfig {\n rootDir?: string;\n cache?: boolean | string;\n /** Glob patterns for .ck files to compile, relative to rootDir. */\n patterns?: string[];\n /** Run prettier on generated TypeScript files after compilation. Default: false. */\n prettier?: boolean;\n /** Plugins to load: each key is the plugin package name, value is its options. */\n plugins?: PluginsConfig;\n}\n\nexport interface ResolvedCacheConfig {\n enabled: boolean;\n filename: string;\n}\n\nconst CONFIG_FILENAME = 'contractkit.config.json';\n\n/**\n * Load config from an explicit path, or search upward from `startDir`\n * for contractkit.config.json.\n */\nexport function loadConfig(configPath?: string, startDir: string = process.cwd()): { config: DslConfig; configDir: string } {\n if (configPath) {\n const resolved = resolve(configPath);\n try {\n const text = readFileSync(resolved, 'utf-8');\n return { config: JSON.parse(text) as DslConfig, configDir: dirname(resolved) };\n } catch (err) {\n throw new Error(`Failed to load config from ${resolved}: ${(err as Error).message}`, { cause: err });\n }\n }\n\n let dir = resolve(startDir);\n while (true) {\n const candidate = join(dir, CONFIG_FILENAME);\n try {\n const text = readFileSync(candidate, 'utf-8');\n return { config: JSON.parse(text) as DslConfig, configDir: dir };\n } catch {\n // File not found or invalid -- walk up\n }\n const parent = dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n\n return { config: {}, configDir: resolve(startDir) };\n}\n\nexport interface ResolvedConfig {\n patterns: string[];\n rootDir: string;\n cache: ResolvedCacheConfig;\n watch: boolean;\n force: boolean;\n prettier: boolean;\n plugins: PluginEntry[];\n configDir: string;\n}\n\nfunction normalizePlugins(plugins: PluginsConfig | undefined): PluginEntry[] {\n if (!plugins) return [];\n return Object.entries(plugins).map(([name, options]) => ({ plugin: name, options }));\n}\n\n/** Merge config file values with CLI flags. */\nexport function mergeConfig(config: DslConfig, cliArgs: { watch: boolean; force: boolean }, configDir: string = process.cwd()): ResolvedConfig {\n const cache: ResolvedCacheConfig =\n typeof config.cache === 'string'\n ? { enabled: true, filename: config.cache }\n : { enabled: config.cache === true, filename: DEFAULT_CACHE_FILENAME };\n\n let rootDir = config.rootDir ?? '.';\n if (rootDir.startsWith('~')) {\n rootDir = homedir() + rootDir.slice(1);\n }\n\n return {\n patterns: config.patterns ?? [],\n rootDir: resolve(rootDir),\n cache,\n watch: cliArgs.watch,\n force: cliArgs.force,\n prettier: config.prettier ?? false,\n plugins: normalizePlugins(config.plugins),\n configDir,\n };\n}\n","import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs';\nimport { createHash } from 'node:crypto';\nimport { join, dirname } from 'node:path';\n\nexport const DEFAULT_CACHE_FILENAME = '.contractkit-cache';\n\nexport interface FileHashMap {\n [filePath: string]: string; // path -> sha256 hex\n}\n\nexport function computeHash(content: string): string {\n return createHash('sha256').update(content).digest('hex');\n}\n\nexport function loadCache(dir: string, filename: string = DEFAULT_CACHE_FILENAME): FileHashMap {\n const cachePath = join(dir, filename);\n try {\n return JSON.parse(readFileSync(cachePath, 'utf-8'));\n } catch {\n return {};\n }\n}\n\nexport function saveCache(dir: string, cache: FileHashMap, filename: string = DEFAULT_CACHE_FILENAME): void {\n const cachePath = join(dir, filename);\n mkdirSync(dirname(cachePath), { recursive: true });\n writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf-8');\n}\n\nexport function isFileChanged(filePath: string, content: string, outPath: string, cache: FileHashMap): boolean {\n if (!existsSync(outPath)) return true;\n const currentHash = computeHash(content);\n return cache[filePath] !== currentHash;\n}\n","import { resolve, isAbsolute } from 'node:path';\nimport { existsSync } from 'node:fs';\nimport { createRequire } from 'node:module';\nimport { computeHash } from './cache.js';\nimport type { PluginEntry, ResolvedConfig } from './config.js';\nimport type { ContractKitPlugin, PluginContext } from '@contractkit/core';\nimport type { FileHashMap } from './cache.js';\n\nexport type { ContractKitPlugin };\n\nexport interface LoadedPlugin {\n plugin: ContractKitPlugin;\n entry: PluginEntry;\n}\n\nexport async function loadPlugins(entries: PluginEntry[], configDir: string): Promise<LoadedPlugin[]> {\n const loaded: LoadedPlugin[] = [];\n for (const entry of entries) {\n const { plugin: specifier } = entry;\n const modulePath =\n specifier.startsWith('.') || specifier.startsWith('/') || isAbsolute(specifier)\n ? resolve(configDir, specifier)\n : createRequire(resolve(configDir, 'package.json')).resolve(specifier);\n let mod: unknown;\n try {\n mod = await import(modulePath);\n } catch (err) {\n throw new Error(`Failed to load plugin \"${specifier}\": ${(err as Error).message}`, { cause: err });\n }\n const raw =\n (mod as { default?: ContractKitPlugin; plugin?: ContractKitPlugin }).default ?? (mod as { plugin?: ContractKitPlugin }).plugin ?? mod;\n if (!raw || typeof raw !== 'object' || typeof (raw as { name?: string }).name !== 'string') {\n throw new Error(`Plugin \"${specifier}\" must export a ContractKitPlugin object with a \"name\" field.`);\n }\n loaded.push({ plugin: raw as ContractKitPlugin, entry });\n }\n return loaded;\n}\n\nexport function makePluginContext(entry: PluginEntry, config: ResolvedConfig, emitFile?: (outPath: string, content: string) => void): PluginContext {\n return {\n rootDir: config.rootDir,\n options: entry.options ?? {},\n emitFile:\n emitFile ??\n (() => {\n throw new Error('emitFile is only available in generateTargets');\n }),\n };\n}\n\nexport function computePluginFingerprint(newCache: FileHashMap, cacheKey: string): string {\n const allHashes = Object.values(newCache).sort().join('|') + '|' + cacheKey;\n return computeHash(allHashes);\n}\n\nexport function pluginOutputsExist(cache: FileHashMap, cacheKey: string): boolean {\n const raw = cache[`__plugin_${cacheKey}__files__`];\n if (!raw) return false;\n const files = (raw as string).split('|').filter(Boolean);\n return files.length > 0 && files.every(f => existsSync(f));\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { resolve, dirname } from 'node:path';\nimport type { OpRootNode } from '@contractkit/core';\nimport type { DiagnosticCollector } from '@contractkit/core';\n\n/**\n * Resolves plugin file references in operation `plugins` blocks.\n *\n * For each operation that declares `plugins: { name: \"path.yml\" }`, reads the\n * referenced file (resolved relative to the operation's source `.ck` file) and\n * stores the content in `op.pluginFiles[name]`. Emits a warning and skips if\n * the file is not found.\n */\nexport function resolvePluginFiles(roots: OpRootNode[], rootDir: string, diag: DiagnosticCollector): void {\n for (const root of roots) {\n const contractDir = dirname(resolve(rootDir, root.file));\n for (const route of root.routes) {\n for (const op of route.operations) {\n if (!op.plugins) continue;\n for (const [name, value] of Object.entries(op.plugins)) {\n const absPath = resolve(contractDir, value);\n if (!existsSync(absPath)) {\n diag.warn(root.file, op.loc.line, `plugins.${name}: file not found: ${value}`);\n continue;\n }\n op.pluginFiles ??= {};\n op.pluginFiles[name] = readFileSync(absPath, 'utf-8');\n }\n }\n }\n }\n}\n"],"mappings":"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","names":["default","importOpenApiPlugin","readFileSync","writeFileSync","mkdirSync","resolve","join","dirname","glob","DiagnosticCollector","parseCk","decomposeCk","validateOp","validateRefs","validateInheritance","applyOptionsDefaults","computeModelsWithInput","computeModelsWithOutput","readFileSync","resolve","dirname","join","readFileSync","writeFileSync","mkdirSync","existsSync","createHash","join","dirname","DEFAULT_CACHE_FILENAME","computeHash","content","createHash","update","digest","loadCache","dir","filename","cachePath","join","JSON","parse","readFileSync","saveCache","cache","mkdirSync","dirname","recursive","writeFileSync","stringify","homedir","CONFIG_FILENAME","loadConfig","configPath","startDir","process","cwd","resolved","resolve","text","readFileSync","config","JSON","parse","configDir","dirname","err","Error","message","cause","dir","candidate","join","parent","normalizePlugins","plugins","Object","entries","map","name","options","plugin","mergeConfig","cliArgs","cache","enabled","filename","DEFAULT_CACHE_FILENAME","rootDir","startsWith","homedir","slice","patterns","watch","force","prettier","resolve","isAbsolute","existsSync","createRequire","loadPlugins","entries","configDir","loaded","entry","plugin","specifier","modulePath","startsWith","isAbsolute","resolve","createRequire","mod","err","Error","message","cause","raw","default","name","push","makePluginContext","config","emitFile","rootDir","options","computePluginFingerprint","newCache","cacheKey","allHashes","Object","values","sort","join","computeHash","pluginOutputsExist","cache","files","split","filter","Boolean","length","every","f","existsSync","existsSync","readFileSync","resolve","dirname","resolvePluginFiles","roots","rootDir","diag","root","contractDir","dirname","resolve","file","route","routes","op","operations","plugins","name","value","Object","entries","absPath","existsSync","warn","loc","line","pluginFiles","readFileSync","BUILTIN_COMMAND_PLUGINS","importOpenApiPlugin","printHelp","console","log","plugin","command","name","padEnd","description","parseArgs","argv","args","slice","config","watch","force","help","i","length","arg","resolveFiles","patterns","rootDir","files","pattern","matches","glob","absolute","cwd","resolve","push","Set","formatWithPrettier","results","prettier","warn","result","options","resolveConfig","outPath","content","format","filepath","main","cliArgs","process","exit","subcommand","startsWith","matched","find","p","subArgs","includes","usage","fileConfig","configDir","loadConfig","resolved","mergeConfig","run","error","plugins","loadPlugins","join","diag","DiagnosticCollector","resolvedBase","cacheEnabled","cache","enabled","loadCache","filename","newCache","allContracts","allOps","filePath","endsWith","source","readFileSync","computeHash","ckAst","parseCk","applyOptionsDefaults","entry","ctx","makePluginContext","validate","err","message","transform","contract","op","decomposeCk","models","routes","resolvePluginFiles","modelsWithInput","computeModelsWithInput","flatMap","r","modelsWithOutput","computeModelsWithOutput","depsFingerprint","sort","depsChanged","hasErrors","report","exitCode","validateRefs","validateInheritance","validateOp","generateTargets","optionsSuffix","Object","keys","JSON","stringify","cacheKey","undefined","fingerprint","computePluginFingerprint","pluginOutputsExist","pluginEmitted","contractRoots","opRoots","map","f","mkdirSync","recursive","dirname","writeFileSync","saveCache","watchFiles","allDirs","dir","event","full","catch"]} |
+3
-3
| { | ||
| "name": "@contractkit/cli", | ||
| "version": "0.5.1", | ||
| "version": "0.6.0", | ||
| "description": "Compiler for .ck files", | ||
@@ -31,4 +31,4 @@ "author": { | ||
| "glob": "^13.0.6", | ||
| "@contractkit/core": "0.11.0", | ||
| "@contractkit/openapi-to-ck": "0.7.1" | ||
| "@contractkit/core": "0.12.0", | ||
| "@contractkit/openapi-to-ck": "0.7.2" | ||
| }, | ||
@@ -35,0 +35,0 @@ "peerDependencies": { |
+9
-2
@@ -26,2 +26,3 @@ #!/usr/bin/env node | ||
| import { loadPlugins, makePluginContext, computePluginFingerprint, pluginOutputsExist } from './plugin.js'; | ||
| import { resolvePluginFiles } from './resolve-plugin-files.js'; | ||
| import type { FileHashMap } from './cache.js'; | ||
@@ -210,2 +211,5 @@ | ||
| // ── Resolve plugin file references ──────────────────────────── | ||
| resolvePluginFiles(allOps, resolvedBase, diag); | ||
| // ── Compute cross-file semantics ─────────────────────────────── | ||
@@ -286,5 +290,4 @@ // modelsWithInput: which model names need an Input variant (have readonly/writeonly | ||
| diag.report(); | ||
| if (diag.hasErrors()) { | ||
| diag.report(); | ||
| console.error('\nCompilation failed.'); | ||
@@ -314,2 +317,6 @@ process.exitCode = 1; | ||
| // Report all collected warnings/errors after file writes so they | ||
| // appear at the bottom of the output and are easy to spot. | ||
| diag.report(); | ||
| console.log(`\nCompiled ${results.length} file(s).`); | ||
@@ -316,0 +323,0 @@ }; |
| > @contractkit/cli@0.5.0 build /Users/robert/projects/contractkit/apps/cli | ||
| > tsup src/cli.ts --format esm --sourcemap | ||
| CLI Building entry: src/cli.ts | ||
| CLI Using tsconfig: tsconfig.json | ||
| CLI tsup v8.5.1 | ||
| CLI Target: esnext | ||
| ESM Build start | ||
| ESM dist/cli.js 14.13 KB | ||
| ESM dist/cli.js.map 33.55 KB | ||
| ESM ⚡️ Build success in 18ms |
| > contractkit@0.1.0 format /Users/robert/projects/contractkit/apps/cli | ||
| > prettier --write . | ||
| .turbo/turbo-build.log[2K[1G.turbo/turbo-format.log[2K[1G.turbo/turbo-start.log[2K[1G.turbo/turbo-test.log[2K[1Gdist/ast.d.ts[2K[1Gdist/ast.d.ts 48ms | ||
| dist/ast.d.ts.map[2K[1Gdist/ast.js[2K[1Gdist/ast.js 13ms | ||
| dist/ast.js.map[2K[1Gdist/cache.d.ts[2K[1Gdist/cache.d.ts 2ms | ||
| dist/cache.d.ts.map[2K[1Gdist/cache.js[2K[1Gdist/cache.js 4ms | ||
| dist/cache.js.map[2K[1Gdist/chevrotain-parser-dto.d.ts[2K[1Gdist/chevrotain-parser-dto.d.ts 2ms | ||
| dist/chevrotain-parser-dto.d.ts.map[2K[1Gdist/chevrotain-parser-dto.js[2K[1Gdist/chevrotain-parser-dto.js 20ms | ||
| dist/chevrotain-parser-dto.js.map[2K[1Gdist/chevrotain-parser-op.d.ts[2K[1Gdist/chevrotain-parser-op.d.ts 3ms | ||
| dist/chevrotain-parser-op.d.ts.map[2K[1Gdist/chevrotain-parser-op.js[2K[1Gdist/chevrotain-parser-op.js 29ms | ||
| dist/chevrotain-parser-op.js.map[2K[1Gdist/chunk-7QVYU63E.js[2K[1Gdist/chunk-7QVYU63E.js 1ms | ||
| dist/chunk-7QVYU63E.js.map[2K[1Gdist/cli.d.ts[2K[1Gdist/cli.d.ts 1ms | ||
| dist/cli.d.ts.map[2K[1Gdist/cli.js[2K[1Gdist/cli.js 43ms | ||
| dist/cli.js.map[2K[1Gdist/codegen-client.d.ts[2K[1Gdist/codegen-client.d.ts 1ms | ||
| dist/codegen-client.d.ts.map[2K[1Gdist/codegen-client.js[2K[1Gdist/codegen-client.js 12ms | ||
| dist/codegen-client.js.map[2K[1Gdist/codegen-dto.d.ts[2K[1Gdist/codegen-dto.d.ts 2ms | ||
| dist/codegen-dto.d.ts.map[2K[1Gdist/codegen-dto.js[2K[1Gdist/codegen-dto.js 19ms | ||
| dist/codegen-dto.js.map[2K[1Gdist/codegen-markdown.d.ts[2K[1Gdist/codegen-markdown.d.ts 1ms | ||
| dist/codegen-markdown.d.ts.map[2K[1Gdist/codegen-markdown.js[2K[1Gdist/codegen-markdown.js 18ms | ||
| dist/codegen-markdown.js.map[2K[1Gdist/codegen-op.d.ts[2K[1Gdist/codegen-op.d.ts 1ms | ||
| dist/codegen-op.d.ts.map[2K[1Gdist/codegen-op.js[2K[1Gdist/codegen-op.js 11ms | ||
| dist/codegen-op.js.map[2K[1Gdist/codegen-openapi.d.ts[2K[1Gdist/codegen-openapi.d.ts 1ms | ||
| dist/codegen-openapi.d.ts.map[2K[1Gdist/codegen-openapi.js[2K[1Gdist/codegen-openapi.js 10ms | ||
| dist/codegen-openapi.js.map[2K[1Gdist/codegen-plain-types.d.ts[2K[1Gdist/codegen-plain-types.d.ts 1ms | ||
| dist/codegen-plain-types.d.ts.map[2K[1Gdist/codegen-plain-types.js[2K[1Gdist/codegen-plain-types.js 4ms | ||
| dist/codegen-plain-types.js.map[2K[1Gdist/codegen-sdk.d.ts[2K[1Gdist/codegen-sdk.d.ts 2ms | ||
| dist/codegen-sdk.d.ts.map[2K[1Gdist/codegen-sdk.js[2K[1Gdist/codegen-sdk.js 14ms | ||
| dist/codegen-sdk.js.map[2K[1Gdist/config.d.ts[2K[1Gdist/config.d.ts 3ms | ||
| dist/config.d.ts.map[2K[1Gdist/config.js[2K[1Gdist/config.js 2ms | ||
| dist/config.js.map[2K[1Gdist/diagnostics.d.ts[2K[1Gdist/diagnostics.d.ts 1ms | ||
| dist/diagnostics.d.ts.map[2K[1Gdist/diagnostics.js[2K[1Gdist/diagnostics.js 1ms | ||
| dist/diagnostics.js.map[2K[1Gdist/import-openapi-27E3RGQR.js[2K[1Gdist/import-openapi-27E3RGQR.js 2ms | ||
| dist/import-openapi-27E3RGQR.js.map[2K[1Gdist/import-openapi-ZYIAQBEX.js[2K[1Gdist/import-openapi-ZYIAQBEX.js 2ms | ||
| dist/import-openapi-ZYIAQBEX.js.map[2K[1Gdist/lexer.d.ts[2K[1Gdist/lexer.d.ts 1ms | ||
| dist/lexer.d.ts.map[2K[1Gdist/lexer.js[2K[1Gdist/lexer.js 5ms | ||
| dist/lexer.js.map[2K[1Gdist/parser-dto.d.ts[2K[1Gdist/parser-dto.d.ts 1ms | ||
| dist/parser-dto.d.ts.map[2K[1Gdist/parser-dto.js[2K[1Gdist/parser-dto.js 1ms | ||
| dist/parser-dto.js.map[2K[1Gdist/parser-op.d.ts[2K[1Gdist/parser-op.d.ts 1ms | ||
| dist/parser-op.d.ts.map[2K[1Gdist/parser-op.js[2K[1Gdist/parser-op.js 1ms | ||
| dist/parser-op.js.map[2K[1Gdist/token-adapter.d.ts[2K[1Gdist/token-adapter.d.ts 1ms | ||
| dist/token-adapter.d.ts.map[2K[1Gdist/token-adapter.js[2K[1Gdist/token-adapter.js 1ms | ||
| dist/token-adapter.js.map[2K[1Gdist/token-stream.d.ts[2K[1Gdist/token-stream.d.ts 1ms | ||
| dist/token-stream.d.ts.map[2K[1Gdist/token-stream.js[2K[1Gdist/token-stream.js 1ms | ||
| dist/token-stream.js.map[2K[1Gdist/tokens.d.ts[2K[1Gdist/tokens.d.ts 1ms | ||
| dist/tokens.d.ts.map[2K[1Gdist/tokens.js[2K[1Gdist/tokens.js 2ms | ||
| dist/tokens.js.map[2K[1Gdist/types/pagination.dto.ts[2K[1Gdist/types/pagination.dto.ts 3ms | ||
| dist/validate-op.d.ts[2K[1Gdist/validate-op.d.ts 1ms | ||
| dist/validate-op.d.ts.map[2K[1Gdist/validate-op.js[2K[1Gdist/validate-op.js 1ms | ||
| dist/validate-op.js.map[2K[1Gdist/validate-refs.d.ts[2K[1Gdist/validate-refs.d.ts 1ms | ||
| dist/validate-refs.d.ts.map[2K[1Gdist/validate-refs.js[2K[1Gdist/validate-refs.js 2ms | ||
| dist/validate-refs.js.map[2K[1Gdist/visitor-dto.d.ts[2K[1Gdist/visitor-dto.d.ts 2ms | ||
| dist/visitor-dto.d.ts.map[2K[1Gdist/visitor-dto.js[2K[1Gdist/visitor-dto.js 9ms | ||
| dist/visitor-dto.js.map[2K[1Gdist/visitor-op.d.ts[2K[1Gdist/visitor-op.d.ts 2ms | ||
| dist/visitor-op.d.ts.map[2K[1Gdist/visitor-op.js[2K[1Gdist/visitor-op.js 10ms | ||
| dist/visitor-op.js.map[2K[1Geslint.config.js[2K[1G[90meslint.config.js[39m 1ms (unchanged) | ||
| package.json[2K[1Gpackage.json 1ms | ||
| src/cache.ts[2K[1Gsrc/cache.ts 2ms | ||
| src/cli.ts[2K[1Gsrc/cli.ts 34ms | ||
| src/config.ts[2K[1Gsrc/config.ts 4ms | ||
| src/import-openapi.ts[2K[1Gsrc/import-openapi.ts 3ms | ||
| tests/config.test.ts[2K[1Gtests/config.test.ts 3ms | ||
| tests/tsconfig.json[2K[1Gtests/tsconfig.json 1ms | ||
| tsconfig.json[2K[1Gtsconfig.json 0ms | ||
| vitest.config.ts[2K[1Gvitest.config.ts 1ms |
| > contract-dsl@0.1.0 start /Users/robert/projects/contract-dsl/apps/cli | ||
| > node dist/cli.js --force | ||
| Debugger listening on ws://127.0.0.1:56747/614fd2d2-d1f0-4e58-8826-334b7f11afe5 | ||
| For help, see: https://nodejs.org/en/docs/inspector | ||
| Debugger attached. | ||
| /Users/robert/projects/homegrown_v2/apps/api | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.transactions.op:23 Referenced model "TransferInput" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.settlements.op:71 Referenced type "ListSettlementEntriesQuery" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.settlements.op:106 Referenced type "ListSettlementTransactionsQuery" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.op:2 Referenced model "LedgerAccountInput" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.op:12 Referenced type "PaginationQuery" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:2 Referenced model "LedgerCategoryInput" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:32 Referenced model "UpdateCategoryInput" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:92 Referenced model "CategoryTree" is not defined in any .dto file | ||
| [33mWARN[0m /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:105 Referenced model "CategoryBalances" is not defined in any .dto file | ||
| 0 error(s), 9 warning(s) | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/shared/types/pagination.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/shared/types/limit-offset.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/shared/types/custom.currency.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/transfers/types/transfer.intent.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/transfers/types/transfer.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/transfers/types/routing.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/transfers/types/counterparty.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/transfers/types/counterparty.account.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.transaction.query.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.transaction.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.settlement.query.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.settlement.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.maintenance.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.category.query.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.category.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.account.query.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/ledger/types/ledger.account.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/capital/types/expansion.offer.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/modules/capital/types/expansion.capital.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/transfers.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/ledger.transactions.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/ledger.settlements.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/ledger.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/ledger.maintenance.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/ledger.categories.router.ts | ||
| ✓ /Users/robert/projects/homegrown_v2/apps/api/src/routes/capital.router.ts | ||
| Compiled 26 file(s). | ||
| Waiting for the debugger to disconnect... |
| > @contractkit/cli@0.5.0 test /Users/robert/projects/contractkit/apps/cli | ||
| > vitest run | ||
| [1m[30m[46m RUN [49m[39m[22m [36mv4.1.5 [39m[90m/Users/robert/projects/contractkit/apps/cli[39m | ||
| [32m✓[39m tests/config.test.ts [2m([22m[2m13 tests[22m[2m)[22m[32m 3[2mms[22m[39m | ||
| [2m Test Files [22m [1m[32m1 passed[39m[22m[90m (1)[39m | ||
| [2m Tests [22m [1m[32m13 passed[39m[22m[90m (13)[39m | ||
| [2m Start at [22m 08:51:35 | ||
| [2m Duration [22m 143ms[2m (transform 21ms, setup 0ms, import 30ms, tests 3ms, environment 0ms)[22m | ||
-217
| export interface SourceLocation { | ||
| file: string; | ||
| line: number; | ||
| } | ||
| export declare const SCALAR_NAMES: ReadonlySet<string>; | ||
| export type DtoTypeNode = | ||
| | ScalarTypeNode | ||
| | ArrayTypeNode | ||
| | TupleTypeNode | ||
| | RecordTypeNode | ||
| | EnumTypeNode | ||
| | LiteralTypeNode | ||
| | UnionTypeNode | ||
| | IntersectionTypeNode | ||
| | ModelRefTypeNode | ||
| | InlineObjectTypeNode | ||
| | LazyTypeNode; | ||
| export interface ScalarTypeNode { | ||
| kind: 'scalar'; | ||
| name: | ||
| | 'string' | ||
| | 'number' | ||
| | 'int' | ||
| | 'bigint' | ||
| | 'boolean' | ||
| | 'date' | ||
| | 'time' | ||
| | 'datetime' | ||
| | 'email' | ||
| | 'url' | ||
| | 'uuid' | ||
| | 'any' | ||
| | 'unknown' | ||
| | 'null' | ||
| | 'object' | ||
| | 'binary' | ||
| | 'json'; | ||
| min?: number | bigint; | ||
| max?: number | bigint; | ||
| len?: number; | ||
| regex?: string; | ||
| format?: string; | ||
| } | ||
| export interface ArrayTypeNode { | ||
| kind: 'array'; | ||
| item: DtoTypeNode; | ||
| min?: number; | ||
| max?: number; | ||
| } | ||
| export interface TupleTypeNode { | ||
| kind: 'tuple'; | ||
| items: DtoTypeNode[]; | ||
| } | ||
| export interface RecordTypeNode { | ||
| kind: 'record'; | ||
| key: DtoTypeNode; | ||
| value: DtoTypeNode; | ||
| } | ||
| export interface EnumTypeNode { | ||
| kind: 'enum'; | ||
| values: string[]; | ||
| } | ||
| export interface LiteralTypeNode { | ||
| kind: 'literal'; | ||
| value: string | number | boolean; | ||
| } | ||
| export interface UnionTypeNode { | ||
| kind: 'union'; | ||
| members: DtoTypeNode[]; | ||
| } | ||
| export interface ModelRefTypeNode { | ||
| kind: 'ref'; | ||
| name: string; | ||
| lazy?: boolean; | ||
| } | ||
| export interface InlineObjectTypeNode { | ||
| kind: 'inlineObject'; | ||
| fields: FieldNode[]; | ||
| mode?: ObjectMode; | ||
| } | ||
| export interface IntersectionTypeNode { | ||
| kind: 'intersection'; | ||
| members: DtoTypeNode[]; | ||
| } | ||
| export interface LazyTypeNode { | ||
| kind: 'lazy'; | ||
| inner: DtoTypeNode; | ||
| } | ||
| export interface FieldNode { | ||
| name: string; | ||
| optional: boolean; | ||
| nullable: boolean; | ||
| visibility: 'readonly' | 'writeonly' | 'normal'; | ||
| type: DtoTypeNode; | ||
| default?: string | number | boolean; | ||
| description?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| export interface ModelNode { | ||
| kind: 'model'; | ||
| name: string; | ||
| base?: string; | ||
| fields: FieldNode[]; | ||
| type?: DtoTypeNode; | ||
| mode?: ObjectMode; | ||
| camelCase?: boolean; | ||
| description?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| export interface DtoRootNode { | ||
| kind: 'dtoRoot'; | ||
| meta: Record<string, string>; | ||
| models: ModelNode[]; | ||
| file: string; | ||
| /** Comment lines not attached to any node, sorted by line number. */ | ||
| orphanComments?: Array<{ | ||
| line: number; | ||
| text: string; | ||
| }>; | ||
| } | ||
| /** Constrained security declaration — roles-only auth fields. */ | ||
| export interface SecurityFields { | ||
| /** Allowlisted role names required for this endpoint (e.g. `["admin", "moderator"]`). */ | ||
| roles?: string[]; | ||
| /** Inline comment attached to the `roles:` line. */ | ||
| rolesDescription?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| /** Sentinel value for explicitly public endpoints (`security: none`). */ | ||
| export declare const SECURITY_NONE: 'none'; | ||
| export type SecurityNone = typeof SECURITY_NONE; | ||
| /** Security declaration: explicit public (`none`), or constrained auth fields. */ | ||
| export type SecurityNode = SecurityNone | SecurityFields; | ||
| export type HttpMethod = 'get' | 'post' | 'put' | 'patch' | 'delete'; | ||
| /** Controls how Zod handles unknown keys on an object schema. */ | ||
| export type ObjectMode = 'strict' | 'strip' | 'loose'; | ||
| /** Visibility/lifecycle modifiers on routes and operations. | ||
| * `public` is operation-only: overrides inherited route-level modifiers. */ | ||
| export type RouteModifier = 'internal' | 'deprecated' | 'public'; | ||
| export interface OpParamNode { | ||
| name: string; | ||
| optional: boolean; | ||
| nullable: boolean; | ||
| type: DtoTypeNode; | ||
| default?: string | number | boolean; | ||
| description?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| /** Either inline param declarations, a single type reference name, or a DtoTypeNode. */ | ||
| export type ParamSource = OpParamNode[] | string | DtoTypeNode; | ||
| export interface OpRequestNode { | ||
| contentType: 'application/json' | 'multipart/form-data'; | ||
| bodyType: DtoTypeNode; | ||
| } | ||
| export interface OpResponseNode { | ||
| statusCode: number; | ||
| contentType?: 'application/json'; | ||
| bodyType?: DtoTypeNode; | ||
| } | ||
| export interface OpOperationNode { | ||
| method: HttpMethod; | ||
| service?: string; | ||
| sdk?: string; | ||
| /** HMAC signature key name for this endpoint (e.g. `WEBHOOK_SECRET`). */ | ||
| signature?: string; | ||
| /** Inline comment attached to the `signature:` line. */ | ||
| signatureDescription?: string; | ||
| request?: OpRequestNode; | ||
| responses: OpResponseNode[]; | ||
| query?: ParamSource; | ||
| queryMode?: ObjectMode; | ||
| headers?: ParamSource; | ||
| headersMode?: ObjectMode; | ||
| security?: SecurityNode; | ||
| /** Explicit modifiers. undefined = inherit from route; [] or array = override. */ | ||
| modifiers?: RouteModifier[]; | ||
| description?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| export interface OpRouteNode { | ||
| path: string; | ||
| params?: ParamSource; | ||
| paramsMode?: ObjectMode; | ||
| operations: OpOperationNode[]; | ||
| /** Route-level modifiers — cascade to all operations unless overridden. */ | ||
| modifiers?: RouteModifier[]; | ||
| /** Route-level security default — cascades to operations that have no explicit security declaration. */ | ||
| security?: SecurityNode; | ||
| description?: string; | ||
| loc: SourceLocation; | ||
| } | ||
| /** | ||
| * Resolves the effective modifiers for an operation, applying route-level cascade. | ||
| * If the operation specifies any explicit modifiers, those replace (not merge) the route's. | ||
| * `public` on an operation acts as an explicit override that clears inherited modifiers; | ||
| * it is stripped from the returned array (it is not a codegen modifier itself). | ||
| */ | ||
| export declare function resolveModifiers(route: OpRouteNode, op: OpOperationNode): RouteModifier[]; | ||
| /** | ||
| * Resolves the effective security for an operation, applying cascade from operation → route → file. | ||
| * Operation-level security always wins; if absent, the route's security is used; if absent, the file's. | ||
| */ | ||
| export declare function resolveSecurity(route: OpRouteNode, op: OpOperationNode, root?: OpRootNode): SecurityNode | undefined; | ||
| export interface OpRootNode { | ||
| kind: 'opRoot'; | ||
| meta: Record<string, string>; | ||
| /** File-level security default — cascades to all routes/operations unless overridden. */ | ||
| security?: SecurityNode; | ||
| routes: OpRouteNode[]; | ||
| file: string; | ||
| /** Comment lines not attached to any node, sorted by line number. */ | ||
| orphanComments?: Array<{ | ||
| line: number; | ||
| text: string; | ||
| }>; | ||
| } | ||
| //# sourceMappingURL=ast.d.ts.map |
| {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"} |
-42
| // ─── Shared ──────────────────────────────────────────────────────────────── | ||
| export const SCALAR_NAMES = new Set([ | ||
| 'string', | ||
| 'number', | ||
| 'int', | ||
| 'bigint', | ||
| 'boolean', | ||
| 'date', | ||
| 'time', | ||
| 'datetime', | ||
| 'email', | ||
| 'url', | ||
| 'uuid', | ||
| 'any', | ||
| 'unknown', | ||
| 'null', | ||
| 'object', | ||
| 'binary', | ||
| 'json', | ||
| ]); | ||
| /** Sentinel value for explicitly public endpoints (`security: none`). */ | ||
| export const SECURITY_NONE = 'none'; | ||
| /** | ||
| * Resolves the effective modifiers for an operation, applying route-level cascade. | ||
| * If the operation specifies any explicit modifiers, those replace (not merge) the route's. | ||
| * `public` on an operation acts as an explicit override that clears inherited modifiers; | ||
| * it is stripped from the returned array (it is not a codegen modifier itself). | ||
| */ | ||
| export function resolveModifiers(route, op) { | ||
| const raw = op.modifiers ?? route.modifiers ?? []; | ||
| return raw.filter(m => m !== 'public'); | ||
| } | ||
| /** | ||
| * Resolves the effective security for an operation, applying cascade from operation → route → file. | ||
| * Operation-level security always wins; if absent, the route's security is used; if absent, the file's. | ||
| */ | ||
| export function resolveSecurity(route, op, root) { | ||
| if (op.security !== undefined) return op.security; | ||
| if (route.security !== undefined) return route.security; | ||
| return root?.security; | ||
| } | ||
| //# sourceMappingURL=ast.js.map |
| {"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAO9E,MAAM,CAAC,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAyB;IAC/E,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS;IAC9C,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM;IAClD,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM;CACrD,CAAC,CAAC;AAgIH,yEAAyE;AACzE,MAAM,CAAC,MAAM,aAAa,GAAG,MAAe,CAAC;AAyE7C;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAkB,EAAE,EAAmB;IACtE,MAAM,GAAG,GAAG,EAAE,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,IAAI,EAAE,CAAC;IAClD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC;AACzC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAkB,EAAE,EAAmB,EAAE,IAAiB;IACxF,IAAI,EAAE,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC,QAAQ,CAAC;IAClD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC,QAAQ,CAAC;IACxD,OAAO,IAAI,EAAE,QAAQ,CAAC;AACxB,CAAC"} |
| export declare const DEFAULT_CACHE_FILENAME = '.contract-dsl-cache'; | ||
| export interface FileHashMap { | ||
| [filePath: string]: string; | ||
| } | ||
| export declare function computeHash(content: string): string; | ||
| export declare function loadCache(dir: string, filename?: string): FileHashMap; | ||
| export declare function saveCache(dir: string, cache: FileHashMap, filename?: string): void; | ||
| export declare function isFileChanged(filePath: string, content: string, outPath: string, cache: FileHashMap): boolean; | ||
| //# sourceMappingURL=cache.d.ts.map |
| {"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,sBAAsB,wBAAwB,CAAC;AAE5D,MAAM,WAAW,WAAW;IAC1B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAAC;CAC5B;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,GAAE,MAA+B,GAAG,WAAW,CAO7F;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,GAAE,MAA+B,GAAG,IAAI,CAI1G;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,WAAW,GACjB,OAAO,CAIT"} |
| import { readFileSync, writeFileSync, mkdirSync, existsSync } from 'node:fs'; | ||
| import { createHash } from 'node:crypto'; | ||
| import { join, dirname } from 'node:path'; | ||
| export const DEFAULT_CACHE_FILENAME = '.contract-dsl-cache'; | ||
| export function computeHash(content) { | ||
| return createHash('sha256').update(content).digest('hex'); | ||
| } | ||
| export function loadCache(dir, filename = DEFAULT_CACHE_FILENAME) { | ||
| const cachePath = join(dir, filename); | ||
| try { | ||
| return JSON.parse(readFileSync(cachePath, 'utf-8')); | ||
| } catch { | ||
| return {}; | ||
| } | ||
| } | ||
| export function saveCache(dir, cache, filename = DEFAULT_CACHE_FILENAME) { | ||
| const cachePath = join(dir, filename); | ||
| mkdirSync(dirname(cachePath), { recursive: true }); | ||
| writeFileSync(cachePath, JSON.stringify(cache, null, 2), 'utf-8'); | ||
| } | ||
| export function isFileChanged(filePath, content, outPath, cache) { | ||
| if (!existsSync(outPath)) return true; | ||
| const currentHash = computeHash(content); | ||
| return cache[filePath] !== currentHash; | ||
| } | ||
| //# sourceMappingURL=cache.js.map |
| {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAC7E,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,CAAC,MAAM,sBAAsB,GAAG,qBAAqB,CAAC;AAM5D,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,WAAmB,sBAAsB;IAC9E,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW,EAAE,KAAkB,EAAE,WAAmB,sBAAsB;IAClG,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;IACtC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,aAAa,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,QAAgB,EAChB,OAAe,EACf,OAAe,EACf,KAAkB;IAElB,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACtC,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;IACzC,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,WAAW,CAAC;AACzC,CAAC"} |
| import { CstParser } from 'chevrotain'; | ||
| export declare class DtoCstParser extends CstParser { | ||
| constructor(); | ||
| dtoRoot: any; | ||
| frontMatter: any; | ||
| metaEntry: any; | ||
| modelDecl: any; | ||
| fieldList: any; | ||
| fieldDecl: any; | ||
| typeExpression: any; | ||
| intersectionExpr: any; | ||
| singleType: any; | ||
| typeArgs: any; | ||
| typeArg: any; | ||
| argValue: any; | ||
| inlineBraceObject: any; | ||
| inlineField: any; | ||
| defaultValue: any; | ||
| } | ||
| export declare const dtoCstParser: DtoCstParser; | ||
| //# sourceMappingURL=chevrotain-parser-dto.d.ts.map |
| {"version":3,"file":"chevrotain-parser-dto.d.ts","sourceRoot":"","sources":["../src/chevrotain-parser-dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAUvC,qBAAa,YAAa,SAAQ,SAAS;;IAWlC,OAAO,MAQX;IAGI,WAAW,MAMf;IAGI,SAAS,MAOb;IAQI,SAAS,MAqCb;IAII,SAAS,MAIb;IAMI,SAAS,MAgCb;IAKI,cAAc,MAMlB;IAGI,gBAAgB,MAMpB;IAEI,UAAU,MAsBd;IAEI,QAAQ,MAQZ;IAEI,OAAO,MAoBX;IAEI,QAAQ,MAoCZ;IAII,iBAAiB,MAOrB;IAEI,WAAW,MAgCf;IAII,YAAY,MAOhB;CACJ;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC"} |
| import { CstParser } from 'chevrotain'; | ||
| import { | ||
| allTokens, | ||
| Identifier, | ||
| Colon, | ||
| Question, | ||
| Equals, | ||
| Pipe, | ||
| LParen, | ||
| RParen, | ||
| LBrace, | ||
| RBrace, | ||
| Comma, | ||
| Slash, | ||
| LBracket, | ||
| RBracket, | ||
| Plus, | ||
| Star, | ||
| Caret, | ||
| Backslash, | ||
| Dot, | ||
| Ampersand, | ||
| StringLit, | ||
| NumberLit, | ||
| BooleanLit, | ||
| Eof, | ||
| TripleDash, | ||
| } from './tokens.js'; | ||
| const OBJECT_MODES = new Set(['strict', 'strip', 'loose']); | ||
| export class DtoCstParser extends CstParser { | ||
| constructor() { | ||
| super(allTokens, { | ||
| recoveryEnabled: true, | ||
| maxLookahead: 3, | ||
| }); | ||
| this.performSelfAnalysis(); | ||
| } | ||
| // ─── Top-level ──────────────────────────────────────────────────────── | ||
| dtoRoot = this.RULE('dtoRoot', () => { | ||
| this.OPTION(() => { | ||
| this.SUBRULE(this.frontMatter); | ||
| }); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.modelDecl); | ||
| }); | ||
| this.CONSUME(Eof); | ||
| }); | ||
| // --- key: value ... --- | ||
| frontMatter = this.RULE('frontMatter', () => { | ||
| this.CONSUME(TripleDash); // opening --- | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.metaEntry); | ||
| }); | ||
| this.CONSUME2(TripleDash); // closing --- | ||
| }); | ||
| // key: value (inside front-matter) | ||
| metaEntry = this.RULE('metaEntry', () => { | ||
| this.CONSUME(Identifier); // key | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME2(Identifier) }, // unquoted value | ||
| ]); | ||
| }); | ||
| // ─── Model ──────────────────────────────────────────────────────────── | ||
| // modelDecl: | ||
| // [MODE] IDENTIFIER COLON IDENTIFIER LBRACE fieldList RBRACE (model with inheritance) | ||
| // [MODE] IDENTIFIER COLON LBRACE fieldList RBRACE (model with fields) | ||
| // IDENTIFIER COLON typeExpression (type alias — no mode) | ||
| modelDecl = this.RULE('modelDecl', () => { | ||
| // Optional modifier prefixes: camel and/or strict|strip|loose in any order (max one each) | ||
| this.OPTION({ GATE: () => OBJECT_MODES.has(this.LA(1).image) || this.LA(1).image === 'camel', DEF: () => this.CONSUME(Identifier) }); | ||
| this.OPTION2({ GATE: () => OBJECT_MODES.has(this.LA(1).image) || this.LA(1).image === 'camel', DEF: () => this.CONSUME4(Identifier) }); | ||
| this.CONSUME2(Identifier); // model name | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { | ||
| // Model with inheritance: Name : Base { fields } | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| return la1.tokenType === Identifier && la2.tokenType === LBrace; | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME3(Identifier); // base model name | ||
| this.CONSUME(LBrace); | ||
| this.SUBRULE(this.fieldList); | ||
| this.CONSUME(RBrace); | ||
| }, | ||
| }, | ||
| { | ||
| // Model with fields: Name : { fields } | ||
| GATE: () => this.LA(1).tokenType === LBrace, | ||
| ALT: () => { | ||
| this.CONSUME2(LBrace); | ||
| this.SUBRULE2(this.fieldList); | ||
| this.CONSUME2(RBrace); | ||
| }, | ||
| }, | ||
| { | ||
| // Type alias: Name : typeExpression | ||
| ALT: () => { | ||
| this.SUBRULE(this.typeExpression); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // ─── Fields ─────────────────────────────────────────────────────────── | ||
| fieldList = this.RULE('fieldList', () => { | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.fieldDecl); | ||
| }); | ||
| }); | ||
| // fieldDecl handles two cases: | ||
| // 1. Visibility + type: name: readonly typeExpr (= default)? | ||
| // 2. Regular type: name: typeExpr (= default)? | ||
| // Nested objects are handled via typeExpression → singleType → inlineBraceObject | ||
| fieldDecl = this.RULE('fieldDecl', () => { | ||
| this.CONSUME(Identifier); // field name | ||
| this.OPTION(() => this.CONSUME(Question)); | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { | ||
| // Case 1: Visibility modifier + type expression | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| return la1.tokenType === Identifier && (la1.image === 'readonly' || la1.image === 'writeonly'); | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME2(Identifier); // visibility modifier | ||
| this.SUBRULE2(this.typeExpression); | ||
| this.OPTION2(() => { | ||
| this.CONSUME(Equals); | ||
| this.SUBRULE(this.defaultValue); | ||
| }); | ||
| }, | ||
| }, | ||
| { | ||
| // Case 2: Regular type expression (no visibility) | ||
| ALT: () => { | ||
| this.SUBRULE(this.typeExpression); | ||
| this.OPTION3(() => { | ||
| this.CONSUME2(Equals); | ||
| this.SUBRULE2(this.defaultValue); | ||
| }); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // ─── Type expressions ───────────────────────────────────────────────── | ||
| // Union: intersectionExpr (| intersectionExpr)* | ||
| typeExpression = this.RULE('typeExpression', () => { | ||
| this.SUBRULE(this.intersectionExpr); | ||
| this.MANY(() => { | ||
| this.CONSUME(Pipe); | ||
| this.SUBRULE2(this.intersectionExpr); | ||
| }); | ||
| }); | ||
| // Intersection: singleType (& singleType)* — higher precedence than union | ||
| intersectionExpr = this.RULE('intersectionExpr', () => { | ||
| this.SUBRULE(this.singleType); | ||
| this.MANY(() => { | ||
| this.CONSUME(Ampersand); | ||
| this.SUBRULE2(this.singleType); | ||
| }); | ||
| }); | ||
| singleType = this.RULE('singleType', () => { | ||
| this.OR([ | ||
| { | ||
| // Mode-prefixed inline object: strict { ... } / strip { ... } / loose { ... } | ||
| GATE: () => OBJECT_MODES.has(this.LA(1).image) && this.LA(2).tokenType === LBrace, | ||
| ALT: () => { | ||
| this.CONSUME(Identifier); // mode keyword | ||
| this.SUBRULE(this.inlineBraceObject); | ||
| }, | ||
| }, | ||
| { ALT: () => this.SUBRULE2(this.inlineBraceObject) }, | ||
| { | ||
| ALT: () => { | ||
| this.CONSUME2(Identifier); // type name — visitor inspects image | ||
| this.OPTION(() => { | ||
| this.CONSUME(LParen); | ||
| this.SUBRULE(this.typeArgs); | ||
| this.CONSUME(RParen); | ||
| }); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| typeArgs = this.RULE('typeArgs', () => { | ||
| this.OPTION(() => { | ||
| this.SUBRULE(this.typeArg); | ||
| this.MANY(() => { | ||
| this.CONSUME(Comma); | ||
| this.SUBRULE2(this.typeArg); | ||
| }); | ||
| }); | ||
| }); | ||
| typeArg = this.RULE('typeArg', () => { | ||
| this.OR([ | ||
| { | ||
| // key=value modifier (min=1, max=100, regex=/pattern/, len=6) | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| return la1.tokenType === Identifier && la2.tokenType === Equals; | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME(Identifier); | ||
| this.CONSUME(Equals); | ||
| this.SUBRULE(this.argValue); | ||
| }, | ||
| }, | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| { ALT: () => this.SUBRULE(this.typeExpression) }, | ||
| ]); | ||
| }); | ||
| argValue = this.RULE('argValue', () => { | ||
| this.OR([ | ||
| { | ||
| // regex: /pattern/ — any token except Slash is allowed inside | ||
| ALT: () => { | ||
| this.CONSUME(Slash); | ||
| this.MANY(() => { | ||
| this.OR2([ | ||
| { ALT: () => this.CONSUME(Identifier) }, | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(LParen) }, | ||
| { ALT: () => this.CONSUME(RParen) }, | ||
| { ALT: () => this.CONSUME(Pipe) }, | ||
| { ALT: () => this.CONSUME(LBrace) }, | ||
| { ALT: () => this.CONSUME(RBrace) }, | ||
| { ALT: () => this.CONSUME(Question) }, | ||
| { ALT: () => this.CONSUME(Equals) }, | ||
| { ALT: () => this.CONSUME(Comma) }, | ||
| { ALT: () => this.CONSUME(Colon) }, | ||
| { ALT: () => this.CONSUME(LBracket) }, | ||
| { ALT: () => this.CONSUME(RBracket) }, | ||
| { ALT: () => this.CONSUME(Plus) }, | ||
| { ALT: () => this.CONSUME(Star) }, | ||
| { ALT: () => this.CONSUME(Caret) }, | ||
| { ALT: () => this.CONSUME(Backslash) }, | ||
| { ALT: () => this.CONSUME(Dot) }, | ||
| ]); | ||
| }); | ||
| this.CONSUME2(Slash); | ||
| }, | ||
| }, | ||
| { ALT: () => this.CONSUME2(Identifier) }, | ||
| { ALT: () => this.CONSUME2(NumberLit) }, | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| ]); | ||
| }); | ||
| // ─── Inline objects ─────────────────────────────────────────────────── | ||
| inlineBraceObject = this.RULE('inlineBraceObject', () => { | ||
| this.CONSUME(LBrace); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.inlineField); | ||
| this.OPTION(() => this.CONSUME(Comma)); | ||
| }); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| inlineField = this.RULE('inlineField', () => { | ||
| this.CONSUME(Identifier); | ||
| this.OPTION(() => this.CONSUME(Question)); | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { | ||
| // Case 1: Visibility modifier + type expression | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| return la1.tokenType === Identifier && (la1.image === 'readonly' || la1.image === 'writeonly'); | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME2(Identifier); // visibility modifier | ||
| this.SUBRULE2(this.typeExpression); | ||
| this.OPTION2(() => { | ||
| this.CONSUME(Equals); | ||
| this.SUBRULE(this.defaultValue); | ||
| }); | ||
| }, | ||
| }, | ||
| { | ||
| // Case 2: Regular type expression (no visibility) | ||
| ALT: () => { | ||
| this.SUBRULE(this.typeExpression); | ||
| this.OPTION3(() => { | ||
| this.CONSUME2(Equals); | ||
| this.SUBRULE2(this.defaultValue); | ||
| }); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // ─── Default value ──────────────────────────────────────────────────── | ||
| defaultValue = this.RULE('defaultValue', () => { | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| { ALT: () => this.CONSUME(Identifier) }, | ||
| ]); | ||
| }); | ||
| } | ||
| // Singleton parser instance — reuse by setting `parser.input` each time | ||
| export const dtoCstParser = new DtoCstParser(); | ||
| //# sourceMappingURL=chevrotain-parser-dto.js.map |
| {"version":3,"file":"chevrotain-parser-dto.js","sourceRoot":"","sources":["../src/chevrotain-parser-dto.ts"],"names":[],"mappings":"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"} |
| import { CstParser } from 'chevrotain'; | ||
| export declare class OpCstParser extends CstParser { | ||
| constructor(); | ||
| opRoot: any; | ||
| frontMatter: any; | ||
| metaEntry: any; | ||
| routeDecl: any; | ||
| routePath: any; | ||
| routeBody: any; | ||
| paramsBlock: any; | ||
| paramDecl: any; | ||
| httpOperation: any; | ||
| operationBody: any; | ||
| serviceDecl: any; | ||
| sdkDecl: any; | ||
| signatureDecl: any; | ||
| securityBlock: any; | ||
| securityRolesLine: any; | ||
| queryBlock: any; | ||
| headersBlock: any; | ||
| requestBlock: any; | ||
| responseBlock: any; | ||
| statusCodeBlock: any; | ||
| contentTypeLine: any; | ||
| opTypeExpr: any; | ||
| opIntersectionExpr: any; | ||
| opAtomicType: any; | ||
| opTypeArgs: any; | ||
| opTypeArg: any; | ||
| opArgValue: any; | ||
| opInlineObject: any; | ||
| opInlineField: any; | ||
| opDefaultValue: any; | ||
| } | ||
| export declare const opCstParser: OpCstParser; | ||
| //# sourceMappingURL=chevrotain-parser-op.d.ts.map |
| {"version":3,"file":"chevrotain-parser-op.d.ts","sourceRoot":"","sources":["../src/chevrotain-parser-op.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAYvC,qBAAa,WAAY,SAAQ,SAAS;;IAWjC,MAAM,MAYV;IAGI,WAAW,MAMf;IAGI,SAAS,MAOb;IAKI,SAAS,MAgBb;IAKI,SAAS,MAyBb;IAGI,SAAS,MAgCb;IAKI,WAAW,MAqBf;IAGI,SAAS,MAIb;IAKI,aAAa,MAUjB;IAGI,aAAa,MAmEjB;IAKI,WAAW,MAIf;IAKI,OAAO,MAIX;IAGI,aAAa,MAOjB;IAMI,aAAa,MAoBjB;IAKI,iBAAiB,MAQrB;IAKI,UAAU,MAKd;IAKI,YAAY,MAKhB;IAKI,YAAY,MAMhB;IAKI,aAAa,MAQjB;IAGI,eAAe,MAQnB;IAKI,eAAe,MAMnB;IAOI,UAAU,MAMd;IAGI,kBAAkB,MAMtB;IAGI,YAAY,MAsBhB;IAGI,UAAU,MAQd;IAGI,SAAS,MAoBb;IAGI,UAAU,MAOd;IAGI,cAAc,MAOlB;IAGI,aAAa,MASjB;IAGI,cAAc,MAOlB;CACJ;AAGD,eAAO,MAAM,WAAW,aAAoB,CAAC"} |
| import { CstParser } from 'chevrotain'; | ||
| import { | ||
| allTokens, | ||
| Identifier, | ||
| Colon, | ||
| Question, | ||
| Equals, | ||
| Pipe, | ||
| LParen, | ||
| RParen, | ||
| LBrace, | ||
| RBrace, | ||
| Comma, | ||
| Slash, | ||
| LBracket, | ||
| RBracket, | ||
| Ampersand, | ||
| NumberLit, | ||
| StringLit, | ||
| BooleanLit, | ||
| Eof, | ||
| TripleDash, | ||
| } from './tokens.js'; | ||
| const HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete']); | ||
| const OBJECT_MODES = new Set(['strict', 'strip', 'loose']); | ||
| const ROUTE_MODIFIERS = new Set(['internal', 'deprecated', 'public']); | ||
| export class OpCstParser extends CstParser { | ||
| constructor() { | ||
| super(allTokens, { | ||
| recoveryEnabled: true, | ||
| maxLookahead: 3, | ||
| }); | ||
| this.performSelfAnalysis(); | ||
| } | ||
| // ─── Top-level ──────────────────────────────────────────────────────── | ||
| opRoot = this.RULE('opRoot', () => { | ||
| this.OPTION(() => { | ||
| this.SUBRULE(this.frontMatter); | ||
| }); | ||
| this.OPTION2({ | ||
| GATE: () => this.LA(1).tokenType === Identifier && this.LA(1).image === 'security', | ||
| DEF: () => this.SUBRULE(this.securityBlock), | ||
| }); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.routeDecl); | ||
| }); | ||
| this.CONSUME(Eof); | ||
| }); | ||
| // --- key: value ... --- | ||
| frontMatter = this.RULE('frontMatter', () => { | ||
| this.CONSUME(TripleDash); // opening --- | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.metaEntry); | ||
| }); | ||
| this.CONSUME2(TripleDash); // closing --- | ||
| }); | ||
| // key: value (inside front-matter) | ||
| metaEntry = this.RULE('metaEntry', () => { | ||
| this.CONSUME(Identifier); // key | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME2(Identifier) }, // unquoted value | ||
| ]); | ||
| }); | ||
| // ─── Route ──────────────────────────────────────────────────────────── | ||
| // routeDecl: routePath [ COLON modifier* ] LBRACE routeBody RBRACE | ||
| routeDecl = this.RULE('routeDecl', () => { | ||
| this.SUBRULE(this.routePath); | ||
| // Optional `: modifier+` before the opening brace | ||
| this.OPTION({ | ||
| GATE: () => this.LA(1).tokenType === Colon && ROUTE_MODIFIERS.has(this.LA(2).image), | ||
| DEF: () => { | ||
| this.CONSUME(Colon); // route modifier separator | ||
| this.MANY({ | ||
| GATE: () => ROUTE_MODIFIERS.has(this.LA(1).image), | ||
| DEF: () => this.CONSUME(Identifier), // modifier keyword | ||
| }); | ||
| }, | ||
| }); | ||
| this.CONSUME(LBrace); | ||
| this.SUBRULE(this.routeBody); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| // routePath: SLASH (COLON IDENTIFIER | IDENTIFIER) (SLASH (COLON IDENTIFIER | IDENTIFIER))* | ||
| // Route path like /users/:id/posts/:postId | ||
| // Path parameter colons: COLON followed by IDENTIFIER → `:paramName` | ||
| routePath = this.RULE('routePath', () => { | ||
| this.AT_LEAST_ONE(() => { | ||
| this.CONSUME(Slash); | ||
| this.OR([ | ||
| { | ||
| // Path parameter: :paramName | ||
| // Only if COLON is followed by IDENTIFIER (not another SLASH/COLON/etc.) | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| return la1.tokenType === Colon && la2.tokenType === Identifier; | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME2(Colon); | ||
| this.CONSUME(Identifier); | ||
| }, | ||
| }, | ||
| { | ||
| // Regular path segment | ||
| ALT: () => { | ||
| this.CONSUME2(Identifier); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| }); | ||
| // routeBody: (paramsBlock | securityBlock | httpOperation)* | ||
| routeBody = this.RULE('routeBody', () => { | ||
| this.MANY(() => { | ||
| this.OR([ | ||
| { | ||
| // params block (optionally prefixed with strict|strip|loose) | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| if (la1.tokenType === Identifier && la1.image === 'params') return true; | ||
| return la1.tokenType === Identifier && OBJECT_MODES.has(la1.image) && la2.tokenType === Identifier && la2.image === 'params'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.paramsBlock), | ||
| }, | ||
| { | ||
| // route-level security default | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'security'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.securityBlock), | ||
| }, | ||
| { | ||
| // http operation (get, post, put, patch, delete) | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && HTTP_METHODS.has(la.image.toLowerCase()); | ||
| }, | ||
| ALT: () => this.SUBRULE(this.httpOperation), | ||
| }, | ||
| ]); | ||
| }); | ||
| }); | ||
| // ─── Params ─────────────────────────────────────────────────────────── | ||
| // paramsBlock: ("strict"|"strip"|"loose")? "params" ":" ( IDENTIFIER | "{" paramDecl* "}" ) | ||
| paramsBlock = this.RULE('paramsBlock', () => { | ||
| this.OPTION({ GATE: () => OBJECT_MODES.has(this.LA(1).image), DEF: () => this.CONSUME(Identifier) }); // optional mode: strict|strip|loose | ||
| this.CONSUME2(Identifier); // "params" | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { | ||
| GATE: () => this.LA(1).tokenType === Identifier, | ||
| ALT: () => { | ||
| this.CONSUME3(Identifier); // type reference | ||
| }, | ||
| }, | ||
| { | ||
| ALT: () => { | ||
| this.CONSUME(LBrace); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.paramDecl); | ||
| }); | ||
| this.CONSUME(RBrace); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // paramDecl: IDENTIFIER COLON IDENTIFIER | ||
| paramDecl = this.RULE('paramDecl', () => { | ||
| this.CONSUME(Identifier); // param name | ||
| this.CONSUME(Colon); | ||
| this.CONSUME2(Identifier); // param type | ||
| }); | ||
| // ─── HTTP Operation ─────────────────────────────────────────────────── | ||
| // httpOperation: IDENTIFIER ":" modifier* LBRACE operationBody RBRACE | ||
| httpOperation = this.RULE('httpOperation', () => { | ||
| this.CONSUME(Identifier); // HTTP method name | ||
| this.CONSUME(Colon); | ||
| this.MANY({ | ||
| GATE: () => ROUTE_MODIFIERS.has(this.LA(1).image), | ||
| DEF: () => this.CONSUME2(Identifier), | ||
| }); | ||
| this.CONSUME(LBrace); | ||
| this.SUBRULE(this.operationBody); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| // operationBody: (serviceDecl | sdkDecl | queryBlock | headersBlock | requestBlock | responseBlock | securityBlock)* | ||
| operationBody = this.RULE('operationBody', () => { | ||
| this.MANY(() => { | ||
| this.OR([ | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'service'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.serviceDecl), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'sdk'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.sdkDecl), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| if (la1.tokenType === Identifier && la1.image === 'query') return true; | ||
| return la1.tokenType === Identifier && OBJECT_MODES.has(la1.image) && la2.tokenType === Identifier && la2.image === 'query'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.queryBlock), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| if (la1.tokenType === Identifier && la1.image === 'headers') return true; | ||
| return la1.tokenType === Identifier && OBJECT_MODES.has(la1.image) && la2.tokenType === Identifier && la2.image === 'headers'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.headersBlock), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'request'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.requestBlock), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'response'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.responseBlock), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'signature'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.signatureDecl), | ||
| }, | ||
| { | ||
| GATE: () => { | ||
| const la = this.LA(1); | ||
| return la.tokenType === Identifier && la.image === 'security'; | ||
| }, | ||
| ALT: () => this.SUBRULE(this.securityBlock), | ||
| }, | ||
| ]); | ||
| }); | ||
| }); | ||
| // ─── Service ──────────────────────────────────────────────────────── | ||
| // serviceDecl: "service" COLON IDENTIFIER | ||
| serviceDecl = this.RULE('serviceDecl', () => { | ||
| this.CONSUME(Identifier); // "service" | ||
| this.CONSUME(Colon); | ||
| this.CONSUME2(Identifier); // service reference e.g. "LedgerService.updateCategoryMembership" | ||
| }); | ||
| // ─── SDK ─────────────────────────────────────────────────────────── | ||
| // sdkDecl: "sdk" COLON IDENTIFIER | ||
| sdkDecl = this.RULE('sdkDecl', () => { | ||
| this.CONSUME(Identifier); // "sdk" | ||
| this.CONSUME(Colon); | ||
| this.CONSUME2(Identifier); // method name e.g. "getUser" | ||
| }); | ||
| // signatureDecl: "signature" COLON (StringLit | Identifier) | ||
| signatureDecl = this.RULE('signatureDecl', () => { | ||
| this.CONSUME(Identifier); // "signature" | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(StringLit) }, // "quoted-key" | ||
| { ALT: () => this.CONSUME2(Identifier) }, // UNQUOTED_KEY | ||
| ]); | ||
| }); | ||
| // ─── Security ─────────────────────────────────────────────────────── | ||
| // securityBlock: "security" COLON "none" | ||
| // | "security" COLON LBRACE securityRolesLine? RBRACE | ||
| securityBlock = this.RULE('securityBlock', () => { | ||
| this.CONSUME(Identifier); // "security" | ||
| this.CONSUME(Colon); | ||
| this.OR([ | ||
| { | ||
| // security: none | ||
| GATE: () => this.LA(1).tokenType !== LBrace, | ||
| ALT: () => { | ||
| this.CONSUME2(Identifier); // "none" | ||
| }, | ||
| }, | ||
| { | ||
| // security: { roles: admin moderator } | ||
| ALT: () => { | ||
| this.CONSUME(LBrace); | ||
| this.OPTION(() => this.SUBRULE(this.securityRolesLine)); | ||
| this.CONSUME(RBrace); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // securityRolesLine: "roles" COLON Identifier+ | ||
| // Stops consuming identifiers when the next identifier is followed by ':' | ||
| // (which would be a new field). | ||
| securityRolesLine = this.RULE('securityRolesLine', () => { | ||
| this.CONSUME(Identifier); // "roles" | ||
| this.CONSUME(Colon); | ||
| this.CONSUME2(Identifier); // first (mandatory) role name | ||
| this.MANY({ | ||
| GATE: () => this.LA(1).tokenType === Identifier && this.LA(2).tokenType !== Colon, | ||
| DEF: () => this.CONSUME3(Identifier), // additional role names | ||
| }); | ||
| }); | ||
| // ─── Query ────────────────────────────────────────────────────────── | ||
| // queryBlock: ("strict"|"strip"|"loose")? "query" ":" opTypeExpr | ||
| queryBlock = this.RULE('queryBlock', () => { | ||
| this.OPTION({ GATE: () => OBJECT_MODES.has(this.LA(1).image), DEF: () => this.CONSUME(Identifier) }); // optional mode: strict|strip|loose | ||
| this.CONSUME2(Identifier); // "query" | ||
| this.CONSUME(Colon); | ||
| this.SUBRULE(this.opTypeExpr); | ||
| }); | ||
| // ─── Headers ──────────────────────────────────────────────────────── | ||
| // headersBlock: ("strict"|"strip"|"loose")? "headers" ":" opTypeExpr | ||
| headersBlock = this.RULE('headersBlock', () => { | ||
| this.OPTION({ GATE: () => OBJECT_MODES.has(this.LA(1).image), DEF: () => this.CONSUME(Identifier) }); // optional mode: strict|strip|loose | ||
| this.CONSUME2(Identifier); // "headers" | ||
| this.CONSUME(Colon); | ||
| this.SUBRULE(this.opTypeExpr); | ||
| }); | ||
| // ─── Request ────────────────────────────────────────────────────────── | ||
| // requestBlock: "request" ":" LBRACE contentTypeLine RBRACE | ||
| requestBlock = this.RULE('requestBlock', () => { | ||
| this.CONSUME(Identifier); // "request" | ||
| this.CONSUME(Colon); | ||
| this.CONSUME(LBrace); | ||
| this.SUBRULE(this.contentTypeLine); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| // ─── Response ───────────────────────────────────────────────────────── | ||
| // responseBlock: "response" ":" LBRACE statusCodeBlock* RBRACE | ||
| responseBlock = this.RULE('responseBlock', () => { | ||
| this.CONSUME(Identifier); // "response" | ||
| this.CONSUME(Colon); | ||
| this.CONSUME(LBrace); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.statusCodeBlock); | ||
| }); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| // statusCodeBlock: NUMBER ":" (LBRACE contentTypeLine RBRACE)? | ||
| statusCodeBlock = this.RULE('statusCodeBlock', () => { | ||
| this.CONSUME(NumberLit); // status code e.g. "200" | ||
| this.CONSUME(Colon); | ||
| this.OPTION(() => { | ||
| this.CONSUME(LBrace); | ||
| this.SUBRULE(this.contentTypeLine); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| }); | ||
| // ─── Content type line ──────────────────────────────────────────────── | ||
| // contentTypeLine: IDENTIFIER SLASH IDENTIFIER COLON opTypeExpr | ||
| contentTypeLine = this.RULE('contentTypeLine', () => { | ||
| this.CONSUME(Identifier); // "application" | ||
| this.CONSUME(Slash); | ||
| this.CONSUME2(Identifier); // "json" or "form-data" | ||
| this.CONSUME(Colon); | ||
| this.SUBRULE(this.opTypeExpr); | ||
| }); | ||
| // ─── OP Type Expressions ────────────────────────────────────────────── | ||
| // These mirror the DTO type system but also support intersection (&) | ||
| // and postfix array syntax ([]) | ||
| // opTypeExpr: opIntersectionExpr (PIPE opIntersectionExpr)* | ||
| opTypeExpr = this.RULE('opTypeExpr', () => { | ||
| this.SUBRULE(this.opIntersectionExpr); | ||
| this.MANY(() => { | ||
| this.CONSUME(Pipe); | ||
| this.SUBRULE2(this.opIntersectionExpr); | ||
| }); | ||
| }); | ||
| // opIntersectionExpr: opAtomicType (AMPERSAND opAtomicType)* | ||
| opIntersectionExpr = this.RULE('opIntersectionExpr', () => { | ||
| this.SUBRULE(this.opAtomicType); | ||
| this.MANY(() => { | ||
| this.CONSUME(Ampersand); | ||
| this.SUBRULE2(this.opAtomicType); | ||
| }); | ||
| }); | ||
| // opAtomicType: opInlineObject | IDENTIFIER (LPAREN opTypeArgs RPAREN)? (LBRACKET RBRACKET)? | ||
| opAtomicType = this.RULE('opAtomicType', () => { | ||
| this.OR([ | ||
| { | ||
| GATE: () => this.LA(1).tokenType === LBrace, | ||
| ALT: () => this.SUBRULE(this.opInlineObject), | ||
| }, | ||
| { | ||
| ALT: () => { | ||
| this.CONSUME(Identifier); // type name | ||
| this.OPTION(() => { | ||
| this.CONSUME(LParen); | ||
| this.SUBRULE(this.opTypeArgs); | ||
| this.CONSUME(RParen); | ||
| }); | ||
| // Postfix array: Type[] | ||
| this.OPTION2(() => { | ||
| this.CONSUME(LBracket); | ||
| this.CONSUME(RBracket); | ||
| }); | ||
| }, | ||
| }, | ||
| ]); | ||
| }); | ||
| // opTypeArgs: (opTypeArg (COMMA opTypeArg)*)? | ||
| opTypeArgs = this.RULE('opTypeArgs', () => { | ||
| this.OPTION(() => { | ||
| this.SUBRULE(this.opTypeArg); | ||
| this.MANY(() => { | ||
| this.CONSUME(Comma); | ||
| this.SUBRULE2(this.opTypeArg); | ||
| }); | ||
| }); | ||
| }); | ||
| // opTypeArg: key=value | STRING | NUMBER | BOOLEAN | opTypeExpr | ||
| opTypeArg = this.RULE('opTypeArg', () => { | ||
| this.OR([ | ||
| { | ||
| // key=value constraint (min=1, max=100, etc.) | ||
| GATE: () => { | ||
| const la1 = this.LA(1); | ||
| const la2 = this.LA(2); | ||
| return la1.tokenType === Identifier && la2.tokenType === Equals; | ||
| }, | ||
| ALT: () => { | ||
| this.CONSUME(Identifier); | ||
| this.CONSUME(Equals); | ||
| this.SUBRULE(this.opArgValue); | ||
| }, | ||
| }, | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| { ALT: () => this.SUBRULE(this.opTypeExpr) }, | ||
| ]); | ||
| }); | ||
| // opArgValue: NUMBER | STRING | BOOLEAN | IDENTIFIER | ||
| opArgValue = this.RULE('opArgValue', () => { | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| { ALT: () => this.CONSUME(Identifier) }, | ||
| ]); | ||
| }); | ||
| // opInlineObject: LBRACE (opInlineField (COMMA)?)* RBRACE | ||
| opInlineObject = this.RULE('opInlineObject', () => { | ||
| this.CONSUME(LBrace); | ||
| this.MANY(() => { | ||
| this.SUBRULE(this.opInlineField); | ||
| this.OPTION(() => this.CONSUME(Comma)); | ||
| }); | ||
| this.CONSUME(RBrace); | ||
| }); | ||
| // opInlineField: IDENTIFIER QUESTION? COLON opTypeExpr (EQUALS defaultValue)? | ||
| opInlineField = this.RULE('opInlineField', () => { | ||
| this.CONSUME(Identifier); | ||
| this.OPTION(() => this.CONSUME(Question)); | ||
| this.CONSUME(Colon); | ||
| this.SUBRULE(this.opTypeExpr); | ||
| this.OPTION2(() => { | ||
| this.CONSUME(Equals); | ||
| this.SUBRULE(this.opDefaultValue); | ||
| }); | ||
| }); | ||
| // opDefaultValue: STRING | NUMBER | BOOLEAN | IDENTIFIER | ||
| opDefaultValue = this.RULE('opDefaultValue', () => { | ||
| this.OR([ | ||
| { ALT: () => this.CONSUME(StringLit) }, | ||
| { ALT: () => this.CONSUME(NumberLit) }, | ||
| { ALT: () => this.CONSUME(BooleanLit) }, | ||
| { ALT: () => this.CONSUME(Identifier) }, | ||
| ]); | ||
| }); | ||
| } | ||
| // Singleton parser instance | ||
| export const opCstParser = new OpCstParser(); | ||
| //# sourceMappingURL=chevrotain-parser-op.js.map |
| {"version":3,"file":"chevrotain-parser-op.js","sourceRoot":"","sources":["../src/chevrotain-parser-op.ts"],"names":[],"mappings":"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"} |
| var __defProp = Object.defineProperty; | ||
| var __name = (target, value) => __defProp(target, "name", { value, configurable: true }); | ||
| export { | ||
| __name | ||
| }; | ||
| //# sourceMappingURL=chunk-7QVYU63E.js.map |
| {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]} |
| #!/usr/bin/env node | ||
| export {}; | ||
| //# sourceMappingURL=cli.d.ts.map |
| {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""} |
| import type { OpRootNode, DtoTypeNode } from './ast.js'; | ||
| export interface ClientCodegenOptions { | ||
| typeImportPathTemplate?: string; | ||
| outPath?: string; | ||
| /** Map from model name → absolute output file path (for cross-module type imports) */ | ||
| modelOutPaths?: Map<string, string>; | ||
| } | ||
| export declare function generateClient(root: OpRootNode, options?: ClientCodegenOptions): string; | ||
| export declare function renderTsType(type: DtoTypeNode): string; | ||
| //# sourceMappingURL=codegen-client.d.ts.map |
| {"version":3,"file":"codegen-client.d.ts","sourceRoot":"","sources":["../src/codegen-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA6C,WAAW,EAA0B,MAAM,UAAU,CAAC;AAM3H,MAAM,WAAW,oBAAoB;IACjC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACvC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,oBAAyB,GAAG,MAAM,CA0C3F;AA0KD,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA2BtD"} |
| import { pascalToDotCase } from './codegen-dto.js'; | ||
| import { basename, dirname, relative } from 'path'; | ||
| export function generateClient(root, options = {}) { | ||
| const lines = []; | ||
| const types = collectTypes(root); | ||
| const clientName = deriveClientName(root.file); | ||
| // Type-only imports | ||
| if (types.length > 0) { | ||
| lines.push(...generateTypeImports(types, root.file, options)); | ||
| } | ||
| lines.push(''); | ||
| // ClientOptions interface | ||
| lines.push('export interface ClientOptions {'); | ||
| lines.push(' baseUrl: string;'); | ||
| lines.push(' fetch?: typeof fetch;'); | ||
| lines.push(' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);'); | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| // Client class | ||
| lines.push('/**'); | ||
| const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file; | ||
| lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`); | ||
| lines.push(' */'); | ||
| lines.push(`export class ${clientName} {`); | ||
| lines.push(' constructor(private options: ClientOptions) {}'); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| lines.push(''); | ||
| lines.push(...generateMethod(route, op, root.file)); | ||
| } | ||
| } | ||
| lines.push(''); | ||
| lines.push(...FETCH_HELPER); | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| return lines.join('\n'); | ||
| } | ||
| // ─── Method generation ──────────────────────────────────────────────────── | ||
| function generateMethod(route, op, file) { | ||
| const lines = []; | ||
| const methodName = deriveMethodName(op, route); | ||
| const httpMethod = op.method.toUpperCase(); | ||
| // Build method parameters | ||
| const params = buildMethodParams(route, op); | ||
| const paramStr = params.map(p => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', '); | ||
| // Determine return type | ||
| const primaryResponse = op.responses.find(r => r.bodyType) ?? op.responses[0]; | ||
| const isVoid = !primaryResponse?.bodyType; | ||
| const returnType = isVoid ? 'void' : renderTsType(primaryResponse.bodyType); | ||
| // JSDoc | ||
| const desc = op.description ?? route.description; | ||
| if (desc) { | ||
| lines.push(` /** ${desc} */`); | ||
| } | ||
| lines.push(` async ${methodName}(${paramStr}): Promise<${returnType}> {`); | ||
| // Build URL with path params | ||
| const urlExpr = buildUrlExpression(route.path, route.params); | ||
| // Query string | ||
| const hasQuery = !!op.query; | ||
| let fetchUrl = urlExpr; | ||
| if (hasQuery) { | ||
| lines.push(` const searchParams = new URLSearchParams();`); | ||
| lines.push(` if (query) {`); | ||
| lines.push(` for (const [k, v] of Object.entries(query)) {`); | ||
| lines.push(` if (v !== undefined && v !== null) searchParams.set(k, String(v));`); | ||
| lines.push(` }`); | ||
| lines.push(` }`); | ||
| lines.push(` const qs = searchParams.toString();`); | ||
| fetchUrl = urlExpr; | ||
| } | ||
| // Build fetch options | ||
| const hasBody = !!op.request; | ||
| const isMultipart = op.request?.contentType === 'multipart/form-data'; | ||
| const hasHeaders = !!op.headers; | ||
| const fetchArgs = []; | ||
| if (hasQuery) { | ||
| fetchArgs.push(`url: qs ? \`${fetchUrl}?\${qs}\` : \`${fetchUrl}\``); | ||
| } else { | ||
| fetchArgs.push(`url: \`${fetchUrl}\``); | ||
| } | ||
| fetchArgs.push(`method: '${httpMethod}'`); | ||
| if (hasBody) { | ||
| if (isMultipart) { | ||
| fetchArgs.push('body: body'); | ||
| } else { | ||
| fetchArgs.push(`headers: { 'Content-Type': 'application/json' }`); | ||
| fetchArgs.push('body: JSON.stringify(body)'); | ||
| } | ||
| } | ||
| if (hasHeaders) { | ||
| if (hasBody && !isMultipart) { | ||
| // Merge content-type with custom headers | ||
| const lastIdx = fetchArgs.findIndex(a => a.startsWith('headers:')); | ||
| fetchArgs[lastIdx] = `headers: { 'Content-Type': 'application/json', ...customHeaders }`; | ||
| } else { | ||
| fetchArgs.push('headers: customHeaders'); | ||
| } | ||
| } | ||
| if (fetchArgs.length <= 2 && !hasBody && !hasHeaders && !hasQuery) { | ||
| // Simple case — inline | ||
| lines.push(` const res = await this.fetch(\`${fetchUrl}\`, { method: '${httpMethod}' });`); | ||
| } else { | ||
| lines.push(` const res = await this.fetch(${fetchArgs[0].split(': ').slice(1).join(': ')}, {`); | ||
| for (let i = 1; i < fetchArgs.length; i++) { | ||
| lines.push(` ${fetchArgs[i]},`); | ||
| } | ||
| lines.push(` });`); | ||
| } | ||
| if (isVoid) { | ||
| // No return for void responses | ||
| } else { | ||
| lines.push(` return await res.json() as ${returnType};`); | ||
| } | ||
| lines.push(' }'); | ||
| return lines; | ||
| } | ||
| // ─── URL building ───────────────────────────────────────────────────────── | ||
| function buildUrlExpression(path, params) { | ||
| // Replace :paramName with ${encodeURIComponent(paramName)} | ||
| return path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => { | ||
| return `\${encodeURIComponent(String(${name}))}`; | ||
| }); | ||
| } | ||
| function buildMethodParams(route, op) { | ||
| const params = []; | ||
| // Path params — always first, always required | ||
| if (route.params) { | ||
| if (Array.isArray(route.params)) { | ||
| for (const p of route.params) { | ||
| params.push({ name: p.name, type: renderTsType(p.type), optional: false }); | ||
| } | ||
| } else if (typeof route.params === 'string') { | ||
| params.push({ name: 'params', type: route.params, optional: false }); | ||
| } else { | ||
| params.push({ name: 'params', type: renderTsType(route.params), optional: false }); | ||
| } | ||
| } | ||
| // Body | ||
| if (op.request) { | ||
| if (op.request.contentType === 'multipart/form-data') { | ||
| params.push({ name: 'body', type: 'FormData', optional: false }); | ||
| } else { | ||
| params.push({ name: 'body', type: renderTsType(op.request.bodyType), optional: false }); | ||
| } | ||
| } | ||
| // Query | ||
| if (op.query) { | ||
| if (Array.isArray(op.query)) { | ||
| const fields = op.query.map(p => `${p.name}?: ${renderTsType(p.type)}`).join('; '); | ||
| params.push({ name: 'query', type: `{ ${fields} }`, optional: true }); | ||
| } else if (typeof op.query === 'string') { | ||
| params.push({ name: 'query', type: op.query, optional: true }); | ||
| } else { | ||
| params.push({ name: 'query', type: renderTsType(op.query), optional: true }); | ||
| } | ||
| } | ||
| // Headers | ||
| if (op.headers) { | ||
| if (Array.isArray(op.headers)) { | ||
| const fields = op.headers.map(p => `${p.name}?: ${renderTsType(p.type)}`).join('; '); | ||
| params.push({ name: 'customHeaders', type: `{ ${fields} }`, optional: true }); | ||
| } else if (typeof op.headers === 'string') { | ||
| params.push({ name: 'customHeaders', type: op.headers, optional: true }); | ||
| } else { | ||
| params.push({ name: 'customHeaders', type: renderTsType(op.headers), optional: true }); | ||
| } | ||
| } | ||
| return params; | ||
| } | ||
| // ─── TypeScript type rendering ──────────────────────────────────────────── | ||
| export function renderTsType(type) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return renderTsScalar(type.name); | ||
| case 'array': | ||
| return `${renderTsType(type.item)}[]`; | ||
| case 'tuple': | ||
| return `[${type.items.map(renderTsType).join(', ')}]`; | ||
| case 'record': | ||
| return `Record<${renderTsType(type.key)}, ${renderTsType(type.value)}>`; | ||
| case 'enum': | ||
| return type.values.map(v => `'${v}'`).join(' | '); | ||
| case 'literal': | ||
| return typeof type.value === 'string' ? `'${type.value}'` : String(type.value); | ||
| case 'union': | ||
| return type.members.map(renderTsType).join(' | '); | ||
| case 'intersection': | ||
| return type.members.map(renderTsType).join(' & '); | ||
| case 'ref': | ||
| return type.name; | ||
| case 'lazy': | ||
| return renderTsType(type.inner); | ||
| case 'inlineObject': | ||
| return renderTsInlineObject(type.fields); | ||
| default: | ||
| return 'unknown'; | ||
| } | ||
| } | ||
| function renderTsScalar(name) { | ||
| switch (name) { | ||
| case 'string': | ||
| case 'email': | ||
| case 'url': | ||
| case 'uuid': | ||
| return 'string'; | ||
| case 'number': | ||
| case 'int': | ||
| return 'number'; | ||
| case 'bigint': | ||
| return 'bigint'; | ||
| case 'boolean': | ||
| return 'boolean'; | ||
| case 'date': | ||
| case 'datetime': | ||
| return 'string'; | ||
| case 'null': | ||
| return 'null'; | ||
| case 'any': | ||
| return 'any'; | ||
| case 'unknown': | ||
| return 'unknown'; | ||
| case 'object': | ||
| return 'Record<string, unknown>'; | ||
| case 'binary': | ||
| return 'Blob'; | ||
| default: | ||
| return 'unknown'; | ||
| } | ||
| } | ||
| function renderTsInlineObject(fields) { | ||
| const entries = fields.map(f => { | ||
| const opt = f.optional ? '?' : ''; | ||
| return `${f.name}${opt}: ${renderTsType(f.type)}`; | ||
| }); | ||
| return `{ ${entries.join('; ')} }`; | ||
| } | ||
| // ─── Method name inference ──────────────────────────────────────────────── | ||
| function deriveMethodName(op, route) { | ||
| if (op.sdk) return op.sdk; | ||
| return inferMethodName(op.method, route.path); | ||
| } | ||
| function inferMethodName(method, path) { | ||
| // Build a name from the path segments + method | ||
| // e.g. GET /users/:id → getUsersById | ||
| // e.g. POST /users → postUsers | ||
| // e.g. DELETE /users/:id → deleteUsersById | ||
| const segments = path.split('/').filter(s => s.length > 0); | ||
| const parts = [method.toLowerCase()]; | ||
| for (const seg of segments) { | ||
| if (seg.startsWith(':')) { | ||
| // :id → ById, :accountId → ByAccountId | ||
| const paramName = seg.slice(1); | ||
| parts.push('By' + paramName.charAt(0).toUpperCase() + paramName.slice(1)); | ||
| } else { | ||
| // Regular segment — camelCase it | ||
| const segParts = seg.split(/[.-]/).filter(Boolean); | ||
| for (const sp of segParts) { | ||
| parts.push(sp.charAt(0).toUpperCase() + sp.slice(1)); | ||
| } | ||
| } | ||
| } | ||
| return parts[0] + parts.slice(1).join(''); | ||
| } | ||
| // ─── Naming conventions ──────────────────────────────────────────────────── | ||
| function deriveBaseName(file) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'Resource'; | ||
| return base | ||
| .split('.') | ||
| .map(s => s.charAt(0).toUpperCase() + s.slice(1)) | ||
| .join(''); | ||
| } | ||
| function deriveClientName(file) { | ||
| return `${deriveBaseName(file)}Client`; | ||
| } | ||
| // ─── Type collection ────────────────────────────────────────────────────── | ||
| function collectTypes(root) { | ||
| const types = new Set(); | ||
| for (const route of root.routes) { | ||
| collectParamSourceRefs(route.params, types); | ||
| for (const op of route.operations) { | ||
| if (op.request?.bodyType) collectTypeNodeRefs(op.request.bodyType, types); | ||
| for (const resp of op.responses) { | ||
| if (resp.bodyType) collectTypeNodeRefs(resp.bodyType, types); | ||
| } | ||
| collectParamSourceRefs(op.query, types); | ||
| collectParamSourceRefs(op.headers, types); | ||
| } | ||
| } | ||
| return [...types].sort(); | ||
| } | ||
| function collectParamSourceRefs(source, out) { | ||
| if (!source) return; | ||
| if (typeof source === 'string') { | ||
| if (/^[A-Z]/.test(source)) out.add(source); | ||
| } else if (Array.isArray(source)) { | ||
| for (const param of source) { | ||
| collectTypeNodeRefs(param.type, out); | ||
| } | ||
| } else { | ||
| collectTypeNodeRefs(source, out); | ||
| } | ||
| } | ||
| function collectTypeNodeRefs(type, out) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (/^[A-Z]/.test(type.name)) out.add(type.name); | ||
| break; | ||
| case 'array': | ||
| collectTypeNodeRefs(type.item, out); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'record': | ||
| collectTypeNodeRefs(type.key, out); | ||
| collectTypeNodeRefs(type.value, out); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'lazy': | ||
| collectTypeNodeRefs(type.inner, out); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectTypeNodeRefs(f.type, out)); | ||
| break; | ||
| } | ||
| } | ||
| // ─── Type import resolution ─────────────────────────────────────────────── | ||
| function generateTypeImports(types, opFile, options) { | ||
| const lines = []; | ||
| const { modelOutPaths, outPath } = options; | ||
| if (modelOutPaths && outPath) { | ||
| const byFile = new Map(); | ||
| const unresolved = []; | ||
| for (const type of types) { | ||
| const typeOutPath = modelOutPaths.get(type); | ||
| if (typeOutPath) { | ||
| const group = byFile.get(typeOutPath) ?? []; | ||
| group.push(type); | ||
| byFile.set(typeOutPath, group); | ||
| } else { | ||
| unresolved.push(type); | ||
| } | ||
| } | ||
| const fromDir = dirname(outPath); | ||
| for (const [typeOutPath, names] of byFile) { | ||
| let rel = relative(fromDir, typeOutPath); | ||
| rel = rel.replace(/\.ts$/, '.js'); | ||
| if (!rel.startsWith('.')) rel = './' + rel; | ||
| lines.push(`import type { ${names.sort().join(', ')} } from '${rel}';`); | ||
| } | ||
| for (const type of unresolved) { | ||
| const moduleName = pascalToDotCase(type); | ||
| lines.push(`import type { ${type} } from './${moduleName}.js';`); | ||
| } | ||
| } else { | ||
| const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate); | ||
| lines.push(`import type { ${types.join(', ')} } from '${typeImport}';`); | ||
| } | ||
| return lines; | ||
| } | ||
| function deriveTypeImportPath(file, template) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'resource'; | ||
| const module = base.split('.')[0] ?? base; | ||
| if (template) { | ||
| return template.replace(/\{module\}/g, module).replace(/\{base\}/g, base); | ||
| } | ||
| return `#modules/${module}/types/index.js`; | ||
| } | ||
| // ─── Fetch helper (emitted inside the class) ────────────────────────────── | ||
| const FETCH_HELPER = [ | ||
| ' private async fetch(url: string, init: RequestInit): Promise<Response> {', | ||
| " const baseHeaders = typeof this.options.headers === 'function'", | ||
| ' ? await this.options.headers()', | ||
| ' : this.options.headers ?? {};', | ||
| ' const res = await (this.options.fetch ?? fetch)(`${this.options.baseUrl}${url}`, {', | ||
| ' ...init,', | ||
| ' headers: { ...baseHeaders, ...init.headers },', | ||
| ' });', | ||
| ' if (!res.ok) {', | ||
| ' throw new Error(`HTTP ${res.status}: ${res.statusText}`);', | ||
| ' }', | ||
| ' return res;', | ||
| ' }', | ||
| ]; | ||
| //# sourceMappingURL=codegen-client.js.map |
| {"version":3,"file":"codegen-client.js","sourceRoot":"","sources":["../src/codegen-client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAWnD,MAAM,UAAU,cAAc,CAAC,IAAgB,EAAE,UAAgC,EAAE;IAC/E,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE/C,oBAAoB;IACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,0BAA0B;IAC1B,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACnC,KAAK,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;IACxC,KAAK,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;IACvH,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,OAAO,GAAG,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IAEjE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IAC5B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAE7E,SAAS,cAAc,CAAC,KAAkB,EAAE,EAAmB,EAAE,IAAY;IACzE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAE3C,0BAA0B;IAC1B,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5F,wBAAwB;IACxB,MAAM,eAAe,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,eAAgB,CAAC,QAAS,CAAC,CAAC;IAE9E,QAAQ;IACR,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,IAAI,QAAQ,cAAc,UAAU,KAAK,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE7D,eAAe;IACf,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC5B,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,IAAI,QAAQ,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,oFAAoF,CAAC,CAAC;QACjG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,QAAQ,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,qBAAqB,CAAC;IACtE,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAEhC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,QAAQ,EAAE,CAAC;QACX,SAAS,CAAC,IAAI,CAAC,eAAe,QAAQ,iBAAiB,QAAQ,IAAI,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACJ,SAAS,CAAC,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,WAAW,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAClE,SAAS,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;QACjD,CAAC;IACL,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACb,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,yCAAyC;YACzC,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YACnE,SAAS,CAAC,OAAO,CAAC,GAAG,mEAAmE,CAAC;QAC7F,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,QAAQ,EAAE,CAAC;QAChE,uBAAuB;QACvB,KAAK,CAAC,IAAI,CAAC,0CAA0C,QAAQ,kBAAkB,UAAU,OAAO,CAAC,CAAC;IACtG,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,wCAAwC,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvG,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,+BAA+B;IACnC,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,sCAAsC,UAAU,GAAG,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,6EAA6E;AAE7E,SAAS,kBAAkB,CAAC,IAAY,EAAE,MAAoB;IAC1D,2DAA2D;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAC/D,OAAO,gCAAgC,IAAI,KAAK,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC;AAUD,SAAS,iBAAiB,CAAC,KAAkB,EAAE,EAAmB;IAC9D,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,8CAA8C;IAC9C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YAC/E,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACzE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACvF,CAAC;IACL,CAAC;IAED,OAAO;IACP,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,qBAAqB,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC5F,CAAC;IACL,CAAC;IAED,QAAQ;IACR,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjF,CAAC;IACL,CAAC;IAED,UAAU;IACV,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7E,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3F,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,OAAO;YACR,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAC1C,KAAK,OAAO;YACR,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1D,KAAK,QAAQ;YACT,OAAO,UAAU,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5E,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,SAAS;YACV,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,cAAc;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,KAAK;YACN,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB,KAAK,MAAM;YACP,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,cAAc;YACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAChC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACP,OAAO,QAAQ,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACN,OAAO,QAAQ,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC;QACpB,KAAK,SAAS;YACV,OAAO,SAAS,CAAC;QACrB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACX,OAAO,QAAQ,CAAC;QACpB,KAAK,MAAM;YACP,OAAO,MAAM,CAAC;QAClB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,SAAS;YACV,OAAO,SAAS,CAAC;QACrB,KAAK,QAAQ;YACT,OAAO,yBAAyB,CAAC;QACrC,KAAK,QAAQ;YACT,OAAO,MAAM,CAAC;QAClB;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,CAAC,CAAC,IAAI,GAAG,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,CAAC;AAED,6EAA6E;AAE7E,SAAS,gBAAgB,CAAC,EAAmB,EAAE,KAAkB;IAC7D,IAAI,EAAE,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IAC1B,OAAO,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,IAAY;IACjD,+CAA+C;IAC/C,qCAAqC;IACrC,+BAA+B;IAC/B,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,uCAAuC;YACvC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACJ,iCAAiC;YACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,OAAO,IAAI;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,6EAA6E;AAE7E,SAAS,YAAY,CAAC,IAAgB;IAClC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ;gBAAE,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAC1E,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,QAAQ;oBAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA+B,EAAE,GAAgB;IAC7E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,GAAgB;IAC5D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM;QACV,KAAK,OAAO;YACR,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM;QACV,KAAK,QAAQ;YACT,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,MAAM;YACP,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM;IACd,CAAC;AACL,CAAC;AAED,6EAA6E;AAE7E,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,OAA6B;IACvF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,aAAa,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,cAAc,UAAU,OAAO,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAiB;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC/C,CAAC;AAED,6EAA6E;AAE7E,MAAM,YAAY,GAAG;IACjB,8EAA8E;IAC9E,0EAA0E;IAC1E,4CAA4C;IAC5C,2CAA2C;IAC3C,4FAA4F;IAC5F,sBAAsB;IACtB,2DAA2D;IAC3D,aAAa;IACb,wBAAwB;IACxB,uEAAuE;IACvE,WAAW;IACX,qBAAqB;IACrB,OAAO;CACV,CAAC"} |
| import type { DtoRootNode, ModelNode, DtoTypeNode, ObjectMode } from './ast.js'; | ||
| export declare function modeToWrapper(mode: ObjectMode): string; | ||
| export interface DtoCodegenContext { | ||
| /** Map from model name → absolute output file path */ | ||
| modelOutPaths: Map<string, string>; | ||
| /** Absolute output file path for the current DTO file */ | ||
| currentOutPath: string; | ||
| /** Set of model names that have Input variants (models with visibility modifiers) */ | ||
| modelsWithInput?: Set<string>; | ||
| /** If set, import JsonValue from this path instead of re-declaring it (avoids barrel re-export conflicts) */ | ||
| jsonValueImportPath?: string; | ||
| } | ||
| /** | ||
| * Compute which models need Input variants, including transitive dependencies. | ||
| * A model needs an Input variant if it has visibility-modified fields, OR if | ||
| * any of its field types (recursively) reference a model that has an Input variant. | ||
| */ | ||
| export declare function computeModelsWithInput(models: ModelNode[], externalModelsWithInput?: Set<string>): Set<string>; | ||
| export declare function generateDto(root: DtoRootNode, context?: DtoCodegenContext): string; | ||
| export declare function renderType(type: DtoTypeNode, camel?: boolean): string; | ||
| /** | ||
| * Like renderType, but substitutes model refs with their Input variant | ||
| * when the model has visibility modifiers, and coerces scalars from strings. | ||
| * Used for Input (write) schema fields so that sub-type references also | ||
| * point to their Input variants. | ||
| */ | ||
| export declare function renderInputType(type: DtoTypeNode, modelsWithInput?: Set<string>): string; | ||
| /** | ||
| * Like renderType, but wraps array types with z.preprocess to handle | ||
| * query strings where a single value arrives as a string instead of a string[]. | ||
| * Also uses Input variants for model refs when modelsWithInput is provided. | ||
| */ | ||
| export declare function renderQueryType(type: DtoTypeNode, modelsWithInput?: Set<string>): string; | ||
| export declare function typeNeedsScalar(type: DtoTypeNode, name: string): boolean; | ||
| export declare function rootNeedsScalar(root: DtoRootNode, name: string): boolean; | ||
| export declare function typeNeedsDateTime(type: DtoTypeNode): boolean; | ||
| export declare function collectExternalRefs(root: DtoRootNode): string[]; | ||
| /** Collect external Input variant refs needed for Input schema fields. */ | ||
| export declare function collectExternalInputRefs(root: DtoRootNode, modelsWithInput: Set<string>): string[]; | ||
| export declare function collectTypeRefs(type: DtoTypeNode, out: Set<string>): void; | ||
| /** | ||
| * Topologically sort models so dependencies are emitted before dependents. | ||
| * Falls back to source order for cycles (which would need z.lazy at runtime). | ||
| */ | ||
| export declare function topoSortModels(models: ModelNode[]): ModelNode[]; | ||
| /** | ||
| * Resolve the import path for an external model reference. | ||
| * When a codegen context is available, computes the correct relative path | ||
| * from the current file to the referenced model's output file. | ||
| * Falls back to same-directory PascalCase → dot.case convention. | ||
| */ | ||
| export declare function resolveImportPath(refName: string, context?: DtoCodegenContext): string; | ||
| /** Convert PascalCase to dot-separated lowercase: CounterpartyAccount → counterparty.account */ | ||
| export declare function pascalToDotCase(name: string): string; | ||
| //# sourceMappingURL=codegen-dto.d.ts.map |
| {"version":3,"file":"codegen-dto.d.ts","sourceRoot":"","sources":["../src/codegen-dto.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,WAAW,EACX,SAAS,EAET,WAAW,EAYX,UAAU,EACb,MAAM,UAAU,CAAC;AAElB,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAMtD;AAID,MAAM,WAAW,iBAAiB;IAC9B,sDAAsD;IACtD,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,yDAAyD;IACzD,cAAc,EAAE,MAAM,CAAC;IACvB,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,6GAA6G;IAC7G,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAChC;AAID;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,uBAAuB,GAAE,GAAG,CAAC,MAAM,CAAa,GAAG,GAAG,CAAC,MAAM,CAAC,CAsCzH;AAeD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CA4ClF;AAyKD,wBAAgB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,KAAK,UAAQ,GAAG,MAAM,CA2BnE;AA+ID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAyCxF;AAuBD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CA6BxF;AAuCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAYxE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAKxE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAe5D;AAED,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE,CAc/D;AAED,0EAA0E;AAC1E,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CA4BlG;AAgCD,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI,CA4BzE;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,CA6D/D;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAgBtF;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD"} |
| import { relative, dirname } from 'node:path'; | ||
| export function modeToWrapper(mode) { | ||
| switch (mode) { | ||
| case 'strict': | ||
| return 'z.strictObject'; | ||
| case 'strip': | ||
| return 'z.object'; | ||
| case 'loose': | ||
| return 'z.looseObject'; | ||
| } | ||
| } | ||
| // ─── Public entry point ──────────────────────────────────────────────────── | ||
| /** | ||
| * Compute which models need Input variants, including transitive dependencies. | ||
| * A model needs an Input variant if it has visibility-modified fields, OR if | ||
| * any of its field types (recursively) reference a model that has an Input variant. | ||
| */ | ||
| export function computeModelsWithInput(models, externalModelsWithInput = new Set()) { | ||
| const result = new Set(); | ||
| // Initial pass: direct visibility modifiers | ||
| for (const model of models) { | ||
| if (model.fields.some(f => f.visibility !== 'normal')) { | ||
| result.add(model.name); | ||
| } | ||
| } | ||
| // Transitive closure: add models that reference models with Input variants, | ||
| // including through base model inheritance. | ||
| let changed = true; | ||
| while (changed) { | ||
| changed = false; | ||
| for (const model of models) { | ||
| if (result.has(model.name)) continue; | ||
| const refs = new Set(); | ||
| for (const field of model.fields) { | ||
| collectTypeRefs(field.type, refs); | ||
| } | ||
| // A model that extends a parent with Input variants also needs an Input variant, | ||
| // so that the write schema can extend ParentInput instead of Parent. | ||
| if (model.base) refs.add(model.base); | ||
| // A type alias (model.type set) that references a model with Input variants | ||
| // also needs an Input variant. | ||
| if (model.type) collectTypeRefs(model.type, refs); | ||
| for (const ref of refs) { | ||
| if (result.has(ref) || externalModelsWithInput.has(ref)) { | ||
| result.add(model.name); | ||
| changed = true; | ||
| break; | ||
| } | ||
| } | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
| function generateComments(model, outPath) { | ||
| const lines = []; | ||
| lines.push('/**'); | ||
| if (model.description) { | ||
| lines.push(` * ${model.description}`); | ||
| } | ||
| const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file; | ||
| lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`); | ||
| lines.push('*/'); | ||
| return lines; | ||
| } | ||
| export function generateDto(root, context) { | ||
| const needsDateTime = rootNeedsDateTime(root); | ||
| const needsBinary = rootNeedsScalar(root, 'binary'); | ||
| const needsDatetime = rootNeedsScalar(root, 'datetime'); | ||
| const needsJson = rootNeedsScalar(root, 'json'); | ||
| const externalRefs = collectExternalRefs(root); | ||
| const lines = []; | ||
| // Compute which models have Input variants (local, incl. transitive deps + external) | ||
| const externalModelsWithInput = context?.modelsWithInput ?? new Set(); | ||
| const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput); | ||
| const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]); | ||
| // Collect additional external Input refs needed for Input schema fields | ||
| const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : []; | ||
| const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs])].sort(); | ||
| lines.push(`import { z } from 'zod';`); | ||
| if (needsDateTime) lines.push(`import { DateTime } from 'luxon';`); | ||
| for (const ref of allExternalRefs) { | ||
| const importPath = resolveImportPath(ref, context); | ||
| lines.push(`import { ${ref} } from '${importPath}';`); | ||
| } | ||
| lines.push(''); | ||
| if (needsBinary) { | ||
| lines.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`); | ||
| } | ||
| if (needsDatetime) { | ||
| lines.push( | ||
| `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`, | ||
| ); | ||
| } | ||
| if (needsJson) { | ||
| lines.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`); | ||
| lines.push( | ||
| `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`, | ||
| ); | ||
| } | ||
| if (needsBinary || needsDatetime || needsJson) lines.push(''); | ||
| for (const model of topoSortModels(root.models)) { | ||
| lines.push(...generateModel(model, context?.currentOutPath, allModelsWithInput)); | ||
| lines.push(''); | ||
| } | ||
| return lines.join('\n'); | ||
| } | ||
| // ─── Model ───────────────────────────────────────────────────────────────── | ||
| function generateModel(model, outPath, modelsWithInput) { | ||
| // Type alias: Name : typeExpression | ||
| if (model.type) { | ||
| return generateTypeAlias(model, outPath, modelsWithInput); | ||
| } | ||
| // A model needs Input/read split if it has visibility-modified fields OR if it | ||
| // transitively references models that have Input variants (captured in modelsWithInput). | ||
| const needsInputSplit = model.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(model.name) ?? false); | ||
| if (needsInputSplit) { | ||
| return generateThreeSchemaModel(model, outPath, modelsWithInput); | ||
| } | ||
| return generateSimpleModel(model, outPath); | ||
| } | ||
| function generateTypeAlias(model, outPath, modelsWithInput) { | ||
| const lines = []; | ||
| lines.push(...generateComments(model, outPath)); | ||
| lines.push(`export const ${model.name} = ${renderType(model.type)};`); | ||
| lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`); | ||
| if (modelsWithInput?.has(model.name)) { | ||
| lines.push(`export const ${model.name}Input = ${renderInputType(model.type, modelsWithInput)};`); | ||
| lines.push(`export type ${model.name}Input = z.infer<typeof ${model.name}Input>;`); | ||
| } | ||
| return lines; | ||
| } | ||
| function generateSimpleModel(model, outPath) { | ||
| const lines = []; | ||
| lines.push(...generateComments(model, outPath)); | ||
| const wrapper = modeToWrapper(model.mode ?? 'strict'); | ||
| if (model.camelCase) { | ||
| const snakeBody = renderFieldsAsSnakeCase(model.fields); | ||
| lines.push(`export const ${model.name} = ${wrapper}({`); | ||
| lines.push(...snakeBody.map(l => ` ${l}`)); | ||
| lines.push(`}).transform(data => ({`); | ||
| for (const field of model.fields) { | ||
| const snakeKey = camelToSnake(field.name); | ||
| lines.push(` ${quoteKey(field.name)}: data.${snakeKey},`); | ||
| } | ||
| lines.push(`}));`); | ||
| lines.push(`export type ${model.name} = z.output<typeof ${model.name}>;`); | ||
| return lines; | ||
| } | ||
| const body = renderFields(model.fields); | ||
| if (model.base) { | ||
| lines.push(`export const ${model.name} = ${model.base}.extend({`); | ||
| lines.push(...body.map(l => ` ${l}`)); | ||
| lines.push(`});`); | ||
| } else { | ||
| lines.push(`export const ${model.name} = ${wrapper}({`); | ||
| lines.push(...body.map(l => ` ${l}`)); | ||
| lines.push(`});`); | ||
| } | ||
| lines.push(`export type ${model.name} = z.infer<typeof ${model.name}>;`); | ||
| return lines; | ||
| } | ||
| function generateThreeSchemaModel(model, outPath, modelsWithInput) { | ||
| const lines = []; | ||
| const name = model.name; | ||
| lines.push(...generateComments(model, outPath)); | ||
| const wrapper = modeToWrapper(model.mode ?? 'strict'); | ||
| // Base schema — all fields (used internally when a submodel extends this one) | ||
| const allFields = model.fields; | ||
| const baseBody = renderFields(allFields); | ||
| // Use ParentBase.extend() when parent also has the three-schema pattern, else Parent.extend() | ||
| const baseParent = model.base ? (modelsWithInput?.has(model.base) ? `${model.base}Base` : model.base) : null; | ||
| if (baseParent) { | ||
| lines.push(`const ${name}Base = ${baseParent}.extend({`); | ||
| } else { | ||
| lines.push(`const ${name}Base = ${wrapper}({`); | ||
| } | ||
| lines.push(...baseBody.map(l => ` ${l}`)); | ||
| lines.push(`});`); | ||
| lines.push(''); | ||
| // Read schema — omit writeonly fields; extends parent read schema | ||
| const readFields = allFields.filter(f => f.visibility !== 'writeonly'); | ||
| const readBody = renderFields(readFields); | ||
| if (model.base) { | ||
| lines.push(`export const ${name} = ${model.base}.extend({`); | ||
| } else { | ||
| lines.push(`export const ${name} = ${wrapper}({`); | ||
| } | ||
| lines.push(...readBody.map(l => ` ${l}`)); | ||
| lines.push(`});`); | ||
| lines.push(`export type ${name} = z.infer<typeof ${name}>;`); | ||
| lines.push(''); | ||
| // Write schema — omit readonly fields (use Input variants for sub-type refs); | ||
| // extends ParentInput if parent has an Input variant, else extends parent read schema | ||
| const writeFields = allFields.filter(f => f.visibility !== 'readonly'); | ||
| const writeBody = modelsWithInput ? renderInputFields(writeFields, modelsWithInput) : renderFields(writeFields); | ||
| const writeBase = model.base ? (modelsWithInput?.has(model.base) ? `${model.base}Input` : model.base) : null; | ||
| if (writeBase) { | ||
| lines.push(`export const ${name}Input = ${writeBase}.extend({`); | ||
| } else { | ||
| lines.push(`export const ${name}Input = ${wrapper}({`); | ||
| } | ||
| lines.push(...writeBody.map(l => ` ${l}`)); | ||
| lines.push(`});`); | ||
| lines.push(`export type ${name}Input = z.infer<typeof ${name}Input>;`); | ||
| return lines; | ||
| } | ||
| // ─── Fields ──────────────────────────────────────────────────────────────── | ||
| function camelToSnake(s) { | ||
| return s.replace(/[A-Z]/g, c => `_${c.toLowerCase()}`); | ||
| } | ||
| function renderFields(fields) { | ||
| return fields.map(f => renderField(f)); | ||
| } | ||
| function renderFieldsAsSnakeCase(fields) { | ||
| return fields.map(f => { | ||
| const snakeKey = camelToSnake(f.name); | ||
| let expr = renderType(f.type, true); | ||
| if (f.default !== undefined) { | ||
| if (f.nullable) expr += '.nullable()'; | ||
| const dv = typeof f.default === 'string' ? `"${escapeString(f.default)}"` : String(f.default); | ||
| expr += `.default(${dv})`; | ||
| } else if (f.optional) { | ||
| // .nullish() accepts null or undefined from the API; the transform coerces null → undefined | ||
| expr += '.nullish()'; | ||
| } else if (f.nullable) { | ||
| expr += '.nullable()'; | ||
| } | ||
| if (f.description) expr += `.describe("${escapeString(f.description)}")`; | ||
| return `${quoteKey(snakeKey)}: ${expr},`; | ||
| }); | ||
| } | ||
| function renderField(field) { | ||
| let expr = renderType(field.type); | ||
| if (field.nullable) expr += '.nullable()'; | ||
| if (field.default !== undefined) { | ||
| const dv = typeof field.default === 'string' ? `"${escapeString(field.default)}"` : String(field.default); | ||
| expr += `.default(${dv})`; | ||
| } else if (field.optional) { | ||
| expr += '.optional()'; | ||
| } | ||
| if (field.description) expr += `.describe("${escapeString(field.description)}")`; | ||
| return `${quoteKey(field.name)}: ${expr},`; | ||
| } | ||
| // ─── Type rendering ──────────────────────────────────────────────────────── | ||
| export function renderType(type, camel = false) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return renderScalar(type); | ||
| case 'array': | ||
| return renderArray(type, camel); | ||
| case 'tuple': | ||
| return renderTuple(type); | ||
| case 'record': | ||
| return renderRecord(type); | ||
| case 'enum': | ||
| return renderEnum(type); | ||
| case 'literal': | ||
| return renderLiteral(type); | ||
| case 'union': | ||
| return renderUnion(type, camel); | ||
| case 'intersection': | ||
| return renderIntersection(type, camel); | ||
| case 'ref': | ||
| return type.name; | ||
| case 'lazy': | ||
| return `z.lazy(() => ${renderType(type.inner, camel)})`; | ||
| case 'inlineObject': | ||
| return renderInlineObject(type, camel); | ||
| default: | ||
| return 'z.unknown()'; | ||
| } | ||
| } | ||
| function renderScalar(s) { | ||
| switch (s.name) { | ||
| case 'string': { | ||
| let e = 'z.string()'; | ||
| if (s.min !== undefined && s.max !== undefined) e += `.min(${s.min}).max(${s.max})`; | ||
| else if (s.min !== undefined) e += `.min(${s.min})`; | ||
| else if (s.max !== undefined) e += `.max(${s.max})`; | ||
| if (s.len !== undefined) e += `.length(${s.len})`; | ||
| if (s.regex) e += `.regex(/^${s.regex.replace(/\//g, '\\/')}$/)`; | ||
| return e; | ||
| } | ||
| case 'number': { | ||
| let e = 'z.coerce.number()'; | ||
| if (s.min !== undefined) e += `.min(${s.min})`; | ||
| if (s.max !== undefined) e += `.max(${s.max})`; | ||
| return e; | ||
| } | ||
| case 'int': { | ||
| let e = 'z.coerce.number().int()'; | ||
| if (s.min !== undefined) e += `.min(${s.min})`; | ||
| if (s.max !== undefined) e += `.max(${s.max})`; | ||
| return e; | ||
| } | ||
| case 'bigint': { | ||
| let inner = 'z.bigint()'; | ||
| if (s.min !== undefined) inner += `.min(${s.min}n)`; | ||
| if (s.max !== undefined) inner += `.max(${s.max}n)`; | ||
| return `z.preprocess((val) => typeof val === 'string' ? BigInt(val.replace(/n$/, '')) : val, ${inner})`; | ||
| } | ||
| case 'boolean': | ||
| return 'z.boolean()'; | ||
| case 'date': { | ||
| const fmt = s.format ?? 'yyyy-MM-dd'; | ||
| return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a date in format ${escapeString(fmt)}' }))`; | ||
| } | ||
| case 'time': { | ||
| const fmt = s.format ?? 'HH:mm:ss'; | ||
| return `z.preprocess((val) => typeof val === 'string' ? DateTime.fromFormat(val, '${escapeString(fmt)}') : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be a time in format ${escapeString(fmt)}' }))`; | ||
| } | ||
| case 'datetime': | ||
| return '_ZodDatetime'; | ||
| case 'email': | ||
| return 'z.email()'; | ||
| case 'url': | ||
| return 'z.url()'; | ||
| case 'uuid': | ||
| return 'z.uuid()'; | ||
| case 'any': | ||
| return 'z.any()'; | ||
| case 'unknown': | ||
| return 'z.unknown()'; | ||
| case 'null': | ||
| return 'z.null()'; | ||
| case 'object': | ||
| return 'z.record(z.string(), z.unknown())'; | ||
| case 'binary': | ||
| return '_ZodBinary'; | ||
| case 'json': | ||
| return '_ZodJson'; | ||
| default: | ||
| return 'z.unknown()'; | ||
| } | ||
| } | ||
| function renderArray(a, camel = false) { | ||
| let e = `z.array(${renderType(a.item, camel)})`; | ||
| if (a.min !== undefined) e += `.min(${a.min})`; | ||
| if (a.max !== undefined) e += `.max(${a.max})`; | ||
| return e; | ||
| } | ||
| function renderTuple(t) { | ||
| return `z.tuple([${t.items.map(i => renderType(i)).join(', ')}])`; | ||
| } | ||
| function renderRecord(r) { | ||
| return `z.record(${renderType(r.key)}, ${renderType(r.value)})`; | ||
| } | ||
| function renderEnum(e) { | ||
| const vals = e.values.map(v => `"${v}"`).join(', '); | ||
| return `z.enum([${vals}])`; | ||
| } | ||
| function renderLiteral(l) { | ||
| if (typeof l.value === 'string') return `z.literal("${escapeString(l.value)}")`; | ||
| return `z.literal(${l.value})`; | ||
| } | ||
| function renderUnion(u, camel = false) { | ||
| return `z.union([${u.members.map(m => renderType(m, camel)).join(', ')}])`; | ||
| } | ||
| function renderIntersection(i, camel = false) { | ||
| const [first, ...rest] = i.members; | ||
| // When the pattern is ref & { inlineObject(s) }, use .extend() to produce a | ||
| // single merged ZodObject. Using .and(z.strictObject) breaks because each | ||
| // strict side rejects the other side's keys during intersection parsing. | ||
| if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'inlineObject')) { | ||
| const allFields = rest.flatMap(m => m.fields); | ||
| const fieldLines = camel | ||
| ? renderFieldsAsSnakeCase(allFields) | ||
| .map(l => ` ${l}`) | ||
| .join('\n') | ||
| : allFields.map(f => ` ${renderField(f)}`).join('\n'); | ||
| return `${first.name}.extend({\n${fieldLines}\n})`; | ||
| } | ||
| let expr = renderType(first, camel); | ||
| for (const member of rest) { | ||
| expr += `.and(${renderType(member, camel)})`; | ||
| } | ||
| return expr; | ||
| } | ||
| function renderInlineObject(o, camel = false) { | ||
| const wrapper = modeToWrapper(o.mode ?? 'strict'); | ||
| if (camel) { | ||
| const snakeLines = renderFieldsAsSnakeCase(o.fields); | ||
| const joined = snakeLines.map(l => ` ${l}`).join('\n'); | ||
| const transformEntries = o.fields | ||
| .map(f => { | ||
| const snakeKey = camelToSnake(f.name); | ||
| // Optional fields use .nullish() on input; coerce null → undefined in output | ||
| const val = f.optional ? `data.${snakeKey} ?? undefined` : `data.${snakeKey}`; | ||
| return ` ${quoteKey(f.name)}: ${val},`; | ||
| }) | ||
| .join('\n'); | ||
| return `${wrapper}({\n${joined}\n}).transform(data => ({\n${transformEntries}\n}))`; | ||
| } | ||
| const fields = o.fields.map(f => ` ${renderField(f)}`).join('\n'); | ||
| return `${wrapper}({\n${fields}\n})`; | ||
| } | ||
| // ─── Input type rendering ───────────────────────────────────────────────── | ||
| /** | ||
| * Like renderScalar, but coerces from string input (JSON wire format). | ||
| * Used for Input (write) schemas where data arrives as JSON strings. | ||
| */ | ||
| function renderInputScalar(s) { | ||
| return renderScalar(s); | ||
| } | ||
| /** | ||
| * Like renderType, but substitutes model refs with their Input variant | ||
| * when the model has visibility modifiers, and coerces scalars from strings. | ||
| * Used for Input (write) schema fields so that sub-type references also | ||
| * point to their Input variants. | ||
| */ | ||
| export function renderInputType(type, modelsWithInput) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return renderInputScalar(type); | ||
| case 'ref': | ||
| return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name; | ||
| case 'array': { | ||
| let e = `z.array(${renderInputType(type.item, modelsWithInput)})`; | ||
| if (type.min !== undefined) e += `.min(${type.min})`; | ||
| if (type.max !== undefined) e += `.max(${type.max})`; | ||
| return e; | ||
| } | ||
| case 'tuple': | ||
| return `z.tuple([${type.items.map(i => renderInputType(i, modelsWithInput)).join(', ')}])`; | ||
| case 'record': | ||
| return `z.record(${renderInputType(type.key, modelsWithInput)}, ${renderInputType(type.value, modelsWithInput)})`; | ||
| case 'union': | ||
| return `z.union([${type.members.map(m => renderInputType(m, modelsWithInput)).join(', ')}])`; | ||
| case 'intersection': { | ||
| const [first, ...rest] = type.members; | ||
| if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'inlineObject')) { | ||
| const base = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name; | ||
| const allFields = rest.flatMap(m => m.fields); | ||
| const fieldLines = allFields.map(f => ` ${renderInputField(f, modelsWithInput ?? new Set())}`).join('\n'); | ||
| return `${base}.extend({\n${fieldLines}\n})`; | ||
| } | ||
| let expr = renderInputType(first, modelsWithInput); | ||
| for (const member of rest) { | ||
| expr += `.and(${renderInputType(member, modelsWithInput)})`; | ||
| } | ||
| return expr; | ||
| } | ||
| case 'lazy': | ||
| return `z.lazy(() => ${renderInputType(type.inner, modelsWithInput)})`; | ||
| case 'inlineObject': { | ||
| const fields = type.fields.map(f => ` ${renderInputField(f, modelsWithInput ?? new Set())}`).join('\n'); | ||
| return `${modeToWrapper(type.mode ?? 'strict')}({\n${fields}\n})`; | ||
| } | ||
| default: | ||
| return renderType(type); | ||
| } | ||
| } | ||
| function renderInputField(field, modelsWithInput) { | ||
| let expr = renderInputType(field.type, modelsWithInput); | ||
| if (field.nullable) expr += '.nullable()'; | ||
| if (field.default !== undefined) { | ||
| const dv = typeof field.default === 'string' ? `"${escapeString(field.default)}"` : String(field.default); | ||
| expr += `.default(${dv})`; | ||
| } else if (field.optional) { | ||
| expr += '.optional()'; | ||
| } | ||
| if (field.description) expr += `.describe("${escapeString(field.description)}")`; | ||
| return `${quoteKey(field.name)}: ${expr},`; | ||
| } | ||
| function renderInputFields(fields, modelsWithInput) { | ||
| return fields.map(f => renderInputField(f, modelsWithInput)); | ||
| } | ||
| // ─── Query type rendering ───────────────────────────────────────────────── | ||
| /** | ||
| * Like renderType, but wraps array types with z.preprocess to handle | ||
| * query strings where a single value arrives as a string instead of a string[]. | ||
| * Also uses Input variants for model refs when modelsWithInput is provided. | ||
| */ | ||
| export function renderQueryType(type, modelsWithInput) { | ||
| switch (type.kind) { | ||
| case 'array': { | ||
| const inner = modelsWithInput ? renderInputType(type, modelsWithInput) : renderType(type); | ||
| return `z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner})`; | ||
| } | ||
| case 'inlineObject': { | ||
| const fields = type.fields.map(f => ` ${renderQueryField(f, modelsWithInput)}`).join('\n'); | ||
| return `${modeToWrapper(type.mode ?? 'strict')}({\n${fields}\n})`; | ||
| } | ||
| case 'intersection': { | ||
| const [first, ...rest] = type.members; | ||
| if (first && first.kind === 'ref' && rest.length > 0 && rest.every(m => m.kind === 'inlineObject')) { | ||
| const base = modelsWithInput?.has(first.name) ? `${first.name}Input` : first.name; | ||
| const allFields = rest.flatMap(m => m.fields); | ||
| const fieldLines = allFields.map(f => ` ${renderQueryField(f, modelsWithInput)}`).join('\n'); | ||
| return `${base}.extend({\n${fieldLines}\n})`; | ||
| } | ||
| let expr = renderQueryType(first, modelsWithInput); | ||
| for (const member of rest) { | ||
| expr += `.and(${renderQueryType(member, modelsWithInput)})`; | ||
| } | ||
| return expr; | ||
| } | ||
| case 'ref': | ||
| return modelsWithInput?.has(type.name) ? `${type.name}Input` : type.name; | ||
| default: | ||
| return modelsWithInput ? renderInputType(type, modelsWithInput) : renderType(type); | ||
| } | ||
| } | ||
| function renderQueryField(field, modelsWithInput) { | ||
| let expr = | ||
| field.type.kind === 'array' | ||
| ? renderQueryType(field.type, modelsWithInput) | ||
| : modelsWithInput | ||
| ? renderInputType(field.type, modelsWithInput) | ||
| : renderType(field.type); | ||
| if (field.nullable) expr += '.nullable()'; | ||
| if (field.default !== undefined) { | ||
| const dv = typeof field.default === 'string' ? `"${escapeString(field.default)}"` : String(field.default); | ||
| expr += `.default(${dv})`; | ||
| } else if (field.optional) { | ||
| expr += '.optional()'; | ||
| } | ||
| if (field.description) expr += `.describe("${escapeString(field.description)}")`; | ||
| return `${quoteKey(field.name)}: ${expr},`; | ||
| } | ||
| function isValidIdentifier(name) { | ||
| return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name); | ||
| } | ||
| function quoteKey(name) { | ||
| return isValidIdentifier(name) ? name : `'${name}'`; | ||
| } | ||
| // ─── String escaping ────────────────────────────────────────────────────── | ||
| function escapeString(s) { | ||
| return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"').replace(/\n/g, '\\n').replace(/\r/g, '\\r'); | ||
| } | ||
| // ─── Helpers ─────────────────────────────────────────────────────────────── | ||
| function rootNeedsDateTime(root) { | ||
| return root.models.some(m => (m.type && typeNeedsDateTime(m.type)) || m.fields.some(f => typeNeedsDateTime(f.type))); | ||
| } | ||
| export function typeNeedsScalar(type, name) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return type.name === name; | ||
| case 'array': | ||
| return typeNeedsScalar(type.item, name); | ||
| case 'tuple': | ||
| return type.items.some(i => typeNeedsScalar(i, name)); | ||
| case 'record': | ||
| return typeNeedsScalar(type.key, name) || typeNeedsScalar(type.value, name); | ||
| case 'union': | ||
| return type.members.some(m => typeNeedsScalar(m, name)); | ||
| case 'intersection': | ||
| return type.members.some(m => typeNeedsScalar(m, name)); | ||
| case 'lazy': | ||
| return typeNeedsScalar(type.inner, name); | ||
| case 'inlineObject': | ||
| return type.fields.some(f => typeNeedsScalar(f.type, name)); | ||
| default: | ||
| return false; | ||
| } | ||
| } | ||
| export function rootNeedsScalar(root, name) { | ||
| return root.models.some(m => (m.type && typeNeedsScalar(m.type, name)) || m.fields.some(f => typeNeedsScalar(f.type, name))); | ||
| } | ||
| export function typeNeedsDateTime(type) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return type.name === 'date' || type.name === 'time' || type.name === 'datetime'; | ||
| case 'array': | ||
| return typeNeedsDateTime(type.item); | ||
| case 'union': | ||
| return type.members.some(typeNeedsDateTime); | ||
| case 'intersection': | ||
| return type.members.some(typeNeedsDateTime); | ||
| case 'inlineObject': | ||
| return type.fields.some(f => typeNeedsDateTime(f.type)); | ||
| default: | ||
| return false; | ||
| } | ||
| } | ||
| export function collectExternalRefs(root) { | ||
| const localNames = new Set(root.models.map(m => m.name)); | ||
| const refs = new Set(); | ||
| for (const model of root.models) { | ||
| if (model.base && !localNames.has(model.base)) refs.add(model.base); | ||
| if (model.type) collectTypeRefs(model.type, refs); | ||
| for (const field of model.fields) { | ||
| collectTypeRefs(field.type, refs); | ||
| } | ||
| } | ||
| for (const name of localNames) refs.delete(name); | ||
| return [...refs].sort(); | ||
| } | ||
| /** Collect external Input variant refs needed for Input schema fields. */ | ||
| export function collectExternalInputRefs(root, modelsWithInput) { | ||
| const localNames = new Set(root.models.map(m => m.name)); | ||
| const refs = new Set(); | ||
| for (const model of root.models) { | ||
| if (!modelsWithInput.has(model.name)) continue; | ||
| // Type alias: collect Input refs from the aliased type expression. | ||
| if (model.type) { | ||
| collectInputTypeRefs(model.type, refs, modelsWithInput); | ||
| continue; | ||
| } | ||
| // When a model extends an external parent that has an Input variant, | ||
| // the write schema extends ParentInput — so we need to import it. | ||
| if (model.base && modelsWithInput.has(model.base) && !localNames.has(model.base)) { | ||
| refs.add(`${model.base}Input`); | ||
| } | ||
| const writeFields = model.fields.filter(f => f.visibility !== 'readonly'); | ||
| for (const field of writeFields) { | ||
| collectInputTypeRefs(field.type, refs, modelsWithInput); | ||
| } | ||
| } | ||
| // Remove locally defined Input variants (generated in this file) | ||
| for (const name of localNames) { | ||
| refs.delete(`${name}Input`); | ||
| } | ||
| return [...refs].sort(); | ||
| } | ||
| function collectInputTypeRefs(type, out, modelsWithInput) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`); | ||
| break; | ||
| case 'array': | ||
| collectInputTypeRefs(type.item, out, modelsWithInput); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(i => collectInputTypeRefs(i, out, modelsWithInput)); | ||
| break; | ||
| case 'record': | ||
| collectInputTypeRefs(type.key, out, modelsWithInput); | ||
| collectInputTypeRefs(type.value, out, modelsWithInput); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(m => collectInputTypeRefs(m, out, modelsWithInput)); | ||
| break; | ||
| case 'lazy': | ||
| collectInputTypeRefs(type.inner, out, modelsWithInput); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectInputTypeRefs(f.type, out, modelsWithInput)); | ||
| break; | ||
| } | ||
| } | ||
| export function collectTypeRefs(type, out) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| out.add(type.name); | ||
| break; | ||
| case 'array': | ||
| collectTypeRefs(type.item, out); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(t => collectTypeRefs(t, out)); | ||
| break; | ||
| case 'record': | ||
| collectTypeRefs(type.key, out); | ||
| collectTypeRefs(type.value, out); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(t => collectTypeRefs(t, out)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(t => collectTypeRefs(t, out)); | ||
| break; | ||
| case 'lazy': | ||
| collectTypeRefs(type.inner, out); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectTypeRefs(f.type, out)); | ||
| break; | ||
| } | ||
| } | ||
| /** | ||
| * Topologically sort models so dependencies are emitted before dependents. | ||
| * Falls back to source order for cycles (which would need z.lazy at runtime). | ||
| */ | ||
| export function topoSortModels(models) { | ||
| const localNames = new Set(models.map(m => m.name)); | ||
| const modelMap = new Map(models.map(m => [m.name, m])); | ||
| // Build adjacency: model name → set of local model names it depends on | ||
| const deps = new Map(); | ||
| for (const model of models) { | ||
| const refs = new Set(); | ||
| if (model.base && localNames.has(model.base)) refs.add(model.base); | ||
| if (model.type) collectTypeRefs(model.type, refs); | ||
| for (const field of model.fields) { | ||
| collectTypeRefs(field.type, refs); | ||
| } | ||
| // Keep only local dependencies | ||
| const localDeps = new Set(); | ||
| for (const r of refs) { | ||
| if (localNames.has(r) && r !== model.name) localDeps.add(r); | ||
| } | ||
| deps.set(model.name, localDeps); | ||
| } | ||
| // Kahn's algorithm | ||
| const inDegree = new Map(); | ||
| for (const name of localNames) inDegree.set(name, 0); | ||
| for (const [, d] of deps) { | ||
| for (const dep of d) { | ||
| inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1); | ||
| } | ||
| } | ||
| // Note: inDegree counts how many models *depend on* this model, | ||
| // but for Kahn's we need how many dependencies each model has. | ||
| // Re-do: inDegree = number of unresolved deps for each model. | ||
| const remaining = new Map(); | ||
| for (const [name, d] of deps) { | ||
| remaining.set(name, new Set(d)); | ||
| } | ||
| const queue = []; | ||
| for (const name of localNames) { | ||
| if (remaining.get(name).size === 0) queue.push(name); | ||
| } | ||
| const sorted = []; | ||
| while (queue.length > 0) { | ||
| const name = queue.shift(); | ||
| sorted.push(modelMap.get(name)); | ||
| // Remove this model from all dependents' remaining sets | ||
| for (const [other, rem] of remaining) { | ||
| if (rem.delete(name) && rem.size === 0) { | ||
| queue.push(other); | ||
| } | ||
| } | ||
| } | ||
| // Append any models not yet emitted (cycles) | ||
| for (const model of models) { | ||
| if (!sorted.includes(model)) sorted.push(model); | ||
| } | ||
| return sorted; | ||
| } | ||
| /** | ||
| * Resolve the import path for an external model reference. | ||
| * When a codegen context is available, computes the correct relative path | ||
| * from the current file to the referenced model's output file. | ||
| * Falls back to same-directory PascalCase → dot.case convention. | ||
| */ | ||
| export function resolveImportPath(refName, context) { | ||
| if (context) { | ||
| const refOutPath = context.modelOutPaths.get(refName); | ||
| if (refOutPath) { | ||
| const fromDir = dirname(context.currentOutPath); | ||
| let rel = relative(fromDir, refOutPath); | ||
| // Replace .ts extension with .js for ESM imports | ||
| rel = rel.replace(/\.ts$/, '.js'); | ||
| // Ensure relative path starts with ./ or ../ | ||
| if (!rel.startsWith('.')) rel = './' + rel; | ||
| return rel; | ||
| } | ||
| } | ||
| // Fallback: assume same directory, use PascalCase → dot.case convention | ||
| const moduleName = pascalToDotCase(refName); | ||
| return `./${moduleName}.js`; | ||
| } | ||
| /** Convert PascalCase to dot-separated lowercase: CounterpartyAccount → counterparty.account */ | ||
| export function pascalToDotCase(name) { | ||
| return name.replace(/([a-z0-9])([A-Z])/g, '$1.$2').toLowerCase(); | ||
| } | ||
| //# sourceMappingURL=codegen-dto.js.map |
| {"version":3,"file":"codegen-dto.js","sourceRoot":"","sources":["../src/codegen-dto.ts"],"names":[],"mappings":"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"} |
| import type { DtoRootNode, OpRootNode } from './ast.js'; | ||
| export interface MarkdownCodegenContext { | ||
| dtoRoots: DtoRootNode[]; | ||
| opRoots: OpRootNode[]; | ||
| } | ||
| export declare function generateMarkdown(ctx: MarkdownCodegenContext): string; | ||
| //# sourceMappingURL=codegen-markdown.d.ts.map |
| {"version":3,"file":"codegen-markdown.d.ts","sourceRoot":"","sources":["../src/codegen-markdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,UAAU,EAUb,MAAM,UAAU,CAAC;AAOlB,MAAM,WAAW,sBAAsB;IACnC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,sBAAsB,GAAG,MAAM,CA6GpE"} |
| import { resolveModifiers, resolveSecurity, SECURITY_NONE } from './ast.js'; | ||
| import { renderTsType, collectPublicTypeNames } from './codegen-sdk.js'; | ||
| import { collectTypeRefs } from './codegen-dto.js'; | ||
| export function generateMarkdown(ctx) { | ||
| const { dtoRoots, opRoots } = ctx; | ||
| const modelIndex = buildModelIndex(dtoRoots); | ||
| const lines = []; | ||
| lines.push('# API Reference'); | ||
| lines.push(''); | ||
| // ── Collect grouped data ───────────────────────────────────── | ||
| const endpointGroups = groupEndpoints(opRoots); | ||
| const publicModels = computePubliclyReachableModels(opRoots, dtoRoots); | ||
| const modelGroups = groupModels(dtoRoots, publicModels); | ||
| // ── Table of Contents ──────────────────────────────────────── | ||
| const hasEndpoints = endpointGroups.length > 0; | ||
| const hasModels = modelGroups.length > 0; | ||
| if (hasEndpoints || hasModels) { | ||
| lines.push('## Table of Contents'); | ||
| lines.push(''); | ||
| if (hasEndpoints) { | ||
| lines.push('**Endpoints**'); | ||
| lines.push(''); | ||
| for (const group of endpointGroups) { | ||
| if (group.area) { | ||
| lines.push('<details>'); | ||
| lines.push(`<summary><strong>${titleCase(group.area)}</strong> (${group.endpoints.length})</summary>`); | ||
| lines.push(''); | ||
| } | ||
| for (const ep of group.endpoints) { | ||
| const title = deriveTitle(ep.op, ep.route); | ||
| lines.push(`- [${title}](#${anchor(title)})`); | ||
| } | ||
| if (group.area) { | ||
| lines.push(''); | ||
| lines.push('</details>'); | ||
| } | ||
| lines.push(''); | ||
| } | ||
| } | ||
| if (hasModels) { | ||
| lines.push('**Models**'); | ||
| lines.push(''); | ||
| for (const group of modelGroups) { | ||
| if (group.area) { | ||
| lines.push('<details>'); | ||
| lines.push(`<summary><strong>${titleCase(group.area)}</strong> (${group.models.length})</summary>`); | ||
| lines.push(''); | ||
| } | ||
| for (const model of group.models) { | ||
| lines.push(`- [${model.name}](#${anchor(model.name)})`); | ||
| } | ||
| if (group.area) { | ||
| lines.push(''); | ||
| lines.push('</details>'); | ||
| } | ||
| lines.push(''); | ||
| } | ||
| } | ||
| lines.push('---'); | ||
| lines.push(''); | ||
| } | ||
| // ── Endpoints ────────────────────────────────────────────── | ||
| if (hasEndpoints) { | ||
| lines.push('## Endpoints'); | ||
| lines.push(''); | ||
| for (const group of endpointGroups) { | ||
| if (group.area) { | ||
| lines.push(`### ${titleCase(group.area)}`); | ||
| lines.push(''); | ||
| } | ||
| let first = true; | ||
| for (const ep of group.endpoints) { | ||
| if (!first) { | ||
| lines.push('---'); | ||
| lines.push(''); | ||
| } | ||
| first = false; | ||
| lines.push(...renderEndpoint(ep.route, ep.op, group.area !== undefined, modelIndex)); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| } | ||
| // ── Models ───────────────────────────────────────────────── | ||
| if (hasModels) { | ||
| lines.push('## Models'); | ||
| lines.push(''); | ||
| for (const group of modelGroups) { | ||
| if (group.area) { | ||
| lines.push(`### ${titleCase(group.area)}`); | ||
| lines.push(''); | ||
| } | ||
| for (const model of group.models) { | ||
| lines.push(...renderModel(model, group.area !== undefined)); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| } | ||
| return lines.join('\n'); | ||
| } | ||
| // ─── Model index ────────────────────────────────────────────────────────── | ||
| function buildModelIndex(dtoRoots) { | ||
| const index = new Map(); | ||
| for (const root of dtoRoots) { | ||
| for (const model of root.models) { | ||
| index.set(model.name, model); | ||
| } | ||
| } | ||
| return index; | ||
| } | ||
| /** | ||
| * Resolve a model's fields, following the `base` chain for inheritance. | ||
| * Returns fields in order: base fields first, then own fields. | ||
| */ | ||
| function resolveModelFields(name, modelIndex) { | ||
| const model = modelIndex.get(name); | ||
| if (!model) return undefined; | ||
| if (model.type) return undefined; // type alias, no fields | ||
| const ownFields = model.fields; | ||
| if (!model.base) return ownFields; | ||
| const baseFields = resolveModelFields(model.base, modelIndex); | ||
| if (!baseFields) return ownFields; | ||
| return [...baseFields, ...ownFields]; | ||
| } | ||
| function groupEndpoints(opRoots) { | ||
| const grouped = new Map(); | ||
| const ungrouped = []; | ||
| for (const opRoot of opRoots) { | ||
| const area = opRoot.meta?.area; | ||
| for (const route of opRoot.routes) { | ||
| for (const op of route.operations) { | ||
| const mods = resolveModifiers(route, op); | ||
| if (mods.includes('internal')) continue; | ||
| const entry = { route, op }; | ||
| if (area) { | ||
| const list = grouped.get(area) ?? []; | ||
| list.push(entry); | ||
| grouped.set(area, list); | ||
| } else { | ||
| ungrouped.push(entry); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| const result = []; | ||
| if (ungrouped.length > 0) { | ||
| result.push({ area: undefined, endpoints: ungrouped }); | ||
| } | ||
| for (const [area, endpoints] of grouped) { | ||
| result.push({ area, endpoints }); | ||
| } | ||
| return result; | ||
| } | ||
| /** | ||
| * Returns the set of DTO model names reachable from public (non-internal) operations, | ||
| * transitively through model dependencies. Returns null when there are no .op files, | ||
| * meaning all models should be shown. | ||
| */ | ||
| function computePubliclyReachableModels(opRoots, dtoRoots) { | ||
| if (opRoots.length === 0) return null; | ||
| // Seed with type names directly referenced by public ops | ||
| const reachable = new Set(); | ||
| for (const opRoot of opRoots) { | ||
| for (const name of collectPublicTypeNames(opRoot)) { | ||
| reachable.add(name); | ||
| } | ||
| } | ||
| // Build model → dependency map | ||
| const modelDeps = new Map(); | ||
| for (const dtoRoot of dtoRoots) { | ||
| for (const model of dtoRoot.models) { | ||
| const deps = new Set(); | ||
| if (model.base) deps.add(model.base); | ||
| if (model.type) collectTypeRefs(model.type, deps); | ||
| for (const field of model.fields) collectTypeRefs(field.type, deps); | ||
| modelDeps.set(model.name, deps); | ||
| } | ||
| } | ||
| // BFS expand through dependencies | ||
| const frontier = [...reachable]; | ||
| while (frontier.length > 0) { | ||
| const name = frontier.pop(); | ||
| for (const dep of modelDeps.get(name) ?? []) { | ||
| if (!reachable.has(dep)) { | ||
| reachable.add(dep); | ||
| frontier.push(dep); | ||
| } | ||
| } | ||
| } | ||
| return reachable; | ||
| } | ||
| function groupModels(dtoRoots, publicModels) { | ||
| const grouped = new Map(); | ||
| const ungrouped = []; | ||
| for (const dtoRoot of dtoRoots) { | ||
| const area = dtoRoot.meta?.area; | ||
| for (const model of dtoRoot.models) { | ||
| if (publicModels !== null && !publicModels.has(model.name)) continue; | ||
| if (area) { | ||
| const list = grouped.get(area) ?? []; | ||
| list.push(model); | ||
| grouped.set(area, list); | ||
| } else { | ||
| ungrouped.push(model); | ||
| } | ||
| } | ||
| } | ||
| const result = []; | ||
| if (ungrouped.length > 0) { | ||
| result.push({ area: undefined, models: ungrouped }); | ||
| } | ||
| for (const [area, models] of grouped) { | ||
| result.push({ area, models }); | ||
| } | ||
| return result; | ||
| } | ||
| // ─── Title derivation ───────────────────────────────────────────────────── | ||
| /** | ||
| * Normalize verb to imperative mood. | ||
| * "Creates a new account" → "Create a new account" | ||
| * "Lists all accounts" → "List all accounts" | ||
| * "Gets a ledger account" → "Get a ledger account" | ||
| * "Finalizes a transaction" → "Finalize a transaction" | ||
| * | ||
| * Leaves words ending in 'ss' alone (e.g. "Process"). | ||
| */ | ||
| function normalizeVerbTitle(title) { | ||
| const spaceIdx = title.indexOf(' '); | ||
| if (spaceIdx === -1) return title; | ||
| const firstWord = title.slice(0, spaceIdx); | ||
| const rest = title.slice(spaceIdx); | ||
| // Strip third-person 's' from verbs (but not from words ending in 'ss' like "Process") | ||
| if (firstWord.length > 3 && firstWord.endsWith('s') && !firstWord.endsWith('ss')) { | ||
| return firstWord.slice(0, -1) + rest; | ||
| } | ||
| return title; | ||
| } | ||
| /** | ||
| * Derive a human-readable verb-based title for an endpoint. | ||
| * | ||
| * Priority: | ||
| * 1. op.description (title-cased, normalized to imperative mood) | ||
| * 2. Service method name (e.g. "LedgerService.createAccount" → "Create account") | ||
| * 3. Fallback: method + path segments (e.g. "Get ledger accounts") | ||
| */ | ||
| function deriveTitle(op, route) { | ||
| // 1. Use explicit description | ||
| if (op.description) { | ||
| return normalizeVerbTitle(titleCase(op.description.trim())); | ||
| } | ||
| // 2. Derive from service method name | ||
| if (op.service) { | ||
| const methodPart = op.service.split('.').pop(); | ||
| // camelCase → space-separated, title-cased first word | ||
| const words = methodPart.replace(/([a-z])([A-Z])/g, '$1 $2').toLowerCase(); | ||
| return titleCase(words); | ||
| } | ||
| // 3. Fallback: method + path segments | ||
| const segments = route.path.split('/').filter(s => s.length > 0 && !s.startsWith(':')); | ||
| const pathWords = segments.join(' ').replace(/[.-]/g, ' '); | ||
| const verb = METHOD_VERBS[op.method] ?? op.method.toUpperCase(); | ||
| return `${verb} ${pathWords}`; | ||
| } | ||
| const METHOD_VERBS = { | ||
| get: 'List', | ||
| post: 'Create', | ||
| put: 'Update', | ||
| patch: 'Update', | ||
| delete: 'Delete', | ||
| }; | ||
| // ─── Endpoint rendering ──────────────────────────────────────────────────── | ||
| const STATUS_TEXT = { | ||
| 200: 'OK', | ||
| 201: 'Created', | ||
| 204: 'No Content', | ||
| 400: 'Bad Request', | ||
| 401: 'Unauthorized', | ||
| 403: 'Forbidden', | ||
| 404: 'Not Found', | ||
| 409: 'Conflict', | ||
| 422: 'Unprocessable Entity', | ||
| 500: 'Internal Server Error', | ||
| }; | ||
| function renderEndpoint(route, op, nested, modelIndex) { | ||
| const lines = []; | ||
| const method = op.method.toUpperCase(); | ||
| const path = route.path; | ||
| const title = deriveTitle(op, route); | ||
| const methodName = deriveMethodName(op, route); | ||
| const h = nested ? '####' : '###'; | ||
| const subH = nested ? '#####' : '####'; | ||
| // Title | ||
| lines.push(`${h} ${title}`); | ||
| lines.push(''); | ||
| // Deprecation notice | ||
| const mods = resolveModifiers(route, op); | ||
| if (mods.includes('deprecated')) { | ||
| lines.push('> [!WARNING]'); | ||
| lines.push('> **Deprecated** — this endpoint is deprecated and may be removed in a future version.'); | ||
| lines.push(''); | ||
| } | ||
| // Method badge + path (compact line) | ||
| lines.push(`**\`${method}\`** \`${path}\``); | ||
| lines.push(''); | ||
| // SDK method + security (GitHub admonition) | ||
| lines.push('> [!NOTE]'); | ||
| lines.push(`> SDK method: \`${methodName}\``); | ||
| const effectiveSecurity = resolveSecurity(route, op); | ||
| if (effectiveSecurity === SECURITY_NONE) { | ||
| lines.push('> Security: public'); | ||
| } else if (effectiveSecurity !== undefined) { | ||
| const parts = []; | ||
| if (effectiveSecurity.roles && effectiveSecurity.roles.length > 0) { | ||
| parts.push(`roles: ${effectiveSecurity.roles.join(', ')}`); | ||
| } | ||
| if (op.signature) { | ||
| parts.push(`signature: ${op.signature}`); | ||
| } | ||
| lines.push(`> Security: authenticated${parts.length > 0 ? ` (${parts.join('; ')})` : ''}`); | ||
| } | ||
| lines.push(''); | ||
| // Unified attributes table (path + query + headers merged) | ||
| const attrs = collectAttributes(route, op, modelIndex); | ||
| if (attrs.length > 0) { | ||
| lines.push(`${subH} Attributes`); | ||
| lines.push(''); | ||
| lines.push(...wrapCollapsible(`Attributes (${attrs.length})`, renderAttributesTable(attrs))); | ||
| lines.push(''); | ||
| } | ||
| // Request body | ||
| if (op.request) { | ||
| lines.push(`${subH} Request body (\`${op.request.contentType}\`)`); | ||
| lines.push(''); | ||
| if (op.request.bodyType.kind === 'inlineObject') { | ||
| // Inline objects have no model to reference — expand into field table | ||
| const writableFields = op.request.bodyType.fields.filter(f => f.visibility !== 'readonly'); | ||
| if (writableFields.length > 0) { | ||
| lines.push(...wrapCollapsible(`Attributes (${writableFields.length})`, renderFieldsTable(writableFields, { excludeReadonly: true }))); | ||
| lines.push(''); | ||
| } | ||
| } else { | ||
| // Named / compound type — reference it; the Models section has the full definition | ||
| lines.push(typeProseLink(op.request.bodyType, 'Accepts')); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| // Responses | ||
| if (op.responses.length > 0) { | ||
| lines.push(`${subH} Response`); | ||
| lines.push(''); | ||
| for (const resp of op.responses) { | ||
| const statusText = STATUS_TEXT[resp.statusCode] ?? ''; | ||
| const statusLabel = statusText ? `${resp.statusCode} ${statusText}` : `${resp.statusCode}`; | ||
| if (!resp.bodyType) { | ||
| lines.push(`\`${statusLabel}\``); | ||
| lines.push(''); | ||
| continue; | ||
| } | ||
| if (resp.bodyType.kind === 'inlineObject') { | ||
| // Inline objects — expand into field table | ||
| lines.push(`\`${statusLabel}\``); | ||
| lines.push(''); | ||
| if (resp.bodyType.fields.length > 0) { | ||
| lines.push( | ||
| ...wrapCollapsible( | ||
| `Attributes (${resp.bodyType.fields.length})`, | ||
| renderFieldsTable(resp.bodyType.fields, { excludeReadonly: false }), | ||
| ), | ||
| ); | ||
| lines.push(''); | ||
| } | ||
| } else { | ||
| // Named type — reference it; the Models section has the full definition | ||
| lines.push(`\`${statusLabel}\` — ${typeProseLink(resp.bodyType, 'Returns')}`); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| } | ||
| return lines; | ||
| } | ||
| function collectAttributes(route, op, modelIndex) { | ||
| const attrs = []; | ||
| // Path parameters (always required, listed first) | ||
| if (route.params) { | ||
| const params = flattenParamSource(route.params, modelIndex); | ||
| for (const p of params) { | ||
| attrs.push({ | ||
| name: p.name, | ||
| type: p.type, | ||
| required: true, | ||
| description: p.description ? `${p.description}. Path parameter.` : 'Path parameter.', | ||
| source: 'path', | ||
| }); | ||
| } | ||
| } | ||
| // Query parameters | ||
| if (op.query) { | ||
| const params = flattenParamSource(op.query, modelIndex); | ||
| for (const p of params) { | ||
| attrs.push({ | ||
| name: p.name, | ||
| type: p.type, | ||
| required: !p.optional, | ||
| description: p.description ?? '', | ||
| source: 'query', | ||
| }); | ||
| } | ||
| } | ||
| // Header parameters | ||
| if (op.headers) { | ||
| const params = flattenParamSource(op.headers, modelIndex); | ||
| for (const p of params) { | ||
| attrs.push({ | ||
| name: p.name, | ||
| type: p.type, | ||
| required: !p.optional, | ||
| description: p.description ?? '', | ||
| source: 'header', | ||
| }); | ||
| } | ||
| } | ||
| // Sort: path first, then required, then optional alphabetically | ||
| attrs.sort((a, b) => { | ||
| if (a.source === 'path' && b.source !== 'path') return -1; | ||
| if (a.source !== 'path' && b.source === 'path') return 1; | ||
| if (a.required && !b.required) return -1; | ||
| if (!a.required && b.required) return 1; | ||
| return a.name.localeCompare(b.name); | ||
| }); | ||
| return attrs; | ||
| } | ||
| function renderAttributesTable(attrs) { | ||
| const lines = []; | ||
| lines.push('| Attribute | Type | Required | Description |'); | ||
| lines.push('| --- | --- | --- | --- |'); | ||
| for (const attr of attrs) { | ||
| const type = escapeCell(renderTsType(attr.type)); | ||
| const req = attr.required ? 'Yes' : 'No'; | ||
| lines.push(`| \`${attr.name}\` | \`${type}\` | ${req} | ${escapeCell(attr.description)} |`); | ||
| } | ||
| return lines; | ||
| } | ||
| function renderFieldsTable(fields, opts) { | ||
| const lines = []; | ||
| lines.push('| Attribute | Type | Required | Description |'); | ||
| lines.push('| --- | --- | --- | --- |'); | ||
| for (const f of fields) { | ||
| if (opts.excludeReadonly && f.visibility === 'readonly') continue; | ||
| const type = escapeCell(renderTsType(f.type)); | ||
| const required = f.optional ? 'No' : 'Yes'; | ||
| const modifiers = []; | ||
| if (f.visibility === 'readonly') modifiers.push('read-only'); | ||
| if (f.visibility === 'writeonly') modifiers.push('write-only'); | ||
| if (f.nullable) modifiers.push('nullable'); | ||
| if (f.default !== undefined) modifiers.push(`default: \`${f.default}\``); | ||
| const desc = escapeCell([f.description, ...modifiers.map(m => `*${m}*`)].filter(Boolean).join('. ')); | ||
| lines.push(`| \`${f.name}\` | \`${type}\` | ${required} | ${desc} |`); | ||
| } | ||
| return lines; | ||
| } | ||
| /** | ||
| * Generate prose-style reference text for a body type. | ||
| * E.g. "Accepts a [CreateUser](#createuser) object." | ||
| * "Returns a list of [User](#user) objects." | ||
| */ | ||
| function typeProseLink(type, verb) { | ||
| if (type.kind === 'ref') { | ||
| return `${verb} a [${type.name}](#${anchor(type.name)}) object.`; | ||
| } | ||
| if (type.kind === 'array' && type.item.kind === 'ref') { | ||
| return `${verb} a list of [${type.item.name}](#${anchor(type.item.name)}) objects.`; | ||
| } | ||
| if (type.kind === 'union') { | ||
| const allRefs = type.members.every(m => m.kind === 'ref'); | ||
| if (allRefs && type.members.length > 0) { | ||
| const links = type.members.map(m => (m.kind === 'ref' ? `[${m.name}](#${anchor(m.name)})` : renderTsType(m))); | ||
| return `${verb} a ${links.join(' or ')} object.`; | ||
| } | ||
| } | ||
| return `${verb} \`${escapeCell(renderTsType(type))}\`.`; | ||
| } | ||
| // ─── Model rendering ────────────────────────────────────────────────────── | ||
| function renderModel(model, nested) { | ||
| const lines = []; | ||
| const heading = nested ? '####' : '###'; | ||
| lines.push(`${heading} ${model.name}`); | ||
| lines.push(''); | ||
| if (model.description) { | ||
| lines.push(`> ${model.description}`); | ||
| lines.push(''); | ||
| } | ||
| if (model.base) { | ||
| lines.push(`Extends [\`${model.base}\`](#${anchor(model.base)})`); | ||
| lines.push(''); | ||
| } | ||
| // Type alias (no fields) | ||
| if (model.type) { | ||
| lines.push(`\`\`\`typescript`); | ||
| lines.push(`type ${model.name} = ${renderTsType(model.type)}`); | ||
| lines.push(`\`\`\``); | ||
| return lines; | ||
| } | ||
| if (model.fields.length > 0) { | ||
| const tableLines = []; | ||
| tableLines.push('| Attribute | Type | Required | Description |'); | ||
| tableLines.push('| --- | --- | --- | --- |'); | ||
| for (const field of model.fields) { | ||
| const type = escapeCell(renderTsType(field.type)); | ||
| const required = field.optional ? 'No' : 'Yes'; | ||
| const modifiers = []; | ||
| if (field.visibility === 'readonly') modifiers.push('read-only'); | ||
| if (field.visibility === 'writeonly') modifiers.push('write-only'); | ||
| if (field.nullable) modifiers.push('nullable'); | ||
| if (field.default !== undefined) modifiers.push(`default: \`${field.default}\``); | ||
| const desc = escapeCell([field.description, ...modifiers.map(m => `*${m}*`)].filter(Boolean).join('. ')); | ||
| tableLines.push(`| \`${field.name}\` | \`${type}\` | ${required} | ${desc} |`); | ||
| } | ||
| lines.push(...wrapCollapsible(`Attributes (${model.fields.length})`, tableLines)); | ||
| } | ||
| return lines; | ||
| } | ||
| function flattenParamSource(source, modelIndex) { | ||
| if (Array.isArray(source)) { | ||
| return source.map(p => ({ name: p.name, type: p.type, optional: p.optional })); | ||
| } | ||
| if (typeof source === 'string') { | ||
| // String reference — resolve from model index | ||
| const fields = resolveModelFields(source, modelIndex); | ||
| if (fields) { | ||
| return fields.map(f => ({ | ||
| name: f.name, | ||
| type: f.type, | ||
| optional: f.optional, | ||
| description: f.description, | ||
| })); | ||
| } | ||
| return []; | ||
| } | ||
| if (source.kind === 'inlineObject') { | ||
| return source.fields.map(f => ({ | ||
| name: f.name, | ||
| type: f.type, | ||
| optional: f.optional, | ||
| description: f.description, | ||
| })); | ||
| } | ||
| if (source.kind === 'ref') { | ||
| const fields = resolveModelFields(source.name, modelIndex); | ||
| if (fields) { | ||
| return fields.map(f => ({ | ||
| name: f.name, | ||
| type: f.type, | ||
| optional: f.optional, | ||
| description: f.description, | ||
| })); | ||
| } | ||
| return []; | ||
| } | ||
| if (source.kind === 'intersection') { | ||
| // Flatten all members of the intersection | ||
| const result = []; | ||
| for (const member of source.members) { | ||
| const memberParams = flattenParamSource(member, modelIndex); | ||
| result.push(...memberParams); | ||
| } | ||
| return result; | ||
| } | ||
| return []; | ||
| } | ||
| function renderTypeWithLink(type) { | ||
| if (type.kind === 'ref') { | ||
| return `[${type.name}](#${anchor(type.name)})`; | ||
| } | ||
| if (type.kind === 'array' && type.item.kind === 'ref') { | ||
| return `[${type.item.name}](#${anchor(type.item.name)})[]`; | ||
| } | ||
| return renderTsType(type); | ||
| } | ||
| /** Wrap lines in a collapsible <details> block (collapsed by default). */ | ||
| function wrapCollapsible(summary, tableLines) { | ||
| return ['<details>', `<summary>${summary}</summary>`, '', ...tableLines, '', '</details>']; | ||
| } | ||
| /** Escape pipe characters inside markdown table cells. */ | ||
| function escapeCell(s) { | ||
| return s.replace(/\|/g, '\\|'); | ||
| } | ||
| function anchor(name) { | ||
| return name.toLowerCase().replace(/[^a-z0-9]+/g, '-'); | ||
| } | ||
| function titleCase(s) { | ||
| return s.charAt(0).toUpperCase() + s.slice(1); | ||
| } | ||
| /** Derive SDK method name — mirrors codegen-sdk.ts logic. */ | ||
| function deriveMethodName(op, route) { | ||
| if (op.sdk) return op.sdk; | ||
| const segments = route.path.split('/').filter(s => s.length > 0); | ||
| const parts = [op.method.toLowerCase()]; | ||
| for (const seg of segments) { | ||
| if (seg.startsWith(':')) { | ||
| const paramName = seg.slice(1); | ||
| parts.push('By' + paramName.charAt(0).toUpperCase() + paramName.slice(1)); | ||
| } else { | ||
| const segParts = seg.split(/[.-]/).filter(Boolean); | ||
| for (const sp of segParts) { | ||
| parts.push(sp.charAt(0).toUpperCase() + sp.slice(1)); | ||
| } | ||
| } | ||
| } | ||
| return parts.join(''); | ||
| } | ||
| //# sourceMappingURL=codegen-markdown.js.map |
| {"version":3,"file":"codegen-markdown.js","sourceRoot":"","sources":["../src/codegen-markdown.ts"],"names":[],"mappings":"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"} |
| import type { OpRootNode } from './ast.js'; | ||
| export interface OpCodegenOptions { | ||
| servicePathTemplate?: string; | ||
| typeImportPathTemplate?: string; | ||
| outPath?: string; | ||
| /** Map from model name → absolute output file path (for cross-module type imports) */ | ||
| modelOutPaths?: Map<string, string>; | ||
| /** Set of model names that have Input variants (models with visibility modifiers) */ | ||
| modelsWithInput?: Set<string>; | ||
| } | ||
| export declare function generateOp(root: OpRootNode, options?: OpCodegenOptions): string; | ||
| //# sourceMappingURL=codegen-op.d.ts.map |
| {"version":3,"file":"codegen-op.d.ts","sourceRoot":"","sources":["../src/codegen-op.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAmG,MAAM,UAAU,CAAC;AAO5I,MAAM,WAAW,gBAAgB;IAC7B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,gBAAqB,GAAG,MAAM,CAkEnF"} |
| import { resolveModifiers, resolveSecurity, SECURITY_NONE } from './ast.js'; | ||
| import { renderType, renderInputType, renderQueryType, pascalToDotCase, typeNeedsDateTime, typeNeedsScalar, modeToWrapper } from './codegen-dto.js'; | ||
| import { basename, dirname, relative } from 'path'; | ||
| export function generateOp(root, options = {}) { | ||
| // Collect all referenced types across all routes | ||
| const types = collectTypes(root, options.modelsWithInput); | ||
| const services = collectServices(root); | ||
| const routerName = deriveRouterName(root.file); | ||
| const needsParseAndValidate = routeNeedsValidation(root); | ||
| // Generate the body first so we can detect whether `z.` is actually referenced | ||
| // before deciding whether to emit the zod import. | ||
| const body = []; | ||
| const needsSignature = fileNeedsSignature(root); | ||
| const needsSecurity = fileNeedsSecurity(root); | ||
| const koaImports = ['ServerKitRouter', 'bodyParserMiddleware']; | ||
| if (needsSecurity) koaImports.push('requireSecurity'); | ||
| if (needsSignature) koaImports.push('requireSignature'); | ||
| body.push(`import { ${koaImports.join(', ')} } from '@maroonedsoftware/koa';`); | ||
| for (const svc of services) { | ||
| const modulePath = root.meta[svc] ?? deriveModulePath(svc, options.servicePathTemplate); | ||
| body.push(`import { ${svc} } from '${modulePath}';`); | ||
| } | ||
| if (types.length > 0) { | ||
| body.push(...generateTypeImports(types, root.file, options)); | ||
| } | ||
| if (opNeedsDateTime(root)) { | ||
| body.push(`import { DateTime } from 'luxon';`); | ||
| } | ||
| if (needsParseAndValidate) { | ||
| body.push(`import { parseAndValidate } from '#src/shared/validator.js';`); | ||
| } | ||
| const helpers = []; | ||
| if (opNeedsScalar(root, 'binary')) { | ||
| helpers.push(`const _ZodBinary = z.custom<Buffer>((val) => Buffer.isBuffer(val), { error: 'Must be binary data' });`); | ||
| } | ||
| if (opNeedsScalar(root, 'datetime')) { | ||
| helpers.push( | ||
| `const _ZodDatetime = z.preprocess((val) => typeof val === 'string' ? DateTime.fromISO(val) : val, z.custom<DateTime>((val) => val instanceof DateTime && val.isValid, { message: 'Must be in ISO 8601 format' }));`, | ||
| ); | ||
| } | ||
| if (opNeedsScalar(root, 'json')) { | ||
| helpers.push(`type _JsonValue = string | number | boolean | null | _JsonValue[] | { [key: string]: _JsonValue };`); | ||
| helpers.push( | ||
| `const _ZodJson: z.ZodType<_JsonValue> = z.lazy(() => z.union([z.string(), z.number(), z.boolean(), z.null(), z.array(_ZodJson), z.record(z.string(), _ZodJson)]));`, | ||
| ); | ||
| } | ||
| const lines = []; | ||
| lines.push(''); | ||
| lines.push('/**'); | ||
| const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file; | ||
| lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`); | ||
| lines.push('*/'); | ||
| lines.push(`export const ${routerName} = ServerKitRouter();`); | ||
| lines.push(''); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| lines.push(...generateHandler(route, op, root, options)); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| const allContent = [...body, ...(helpers.length ? ['', ...helpers] : []), ...lines].join('\n'); | ||
| const needsZod = /\bz\./.test(allContent); | ||
| return (needsZod ? `import { z } from 'zod';\n` : '') + allContent; | ||
| } | ||
| // ─── Handler generation ──────────────────────────────────────────────────── | ||
| function generateHandler(route, op, root, options) { | ||
| const lines = []; | ||
| const file = root.file; | ||
| const outPath = options.outPath; | ||
| const modelsWithInput = options.modelsWithInput; | ||
| lines.push('/**'); | ||
| // JSDoc from description | ||
| const desc = op.description ?? route.description; | ||
| if (desc) { | ||
| lines.push(` * ${desc}`); | ||
| } | ||
| // Source location comment | ||
| const relFile = outPath ? relative(dirname(outPath), file) : file; | ||
| lines.push(` * from [${basename(file)}](file://./${relFile}#L${op.loc.line})`); | ||
| // Security annotation (operation-level wins; falls back to route → file level) | ||
| const effectiveSecurity = resolveSecurity(route, op, root); | ||
| if (effectiveSecurity === SECURITY_NONE) { | ||
| lines.push(` * anonymous access, no security required`); | ||
| } | ||
| // Modifier annotations | ||
| const mods = resolveModifiers(route, op); | ||
| if (mods.includes('internal')) lines.push(` * @internal`); | ||
| if (mods.includes('deprecated')) lines.push(` * @deprecated`); | ||
| lines.push('*/'); | ||
| const method = op.method; | ||
| const path = route.path; | ||
| const hasBody = !!op.request; | ||
| const isMultipart = op.request?.contentType === 'multipart/form-data'; | ||
| // Middleware list | ||
| const middlewares = []; | ||
| if (effectiveSecurity !== SECURITY_NONE) { | ||
| const roles = effectiveSecurity && effectiveSecurity.roles?.length ? `roles: [${effectiveSecurity.roles.map(r => `'${r}'`).join(', ')}]` : ''; | ||
| middlewares.push(`requireSecurity({ ${roles} })`); | ||
| } | ||
| if (hasBody) { | ||
| middlewares.push(isMultipart ? `bodyParserMiddleware(['multipart'])` : `bodyParserMiddleware(['json'])`); | ||
| } | ||
| if (op.signature) { | ||
| middlewares.push(`requireSignature('${op.signature}')`); | ||
| } | ||
| const middlewareStr = middlewares.length > 0 ? `, ${middlewares.join(', ')},` : ','; | ||
| lines.push(`${deriveRouterName(file)}.${method}('${path}'${middlewareStr} async (ctx, next) => {`); | ||
| // Params / query / headers validation (request-side — use Input variants) | ||
| lines.push(...generateParamValidation(route.params, 'ctx.params', 'params', route.paramsMode ?? 'strict', '', modelsWithInput)); | ||
| lines.push(...generateParamValidation(op.query, 'ctx.query', 'query', op.queryMode ?? 'strict', '', modelsWithInput)); | ||
| lines.push(...generateParamValidation(op.headers, 'ctx.headers', 'headers', op.headersMode ?? 'strip', '', modelsWithInput)); | ||
| // Body validation (request-side — use Input variants) | ||
| if (hasBody && op.request) { | ||
| if (isMultipart) { | ||
| lines.push(` const multipartBody = ctx.body as MultipartBody;`); | ||
| lines.push(''); | ||
| } else { | ||
| lines.push(` const body = await parseAndValidate(ctx.body, ${renderInputType(op.request.bodyType, modelsWithInput)});`); | ||
| lines.push(''); | ||
| } | ||
| } | ||
| // Service call — use the first response with a body as the primary response | ||
| const primaryResponse = op.responses.find(r => r.bodyType) ?? op.responses[0]; | ||
| const serviceParts = inferService(op, route, file); | ||
| if (primaryResponse?.bodyType) { | ||
| const { annotation, prelude } = formatTypeAnnotation(primaryResponse.bodyType); | ||
| if (prelude) { | ||
| lines.push(` ${prelude}`); | ||
| } | ||
| lines.push(` const service = ctx.container.get(${serviceParts.className});`); | ||
| lines.push(` const result: ${annotation} = await service.${serviceParts.methodName}(${buildArgs(route, op)});`); | ||
| } else { | ||
| lines.push(` const service = ctx.container.get(${serviceParts.className});`); | ||
| lines.push(` await service.${serviceParts.methodName}(${buildArgs(route, op)});`); | ||
| } | ||
| lines.push(''); | ||
| lines.push(` ctx.status = ${primaryResponse?.statusCode ?? 200};`); | ||
| if (primaryResponse?.bodyType && primaryResponse.contentType) { | ||
| lines.push(` ctx.type = 'application/json';`); | ||
| lines.push(` ctx.body = result;`); | ||
| } | ||
| lines.push(''); | ||
| lines.push(` await next();`); | ||
| lines.push(`});`); | ||
| return lines; | ||
| } | ||
| // ─── Inference helpers ───────────────────────────────────────────────────── | ||
| function inferService(op, route, file) { | ||
| // If explicitly declared: service: ServiceClass.methodName | ||
| if (op.service) { | ||
| const [cls = '', method] = op.service.split('.'); | ||
| return { className: cls, methodName: method ?? 'handle' }; | ||
| } | ||
| // Infer from file name + method + path | ||
| const baseName = deriveBaseName(file); // e.g. "ledger.categories" -> "LedgerCategories" | ||
| const className = `${baseName}Service`; | ||
| const methodName = inferMethodName(op.method, route.path); | ||
| return { className, methodName }; | ||
| } | ||
| function inferMethodName(method, path) { | ||
| const hasParam = path.includes(':'); | ||
| switch (method) { | ||
| case 'get': | ||
| return hasParam ? 'getById' : 'list'; | ||
| case 'post': | ||
| return 'create'; | ||
| case 'put': | ||
| return 'replace'; | ||
| case 'patch': | ||
| return 'update'; | ||
| case 'delete': | ||
| return 'delete'; | ||
| default: | ||
| return 'handle'; | ||
| } | ||
| } | ||
| function buildArgs(route, op) { | ||
| const args = []; | ||
| // Path params: spread individually (inline) or pass 'params' object (type-ref/DtoTypeNode) | ||
| if (route.params) { | ||
| if (Array.isArray(route.params)) { | ||
| args.push(...route.params.map(p => p.name)); | ||
| } else { | ||
| args.push('params'); | ||
| } | ||
| } | ||
| // Body | ||
| if (op.request) { | ||
| args.push(op.request.contentType === 'multipart/form-data' ? 'multipartBody' : 'body'); | ||
| } | ||
| // Query | ||
| if (op.query) args.push('query'); | ||
| // Headers | ||
| if (op.headers) args.push('headers'); | ||
| return args.join(', '); | ||
| } | ||
| function formatTypeAnnotation(bodyType) { | ||
| if (bodyType.kind === 'array') { | ||
| const inner = formatTypeAnnotation(bodyType.item); | ||
| return { annotation: `${inner.annotation}[]`, prelude: inner.prelude }; | ||
| } | ||
| if (bodyType.kind === 'ref') return { annotation: bodyType.name }; | ||
| if (bodyType.kind === 'scalar') return { annotation: bodyType.name }; | ||
| // For complex types, extract schema into a variable so the result line stays readable | ||
| const schema = renderType(bodyType); | ||
| return { | ||
| annotation: 'z.infer<typeof resultType>', | ||
| prelude: `const resultType = ${schema};`, | ||
| }; | ||
| } | ||
| function generateParamValidation(source, ctxExpr, varName, mode, suffix = '', modelsWithInput) { | ||
| if (!source) return []; | ||
| const lines = []; | ||
| const isQuery = ctxExpr === 'ctx.query'; | ||
| if (typeof source === 'string') { | ||
| // Type reference — apply mode as a method call on the schema | ||
| const typeName = modelsWithInput?.has(source) ? `${source}Input` : source; | ||
| lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, ${typeName}.${mode}());`); | ||
| lines.push(''); | ||
| } else if (Array.isArray(source)) { | ||
| // Inline param declarations — wrap with the appropriate z.*Object constructor | ||
| if (source.length > 0) { | ||
| // Destructure only for params (spread individually in service call); | ||
| // query/headers are passed as whole objects. | ||
| const lhs = varName === 'params' ? `{ ${source.map(p => p.name).join(', ')} }` : varName; | ||
| lines.push(` const ${lhs} = await parseAndValidate(`); | ||
| lines.push(` ${ctxExpr},`); | ||
| lines.push(` ${modeToWrapper(mode)}({`); | ||
| for (const param of source) { | ||
| const key = isValidIdentifier(param.name) ? param.name : `'${param.name}'`; | ||
| if (isQuery && param.type.kind === 'array') { | ||
| const inner = renderType(param.type); | ||
| lines.push(` ${key}: z.preprocess((v) => typeof v === 'string' ? v.split(',') : v, ${inner}),`); | ||
| } else { | ||
| lines.push(` ${key}: ${renderType(param.type)},`); | ||
| } | ||
| } | ||
| lines.push(` })${suffix},`); | ||
| lines.push(` );`); | ||
| lines.push(''); | ||
| } | ||
| } else { | ||
| // DtoTypeNode — use query-aware rendering for query params (coerces single string → array), | ||
| // otherwise use Input variant rendering; apply mode as a method call | ||
| const schema = isQuery ? renderQueryType(source, modelsWithInput) : renderInputType(source, modelsWithInput); | ||
| lines.push(` const ${varName} = await parseAndValidate(${ctxExpr}, (${schema}).${mode}());`); | ||
| lines.push(''); | ||
| } | ||
| return lines; | ||
| } | ||
| // ─── Type import resolution ──────────────────────────────────────────────── | ||
| /** | ||
| * Generate per-file type import statements. | ||
| * When modelOutPaths is available, groups types by their actual output file | ||
| * and computes correct relative paths. Falls back to the template-based | ||
| * single-import approach for types not found in the map. | ||
| */ | ||
| function generateTypeImports(types, opFile, options) { | ||
| const lines = []; | ||
| const { modelOutPaths, outPath } = options; | ||
| if (modelOutPaths && outPath) { | ||
| // Group types by their output file | ||
| const byFile = new Map(); | ||
| const unresolved = []; | ||
| for (const type of types) { | ||
| const typeOutPath = modelOutPaths.get(type); | ||
| if (typeOutPath) { | ||
| const group = byFile.get(typeOutPath) ?? []; | ||
| group.push(type); | ||
| byFile.set(typeOutPath, group); | ||
| } else { | ||
| unresolved.push(type); | ||
| } | ||
| } | ||
| // Emit one import per source file with a relative path | ||
| const fromDir = dirname(outPath); | ||
| for (const [typeOutPath, names] of byFile) { | ||
| let rel = relative(fromDir, typeOutPath); | ||
| rel = rel.replace(/\.ts$/, '.js'); | ||
| if (!rel.startsWith('.')) rel = './' + rel; | ||
| lines.push(`import { ${names.sort().join(', ')} } from '${rel}';`); | ||
| } | ||
| // Fallback for types not in the map | ||
| for (const type of unresolved) { | ||
| const moduleName = pascalToDotCase(type); | ||
| lines.push(`import { ${type} } from './${moduleName}.js';`); | ||
| } | ||
| } else { | ||
| // No resolution context — fall back to template-based single import | ||
| const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate); | ||
| lines.push(`import { ${types.join(', ')} } from '${typeImport}';`); | ||
| } | ||
| return lines; | ||
| } | ||
| // ─── Collection helpers ──────────────────────────────────────────────────── | ||
| function collectTypes(root, modelsWithInput) { | ||
| const types = new Set(); | ||
| for (const route of root.routes) { | ||
| collectParamSourceRefs(route.params, types); | ||
| collectParamSourceInputRefs(route.params, types, modelsWithInput); | ||
| for (const op of route.operations) { | ||
| if (op.request?.bodyType) { | ||
| collectTypeNodeRefs(op.request.bodyType, types); | ||
| collectInputTypeNodeRefs(op.request.bodyType, types, modelsWithInput); | ||
| } | ||
| for (const resp of op.responses) { | ||
| if (resp.bodyType) collectTypeNodeRefs(resp.bodyType, types); | ||
| } | ||
| collectParamSourceRefs(op.query, types); | ||
| collectParamSourceInputRefs(op.query, types, modelsWithInput); | ||
| collectParamSourceRefs(op.headers, types); | ||
| collectParamSourceInputRefs(op.headers, types, modelsWithInput); | ||
| } | ||
| } | ||
| return [...types].sort(); | ||
| } | ||
| function collectParamSourceRefs(source, out) { | ||
| if (!source) return; | ||
| if (typeof source === 'string') { | ||
| if (/^[A-Z]/.test(source)) out.add(source); | ||
| } else if (Array.isArray(source)) { | ||
| for (const param of source) { | ||
| collectTypeNodeRefs(param.type, out); | ||
| } | ||
| } else { | ||
| collectTypeNodeRefs(source, out); | ||
| } | ||
| } | ||
| /** Collect Input variant refs for request-side ParamSource types. */ | ||
| function collectParamSourceInputRefs(source, out, modelsWithInput) { | ||
| if (!source || !modelsWithInput) return; | ||
| if (typeof source === 'string') { | ||
| if (modelsWithInput.has(source)) out.add(`${source}Input`); | ||
| } else if (!Array.isArray(source)) { | ||
| collectInputTypeNodeRefs(source, out, modelsWithInput); | ||
| } | ||
| } | ||
| /** Collect Input variant refs for request-side DtoTypeNode types. */ | ||
| function collectInputTypeNodeRefs(type, out, modelsWithInput) { | ||
| if (!modelsWithInput) return; | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`); | ||
| break; | ||
| case 'array': | ||
| collectInputTypeNodeRefs(type.item, out, modelsWithInput); | ||
| break; | ||
| } | ||
| } | ||
| function collectTypeNodeRefs(type, out) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (/^[A-Z]/.test(type.name)) out.add(type.name); | ||
| break; | ||
| case 'array': | ||
| collectTypeNodeRefs(type.item, out); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'record': | ||
| collectTypeNodeRefs(type.key, out); | ||
| collectTypeNodeRefs(type.value, out); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'lazy': | ||
| collectTypeNodeRefs(type.inner, out); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectTypeNodeRefs(f.type, out)); | ||
| break; | ||
| } | ||
| } | ||
| function paramSourceNeedsDateTime(source) { | ||
| if (!source) return false; | ||
| if (typeof source === 'string') return false; | ||
| if (Array.isArray(source)) return source.some(p => typeNeedsDateTime(p.type)); | ||
| return typeNeedsDateTime(source); | ||
| } | ||
| function opNeedsDateTime(root) { | ||
| return root.routes.some( | ||
| route => | ||
| paramSourceNeedsDateTime(route.params) || | ||
| route.operations.some( | ||
| op => | ||
| (op.request?.bodyType && typeNeedsDateTime(op.request.bodyType)) || | ||
| op.responses.some(r => r.bodyType && typeNeedsDateTime(r.bodyType)) || | ||
| paramSourceNeedsDateTime(op.query) || | ||
| paramSourceNeedsDateTime(op.headers), | ||
| ), | ||
| ); | ||
| } | ||
| function paramSourceNeedsScalar(source, name) { | ||
| if (!source) return false; | ||
| if (typeof source === 'string') return false; | ||
| if (Array.isArray(source)) return source.some(p => typeNeedsScalar(p.type, name)); | ||
| return typeNeedsScalar(source, name); | ||
| } | ||
| function opNeedsScalar(root, name) { | ||
| return root.routes.some( | ||
| route => | ||
| paramSourceNeedsScalar(route.params, name) || | ||
| route.operations.some( | ||
| op => | ||
| (op.request?.bodyType && typeNeedsScalar(op.request.bodyType, name)) || | ||
| op.responses.some(r => r.bodyType && typeNeedsScalar(r.bodyType, name)) || | ||
| paramSourceNeedsScalar(op.query, name) || | ||
| paramSourceNeedsScalar(op.headers, name), | ||
| ), | ||
| ); | ||
| } | ||
| function collectServices(root) { | ||
| const services = new Set(); | ||
| const inferredService = `${deriveBaseName(root.file)}Service`; | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| if (op.service) { | ||
| services.add(op.service.split('.')[0] ?? op.service); | ||
| } else { | ||
| services.add(inferredService); | ||
| } | ||
| } | ||
| } | ||
| return [...services].sort(); | ||
| } | ||
| function hasParamSource(source) { | ||
| if (!source) return false; | ||
| if (typeof source === 'string') return true; | ||
| if (Array.isArray(source)) return source.length > 0; | ||
| return true; // DtoTypeNode | ||
| } | ||
| function routeNeedsValidation(root) { | ||
| return root.routes.some( | ||
| r => hasParamSource(r.params) || r.operations.some(op => !!op.request || hasParamSource(op.query) || hasParamSource(op.headers)), | ||
| ); | ||
| } | ||
| function fileNeedsSecurity(root) { | ||
| return root.routes.some(route => route.operations.some(op => resolveSecurity(route, op, root) !== SECURITY_NONE)); | ||
| } | ||
| function fileNeedsSignature(root) { | ||
| return root.routes.some(route => route.operations.some(op => !!op.signature)); | ||
| } | ||
| function isValidIdentifier(name) { | ||
| return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name); | ||
| } | ||
| // ─── Naming conventions ──────────────────────────────────────────────────── | ||
| function deriveBaseName(file) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'Resource'; | ||
| // ledger.categories -> LedgerCategories | ||
| return base | ||
| .split('.') | ||
| .map(s => s.charAt(0).toUpperCase() + s.slice(1)) | ||
| .join(''); | ||
| } | ||
| function deriveRouterName(file) { | ||
| return `${deriveBaseName(file)}Router`; | ||
| } | ||
| function deriveRouterFilename(file) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'resource'; | ||
| return `${base}.router`; | ||
| } | ||
| function deriveModulePath(serviceName, template) { | ||
| // LedgerService -> #modules/ledger/ledger.service.js | ||
| const base = serviceName.replace(/Service$/, ''); | ||
| const kebab = base.replace(/([A-Z])/g, m => `-${m.toLowerCase()}`).replace(/^-/, ''); | ||
| if (template) { | ||
| return template.replace(/\{name\}/g, base).replace(/\{kebab\}/g, kebab); | ||
| } | ||
| return `#modules/${kebab}/${kebab}.service.js`; | ||
| } | ||
| function deriveTypeImportPath(file, template) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'resource'; | ||
| const module = base.split('.')[0] ?? base; | ||
| if (template) { | ||
| return template.replace(/\{module\}/g, module).replace(/\{base\}/g, base); | ||
| } | ||
| return `#modules/${module}/types/index.js`; | ||
| } | ||
| //# sourceMappingURL=codegen-op.js.map |
| {"version":3,"file":"codegen-op.js","sourceRoot":"","sources":["../src/codegen-op.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACpJ,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAcnD,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,UAA4B,EAAE;IACvE,iDAAiD;IACjD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/C,MAAM,qBAAqB,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;IAEzD,+EAA+E;IAC/E,kDAAkD;IAClD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,MAAM,cAAc,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,aAAa,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,CAAC,iBAAiB,EAAE,sBAAsB,CAAC,CAAC;IAC/D,IAAI,aAAa;QAAE,UAAU,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACtD,IAAI,cAAc;QAAE,UAAU,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAE/E,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,gBAAgB,CAAC,GAAG,EAAE,OAAO,CAAC,mBAAmB,CAAC,CAAC;QACxF,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,YAAY,UAAU,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACjE,CAAC;IAED,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,qBAAqB,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,aAAa,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,CAAC;QAChC,OAAO,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;IAC1H,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC;QAClC,OAAO,CAAC,IAAI,CAAC,oNAAoN,CAAC,CAAC;IACvO,CAAC;IACD,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,oGAAoG,CAAC,CAAC;QACnH,OAAO,CAAC,IAAI,CAAC,oKAAoK,CAAC,CAAC;IACvL,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,OAAO,GAAG,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,uBAAuB,CAAC,CAAC;IAC9D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC;AACvE,CAAC;AAED,8EAA8E;AAE9E,SAAS,eAAe,CAAC,KAAkB,EAAE,EAAmB,EAAE,IAAgB,EAAE,OAAyB;IACzG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;IACvB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IAChC,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAEhD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElB,yBAAyB;IACzB,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;IAC7B,CAAC;IACD,0BAA0B;IAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,KAAK,CAAC,IAAI,CAAC,YAAY,QAAQ,CAAC,IAAI,CAAC,cAAc,OAAO,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC;IAE/E,+EAA+E;IAC/E,MAAM,iBAAiB,GAAG,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,iBAAiB,KAAK,aAAa,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;IAC5D,CAAC;IAED,uBAAuB;IACvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC1D,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAE9D,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEjB,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC;IACzB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,qBAAqB,CAAC;IAEtE,kBAAkB;IAClB,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,IAAI,iBAAiB,KAAK,aAAa,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,iBAAiB,IAAI,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9I,WAAW,CAAC,IAAI,CAAC,qBAAqB,KAAK,KAAK,CAAC,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,EAAE,CAAC;QACV,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,qCAAqC,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;QACf,WAAW,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,SAAS,IAAI,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,aAAa,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAEpF,KAAK,CAAC,IAAI,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,MAAM,KAAK,IAAI,IAAI,aAAa,yBAAyB,CAAC,CAAC;IAEnG,0EAA0E;IAC1E,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,IAAI,QAAQ,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAChI,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC,SAAS,IAAI,QAAQ,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IACtH,KAAK,CAAC,IAAI,CAAC,GAAG,uBAAuB,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,EAAE,CAAC,WAAW,IAAI,OAAO,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAE7H,sDAAsD;IACtD,IAAI,OAAO,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACxB,IAAI,WAAW,EAAE,CAAC;YACd,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;YACnE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,IAAI,CAAC,qDAAqD,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;YAC3H,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;IAED,4EAA4E;IAC5E,MAAM,eAAe,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,YAAY,GAAG,YAAY,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEnD,IAAI,eAAe,EAAE,QAAQ,EAAE,CAAC;QAC5B,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,oBAAoB,CAAC,eAAe,CAAC,QAAS,CAAC,CAAC;QAChF,IAAI,OAAO,EAAE,CAAC;YACV,KAAK,CAAC,IAAI,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,yCAAyC,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,qBAAqB,UAAU,oBAAoB,YAAY,CAAC,UAAU,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACvH,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,yCAAyC,YAAY,CAAC,SAAS,IAAI,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,qBAAqB,YAAY,CAAC,UAAU,IAAI,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,eAAe,EAAE,UAAU,IAAI,GAAG,GAAG,CAAC,CAAC;IAEtE,IAAI,eAAe,EAAE,QAAQ,IAAI,eAAe,CAAC,WAAW,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAChC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAElB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,8EAA8E;AAE9E,SAAS,YAAY,CAAC,EAAmB,EAAE,KAAkB,EAAE,IAAY;IACvE,2DAA2D;IAC3D,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,CAAC,GAAG,GAAG,EAAE,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjD,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC;IAC9D,CAAC;IAED,uCAAuC;IACvC,MAAM,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,iDAAiD;IACxF,MAAM,SAAS,GAAG,GAAG,QAAQ,SAAS,CAAC;IACvC,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1D,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,IAAY;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,QAAQ,MAAM,EAAE,CAAC;QACb,KAAK,KAAK;YACN,OAAO,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC;QACzC,KAAK,MAAM;YACP,OAAO,QAAQ,CAAC;QACpB,KAAK,KAAK;YACN,OAAO,SAAS,CAAC;QACrB,KAAK,OAAO;YACR,OAAO,QAAQ,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC;QACpB;YACI,OAAO,QAAQ,CAAC;IACxB,CAAC;AACL,CAAC;AAED,SAAS,SAAS,CAAC,KAAkB,EAAE,EAAmB;IACtD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,2FAA2F;IAC3F,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACJ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;IACL,CAAC;IACD,OAAO;IACP,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,qBAAqB,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3F,CAAC;IACD,QAAQ;IACR,IAAI,EAAE,CAAC,KAAK;QAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,UAAU;IACV,IAAI,EAAE,CAAC,OAAO;QAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACrC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,oBAAoB,CAAC,QAAqB;IAC/C,IAAI,QAAQ,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,oBAAoB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClD,OAAO,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,UAAU,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;IAC3E,CAAC;IACD,IAAI,QAAQ,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IAClE,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,IAAI,EAAE,CAAC;IACrE,sFAAsF;IACtF,MAAM,MAAM,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IACpC,OAAO;QACH,UAAU,EAAE,4BAA4B;QACxC,OAAO,EAAE,sBAAsB,MAAM,GAAG;KAC3C,CAAC;AACN,CAAC;AAED,SAAS,uBAAuB,CAC5B,MAA+B,EAC/B,OAAe,EACf,OAAe,EACf,IAAgB,EAChB,MAAM,GAAG,EAAE,EACX,eAA6B;IAE7B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACvB,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,OAAO,KAAK,WAAW,CAAC;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,6DAA6D;QAC7D,MAAM,QAAQ,GAAG,eAAe,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1E,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,6BAA6B,OAAO,KAAK,QAAQ,IAAI,IAAI,MAAM,CAAC,CAAC;QAChG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,8EAA8E;QAC9E,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,qEAAqE;YACrE,6CAA6C;YAC7C,MAAM,GAAG,GAAG,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;YACzF,KAAK,CAAC,IAAI,CAAC,aAAa,GAAG,4BAA4B,CAAC,CAAC;YACzD,KAAK,CAAC,IAAI,CAAC,WAAW,OAAO,GAAG,CAAC,CAAC;YAClC,KAAK,CAAC,IAAI,CAAC,WAAW,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBACzB,MAAM,GAAG,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC;gBAC3E,IAAI,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACzC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;oBACrC,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,mEAAmE,KAAK,IAAI,CAAC,CAAC;gBAC/G,CAAC;qBAAM,CAAC;oBACJ,KAAK,CAAC,IAAI,CAAC,eAAe,GAAG,KAAK,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACjE,CAAC;YACL,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,aAAa,MAAM,GAAG,CAAC,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,4FAA4F;QAC5F,qEAAqE;QACrE,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;QAC7G,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,6BAA6B,OAAO,MAAM,MAAM,KAAK,IAAI,MAAM,CAAC,CAAC;QAChG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,8EAA8E;AAE9E;;;;;GAKG;AACH,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,OAAyB;IACnF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,aAAa,IAAI,OAAO,EAAE,CAAC;QAC3B,mCAAmC;QACnC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,uDAAuD;QACvD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QACvE,CAAC;QAED,oCAAoC;QACpC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,cAAc,UAAU,OAAO,CAAC,CAAC;QAChE,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,oEAAoE;QACpE,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,8EAA8E;AAE9E,SAAS,YAAY,CAAC,IAAgB,EAAE,eAA6B;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAClE,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACvB,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAChD,wBAAwB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,QAAQ;oBAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAC9D,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,2BAA2B,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA+B,EAAE,GAAgB;IAC7E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAS,2BAA2B,CAAC,MAA+B,EAAE,GAAgB,EAAE,eAA6B;IACjH,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe;QAAE,OAAO;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAChC,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAC3D,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAS,wBAAwB,CAAC,IAAiB,EAAE,GAAgB,EAAE,eAA6B;IAChG,IAAI,CAAC,eAAe;QAAE,OAAO;IAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YACjE,MAAM;QACV,KAAK,OAAO;YACR,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;YAC1D,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,GAAgB;IAC5D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM;QACV,KAAK,OAAO;YACR,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM;QACV,KAAK,QAAQ;YACT,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,MAAM;YACP,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,wBAAwB,CAAC,MAA+B;IAC7D,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9E,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACrC,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB;IACrC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,KAAK,CAAC,EAAE,CACJ,wBAAwB,CAAC,KAAK,CAAC,MAAM,CAAC;QACtC,KAAK,CAAC,UAAU,CAAC,IAAI,CACjB,EAAE,CAAC,EAAE,CACD,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAChE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,iBAAiB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;YACnE,wBAAwB,CAAC,EAAE,CAAC,KAAK,CAAC;YAClC,wBAAwB,CAAC,EAAE,CAAC,OAAO,CAAC,CAC3C,CACR,CAAC;AACN,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA+B,EAAE,IAAY;IACzE,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAClF,OAAO,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACzC,CAAC;AAED,SAAS,aAAa,CAAC,IAAgB,EAAE,IAAY;IACjD,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,KAAK,CAAC,EAAE,CACJ,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC;QAC1C,KAAK,CAAC,UAAU,CAAC,IAAI,CACjB,EAAE,CAAC,EAAE,CACD,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACpE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YACvE,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC;YACtC,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,CAC/C,CACR,CAAC;AACN,CAAC;AAED,SAAS,eAAe,CAAC,IAAgB;IACrC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;IACnC,MAAM,eAAe,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;IAE9D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;YACzD,CAAC;iBAAM,CAAC;gBACJ,QAAQ,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;YAClC,CAAC;QACL,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;AAChC,CAAC;AAED,SAAS,cAAc,CAAC,MAAoB;IACxC,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC5C,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACpD,OAAO,IAAI,CAAC,CAAC,cAAc;AAC/B,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAgB;IAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CACnB,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,IAAI,cAAc,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CACnI,CAAC;AACN,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAgB;IACvC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,aAAa,CAAC,CAAC,CAAC;AACtH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAgB;IACxC,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACnD,CAAC;AAED,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,wCAAwC;IACxC,OAAO,IAAI;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAY;IAClC,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,OAAO,GAAG,IAAI,SAAS,CAAC;AAC5B,CAAC;AAED,SAAS,gBAAgB,CAAC,WAAmB,EAAE,QAAiB;IAC5D,qDAAqD;IACrD,MAAM,IAAI,GAAG,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACrF,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IAC5E,CAAC;IACD,OAAO,YAAY,KAAK,IAAI,KAAK,aAAa,CAAC;AACnD,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAiB;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC/C,CAAC"} |
| import type { DtoRootNode, OpRootNode } from './ast.js'; | ||
| import type { OpenApiConfig, OpenApiSecurityScheme } from './config.js'; | ||
| export interface OpenApiCodegenContext { | ||
| dtoRoots: DtoRootNode[]; | ||
| opRoots: OpRootNode[]; | ||
| config: OpenApiConfig; | ||
| /** Named OpenAPI security scheme definitions to include in components.securitySchemes */ | ||
| securitySchemes?: Record<string, OpenApiSecurityScheme>; | ||
| } | ||
| export declare function generateOpenApi(ctx: OpenApiCodegenContext): string; | ||
| /** | ||
| * Minimal YAML serializer sufficient for OpenAPI documents. | ||
| * Avoids external dependency while producing clean, readable output. | ||
| */ | ||
| export declare function toYaml(value: unknown, indent?: number): string; | ||
| //# sourceMappingURL=codegen-openapi.d.ts.map |
| {"version":3,"file":"codegen-openapi.d.ts","sourceRoot":"","sources":["../src/codegen-openapi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EACX,UAAU,EAQb,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AA+ExE,MAAM,WAAW,qBAAqB;IAClC,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,MAAM,EAAE,aAAa,CAAC;IACtB,yFAAyF;IACzF,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;CAC3D;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,qBAAqB,GAAG,MAAM,CA8ElE;AA+VD;;;GAGG;AACH,wBAAgB,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,SAAI,GAAG,MAAM,CAmEzD"} |
| import { resolveModifiers, resolveSecurity, SECURITY_NONE } from './ast.js'; | ||
| // ─── Type reachability ──────────────────────────────────────────────────── | ||
| function collectRefsFromType(type, out) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| out.add(type.name); | ||
| break; | ||
| case 'array': | ||
| collectRefsFromType(type.item, out); | ||
| break; | ||
| case 'tuple': | ||
| for (const item of type.items) collectRefsFromType(item, out); | ||
| break; | ||
| case 'record': | ||
| collectRefsFromType(type.value, out); | ||
| break; | ||
| case 'union': | ||
| case 'intersection': | ||
| for (const member of type.members) collectRefsFromType(member, out); | ||
| break; | ||
| case 'lazy': | ||
| collectRefsFromType(type.inner, out); | ||
| break; | ||
| case 'inlineObject': | ||
| for (const field of type.fields) collectRefsFromType(field.type, out); | ||
| break; | ||
| } | ||
| } | ||
| function collectParamSourceRefs(source, out) { | ||
| if (!source) return; | ||
| if (typeof source === 'string') { | ||
| out.add(source); | ||
| return; | ||
| } | ||
| if (Array.isArray(source)) { | ||
| for (const p of source) collectRefsFromType(p.type, out); | ||
| return; | ||
| } | ||
| collectRefsFromType(source, out); | ||
| } | ||
| /** Collect all type names directly referenced by public operations (seed set). */ | ||
| function collectPublicTypeRefs(opRoots) { | ||
| const refs = new Set(); | ||
| for (const opRoot of opRoots) { | ||
| for (const route of opRoot.routes) { | ||
| for (const op of route.operations) { | ||
| if (resolveModifiers(route, op).includes('internal')) continue; | ||
| if (op.request) collectRefsFromType(op.request.bodyType, refs); | ||
| for (const resp of op.responses) { | ||
| if (resp.bodyType) collectRefsFromType(resp.bodyType, refs); | ||
| } | ||
| collectParamSourceRefs(route.params, refs); | ||
| collectParamSourceRefs(op.query, refs); | ||
| collectParamSourceRefs(op.headers, refs); | ||
| } | ||
| } | ||
| } | ||
| return refs; | ||
| } | ||
| /** BFS-expand seed type names through the DTO model graph. */ | ||
| function computeReachableSchemas(seeds, modelMap) { | ||
| const reachable = new Set(seeds); | ||
| const frontier = [...seeds]; | ||
| while (frontier.length > 0) { | ||
| const name = frontier.pop(); | ||
| const model = modelMap.get(name); | ||
| if (!model) continue; | ||
| const refs = new Set(); | ||
| if (model.type) collectRefsFromType(model.type, refs); | ||
| for (const field of model.fields) collectRefsFromType(field.type, refs); | ||
| if (model.base) refs.add(model.base); | ||
| for (const ref of refs) { | ||
| if (!reachable.has(ref)) { | ||
| reachable.add(ref); | ||
| frontier.push(ref); | ||
| } | ||
| } | ||
| } | ||
| return reachable; | ||
| } | ||
| export function generateOpenApi(ctx) { | ||
| const { dtoRoots, opRoots, config, securitySchemes } = ctx; | ||
| const doc = { | ||
| openapi: '3.1.0', | ||
| info: { | ||
| title: config.info?.title ?? 'API', | ||
| version: config.info?.version ?? '0.0.1', | ||
| ...(config.info?.description ? { description: config.info.description } : {}), | ||
| }, | ||
| }; | ||
| if (config.servers && config.servers.length > 0) { | ||
| doc.servers = config.servers; | ||
| } | ||
| if (config.security && config.security.length > 0) { | ||
| doc.security = config.security; | ||
| } | ||
| // Build component schemas from all DTO models | ||
| const allSchemas = {}; | ||
| const modelMap = new Map(); | ||
| for (const dtoRoot of dtoRoots) { | ||
| for (const model of dtoRoot.models) { | ||
| modelMap.set(model.name, model); | ||
| allSchemas[model.name] = modelToSchema(model); | ||
| } | ||
| } | ||
| // Build paths from all operation files | ||
| const paths = {}; | ||
| for (const opRoot of opRoots) { | ||
| for (const route of opRoot.routes) { | ||
| const oaPath = convertPath(route.path); | ||
| for (const op of route.operations) { | ||
| const mods = resolveModifiers(route, op); | ||
| if (mods.includes('internal')) continue; | ||
| // Lazily initialize the path object so all-internal routes | ||
| // leave no empty entry in the output | ||
| if (!paths[oaPath]) paths[oaPath] = {}; | ||
| const operation = buildOperation(route, op); | ||
| if (mods.includes('deprecated')) operation.deprecated = true; | ||
| paths[oaPath][op.method] = operation; | ||
| } | ||
| } | ||
| } | ||
| doc.paths = paths; | ||
| // Filter schemas to only include types reachable from public operations. | ||
| // When there are no op files, all schemas are included (no filtering). | ||
| const schemas = | ||
| opRoots.length > 0 | ||
| ? (() => { | ||
| const reachable = computeReachableSchemas(collectPublicTypeRefs(opRoots), modelMap); | ||
| const filtered = {}; | ||
| for (const [name, schema] of Object.entries(allSchemas)) { | ||
| if (reachable.has(name)) filtered[name] = schema; | ||
| } | ||
| return filtered; | ||
| })() | ||
| : allSchemas; | ||
| const components = {}; | ||
| if (Object.keys(schemas).length > 0) { | ||
| components.schemas = schemas; | ||
| } | ||
| if (securitySchemes && Object.keys(securitySchemes).length > 0) { | ||
| components.securitySchemes = securitySchemes; | ||
| } | ||
| if (Object.keys(components).length > 0) { | ||
| doc.components = components; | ||
| } | ||
| return toYaml(doc); | ||
| } | ||
| // ─── Path conversion ────────────────────────────────────────────────────── | ||
| /** Convert Express-style `:param` to OpenAPI `{param}`. */ | ||
| function convertPath(path) { | ||
| return path.replace(/:(\w+)/g, '{$1}'); | ||
| } | ||
| // ─── Schema conversion ─────────────────────────────────────────────────── | ||
| function modelToSchema(model) { | ||
| // Type alias (no fields) | ||
| if (model.type) { | ||
| const schema = typeToSchema(model.type); | ||
| if (model.description) schema.description = model.description; | ||
| return schema; | ||
| } | ||
| const properties = {}; | ||
| const required = []; | ||
| for (const field of model.fields) { | ||
| const prop = fieldToSchema(field); | ||
| properties[field.name] = prop; | ||
| if (!field.optional) { | ||
| required.push(field.name); | ||
| } | ||
| } | ||
| const schema = { | ||
| type: 'object', | ||
| properties, | ||
| }; | ||
| if (required.length > 0) { | ||
| schema.required = required; | ||
| } | ||
| if (model.base) { | ||
| return { | ||
| allOf: [{ $ref: `#/components/schemas/${model.base}` }, schema], | ||
| }; | ||
| } | ||
| if (model.description) { | ||
| schema.description = model.description; | ||
| } | ||
| return schema; | ||
| } | ||
| function fieldToSchema(field) { | ||
| let schema = typeToSchema(field.type); | ||
| if (field.nullable) { | ||
| schema = wrapNullable(schema); | ||
| } | ||
| if (field.visibility === 'readonly') { | ||
| schema.readOnly = true; | ||
| } else if (field.visibility === 'writeonly') { | ||
| schema.writeOnly = true; | ||
| } | ||
| if (field.default !== undefined) { | ||
| schema.default = field.default; | ||
| } | ||
| if (field.description) { | ||
| schema.description = field.description; | ||
| } | ||
| return schema; | ||
| } | ||
| function typeToSchema(type) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return scalarToSchema(type); | ||
| case 'array': | ||
| return arrayToSchema(type); | ||
| case 'tuple': | ||
| return { type: 'array', prefixItems: type.items.map(i => typeToSchema(i)) }; | ||
| case 'record': | ||
| return { type: 'object', additionalProperties: typeToSchema(type.value) }; | ||
| case 'enum': | ||
| return { type: 'string', enum: type.values }; | ||
| case 'literal': | ||
| return { const: type.value }; | ||
| case 'union': | ||
| return { oneOf: type.members.map(m => typeToSchema(m)) }; | ||
| case 'intersection': | ||
| return { allOf: type.members.map(m => typeToSchema(m)) }; | ||
| case 'ref': | ||
| return { $ref: `#/components/schemas/${type.name}` }; | ||
| case 'inlineObject': | ||
| return inlineObjectToSchema(type.fields); | ||
| case 'lazy': | ||
| return typeToSchema(type.inner); | ||
| } | ||
| } | ||
| function scalarToSchema(type) { | ||
| const s = {}; | ||
| switch (type.name) { | ||
| case 'string': | ||
| s.type = 'string'; | ||
| if (type.min !== undefined) s.minLength = Number(type.min); | ||
| if (type.max !== undefined) s.maxLength = Number(type.max); | ||
| if (type.len !== undefined) { | ||
| s.minLength = type.len; | ||
| s.maxLength = type.len; | ||
| } | ||
| if (type.regex) s.pattern = type.regex; | ||
| break; | ||
| case 'number': | ||
| s.type = 'number'; | ||
| if (type.min !== undefined) s.minimum = Number(type.min); | ||
| if (type.max !== undefined) s.maximum = Number(type.max); | ||
| break; | ||
| case 'int': | ||
| s.type = 'integer'; | ||
| if (type.min !== undefined) s.minimum = Number(type.min); | ||
| if (type.max !== undefined) s.maximum = Number(type.max); | ||
| break; | ||
| case 'bigint': | ||
| s.type = 'integer'; | ||
| s.format = 'int64'; | ||
| break; | ||
| case 'boolean': | ||
| s.type = 'boolean'; | ||
| break; | ||
| case 'date': | ||
| s.type = 'string'; | ||
| s.format = 'date'; | ||
| break; | ||
| case 'datetime': | ||
| s.type = 'string'; | ||
| s.format = 'date-time'; | ||
| break; | ||
| case 'email': | ||
| s.type = 'string'; | ||
| s.format = 'email'; | ||
| break; | ||
| case 'url': | ||
| s.type = 'string'; | ||
| s.format = 'uri'; | ||
| break; | ||
| case 'uuid': | ||
| s.type = 'string'; | ||
| s.format = 'uuid'; | ||
| break; | ||
| case 'any': | ||
| case 'unknown': | ||
| // No type constraint | ||
| break; | ||
| case 'null': | ||
| s.type = 'null'; | ||
| break; | ||
| case 'object': | ||
| s.type = 'object'; | ||
| break; | ||
| case 'binary': | ||
| s.type = 'string'; | ||
| s.format = 'binary'; | ||
| break; | ||
| case 'json': | ||
| // Any JSON value — no type constraint | ||
| break; | ||
| } | ||
| return s; | ||
| } | ||
| function arrayToSchema(type) { | ||
| const s = { type: 'array', items: typeToSchema(type.item) }; | ||
| if (type.min !== undefined) s.minItems = type.min; | ||
| if (type.max !== undefined) s.maxItems = type.max; | ||
| return s; | ||
| } | ||
| function inlineObjectToSchema(fields) { | ||
| const properties = {}; | ||
| const required = []; | ||
| for (const field of fields) { | ||
| properties[field.name] = fieldToSchema(field); | ||
| if (!field.optional) { | ||
| required.push(field.name); | ||
| } | ||
| } | ||
| const schema = { type: 'object', properties }; | ||
| if (required.length > 0) schema.required = required; | ||
| return schema; | ||
| } | ||
| function wrapNullable(schema) { | ||
| // OpenAPI 3.1 uses JSON Schema nullable via oneOf or type array | ||
| if (schema.$ref) { | ||
| return { oneOf: [schema, { type: 'null' }] }; | ||
| } | ||
| if (typeof schema.type === 'string') { | ||
| schema.type = [schema.type, 'null']; | ||
| } | ||
| return schema; | ||
| } | ||
| // ─── Operation building ───────────────────────────────────────────────── | ||
| function buildOperation(route, op) { | ||
| const operation = {}; | ||
| // operationId from service binding or SDK name | ||
| if (op.sdk) { | ||
| operation.operationId = op.sdk; | ||
| } else if (op.service) { | ||
| const methodPart = op.service.split('.').pop(); | ||
| if (methodPart) operation.operationId = methodPart; | ||
| } | ||
| if (op.description) { | ||
| operation.description = op.description; | ||
| } | ||
| // Parameters: path params + query + headers | ||
| const parameters = []; | ||
| if (route.params) { | ||
| parameters.push(...paramSourceToParams(route.params, 'path')); | ||
| } | ||
| if (op.query) { | ||
| parameters.push(...paramSourceToParams(op.query, 'query')); | ||
| } | ||
| if (op.headers) { | ||
| parameters.push(...paramSourceToParams(op.headers, 'header')); | ||
| } | ||
| if (parameters.length > 0) { | ||
| operation.parameters = parameters; | ||
| } | ||
| // Request body | ||
| if (op.request) { | ||
| operation.requestBody = { | ||
| required: true, | ||
| content: { | ||
| [op.request.contentType]: { | ||
| schema: typeToSchema(op.request.bodyType), | ||
| }, | ||
| }, | ||
| }; | ||
| } | ||
| // Effective security (operation-level wins; falls back to route-level) | ||
| // security: none → empty array (explicit public endpoint, overrides global default) | ||
| // security: { fields } → omit operation-level entry (rely on global security from config) | ||
| const effectiveSecurity = resolveSecurity(route, op); | ||
| if (effectiveSecurity === SECURITY_NONE) { | ||
| operation.security = []; | ||
| } | ||
| // Responses | ||
| const responses = {}; | ||
| for (const resp of op.responses) { | ||
| const statusKey = String(resp.statusCode); | ||
| if (resp.bodyType && resp.contentType) { | ||
| responses[statusKey] = { | ||
| description: statusDescription(resp.statusCode), | ||
| content: { | ||
| [resp.contentType]: { | ||
| schema: typeToSchema(resp.bodyType), | ||
| }, | ||
| }, | ||
| }; | ||
| } else { | ||
| responses[statusKey] = { | ||
| description: statusDescription(resp.statusCode), | ||
| }; | ||
| } | ||
| } | ||
| if (Object.keys(responses).length > 0) { | ||
| operation.responses = responses; | ||
| } | ||
| return operation; | ||
| } | ||
| function paramSourceToParams(source, location) { | ||
| if (typeof source === 'string') { | ||
| // Type reference name used as param source — emit a single $ref | ||
| // This is a model reference used for query/params; expand as a ref in content | ||
| return [ | ||
| { | ||
| name: source, | ||
| in: location, | ||
| required: location === 'path', | ||
| schema: { $ref: `#/components/schemas/${source}` }, | ||
| }, | ||
| ]; | ||
| } | ||
| if (Array.isArray(source)) { | ||
| // Inline param declarations | ||
| return source.map(p => ({ | ||
| name: p.name, | ||
| in: location, | ||
| required: location === 'path', | ||
| schema: typeToSchema(p.type), | ||
| })); | ||
| } | ||
| // DtoTypeNode (inline object or other type) — if it's an inlineObject, expand fields | ||
| if (source.kind === 'inlineObject') { | ||
| return source.fields.map(f => ({ | ||
| name: f.name, | ||
| in: location, | ||
| required: location === 'path' ? true : !f.optional, | ||
| schema: typeToSchema(f.type), | ||
| })); | ||
| } | ||
| // For a ref type used as param source | ||
| if (source.kind === 'ref') { | ||
| return [ | ||
| { | ||
| name: source.name, | ||
| in: location, | ||
| required: location === 'path', | ||
| schema: { $ref: `#/components/schemas/${source.name}` }, | ||
| }, | ||
| ]; | ||
| } | ||
| return []; | ||
| } | ||
| function statusDescription(code) { | ||
| const descriptions = { | ||
| 200: 'Successful response', | ||
| 201: 'Created', | ||
| 204: 'No content', | ||
| 400: 'Bad request', | ||
| 401: 'Unauthorized', | ||
| 403: 'Forbidden', | ||
| 404: 'Not found', | ||
| 409: 'Conflict', | ||
| 422: 'Unprocessable entity', | ||
| 500: 'Internal server error', | ||
| }; | ||
| return descriptions[code] ?? `Response ${code}`; | ||
| } | ||
| // ─── YAML serializer ────────────────────────────────────────────────────── | ||
| /** | ||
| * Minimal YAML serializer sufficient for OpenAPI documents. | ||
| * Avoids external dependency while producing clean, readable output. | ||
| */ | ||
| export function toYaml(value, indent = 0) { | ||
| if (value === null || value === undefined) return 'null'; | ||
| if (typeof value === 'boolean') return value ? 'true' : 'false'; | ||
| if (typeof value === 'number') return String(value); | ||
| if (typeof value === 'bigint') return String(value); | ||
| if (typeof value === 'string') { | ||
| return yamlString(value); | ||
| } | ||
| if (Array.isArray(value)) { | ||
| if (value.length === 0) return '[]'; | ||
| // Check if all items are simple scalars (for inline arrays like enum values, required lists) | ||
| if (value.every(v => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')) { | ||
| const items = value.map(v => (typeof v === 'string' ? yamlString(v) : String(v))); | ||
| const inline = `[${items.join(', ')}]`; | ||
| if (inline.length < 80) return inline; | ||
| } | ||
| const lines = []; | ||
| const pad = ' '.repeat(indent); | ||
| for (const item of value) { | ||
| if (isPlainObject(item)) { | ||
| const entries = Object.entries(item); | ||
| if (entries.length > 0) { | ||
| const [firstKey, firstVal] = entries[0]; | ||
| const firstValStr = isComplex(firstVal) ? `\n${toYamlValue(firstVal, indent + 2)}` : ` ${toYaml(firstVal, indent + 2)}`; | ||
| lines.push(`${pad}- ${yamlKey(firstKey)}:${firstValStr}`); | ||
| for (let i = 1; i < entries.length; i++) { | ||
| const [k, v] = entries[i]; | ||
| const valStr = isComplex(v) ? `\n${toYamlValue(v, indent + 2)}` : ` ${toYaml(v, indent + 2)}`; | ||
| lines.push(`${pad} ${yamlKey(k)}:${valStr}`); | ||
| } | ||
| } else { | ||
| lines.push(`${pad}- {}`); | ||
| } | ||
| } else { | ||
| lines.push(`${pad}- ${toYaml(item, indent + 1)}`); | ||
| } | ||
| } | ||
| return lines.join('\n'); | ||
| } | ||
| if (isPlainObject(value)) { | ||
| const obj = value; | ||
| const entries = Object.entries(obj); | ||
| if (entries.length === 0) return '{}'; | ||
| const pad = ' '.repeat(indent); | ||
| const lines = []; | ||
| for (const [key, val] of entries) { | ||
| if (isComplex(val)) { | ||
| lines.push(`${pad}${yamlKey(key)}:`); | ||
| lines.push(toYamlValue(val, indent + 1)); | ||
| } else { | ||
| lines.push(`${pad}${yamlKey(key)}: ${toYaml(val, indent + 1)}`); | ||
| } | ||
| } | ||
| return lines.join('\n'); | ||
| } | ||
| return String(value); | ||
| } | ||
| function toYamlValue(value, indent) { | ||
| if (Array.isArray(value)) { | ||
| return toYaml(value, indent); | ||
| } | ||
| if (isPlainObject(value)) { | ||
| return toYaml(value, indent); | ||
| } | ||
| return ' '.repeat(indent) + toYaml(value, indent); | ||
| } | ||
| function isComplex(value) { | ||
| if (Array.isArray(value)) { | ||
| // Simple scalar arrays can be inlined | ||
| if (value.every(v => typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean')) { | ||
| const items = value.map(v => (typeof v === 'string' ? yamlString(v) : String(v))); | ||
| return `[${items.join(', ')}]`.length >= 80; | ||
| } | ||
| return true; | ||
| } | ||
| return isPlainObject(value); | ||
| } | ||
| function isPlainObject(value) { | ||
| return typeof value === 'object' && value !== null && !Array.isArray(value); | ||
| } | ||
| function yamlString(s) { | ||
| // Use plain style if safe, otherwise single-quoted | ||
| if (s === '') return "''"; | ||
| if (/^[\w./\-]+$/.test(s) && !/^(true|false|null|yes|no|on|off)$/i.test(s) && !/^\d/.test(s)) { | ||
| return s; | ||
| } | ||
| // Single-quote, escaping internal single quotes by doubling | ||
| return `'${s.replace(/'/g, "''")}'`; | ||
| } | ||
| function yamlKey(key) { | ||
| // Keys with special chars need quoting | ||
| if (/^[\w\-]+$/.test(key) && !/^(true|false|null|yes|no|on|off)$/i.test(key)) { | ||
| return key; | ||
| } | ||
| return `'${key.replace(/'/g, "''")}'`; | ||
| } | ||
| //# sourceMappingURL=codegen-openapi.js.map |
| {"version":3,"file":"codegen-openapi.js","sourceRoot":"","sources":["../src/codegen-openapi.ts"],"names":[],"mappings":"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"} |
| import type { DtoRootNode } from './ast.js'; | ||
| import type { DtoCodegenContext } from './codegen-dto.js'; | ||
| /** | ||
| * Generate plain TypeScript interfaces/types from a DTO AST. | ||
| * Unlike `generateDto()` which produces Zod schemas, this emits | ||
| * vanilla TypeScript `interface` and `type` declarations suitable | ||
| * for SDK consumers that don't need runtime validation. | ||
| */ | ||
| export declare function generatePlainTypes(root: DtoRootNode, context?: DtoCodegenContext): string; | ||
| //# sourceMappingURL=codegen-plain-types.d.ts.map |
| {"version":3,"file":"codegen-plain-types.d.ts","sourceRoot":"","sources":["../src/codegen-plain-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAwB,MAAM,UAAU,CAAC;AAClE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAM1D;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,MAAM,CAqCzF"} |
| import { relative, dirname } from 'node:path'; | ||
| import { | ||
| collectExternalRefs, | ||
| collectExternalInputRefs, | ||
| computeModelsWithInput, | ||
| topoSortModels, | ||
| resolveImportPath, | ||
| rootNeedsScalar, | ||
| } from './codegen-dto.js'; | ||
| import { renderTsType, renderInputTsType, quoteKey, JSON_VALUE_TYPE_DECL } from './codegen-sdk.js'; | ||
| // ─── Public entry point ──────────────────────────────────────────────────── | ||
| /** | ||
| * Generate plain TypeScript interfaces/types from a DTO AST. | ||
| * Unlike `generateDto()` which produces Zod schemas, this emits | ||
| * vanilla TypeScript `interface` and `type` declarations suitable | ||
| * for SDK consumers that don't need runtime validation. | ||
| */ | ||
| export function generatePlainTypes(root, context) { | ||
| const externalRefs = collectExternalRefs(root); | ||
| const lines = []; | ||
| // Compute which models have Input variants (local, incl. transitive deps + external) | ||
| const externalModelsWithInput = context?.modelsWithInput ?? new Set(); | ||
| const localModelsWithInput = computeModelsWithInput(root.models, externalModelsWithInput); | ||
| const allModelsWithInput = new Set([...localModelsWithInput, ...externalModelsWithInput]); | ||
| // Collect additional external Input refs needed for Input schema fields | ||
| const externalInputRefs = allModelsWithInput.size > 0 ? collectExternalInputRefs(root, allModelsWithInput) : []; | ||
| const allExternalRefs = [...new Set([...externalRefs, ...externalInputRefs])].sort(); | ||
| // Type-only imports for external references | ||
| for (const ref of allExternalRefs) { | ||
| const importPath = resolveImportPath(ref, context); | ||
| lines.push(`import type { ${ref} } from '${importPath}';`); | ||
| } | ||
| if (allExternalRefs.length > 0) lines.push(''); | ||
| if (rootNeedsScalar(root, 'json')) { | ||
| if (context?.jsonValueImportPath) { | ||
| lines.push(`import type { JsonValue } from '${context.jsonValueImportPath}';`); | ||
| } else { | ||
| lines.push(JSON_VALUE_TYPE_DECL); | ||
| } | ||
| lines.push(''); | ||
| } | ||
| for (const model of topoSortModels(root.models)) { | ||
| lines.push(...generateModel(model, context?.currentOutPath, allModelsWithInput)); | ||
| lines.push(''); | ||
| } | ||
| return lines.join('\n'); | ||
| } | ||
| // ─── Model ───────────────────────────────────────────────────────────────── | ||
| function generateModel(model, outPath, modelsWithInput) { | ||
| // Type alias: Name : typeExpression | ||
| if (model.type) { | ||
| return generateTypeAlias(model, outPath, modelsWithInput); | ||
| } | ||
| // A model needs Input/read split if it has visibility-modified fields OR if it | ||
| // transitively references models that have Input variants (captured in modelsWithInput). | ||
| const needsInputSplit = model.fields.some(f => f.visibility !== 'normal') || (modelsWithInput?.has(model.name) ?? false); | ||
| if (needsInputSplit) { | ||
| return generateVisibilityModel(model, outPath, modelsWithInput); | ||
| } | ||
| return generateSimpleModel(model, outPath); | ||
| } | ||
| function generateComments(model, outPath) { | ||
| const lines = []; | ||
| lines.push('/**'); | ||
| if (model.description) { | ||
| lines.push(` * ${model.description}`); | ||
| } | ||
| const relPath = outPath ? relative(dirname(outPath), model.loc.file) : model.loc.file; | ||
| lines.push(` * generated from [${model.name}](file://./${relPath}#L${model.loc.line})`); | ||
| lines.push(' */'); | ||
| return lines; | ||
| } | ||
| function generateTypeAlias(model, outPath, modelsWithInput) { | ||
| const lines = []; | ||
| lines.push(...generateComments(model, outPath)); | ||
| lines.push(`export type ${model.name} = ${renderTsType(model.type)};`); | ||
| if (modelsWithInput?.has(model.name)) { | ||
| lines.push(`export type ${model.name}Input = ${renderInputTsType(model.type, modelsWithInput)};`); | ||
| } | ||
| return lines; | ||
| } | ||
| function generateSimpleModel(model, outPath) { | ||
| const lines = []; | ||
| lines.push(...generateComments(model, outPath)); | ||
| if (model.base) { | ||
| lines.push(`export interface ${model.name} extends ${model.base} {`); | ||
| } else { | ||
| lines.push(`export interface ${model.name} {`); | ||
| } | ||
| for (const field of model.fields) { | ||
| lines.push(` ${renderField(field)}`); | ||
| } | ||
| lines.push('}'); | ||
| return lines; | ||
| } | ||
| function generateVisibilityModel(model, outPath, modelsWithInput) { | ||
| const lines = []; | ||
| lines.push(...generateComments(model, outPath)); | ||
| // Read type — omit writeonly fields | ||
| const readFields = model.fields.filter(f => f.visibility !== 'writeonly'); | ||
| if (model.base) { | ||
| lines.push(`export interface ${model.name} extends ${model.base} {`); | ||
| } else { | ||
| lines.push(`export interface ${model.name} {`); | ||
| } | ||
| for (const field of readFields) { | ||
| lines.push(` ${renderField(field)}`); | ||
| } | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| // Write type — omit readonly fields (use Input variants for sub-type refs); | ||
| // extends ParentInput if parent has an Input variant, else extends parent read type | ||
| const writeFields = model.fields.filter(f => f.visibility !== 'readonly'); | ||
| const inputBase = model.base ? (modelsWithInput?.has(model.base) ? `${model.base}Input` : model.base) : undefined; | ||
| if (inputBase) { | ||
| lines.push(`export interface ${model.name}Input extends ${inputBase} {`); | ||
| } else { | ||
| lines.push(`export interface ${model.name}Input {`); | ||
| } | ||
| for (const field of writeFields) { | ||
| lines.push(` ${modelsWithInput ? renderInputField(field, modelsWithInput) : renderField(field)}`); | ||
| } | ||
| lines.push('}'); | ||
| return lines; | ||
| } | ||
| // ─── Field rendering ────────────────────────────────────────────────────── | ||
| function renderField(field) { | ||
| const opt = field.optional || field.default !== undefined ? '?' : ''; | ||
| let typeStr = renderTsType(field.type); | ||
| if (field.nullable) typeStr += ' | null'; | ||
| const line = `${quoteKey(field.name)}${opt}: ${typeStr};`; | ||
| if (field.description) { | ||
| return `/** ${field.description} */\n ${line}`; | ||
| } | ||
| return line; | ||
| } | ||
| function renderInputField(field, modelsWithInput) { | ||
| const opt = field.optional || field.default !== undefined ? '?' : ''; | ||
| let typeStr = renderInputTsType(field.type, modelsWithInput); | ||
| if (field.nullable) typeStr += ' | null'; | ||
| const line = `${quoteKey(field.name)}${opt}: ${typeStr};`; | ||
| if (field.description) { | ||
| return `/** ${field.description} */\n ${line}`; | ||
| } | ||
| return line; | ||
| } | ||
| //# sourceMappingURL=codegen-plain-types.js.map |
| {"version":3,"file":"codegen-plain-types.js","sourceRoot":"","sources":["../src/codegen-plain-types.ts"],"names":[],"mappings":"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"} |
| import type { OpRootNode, DtoTypeNode } from './ast.js'; | ||
| export declare const JSON_VALUE_TYPE_DECL = 'export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };'; | ||
| export interface SdkCodegenOptions { | ||
| typeImportPathTemplate?: string; | ||
| outPath?: string; | ||
| /** Map from model name → absolute output file path (for cross-module type imports) */ | ||
| modelOutPaths?: Map<string, string>; | ||
| /** Absolute path to the shared sdk-options.ts file (if set, imports SdkOptions instead of defining inline) */ | ||
| sdkOptionsPath?: string; | ||
| /** Set of model names that have Input variants (models with visibility modifiers) */ | ||
| modelsWithInput?: Set<string>; | ||
| } | ||
| /** Returns true if at least one operation in the root is not internal. */ | ||
| export declare function hasPublicOperations(root: OpRootNode): boolean; | ||
| /** | ||
| * Returns the set of type names directly referenced by public (non-internal) | ||
| * operations in the root. Does not include transitive dependencies — callers | ||
| * should expand these through the DTO model graph if needed. | ||
| */ | ||
| export declare function collectPublicTypeNames(root: OpRootNode, modelsWithInput?: Set<string>): Set<string>; | ||
| export declare function generateSdk(root: OpRootNode, options?: SdkCodegenOptions): string; | ||
| export declare function quoteKey(name: string): string; | ||
| export declare function renderTsType(type: DtoTypeNode): string; | ||
| /** | ||
| * Like renderTsType, but substitutes model refs with their Input variant | ||
| * when the model has visibility modifiers. Used for request-side types | ||
| * (body, params, query, headers). | ||
| */ | ||
| export declare function renderInputTsType(type: DtoTypeNode, modelsWithInput?: Set<string>): string; | ||
| export declare function deriveClientClassName(file: string): string; | ||
| export declare function deriveClientPropertyName(file: string): string; | ||
| /** Generate the shared SdkOptions interface file. */ | ||
| export declare function generateSdkOptions(): string; | ||
| export interface SdkClientInfo { | ||
| className: string; | ||
| propertyName: string; | ||
| importPath: string; | ||
| } | ||
| /** Generate the sdk.ts aggregator that wraps all clients into a single Sdk class. */ | ||
| export declare function generateSdkAggregator(clients: SdkClientInfo[], sdkOptionsImportPath?: string, sdkClassName?: string): string; | ||
| //# sourceMappingURL=codegen-sdk.d.ts.map |
| {"version":3,"file":"codegen-sdk.d.ts","sourceRoot":"","sources":["../src/codegen-sdk.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAA6C,WAAW,EAA0B,MAAM,UAAU,CAAC;AAK3H,eAAO,MAAM,oBAAoB,2GAA2G,CAAC;AAI7I,MAAM,WAAW,iBAAiB;IAC9B,sBAAsB,CAAC,EAAE,MAAM,CAAC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sFAAsF;IACtF,aAAa,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,8GAA8G;IAC9G,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,qFAAqF;IACrF,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACjC;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAO7D;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,UAAU,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAEnG;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,GAAE,iBAAsB,GAAG,MAAM,CA2FrF;AA6KD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE7C;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,CA8BtD;AA4CD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAqB1F;AA4CD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAE1D;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7D;AAoLD,qDAAqD;AACrD,wBAAgB,kBAAkB,IAAI,MAAM,CA4D3C;AAED,MAAM,WAAW,aAAa;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,qFAAqF;AACrF,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,EAAE,EAAE,oBAAoB,SAAqB,EAAE,YAAY,SAAQ,GAAG,MAAM,CAyBvI"} |
| import { resolveModifiers } from './ast.js'; | ||
| import { pascalToDotCase, typeNeedsScalar } from './codegen-dto.js'; | ||
| import { basename, dirname, relative } from 'path'; | ||
| export const JSON_VALUE_TYPE_DECL = 'export type JsonValue = string | number | boolean | null | JsonValue[] | { [key: string]: JsonValue };'; | ||
| /** Returns true if at least one operation in the root is not internal. */ | ||
| export function hasPublicOperations(root) { | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| if (!resolveModifiers(route, op).includes('internal')) return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| /** | ||
| * Returns the set of type names directly referenced by public (non-internal) | ||
| * operations in the root. Does not include transitive dependencies — callers | ||
| * should expand these through the DTO model graph if needed. | ||
| */ | ||
| export function collectPublicTypeNames(root, modelsWithInput) { | ||
| return new Set(collectTypes(root, modelsWithInput)); | ||
| } | ||
| export function generateSdk(root, options = {}) { | ||
| const lines = []; | ||
| const types = collectTypes(root, options.modelsWithInput); | ||
| const clientClassName = deriveClientClassName(root.file); | ||
| // Type-only imports | ||
| if (types.length > 0) { | ||
| lines.push(...generateTypeImports(types, root.file, options)); | ||
| } | ||
| // SdkOptions import (from shared file) or inline fallback | ||
| if (options.sdkOptionsPath && options.outPath) { | ||
| let rel = relative(dirname(options.outPath), options.sdkOptionsPath); | ||
| rel = rel.replace(/\.ts$/, '.js'); | ||
| if (!rel.startsWith('.')) rel = './' + rel; | ||
| const jsonImport = sdkNeedsJson(root) ? ', JsonValue' : ''; | ||
| lines.push(`import type { SdkFetch${jsonImport} } from '${rel}';`); | ||
| lines.push(`import { bigIntReplacer, bigIntReviver } from '${rel}';`); | ||
| } else { | ||
| lines.push(''); | ||
| lines.push('export class SdkError extends Error {'); | ||
| lines.push(' constructor('); | ||
| lines.push(' public readonly status: number,'); | ||
| lines.push(' public readonly statusText: string,'); | ||
| lines.push(' public readonly body: unknown,'); | ||
| lines.push(' ) {'); | ||
| lines.push(' super(`${status} ${statusText}`);'); | ||
| lines.push(" this.name = 'SdkError';"); | ||
| lines.push(' }'); | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| lines.push('export type SdkFetch = (url: string, init: RequestInit) => Promise<Response>;'); | ||
| lines.push(''); | ||
| lines.push('export interface SdkOptions {'); | ||
| lines.push(' baseUrl: string;'); | ||
| lines.push(' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);'); | ||
| lines.push(' fetch?: SdkFetch;'); | ||
| lines.push(' /** Called once per request to produce a unique X-Request-ID header value */'); | ||
| lines.push(' requestIdFactory?: () => string;'); | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| lines.push('export function createSdkFetch(options: SdkOptions): SdkFetch {'); | ||
| lines.push(' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());'); | ||
| lines.push(' return async (url: string, init: RequestInit): Promise<Response> => {'); | ||
| lines.push(" const baseHeaders = typeof options.headers === 'function'"); | ||
| lines.push(' ? await options.headers()'); | ||
| lines.push(' : options.headers ?? {};'); | ||
| lines.push(' const res = await fetch(`${options.baseUrl}${url}`, {'); | ||
| lines.push(' ...init,'); | ||
| lines.push(" headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },"); | ||
| lines.push(' });'); | ||
| lines.push(' if (!res.ok) {'); | ||
| lines.push(' const text = await res.text();'); | ||
| lines.push(' let body: unknown;'); | ||
| lines.push(' try { body = JSON.parse(text); } catch { body = text; }'); | ||
| lines.push(' throw new SdkError(res.status, res.statusText, body);'); | ||
| lines.push(' }'); | ||
| lines.push(' return res;'); | ||
| lines.push(' };'); | ||
| lines.push('}'); | ||
| } | ||
| if (sdkNeedsJson(root) && !(options.sdkOptionsPath && options.outPath)) { | ||
| lines.push(JSON_VALUE_TYPE_DECL); | ||
| } | ||
| lines.push(''); | ||
| // Client class | ||
| lines.push('/**'); | ||
| const relFile = options.outPath ? relative(dirname(options.outPath), root.file) : root.file; | ||
| lines.push(` * generated from [${basename(root.file)}](file://./${relFile})`); | ||
| lines.push(' */'); | ||
| lines.push(`export class ${clientClassName} {`); | ||
| lines.push(' constructor(private fetch: SdkFetch) {}'); | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| const mods = resolveModifiers(route, op); | ||
| if (mods.includes('internal')) continue; | ||
| lines.push(''); | ||
| if (mods.includes('deprecated')) lines.push(' /** @deprecated */'); | ||
| lines.push(...generateMethod(route, op, root.file, options)); | ||
| } | ||
| } | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| return lines.join('\n'); | ||
| } | ||
| // ─── Method generation ──────────────────────────────────────────────────── | ||
| function generateMethod(route, op, file, options) { | ||
| const lines = []; | ||
| const methodName = deriveMethodName(op, route); | ||
| const httpMethod = op.method.toUpperCase(); | ||
| const { modelsWithInput } = options; | ||
| // Build method parameters (request-side — use Input variants) | ||
| const params = buildMethodParams(route, op, modelsWithInput); | ||
| const paramStr = params.map(p => `${p.name}${p.optional ? '?' : ''}: ${p.type}`).join(', '); | ||
| // Determine return type | ||
| const primaryResponse = op.responses.find(r => r.bodyType) ?? op.responses[0]; | ||
| const isVoid = !primaryResponse?.bodyType; | ||
| const returnType = isVoid ? 'void' : renderTsType(primaryResponse.bodyType); | ||
| // JSDoc | ||
| const desc = op.description ?? route.description; | ||
| if (desc) { | ||
| lines.push(` /** ${desc} */`); | ||
| } | ||
| lines.push(` async ${methodName}(${paramStr}): Promise<${returnType}> {`); | ||
| // Build URL with path params | ||
| const urlExpr = buildUrlExpression(route.path, route.params); | ||
| // Query string | ||
| const hasQuery = !!op.query; | ||
| let fetchUrl = urlExpr; | ||
| if (hasQuery) { | ||
| lines.push(` const searchParams = new URLSearchParams();`); | ||
| lines.push(` if (query) {`); | ||
| lines.push(` for (const [k, v] of Object.entries(query)) {`); | ||
| lines.push(` if (v === undefined || v === null) continue;`); | ||
| lines.push(` if (Array.isArray(v)) { for (const item of v) searchParams.append(k, String(item)); }`); | ||
| lines.push(` else searchParams.set(k, String(v));`); | ||
| lines.push(` }`); | ||
| lines.push(` }`); | ||
| lines.push(` const qs = searchParams.toString();`); | ||
| fetchUrl = urlExpr; | ||
| } | ||
| // Build fetch options | ||
| const hasBody = !!op.request; | ||
| const isMultipart = op.request?.contentType === 'multipart/form-data'; | ||
| const hasOpHeaders = !!op.headers; | ||
| const fetchArgs = []; | ||
| if (hasQuery) { | ||
| fetchArgs.push(`url: qs ? \`${fetchUrl}?\${qs}\` : \`${fetchUrl}\``); | ||
| } else { | ||
| fetchArgs.push(`url: \`${fetchUrl}\``); | ||
| } | ||
| fetchArgs.push(`method: '${httpMethod}'`); | ||
| if (hasBody) { | ||
| if (isMultipart) { | ||
| fetchArgs.push('body: body'); | ||
| } else { | ||
| fetchArgs.push(`headers: { 'Content-Type': 'application/json' }`); | ||
| fetchArgs.push('body: JSON.stringify(body, bigIntReplacer)'); | ||
| } | ||
| } | ||
| if (hasOpHeaders) { | ||
| if (hasBody && !isMultipart) { | ||
| const lastIdx = fetchArgs.findIndex(a => a.startsWith('headers:')); | ||
| fetchArgs[lastIdx] = `headers: { 'Content-Type': 'application/json', ...customHeaders }`; | ||
| } else { | ||
| fetchArgs.push('headers: customHeaders'); | ||
| } | ||
| } | ||
| if (fetchArgs.length === 2 && !hasBody && !hasOpHeaders && !hasQuery) { | ||
| // Simple case — inline | ||
| lines.push(` const result = await this.fetch(\`${fetchUrl}\`, { method: '${httpMethod}' });`); | ||
| } else { | ||
| lines.push(` const result = await this.fetch(${fetchArgs[0].split(': ').slice(1).join(': ')}, {`); | ||
| for (let i = 1; i < fetchArgs.length; i++) { | ||
| lines.push(` ${fetchArgs[i]},`); | ||
| } | ||
| lines.push(` });`); | ||
| } | ||
| if (isVoid) { | ||
| lines.push(` await result.text();`); | ||
| } else { | ||
| lines.push(` return JSON.parse(await result.text(), bigIntReviver) as ${returnType};`); | ||
| } | ||
| lines.push(' }'); | ||
| return lines; | ||
| } | ||
| // ─── URL building ───────────────────────────────────────────────────────── | ||
| function buildUrlExpression(path, params) { | ||
| // Replace :paramName with ${encodeURIComponent(paramName)} | ||
| return path.replace(/:([a-zA-Z_][a-zA-Z0-9_]*)/g, (_match, name) => { | ||
| return `\${encodeURIComponent(String(${name}))}`; | ||
| }); | ||
| } | ||
| function buildMethodParams(route, op, modelsWithInput) { | ||
| const params = []; | ||
| // Path params — always first, always required (request-side — use Input variants) | ||
| if (route.params) { | ||
| if (Array.isArray(route.params)) { | ||
| for (const p of route.params) { | ||
| params.push({ name: p.name, type: renderInputTsType(p.type, modelsWithInput), optional: false }); | ||
| } | ||
| } else if (typeof route.params === 'string') { | ||
| const typeName = modelsWithInput?.has(route.params) ? `${route.params}Input` : route.params; | ||
| params.push({ name: 'params', type: typeName, optional: false }); | ||
| } else { | ||
| params.push({ name: 'params', type: renderInputTsType(route.params, modelsWithInput), optional: false }); | ||
| } | ||
| } | ||
| // Body (request-side — use Input variants) | ||
| if (op.request) { | ||
| if (op.request.contentType === 'multipart/form-data') { | ||
| params.push({ name: 'body', type: 'FormData', optional: false }); | ||
| } else { | ||
| params.push({ name: 'body', type: renderInputTsType(op.request.bodyType, modelsWithInput), optional: false }); | ||
| } | ||
| } | ||
| // Query (request-side — use Input variants) | ||
| if (op.query) { | ||
| if (Array.isArray(op.query)) { | ||
| const fields = op.query.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; '); | ||
| params.push({ name: 'query', type: `{ ${fields} }`, optional: true }); | ||
| } else if (typeof op.query === 'string') { | ||
| const typeName = modelsWithInput?.has(op.query) ? `${op.query}Input` : op.query; | ||
| params.push({ name: 'query', type: typeName, optional: true }); | ||
| } else { | ||
| params.push({ name: 'query', type: renderInputTsType(op.query, modelsWithInput), optional: true }); | ||
| } | ||
| } | ||
| // Headers (request-side — use Input variants) | ||
| if (op.headers) { | ||
| if (Array.isArray(op.headers)) { | ||
| const fields = op.headers.map(p => `${quoteKey(p.name)}?: ${renderInputTsType(p.type, modelsWithInput)}`).join('; '); | ||
| params.push({ name: 'customHeaders', type: `{ ${fields} }`, optional: true }); | ||
| } else if (typeof op.headers === 'string') { | ||
| const typeName = modelsWithInput?.has(op.headers) ? `${op.headers}Input` : op.headers; | ||
| params.push({ name: 'customHeaders', type: typeName, optional: true }); | ||
| } else { | ||
| params.push({ name: 'customHeaders', type: renderInputTsType(op.headers, modelsWithInput), optional: true }); | ||
| } | ||
| } | ||
| return params; | ||
| } | ||
| export function quoteKey(name) { | ||
| return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(name) ? name : `'${name}'`; | ||
| } | ||
| // ─── TypeScript type rendering ──────────────────────────────────────────── | ||
| export function renderTsType(type) { | ||
| switch (type.kind) { | ||
| case 'scalar': | ||
| return renderTsScalar(type.name); | ||
| case 'array': { | ||
| const inner = renderTsType(type.item); | ||
| const needsParens = type.item.kind === 'union' || type.item.kind === 'intersection' || type.item.kind === 'enum'; | ||
| return needsParens ? `(${inner})[]` : `${inner}[]`; | ||
| } | ||
| case 'tuple': | ||
| return `[${type.items.map(renderTsType).join(', ')}]`; | ||
| case 'record': | ||
| return `Record<${renderTsType(type.key)}, ${renderTsType(type.value)}>`; | ||
| case 'enum': | ||
| return type.values.map(v => `'${v}'`).join(' | '); | ||
| case 'literal': | ||
| return typeof type.value === 'string' ? `'${type.value}'` : String(type.value); | ||
| case 'union': | ||
| return type.members.map(renderTsType).join(' | '); | ||
| case 'intersection': | ||
| return type.members.map(renderTsType).join(' & '); | ||
| case 'ref': | ||
| return type.name; | ||
| case 'lazy': | ||
| return renderTsType(type.inner); | ||
| case 'inlineObject': | ||
| return renderTsInlineObject(type.fields); | ||
| default: | ||
| return 'unknown'; | ||
| } | ||
| } | ||
| function renderTsScalar(name) { | ||
| switch (name) { | ||
| case 'string': | ||
| case 'email': | ||
| case 'url': | ||
| case 'uuid': | ||
| return 'string'; | ||
| case 'number': | ||
| case 'int': | ||
| return 'number'; | ||
| case 'bigint': | ||
| return 'bigint'; | ||
| case 'boolean': | ||
| return 'boolean'; | ||
| case 'date': | ||
| case 'datetime': | ||
| return 'string'; | ||
| case 'null': | ||
| return 'null'; | ||
| case 'any': | ||
| return 'any'; | ||
| case 'unknown': | ||
| return 'unknown'; | ||
| case 'object': | ||
| return 'Record<string, unknown>'; | ||
| case 'binary': | ||
| return 'Blob'; | ||
| case 'json': | ||
| return 'JsonValue'; | ||
| default: | ||
| return 'unknown'; | ||
| } | ||
| } | ||
| function renderTsInlineObject(fields) { | ||
| const entries = fields.map(f => { | ||
| const opt = f.optional ? '?' : ''; | ||
| return `${quoteKey(f.name)}${opt}: ${renderTsType(f.type)}`; | ||
| }); | ||
| return `{ ${entries.join('; ')} }`; | ||
| } | ||
| /** | ||
| * Like renderTsType, but substitutes model refs with their Input variant | ||
| * when the model has visibility modifiers. Used for request-side types | ||
| * (body, params, query, headers). | ||
| */ | ||
| export function renderInputTsType(type, modelsWithInput) { | ||
| if (!modelsWithInput || modelsWithInput.size === 0) return renderTsType(type); | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| return modelsWithInput.has(type.name) ? `${type.name}Input` : type.name; | ||
| case 'array': { | ||
| const inner = renderInputTsType(type.item, modelsWithInput); | ||
| const needsParens = type.item.kind === 'union' || type.item.kind === 'intersection' || type.item.kind === 'enum'; | ||
| return needsParens ? `(${inner})[]` : `${inner}[]`; | ||
| } | ||
| case 'intersection': | ||
| return type.members.map(m => renderInputTsType(m, modelsWithInput)).join(' & '); | ||
| case 'union': | ||
| return type.members.map(m => renderInputTsType(m, modelsWithInput)).join(' | '); | ||
| case 'inlineObject': | ||
| return `{ ${type.fields.map(f => `${quoteKey(f.name)}${f.optional ? '?' : ''}: ${renderInputTsType(f.type, modelsWithInput)}`).join('; ')} }`; | ||
| case 'lazy': | ||
| return renderInputTsType(type.inner, modelsWithInput); | ||
| default: | ||
| return renderTsType(type); | ||
| } | ||
| } | ||
| // ─── Method name inference ──────────────────────────────────────────────── | ||
| function deriveMethodName(op, route) { | ||
| if (op.sdk) return op.sdk; | ||
| return inferMethodName(op.method, route.path); | ||
| } | ||
| function inferMethodName(method, path) { | ||
| // Build a name from the path segments + method | ||
| // e.g. GET /users/:id → getUsersById | ||
| // e.g. POST /users → postUsers | ||
| // e.g. DELETE /users/:id → deleteUsersById | ||
| const segments = path.split('/').filter(s => s.length > 0); | ||
| const parts = [method.toLowerCase()]; | ||
| for (const seg of segments) { | ||
| if (seg.startsWith(':')) { | ||
| // :id → ById, :accountId → ByAccountId | ||
| const paramName = seg.slice(1); | ||
| parts.push('By' + paramName.charAt(0).toUpperCase() + paramName.slice(1)); | ||
| } else { | ||
| // Regular segment — camelCase it | ||
| const segParts = seg.split(/[.-]/).filter(Boolean); | ||
| for (const sp of segParts) { | ||
| parts.push(sp.charAt(0).toUpperCase() + sp.slice(1)); | ||
| } | ||
| } | ||
| } | ||
| return parts[0] + parts.slice(1).join(''); | ||
| } | ||
| // ─── Naming conventions ──────────────────────────────────────────────────── | ||
| function deriveBaseName(file) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'Resource'; | ||
| return base | ||
| .split('.') | ||
| .map(s => s.charAt(0).toUpperCase() + s.slice(1)) | ||
| .join(''); | ||
| } | ||
| export function deriveClientClassName(file) { | ||
| return `${deriveBaseName(file)}Client`; | ||
| } | ||
| export function deriveClientPropertyName(file) { | ||
| const base = deriveBaseName(file); | ||
| return base.charAt(0).toLowerCase() + base.slice(1); | ||
| } | ||
| // ─── Type collection ────────────────────────────────────────────────────── | ||
| function collectTypes(root, modelsWithInput) { | ||
| const types = new Set(); | ||
| for (const route of root.routes) { | ||
| const publicOps = route.operations.filter(op => !resolveModifiers(route, op).includes('internal')); | ||
| if (publicOps.length === 0) continue; | ||
| // Only collect path-param types if there are public ops on this route | ||
| collectParamSourceRefs(route.params, types); | ||
| collectParamSourceInputRefs(route.params, types, modelsWithInput); | ||
| for (const op of publicOps) { | ||
| if (op.request?.bodyType) { | ||
| collectTypeNodeRefs(op.request.bodyType, types); | ||
| collectInputTypeNodeRefs(op.request.bodyType, types, modelsWithInput); | ||
| } | ||
| for (const resp of op.responses) { | ||
| if (resp.bodyType) collectTypeNodeRefs(resp.bodyType, types); | ||
| } | ||
| collectParamSourceRefs(op.query, types); | ||
| collectParamSourceInputRefs(op.query, types, modelsWithInput); | ||
| collectParamSourceRefs(op.headers, types); | ||
| collectParamSourceInputRefs(op.headers, types, modelsWithInput); | ||
| } | ||
| } | ||
| return [...types].sort(); | ||
| } | ||
| /** Collect Input variant refs for request-side ParamSource types. */ | ||
| function collectParamSourceInputRefs(source, out, modelsWithInput) { | ||
| if (!source || !modelsWithInput) return; | ||
| if (typeof source === 'string') { | ||
| if (modelsWithInput.has(source)) out.add(`${source}Input`); | ||
| } else if (Array.isArray(source)) { | ||
| for (const param of source) { | ||
| collectInputTypeNodeRefs(param.type, out, modelsWithInput); | ||
| } | ||
| } else { | ||
| collectInputTypeNodeRefs(source, out, modelsWithInput); | ||
| } | ||
| } | ||
| /** Collect Input variant refs for request-side DtoTypeNode types. */ | ||
| function collectInputTypeNodeRefs(type, out, modelsWithInput) { | ||
| if (!modelsWithInput) return; | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (modelsWithInput.has(type.name)) out.add(`${type.name}Input`); | ||
| break; | ||
| case 'array': | ||
| collectInputTypeNodeRefs(type.item, out, modelsWithInput); | ||
| break; | ||
| case 'intersection': | ||
| case 'union': | ||
| type.members.forEach(m => collectInputTypeNodeRefs(m, out, modelsWithInput)); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectInputTypeNodeRefs(f.type, out, modelsWithInput)); | ||
| break; | ||
| case 'lazy': | ||
| collectInputTypeNodeRefs(type.inner, out, modelsWithInput); | ||
| break; | ||
| } | ||
| } | ||
| function collectParamSourceRefs(source, out) { | ||
| if (!source) return; | ||
| if (typeof source === 'string') { | ||
| if (/^[A-Z]/.test(source)) out.add(source); | ||
| } else if (Array.isArray(source)) { | ||
| for (const param of source) { | ||
| collectTypeNodeRefs(param.type, out); | ||
| } | ||
| } else { | ||
| collectTypeNodeRefs(source, out); | ||
| } | ||
| } | ||
| function sdkNeedsJson(root) { | ||
| for (const route of root.routes) { | ||
| for (const op of route.operations) { | ||
| const check = src => { | ||
| if (!src || typeof src === 'string') return false; | ||
| if (Array.isArray(src)) return src.some(p => typeNeedsScalar(p.type, 'json')); | ||
| return typeNeedsScalar(src, 'json'); | ||
| }; | ||
| if ( | ||
| (op.request?.bodyType && typeNeedsScalar(op.request.bodyType, 'json')) || | ||
| op.responses.some(r => r.bodyType && typeNeedsScalar(r.bodyType, 'json')) || | ||
| check(op.query) || | ||
| check(op.headers) || | ||
| check(route.params) | ||
| ) | ||
| return true; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
| function collectTypeNodeRefs(type, out) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (/^[A-Z]/.test(type.name)) out.add(type.name); | ||
| break; | ||
| case 'array': | ||
| collectTypeNodeRefs(type.item, out); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'record': | ||
| collectTypeNodeRefs(type.key, out); | ||
| collectTypeNodeRefs(type.value, out); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(t => collectTypeNodeRefs(t, out)); | ||
| break; | ||
| case 'lazy': | ||
| collectTypeNodeRefs(type.inner, out); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => collectTypeNodeRefs(f.type, out)); | ||
| break; | ||
| } | ||
| } | ||
| // ─── Type import resolution ─────────────────────────────────────────────── | ||
| function generateTypeImports(types, opFile, options) { | ||
| const lines = []; | ||
| const { modelOutPaths, outPath } = options; | ||
| if (modelOutPaths && outPath) { | ||
| const byFile = new Map(); | ||
| const unresolved = []; | ||
| for (const type of types) { | ||
| const typeOutPath = modelOutPaths.get(type); | ||
| if (typeOutPath) { | ||
| const group = byFile.get(typeOutPath) ?? []; | ||
| group.push(type); | ||
| byFile.set(typeOutPath, group); | ||
| } else { | ||
| unresolved.push(type); | ||
| } | ||
| } | ||
| const fromDir = dirname(outPath); | ||
| for (const [typeOutPath, names] of byFile) { | ||
| let rel = relative(fromDir, typeOutPath); | ||
| rel = rel.replace(/\.ts$/, '.js'); | ||
| if (!rel.startsWith('.')) rel = './' + rel; | ||
| lines.push(`import type { ${names.sort().join(', ')} } from '${rel}';`); | ||
| } | ||
| for (const type of unresolved) { | ||
| const moduleName = pascalToDotCase(type); | ||
| lines.push(`import type { ${type} } from './${moduleName}.js';`); | ||
| } | ||
| } else { | ||
| const typeImport = deriveTypeImportPath(opFile, options.typeImportPathTemplate); | ||
| lines.push(`import type { ${types.join(', ')} } from '${typeImport}';`); | ||
| } | ||
| return lines; | ||
| } | ||
| function deriveTypeImportPath(file, template) { | ||
| const base = file.split('/').pop()?.replace(/\.op$/, '') ?? 'resource'; | ||
| const module = base.split('.')[0] ?? base; | ||
| if (template) { | ||
| return template.replace(/\{module\}/g, module).replace(/\{base\}/g, base); | ||
| } | ||
| return `#modules/${module}/types/index.js`; | ||
| } | ||
| // ─── Shared SDK files ────────────────────────────────────────────────────── | ||
| /** Generate the shared SdkOptions interface file. */ | ||
| export function generateSdkOptions() { | ||
| return [ | ||
| 'export class SdkError extends Error {', | ||
| ' constructor(', | ||
| ' public readonly status: number,', | ||
| ' public readonly statusText: string,', | ||
| ' public readonly body: unknown,', | ||
| ' ) {', | ||
| ' super(`${status} ${statusText}`);', | ||
| " this.name = 'SdkError';", | ||
| ' }', | ||
| '}', | ||
| '', | ||
| 'export type SdkFetch = (url: string, init: RequestInit) => Promise<Response>;', | ||
| '', | ||
| 'export interface SdkOptions {', | ||
| ' baseUrl: string;', | ||
| ' headers?: Record<string, string> | (() => Record<string, string> | Promise<Record<string, string>>);', | ||
| ' fetch?: SdkFetch;', | ||
| ' /** Called once per request to produce a unique X-Request-ID header value */', | ||
| ' requestIdFactory?: () => string;', | ||
| '}', | ||
| '', | ||
| 'export const bigIntReplacer = (_: string, value: any): any => {', | ||
| " if (typeof value === 'bigint') {", | ||
| " return value.toString() + 'n';", | ||
| ' }', | ||
| ' return value;', | ||
| '};', | ||
| '', | ||
| 'export const bigIntReviver = (_: string, value: any): any => {', | ||
| " if (typeof value === 'string' && /^-?\\d+n$/.test(value)) {", | ||
| ' return BigInt(value.slice(0, -1));', | ||
| ' }', | ||
| ' return value;', | ||
| '};', | ||
| '', | ||
| JSON_VALUE_TYPE_DECL, | ||
| '', | ||
| 'export function createSdkFetch(options: SdkOptions): SdkFetch {', | ||
| ' const getRequestId = options.requestIdFactory ?? (() => crypto.randomUUID());', | ||
| ' return async (url: string, init: RequestInit): Promise<Response> => {', | ||
| " const baseHeaders = typeof options.headers === 'function'", | ||
| ' ? await options.headers()', | ||
| ' : options.headers ?? {};', | ||
| ' const res = await fetch(`${options.baseUrl}${url}`, {', | ||
| ' ...init,', | ||
| " headers: { ...baseHeaders, 'X-Request-ID': getRequestId(), ...init.headers as Record<string, string> },", | ||
| ' });', | ||
| ' if (!res.ok) {', | ||
| ' const text = await res.text();', | ||
| ' let body: unknown;', | ||
| ' try { body = JSON.parse(text); } catch { body = text; }', | ||
| ' throw new SdkError(res.status, res.statusText, body);', | ||
| ' }', | ||
| ' return res;', | ||
| ' };', | ||
| '}', | ||
| '', | ||
| ].join('\n'); | ||
| } | ||
| /** Generate the sdk.ts aggregator that wraps all clients into a single Sdk class. */ | ||
| export function generateSdkAggregator(clients, sdkOptionsImportPath = './sdk-options.js', sdkClassName = 'Sdk') { | ||
| const lines = []; | ||
| lines.push(`import type { SdkOptions } from '${sdkOptionsImportPath}';`); | ||
| lines.push(`import { createSdkFetch } from '${sdkOptionsImportPath}';`); | ||
| for (const c of clients) { | ||
| lines.push(`import { ${c.className} } from '${c.importPath}';`); | ||
| } | ||
| lines.push(''); | ||
| lines.push(`export class ${sdkClassName} {`); | ||
| for (const c of clients) { | ||
| lines.push(` readonly ${c.propertyName}: ${c.className};`); | ||
| } | ||
| lines.push(''); | ||
| lines.push(' constructor(options: SdkOptions) {'); | ||
| lines.push(' const sdkFetch = options.fetch ?? createSdkFetch(options);'); | ||
| for (const c of clients) { | ||
| lines.push(` this.${c.propertyName} = new ${c.className}(sdkFetch);`); | ||
| } | ||
| lines.push(' }'); | ||
| lines.push('}'); | ||
| lines.push(''); | ||
| return lines.join('\n'); | ||
| } | ||
| //# sourceMappingURL=codegen-sdk.js.map |
| {"version":3,"file":"codegen-sdk.js","sourceRoot":"","sources":["../src/codegen-sdk.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,wGAAwG,CAAC;AAe7I,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAAC,IAAgB;IAChD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,OAAO,IAAI,CAAC;QACvE,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,IAAgB,EAAE,eAA6B;IAClF,OAAO,IAAI,GAAG,CAAC,YAAY,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,IAAgB,EAAE,UAA6B,EAAE;IACzE,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,eAAe,GAAG,qBAAqB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEzD,oBAAoB;IACpB,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnB,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,0DAA0D;IAC1D,IAAI,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5C,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QACrE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;QAC3C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,KAAK,CAAC,IAAI,CAAC,yBAAyB,UAAU,YAAY,GAAG,IAAI,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,kDAAkD,GAAG,IAAI,CAAC,CAAC;IAC1E,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,yCAAyC,CAAC,CAAC;QACtD,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACrD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,2CAA2C,CAAC,CAAC;QACxD,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC9C,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+EAA+E,CAAC,CAAC;QAC5F,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,0GAA0G,CAAC,CAAC;QACvH,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACpC,KAAK,CAAC,IAAI,CAAC,kFAAkF,CAAC,CAAC;QAC/F,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,iEAAiE,CAAC,CAAC;QAC9E,KAAK,CAAC,IAAI,CAAC,mFAAmF,CAAC,CAAC;QAChG,KAAK,CAAC,IAAI,CAAC,2EAA2E,CAAC,CAAC;QACxF,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;QACnD,KAAK,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;QAC5E,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,uHAAuH,CAAC,CAAC;QACpI,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,qEAAqE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrE,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,eAAe;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;IAC5F,KAAK,CAAC,IAAI,CAAC,sBAAsB,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,OAAO,GAAG,CAAC,CAAC;IAC9E,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,gBAAgB,eAAe,IAAI,CAAC,CAAC;IAChD,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;IAE1D,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,IAAI,GAAG,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;gBAAE,SAAS;YACxC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACf,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;YACtE,KAAK,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC;AAED,6EAA6E;AAE7E,SAAS,cAAc,CAAC,KAAkB,EAAE,EAAmB,EAAE,IAAY,EAAE,OAA0B;IACrG,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,gBAAgB,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;IAC/C,MAAM,UAAU,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IAC3C,MAAM,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC;IAEpC,8DAA8D;IAC9D,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,EAAE,EAAE,EAAE,eAAe,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAE5F,wBAAwB;IACxB,MAAM,eAAe,GAAG,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,CAAC,eAAe,EAAE,QAAQ,CAAC;IAC1C,MAAM,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,eAAgB,CAAC,QAAS,CAAC,CAAC;IAE9E,QAAQ;IACR,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,CAAC;IACjD,IAAI,IAAI,EAAE,CAAC;QACP,KAAK,CAAC,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,IAAI,QAAQ,cAAc,UAAU,KAAK,CAAC,CAAC;IAE7E,6BAA6B;IAC7B,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;IAE7D,eAAe;IACf,MAAM,QAAQ,GAAG,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;IAC5B,IAAI,QAAQ,GAAG,OAAO,CAAC;IACvB,IAAI,QAAQ,EAAE,CAAC;QACX,KAAK,CAAC,IAAI,CAAC,qDAAqD,CAAC,CAAC;QAClE,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,2DAA2D,CAAC,CAAC;QACxE,KAAK,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;QAC3E,KAAK,CAAC,IAAI,CAAC,uGAAuG,CAAC,CAAC;QACpH,KAAK,CAAC,IAAI,CAAC,sDAAsD,CAAC,CAAC;QACnE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,6CAA6C,CAAC,CAAC;QAC1D,QAAQ,GAAG,OAAO,CAAC;IACvB,CAAC;IAED,sBAAsB;IACtB,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAC7B,MAAM,WAAW,GAAG,EAAE,CAAC,OAAO,EAAE,WAAW,KAAK,qBAAqB,CAAC;IACtE,MAAM,YAAY,GAAG,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;IAElC,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,QAAQ,EAAE,CAAC;QACX,SAAS,CAAC,IAAI,CAAC,eAAe,QAAQ,iBAAiB,QAAQ,IAAI,CAAC,CAAC;IACzE,CAAC;SAAM,CAAC;QACJ,SAAS,CAAC,IAAI,CAAC,UAAU,QAAQ,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,YAAY,UAAU,GAAG,CAAC,CAAC;IAE1C,IAAI,OAAO,EAAE,CAAC;QACV,IAAI,WAAW,EAAE,CAAC;YACd,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACjC,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;YAClE,SAAS,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACjE,CAAC;IACL,CAAC;IAED,IAAI,YAAY,EAAE,CAAC;QACf,IAAI,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;YAC1B,MAAM,OAAO,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;YACnE,SAAS,CAAC,OAAO,CAAC,GAAG,mEAAmE,CAAC;QAC7F,CAAC;aAAM,CAAC;YACJ,SAAS,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QAC7C,CAAC;IACL,CAAC;IAED,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,YAAY,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,uBAAuB;QACvB,KAAK,CAAC,IAAI,CAAC,6CAA6C,QAAQ,kBAAkB,UAAU,OAAO,CAAC,CAAC;IACzG,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,2CAA2C,SAAS,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1G,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,KAAK,CAAC,IAAI,CAAC,eAAe,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC/C,CAAC;SAAM,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,oEAAoE,UAAU,GAAG,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAEpB,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,6EAA6E;AAE7E,SAAS,kBAAkB,CAAC,IAAY,EAAE,MAAoB;IAC1D,2DAA2D;IAC3D,OAAO,IAAI,CAAC,OAAO,CAAC,4BAA4B,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;QAC/D,OAAO,gCAAgC,IAAI,KAAK,CAAC;IACrD,CAAC,CAAC,CAAC;AACP,CAAC;AAUD,SAAS,iBAAiB,CAAC,KAAkB,EAAE,EAAmB,EAAE,eAA6B;IAC7F,MAAM,MAAM,GAAkB,EAAE,CAAC;IAEjC,kFAAkF;IAClF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;YACrG,CAAC;QACL,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC1C,MAAM,QAAQ,GAAG,eAAe,EAAE,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAC5F,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,iBAAiB,CAAC,KAAK,CAAC,MAAM,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAC7G,CAAC;IACL,CAAC;IAED,2CAA2C;IAC3C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,EAAE,CAAC,OAAO,CAAC,WAAW,KAAK,qBAAqB,EAAE,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;QAClH,CAAC;IACL,CAAC;IAED,4CAA4C;IAC5C,IAAI,EAAE,CAAC,KAAK,EAAE,CAAC;QACX,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1E,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,QAAQ,GAAG,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC;YAChF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACvG,CAAC;IACL,CAAC;IAED,8CAA8C;IAC9C,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrH,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,KAAK,MAAM,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAClF,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,QAAQ,GAAG,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,OAAO,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC;YACtF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3E,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QACjH,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,IAAY;IACjC,OAAO,4BAA4B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC;AACxE,CAAC;AAED,6EAA6E;AAE7E,MAAM,UAAU,YAAY,CAAC,IAAiB;IAC1C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,QAAQ;YACT,OAAO,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;YACjH,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;QACvD,CAAC;QACD,KAAK,OAAO;YACR,OAAO,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;QAC1D,KAAK,QAAQ;YACT,OAAO,UAAU,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;QAC5E,KAAK,MAAM;YACP,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,SAAS;YACV,OAAO,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnF,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,cAAc;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtD,KAAK,KAAK;YACN,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB,KAAK,MAAM;YACP,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpC,KAAK,cAAc;YACf,OAAO,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC7C;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAChC,QAAQ,IAAI,EAAE,CAAC;QACX,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,KAAK,CAAC;QACX,KAAK,MAAM;YACP,OAAO,QAAQ,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,KAAK;YACN,OAAO,QAAQ,CAAC;QACpB,KAAK,QAAQ;YACT,OAAO,QAAQ,CAAC;QACpB,KAAK,SAAS;YACV,OAAO,SAAS,CAAC;QACrB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU;YACX,OAAO,QAAQ,CAAC;QACpB,KAAK,MAAM;YACP,OAAO,MAAM,CAAC;QAClB,KAAK,KAAK;YACN,OAAO,KAAK,CAAC;QACjB,KAAK,SAAS;YACV,OAAO,SAAS,CAAC;QACrB,KAAK,QAAQ;YACT,OAAO,yBAAyB,CAAC;QACrC,KAAK,QAAQ;YACT,OAAO,MAAM,CAAC;QAClB,KAAK,MAAM;YACP,OAAO,WAAW,CAAC;QACvB;YACI,OAAO,SAAS,CAAC;IACzB,CAAC;AACL,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAmB;IAC7C,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;QAC3B,MAAM,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAClC,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,KAAK,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAiB,EAAE,eAA6B;IAC9E,IAAI,CAAC,eAAe,IAAI,eAAe,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAC9E,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAC5E,KAAK,OAAO,CAAC,CAAC,CAAC;YACX,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;YAC5D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC;YACjH,OAAO,WAAW,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC;QACvD,CAAC;QACD,KAAK,cAAc;YACf,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpF,KAAK,OAAO;YACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,CAAC,EAAE,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACpF,KAAK,cAAc;YACf,OAAO,KAAK,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;QAClJ,KAAK,MAAM;YACP,OAAO,iBAAiB,CAAC,IAAI,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC;QAC1D;YACI,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;AACL,CAAC;AAED,6EAA6E;AAE7E,SAAS,gBAAgB,CAAC,EAAmB,EAAE,KAAkB;IAC7D,IAAI,EAAE,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC,GAAG,CAAC;IAC1B,OAAO,eAAe,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD,CAAC;AAED,SAAS,eAAe,CAAC,MAAc,EAAE,IAAY;IACjD,+CAA+C;IAC/C,qCAAqC;IACrC,+BAA+B;IAC/B,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAa,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAE/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QACzB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,uCAAuC;YACvC,MAAM,SAAS,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9E,CAAC;aAAM,CAAC;YACJ,iCAAiC;YACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACnD,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;gBACxB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,CAAC;QACL,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,CAAC,CAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,8EAA8E;AAE9E,SAAS,cAAc,CAAC,IAAY;IAChC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,OAAO,IAAI;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAChD,IAAI,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAC9C,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAY;IACjD,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,6EAA6E;AAE7E,SAAS,YAAY,CAAC,IAAgB,EAAE,eAA6B;IACjE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;QACnG,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACrC,sEAAsE;QACtE,sBAAsB,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC5C,2BAA2B,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QAClE,KAAK,MAAM,EAAE,IAAI,SAAS,EAAE,CAAC;YACzB,IAAI,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC;gBACvB,mBAAmB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;gBAChD,wBAAwB,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAC1E,CAAC;YACD,KAAK,MAAM,IAAI,IAAI,EAAE,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,IAAI,CAAC,QAAQ;oBAAE,mBAAmB,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YACjE,CAAC;YACD,sBAAsB,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,2BAA2B,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;YAC9D,sBAAsB,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC1C,2BAA2B,CAAC,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;QACpE,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;AAC7B,CAAC;AAED,qEAAqE;AACrE,SAAS,2BAA2B,CAAC,MAA+B,EAAE,GAAgB,EAAE,eAA6B;IACjH,IAAI,CAAC,MAAM,IAAI,CAAC,eAAe;QAAE,OAAO;IACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,OAAO,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,wBAAwB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;QAC/D,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,wBAAwB,CAAC,MAAM,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;IAC3D,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,SAAS,wBAAwB,CAAC,IAAiB,EAAE,GAAgB,EAAE,eAA6B;IAChG,IAAI,CAAC,eAAe;QAAE,OAAO;IAC7B,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC;YACjE,MAAM;QACV,KAAK,OAAO;YACR,wBAAwB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;YAC1D,MAAM;QACV,KAAK,cAAc,CAAC;QACpB,KAAK,OAAO;YACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;YAC7E,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC,CAAC;YACjF,MAAM;QACV,KAAK,MAAM;YACP,wBAAwB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,EAAE,eAAe,CAAC,CAAC;YAC3D,MAAM;IACd,CAAC;AACL,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA+B,EAAE,GAAgB;IAC7E,IAAI,CAAC,MAAM;QAAE,OAAO;IACpB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC7B,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;YACzB,mBAAmB,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QACzC,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACrC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,IAAgB;IAClC,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,CAAC,GAA4B,EAAE,EAAE;gBAC3C,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;oBAAE,OAAO,KAAK,CAAC;gBAClD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,OAAO,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;gBAC9E,OAAO,eAAe,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACxC,CAAC,CAAC;YACF,IACI,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,IAAI,eAAe,CAAC,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACtE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,eAAe,CAAC,CAAC,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACzE,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBAC7D,OAAO,IAAI,CAAC;QAClB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAiB,EAAE,GAAgB;IAC5D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAChB,KAAK,KAAK;YACN,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjD,MAAM;QACV,KAAK,OAAO;YACR,mBAAmB,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACrD,MAAM;QACV,KAAK,QAAQ;YACT,mBAAmB,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,OAAO;YACR,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;YACvD,MAAM;QACV,KAAK,MAAM;YACP,mBAAmB,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YACrC,MAAM;QACV,KAAK,cAAc;YACf,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YAC3D,MAAM;IACd,CAAC;AACL,CAAC;AAED,6EAA6E;AAE7E,SAAS,mBAAmB,CAAC,KAAe,EAAE,MAAc,EAAE,OAA0B;IACpF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;IAE3C,IAAI,aAAa,IAAI,OAAO,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,EAAoB,CAAC;QAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;QAEhC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACvB,MAAM,WAAW,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,WAAW,EAAE,CAAC;gBACd,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;gBAC5C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACjB,MAAM,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACnC,CAAC;iBAAM,CAAC;gBACJ,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QAED,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACjC,KAAK,MAAM,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;YACxC,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;YACzC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAClC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;QAC5E,CAAC;QAED,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC5B,MAAM,UAAU,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,iBAAiB,IAAI,cAAc,UAAU,OAAO,CAAC,CAAC;QACrE,CAAC;IACL,CAAC;SAAM,CAAC;QACJ,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAChF,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,UAAU,IAAI,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,IAAY,EAAE,QAAiB;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,IAAI,UAAU,CAAC;IACvE,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1C,IAAI,QAAQ,EAAE,CAAC;QACX,OAAO,QAAQ,CAAC,OAAO,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAC9E,CAAC;IACD,OAAO,YAAY,MAAM,iBAAiB,CAAC;AAC/C,CAAC;AAGD,8EAA8E;AAE9E,qDAAqD;AACrD,MAAM,UAAU,kBAAkB;IAC9B,OAAO;QACH,uCAAuC;QACvC,kBAAkB;QAClB,yCAAyC;QACzC,6CAA6C;QAC7C,wCAAwC;QACxC,SAAS;QACT,2CAA2C;QAC3C,mCAAmC;QACnC,OAAO;QACP,GAAG;QACH,EAAE;QACF,+EAA+E;QAC/E,EAAE;QACF,+BAA+B;QAC/B,sBAAsB;QACtB,0GAA0G;QAC1G,uBAAuB;QACvB,kFAAkF;QAClF,sCAAsC;QACtC,GAAG;QACH,EAAE;QACF,iEAAiE;QACjE,wCAAwC;QACxC,0CAA0C;QAC1C,OAAO;QACP,mBAAmB;QACnB,IAAI;QACJ,EAAE;QACF,gEAAgE;QAChE,mEAAmE;QACnE,4CAA4C;QAC5C,OAAO;QACP,mBAAmB;QACnB,IAAI;QACJ,EAAE;QACF,oBAAoB;QACpB,EAAE;QACF,iEAAiE;QACjE,mFAAmF;QACnF,2EAA2E;QAC3E,qEAAqE;QACrE,uCAAuC;QACvC,sCAAsC;QACtC,+DAA+D;QAC/D,sBAAsB;QACtB,uHAAuH;QACvH,aAAa;QACb,wBAAwB;QACxB,4CAA4C;QAC5C,gCAAgC;QAChC,qEAAqE;QACrE,mEAAmE;QACnE,WAAW;QACX,qBAAqB;QACrB,QAAQ;QACR,GAAG;QACH,EAAE;KACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAQD,qFAAqF;AACrF,MAAM,UAAU,qBAAqB,CAAC,OAAwB,EAAE,oBAAoB,GAAG,kBAAkB,EAAE,YAAY,GAAG,KAAK;IAC3H,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,oCAAoC,oBAAoB,IAAI,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,mCAAmC,oBAAoB,IAAI,CAAC,CAAC;IACxE,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,SAAS,YAAY,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC;IACpE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,KAAK,CAAC,IAAI,CAAC,gBAAgB,YAAY,IAAI,CAAC,CAAC;IAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,YAAY,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;IAClE,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IACjF,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,YAAY,UAAU,CAAC,CAAC,SAAS,aAAa,CAAC,CAAC;IACjF,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"} |
-103
| import type { OpenApiServerEntry, OpenApiSecurityScheme, OpenApiConfig } from '@maroonedsoftware/contractkit'; | ||
| export type { OpenApiServerEntry, OpenApiSecurityScheme, OpenApiConfig }; | ||
| export interface TypesConfig { | ||
| output?: string; | ||
| include?: string[]; | ||
| } | ||
| export interface RoutesConfig { | ||
| output?: string; | ||
| include?: string[]; | ||
| servicePathTemplate?: string; | ||
| typeImportPathTemplate?: string; | ||
| } | ||
| export interface SdkTypesConfig { | ||
| output?: string; | ||
| include?: string[]; | ||
| } | ||
| export interface SdkClientsConfig { | ||
| output?: string; | ||
| include?: string[]; | ||
| typeImportPathTemplate?: string; | ||
| } | ||
| export interface SdkConfig { | ||
| baseDir?: string; | ||
| name?: string; | ||
| output?: string; | ||
| types?: SdkTypesConfig; | ||
| clients?: SdkClientsConfig; | ||
| } | ||
| export interface ServerConfig { | ||
| baseDir?: string; | ||
| types?: TypesConfig; | ||
| routes?: RoutesConfig; | ||
| } | ||
| export interface HmacSecurityScheme { | ||
| type: 'hmac'; | ||
| /** Request header carrying the signature (e.g. 'X-Signature'). */ | ||
| header: string; | ||
| /** Name of the environment variable holding the HMAC secret. */ | ||
| secretEnv: string; | ||
| /** HMAC algorithm passed to createHmac (e.g. 'sha256', 'sha512'). */ | ||
| algorithm: string; | ||
| /** Output encoding for hmac.digest() ('hex' | 'base64' | 'base64url'). */ | ||
| digest: 'hex' | 'base64' | 'base64url'; | ||
| } | ||
| export type SecuritySchemeConfig = OpenApiSecurityScheme | HmacSecurityScheme; | ||
| /** Type guard — narrows a SecuritySchemeConfig to HmacSecurityScheme. */ | ||
| export declare function isHmacScheme(scheme: SecuritySchemeConfig): scheme is HmacSecurityScheme; | ||
| export interface SecurityConfig { | ||
| /** Global default security scheme name used when an operation has no explicit security declaration. */ | ||
| default?: string; | ||
| /** Security scheme definitions. HMAC schemes generate inline middleware; OpenAPI schemes are emitted into components.securitySchemes. */ | ||
| schemes?: Record<string, SecuritySchemeConfig>; | ||
| } | ||
| export interface MarkdownConfig { | ||
| baseDir?: string; | ||
| output?: string; | ||
| } | ||
| export interface DocsConfig { | ||
| openapi?: OpenApiConfig; | ||
| markdown?: MarkdownConfig; | ||
| } | ||
| export interface DslConfig { | ||
| rootDir?: string; | ||
| cache?: boolean | string; | ||
| server?: ServerConfig; | ||
| sdk?: SdkConfig; | ||
| docs?: DocsConfig; | ||
| patterns?: string[]; | ||
| /** Run prettier on generated TypeScript files after compilation. Default: false. */ | ||
| prettier?: boolean; | ||
| /** Security configuration: default scheme and scheme definitions. */ | ||
| security?: SecurityConfig; | ||
| } | ||
| export interface ResolvedCacheConfig { | ||
| enabled: boolean; | ||
| filename: string; | ||
| } | ||
| /** | ||
| * Load config from an explicit path, or search upward from `startDir` | ||
| * for contract-dsl.config.json. | ||
| */ | ||
| export declare function loadConfig(configPath?: string, startDir?: string): DslConfig; | ||
| export interface ResolvedConfig { | ||
| patterns: string[]; | ||
| rootDir: string; | ||
| cache: ResolvedCacheConfig; | ||
| server: Required<ServerConfig>; | ||
| sdk?: SdkConfig; | ||
| docs?: DocsConfig; | ||
| security?: SecurityConfig; | ||
| watch: boolean; | ||
| force: boolean; | ||
| prettier: boolean; | ||
| } | ||
| /** Merge config file values with CLI flags. */ | ||
| export declare function mergeConfig( | ||
| config: DslConfig, | ||
| cliArgs: { | ||
| watch: boolean; | ||
| force: boolean; | ||
| }, | ||
| ): ResolvedConfig; | ||
| //# sourceMappingURL=config.d.ts.map |
| {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} |
| import { readFileSync } from 'node:fs'; | ||
| import { resolve, dirname, join } from 'node:path'; | ||
| import { DEFAULT_CACHE_FILENAME } from './cache.js'; | ||
| import { homedir } from 'node:os'; | ||
| /** Type guard — narrows a SecuritySchemeConfig to HmacSecurityScheme. */ | ||
| export function isHmacScheme(scheme) { | ||
| return 'secretEnv' in scheme; | ||
| } | ||
| const CONFIG_FILENAME = 'contract-dsl.config.json'; | ||
| /** | ||
| * Load config from an explicit path, or search upward from `startDir` | ||
| * for contract-dsl.config.json. | ||
| */ | ||
| export function loadConfig(configPath, startDir = process.cwd()) { | ||
| if (configPath) { | ||
| const resolved = resolve(configPath); | ||
| try { | ||
| const text = readFileSync(resolved, 'utf-8'); | ||
| return JSON.parse(text); | ||
| } catch (err) { | ||
| throw new Error(`Failed to load config from ${resolved}: ${err.message}`); | ||
| } | ||
| } | ||
| let dir = resolve(startDir); | ||
| while (true) { | ||
| const candidate = join(dir, CONFIG_FILENAME); | ||
| try { | ||
| const text = readFileSync(candidate, 'utf-8'); | ||
| return JSON.parse(text); | ||
| } catch { | ||
| // File not found or invalid -- walk up | ||
| } | ||
| const parent = dirname(dir); | ||
| if (parent === dir) break; | ||
| dir = parent; | ||
| } | ||
| return {}; | ||
| } | ||
| /** Merge config file values with CLI flags. */ | ||
| export function mergeConfig(config, cliArgs) { | ||
| const types = config.server?.types ?? {}; | ||
| const routes = config.server?.routes ?? {}; | ||
| const sdk = config.sdk; | ||
| const patterns = [ | ||
| ...(types.include ?? []), | ||
| ...(routes.include ?? []), | ||
| ...(sdk?.types?.include ?? []), | ||
| ...(sdk?.clients?.include ?? []), | ||
| ...(config.patterns ?? []), | ||
| ]; | ||
| const cache = | ||
| typeof config.cache === 'string' | ||
| ? { enabled: true, filename: config.cache } | ||
| : { enabled: config.cache === true, filename: DEFAULT_CACHE_FILENAME }; | ||
| let rootDir = config.rootDir ?? '.'; | ||
| if (rootDir.startsWith('~')) { | ||
| rootDir = homedir() + rootDir.slice(1); | ||
| } | ||
| return { | ||
| patterns, | ||
| rootDir: resolve(rootDir), | ||
| cache, | ||
| server: { baseDir: config.server?.baseDir ?? '.', types, routes }, | ||
| sdk, | ||
| docs: config.docs, | ||
| security: config.security, | ||
| watch: cliArgs.watch, | ||
| force: cliArgs.force, | ||
| prettier: config.prettier ?? false, | ||
| }; | ||
| } | ||
| //# sourceMappingURL=config.js.map |
| {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"} |
| export interface Diagnostic { | ||
| file: string; | ||
| line: number; | ||
| message: string; | ||
| severity: 'error' | 'warning'; | ||
| } | ||
| export declare class DiagnosticCollector { | ||
| private diagnostics; | ||
| error(file: string, line: number, message: string): void; | ||
| warn(file: string, line: number, message: string): void; | ||
| hasErrors(): boolean; | ||
| getAll(): Diagnostic[]; | ||
| report(): void; | ||
| } | ||
| //# sourceMappingURL=diagnostics.d.ts.map |
| {"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAC;CAC/B;AAED,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,WAAW,CAAoB;IAEvC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIxD,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAIvD,SAAS,IAAI,OAAO;IAIpB,MAAM,IAAI,UAAU,EAAE;IAItB,MAAM,IAAI,IAAI;CAWf"} |
| export class DiagnosticCollector { | ||
| diagnostics = []; | ||
| error(file, line, message) { | ||
| this.diagnostics.push({ file, line, message, severity: 'error' }); | ||
| } | ||
| warn(file, line, message) { | ||
| this.diagnostics.push({ file, line, message, severity: 'warning' }); | ||
| } | ||
| hasErrors() { | ||
| return this.diagnostics.some(d => d.severity === 'error'); | ||
| } | ||
| getAll() { | ||
| return [...this.diagnostics]; | ||
| } | ||
| report() { | ||
| for (const d of this.diagnostics) { | ||
| const prefix = d.severity === 'error' ? '\x1b[31mERROR\x1b[0m' : '\x1b[33mWARN\x1b[0m'; | ||
| console.error(`${prefix} ${d.file}:${d.line} ${d.message}`); | ||
| } | ||
| const errors = this.diagnostics.filter(d => d.severity === 'error').length; | ||
| const warns = this.diagnostics.filter(d => d.severity === 'warning').length; | ||
| if (errors > 0 || warns > 0) { | ||
| console.error(`\n${errors} error(s), ${warns} warning(s)`); | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=diagnostics.js.map |
| {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../src/diagnostics.ts"],"names":[],"mappings":"AAOA,MAAM,OAAO,mBAAmB;IACtB,WAAW,GAAiB,EAAE,CAAC;IAEvC,KAAK,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;QAC/C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,CAAC,IAAY,EAAE,IAAY,EAAE,OAAe;QAC9C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;IACtE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM;QACJ,OAAO,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,sBAAsB,CAAC,CAAC,CAAC,qBAAqB,CAAC;YACvF,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,MAAM,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;QAC5E,IAAI,MAAM,GAAG,CAAC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,MAAM,cAAc,KAAK,aAAa,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;CACF"} |
| // src/import-openapi.ts | ||
| import { writeFileSync, mkdirSync } from 'fs'; | ||
| import { resolve, join } from 'path'; | ||
| import { convertOpenApiToCk } from '@maroonedsoftware/openapi-to-ck'; | ||
| function parseImportArgs(argv) { | ||
| const args = argv.slice(3); | ||
| let specPath = ''; | ||
| let output = '.'; | ||
| let split = 'by-tag'; | ||
| for (let i = 0; i < args.length; i++) { | ||
| const arg = args[i]; | ||
| if (arg === '--output' || arg === '-o') { | ||
| output = args[++i] ?? '.'; | ||
| } else if (arg === '--split') { | ||
| const val = args[++i]; | ||
| if (val === 'single' || val === 'by-tag') split = val; | ||
| } else if (!arg.startsWith('-')) { | ||
| specPath = arg; | ||
| } | ||
| } | ||
| return { specPath, output, split }; | ||
| } | ||
| async function runImportOpenApi() { | ||
| const args = parseImportArgs(process.argv); | ||
| if (!args.specPath) { | ||
| console.error('Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]'); | ||
| console.error(''); | ||
| console.error('Options:'); | ||
| console.error(' -o, --output <dir> Output directory for .ck files (default: current directory)'); | ||
| console.error(' --split <mode> Split mode: "single" or "by-tag" (default: by-tag)'); | ||
| process.exit(1); | ||
| } | ||
| console.log(`Converting ${args.specPath} \u2192 .ck files...`); | ||
| const result = await convertOpenApiToCk({ | ||
| input: resolve(args.specPath), | ||
| split: args.split, | ||
| includeComments: true, | ||
| onWarning: w => { | ||
| const prefix = w.severity === 'warn' ? '\u26A0' : '\u2139'; | ||
| console.warn(` ${prefix} ${w.path}: ${w.message}`); | ||
| }, | ||
| }); | ||
| const outputDir = resolve(args.output); | ||
| mkdirSync(outputDir, { recursive: true }); | ||
| for (const [filename, content] of result.files) { | ||
| const outPath = join(outputDir, filename); | ||
| writeFileSync(outPath, content, 'utf-8'); | ||
| console.log(` \u2713 ${outPath}`); | ||
| } | ||
| if (result.warnings.length > 0) { | ||
| console.log(` | ||
| ${result.warnings.length} warning(s) during conversion.`); | ||
| } | ||
| console.log(` | ||
| Generated ${result.files.size} file(s).`); | ||
| } | ||
| export { runImportOpenApi }; | ||
| //# sourceMappingURL=import-openapi-27E3RGQR.js.map |
| {"version":3,"sources":["../src/import-openapi.ts"],"sourcesContent":["import { writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { convertOpenApiToCk } from '@maroonedsoftware/openapi-to-ck';\nimport type { Warning } from '@maroonedsoftware/openapi-to-ck';\n\ninterface ImportArgs {\n specPath: string;\n output: string;\n split: 'single' | 'by-tag';\n}\n\nfunction parseImportArgs(argv: string[]): ImportArgs {\n const args = argv.slice(3); // skip node, script, 'import-openapi'\n let specPath = '';\n let output = '.';\n let split: 'single' | 'by-tag' = 'by-tag';\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--output' || arg === '-o') {\n output = args[++i] ?? '.';\n } else if (arg === '--split') {\n const val = args[++i];\n if (val === 'single' || val === 'by-tag') split = val;\n } else if (!arg.startsWith('-')) {\n specPath = arg;\n }\n }\n\n return { specPath, output, split };\n}\n\nexport async function runImportOpenApi(): Promise<void> {\n const args = parseImportArgs(process.argv);\n\n if (!args.specPath) {\n console.error('Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]');\n console.error('');\n console.error('Options:');\n console.error(' -o, --output <dir> Output directory for .ck files (default: current directory)');\n console.error(' --split <mode> Split mode: \"single\" or \"by-tag\" (default: by-tag)');\n process.exit(1);\n }\n\n console.log(`Converting ${args.specPath} → .ck files...`);\n\n const result = await convertOpenApiToCk({\n input: resolve(args.specPath),\n split: args.split,\n includeComments: true,\n onWarning: (w: Warning) => {\n const prefix = w.severity === 'warn' ? '⚠' : 'ℹ';\n console.warn(` ${prefix} ${w.path}: ${w.message}`);\n },\n });\n\n const outputDir = resolve(args.output);\n mkdirSync(outputDir, { recursive: true });\n\n for (const [filename, content] of result.files) {\n const outPath = join(outputDir, filename);\n writeFileSync(outPath, content, 'utf-8');\n console.log(` ✓ ${outPath}`);\n }\n\n if (result.warnings.length > 0) {\n console.log(`\\n${result.warnings.length} warning(s) during conversion.`);\n }\n\n console.log(`\\nGenerated ${result.files.size} file(s).`);\n}\n"],"mappings":";AAAA,SAAS,eAAe,iBAAiB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,0BAA0B;AASnC,SAAS,gBAAgB,MAA4B;AACnD,QAAM,OAAO,KAAK,MAAM,CAAC;AACzB,MAAI,WAAW;AACf,MAAI,SAAS;AACb,MAAI,QAA6B;AAEjC,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,QAAQ,cAAc,QAAQ,MAAM;AACtC,eAAS,KAAK,EAAE,CAAC,KAAK;AAAA,IACxB,WAAW,QAAQ,WAAW;AAC5B,YAAM,MAAM,KAAK,EAAE,CAAC;AACpB,UAAI,QAAQ,YAAY,QAAQ,SAAU,SAAQ;AAAA,IACpD,WAAW,CAAC,IAAI,WAAW,GAAG,GAAG;AAC/B,iBAAW;AAAA,IACb;AAAA,EACF;AAEA,SAAO,EAAE,UAAU,QAAQ,MAAM;AACnC;AAEA,eAAsB,mBAAkC;AACtD,QAAM,OAAO,gBAAgB,QAAQ,IAAI;AAEzC,MAAI,CAAC,KAAK,UAAU;AAClB,YAAQ,MAAM,wFAAwF;AACtG,YAAQ,MAAM,EAAE;AAChB,YAAQ,MAAM,UAAU;AACxB,YAAQ,MAAM,oFAAoF;AAClG,YAAQ,MAAM,2EAA2E;AACzF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,UAAQ,IAAI,cAAc,KAAK,QAAQ,sBAAiB;AAExD,QAAM,SAAS,MAAM,mBAAmB;AAAA,IACtC,OAAO,QAAQ,KAAK,QAAQ;AAAA,IAC5B,OAAO,KAAK;AAAA,IACZ,iBAAiB;AAAA,IACjB,WAAW,CAAC,MAAe;AACzB,YAAM,SAAS,EAAE,aAAa,SAAS,WAAM;AAC7C,cAAQ,KAAK,KAAK,MAAM,KAAK,EAAE,IAAI,KAAK,EAAE,OAAO,EAAE;AAAA,IACrD;AAAA,EACF,CAAC;AAED,QAAM,YAAY,QAAQ,KAAK,MAAM;AACrC,YAAU,WAAW,EAAE,WAAW,KAAK,CAAC;AAExC,aAAW,CAAC,UAAU,OAAO,KAAK,OAAO,OAAO;AAC9C,UAAM,UAAU,KAAK,WAAW,QAAQ;AACxC,kBAAc,SAAS,SAAS,OAAO;AACvC,YAAQ,IAAI,aAAQ,OAAO,EAAE;AAAA,EAC/B;AAEA,MAAI,OAAO,SAAS,SAAS,GAAG;AAC9B,YAAQ,IAAI;AAAA,EAAK,OAAO,SAAS,MAAM,gCAAgC;AAAA,EACzE;AAEA,UAAQ,IAAI;AAAA,YAAe,OAAO,MAAM,IAAI,WAAW;AACzD;","names":[]} |
| import { | ||
| __name | ||
| } from "./chunk-7QVYU63E.js"; | ||
| // src/import-openapi.ts | ||
| import { writeFileSync, mkdirSync } from "fs"; | ||
| import { resolve, join } from "path"; | ||
| import { convertOpenApiToCk } from "@maroonedsoftware/openapi-to-ck"; | ||
| function parseImportArgs(argv) { | ||
| const args = argv.slice(3); | ||
| let specPath = ""; | ||
| let output = "."; | ||
| let split = "by-tag"; | ||
| for (let i = 0; i < args.length; i++) { | ||
| const arg = args[i]; | ||
| if (arg === "--output" || arg === "-o") { | ||
| output = args[++i] ?? "."; | ||
| } else if (arg === "--split") { | ||
| const val = args[++i]; | ||
| if (val === "single" || val === "by-tag") split = val; | ||
| } else if (!arg.startsWith("-")) { | ||
| specPath = arg; | ||
| } | ||
| } | ||
| return { | ||
| specPath, | ||
| output, | ||
| split | ||
| }; | ||
| } | ||
| __name(parseImportArgs, "parseImportArgs"); | ||
| async function runImportOpenApi() { | ||
| const args = parseImportArgs(process.argv); | ||
| if (!args.specPath) { | ||
| console.error("Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]"); | ||
| console.error(""); | ||
| console.error("Options:"); | ||
| console.error(" -o, --output <dir> Output directory for .ck files (default: current directory)"); | ||
| console.error(' --split <mode> Split mode: "single" or "by-tag" (default: by-tag)'); | ||
| process.exit(1); | ||
| } | ||
| console.log(`Converting ${args.specPath} \u2192 .ck files...`); | ||
| const result = await convertOpenApiToCk({ | ||
| input: resolve(args.specPath), | ||
| split: args.split, | ||
| includeComments: true, | ||
| onWarning: /* @__PURE__ */ __name((w) => { | ||
| const prefix = w.severity === "warn" ? "\u26A0" : "\u2139"; | ||
| console.warn(` ${prefix} ${w.path}: ${w.message}`); | ||
| }, "onWarning") | ||
| }); | ||
| const outputDir = resolve(args.output); | ||
| mkdirSync(outputDir, { | ||
| recursive: true | ||
| }); | ||
| for (const [filename, content] of result.files) { | ||
| const outPath = join(outputDir, filename); | ||
| writeFileSync(outPath, content, "utf-8"); | ||
| console.log(` \u2713 ${outPath}`); | ||
| } | ||
| if (result.warnings.length > 0) { | ||
| console.log(` | ||
| ${result.warnings.length} warning(s) during conversion.`); | ||
| } | ||
| console.log(` | ||
| Generated ${result.files.size} file(s).`); | ||
| } | ||
| __name(runImportOpenApi, "runImportOpenApi"); | ||
| export { | ||
| runImportOpenApi | ||
| }; | ||
| //# sourceMappingURL=import-openapi-XGD57T2J.js.map |
| {"version":3,"sources":["../src/import-openapi.ts"],"sourcesContent":["import { writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { convertOpenApiToCk } from '@maroonedsoftware/openapi-to-ck';\nimport type { Warning } from '@maroonedsoftware/openapi-to-ck';\n\ninterface ImportArgs {\n specPath: string;\n output: string;\n split: 'single' | 'by-tag';\n}\n\nfunction parseImportArgs(argv: string[]): ImportArgs {\n const args = argv.slice(3); // skip node, script, 'import-openapi'\n let specPath = '';\n let output = '.';\n let split: 'single' | 'by-tag' = 'by-tag';\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--output' || arg === '-o') {\n output = args[++i] ?? '.';\n } else if (arg === '--split') {\n const val = args[++i];\n if (val === 'single' || val === 'by-tag') split = val;\n } else if (!arg.startsWith('-')) {\n specPath = arg;\n }\n }\n\n return { specPath, output, split };\n}\n\nexport async function runImportOpenApi(): Promise<void> {\n const args = parseImportArgs(process.argv);\n\n if (!args.specPath) {\n console.error('Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]');\n console.error('');\n console.error('Options:');\n console.error(' -o, --output <dir> Output directory for .ck files (default: current directory)');\n console.error(' --split <mode> Split mode: \"single\" or \"by-tag\" (default: by-tag)');\n process.exit(1);\n }\n\n console.log(`Converting ${args.specPath} → .ck files...`);\n\n const result = await convertOpenApiToCk({\n input: resolve(args.specPath),\n split: args.split,\n includeComments: true,\n onWarning: (w: Warning) => {\n const prefix = w.severity === 'warn' ? '⚠' : 'ℹ';\n console.warn(` ${prefix} ${w.path}: ${w.message}`);\n },\n });\n\n const outputDir = resolve(args.output);\n mkdirSync(outputDir, { recursive: true });\n\n for (const [filename, content] of result.files) {\n const outPath = join(outputDir, filename);\n writeFileSync(outPath, content, 'utf-8');\n console.log(` ✓ ${outPath}`);\n }\n\n if (result.warnings.length > 0) {\n console.log(`\\n${result.warnings.length} warning(s) during conversion.`);\n }\n\n console.log(`\\nGenerated ${result.files.size} file(s).`);\n}\n"],"mappings":";;;;;AAAA,SAASA,eAAeC,iBAAiB;AACzC,SAASC,SAASC,YAAY;AAC9B,SAASC,0BAA0B;AASnC,SAASC,gBAAgBC,MAAc;AACnC,QAAMC,OAAOD,KAAKE,MAAM,CAAA;AACxB,MAAIC,WAAW;AACf,MAAIC,SAAS;AACb,MAAIC,QAA6B;AAEjC,WAASC,IAAI,GAAGA,IAAIL,KAAKM,QAAQD,KAAK;AAClC,UAAME,MAAMP,KAAKK,CAAAA;AACjB,QAAIE,QAAQ,cAAcA,QAAQ,MAAM;AACpCJ,eAASH,KAAK,EAAEK,CAAAA,KAAM;IAC1B,WAAWE,QAAQ,WAAW;AAC1B,YAAMC,MAAMR,KAAK,EAAEK,CAAAA;AACnB,UAAIG,QAAQ,YAAYA,QAAQ,SAAUJ,SAAQI;IACtD,WAAW,CAACD,IAAIE,WAAW,GAAA,GAAM;AAC7BP,iBAAWK;IACf;EACJ;AAEA,SAAO;IAAEL;IAAUC;IAAQC;EAAM;AACrC;AAnBSN;AAqBT,eAAsBY,mBAAAA;AAClB,QAAMV,OAAOF,gBAAgBa,QAAQZ,IAAI;AAEzC,MAAI,CAACC,KAAKE,UAAU;AAChBU,YAAQC,MAAM,wFAAA;AACdD,YAAQC,MAAM,EAAA;AACdD,YAAQC,MAAM,UAAA;AACdD,YAAQC,MAAM,oFAAA;AACdD,YAAQC,MAAM,2EAAA;AACdF,YAAQG,KAAK,CAAA;EACjB;AAEAF,UAAQG,IAAI,cAAcf,KAAKE,QAAQ,sBAAiB;AAExD,QAAMc,SAAS,MAAMC,mBAAmB;IACpCC,OAAOC,QAAQnB,KAAKE,QAAQ;IAC5BE,OAAOJ,KAAKI;IACZgB,iBAAiB;IACjBC,WAAW,wBAACC,MAAAA;AACR,YAAMC,SAASD,EAAEE,aAAa,SAAS,WAAM;AAC7CZ,cAAQa,KAAK,KAAKF,MAAAA,KAAWD,EAAEI,IAAI,KAAKJ,EAAEK,OAAO,EAAE;IACvD,GAHW;EAIf,CAAA;AAEA,QAAMC,YAAYT,QAAQnB,KAAKG,MAAM;AACrC0B,YAAUD,WAAW;IAAEE,WAAW;EAAK,CAAA;AAEvC,aAAW,CAACC,UAAUC,OAAAA,KAAYhB,OAAOiB,OAAO;AAC5C,UAAMC,UAAUC,KAAKP,WAAWG,QAAAA;AAChCK,kBAAcF,SAASF,SAAS,OAAA;AAChCpB,YAAQG,IAAI,aAAQmB,OAAAA,EAAS;EACjC;AAEA,MAAIlB,OAAOqB,SAAS/B,SAAS,GAAG;AAC5BM,YAAQG,IAAI;EAAKC,OAAOqB,SAAS/B,MAAM,gCAAgC;EAC3E;AAEAM,UAAQG,IAAI;YAAeC,OAAOiB,MAAMK,IAAI,WAAW;AAC3D;AAtCsB5B;","names":["writeFileSync","mkdirSync","resolve","join","convertOpenApiToCk","parseImportArgs","argv","args","slice","specPath","output","split","i","length","arg","val","startsWith","runImportOpenApi","process","console","error","exit","log","result","convertOpenApiToCk","input","resolve","includeComments","onWarning","w","prefix","severity","warn","path","message","outputDir","mkdirSync","recursive","filename","content","files","outPath","join","writeFileSync","warnings","size"]} |
| import { __name } from './chunk-7QVYU63E.js'; | ||
| // src/import-openapi.ts | ||
| import { writeFileSync, mkdirSync } from 'fs'; | ||
| import { resolve, join } from 'path'; | ||
| import { convertOpenApiToCk } from '@maroonedsoftware/openapi-to-ck'; | ||
| function parseImportArgs(argv) { | ||
| const args = argv.slice(3); | ||
| let specPath = ''; | ||
| let output = '.'; | ||
| let split = 'by-tag'; | ||
| for (let i = 0; i < args.length; i++) { | ||
| const arg = args[i]; | ||
| if (arg === '--output' || arg === '-o') { | ||
| output = args[++i] ?? '.'; | ||
| } else if (arg === '--split') { | ||
| const val = args[++i]; | ||
| if (val === 'single' || val === 'by-tag') split = val; | ||
| } else if (!arg.startsWith('-')) { | ||
| specPath = arg; | ||
| } | ||
| } | ||
| return { | ||
| specPath, | ||
| output, | ||
| split, | ||
| }; | ||
| } | ||
| __name(parseImportArgs, 'parseImportArgs'); | ||
| async function runImportOpenApi() { | ||
| const args = parseImportArgs(process.argv); | ||
| if (!args.specPath) { | ||
| console.error('Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]'); | ||
| console.error(''); | ||
| console.error('Options:'); | ||
| console.error(' -o, --output <dir> Output directory for .ck files (default: current directory)'); | ||
| console.error(' --split <mode> Split mode: "single" or "by-tag" (default: by-tag)'); | ||
| process.exit(1); | ||
| } | ||
| console.log(`Converting ${args.specPath} \u2192 .ck files...`); | ||
| const result = await convertOpenApiToCk({ | ||
| input: resolve(args.specPath), | ||
| split: args.split, | ||
| includeComments: true, | ||
| onWarning: /* @__PURE__ */ __name(w => { | ||
| const prefix = w.severity === 'warn' ? '\u26A0' : '\u2139'; | ||
| console.warn(` ${prefix} ${w.path}: ${w.message}`); | ||
| }, 'onWarning'), | ||
| }); | ||
| const outputDir = resolve(args.output); | ||
| mkdirSync(outputDir, { | ||
| recursive: true, | ||
| }); | ||
| for (const [filename, content] of result.files) { | ||
| const outPath = join(outputDir, filename); | ||
| writeFileSync(outPath, content, 'utf-8'); | ||
| console.log(` \u2713 ${outPath}`); | ||
| } | ||
| if (result.warnings.length > 0) { | ||
| console.log(` | ||
| ${result.warnings.length} warning(s) during conversion.`); | ||
| } | ||
| console.log(` | ||
| Generated ${result.files.size} file(s).`); | ||
| } | ||
| __name(runImportOpenApi, 'runImportOpenApi'); | ||
| export { runImportOpenApi }; | ||
| //# sourceMappingURL=import-openapi-ZYIAQBEX.js.map |
| {"version":3,"sources":["../src/import-openapi.ts"],"sourcesContent":["import { writeFileSync, mkdirSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport { convertOpenApiToCk } from '@maroonedsoftware/openapi-to-ck';\nimport type { Warning } from '@maroonedsoftware/openapi-to-ck';\n\ninterface ImportArgs {\n specPath: string;\n output: string;\n split: 'single' | 'by-tag';\n}\n\nfunction parseImportArgs(argv: string[]): ImportArgs {\n const args = argv.slice(3); // skip node, script, 'import-openapi'\n let specPath = '';\n let output = '.';\n let split: 'single' | 'by-tag' = 'by-tag';\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (arg === '--output' || arg === '-o') {\n output = args[++i] ?? '.';\n } else if (arg === '--split') {\n const val = args[++i];\n if (val === 'single' || val === 'by-tag') split = val;\n } else if (!arg.startsWith('-')) {\n specPath = arg;\n }\n }\n\n return { specPath, output, split };\n}\n\nexport async function runImportOpenApi(): Promise<void> {\n const args = parseImportArgs(process.argv);\n\n if (!args.specPath) {\n console.error('Usage: dsl-compile import-openapi <spec-path> [--output <dir>] [--split single|by-tag]');\n console.error('');\n console.error('Options:');\n console.error(' -o, --output <dir> Output directory for .ck files (default: current directory)');\n console.error(' --split <mode> Split mode: \"single\" or \"by-tag\" (default: by-tag)');\n process.exit(1);\n }\n\n console.log(`Converting ${args.specPath} → .ck files...`);\n\n const result = await convertOpenApiToCk({\n input: resolve(args.specPath),\n split: args.split,\n includeComments: true,\n onWarning: (w: Warning) => {\n const prefix = w.severity === 'warn' ? '⚠' : 'ℹ';\n console.warn(` ${prefix} ${w.path}: ${w.message}`);\n },\n });\n\n const outputDir = resolve(args.output);\n mkdirSync(outputDir, { recursive: true });\n\n for (const [filename, content] of result.files) {\n const outPath = join(outputDir, filename);\n writeFileSync(outPath, content, 'utf-8');\n console.log(` ✓ ${outPath}`);\n }\n\n if (result.warnings.length > 0) {\n console.log(`\\n${result.warnings.length} warning(s) during conversion.`);\n }\n\n console.log(`\\nGenerated ${result.files.size} file(s).`);\n}\n"],"mappings":";;;;;AAAA,SAASA,eAAeC,iBAAiB;AACzC,SAASC,SAASC,YAAY;AAC9B,SAASC,0BAA0B;AASnC,SAASC,gBAAgBC,MAAc;AACrC,QAAMC,OAAOD,KAAKE,MAAM,CAAA;AACxB,MAAIC,WAAW;AACf,MAAIC,SAAS;AACb,MAAIC,QAA6B;AAEjC,WAASC,IAAI,GAAGA,IAAIL,KAAKM,QAAQD,KAAK;AACpC,UAAME,MAAMP,KAAKK,CAAAA;AACjB,QAAIE,QAAQ,cAAcA,QAAQ,MAAM;AACtCJ,eAASH,KAAK,EAAEK,CAAAA,KAAM;IACxB,WAAWE,QAAQ,WAAW;AAC5B,YAAMC,MAAMR,KAAK,EAAEK,CAAAA;AACnB,UAAIG,QAAQ,YAAYA,QAAQ,SAAUJ,SAAQI;IACpD,WAAW,CAACD,IAAIE,WAAW,GAAA,GAAM;AAC/BP,iBAAWK;IACb;EACF;AAEA,SAAO;IAAEL;IAAUC;IAAQC;EAAM;AACnC;AAnBSN;AAqBT,eAAsBY,mBAAAA;AACpB,QAAMV,OAAOF,gBAAgBa,QAAQZ,IAAI;AAEzC,MAAI,CAACC,KAAKE,UAAU;AAClBU,YAAQC,MAAM,wFAAA;AACdD,YAAQC,MAAM,EAAA;AACdD,YAAQC,MAAM,UAAA;AACdD,YAAQC,MAAM,oFAAA;AACdD,YAAQC,MAAM,2EAAA;AACdF,YAAQG,KAAK,CAAA;EACf;AAEAF,UAAQG,IAAI,cAAcf,KAAKE,QAAQ,sBAAiB;AAExD,QAAMc,SAAS,MAAMC,mBAAmB;IACtCC,OAAOC,QAAQnB,KAAKE,QAAQ;IAC5BE,OAAOJ,KAAKI;IACZgB,iBAAiB;IACjBC,WAAW,wBAACC,MAAAA;AACV,YAAMC,SAASD,EAAEE,aAAa,SAAS,WAAM;AAC7CZ,cAAQa,KAAK,KAAKF,MAAAA,KAAWD,EAAEI,IAAI,KAAKJ,EAAEK,OAAO,EAAE;IACrD,GAHW;EAIb,CAAA;AAEA,QAAMC,YAAYT,QAAQnB,KAAKG,MAAM;AACrC0B,YAAUD,WAAW;IAAEE,WAAW;EAAK,CAAA;AAEvC,aAAW,CAACC,UAAUC,OAAAA,KAAYhB,OAAOiB,OAAO;AAC9C,UAAMC,UAAUC,KAAKP,WAAWG,QAAAA;AAChCK,kBAAcF,SAASF,SAAS,OAAA;AAChCpB,YAAQG,IAAI,aAAQmB,OAAAA,EAAS;EAC/B;AAEA,MAAIlB,OAAOqB,SAAS/B,SAAS,GAAG;AAC9BM,YAAQG,IAAI;EAAKC,OAAOqB,SAAS/B,MAAM,gCAAgC;EACzE;AAEAM,UAAQG,IAAI;YAAeC,OAAOiB,MAAMK,IAAI,WAAW;AACzD;AAtCsB5B;","names":["writeFileSync","mkdirSync","resolve","join","convertOpenApiToCk","parseImportArgs","argv","args","slice","specPath","output","split","i","length","arg","val","startsWith","runImportOpenApi","process","console","error","exit","log","result","convertOpenApiToCk","input","resolve","includeComments","onWarning","w","prefix","severity","warn","path","message","outputDir","mkdirSync","recursive","filename","content","files","outPath","join","writeFileSync","warnings","size"]} |
| export type TokenKind = | ||
| | 'IDENTIFIER' | ||
| | 'COLON' | ||
| | 'QUESTION' | ||
| | 'EQUALS' | ||
| | 'PIPE' | ||
| | 'LPAREN' | ||
| | 'RPAREN' | ||
| | 'LBRACE' | ||
| | 'RBRACE' | ||
| | 'COMMA' | ||
| | 'SLASH' | ||
| | 'LBRACKET' | ||
| | 'RBRACKET' | ||
| | 'PLUS' | ||
| | 'STAR' | ||
| | 'CARET' | ||
| | 'BACKSLASH' | ||
| | 'DOT' | ||
| | 'AMPERSAND' | ||
| | 'BANG' | ||
| | 'TRIPLE_DASH' | ||
| | 'STRING' | ||
| | 'NUMBER' | ||
| | 'BOOLEAN' | ||
| | 'COMMENT' | ||
| | 'EOF'; | ||
| export interface Token { | ||
| kind: TokenKind; | ||
| value: string; | ||
| line: number; | ||
| } | ||
| export declare function tokenize(source: string, file: string): Token[]; | ||
| //# sourceMappingURL=lexer.d.ts.map |
| {"version":3,"file":"lexer.d.ts","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GACjB,YAAY,GACZ,OAAO,GACP,UAAU,GACV,QAAQ,GACR,MAAM,GACN,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,OAAO,GACP,UAAU,GACV,UAAU,GACV,MAAM,GACN,MAAM,GACN,OAAO,GACP,WAAW,GACX,KAAK,GACL,WAAW,GACX,MAAM,GACN,aAAa,GACb,QAAQ,GACR,QAAQ,GACR,SAAS,GACT,SAAS,GACT,KAAK,CAAC;AAEV,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAkK9D"} |
-212
| export function tokenize(source, file) { | ||
| const lines = source.split('\n'); | ||
| const tokens = []; | ||
| let inFrontMatter = false; | ||
| let parenDepth = 0; | ||
| let braceDepth = 0; | ||
| // Tracks the brace depth at which each open paren was opened. | ||
| // Used to detect when : or / appears inside a type-arg () at the same brace level | ||
| // (format strings) vs inside a nested {} within those parens (field separators). | ||
| const parenBraceStack = []; | ||
| for (let lineNum = 0; lineNum < lines.length; lineNum++) { | ||
| const rawLine = lines[lineNum]; | ||
| const lineNo = lineNum + 1; | ||
| // Blank lines are skipped | ||
| if (rawLine.trim() === '') continue; | ||
| const trimmed = rawLine.trim(); | ||
| // Front-matter delimiter: three or more dashes on their own line | ||
| if (/^-{3,}$/.test(trimmed)) { | ||
| tokens.push({ kind: 'TRIPLE_DASH', value: '---', line: lineNo }); | ||
| inFrontMatter = !inFrontMatter; | ||
| continue; | ||
| } | ||
| // Inside front-matter: tokenize as key: value | ||
| // Values are consumed whole (no # comment handling) to support paths like #modules/... | ||
| if (inFrontMatter) { | ||
| const match = trimmed.match(/^([a-zA-Z_$][a-zA-Z0-9_$\-.]*)\s*:\s*(.+)$/); | ||
| if (match) { | ||
| tokens.push({ kind: 'IDENTIFIER', value: match[1], line: lineNo }); | ||
| tokens.push({ kind: 'COLON', value: ':', line: lineNo }); | ||
| let value = match[2].trim(); | ||
| // Strip surrounding quotes if present, emit as STRING either way | ||
| if ((value.startsWith('"') && value.endsWith('"')) || (value.startsWith("'") && value.endsWith("'"))) { | ||
| value = value.slice(1, -1); | ||
| } | ||
| tokens.push({ kind: 'STRING', value, line: lineNo }); | ||
| } | ||
| continue; | ||
| } | ||
| if (trimmed.startsWith('#')) { | ||
| // Store the full raw line so the printer can round-trip it verbatim. | ||
| // consumeComment() strips the leading `# ` when extracting node descriptions. | ||
| tokens.push({ kind: 'COMMENT', value: rawLine, line: lineNo }); | ||
| continue; | ||
| } | ||
| // Tokenize the line content (after stripping leading whitespace) | ||
| const content = trimmed; | ||
| let pos = 0; | ||
| while (pos < content.length) { | ||
| // Skip spaces within a line | ||
| if (content[pos] === ' ' || content[pos] === '\t') { | ||
| pos++; | ||
| continue; | ||
| } | ||
| // Inline comment | ||
| if (content[pos] === '#') { | ||
| const comment = content.slice(pos + 1).trim(); | ||
| tokens.push({ kind: 'COMMENT', value: comment, line: lineNo }); | ||
| break; | ||
| } | ||
| // String literal | ||
| if (content[pos] === '"' || content[pos] === "'") { | ||
| const quote = content[pos]; | ||
| let end = pos + 1; | ||
| while (end < content.length && content[end] !== quote) end++; | ||
| tokens.push({ kind: 'STRING', value: content.slice(pos + 1, end), line: lineNo }); | ||
| pos = end + 1; | ||
| continue; | ||
| } | ||
| // Regex literal inside type modifier: /pattern/ | ||
| if (content[pos] === '/' && pos > 0 && content[pos - 1] !== ' ') { | ||
| // treat as part of surrounding identifier — handled in parser | ||
| tokens.push({ kind: 'SLASH', value: '/', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| } | ||
| // Numbers (including negative) | ||
| if (content[pos] === '-' && /\d/.test(content[pos + 1] ?? '')) { | ||
| let end = pos + 1; | ||
| while (end < content.length && /[\d.]/.test(content[end])) end++; | ||
| tokens.push({ kind: 'NUMBER', value: content.slice(pos, end), line: lineNo }); | ||
| pos = end; | ||
| continue; | ||
| } | ||
| if (/\d/.test(content[pos])) { | ||
| let end = pos; | ||
| while (end < content.length && /[\d.]/.test(content[end])) end++; | ||
| tokens.push({ kind: 'NUMBER', value: content.slice(pos, end), line: lineNo }); | ||
| pos = end; | ||
| continue; | ||
| } | ||
| // Single-char tokens | ||
| switch (content[pos]) { | ||
| case ':': | ||
| tokens.push({ kind: 'COLON', value: ':', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '?': | ||
| tokens.push({ kind: 'QUESTION', value: '?', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '=': | ||
| tokens.push({ kind: 'EQUALS', value: '=', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '|': | ||
| tokens.push({ kind: 'PIPE', value: '|', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '(': | ||
| parenBraceStack.push(braceDepth); | ||
| parenDepth++; | ||
| tokens.push({ kind: 'LPAREN', value: '(', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case ')': | ||
| parenBraceStack.pop(); | ||
| parenDepth--; | ||
| tokens.push({ kind: 'RPAREN', value: ')', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '{': | ||
| braceDepth++; | ||
| tokens.push({ kind: 'LBRACE', value: '{', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '}': | ||
| braceDepth--; | ||
| tokens.push({ kind: 'RBRACE', value: '}', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case ',': | ||
| tokens.push({ kind: 'COMMA', value: ',', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '/': | ||
| tokens.push({ kind: 'SLASH', value: '/', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '[': | ||
| tokens.push({ kind: 'LBRACKET', value: '[', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case ']': | ||
| tokens.push({ kind: 'RBRACKET', value: ']', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '+': | ||
| tokens.push({ kind: 'PLUS', value: '+', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '*': | ||
| tokens.push({ kind: 'STAR', value: '*', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '^': | ||
| tokens.push({ kind: 'CARET', value: '^', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '\\': | ||
| tokens.push({ kind: 'BACKSLASH', value: '\\', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '.': | ||
| tokens.push({ kind: 'DOT', value: '.', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '&': | ||
| tokens.push({ kind: 'AMPERSAND', value: '&', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| case '!': | ||
| tokens.push({ kind: 'BANG', value: '!', line: lineNo }); | ||
| pos++; | ||
| continue; | ||
| } | ||
| // Identifiers and keywords | ||
| if (/[a-zA-Z_$]/.test(content[pos])) { | ||
| let end = pos; | ||
| while (end < content.length) { | ||
| const ch = content[end]; | ||
| if (/[a-zA-Z0-9_$\-.]/.test(ch)) { | ||
| end++; | ||
| } else if ( | ||
| parenDepth > 0 && | ||
| parenBraceStack[parenBraceStack.length - 1] === braceDepth && | ||
| (ch === ':' || ch === '/') && | ||
| end + 1 < content.length && | ||
| /[a-zA-Z0-9]/.test(content[end + 1]) | ||
| ) { | ||
| // Inside type-arg parens at the same brace level: treat : and / as format-string separators | ||
| end++; | ||
| } else { | ||
| break; | ||
| } | ||
| } | ||
| const word = content.slice(pos, end); | ||
| if (word === 'true' || word === 'false') { | ||
| tokens.push({ kind: 'BOOLEAN', value: word, line: lineNo }); | ||
| } else { | ||
| tokens.push({ kind: 'IDENTIFIER', value: word, line: lineNo }); | ||
| } | ||
| pos = end; | ||
| continue; | ||
| } | ||
| // Unknown — skip | ||
| pos++; | ||
| } | ||
| } | ||
| tokens.push({ kind: 'EOF', value: '', line: lines.length }); | ||
| return tokens; | ||
| } | ||
| //# sourceMappingURL=lexer.js.map |
| {"version":3,"file":"lexer.js","sourceRoot":"","sources":["../src/lexer.ts"],"names":[],"mappings":"AAkCA,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY;IACnD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACjC,MAAM,MAAM,GAAY,EAAE,CAAC;IAC3B,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,8DAA8D;IAC9D,kFAAkF;IAClF,iFAAiF;IACjF,MAAM,eAAe,GAAa,EAAE,CAAC;IAErC,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,CAAC;QACxD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAE,CAAC;QAChC,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;QAE3B,0BAA0B;QAC1B,IAAI,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE;YAAE,SAAS;QAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAE/B,iEAAiE;QACjE,IAAI,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,aAAa,GAAG,CAAC,aAAa,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,8CAA8C;QAC9C,uFAAuF;QACvF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAC1E,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACpE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,IAAI,KAAK,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;gBAC7B,iEAAiE;gBACjE,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACrG,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7B,CAAC;gBACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YACvD,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC5B,qEAAqE;YACrE,8EAA8E;YAC9E,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;YAC/D,SAAS;QACX,CAAC;QAED,iEAAiE;QACjE,MAAM,OAAO,GAAG,OAAO,CAAC;QACxB,IAAI,GAAG,GAAG,CAAC,CAAC;QAEZ,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC5B,4BAA4B;YAC5B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;gBAClD,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,iBAAiB;YACjB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBACzB,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC/D,MAAM;YACR,CAAC;YAED,iBAAiB;YACjB,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,EAAE,CAAC;gBACjD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;gBAC3B,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK;oBAAE,GAAG,EAAE,CAAC;gBAC7D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAClF,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;gBACd,SAAS;YACX,CAAC;YAED,gDAAgD;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,GAAG,CAAC,IAAI,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;gBAChE,8DAA8D;gBAC9D,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACzD,GAAG,EAAE,CAAC;gBACN,SAAS;YACX,CAAC;YAED,+BAA+B;YAC/B,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC9D,IAAI,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;gBAClB,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;oBAAE,GAAG,EAAE,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,GAAG,GAAG,GAAG,CAAC;gBACV,SAAS;YACX,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC,EAAE,CAAC;gBAC7B,IAAI,GAAG,GAAG,GAAG,CAAC;gBACd,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC;oBAAE,GAAG,EAAE,CAAC;gBAClE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9E,GAAG,GAAG,GAAG,CAAC;gBACV,SAAS;YACX,CAAC;YAED,qBAAqB;YACrB,QAAQ,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBACrB,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACpF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACvF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACrF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACnF,KAAK,GAAG;oBAAE,eAAe,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;oBAAC,UAAU,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACrI,KAAK,GAAG;oBAAE,eAAe,CAAC,GAAG,EAAE,CAAC;oBAAC,UAAU,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBAC1H,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACnG,KAAK,GAAG;oBAAE,UAAU,EAAE,CAAC;oBAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACnG,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACpF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACpF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACvF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACvF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACnF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACnF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACpF,KAAK,IAAI;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBAC1F,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBAClF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;gBACxF,KAAK,GAAG;oBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;oBAAC,GAAG,EAAE,CAAC;oBAAC,SAAS;YACrF,CAAC;YAED,2BAA2B;YAC3B,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAE,CAAC,EAAE,CAAC;gBACrC,IAAI,GAAG,GAAG,GAAG,CAAC;gBACd,OAAO,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;oBAC5B,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAE,CAAC;oBACzB,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;wBAChC,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,IACL,UAAU,GAAG,CAAC;wBACd,eAAe,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,UAAU;wBAC1D,CAAC,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,CAAC;wBAC1B,GAAG,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,EACjE,CAAC;wBACD,4FAA4F;wBAC5F,GAAG,EAAE,CAAC;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM;oBACR,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACrC,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;oBACxC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC9D,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjE,CAAC;gBACD,GAAG,GAAG,GAAG,CAAC;gBACV,SAAS;YACX,CAAC;YAED,iBAAiB;YACjB,GAAG,EAAE,CAAC;QACR,CAAC;IACH,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5D,OAAO,MAAM,CAAC;AAChB,CAAC"} |
| import { DiagnosticCollector } from './diagnostics.js'; | ||
| import type { DtoRootNode } from './ast.js'; | ||
| export declare function parseDto(source: string, file: string, diag: DiagnosticCollector): DtoRootNode; | ||
| //# sourceMappingURL=parser-dto.d.ts.map |
| {"version":3,"file":"parser-dto.d.ts","sourceRoot":"","sources":["../src/parser-dto.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,WAAW,CA2B7F"} |
| import { tokenize } from './lexer.js'; | ||
| import { adaptTokens } from './token-adapter.js'; | ||
| import { dtoCstParser } from './chevrotain-parser-dto.js'; | ||
| import { DtoVisitor } from './visitor-dto.js'; | ||
| export function parseDto(source, file, diag) { | ||
| // Step 1: Tokenize with existing lexer (handles indentation) | ||
| const rawTokens = tokenize(source, file); | ||
| // Step 2: Adapt to Chevrotain IToken format (strips comments to side map) | ||
| const { tokens, comments } = adaptTokens(rawTokens); | ||
| // Step 3: Parse to CST | ||
| dtoCstParser.input = tokens; | ||
| const cst = dtoCstParser.dtoRoot(); | ||
| // Step 4: Report parse errors to diagnostics | ||
| for (const err of dtoCstParser.errors) { | ||
| const line = err.token?.startLine ?? 0; | ||
| diag.error(file, line, err.message); | ||
| } | ||
| // Step 5: Visit CST to build AST (consumed comments are deleted from the map) | ||
| const visitor = new DtoVisitor(file, comments); | ||
| const ast = visitor.visit(cst); | ||
| // Step 6: Remaining entries in comments are orphans (not attached to any node) | ||
| const orphanComments = Array.from(comments.entries()) | ||
| .map(([line, text]) => ({ line, text })) | ||
| .sort((a, b) => a.line - b.line); | ||
| return orphanComments.length > 0 ? { ...ast, orphanComments } : ast; | ||
| } | ||
| //# sourceMappingURL=parser-dto.js.map |
| {"version":3,"file":"parser-dto.js","sourceRoot":"","sources":["../src/parser-dto.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAI9C,MAAM,UAAU,QAAQ,CAAC,MAAc,EAAE,IAAY,EAAE,IAAyB;IAC9E,6DAA6D;IAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEzC,0EAA0E;IAC1E,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEpD,uBAAuB;IACvB,YAAY,CAAC,KAAK,GAAG,MAAM,CAAC;IAC5B,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,CAAC;IAEnC,6CAA6C;IAC7C,KAAK,MAAM,GAAG,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,MAAM,OAAO,GAAG,IAAI,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/B,+EAA+E;IAC/E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnC,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACtE,CAAC"} |
| import { DiagnosticCollector } from './diagnostics.js'; | ||
| import type { OpRootNode } from './ast.js'; | ||
| export declare function parseOp(source: string, file: string, diag: DiagnosticCollector): OpRootNode; | ||
| //# sourceMappingURL=parser-op.d.ts.map |
| {"version":3,"file":"parser-op.d.ts","sourceRoot":"","sources":["../src/parser-op.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,wBAAgB,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,UAAU,CA2B3F"} |
| import { tokenize } from './lexer.js'; | ||
| import { adaptTokens } from './token-adapter.js'; | ||
| import { opCstParser } from './chevrotain-parser-op.js'; | ||
| import { OpVisitor } from './visitor-op.js'; | ||
| export function parseOp(source, file, diag) { | ||
| // Step 1: Tokenize with existing lexer (handles indentation) | ||
| const rawTokens = tokenize(source, file); | ||
| // Step 2: Adapt to Chevrotain IToken format (strips comments to side map) | ||
| const { tokens, comments } = adaptTokens(rawTokens); | ||
| // Step 3: Parse to CST | ||
| opCstParser.input = tokens; | ||
| const cst = opCstParser.opRoot(); | ||
| // Step 4: Report parse errors to diagnostics | ||
| for (const err of opCstParser.errors) { | ||
| const line = err.token?.startLine ?? 0; | ||
| diag.error(file, line, err.message); | ||
| } | ||
| // Step 5: Visit CST to build AST (consumed comments are deleted from the map) | ||
| const visitor = new OpVisitor(file, diag, comments); | ||
| const ast = visitor.visit(cst); | ||
| // Step 6: Remaining entries in comments are orphans (not attached to any node) | ||
| const orphanComments = Array.from(comments.entries()) | ||
| .map(([line, text]) => ({ line, text })) | ||
| .sort((a, b) => a.line - b.line); | ||
| return orphanComments.length > 0 ? { ...ast, orphanComments } : ast; | ||
| } | ||
| //# sourceMappingURL=parser-op.js.map |
| {"version":3,"file":"parser-op.js","sourceRoot":"","sources":["../src/parser-op.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,MAAM,UAAU,OAAO,CAAC,MAAc,EAAE,IAAY,EAAE,IAAyB;IAC7E,6DAA6D;IAC7D,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAEzC,0EAA0E;IAC1E,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC,SAAS,CAAC,CAAC;IAEpD,uBAAuB;IACvB,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC;IAC3B,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC;IAEjC,6CAA6C;IAC7C,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC;IAED,8EAA8E;IAC9E,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE/B,+EAA+E;IAC/E,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;SAClD,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;IAEnC,OAAO,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;AACtE,CAAC"} |
| import type { IToken } from 'chevrotain'; | ||
| import type { Token } from './lexer.js'; | ||
| export interface AdaptedTokens { | ||
| tokens: IToken[]; | ||
| comments: Map<number, string>; | ||
| } | ||
| /** | ||
| * Converts our lexer's Token[] into Chevrotain's IToken[] format. | ||
| * COMMENT tokens are extracted into a side map keyed by line number | ||
| * so visitors can use them for model/field descriptions. | ||
| */ | ||
| export declare function adaptTokens(rawTokens: Token[]): AdaptedTokens; | ||
| //# sourceMappingURL=token-adapter.d.ts.map |
| {"version":3,"file":"token-adapter.d.ts","sourceRoot":"","sources":["../src/token-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAGxC,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,SAAS,EAAE,KAAK,EAAE,GAAG,aAAa,CAiC7D"} |
| import { tokenKindMap } from './tokens.js'; | ||
| /** | ||
| * Converts our lexer's Token[] into Chevrotain's IToken[] format. | ||
| * COMMENT tokens are extracted into a side map keyed by line number | ||
| * so visitors can use them for model/field descriptions. | ||
| */ | ||
| export function adaptTokens(rawTokens) { | ||
| const tokens = []; | ||
| const comments = new Map(); | ||
| let offset = 0; | ||
| for (const tok of rawTokens) { | ||
| if (tok.kind === 'COMMENT') { | ||
| comments.set(tok.line, tok.value); | ||
| continue; | ||
| } | ||
| const tokenType = tokenKindMap[tok.kind]; | ||
| if (!tokenType) continue; | ||
| const image = tok.value || tok.kind; | ||
| const len = image.length || 1; | ||
| tokens.push({ | ||
| image: tok.value, | ||
| startOffset: offset, | ||
| endOffset: offset + len - 1, | ||
| startLine: tok.line, | ||
| endLine: tok.line, | ||
| startColumn: 0, | ||
| endColumn: len - 1, | ||
| tokenTypeIdx: tokenType.tokenTypeIdx, | ||
| tokenType, | ||
| }); | ||
| offset += len + 1; | ||
| } | ||
| return { tokens, comments }; | ||
| } | ||
| //# sourceMappingURL=token-adapter.js.map |
| {"version":3,"file":"token-adapter.js","sourceRoot":"","sources":["../src/token-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAO3C;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,SAAkB;IAC5C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IAEf,KAAK,MAAM,GAAG,IAAI,SAAS,EAAE,CAAC;QAC5B,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,SAAS,GAAG,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,IAAI,CAAC;QACpC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;QAE9B,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,GAAG,CAAC,KAAK;YAChB,WAAW,EAAE,MAAM;YACnB,SAAS,EAAE,MAAM,GAAG,GAAG,GAAG,CAAC;YAC3B,SAAS,EAAE,GAAG,CAAC,IAAI;YACnB,OAAO,EAAE,GAAG,CAAC,IAAI;YACjB,WAAW,EAAE,CAAC;YACd,SAAS,EAAE,GAAG,GAAG,CAAC;YAClB,YAAY,EAAE,SAAS,CAAC,YAAa;YACrC,SAAS;SACV,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC"} |
| import type { Token, TokenKind } from './lexer.js'; | ||
| export declare class ParseError extends Error { | ||
| readonly line: number; | ||
| readonly file: string; | ||
| constructor(message: string, line: number, file: string); | ||
| } | ||
| export declare class TokenStream { | ||
| private readonly tokens; | ||
| private readonly file; | ||
| private pos; | ||
| constructor(tokens: Token[], file: string); | ||
| /** Return the token at current position + offset without consuming. */ | ||
| peek(offset?: number): Token; | ||
| /** Return the current token and advance position by one. */ | ||
| consume(): Token; | ||
| /** Consume and return the current token if it matches `kind`; otherwise throw ParseError. */ | ||
| expect(kind: TokenKind): Token; | ||
| /** If the current token matches `kind`, consume it and return true; otherwise return false. */ | ||
| match(kind: TokenKind): boolean; | ||
| /** Consume all consecutive NEWLINE tokens at the current position. */ | ||
| skipNewlines(): void; | ||
| } | ||
| //# sourceMappingURL=token-stream.d.ts.map |
| {"version":3,"file":"token-stream.d.ts","sourceRoot":"","sources":["../src/token-stream.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEnD,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;gBAEV,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAMxD;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;IACjC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAC9B,OAAO,CAAC,GAAG,CAAK;gBAEJ,MAAM,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,MAAM;IAKzC,uEAAuE;IACvE,IAAI,CAAC,MAAM,SAAI,GAAG,KAAK;IAQvB,4DAA4D;IAC5D,OAAO,IAAI,KAAK;IAQhB,6FAA6F;IAC7F,MAAM,CAAC,IAAI,EAAE,SAAS,GAAG,KAAK;IAY9B,+FAA+F;IAC/F,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO;IAQ/B,sEAAsE;IACtE,YAAY,IAAI,IAAI;CAKrB"} |
| export class ParseError extends Error { | ||
| line; | ||
| file; | ||
| constructor(message, line, file) { | ||
| super(message); | ||
| this.name = 'ParseError'; | ||
| this.line = line; | ||
| this.file = file; | ||
| } | ||
| } | ||
| export class TokenStream { | ||
| tokens; | ||
| file; | ||
| pos = 0; | ||
| constructor(tokens, file) { | ||
| this.tokens = tokens; | ||
| this.file = file; | ||
| } | ||
| /** Return the token at current position + offset without consuming. */ | ||
| peek(offset = 0) { | ||
| const idx = this.pos + offset; | ||
| if (idx >= this.tokens.length) { | ||
| return this.tokens[this.tokens.length - 1]; // EOF sentinel | ||
| } | ||
| return this.tokens[idx]; | ||
| } | ||
| /** Return the current token and advance position by one. */ | ||
| consume() { | ||
| const tok = this.tokens[this.pos]; | ||
| if (this.pos < this.tokens.length - 1) { | ||
| this.pos++; | ||
| } | ||
| return tok; | ||
| } | ||
| /** Consume and return the current token if it matches `kind`; otherwise throw ParseError. */ | ||
| expect(kind) { | ||
| const tok = this.peek(); | ||
| if (tok.kind !== kind) { | ||
| throw new ParseError(`Expected ${kind}, got ${tok.kind} ("${tok.value}")`, tok.line, this.file); | ||
| } | ||
| return this.consume(); | ||
| } | ||
| /** If the current token matches `kind`, consume it and return true; otherwise return false. */ | ||
| match(kind) { | ||
| if (this.peek().kind === kind) { | ||
| this.consume(); | ||
| return true; | ||
| } | ||
| return false; | ||
| } | ||
| /** Consume all consecutive NEWLINE tokens at the current position. */ | ||
| skipNewlines() { | ||
| while (this.peek().kind === 'NEWLINE') { | ||
| this.consume(); | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=token-stream.js.map |
| {"version":3,"file":"token-stream.js","sourceRoot":"","sources":["../src/token-stream.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAW,SAAQ,KAAK;IAC1B,IAAI,CAAS;IACb,IAAI,CAAS;IAEtB,YAAY,OAAe,EAAE,IAAY,EAAE,IAAY;QACrD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,WAAW;IACL,MAAM,CAAU;IAChB,IAAI,CAAS;IACtB,GAAG,GAAG,CAAC,CAAC;IAEhB,YAAY,MAAe,EAAE,IAAY;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,uEAAuE;IACvE,IAAI,CAAC,MAAM,GAAG,CAAC;QACb,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;QAC9B,IAAI,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAC,eAAe;QAC9D,CAAC;QACD,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAE,CAAC;IAC3B,CAAC;IAED,4DAA4D;IAC5D,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACb,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,6FAA6F;IAC7F,MAAM,CAAC,IAAe;QACpB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,UAAU,CAClB,YAAY,IAAI,SAAS,GAAG,CAAC,IAAI,MAAM,GAAG,CAAC,KAAK,IAAI,EACpD,GAAG,CAAC,IAAI,EACR,IAAI,CAAC,IAAI,CACV,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAED,+FAA+F;IAC/F,KAAK,CAAC,IAAe;QACnB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,sEAAsE;IACtE,YAAY;QACV,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,OAAO,EAAE,CAAC;QACjB,CAAC;IACH,CAAC;CACF"} |
| import { type TokenType } from 'chevrotain'; | ||
| export declare const Comment: any; | ||
| export declare const BooleanLit: any; | ||
| export declare const Identifier: any; | ||
| export declare const Colon: any; | ||
| export declare const Question: any; | ||
| export declare const Equals: any; | ||
| export declare const Pipe: any; | ||
| export declare const LParen: any; | ||
| export declare const RParen: any; | ||
| export declare const LBrace: any; | ||
| export declare const RBrace: any; | ||
| export declare const Comma: any; | ||
| export declare const Slash: any; | ||
| export declare const LBracket: any; | ||
| export declare const RBracket: any; | ||
| export declare const Plus: any; | ||
| export declare const Star: any; | ||
| export declare const Caret: any; | ||
| export declare const Backslash: any; | ||
| export declare const Dot: any; | ||
| export declare const Ampersand: any; | ||
| export declare const Bang: any; | ||
| export declare const TripleDash: any; | ||
| export declare const StringLit: any; | ||
| export declare const NumberLit: any; | ||
| export declare const Eof: any; | ||
| export declare const allTokens: TokenType[]; | ||
| export declare const tokenKindMap: Record<string, TokenType>; | ||
| //# sourceMappingURL=tokens.d.ts.map |
| {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAMzD,eAAO,MAAM,OAAO,KAA6D,CAAC;AAClF,eAAO,MAAM,UAAU,KAA6D,CAAC;AACrF,eAAO,MAAM,UAAU,KAA6E,CAAC;AACrG,eAAO,MAAM,KAAK,KAAyD,CAAC;AAC5E,eAAO,MAAM,QAAQ,KAAuD,CAAC;AAC7E,eAAO,MAAM,MAAM,KAAwD,CAAC;AAC5E,eAAO,MAAM,IAAI,KAA2D,CAAC;AAC7E,eAAO,MAAM,MAAM,KAAyD,CAAC;AAC7E,eAAO,MAAM,MAAM,KAAyD,CAAC;AAC7E,eAAO,MAAM,MAAM,KAAyD,CAAC;AAC7E,eAAO,MAAM,MAAM,KAAyD,CAAC;AAC7E,eAAO,MAAM,KAAK,KAAyD,CAAC;AAC5E,eAAO,MAAM,KAAK,KAA0D,CAAC;AAC7E,eAAO,MAAM,QAAQ,KAAuD,CAAC;AAC7E,eAAO,MAAM,QAAQ,KAAsD,CAAC;AAC5E,eAAO,MAAM,IAAI,KAA2D,CAAC;AAC7E,eAAO,MAAM,IAAI,KAA2D,CAAC;AAC7E,eAAO,MAAM,KAAK,KAA0D,CAAC;AAC7E,eAAO,MAAM,SAAS,KAAsD,CAAC;AAC7E,eAAO,MAAM,GAAG,KAA4D,CAAC;AAC7E,eAAO,MAAM,SAAS,KAAqD,CAAC;AAC5E,eAAO,MAAM,IAAI,KAA0D,CAAC;AAC5E,eAAO,MAAM,UAAU,KAAsD,CAAC;AAC9E,eAAO,MAAM,SAAS,KAAmE,CAAC;AAC1F,eAAO,MAAM,SAAS,KAAiE,CAAC;AACxF,eAAO,MAAM,GAAG,KAAiE,CAAC;AAGlF,eAAO,MAAM,SAAS,EAAE,SAAS,EAUhC,CAAC;AAGF,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CA2BlD,CAAC"} |
| import { createToken } from 'chevrotain'; | ||
| // ─── Token type definitions ───────────────────────────────────────────────── | ||
| // These are used by Chevrotain's parser for grammar rules and lookahead. | ||
| // We use our own external lexer, so the patterns here are documentation only. | ||
| export const Comment = createToken({ name: 'Comment', pattern: /#[^\n]*/ }); | ||
| export const BooleanLit = createToken({ name: 'BooleanLit', pattern: /true|false/ }); | ||
| export const Identifier = createToken({ name: 'Identifier', pattern: /[a-zA-Z_$][a-zA-Z0-9_$\-.]*/ }); | ||
| export const Colon = createToken({ name: 'Colon', pattern: /:/ }); | ||
| export const Question = createToken({ name: 'Question', pattern: /\?/ }); | ||
| export const Equals = createToken({ name: 'Equals', pattern: /=/ }); | ||
| export const Pipe = createToken({ name: 'Pipe', pattern: /\|/ }); | ||
| export const LParen = createToken({ name: 'LParen', pattern: /\(/ }); | ||
| export const RParen = createToken({ name: 'RParen', pattern: /\)/ }); | ||
| export const LBrace = createToken({ name: 'LBrace', pattern: /\{/ }); | ||
| export const RBrace = createToken({ name: 'RBrace', pattern: /\}/ }); | ||
| export const Comma = createToken({ name: 'Comma', pattern: /,/ }); | ||
| export const Slash = createToken({ name: 'Slash', pattern: /\// }); | ||
| export const LBracket = createToken({ name: 'LBracket', pattern: /\[/ }); | ||
| export const RBracket = createToken({ name: 'RBracket', pattern: /]/ }); | ||
| export const Plus = createToken({ name: 'Plus', pattern: /\+/ }); | ||
| export const Star = createToken({ name: 'Star', pattern: /\*/ }); | ||
| export const Caret = createToken({ name: 'Caret', pattern: /\^/ }); | ||
| export const Backslash = createToken({ name: 'Backslash', pattern: /\\/ }); | ||
| export const Dot = createToken({ name: 'Dot', pattern: /\./ }); | ||
| export const Ampersand = createToken({ name: 'Ampersand', pattern: /&/ }); | ||
| export const Bang = createToken({ name: 'Bang', pattern: /!/ }); | ||
| export const TripleDash = createToken({ name: 'TripleDash', pattern: /---/ }); | ||
| export const StringLit = createToken({ name: 'StringLit', pattern: /"[^"]*"|'[^']*'/ }); | ||
| export const NumberLit = createToken({ name: 'NumberLit', pattern: /-?\d+(\.\d+)?/ }); | ||
| export const Eof = createToken({ name: 'Eof', pattern: /<<EOF>>/ }); | ||
| // Token vocabulary — order matters for parser lookahead priority | ||
| export const allTokens = [ | ||
| Comment, | ||
| BooleanLit, // before Identifier so "true"/"false" don't match as identifiers | ||
| Identifier, | ||
| Colon, | ||
| Question, | ||
| Equals, | ||
| Pipe, | ||
| LParen, | ||
| RParen, | ||
| LBrace, | ||
| RBrace, | ||
| Comma, | ||
| Slash, | ||
| LBracket, | ||
| RBracket, | ||
| Plus, | ||
| Star, | ||
| Caret, | ||
| Backslash, | ||
| Dot, | ||
| Ampersand, | ||
| Bang, | ||
| TripleDash, | ||
| StringLit, | ||
| NumberLit, | ||
| Eof, | ||
| ]; | ||
| // Map from our lexer's TokenKind string to Chevrotain TokenType | ||
| export const tokenKindMap = { | ||
| IDENTIFIER: Identifier, | ||
| COLON: Colon, | ||
| QUESTION: Question, | ||
| EQUALS: Equals, | ||
| PIPE: Pipe, | ||
| LPAREN: LParen, | ||
| RPAREN: RParen, | ||
| LBRACE: LBrace, | ||
| RBRACE: RBrace, | ||
| COMMA: Comma, | ||
| SLASH: Slash, | ||
| LBRACKET: LBracket, | ||
| RBRACKET: RBracket, | ||
| PLUS: Plus, | ||
| STAR: Star, | ||
| CARET: Caret, | ||
| BACKSLASH: Backslash, | ||
| DOT: Dot, | ||
| AMPERSAND: Ampersand, | ||
| BANG: Bang, | ||
| TRIPLE_DASH: TripleDash, | ||
| STRING: StringLit, | ||
| NUMBER: NumberLit, | ||
| BOOLEAN: BooleanLit, | ||
| COMMENT: Comment, | ||
| EOF: Eof, | ||
| }; | ||
| //# sourceMappingURL=tokens.js.map |
| {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"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"} |
| import { z } from 'zod'; | ||
| const PaginationBase = z.strictObject({ | ||
| page: z.int().min(0).default(0).describe('Page number'), | ||
| pageSize: z.int().min(1).max(100).default(25).describe('Page number'), | ||
| sort: z.enum(['asc', 'desc']).default('desc').describe('Page size'), | ||
| total: z.int().min(0).describe('Sort order'), | ||
| }); | ||
| export const Pagination = z.strictObject({ | ||
| page: z.int().min(0).default(0).describe('Page number'), | ||
| pageSize: z.int().min(1).max(100).default(25).describe('Page number'), | ||
| sort: z.enum(['asc', 'desc']).default('desc').describe('Page size'), | ||
| }); | ||
| export type Pagination = z.infer<typeof Pagination>; | ||
| export const PaginationInput = z.strictObject({ | ||
| page: z.int().min(0).default(0).describe('Page number'), | ||
| pageSize: z.int().min(1).max(100).default(25).describe('Page number'), | ||
| sort: z.enum(['asc', 'desc']).default('desc').describe('Page size'), | ||
| total: z.int().min(0).describe('Sort order'), | ||
| }); | ||
| export type PaginationInput = z.infer<typeof PaginationInput>; |
| import type { OpRootNode } from './ast.js'; | ||
| import type { DiagnosticCollector } from './diagnostics.js'; | ||
| /** | ||
| * Warn when a route path contains `:param` placeholders that are not | ||
| * explicitly declared in a `params` block. | ||
| */ | ||
| export declare function validateOp(root: OpRootNode, diag: DiagnosticCollector): void; | ||
| //# sourceMappingURL=validate-op.d.ts.map |
| {"version":3,"file":"validate-op.d.ts","sourceRoot":"","sources":["../src/validate-op.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,mBAAmB,GAAG,IAAI,CAuB5E"} |
| /** Extract `:paramName` segments from a route path. */ | ||
| function extractPathParams(path) { | ||
| return [...path.matchAll(/:(\w+)/g)].map(m => m[1]); | ||
| } | ||
| /** | ||
| * Warn when a route path contains `:param` placeholders that are not | ||
| * explicitly declared in a `params` block. | ||
| */ | ||
| export function validateOp(root, diag) { | ||
| for (const route of root.routes) { | ||
| const pathParams = extractPathParams(route.path); | ||
| if (pathParams.length === 0) continue; | ||
| if (!route.params) { | ||
| // No params block at all | ||
| for (const name of pathParams) { | ||
| diag.warn(root.file, route.loc.line, `Path parameter ':${name}' is not explicitly defined in a params block`); | ||
| } | ||
| } else if (typeof route.params === 'string' || !Array.isArray(route.params)) { | ||
| // Type-reference or DtoTypeNode form — all params are covered by the type | ||
| continue; | ||
| } else { | ||
| // Block form — check each path param is declared | ||
| const declared = new Set(route.params.map(p => p.name)); | ||
| for (const name of pathParams) { | ||
| if (!declared.has(name)) { | ||
| diag.warn(root.file, route.loc.line, `Path parameter ':${name}' is not explicitly defined in a params block`); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=validate-op.js.map |
| {"version":3,"file":"validate-op.js","sourceRoot":"","sources":["../src/validate-op.ts"],"names":[],"mappings":"AAGA,uDAAuD;AACvD,SAAS,iBAAiB,CAAC,IAAY;IACrC,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAgB,EAAE,IAAyB;IACpE,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,iBAAiB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACjD,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QAEtC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,yBAAyB;YACzB,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,oBAAoB,IAAI,+CAA+C,CAAC,CAAC;YAChH,CAAC;QACH,CAAC;aAAM,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;YAC5E,0EAA0E;YAC1E,SAAS;QACX,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAC5E,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC9B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBACxB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,oBAAoB,IAAI,+CAA+C,CAAC,CAAC;gBAChH,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"} |
| import type { DtoRootNode, OpRootNode } from './ast.js'; | ||
| import type { DiagnosticCollector } from './diagnostics.js'; | ||
| /** | ||
| * After all files are parsed, validate that type references point to | ||
| * defined models. | ||
| */ | ||
| export declare function validateRefs(dtoRoots: DtoRootNode[], opRoots: OpRootNode[], diag: DiagnosticCollector, allDtoRoots?: DtoRootNode[]): void; | ||
| //# sourceMappingURL=validate-refs.d.ts.map |
| {"version":3,"file":"validate-refs.d.ts","sourceRoot":"","sources":["../src/validate-refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAe,MAAM,UAAU,CAAC;AACrE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,UAAU,EAAE,EACrB,IAAI,EAAE,mBAAmB,EACzB,WAAW,CAAC,EAAE,WAAW,EAAE,GAC1B,IAAI,CA4CN"} |
| /** | ||
| * After all files are parsed, validate that type references point to | ||
| * defined models. | ||
| */ | ||
| export function validateRefs(dtoRoots, opRoots, diag, allDtoRoots) { | ||
| // Phase 1: Collect all defined model names from ALL dto files (not just changed ones) | ||
| // so that cached/unchanged files don't cause false "not defined" warnings. | ||
| const modelNames = new Set(); | ||
| for (const root of allDtoRoots ?? dtoRoots) { | ||
| for (const model of root.models) { | ||
| modelNames.add(model.name); | ||
| } | ||
| } | ||
| // Phase 2: Check DTO type references | ||
| for (const root of dtoRoots) { | ||
| for (const model of root.models) { | ||
| if (model.base && !modelNames.has(model.base)) { | ||
| diag.warn(model.loc.file, model.loc.line, `Base model "${model.base}" is not defined in any .dto file`); | ||
| } | ||
| if (model.type) { | ||
| checkTypeRefs(model.type, model.loc.file, model.loc.line, modelNames, diag); | ||
| } | ||
| for (const field of model.fields) { | ||
| checkTypeRefs(field.type, field.loc.file, field.loc.line, modelNames, diag); | ||
| } | ||
| } | ||
| } | ||
| // Phase 3: Check OP type references | ||
| for (const root of opRoots) { | ||
| for (const route of root.routes) { | ||
| checkParamSourceRefs(route.params, root.file, route.loc.line, modelNames, diag); | ||
| for (const op of route.operations) { | ||
| if (op.request?.bodyType) { | ||
| checkTypeRefs(op.request.bodyType, root.file, op.loc.line, modelNames, diag); | ||
| } | ||
| for (const resp of op.responses) { | ||
| if (resp.bodyType) { | ||
| checkTypeRefs(resp.bodyType, root.file, op.loc.line, modelNames, diag); | ||
| } | ||
| } | ||
| checkParamSourceRefs(op.query, root.file, op.loc.line, modelNames, diag); | ||
| checkParamSourceRefs(op.headers, root.file, op.loc.line, modelNames, diag); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| function checkTypeRefs(type, file, line, models, diag) { | ||
| switch (type.kind) { | ||
| case 'ref': | ||
| if (!models.has(type.name)) { | ||
| diag.warn(file, line, `Referenced model "${type.name}" is not defined in any .dto file`); | ||
| } | ||
| break; | ||
| case 'array': | ||
| checkTypeRefs(type.item, file, line, models, diag); | ||
| break; | ||
| case 'tuple': | ||
| type.items.forEach(t => checkTypeRefs(t, file, line, models, diag)); | ||
| break; | ||
| case 'record': | ||
| checkTypeRefs(type.key, file, line, models, diag); | ||
| checkTypeRefs(type.value, file, line, models, diag); | ||
| break; | ||
| case 'union': | ||
| type.members.forEach(t => checkTypeRefs(t, file, line, models, diag)); | ||
| break; | ||
| case 'intersection': | ||
| type.members.forEach(t => checkTypeRefs(t, file, line, models, diag)); | ||
| break; | ||
| case 'lazy': | ||
| checkTypeRefs(type.inner, file, line, models, diag); | ||
| break; | ||
| case 'inlineObject': | ||
| type.fields.forEach(f => checkTypeRefs(f.type, file, f.loc.line, models, diag)); | ||
| break; | ||
| } | ||
| } | ||
| function checkParamSourceRefs(source, file, line, models, diag) { | ||
| if (!source) return; | ||
| if (typeof source === 'string') { | ||
| checkNameRef(source, file, line, models, diag); | ||
| } else if (Array.isArray(source)) { | ||
| for (const param of source) { | ||
| checkTypeRefs(param.type, file, param.loc.line, models, diag); | ||
| } | ||
| } else { | ||
| checkTypeRefs(source, file, line, models, diag); | ||
| } | ||
| } | ||
| function checkNameRef(name, file, line, models, diag) { | ||
| if (/^[A-Z]/.test(name) && !models.has(name)) { | ||
| diag.warn(file, line, `Referenced type "${name}" is not defined in any .dto file`); | ||
| } | ||
| } | ||
| //# sourceMappingURL=validate-refs.js.map |
| {"version":3,"file":"validate-refs.js","sourceRoot":"","sources":["../src/validate-refs.ts"],"names":[],"mappings":"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"} |
| import type { DtoRootNode, ModelNode, FieldNode, DtoTypeNode, InlineObjectTypeNode } from './ast.js'; | ||
| declare const BaseDtoVisitor: any; | ||
| export declare class DtoVisitor extends BaseDtoVisitor { | ||
| private file; | ||
| private comments; | ||
| constructor(file: string, comments: Map<number, string>); | ||
| dtoRoot(ctx: any): DtoRootNode; | ||
| frontMatter(ctx: any): [string, string][]; | ||
| metaEntry(ctx: any): [string, string]; | ||
| /** Look up a comment by line (or line-1), delete it from the map, and return trimmed text. */ | ||
| private consumeComment; | ||
| modelDecl(ctx: any): ModelNode; | ||
| fieldList(ctx: any): FieldNode[]; | ||
| fieldDecl(ctx: any): FieldNode | null; | ||
| typeExpression(ctx: any): DtoTypeNode; | ||
| intersectionExpr(ctx: any): DtoTypeNode; | ||
| singleType(ctx: any): DtoTypeNode; | ||
| typeArgs(ctx: any): any[]; | ||
| typeArg(ctx: any): any; | ||
| argValue(ctx: any): string | number | boolean; | ||
| inlineBraceObject(ctx: any): InlineObjectTypeNode; | ||
| inlineField(ctx: any): FieldNode; | ||
| defaultValue(ctx: any): string | number | boolean; | ||
| private buildCompoundType; | ||
| private buildArrayType; | ||
| private buildTupleType; | ||
| private buildRecordType; | ||
| private buildEnumType; | ||
| private buildLiteralType; | ||
| private buildLazyType; | ||
| private buildScalarWithModifiers; | ||
| } | ||
| export {}; | ||
| //# sourceMappingURL=visitor-dto.d.ts.map |
| {"version":3,"file":"visitor-dto.d.ts","sourceRoot":"","sources":["../src/visitor-dto.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,WAAW,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,EAC9B,oBAAoB,EAErC,MAAM,UAAU,CAAC;AAKlB,QAAA,MAAM,cAAc,KAA8C,CAAC;AAEnE,qBAAa,UAAW,SAAQ,cAAc;IAC5C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAOvD,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAkB9B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAWzC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAYrC,8FAA8F;IAC9F,OAAO,CAAC,cAAc;IActB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IAwC9B,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,EAAE;IAWhC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS,GAAG,IAAI;IA4CrC,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAWrC,gBAAgB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAWvC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IA2BjC,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;IAUzB,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAetB,QAAQ,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAwB7C,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,oBAAoB;IAWjD,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IAiChC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAUjD,OAAO,CAAC,iBAAiB;IAiBzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,wBAAwB;CA0BjC"} |
| import { dtoCstParser } from './chevrotain-parser-dto.js'; | ||
| import { SCALAR_NAMES } from './ast.js'; | ||
| const OBJECT_MODES = new Set(['strict', 'strip', 'loose']); | ||
| const BaseDtoVisitor = dtoCstParser.getBaseCstVisitorConstructor(); | ||
| export class DtoVisitor extends BaseDtoVisitor { | ||
| file; | ||
| comments; | ||
| constructor(file, comments) { | ||
| super(); | ||
| this.file = file; | ||
| this.comments = comments; | ||
| this.validateVisitor(); | ||
| } | ||
| dtoRoot(ctx) { | ||
| const meta = {}; | ||
| if (ctx.frontMatter) { | ||
| const entries = this.visit(ctx.frontMatter[0]); | ||
| for (const [key, value] of entries) { | ||
| meta[key] = value; | ||
| } | ||
| } | ||
| const models = []; | ||
| if (ctx.modelDecl) { | ||
| for (const modelCst of ctx.modelDecl) { | ||
| const model = this.visit(modelCst); | ||
| if (model) models.push(model); | ||
| } | ||
| } | ||
| return { kind: 'dtoRoot', meta, models, file: this.file }; | ||
| } | ||
| frontMatter(ctx) { | ||
| const entries = []; | ||
| if (ctx.metaEntry) { | ||
| for (const entryCst of ctx.metaEntry) { | ||
| const entry = this.visit(entryCst); | ||
| if (entry) entries.push(entry); | ||
| } | ||
| } | ||
| return entries; | ||
| } | ||
| metaEntry(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const key = identifiers[0]?.image ?? ''; | ||
| // Value is either a StringLit (quoted) or a second Identifier (unquoted) | ||
| if (ctx.StringLit) { | ||
| return [key, ctx.StringLit[0].image]; | ||
| } | ||
| // Second identifier is the value | ||
| const value = identifiers[1]?.image ?? ''; | ||
| return [key, value]; | ||
| } | ||
| /** Look up a comment by line (or line-1), delete it from the map, and return trimmed text. */ | ||
| consumeComment(line) { | ||
| if (this.comments.has(line)) { | ||
| const val = this.comments.get(line); | ||
| this.comments.delete(line); | ||
| return val.replace(/^\s*#\s*/, '').trim(); | ||
| } | ||
| if (this.comments.has(line - 1)) { | ||
| const val = this.comments.get(line - 1); | ||
| this.comments.delete(line - 1); | ||
| return val.replace(/^\s*#\s*/, '').trim(); | ||
| } | ||
| return undefined; | ||
| } | ||
| modelDecl(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| // Scan leading modifier keywords (mode and/or camel) in any order | ||
| let offset = 0; | ||
| let mode; | ||
| let camelCase = false; | ||
| while (offset < identifiers.length) { | ||
| const img = identifiers[offset].image; | ||
| if (OBJECT_MODES.has(img)) { | ||
| mode = img; | ||
| offset++; | ||
| } else if (img === 'camel') { | ||
| camelCase = true; | ||
| offset++; | ||
| } else break; | ||
| } | ||
| const nameToken = identifiers[offset]; | ||
| const name = nameToken.image; | ||
| const line = nameToken.startLine ?? 0; | ||
| // Description from comments: preceding line or same line | ||
| const description = this.consumeComment(line); | ||
| // Type alias form: Name : typeExpression (no braces, no fieldList) | ||
| if (ctx.typeExpression && !ctx.fieldList) { | ||
| const type = this.visit(ctx.typeExpression[0]); | ||
| return { kind: 'model', name, fields: [], type, description, loc: { file: this.file, line } }; | ||
| } | ||
| // Next identifier (if any) is the base model name | ||
| const base = identifiers[offset + 1]?.image; | ||
| // Parse fields from fieldList | ||
| const fields = []; | ||
| if (ctx.fieldList) { | ||
| const result = this.visit(ctx.fieldList[0]); | ||
| if (Array.isArray(result)) fields.push(...result); | ||
| } | ||
| return { kind: 'model', name, base, fields, mode, camelCase: camelCase || undefined, description, loc: { file: this.file, line } }; | ||
| } | ||
| fieldList(ctx) { | ||
| const fields = []; | ||
| if (ctx.fieldDecl) { | ||
| for (const fieldCst of ctx.fieldDecl) { | ||
| const field = this.visit(fieldCst); | ||
| if (field) fields.push(field); | ||
| } | ||
| } | ||
| return fields; | ||
| } | ||
| fieldDecl(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| if (identifiers.length === 0) return null; | ||
| const nameToken = identifiers[0]; | ||
| const fieldName = nameToken.image; | ||
| const line = nameToken.startLine ?? 0; | ||
| const optional = !!ctx.Question; | ||
| // Determine visibility: if there are 2+ identifiers, the second one may be | ||
| // a visibility modifier (from the gated OR branch in the grammar). | ||
| // identifiers[0] = field name | ||
| // identifiers[1] = visibility modifier (if present) | ||
| let visibility = 'normal'; | ||
| if (identifiers.length > 1) { | ||
| const vis = identifiers[1].image; | ||
| if (vis === 'readonly' || vis === 'writeonly') { | ||
| visibility = vis; | ||
| } | ||
| } | ||
| // Type expression (with or without visibility) | ||
| if (!ctx.typeExpression || ctx.typeExpression.length === 0) return null; | ||
| const extracted = extractNullability(this.visit(ctx.typeExpression[0])); | ||
| let type = extracted.type; | ||
| const nullable = extracted.nullable; | ||
| // Default value | ||
| let defaultVal; | ||
| if (ctx.defaultValue) { | ||
| defaultVal = this.visit(ctx.defaultValue[0]); | ||
| } | ||
| // Description from comments | ||
| const description = this.consumeComment(line); | ||
| return { | ||
| name: fieldName, | ||
| optional, | ||
| nullable, | ||
| visibility, | ||
| type, | ||
| default: defaultVal, | ||
| description, | ||
| loc: { file: this.file, line }, | ||
| }; | ||
| } | ||
| typeExpression(ctx) { | ||
| const types = []; | ||
| if (ctx.intersectionExpr) { | ||
| for (const ie of ctx.intersectionExpr) { | ||
| types.push(this.visit(ie)); | ||
| } | ||
| } | ||
| if (types.length === 1) return types[0]; | ||
| return { kind: 'union', members: types }; | ||
| } | ||
| intersectionExpr(ctx) { | ||
| const types = []; | ||
| if (ctx.singleType) { | ||
| for (const st of ctx.singleType) { | ||
| types.push(this.visit(st)); | ||
| } | ||
| } | ||
| if (types.length === 1) return types[0]; | ||
| return { kind: 'intersection', members: types }; | ||
| } | ||
| singleType(ctx) { | ||
| if (ctx.inlineBraceObject) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const modeToken = identifiers[0]; | ||
| const mode = modeToken && OBJECT_MODES.has(modeToken.image) ? modeToken.image : undefined; | ||
| const node = this.visit(ctx.inlineBraceObject[0]); | ||
| return mode ? { ...node, mode } : node; | ||
| } | ||
| const identToken = ctx.Identifier[0]; | ||
| const typeName = identToken.image; | ||
| // Type with parenthesized arguments | ||
| if (ctx.typeArgs) { | ||
| const args = this.visit(ctx.typeArgs[0]); | ||
| return this.buildCompoundType(typeName, args); | ||
| } | ||
| // Simple scalar | ||
| if (SCALAR_NAMES.has(typeName)) { | ||
| return { kind: 'scalar', name: typeName }; | ||
| } | ||
| // Model reference | ||
| return { kind: 'ref', name: typeName }; | ||
| } | ||
| typeArgs(ctx) { | ||
| const args = []; | ||
| if (ctx.typeArg) { | ||
| for (const ta of ctx.typeArg) { | ||
| args.push(this.visit(ta)); | ||
| } | ||
| } | ||
| return args; | ||
| } | ||
| typeArg(ctx) { | ||
| // key=value pair | ||
| if (ctx.Identifier && ctx.Equals) { | ||
| const key = ctx.Identifier[0].image; | ||
| const value = this.visit(ctx.argValue[0]); | ||
| return { key, value }; | ||
| } | ||
| // Standalone values | ||
| if (ctx.StringLit) return { type: 'string', value: ctx.StringLit[0].image }; | ||
| if (ctx.NumberLit) return { type: 'number', value: Number(ctx.NumberLit[0].image) }; | ||
| if (ctx.BooleanLit) return { type: 'boolean', value: ctx.BooleanLit[0].image === 'true' }; | ||
| if (ctx.typeExpression) return { type: 'type', value: this.visit(ctx.typeExpression[0]) }; | ||
| return null; | ||
| } | ||
| argValue(ctx) { | ||
| // Regex: /pattern/ — collect all tokens between slashes in order | ||
| if (ctx.Slash) { | ||
| const allToks = []; | ||
| for (const key of Object.keys(ctx)) { | ||
| if (key === 'Slash') continue; | ||
| if (Array.isArray(ctx[key])) { | ||
| for (const tok of ctx[key]) { | ||
| if (tok.image !== undefined && tok.startOffset !== undefined) { | ||
| allToks.push(tok); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| allToks.sort((a, b) => a.startOffset - b.startOffset); | ||
| return allToks.map(t => t.image).join(''); | ||
| } | ||
| if (ctx.Identifier) return ctx.Identifier[0].image; | ||
| if (ctx.NumberLit) return Number(ctx.NumberLit[0].image); | ||
| if (ctx.StringLit) return ctx.StringLit[0].image; | ||
| if (ctx.BooleanLit) return ctx.BooleanLit[0].image === 'true'; | ||
| return ''; | ||
| } | ||
| inlineBraceObject(ctx) { | ||
| const fields = []; | ||
| if (ctx.inlineField) { | ||
| for (const f of ctx.inlineField) { | ||
| const field = this.visit(f); | ||
| if (field) fields.push(field); | ||
| } | ||
| } | ||
| return { kind: 'inlineObject', fields }; | ||
| } | ||
| inlineField(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const nameToken = identifiers[0]; | ||
| const name = nameToken.image; | ||
| const line = nameToken.startLine ?? 0; | ||
| const optional = !!ctx.Question; | ||
| // identifiers[0] = field name; identifiers[1] = visibility modifier (if present) | ||
| let visibility = 'normal'; | ||
| if (identifiers.length > 1) { | ||
| const vis = identifiers[1].image; | ||
| if (vis === 'readonly' || vis === 'writeonly') visibility = vis; | ||
| } | ||
| const raw = ctx.typeExpression ? this.visit(ctx.typeExpression[0]) : { kind: 'scalar', name: 'unknown' }; | ||
| const { type, nullable } = extractNullability(raw); | ||
| let defaultVal; | ||
| if (ctx.defaultValue) { | ||
| defaultVal = this.visit(ctx.defaultValue[0]); | ||
| } | ||
| const description = this.consumeComment(line); | ||
| return { | ||
| name, | ||
| optional, | ||
| nullable, | ||
| visibility, | ||
| type, | ||
| default: defaultVal, | ||
| description, | ||
| loc: { file: this.file, line }, | ||
| }; | ||
| } | ||
| defaultValue(ctx) { | ||
| if (ctx.StringLit) return ctx.StringLit[0].image; | ||
| if (ctx.NumberLit) return Number(ctx.NumberLit[0].image); | ||
| if (ctx.BooleanLit) return ctx.BooleanLit[0].image === 'true'; | ||
| if (ctx.Identifier) return ctx.Identifier[0].image; | ||
| return ''; | ||
| } | ||
| // ─── Compound type builders ─────────────────────────────────────────── | ||
| buildCompoundType(name, args) { | ||
| switch (name) { | ||
| case 'array': | ||
| return this.buildArrayType(args); | ||
| case 'tuple': | ||
| return this.buildTupleType(args); | ||
| case 'record': | ||
| return this.buildRecordType(args); | ||
| case 'enum': | ||
| return this.buildEnumType(args); | ||
| case 'literal': | ||
| return this.buildLiteralType(args); | ||
| case 'lazy': | ||
| return this.buildLazyType(args); | ||
| default: { | ||
| if (SCALAR_NAMES.has(name)) { | ||
| return this.buildScalarWithModifiers(name, args); | ||
| } | ||
| return { kind: 'ref', name }; | ||
| } | ||
| } | ||
| } | ||
| buildArrayType(args) { | ||
| const typeArgs = args.filter(a => a?.type === 'type'); | ||
| const item = typeArgs[0]?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| let min; | ||
| let max; | ||
| for (const a of args) { | ||
| if (a?.key === 'min') min = Number(a.value); | ||
| if (a?.key === 'max') max = Number(a.value); | ||
| } | ||
| return { kind: 'array', item, min, max }; | ||
| } | ||
| buildTupleType(args) { | ||
| const items = args.filter(a => a?.type === 'type').map(a => a.value); | ||
| return { kind: 'tuple', items }; | ||
| } | ||
| buildRecordType(args) { | ||
| const typeArgs = args.filter(a => a?.type === 'type'); | ||
| const key = typeArgs[0]?.value ?? { kind: 'scalar', name: 'string' }; | ||
| const value = typeArgs[1]?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| return { kind: 'record', key, value }; | ||
| } | ||
| buildEnumType(args) { | ||
| const values = []; | ||
| for (const a of args) { | ||
| if (a?.type === 'type' && a.value?.kind === 'ref') { | ||
| values.push(a.value.name); | ||
| } else if (a?.type === 'string') { | ||
| values.push(a.value); | ||
| } else if (a?.type === 'type' && a.value?.kind === 'scalar') { | ||
| values.push(a.value.name); | ||
| } | ||
| } | ||
| return { kind: 'enum', values }; | ||
| } | ||
| buildLiteralType(args) { | ||
| const arg = args[0]; | ||
| if (!arg) return { kind: 'literal', value: '' }; | ||
| if (arg.type === 'string') return { kind: 'literal', value: arg.value }; | ||
| if (arg.type === 'number') return { kind: 'literal', value: arg.value }; | ||
| if (arg.type === 'boolean') return { kind: 'literal', value: arg.value }; | ||
| return { kind: 'literal', value: String(arg.value) }; | ||
| } | ||
| buildLazyType(args) { | ||
| const typeArg = args.find(a => a?.type === 'type'); | ||
| const inner = typeArg?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| return { kind: 'lazy', inner }; | ||
| } | ||
| buildScalarWithModifiers(name, args) { | ||
| const scalar = { kind: 'scalar', name }; | ||
| for (const a of args) { | ||
| // Positional string argument (quoted): used as format for date/time types | ||
| if (a?.type === 'string' && !a.key) { | ||
| if (name === 'date' || name === 'time' || name === 'datetime') { | ||
| scalar.format = String(a.value); | ||
| } | ||
| continue; | ||
| } | ||
| // Positional ref argument (unquoted identifier): used as format for date/time types | ||
| if (a?.type === 'type' && a.value?.kind === 'ref' && !a.key) { | ||
| if (name === 'date' || name === 'time' || name === 'datetime') { | ||
| scalar.format = String(a.value.name); | ||
| } | ||
| continue; | ||
| } | ||
| if (!a?.key) continue; | ||
| if (a.key === 'min') scalar.min = name === 'bigint' ? BigInt(a.value) : Number(a.value); | ||
| if (a.key === 'max') scalar.max = name === 'bigint' ? BigInt(a.value) : Number(a.value); | ||
| if (a.key === 'len' || a.key === 'length') scalar.len = Number(a.value); | ||
| if (a.key === 'regex') scalar.regex = String(a.value); | ||
| if (a.key === 'format') scalar.format = String(a.value); | ||
| } | ||
| return scalar; | ||
| } | ||
| } | ||
| function extractNullability(type) { | ||
| if (type.kind === 'union') { | ||
| const union = type; | ||
| const nullIdx = union.members.findIndex(m => m.kind === 'scalar' && m.name === 'null'); | ||
| if (nullIdx !== -1) { | ||
| union.members.splice(nullIdx, 1); | ||
| return { type: union.members.length === 1 ? union.members[0] : type, nullable: true }; | ||
| } | ||
| } else if (type.kind === 'scalar' && type.name === 'null') { | ||
| return { type, nullable: true }; | ||
| } | ||
| return { type, nullable: false }; | ||
| } | ||
| //# sourceMappingURL=visitor-dto.js.map |
| {"version":3,"file":"visitor-dto.js","sourceRoot":"","sources":["../src/visitor-dto.ts"],"names":[],"mappings":"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"} |
| import type { | ||
| OpRootNode, | ||
| OpRouteNode, | ||
| OpOperationNode, | ||
| OpParamNode, | ||
| OpRequestNode, | ||
| OpResponseNode, | ||
| DtoTypeNode, | ||
| FieldNode, | ||
| ParamSource, | ||
| InlineObjectTypeNode, | ||
| SecurityNode, | ||
| ObjectMode, | ||
| } from './ast.js'; | ||
| import type { DiagnosticCollector } from './diagnostics.js'; | ||
| declare const BaseOpVisitor: any; | ||
| export declare class OpVisitor extends BaseOpVisitor { | ||
| private file; | ||
| private diag; | ||
| private comments; | ||
| constructor(file: string, diag: DiagnosticCollector, comments: Map<number, string>); | ||
| opRoot(ctx: any): OpRootNode; | ||
| frontMatter(ctx: any): [string, string][]; | ||
| metaEntry(ctx: any): [string, string]; | ||
| /** Look up a comment on the exact line only (for inline comments), delete and return trimmed text. */ | ||
| private consumeInlineComment; | ||
| /** Look up a comment by line (or line-1), delete it from the map, and return trimmed text. */ | ||
| private consumeComment; | ||
| routeDecl(ctx: any): OpRouteNode; | ||
| routePath(ctx: any): string; | ||
| routeBody(ctx: any): { | ||
| params?: ParamSource; | ||
| paramsMode?: ObjectMode; | ||
| security?: SecurityNode; | ||
| operations: OpOperationNode[]; | ||
| }; | ||
| paramsBlock(ctx: any): { | ||
| source: ParamSource; | ||
| mode?: ObjectMode; | ||
| }; | ||
| paramDecl(ctx: any): OpParamNode; | ||
| httpOperation(ctx: any): OpOperationNode; | ||
| operationBody(ctx: any): { | ||
| service?: string; | ||
| sdk?: string; | ||
| signature?: string; | ||
| signatureDescription?: string; | ||
| query?: ParamSource; | ||
| queryMode?: ObjectMode; | ||
| headers?: ParamSource; | ||
| headersMode?: ObjectMode; | ||
| request?: OpRequestNode; | ||
| responses: OpResponseNode[]; | ||
| security?: SecurityNode; | ||
| }; | ||
| securityBlock(ctx: any): SecurityNode; | ||
| securityRolesLine(ctx: any): { | ||
| roles: string[]; | ||
| description?: string; | ||
| }; | ||
| signatureDecl(ctx: any): { | ||
| signature: string; | ||
| description?: string; | ||
| }; | ||
| queryBlock(ctx: any): { | ||
| source: ParamSource; | ||
| mode?: ObjectMode; | ||
| }; | ||
| headersBlock(ctx: any): { | ||
| source: ParamSource; | ||
| mode?: ObjectMode; | ||
| }; | ||
| private visitParamSource; | ||
| serviceDecl(ctx: any): string; | ||
| sdkDecl(ctx: any): string; | ||
| requestBlock(ctx: any): OpRequestNode | undefined; | ||
| responseBlock(ctx: any): OpResponseNode[]; | ||
| statusCodeBlock(ctx: any): OpResponseNode; | ||
| contentTypeLine(ctx: any): { | ||
| contentType: string; | ||
| bodyType: DtoTypeNode; | ||
| }; | ||
| opTypeExpr(ctx: any): DtoTypeNode; | ||
| opIntersectionExpr(ctx: any): DtoTypeNode; | ||
| opAtomicType(ctx: any): DtoTypeNode; | ||
| opTypeArgs(ctx: any): any[]; | ||
| opTypeArg(ctx: any): any; | ||
| opArgValue(ctx: any): string | number | boolean; | ||
| opInlineObject(ctx: any): InlineObjectTypeNode; | ||
| opInlineField(ctx: any): FieldNode; | ||
| opDefaultValue(ctx: any): string | number | boolean; | ||
| } | ||
| export {}; | ||
| //# sourceMappingURL=visitor-op.d.ts.map |
| {"version":3,"file":"visitor-op.d.ts","sourceRoot":"","sources":["../src/visitor-op.ts"],"names":[],"mappings":"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"} |
| import { opCstParser } from './chevrotain-parser-op.js'; | ||
| import { SCALAR_NAMES, SECURITY_NONE } from './ast.js'; | ||
| const OBJECT_MODES = new Set(['strict', 'strip', 'loose']); | ||
| const ROUTE_MODIFIERS = new Set(['internal', 'deprecated', 'public']); | ||
| const BaseOpVisitor = opCstParser.getBaseCstVisitorConstructor(); | ||
| export class OpVisitor extends BaseOpVisitor { | ||
| file; | ||
| diag; | ||
| comments; | ||
| constructor(file, diag, comments) { | ||
| super(); | ||
| this.file = file; | ||
| this.diag = diag; | ||
| this.comments = comments; | ||
| this.validateVisitor(); | ||
| } | ||
| opRoot(ctx) { | ||
| const meta = {}; | ||
| if (ctx.frontMatter) { | ||
| const entries = this.visit(ctx.frontMatter[0]); | ||
| for (const [key, value] of entries) { | ||
| meta[key] = value; | ||
| } | ||
| } | ||
| const security = ctx.securityBlock ? this.visit(ctx.securityBlock[0]) : undefined; | ||
| const routes = []; | ||
| if (ctx.routeDecl) { | ||
| for (const routeCst of ctx.routeDecl) { | ||
| const route = this.visit(routeCst); | ||
| if (route) routes.push(route); | ||
| } | ||
| } | ||
| return { kind: 'opRoot', meta, security, routes, file: this.file }; | ||
| } | ||
| frontMatter(ctx) { | ||
| const entries = []; | ||
| if (ctx.metaEntry) { | ||
| for (const entryCst of ctx.metaEntry) { | ||
| const entry = this.visit(entryCst); | ||
| if (entry) entries.push(entry); | ||
| } | ||
| } | ||
| return entries; | ||
| } | ||
| metaEntry(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const key = identifiers[0]?.image ?? ''; | ||
| if (ctx.StringLit) { | ||
| return [key, ctx.StringLit[0].image]; | ||
| } | ||
| const value = identifiers[1]?.image ?? ''; | ||
| return [key, value]; | ||
| } | ||
| /** Look up a comment on the exact line only (for inline comments), delete and return trimmed text. */ | ||
| consumeInlineComment(line) { | ||
| if (this.comments.has(line)) { | ||
| const val = this.comments.get(line); | ||
| this.comments.delete(line); | ||
| return val.replace(/^\s*#\s*/, '').trim(); | ||
| } | ||
| return undefined; | ||
| } | ||
| /** Look up a comment by line (or line-1), delete it from the map, and return trimmed text. */ | ||
| consumeComment(line) { | ||
| if (this.comments.has(line)) { | ||
| const val = this.comments.get(line); | ||
| this.comments.delete(line); | ||
| return val.replace(/^\s*#\s*/, '').trim(); | ||
| } | ||
| if (this.comments.has(line - 1)) { | ||
| const val = this.comments.get(line - 1); | ||
| this.comments.delete(line - 1); | ||
| return val.replace(/^\s*#\s*/, '').trim(); | ||
| } | ||
| return undefined; | ||
| } | ||
| routeDecl(ctx) { | ||
| const path = this.visit(ctx.routePath[0]); | ||
| const line = ctx.LBrace?.[0]?.startLine ?? 0; | ||
| const description = this.consumeComment(line); | ||
| // Modifier identifiers are consumed directly in routeDecl (not inside routePath sub-rule) | ||
| const modifierTokens = ctx.Identifier ?? []; | ||
| const modifiers = modifierTokens.length > 0 ? modifierTokens.map(t => t.image).filter(m => ROUTE_MODIFIERS.has(m)) : undefined; | ||
| let params; | ||
| let paramsMode; | ||
| let security; | ||
| let operations = []; | ||
| if (ctx.routeBody) { | ||
| const body = this.visit(ctx.routeBody[0]); | ||
| params = body.params; | ||
| paramsMode = body.paramsMode; | ||
| security = body.security; | ||
| operations = body.operations; | ||
| } | ||
| return { path, params, paramsMode, security, operations, modifiers, description, loc: { file: this.file, line } }; | ||
| } | ||
| routePath(ctx) { | ||
| const allToks = []; | ||
| if (ctx.Slash) for (const t of ctx.Slash) allToks.push(t); | ||
| if (ctx.Colon) for (const t of ctx.Colon) allToks.push(t); | ||
| if (ctx.Identifier) for (const t of ctx.Identifier) allToks.push(t); | ||
| allToks.sort((a, b) => a.startOffset - b.startOffset); | ||
| return allToks.map(t => t.image || t.tokenType.name.charAt(0).toLowerCase()).join(''); | ||
| } | ||
| routeBody(ctx) { | ||
| let params; | ||
| let paramsMode; | ||
| let security; | ||
| const operations = []; | ||
| if (ctx.paramsBlock) { | ||
| const result = this.visit(ctx.paramsBlock[0]); | ||
| params = result.source; | ||
| paramsMode = result.mode; | ||
| } | ||
| if (ctx.securityBlock) { | ||
| security = this.visit(ctx.securityBlock[0]); | ||
| } | ||
| if (ctx.httpOperation) { | ||
| for (const opCst of ctx.httpOperation) { | ||
| const op = this.visit(opCst); | ||
| if (op) operations.push(op); | ||
| } | ||
| } | ||
| return { params, paramsMode, security, operations }; | ||
| } | ||
| paramsBlock(ctx) { | ||
| return this.visitParamSource(ctx); | ||
| } | ||
| paramDecl(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const name = identifiers[0].image; | ||
| const line = identifiers[0].startLine ?? 0; | ||
| if (!identifiers[1]) { | ||
| this.diag.warn(this.file, line, `Path parameter "${name}" has no explicit type; defaulting to string`); | ||
| } | ||
| const typeName = identifiers[1]?.image ?? 'string'; | ||
| const description = this.consumeComment(line); | ||
| return { | ||
| name, | ||
| optional: false, | ||
| nullable: false, | ||
| type: resolveSimpleType(typeName), | ||
| description, | ||
| loc: { file: this.file, line }, | ||
| }; | ||
| } | ||
| httpOperation(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const methodToken = identifiers[0]; | ||
| const method = methodToken.image.toLowerCase(); | ||
| const line = methodToken.startLine ?? 0; | ||
| const description = this.consumeComment(line); | ||
| // Modifier tokens follow the HTTP method identifier (index 1+). | ||
| // 'public' is stored in the array (for round-trip formatting); resolveModifiers | ||
| // interprets it as an explicit override that clears inherited route modifiers. | ||
| const modifierTokens = identifiers.slice(1); | ||
| const modifiers = modifierTokens.length > 0 ? modifierTokens.map(t => t.image).filter(m => ROUTE_MODIFIERS.has(m)) : undefined; | ||
| let service; | ||
| let sdk; | ||
| let query; | ||
| let queryMode; | ||
| let headers; | ||
| let headersMode; | ||
| let request; | ||
| let responses = []; | ||
| let security; | ||
| let signature; | ||
| let signatureDescription; | ||
| if (ctx.operationBody) { | ||
| const body = this.visit(ctx.operationBody[0]); | ||
| service = body.service; | ||
| sdk = body.sdk; | ||
| signature = body.signature; | ||
| signatureDescription = body.signatureDescription; | ||
| query = body.query; | ||
| queryMode = body.queryMode; | ||
| headers = body.headers; | ||
| headersMode = body.headersMode; | ||
| request = body.request; | ||
| responses = body.responses; | ||
| security = body.security; | ||
| } | ||
| return { | ||
| method, | ||
| service, | ||
| sdk, | ||
| signature, | ||
| signatureDescription, | ||
| query, | ||
| queryMode, | ||
| headers, | ||
| headersMode, | ||
| request, | ||
| responses, | ||
| security, | ||
| modifiers, | ||
| description, | ||
| loc: { file: this.file, line }, | ||
| }; | ||
| } | ||
| operationBody(ctx) { | ||
| let service; | ||
| let sdk; | ||
| let signature; | ||
| let signatureDescription; | ||
| let query; | ||
| let queryMode; | ||
| let headers; | ||
| let headersMode; | ||
| let request; | ||
| let responses = []; | ||
| let security; | ||
| if (ctx.serviceDecl) { | ||
| service = this.visit(ctx.serviceDecl[0]); | ||
| } | ||
| if (ctx.sdkDecl) { | ||
| sdk = this.visit(ctx.sdkDecl[0]); | ||
| } | ||
| if (ctx.signatureDecl) { | ||
| const result = this.visit(ctx.signatureDecl[0]); | ||
| signature = result.signature; | ||
| signatureDescription = result.description; | ||
| } | ||
| if (ctx.queryBlock) { | ||
| const result = this.visit(ctx.queryBlock[0]); | ||
| query = result.source; | ||
| queryMode = result.mode; | ||
| } | ||
| if (ctx.headersBlock) { | ||
| const result = this.visit(ctx.headersBlock[0]); | ||
| headers = result.source; | ||
| headersMode = result.mode; | ||
| } | ||
| if (ctx.requestBlock) { | ||
| request = this.visit(ctx.requestBlock[0]); | ||
| } | ||
| if (ctx.responseBlock) { | ||
| responses = this.visit(ctx.responseBlock[0]); | ||
| } | ||
| if (ctx.securityBlock) { | ||
| security = this.visit(ctx.securityBlock[0]); | ||
| } | ||
| return { service, sdk, signature, signatureDescription, query, queryMode, headers, headersMode, request, responses, security }; | ||
| } | ||
| securityBlock(ctx) { | ||
| if (!ctx.LBrace) { | ||
| // security: none | ||
| return SECURITY_NONE; | ||
| } | ||
| // security: { roles: admin moderator } | ||
| const line = ctx.LBrace[0].startLine ?? 0; | ||
| const fields = { loc: { file: this.file, line } }; | ||
| if (ctx.securityRolesLine) { | ||
| const result = this.visit(ctx.securityRolesLine[0]); | ||
| fields.roles = result.roles; | ||
| if (result.description) fields.rolesDescription = result.description; | ||
| } | ||
| return fields; | ||
| } | ||
| securityRolesLine(ctx) { | ||
| const identifiers = ctx.Identifier ?? []; | ||
| // First identifier is "roles" keyword, rest are role names | ||
| const roles = identifiers.slice(1).map(t => t.image); | ||
| const line = identifiers[0]?.startLine ?? 0; | ||
| return { roles, description: this.consumeComment(line) }; | ||
| } | ||
| signatureDecl(ctx) { | ||
| // Accept either a quoted string ("key") or an unquoted identifier (KEY_NAME) | ||
| const signature = ctx.StringLit?.[0] ? ctx.StringLit[0].image : ctx.Identifier[1].image; | ||
| const line = ctx.Identifier[0]?.startLine ?? 0; | ||
| return { signature, description: this.consumeComment(line) }; | ||
| } | ||
| queryBlock(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const mode = identifiers.length > 0 && OBJECT_MODES.has(identifiers[0].image) ? identifiers[0].image : undefined; | ||
| const typeNode = this.visit(ctx.opTypeExpr[0]); | ||
| return { source: typeNodeToParamSource(typeNode), mode }; | ||
| } | ||
| headersBlock(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const mode = identifiers.length > 0 && OBJECT_MODES.has(identifiers[0].image) ? identifiers[0].image : undefined; | ||
| const typeNode = this.visit(ctx.opTypeExpr[0]); | ||
| return { source: typeNodeToParamSource(typeNode), mode }; | ||
| } | ||
| visitParamSource(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const hasMode = identifiers.length > 0 && OBJECT_MODES.has(identifiers[0].image); | ||
| const mode = hasMode ? identifiers[0].image : undefined; | ||
| // Block form: keyword { name: type ... } | ||
| if (ctx.LBrace) { | ||
| const params = []; | ||
| if (ctx.paramDecl) { | ||
| for (const pd of ctx.paramDecl) { | ||
| const param = this.visit(pd); | ||
| if (param) params.push(param); | ||
| } | ||
| } | ||
| return { source: params, mode }; | ||
| } | ||
| // Declaration form: keyword: TypeName | ||
| // identifiers layout: [mode?, keyword, typeRef?] | ||
| const typeRef = identifiers[hasMode ? 2 : 1]?.image ?? ''; | ||
| return { source: typeRef, mode }; | ||
| } | ||
| serviceDecl(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| return identifiers[1]?.image ?? ''; | ||
| } | ||
| sdkDecl(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| return identifiers[1]?.image ?? ''; | ||
| } | ||
| requestBlock(ctx) { | ||
| if (!ctx.contentTypeLine) return undefined; | ||
| const ctLine = this.visit(ctx.contentTypeLine[0]); | ||
| const ct = ctLine.contentType.toLowerCase().includes('multipart') ? 'multipart/form-data' : 'application/json'; | ||
| return { contentType: ct, bodyType: ctLine.bodyType }; | ||
| } | ||
| responseBlock(ctx) { | ||
| const responses = []; | ||
| if (ctx.statusCodeBlock) { | ||
| for (const scb of ctx.statusCodeBlock) { | ||
| responses.push(this.visit(scb)); | ||
| } | ||
| } | ||
| return responses; | ||
| } | ||
| statusCodeBlock(ctx) { | ||
| const statusCode = parseInt(ctx.NumberLit[0].image, 10); | ||
| let contentType; | ||
| let bodyType; | ||
| if (ctx.contentTypeLine) { | ||
| const ctLine = this.visit(ctx.contentTypeLine[0]); | ||
| contentType = 'application/json'; | ||
| bodyType = ctLine.bodyType; | ||
| } | ||
| return { statusCode, contentType, bodyType }; | ||
| } | ||
| contentTypeLine(ctx) { | ||
| const identifiers = ctx.Identifier || []; | ||
| const ctPart1 = identifiers[0]?.image ?? ''; | ||
| const ctPart2 = identifiers[1]?.image ?? ''; | ||
| const contentType = `${ctPart1}/${ctPart2}`; | ||
| const bodyType = ctx.opTypeExpr ? this.visit(ctx.opTypeExpr[0]) : { kind: 'scalar', name: 'unknown' }; | ||
| return { contentType, bodyType }; | ||
| } | ||
| // ─── OP Type Expression Visitors ──────────────────────────────────── | ||
| opTypeExpr(ctx) { | ||
| const members = []; | ||
| if (ctx.opIntersectionExpr) { | ||
| for (const ie of ctx.opIntersectionExpr) { | ||
| members.push(this.visit(ie)); | ||
| } | ||
| } | ||
| if (members.length === 1) return members[0]; | ||
| return { kind: 'union', members }; | ||
| } | ||
| opIntersectionExpr(ctx) { | ||
| const members = []; | ||
| if (ctx.opAtomicType) { | ||
| for (const at of ctx.opAtomicType) { | ||
| members.push(this.visit(at)); | ||
| } | ||
| } | ||
| if (members.length === 1) return members[0]; | ||
| return { kind: 'intersection', members }; | ||
| } | ||
| opAtomicType(ctx) { | ||
| if (ctx.opInlineObject) { | ||
| return this.visit(ctx.opInlineObject[0]); | ||
| } | ||
| const identToken = ctx.Identifier[0]; | ||
| const typeName = identToken.image; | ||
| // Type with arguments: array(User), string(min=1), etc. | ||
| if (ctx.opTypeArgs) { | ||
| const args = this.visit(ctx.opTypeArgs[0]); | ||
| const node = buildCompoundType(typeName, args); | ||
| if (ctx.LBracket) { | ||
| return { kind: 'array', item: node }; | ||
| } | ||
| return node; | ||
| } | ||
| // Postfix array: Type[] | ||
| if (ctx.LBracket) { | ||
| const base = resolveSimpleType(typeName); | ||
| return { kind: 'array', item: base }; | ||
| } | ||
| return resolveSimpleType(typeName); | ||
| } | ||
| opTypeArgs(ctx) { | ||
| const args = []; | ||
| if (ctx.opTypeArg) { | ||
| for (const ta of ctx.opTypeArg) { | ||
| args.push(this.visit(ta)); | ||
| } | ||
| } | ||
| return args; | ||
| } | ||
| opTypeArg(ctx) { | ||
| if (ctx.Identifier && ctx.Equals) { | ||
| const key = ctx.Identifier[0].image; | ||
| const value = this.visit(ctx.opArgValue[0]); | ||
| return { key, value }; | ||
| } | ||
| if (ctx.StringLit) return { type: 'string', value: ctx.StringLit[0].image }; | ||
| if (ctx.NumberLit) return { type: 'number', value: Number(ctx.NumberLit[0].image) }; | ||
| if (ctx.BooleanLit) return { type: 'boolean', value: ctx.BooleanLit[0].image === 'true' }; | ||
| if (ctx.opTypeExpr) return { type: 'type', value: this.visit(ctx.opTypeExpr[0]) }; | ||
| return null; | ||
| } | ||
| opArgValue(ctx) { | ||
| if (ctx.NumberLit) return Number(ctx.NumberLit[0].image); | ||
| if (ctx.StringLit) return ctx.StringLit[0].image; | ||
| if (ctx.BooleanLit) return ctx.BooleanLit[0].image === 'true'; | ||
| if (ctx.Identifier) return ctx.Identifier[0].image; | ||
| return ''; | ||
| } | ||
| opInlineObject(ctx) { | ||
| const fields = []; | ||
| if (ctx.opInlineField) { | ||
| for (const f of ctx.opInlineField) { | ||
| const field = this.visit(f); | ||
| if (field) fields.push(field); | ||
| } | ||
| } | ||
| return { kind: 'inlineObject', fields }; | ||
| } | ||
| opInlineField(ctx) { | ||
| const nameToken = ctx.Identifier[0]; | ||
| const name = nameToken.image; | ||
| const line = nameToken.startLine ?? 0; | ||
| const optional = !!ctx.Question; | ||
| const type = ctx.opTypeExpr ? this.visit(ctx.opTypeExpr[0]) : { kind: 'scalar', name: 'unknown' }; | ||
| let defaultVal; | ||
| if (ctx.opDefaultValue) { | ||
| defaultVal = this.visit(ctx.opDefaultValue[0]); | ||
| } | ||
| const description = this.consumeComment(line); | ||
| return { | ||
| name, | ||
| optional, | ||
| nullable: false, | ||
| visibility: 'normal', | ||
| type, | ||
| default: defaultVal, | ||
| description, | ||
| loc: { file: this.file, line }, | ||
| }; | ||
| } | ||
| opDefaultValue(ctx) { | ||
| if (ctx.StringLit) return ctx.StringLit[0].image; | ||
| if (ctx.NumberLit) return Number(ctx.NumberLit[0].image); | ||
| if (ctx.BooleanLit) return ctx.BooleanLit[0].image === 'true'; | ||
| if (ctx.Identifier) return ctx.Identifier[0].image; | ||
| return ''; | ||
| } | ||
| } | ||
| // ─── Helpers ───────────────────────────────────────────────────────────── | ||
| function resolveSimpleType(name) { | ||
| if (SCALAR_NAMES.has(name)) { | ||
| return { kind: 'scalar', name: name }; | ||
| } | ||
| return { kind: 'ref', name }; | ||
| } | ||
| /** Convert a DtoTypeNode to ParamSource for query/headers blocks. */ | ||
| function typeNodeToParamSource(node) { | ||
| if (node.kind === 'ref') return node.name; | ||
| if (node.kind === 'inlineObject') { | ||
| return node.fields.map(f => ({ | ||
| name: f.name, | ||
| optional: f.optional, | ||
| nullable: f.nullable, | ||
| type: f.type, | ||
| default: f.default, | ||
| description: f.description, | ||
| loc: f.loc, | ||
| })); | ||
| } | ||
| return node; | ||
| } | ||
| /** Build a compound type from type name and args (mirrors DTO visitor logic). */ | ||
| function buildCompoundType(name, args) { | ||
| switch (name) { | ||
| case 'array': { | ||
| const typeArgs = args.filter(a => a?.type === 'type'); | ||
| const item = typeArgs[0]?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| let min; | ||
| let max; | ||
| for (const a of args) { | ||
| if (a?.key === 'min') min = Number(a.value); | ||
| if (a?.key === 'max') max = Number(a.value); | ||
| } | ||
| return { kind: 'array', item, min, max }; | ||
| } | ||
| case 'tuple': { | ||
| const items = args.filter(a => a?.type === 'type').map(a => a.value); | ||
| return { kind: 'tuple', items }; | ||
| } | ||
| case 'record': { | ||
| const typeArgs = args.filter(a => a?.type === 'type'); | ||
| const key = typeArgs[0]?.value ?? { kind: 'scalar', name: 'string' }; | ||
| const value = typeArgs[1]?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| return { kind: 'record', key, value }; | ||
| } | ||
| case 'enum': { | ||
| const values = []; | ||
| for (const a of args) { | ||
| if (a?.type === 'type' && a.value?.kind === 'ref') values.push(a.value.name); | ||
| else if (a?.type === 'string') values.push(a.value); | ||
| else if (a?.type === 'type' && a.value?.kind === 'scalar') values.push(a.value.name); | ||
| } | ||
| return { kind: 'enum', values }; | ||
| } | ||
| case 'literal': { | ||
| const arg = args[0]; | ||
| if (!arg) return { kind: 'literal', value: '' }; | ||
| if (arg.type === 'string') return { kind: 'literal', value: arg.value }; | ||
| if (arg.type === 'number') return { kind: 'literal', value: arg.value }; | ||
| if (arg.type === 'boolean') return { kind: 'literal', value: arg.value }; | ||
| return { kind: 'literal', value: String(arg.value) }; | ||
| } | ||
| case 'lazy': { | ||
| const typeArg = args.find(a => a?.type === 'type'); | ||
| const inner = typeArg?.value ?? { kind: 'scalar', name: 'unknown' }; | ||
| return { kind: 'lazy', inner }; | ||
| } | ||
| default: { | ||
| if (SCALAR_NAMES.has(name)) { | ||
| const scalar = { kind: 'scalar', name: name }; | ||
| for (const a of args) { | ||
| // Positional string (quoted) or ref (unquoted identifier): format for date/time | ||
| if (!a?.key) { | ||
| if ( | ||
| (a?.type === 'string' || (a?.type === 'type' && a.value?.kind === 'ref')) && | ||
| (name === 'date' || name === 'time' || name === 'datetime') | ||
| ) { | ||
| scalar.format = a.type === 'string' ? String(a.value) : String(a.value.name); | ||
| } | ||
| continue; | ||
| } | ||
| if (a.key === 'min') scalar.min = name === 'bigint' ? BigInt(a.value) : Number(a.value); | ||
| if (a.key === 'max') scalar.max = name === 'bigint' ? BigInt(a.value) : Number(a.value); | ||
| if (a.key === 'len' || a.key === 'length') scalar.len = Number(a.value); | ||
| if (a.key === 'regex') scalar.regex = String(a.value); | ||
| if (a.key === 'format') scalar.format = String(a.value); | ||
| } | ||
| return scalar; | ||
| } | ||
| return { kind: 'ref', name }; | ||
| } | ||
| } | ||
| } | ||
| //# sourceMappingURL=visitor-op.js.map |
| {"version":3,"file":"visitor-op.js","sourceRoot":"","sources":["../src/visitor-op.ts"],"names":[],"mappings":"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"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
AI-detected potential code anomaly
Supply chain riskAI has identified unusual behaviors that may pose a security risk.
Found 1 instance in 1 package
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
Found 1 instance in 1 package
No README
QualityPackage does not have a README. This may indicate a failed publish or a low quality package.
Found 1 instance in 1 package
Filesystem access
Supply chain riskAccesses the file system, and could potentially read sensitive data.
Found 1 instance in 1 package
0
-100%95
Infinity%186081
-74.77%32
-76.3%1777
-79.64%1
Infinity%+ Added
+ Added
- Removed
- Removed
Updated