Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@contractkit/cli

Package Overview
Dependencies
Maintainers
1
Versions
14
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@contractkit/cli - npm Package Compare versions

Comparing version
0.5.1
to
0.6.0
+181
coverage/resolve-plugin-files.ts.html
<!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">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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">&nbsp;</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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';
&nbsp;
/**
* 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');
}
}
}
}
}
&nbsp;</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>
# @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');
});
});
+5
-21

> @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 @@

ESM Build start
ESM dist/cli.js 14.13 KB
ESM dist/cli.js.map 33.55 KB
ESM ⚡️ Build success in 18ms
ESM dist/cli.js 15.08 KB
ESM dist/cli.js.map 36.32 KB
ESM ⚡️ 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
 RUN  v4.1.5 /Users/robert/projects/contractkit/apps/cli
 RUN  v4.1.5 /home/runner/work/ContractKit/ContractKit/apps/cli
Coverage enabled with v8
[?2026h
 ❯ tests/config.test.ts [queued]
✓ tests/config.test.ts (13 tests) 11ms
✓ tests/resolve-plugin-files.test.ts (5 tests) 8ms
 Test Files 0 passed (1)
 Tests 0 passed (0)
 Start at 08:51:10
 Duration 101ms
[?2026l ✓ tests/config.test.ts (13 tests) 3ms
✓ mergeConfig (13)
✓ uses patterns from top-level patterns field 1ms
✓ returns empty patterns when config has no patterns 0ms
✓ resolves rootDir defaulting to cwd 0ms
✓ passes through force flag 0ms
✓ passes through watch flag 0ms
✓ resolves cache config from boolean 0ms
✓ resolves cache config from string 0ms
✓ disables cache by default 0ms
✓ defaults prettier to false 0ms
✓ passes through prettier: true 0ms
✓ passes through prettier: false explicitly 0ms
✓ normalizes plugins from record format 1ms
✓ returns empty plugins when none configured 0ms
 Test Files  2 passed (2)
 Tests  18 passed (18)
 Start at  17:30:37
 Duration  659ms (transform 268ms, setup 0ms, import 597ms, tests 19ms, environment 0ms)
 Test Files  1 passed (1)
 Tests  13 passed (13)
 Start at  08:51:10
 Duration  165ms (transform 19ms, setup 0ms, import 27ms, tests 3ms, environment 0ms)
 % Coverage report from v8
-----------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
-----------|---------|----------|---------|---------|-------------------
All files  |  25 |  54.54 |  37.5 |  22.22 |  
 cache.ts  |  7.69 |  0 |  0 |  8.33 | 12-33 
 config.ts |  33.33 |  66.66 |  75 |  29.16 | 39-63,91 
-----------|---------|----------|---------|---------|-------------------
[?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 |
-------------------|---------|----------|---------|---------|-------------------
# @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>

<?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}}}
}

@@ -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>

@@ -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 +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"]}
{
"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": {

@@ -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.turbo/turbo-format.log.turbo/turbo-start.log.turbo/turbo-test.logdist/ast.d.tsdist/ast.d.ts 48ms
dist/ast.d.ts.mapdist/ast.jsdist/ast.js 13ms
dist/ast.js.mapdist/cache.d.tsdist/cache.d.ts 2ms
dist/cache.d.ts.mapdist/cache.jsdist/cache.js 4ms
dist/cache.js.mapdist/chevrotain-parser-dto.d.tsdist/chevrotain-parser-dto.d.ts 2ms
dist/chevrotain-parser-dto.d.ts.mapdist/chevrotain-parser-dto.jsdist/chevrotain-parser-dto.js 20ms
dist/chevrotain-parser-dto.js.mapdist/chevrotain-parser-op.d.tsdist/chevrotain-parser-op.d.ts 3ms
dist/chevrotain-parser-op.d.ts.mapdist/chevrotain-parser-op.jsdist/chevrotain-parser-op.js 29ms
dist/chevrotain-parser-op.js.mapdist/chunk-7QVYU63E.jsdist/chunk-7QVYU63E.js 1ms
dist/chunk-7QVYU63E.js.mapdist/cli.d.tsdist/cli.d.ts 1ms
dist/cli.d.ts.mapdist/cli.jsdist/cli.js 43ms
dist/cli.js.mapdist/codegen-client.d.tsdist/codegen-client.d.ts 1ms
dist/codegen-client.d.ts.mapdist/codegen-client.jsdist/codegen-client.js 12ms
dist/codegen-client.js.mapdist/codegen-dto.d.tsdist/codegen-dto.d.ts 2ms
dist/codegen-dto.d.ts.mapdist/codegen-dto.jsdist/codegen-dto.js 19ms
dist/codegen-dto.js.mapdist/codegen-markdown.d.tsdist/codegen-markdown.d.ts 1ms
dist/codegen-markdown.d.ts.mapdist/codegen-markdown.jsdist/codegen-markdown.js 18ms
dist/codegen-markdown.js.mapdist/codegen-op.d.tsdist/codegen-op.d.ts 1ms
dist/codegen-op.d.ts.mapdist/codegen-op.jsdist/codegen-op.js 11ms
dist/codegen-op.js.mapdist/codegen-openapi.d.tsdist/codegen-openapi.d.ts 1ms
dist/codegen-openapi.d.ts.mapdist/codegen-openapi.jsdist/codegen-openapi.js 10ms
dist/codegen-openapi.js.mapdist/codegen-plain-types.d.tsdist/codegen-plain-types.d.ts 1ms
dist/codegen-plain-types.d.ts.mapdist/codegen-plain-types.jsdist/codegen-plain-types.js 4ms
dist/codegen-plain-types.js.mapdist/codegen-sdk.d.tsdist/codegen-sdk.d.ts 2ms
dist/codegen-sdk.d.ts.mapdist/codegen-sdk.jsdist/codegen-sdk.js 14ms
dist/codegen-sdk.js.mapdist/config.d.tsdist/config.d.ts 3ms
dist/config.d.ts.mapdist/config.jsdist/config.js 2ms
dist/config.js.mapdist/diagnostics.d.tsdist/diagnostics.d.ts 1ms
dist/diagnostics.d.ts.mapdist/diagnostics.jsdist/diagnostics.js 1ms
dist/diagnostics.js.mapdist/import-openapi-27E3RGQR.jsdist/import-openapi-27E3RGQR.js 2ms
dist/import-openapi-27E3RGQR.js.mapdist/import-openapi-ZYIAQBEX.jsdist/import-openapi-ZYIAQBEX.js 2ms
dist/import-openapi-ZYIAQBEX.js.mapdist/lexer.d.tsdist/lexer.d.ts 1ms
dist/lexer.d.ts.mapdist/lexer.jsdist/lexer.js 5ms
dist/lexer.js.mapdist/parser-dto.d.tsdist/parser-dto.d.ts 1ms
dist/parser-dto.d.ts.mapdist/parser-dto.jsdist/parser-dto.js 1ms
dist/parser-dto.js.mapdist/parser-op.d.tsdist/parser-op.d.ts 1ms
dist/parser-op.d.ts.mapdist/parser-op.jsdist/parser-op.js 1ms
dist/parser-op.js.mapdist/token-adapter.d.tsdist/token-adapter.d.ts 1ms
dist/token-adapter.d.ts.mapdist/token-adapter.jsdist/token-adapter.js 1ms
dist/token-adapter.js.mapdist/token-stream.d.tsdist/token-stream.d.ts 1ms
dist/token-stream.d.ts.mapdist/token-stream.jsdist/token-stream.js 1ms
dist/token-stream.js.mapdist/tokens.d.tsdist/tokens.d.ts 1ms
dist/tokens.d.ts.mapdist/tokens.jsdist/tokens.js 2ms
dist/tokens.js.mapdist/types/pagination.dto.tsdist/types/pagination.dto.ts 3ms
dist/validate-op.d.tsdist/validate-op.d.ts 1ms
dist/validate-op.d.ts.mapdist/validate-op.jsdist/validate-op.js 1ms
dist/validate-op.js.mapdist/validate-refs.d.tsdist/validate-refs.d.ts 1ms
dist/validate-refs.d.ts.mapdist/validate-refs.jsdist/validate-refs.js 2ms
dist/validate-refs.js.mapdist/visitor-dto.d.tsdist/visitor-dto.d.ts 2ms
dist/visitor-dto.d.ts.mapdist/visitor-dto.jsdist/visitor-dto.js 9ms
dist/visitor-dto.js.mapdist/visitor-op.d.tsdist/visitor-op.d.ts 2ms
dist/visitor-op.d.ts.mapdist/visitor-op.jsdist/visitor-op.js 10ms
dist/visitor-op.js.mapeslint.config.jseslint.config.js 1ms (unchanged)
package.jsonpackage.json 1ms
src/cache.tssrc/cache.ts 2ms
src/cli.tssrc/cli.ts 34ms
src/config.tssrc/config.ts 4ms
src/import-openapi.tssrc/import-openapi.ts 3ms
tests/config.test.tstests/config.test.ts 3ms
tests/tsconfig.jsontests/tsconfig.json 1ms
tsconfig.jsontsconfig.json 0ms
vitest.config.tsvitest.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
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.transactions.op:23 Referenced model "TransferInput" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.settlements.op:71 Referenced type "ListSettlementEntriesQuery" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.settlements.op:106 Referenced type "ListSettlementTransactionsQuery" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.op:2 Referenced model "LedgerAccountInput" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.op:12 Referenced type "PaginationQuery" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:2 Referenced model "LedgerCategoryInput" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:32 Referenced model "UpdateCategoryInput" is not defined in any .dto file
WARN /Users/robert/projects/homegrown_v2/apps/api/contracts/operations/ledger.categories.op:92 Referenced model "CategoryTree" is not defined in any .dto file
WARN /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
 RUN  v4.1.5 /Users/robert/projects/contractkit/apps/cli
✓ tests/config.test.ts (13 tests) 3ms
 Test Files  1 passed (1)
 Tests  13 passed (13)
 Start at  08:51:35
 Duration  143ms (transform 21ms, setup 0ms, import 30ms, tests 3ms, environment 0ms)
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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"}
// ─── 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":"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"}
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":"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"}
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":"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"}
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"}
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":"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"}
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":"AAEA,OAAO,KAAK,EACV,UAAU,EAAE,WAAW,EAAE,eAAe,EAAE,WAAW,EACrD,aAAa,EAAE,cAAc,EAAc,WAAW,EACtD,SAAS,EAAE,WAAW,EAAkB,oBAAoB,EAC5D,YAAY,EAAkB,UAAU,EACzC,MAAM,UAAU,CAAC;AAKlB,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,QAAA,MAAM,aAAa,KAA6C,CAAC;AAEjE,qBAAa,SAAU,SAAQ,aAAa;IAC1C,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,IAAI,CAAsB;IAClC,OAAO,CAAC,QAAQ,CAAsB;gBAE1B,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAQlF,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,UAAU;IAqB5B,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;IAWzC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC;IAUrC,sGAAsG;IACtG,OAAO,CAAC,oBAAoB;IAS5B,8FAA8F;IAC9F,OAAO,CAAC,cAAc;IActB,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IA2BhC,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAY3B,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAC;QAAC,UAAU,EAAE,eAAe,EAAE,CAAA;KAAE;IAwB9H,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE;IAIjE,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAqBhC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,eAAe;IA8CxC,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,SAAS,CAAC,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,aAAa,CAAC;QAAC,SAAS,EAAE,cAAc,EAAE,CAAC;QAAC,QAAQ,CAAC,EAAE,YAAY,CAAA;KAAE;IA+C3R,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,YAAY;IAkBrC,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IAQtE,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE;IASpE,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE;IAShE,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,MAAM,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAE;IASlE,OAAO,CAAC,gBAAgB;IAsBxB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAK7B,OAAO,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAKzB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,aAAa,GAAG,SAAS;IASjD,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc,EAAE;IAUzC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG,cAAc;IAezC,eAAe,CAAC,GAAG,EAAE,GAAG,GAAG;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAA;KAAE;IAezE,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAWjC,kBAAkB,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IAWzC,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,WAAW;IA2BnC,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE;IAU3B,SAAS,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG;IAaxB,UAAU,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;IAQ/C,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,oBAAoB;IAW9C,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,SAAS;IA6BlC,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO;CAOpD"}
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":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAOxD,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEvD,MAAM,YAAY,GAAG,IAAI,GAAG,CAAS,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AACnE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAS,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC,CAAC;AAG9E,MAAM,aAAa,GAAG,WAAW,CAAC,4BAA4B,EAAE,CAAC;AAEjE,MAAM,OAAO,SAAU,SAAQ,aAAa;IAClC,IAAI,CAAS;IACb,IAAI,CAAsB;IAC1B,QAAQ,CAAsB;IAEtC,YAAY,IAAY,EAAE,IAAyB,EAAE,QAA6B;QAChF,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,eAAe,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,CAAC,GAAQ;QACb,MAAM,IAAI,GAA2B,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAuB,CAAC;YACrE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;gBACnC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,CAAC;QACH,CAAC;QACD,MAAM,QAAQ,GAA6B,GAAG,CAAC,aAAa;YAC1D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAiB;YAClD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAkB,EAAE,CAAC;QACjC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;IACrE,CAAC;IAED,WAAW,CAAC,GAAQ;QAClB,MAAM,OAAO,GAAuB,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,MAAM,QAAQ,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBACrC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;gBACnC,IAAI,KAAK;oBAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACjC,CAAC;QACH,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QACxC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtB,CAAC;IAED,sGAAsG;IAC9F,oBAAoB,CAAC,IAAY;QACvC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,8FAA8F;IACtF,cAAc,CAAC,IAAY;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAE,CAAC;YACrC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAE,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC/B,OAAO,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,MAAM,IAAI,GAAW,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,0FAA0F;QAC1F,MAAM,cAAc,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACtD,MAAM,SAAS,GAAgC,cAAc,CAAC,MAAM,GAAG,CAAC;YACtE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,MAA+B,CAAC;QACpC,IAAI,UAAkC,CAAC;QACvC,IAAI,QAAkC,CAAC;QACvC,IAAI,UAAU,GAAsB,EAAE,CAAC;QAEvC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAA8G,CAAC;YACvJ,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YACrB,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;YAC7B,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzB,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QAC/B,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACpH,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,MAAM,OAAO,GAAa,EAAE,CAAC;QAE7B,IAAI,GAAG,CAAC,KAAK;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,KAAK;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1D,IAAI,GAAG,CAAC,UAAU;YAAE,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,UAAU;gBAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAEpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;QAEtD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,IAAI,MAA+B,CAAC;QACpC,IAAI,UAAkC,CAAC;QACvC,IAAI,QAAkC,CAAC;QACvC,MAAM,UAAU,GAAsB,EAAE,CAAC;QAEzC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAA+C,CAAC;YAC5F,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACvB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAiB,CAAC;QAC9D,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;gBACtC,MAAM,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAC7B,IAAI,EAAE;oBAAE,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IAED,WAAW,CAAC,GAAQ;QAClB,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;QACnC,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC,SAAS,IAAI,CAAC,CAAC;QAE5C,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,mBAAmB,IAAI,8CAA8C,CAAC,CAAC;QACzG,CAAC;QACD,MAAM,QAAQ,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,QAAQ,CAAC;QACnD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO;YACL,IAAI;YACJ,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,KAAK;YACf,IAAI,EAAE,iBAAiB,CAAC,QAAQ,CAAC;YACjC,WAAW;YACX,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,CAAE,CAAC;QACpC,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,WAAW,EAAgB,CAAC;QAC7D,MAAM,IAAI,GAAG,WAAW,CAAC,SAAS,IAAI,CAAC,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,gEAAgE;QAChE,gFAAgF;QAChF,+EAA+E;QAC/E,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAgC,cAAc,CAAC,MAAM,GAAG,CAAC;YACtE,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YACvF,CAAC,CAAC,SAAS,CAAC;QAEd,IAAI,OAA2B,CAAC;QAChC,IAAI,GAAuB,CAAC;QAC5B,IAAI,KAA8B,CAAC;QACnC,IAAI,SAAiC,CAAC;QACtC,IAAI,OAAgC,CAAC;QACrC,IAAI,WAAmC,CAAC;QACxC,IAAI,OAAkC,CAAC;QACvC,IAAI,SAAS,GAAqB,EAAE,CAAC;QACrC,IAAI,QAAkC,CAAC;QAEvC,IAAI,SAA6B,CAAC;QAClC,IAAI,oBAAwC,CAAC;QAE7C,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAuQ,CAAC;YACpT,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACf,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,oBAAoB,GAAG,IAAI,CAAC,oBAAoB,CAAC;YACjD,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;YACnB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;YAC3B,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC3B,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;IACjM,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,IAAI,OAA2B,CAAC;QAChC,IAAI,GAAuB,CAAC;QAC5B,IAAI,SAA6B,CAAC;QAClC,IAAI,oBAAwC,CAAC;QAC7C,IAAI,KAA8B,CAAC;QACnC,IAAI,SAAiC,CAAC;QACtC,IAAI,OAAgC,CAAC;QACrC,IAAI,WAAmC,CAAC;QACxC,IAAI,OAAkC,CAAC;QACvC,IAAI,SAAS,GAAqB,EAAE,CAAC;QACrC,IAAI,QAAkC,CAAC;QAEvC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YACpB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QACD,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAgD,CAAC;YAC/F,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;YAC7B,oBAAoB,GAAG,MAAM,CAAC,WAAW,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAA+C,CAAC;YAC3F,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;YACtB,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAA+C,CAAC;YAC7F,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC;YACxB,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;QAC5B,CAAC;QACD,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;IACjI,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,IAAI,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;YAChB,iBAAiB;YACjB,OAAO,aAAa,CAAC;QACvB,CAAC;QACD,uCAAuC;QACvC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAmB,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;QAElE,IAAI,GAAG,CAAC,iBAAiB,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAA8C,CAAC;YACjG,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;YAC5B,IAAI,MAAM,CAAC,WAAW;gBAAE,MAAM,CAAC,gBAAgB,GAAG,MAAM,CAAC,WAAW,CAAC;QACvE,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iBAAiB,CAAC,GAAQ;QACxB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,2DAA2D;QAC3D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAW,WAAW,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;QACpD,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC3D,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,6EAA6E;QAC7E,MAAM,SAAS,GAAW,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;YAC1C,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAe;YAClC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAe,CAAC;QACtC,MAAM,IAAI,GAAW,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,IAAI,CAAC,CAAC;QACvD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;IAC/D,CAAC;IAED,UAAU,CAAC,GAAQ;QACjB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;YAC5E,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAmB;YACrC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,QAAQ,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAED,YAAY,CAAC,GAAQ;QACnB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC;YAC5E,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAmB;YACrC,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,QAAQ,GAAgB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5D,OAAO,EAAE,MAAM,EAAE,qBAAqB,CAAC,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3D,CAAC;IAEO,gBAAgB,CAAC,GAAQ;QAC/B,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAK,CAAC,CAAC;QAClF,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,CAAC,KAAmB,CAAC,CAAC,CAAC,SAAS,CAAC;QAEvE,yCAAyC;QACzC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,MAAM,MAAM,GAAkB,EAAE,CAAC;YACjC,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAClB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;oBAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;oBAC7B,IAAI,KAAK;wBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;YACD,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAClC,CAAC;QACD,sCAAsC;QACtC,iDAAiD;QACjD,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACnC,CAAC;IAED,WAAW,CAAC,GAAQ;QAClB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,OAAO,CAAC,GAAQ;QACd,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,OAAO,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,YAAY,CAAC,GAAQ;QACnB,IAAI,CAAC,GAAG,CAAC,eAAe;YAAE,OAAO,SAAS,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;QAClD,MAAM,EAAE,GAAG,MAAM,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC;YAC/D,CAAC,CAAC,qBAA8B;YAChC,CAAC,CAAC,kBAA2B,CAAC;QAChC,OAAO,EAAE,WAAW,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;IACxD,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,MAAM,SAAS,GAAqB,EAAE,CAAC;QACvC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;gBACtC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YAClC,CAAC;QACH,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,eAAe,CAAC,GAAQ;QACtB,MAAM,UAAU,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAExD,IAAI,WAA2C,CAAC;QAChD,IAAI,QAAiC,CAAC;QAEtC,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC;YAClD,WAAW,GAAG,kBAAkB,CAAC;YACjC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;QAC7B,CAAC;QAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IAC/C,CAAC;IAED,eAAe,CAAC,GAAQ;QACtB,MAAM,WAAW,GAAa,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC;QACnD,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,OAAO,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;QAC5C,MAAM,WAAW,GAAG,GAAG,OAAO,IAAI,OAAO,EAAE,CAAC;QAE5C,MAAM,QAAQ,GAAgB,GAAG,CAAC,UAAU;YAC1C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAExC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,CAAC;IACnC,CAAC;IAED,uEAAuE;IAEvE,UAAU,CAAC,GAAQ;QACjB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;YAC3B,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBACxC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;QAC7C,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;IACpC,CAAC;IAED,kBAAkB,CAAC,GAAQ;QACzB,MAAM,OAAO,GAAkB,EAAE,CAAC;QAClC,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;YACrB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,YAAY,EAAE,CAAC;gBAClC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC/B,CAAC;QACH,CAAC;QACD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,OAAO,CAAC,CAAC,CAAE,CAAC;QAC7C,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,YAAY,CAAC,GAAQ;QACnB,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;QAED,MAAM,UAAU,GAAW,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC;QAElC,wDAAwD;QACxD,IAAI,GAAG,CAAC,UAAU,EAAE,CAAC;YACnB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAU,CAAC;YACpD,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC/C,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;gBACjB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;YACvC,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QAED,wBAAwB;QACxB,IAAI,GAAG,CAAC,QAAQ,EAAE,CAAC;YACjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACvC,CAAC;QAED,OAAO,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,UAAU,CAAC,GAAQ;QACjB,MAAM,IAAI,GAAU,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,CAAC,GAAQ;QAChB,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACjC,MAAM,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QAC5E,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACpF,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;QAC1F,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,UAAU,CAAC,GAAQ;QACjB,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;QAC9D,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,cAAc,CAAC,GAAQ;QACrB,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,aAAa,EAAE,CAAC;gBAClC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC5B,IAAI,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,GAAQ;QACpB,MAAM,SAAS,GAAW,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC;QAC7B,MAAM,IAAI,GAAG,SAAS,CAAC,SAAS,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC;QAEhC,MAAM,IAAI,GAAgB,GAAG,CAAC,UAAU;YACtC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;YAC/B,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAExC,IAAI,UAAiD,CAAC;QACtD,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACvB,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;QAE9C,OAAO;YACL,IAAI;YACJ,QAAQ;YACR,QAAQ,EAAE,KAAK;YACf,UAAU,EAAE,QAAQ;YACpB,IAAI;YACJ,OAAO,EAAE,UAAU;YACnB,WAAW;YACX,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;SAC/B,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,GAAQ;QACrB,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACjD,IAAI,GAAG,CAAC,SAAS;YAAE,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,MAAM,CAAC;QAC9D,IAAI,GAAG,CAAC,UAAU;YAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AAED,4EAA4E;AAE5E,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAW,CAAC,EAAE,CAAC;QAClC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAA8B,EAAE,CAAC;IAClE,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AAC/B,CAAC;AAED,qEAAqE;AACrE,SAAS,qBAAqB,CAAC,IAAiB;IAC9C,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAC1C,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAC3B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,QAAQ,EAAE,CAAC,CAAC,QAAQ;YACpB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,GAAG,EAAE,CAAC,CAAC,GAAG;SACX,CAAC,CAAC,CAAC;IACN,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,iFAAiF;AACjF,SAAS,iBAAiB,CAAC,IAAY,EAAE,IAAW;IAClD,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;YACtD,MAAM,IAAI,GAAgB,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACpF,IAAI,GAAuB,CAAC;YAC5B,IAAI,GAAuB,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,GAAG,KAAK,KAAK;oBAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC5C,IAAI,CAAC,EAAE,GAAG,KAAK,KAAK;oBAAE,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YAC9C,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;QAC3C,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAoB,CAAC,CAAC;YACpF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;YACtD,MAAM,GAAG,GAAgB,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAClF,MAAM,KAAK,GAAgB,QAAQ,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACrF,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxC,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;gBACrB,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK;oBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;qBACxE,IAAI,CAAC,EAAE,IAAI,KAAK,QAAQ;oBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;qBAC/C,IAAI,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,QAAQ;oBAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAClC,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,GAAG;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;YAChD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YACxE,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YACxE,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YACzE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC;YACnD,MAAM,KAAK,GAAgB,OAAO,EAAE,KAAK,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;YACjF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,CAAC,CAAC;YACR,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAmB,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,IAA8B,EAAE,CAAC;gBACxF,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;oBACrB,gFAAgF;oBAChF,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;wBACZ,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,EAAE,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,KAAK,KAAK,CAAC,CAAC;4BACzE,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;4BAChE,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;wBAC/E,CAAC;wBACD,SAAS;oBACX,CAAC;oBACD,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;wBAAE,MAAM,CAAC,GAAG,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxF,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK;wBAAE,MAAM,CAAC,GAAG,GAAG,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxF,IAAI,CAAC,CAAC,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;wBAAE,MAAM,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACxE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO;wBAAE,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;oBACtD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ;wBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;gBAC1D,CAAC;gBACD,OAAO,MAAM,CAAC;YAChB,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QAC/B,CAAC;IACH,CAAC;AACH,CAAC"}