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

@contractkit/prettier-plugin

Package Overview
Dependencies
Maintainers
1
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@contractkit/prettier-plugin - npm Package Compare versions

Comparing version
0.9.2
to
0.9.3
+6
-6
.turbo/turbo-build$colon$ci.log
> @contractkit/prettier-plugin@0.9.2 build:ci /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> @contractkit/prettier-plugin@0.9.3 build:ci /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> eslint --max-warnings=0 && pnpm run build
> @contractkit/prettier-plugin@0.9.2 build /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> @contractkit/prettier-plugin@0.9.3 build /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> tsup src/index.ts --format esm --sourcemap --dts && tsc --emitDeclarationOnly --declaration

@@ -14,7 +14,7 @@

ESM Build start
ESM dist/index.js 18.32 KB
ESM dist/index.js.map 44.20 KB
ESM ⚡️ Build success in 166ms
ESM dist/index.js 20.51 KB
ESM dist/index.js.map 48.93 KB
ESM ⚡️ Build success in 151ms
DTS Build start
DTS ⚡️ Build success in 3922ms
DTS ⚡️ Build success in 3938ms
DTS dist/index.d.ts 157.00 B
> @contractkit/prettier-plugin@0.9.2 test:ci /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> @contractkit/prettier-plugin@0.9.3 test:ci /home/runner/work/ContractKit/ContractKit/apps/prettier-plugin
> vitest run --coverage

@@ -9,8 +9,8 @@

✓ tests/print-ck.test.ts (57 tests) 263ms
✓ tests/print-ck.test.ts (60 tests) 181ms
 Test Files  1 passed (1)
 Tests  57 passed (57)
 Start at  13:24:20
 Duration  5.57s (transform 1.61s, setup 0ms, import 4.11s, tests 263ms, environment 0ms)
 Tests  60 passed (60)
 Start at  12:37:07
 Duration  5.30s (transform 1.98s, setup 0ms, import 3.82s, tests 181ms, environment 0ms)

@@ -21,8 +21,8 @@  % Coverage report from v8

-------------------|---------|----------|---------|---------|-------------------
All files | 66.3 | 58.04 | 70.37 | 72.06 |
All files | 68.47 | 58.91 | 74.19 | 74.69 |
indent.ts | 100 | 100 | 100 | 100 |
print-ck.ts | 89.85 | 80 | 100 | 98.03 | 59
print-contract.ts | 41.93 | 30.35 | 50 | 42.85 | 10,37-68
...t-operation.ts | 70.62 | 63.74 | 90 | 80.43 | ...92,200-211,243
...t-operation.ts | 73.41 | 64.35 | 92.85 | 83.33 | ...61,269-280,312
print-type.ts | 47.12 | 46.87 | 45.45 | 48.61 | ...10,139,142-145
-------------------|---------|----------|---------|---------|-------------------
# @contractkit/prettier-plugin-contractkit
## 0.9.3
### Patch Changes
- a9e9ec0: Replace per-operation `pluginFiles` with structured `pluginExtensions`. The `plugins:` block on an operation now accepts JSON-like values (string, number, boolean, null, object, array) so each plugin owns its own schema for its entry. `file://` URLs in any string position are resolved relative to the `.ck` source file before plugins run, and `http://` / `https://` URLs are fetched via GET. `op.pluginExtensions` carries the resolved tree; the raw form lives at `op.plugins`. The Bruno plugin now expects `{ template: "file://..." }` (was a bare path string) and ships a `validateBrunoExtension` hook that fails compilation on unknown fields or non-string `template`.
Plugins can now implement `validateExtension(value)` on the `ContractKitPlugin` interface to surface compilation-time errors/warnings on their entry.
All CLI caching is unified under `<rootDir>/.contractkit/cache/` via a new `CacheService` class: `build.json` for file/plugin hashes and `http/<sha256(url)>` for fetched HTTP response bodies. The `cache: string` config field is reinterpreted as a custom cache **directory** (was a custom build-cache filename); previous file paths under `.contractkit-cache` and `.contractkit-http-cache/` are abandoned. Add `.contractkit/` to `.gitignore`.
- Updated dependencies [a9e9ec0]
- @contractkit/core@0.14.0
## 0.9.2

@@ -4,0 +17,0 @@

<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1777901065783" clover="3.2.0">
<project timestamp="1777901065783" name="All files">
<metrics statements="290" coveredstatements="209" conditionals="398" coveredconditionals="231" methods="27" coveredmethods="19" elements="715" coveredelements="459" complexity="0" loc="290" ncloc="290" packages="1" files="5" classes="5"/>
<coverage generated="1778071033214" clover="3.2.0">
<project timestamp="1778071033214" name="All files">
<metrics statements="332" coveredstatements="248" conditionals="443" coveredconditionals="261" methods="31" coveredmethods="23" elements="806" coveredelements="532" complexity="0" loc="332" ncloc="332" packages="1" files="5" classes="5"/>
<file name="indent.ts" path="/home/runner/work/ContractKit/ContractKit/apps/prettier-plugin/src/indent.ts">

@@ -13,8 +13,8 @@ <metrics statements="1" coveredstatements="1" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/>

<line num="20" count="5" type="cond" truecount="2" falsecount="0"/>
<line num="24" count="57" type="stmt"/>
<line num="25" count="57" type="stmt"/>
<line num="26" count="57" type="stmt"/>
<line num="27" count="57" type="cond" truecount="8" falsecount="0"/>
<line num="28" count="57" type="cond" truecount="8" falsecount="0"/>
<line num="30" count="57" type="cond" truecount="7" falsecount="0"/>
<line num="24" count="60" type="stmt"/>
<line num="25" count="60" type="stmt"/>
<line num="26" count="60" type="stmt"/>
<line num="27" count="60" type="cond" truecount="8" falsecount="0"/>
<line num="28" count="60" type="cond" truecount="8" falsecount="0"/>
<line num="30" count="60" type="cond" truecount="7" falsecount="0"/>
<line num="32" count="7" type="stmt"/>

@@ -49,16 +49,16 @@ <line num="34" count="7" type="cond" truecount="2" falsecount="0"/>

<line num="77" count="2" type="stmt"/>
<line num="90" count="57" type="cond" truecount="2" falsecount="2"/>
<line num="91" count="57" type="stmt"/>
<line num="94" count="57" type="stmt"/>
<line num="95" count="57" type="cond" truecount="2" falsecount="0"/>
<line num="98" count="57" type="cond" truecount="2" falsecount="2"/>
<line num="90" count="60" type="cond" truecount="2" falsecount="2"/>
<line num="91" count="60" type="stmt"/>
<line num="94" count="60" type="stmt"/>
<line num="95" count="60" type="cond" truecount="2" falsecount="0"/>
<line num="98" count="60" type="cond" truecount="2" falsecount="2"/>
<line num="99" count="5" type="cond" truecount="1" falsecount="1"/>
<line num="100" count="5" type="stmt"/>
<line num="104" count="57" type="stmt"/>
<line num="105" count="57" type="stmt"/>
<line num="106" count="57" type="cond" truecount="2" falsecount="2"/>
<line num="107" count="47" type="cond" truecount="2" falsecount="0"/>
<line num="108" count="47" type="cond" truecount="6" falsecount="0"/>
<line num="109" count="47" type="stmt"/>
<line num="112" count="57" type="stmt"/>
<line num="104" count="60" type="stmt"/>
<line num="105" count="60" type="stmt"/>
<line num="106" count="60" type="cond" truecount="2" falsecount="2"/>
<line num="107" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="108" count="50" type="cond" truecount="6" falsecount="0"/>
<line num="109" count="50" type="stmt"/>
<line num="112" count="60" type="stmt"/>
</file>

@@ -97,141 +97,183 @@ <file name="print-contract.ts" path="/home/runner/work/ContractKit/ContractKit/apps/prettier-plugin/src/print-contract.ts">

<file name="print-operation.ts" path="/home/runner/work/ContractKit/ContractKit/apps/prettier-plugin/src/print-operation.ts">
<metrics statements="138" coveredstatements="111" conditionals="171" coveredconditionals="109" methods="10" coveredmethods="9"/>
<line num="15" count="1" type="stmt"/>
<metrics statements="180" coveredstatements="150" conditionals="216" coveredconditionals="139" methods="14" coveredmethods="13"/>
<line num="16" count="1" type="stmt"/>
<line num="17" count="1" type="stmt"/>
<line num="18" count="1" type="stmt"/>
<line num="27" count="0" type="stmt"/>
<line num="19" count="1" type="stmt"/>
<line num="28" count="0" type="stmt"/>
<line num="29" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="29" count="0" type="stmt"/>
<line num="30" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="31" count="0" type="stmt"/>
<line num="33" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="34" count="0" type="stmt"/>
<line num="37" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="38" count="0" type="stmt"/>
<line num="45" count="97" type="cond" truecount="3" falsecount="1"/>
<line num="46" count="97" type="cond" truecount="1" falsecount="1"/>
<line num="47" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="48" count="0" type="stmt"/>
<line num="55" count="47" type="stmt"/>
<line num="56" count="47" type="cond" truecount="2" falsecount="0"/>
<line num="57" count="47" type="stmt"/>
<line num="59" count="47" type="cond" truecount="2" falsecount="0"/>
<line num="60" count="3" type="stmt"/>
<line num="63" count="47" type="cond" truecount="2" falsecount="0"/>
<line num="64" count="2" type="stmt"/>
<line num="67" count="47" type="cond" truecount="2" falsecount="2"/>
<line num="69" count="50" type="stmt"/>
<line num="70" count="50" type="stmt"/>
<line num="74" count="47" type="stmt"/>
<line num="76" count="47" type="stmt"/>
<line num="77" count="47" type="stmt"/>
<line num="83" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="31" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="32" count="0" type="stmt"/>
<line num="34" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="35" count="0" type="stmt"/>
<line num="38" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="39" count="0" type="stmt"/>
<line num="46" count="103" type="cond" truecount="3" falsecount="1"/>
<line num="47" count="103" type="cond" truecount="1" falsecount="1"/>
<line num="48" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="49" count="0" type="stmt"/>
<line num="56" count="50" type="stmt"/>
<line num="57" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="58" count="50" type="stmt"/>
<line num="60" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="61" count="3" type="stmt"/>
<line num="64" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="65" count="2" type="stmt"/>
<line num="68" count="50" type="cond" truecount="2" falsecount="2"/>
<line num="70" count="53" type="stmt"/>
<line num="71" count="53" type="stmt"/>
<line num="75" count="50" type="stmt"/>
<line num="77" count="50" type="stmt"/>
<line num="78" count="50" type="stmt"/>
<line num="84" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="85" count="0" type="stmt"/>
<line num="87" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="88" count="3" type="stmt"/>
<line num="85" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="86" count="0" type="stmt"/>
<line num="88" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="89" count="3" type="stmt"/>
<line num="90" count="3" type="cond" truecount="2" falsecount="2"/>
<line num="91" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="92" count="3" type="stmt"/>
<line num="93" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="90" count="3" type="stmt"/>
<line num="91" count="3" type="cond" truecount="2" falsecount="2"/>
<line num="92" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="93" count="3" type="stmt"/>
<line num="94" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="95" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="96" count="3" type="stmt"/>
<line num="98" count="3" type="stmt"/>
<line num="95" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="96" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="97" count="3" type="stmt"/>
<line num="99" count="3" type="stmt"/>
<line num="102" count="0" type="stmt"/>
<line num="108" count="50" type="stmt"/>
<line num="109" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="110" count="50" type="cond" truecount="6" falsecount="0"/>
<line num="111" count="50" type="stmt"/>
<line num="113" count="50" type="cond" truecount="1" falsecount="1"/>
<line num="114" count="50" type="cond" truecount="1" falsecount="1"/>
<line num="115" count="50" type="cond" truecount="1" falsecount="1"/>
<line num="116" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="117" count="2" type="cond" truecount="1" falsecount="1"/>
<line num="118" count="2" type="stmt"/>
<line num="120" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="121" count="50" type="cond" truecount="4" falsecount="0"/>
<line num="122" count="3" type="stmt"/>
<line num="123" count="4" type="cond" truecount="2" falsecount="2"/>
<line num="124" count="4" type="stmt"/>
<line num="126" count="3" type="stmt"/>
<line num="128" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="129" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="130" count="1" type="stmt"/>
<line num="131" count="49" type="cond" truecount="2" falsecount="0"/>
<line num="132" count="2" type="stmt"/>
<line num="134" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="135" count="3" type="stmt"/>
<line num="136" count="3" type="cond" truecount="2" falsecount="2"/>
<line num="137" count="4" type="stmt"/>
<line num="139" count="3" type="stmt"/>
<line num="141" count="50" type="cond" truecount="2" falsecount="0"/>
<line num="142" count="7" type="stmt"/>
<line num="145" count="50" type="stmt"/>
<line num="146" count="50" type="stmt"/>
<line num="153" count="2" type="cond" truecount="2" falsecount="0"/>
<line num="158" count="5" type="cond" truecount="8" falsecount="0"/>
<line num="159" count="5" type="cond" truecount="2" falsecount="0"/>
<line num="160" count="3" type="stmt"/>
<line num="161" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="162" count="5" type="cond" truecount="1" falsecount="1"/>
<line num="163" count="3" type="stmt"/>
<line num="164" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="165" count="5" type="stmt"/>
<line num="166" count="5" type="stmt"/>
<line num="167" count="5" type="stmt"/>
<line num="173" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="174" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="175" count="0" type="stmt"/>
<line num="177" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="178" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="179" count="9" type="stmt"/>
<line num="180" count="9" type="cond" truecount="2" falsecount="2"/>
<line num="181" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="182" count="11" type="stmt"/>
<line num="183" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="184" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="185" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="186" count="11" type="stmt"/>
<line num="188" count="9" type="stmt"/>
<line num="189" count="9" type="stmt"/>
<line num="192" count="0" type="stmt"/>
<line num="199" count="10" type="cond" truecount="1" falsecount="1"/>
<line num="200" count="0" type="stmt"/>
<line num="201" count="0" type="stmt"/>
<line num="202" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="203" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="204" count="0" type="stmt"/>
<line num="205" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="206" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="207" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="208" count="0" type="stmt"/>
<line num="210" count="0" type="stmt"/>
<line num="211" count="0" type="stmt"/>
<line num="213" count="10" type="stmt"/>
<line num="219" count="7" type="stmt"/>
<line num="221" count="7" type="cond" truecount="2" falsecount="2"/>
<line num="222" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="223" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="224" count="8" type="stmt"/>
<line num="225" count="8" type="cond" truecount="4" falsecount="1"/>
<line num="226" count="8" type="stmt"/>
<line num="227" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="228" count="6" type="stmt"/>
<line num="230" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="231" count="1" type="stmt"/>
<line num="232" count="7" type="cond" truecount="2" falsecount="0"/>
<line num="233" count="2" type="stmt"/>
<line num="234" count="2" type="cond" truecount="2" falsecount="2"/>
<line num="235" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="236" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="237" count="3" type="stmt"/>
<line num="239" count="2" type="stmt"/>
<line num="241" count="8" type="stmt"/>
<line num="243" count="0" type="stmt"/>
<line num="247" count="7" type="stmt"/>
<line num="248" count="7" type="stmt"/>
<line num="100" count="3" type="stmt"/>
<line num="103" count="0" type="stmt"/>
<line num="109" count="53" type="stmt"/>
<line num="110" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="111" count="53" type="cond" truecount="6" falsecount="0"/>
<line num="112" count="53" type="stmt"/>
<line num="114" count="53" type="cond" truecount="1" falsecount="1"/>
<line num="115" count="53" type="cond" truecount="1" falsecount="1"/>
<line num="116" count="53" type="cond" truecount="1" falsecount="1"/>
<line num="117" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="118" count="2" type="cond" truecount="1" falsecount="1"/>
<line num="119" count="2" type="stmt"/>
<line num="121" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="122" count="53" type="cond" truecount="4" falsecount="0"/>
<line num="123" count="6" type="stmt"/>
<line num="124" count="10" type="cond" truecount="2" falsecount="2"/>
<line num="125" count="10" type="stmt"/>
<line num="127" count="6" type="stmt"/>
<line num="129" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="130" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="131" count="1" type="stmt"/>
<line num="132" count="52" type="cond" truecount="2" falsecount="0"/>
<line num="133" count="2" type="stmt"/>
<line num="135" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="136" count="3" type="stmt"/>
<line num="137" count="3" type="cond" truecount="2" falsecount="2"/>
<line num="138" count="4" type="stmt"/>
<line num="140" count="3" type="stmt"/>
<line num="142" count="53" type="cond" truecount="2" falsecount="0"/>
<line num="143" count="7" type="stmt"/>
<line num="146" count="53" type="stmt"/>
<line num="147" count="53" type="stmt"/>
<line num="152" count="1" type="stmt"/>
<line num="155" count="8" type="stmt"/>
<line num="159" count="10" type="stmt"/>
<line num="160" count="10" type="stmt"/>
<line num="161" count="10" type="cond" truecount="2" falsecount="0"/>
<line num="162" count="6" type="stmt"/>
<line num="164" count="4" type="stmt"/>
<line num="165" count="4" type="stmt"/>
<line num="166" count="4" type="stmt"/>
<line num="167" count="11" type="stmt"/>
<line num="169" count="10" type="stmt"/>
<line num="173" count="16" type="cond" truecount="2" falsecount="0"/>
<line num="174" count="8" type="cond" truecount="4" falsecount="0"/>
<line num="175" count="5" type="cond" truecount="1" falsecount="1"/>
<line num="176" count="5" type="cond" truecount="3" falsecount="1"/>
<line num="177" count="5" type="cond" truecount="4" falsecount="1"/>
<line num="178" count="5" type="stmt"/>
<line num="182" count="5" type="stmt"/>
<line num="183" count="5" type="stmt"/>
<line num="184" count="5" type="cond" truecount="2" falsecount="0"/>
<line num="185" count="1" type="stmt"/>
<line num="186" count="1" type="cond" truecount="2" falsecount="2"/>
<line num="187" count="2" type="stmt"/>
<line num="188" count="2" type="cond" truecount="1" falsecount="1"/>
<line num="189" count="2" type="stmt"/>
<line num="191" count="0" type="stmt"/>
<line num="192" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="195" count="1" type="stmt"/>
<line num="196" count="1" type="stmt"/>
<line num="198" count="4" type="cond" truecount="4" falsecount="2"/>
<line num="199" count="4" type="stmt"/>
<line num="200" count="4" type="cond" truecount="2" falsecount="2"/>
<line num="201" count="4" type="cond" truecount="1" falsecount="1"/>
<line num="202" count="4" type="stmt"/>
<line num="203" count="4" type="cond" truecount="2" falsecount="0"/>
<line num="204" count="3" type="stmt"/>
<line num="206" count="1" type="stmt"/>
<line num="207" count="1" type="stmt"/>
<line num="208" count="2" type="stmt"/>
<line num="211" count="4" type="stmt"/>
<line num="212" count="4" type="stmt"/>
<line num="215" count="0" type="stmt"/>
<line num="222" count="2" type="cond" truecount="2" falsecount="0"/>
<line num="227" count="5" type="cond" truecount="8" falsecount="0"/>
<line num="228" count="5" type="cond" truecount="2" falsecount="0"/>
<line num="229" count="3" type="stmt"/>
<line num="230" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="231" count="5" type="cond" truecount="1" falsecount="1"/>
<line num="232" count="3" type="stmt"/>
<line num="233" count="3" type="cond" truecount="1" falsecount="1"/>
<line num="234" count="5" type="stmt"/>
<line num="235" count="5" type="stmt"/>
<line num="236" count="5" type="stmt"/>
<line num="242" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="243" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="244" count="0" type="stmt"/>
<line num="246" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="247" count="9" type="cond" truecount="1" falsecount="1"/>
<line num="248" count="9" type="stmt"/>
<line num="249" count="9" type="cond" truecount="2" falsecount="2"/>
<line num="250" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="251" count="11" type="stmt"/>
<line num="252" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="253" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="254" count="11" type="cond" truecount="2" falsecount="0"/>
<line num="255" count="11" type="stmt"/>
<line num="257" count="9" type="stmt"/>
<line num="258" count="9" type="stmt"/>
<line num="261" count="0" type="stmt"/>
<line num="268" count="10" type="cond" truecount="1" falsecount="1"/>
<line num="269" count="0" type="stmt"/>
<line num="270" count="0" type="stmt"/>
<line num="271" count="0" type="cond" truecount="0" falsecount="4"/>
<line num="272" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="273" count="0" type="stmt"/>
<line num="274" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="275" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="276" count="0" type="cond" truecount="0" falsecount="2"/>
<line num="277" count="0" type="stmt"/>
<line num="279" count="0" type="stmt"/>
<line num="280" count="0" type="stmt"/>
<line num="282" count="10" type="stmt"/>
<line num="288" count="7" type="stmt"/>
<line num="290" count="7" type="cond" truecount="2" falsecount="2"/>
<line num="291" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="292" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="293" count="8" type="stmt"/>
<line num="294" count="8" type="cond" truecount="4" falsecount="1"/>
<line num="295" count="8" type="stmt"/>
<line num="296" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="297" count="6" type="stmt"/>
<line num="299" count="8" type="cond" truecount="2" falsecount="0"/>
<line num="300" count="1" type="stmt"/>
<line num="301" count="7" type="cond" truecount="2" falsecount="0"/>
<line num="302" count="2" type="stmt"/>
<line num="303" count="2" type="cond" truecount="2" falsecount="2"/>
<line num="304" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="305" count="3" type="cond" truecount="2" falsecount="0"/>
<line num="306" count="3" type="stmt"/>
<line num="308" count="2" type="stmt"/>
<line num="310" count="8" type="stmt"/>
<line num="312" count="0" type="stmt"/>
<line num="316" count="7" type="stmt"/>
<line num="317" count="7" type="stmt"/>
</file>

@@ -238,0 +280,0 @@ <file name="print-type.ts" path="/home/runner/work/ContractKit/ContractKit/apps/prettier-plugin/src/print-type.ts">

@@ -76,3 +76,3 @@

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -79,0 +79,0 @@ <script src="prettify.js"></script>

@@ -26,5 +26,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">66.3% </span>
<span class="strong">68.47% </span>
<span class="quiet">Statements</span>
<span class='fraction'>242/365</span>
<span class='fraction'>291/425</span>
</div>

@@ -34,5 +34,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">58.04% </span>
<span class="strong">58.91% </span>
<span class="quiet">Branches</span>
<span class='fraction'>231/398</span>
<span class='fraction'>261/443</span>
</div>

@@ -42,5 +42,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">70.37% </span>
<span class="strong">74.19% </span>
<span class="quiet">Functions</span>
<span class='fraction'>19/27</span>
<span class='fraction'>23/31</span>
</div>

@@ -50,5 +50,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">72.06% </span>
<span class="strong">74.69% </span>
<span class="quiet">Lines</span>
<span class='fraction'>209/290</span>
<span class='fraction'>248/332</span>
</div>

@@ -132,13 +132,13 @@

<td class="file medium" data-value="print-operation.ts"><a href="print-operation.ts.html">print-operation.ts</a></td>
<td data-value="70.62" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 70%"></div><div class="cover-empty" style="width: 30%"></div></div>
<td data-value="73.41" class="pic medium">
<div class="chart"><div class="cover-fill" style="width: 73%"></div><div class="cover-empty" style="width: 27%"></div></div>
</td>
<td data-value="70.62" class="pct medium">70.62%</td>
<td data-value="177" class="abs medium">125/177</td>
<td data-value="63.74" class="pct medium">63.74%</td>
<td data-value="171" class="abs medium">109/171</td>
<td data-value="90" class="pct high">90%</td>
<td data-value="10" class="abs high">9/10</td>
<td data-value="80.43" class="pct high">80.43%</td>
<td data-value="138" class="abs high">111/138</td>
<td data-value="73.41" class="pct medium">73.41%</td>
<td data-value="237" class="abs medium">174/237</td>
<td data-value="64.35" class="pct medium">64.35%</td>
<td data-value="216" class="abs medium">139/216</td>
<td data-value="92.85" class="pct high">92.85%</td>
<td data-value="14" class="abs high">13/14</td>
<td data-value="83.33" class="pct high">83.33%</td>
<td data-value="180" class="abs high">150/180</td>
</tr>

@@ -169,3 +169,3 @@

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -172,0 +172,0 @@ <script src="prettify.js"></script>

@@ -202,9 +202,9 @@

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-neutral">&nbsp;</span>

@@ -269,11 +269,11 @@ <span class="cline-any cline-yes">7x</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">5x</span>

@@ -284,11 +284,11 @@ <span class="cline-any cline-yes">5x</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">57x</span>
<span class="cline-any cline-yes">60x</span>
<span class="cline-any cline-neutral">&nbsp;</span>

@@ -415,3 +415,3 @@ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import type { CkRootNode, OpResponseHeaderNode } from '@contractkit/core';

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -418,0 +418,0 @@ <script src="prettify.js"></script>

@@ -280,3 +280,3 @@

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -283,0 +283,0 @@ <script src="prettify.js"></script>

@@ -26,5 +26,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">70.62% </span>
<span class="strong">73.41% </span>
<span class="quiet">Statements</span>
<span class='fraction'>125/177</span>
<span class='fraction'>174/237</span>
</div>

@@ -34,5 +34,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">63.74% </span>
<span class="strong">64.35% </span>
<span class="quiet">Branches</span>
<span class='fraction'>109/171</span>
<span class='fraction'>139/216</span>
</div>

@@ -42,5 +42,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">90% </span>
<span class="strong">92.85% </span>
<span class="quiet">Functions</span>
<span class='fraction'>9/10</span>
<span class='fraction'>13/14</span>
</div>

@@ -50,5 +50,5 @@

<div class='fl pad1y space-right2'>
<span class="strong">80.43% </span>
<span class="strong">83.33% </span>
<span class="quiet">Lines</span>
<span class='fraction'>111/138</span>
<span class='fraction'>150/180</span>
</div>

@@ -319,3 +319,72 @@

<a name='L249'></a><a href='#L249'>249</a>
<a name='L250'></a><a href='#L250'>250</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<a name='L250'></a><a href='#L250'>250</a>
<a name='L251'></a><a href='#L251'>251</a>
<a name='L252'></a><a href='#L252'>252</a>
<a name='L253'></a><a href='#L253'>253</a>
<a name='L254'></a><a href='#L254'>254</a>
<a name='L255'></a><a href='#L255'>255</a>
<a name='L256'></a><a href='#L256'>256</a>
<a name='L257'></a><a href='#L257'>257</a>
<a name='L258'></a><a href='#L258'>258</a>
<a name='L259'></a><a href='#L259'>259</a>
<a name='L260'></a><a href='#L260'>260</a>
<a name='L261'></a><a href='#L261'>261</a>
<a name='L262'></a><a href='#L262'>262</a>
<a name='L263'></a><a href='#L263'>263</a>
<a name='L264'></a><a href='#L264'>264</a>
<a name='L265'></a><a href='#L265'>265</a>
<a name='L266'></a><a href='#L266'>266</a>
<a name='L267'></a><a href='#L267'>267</a>
<a name='L268'></a><a href='#L268'>268</a>
<a name='L269'></a><a href='#L269'>269</a>
<a name='L270'></a><a href='#L270'>270</a>
<a name='L271'></a><a href='#L271'>271</a>
<a name='L272'></a><a href='#L272'>272</a>
<a name='L273'></a><a href='#L273'>273</a>
<a name='L274'></a><a href='#L274'>274</a>
<a name='L275'></a><a href='#L275'>275</a>
<a name='L276'></a><a href='#L276'>276</a>
<a name='L277'></a><a href='#L277'>277</a>
<a name='L278'></a><a href='#L278'>278</a>
<a name='L279'></a><a href='#L279'>279</a>
<a name='L280'></a><a href='#L280'>280</a>
<a name='L281'></a><a href='#L281'>281</a>
<a name='L282'></a><a href='#L282'>282</a>
<a name='L283'></a><a href='#L283'>283</a>
<a name='L284'></a><a href='#L284'>284</a>
<a name='L285'></a><a href='#L285'>285</a>
<a name='L286'></a><a href='#L286'>286</a>
<a name='L287'></a><a href='#L287'>287</a>
<a name='L288'></a><a href='#L288'>288</a>
<a name='L289'></a><a href='#L289'>289</a>
<a name='L290'></a><a href='#L290'>290</a>
<a name='L291'></a><a href='#L291'>291</a>
<a name='L292'></a><a href='#L292'>292</a>
<a name='L293'></a><a href='#L293'>293</a>
<a name='L294'></a><a href='#L294'>294</a>
<a name='L295'></a><a href='#L295'>295</a>
<a name='L296'></a><a href='#L296'>296</a>
<a name='L297'></a><a href='#L297'>297</a>
<a name='L298'></a><a href='#L298'>298</a>
<a name='L299'></a><a href='#L299'>299</a>
<a name='L300'></a><a href='#L300'>300</a>
<a name='L301'></a><a href='#L301'>301</a>
<a name='L302'></a><a href='#L302'>302</a>
<a name='L303'></a><a href='#L303'>303</a>
<a name='L304'></a><a href='#L304'>304</a>
<a name='L305'></a><a href='#L305'>305</a>
<a name='L306'></a><a href='#L306'>306</a>
<a name='L307'></a><a href='#L307'>307</a>
<a name='L308'></a><a href='#L308'>308</a>
<a name='L309'></a><a href='#L309'>309</a>
<a name='L310'></a><a href='#L310'>310</a>
<a name='L311'></a><a href='#L311'>311</a>
<a name='L312'></a><a href='#L312'>312</a>
<a name='L313'></a><a href='#L313'>313</a>
<a name='L314'></a><a href='#L314'>314</a>
<a name='L315'></a><a href='#L315'>315</a>
<a name='L316'></a><a href='#L316'>316</a>
<a name='L317'></a><a href='#L317'>317</a>
<a name='L318'></a><a href='#L318'>318</a>
<a name='L319'></a><a href='#L319'>319</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>

@@ -334,2 +403,3 @@ <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">1x</span>

@@ -365,4 +435,4 @@ <span class="cline-any cline-yes">1x</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">97x</span>
<span class="cline-any cline-yes">97x</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-yes">103x</span>
<span class="cline-any cline-no">&nbsp;</span>

@@ -376,26 +446,25 @@ <span class="cline-any cline-no">&nbsp;</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">47x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-neutral">&nbsp;</span>

@@ -405,2 +474,3 @@ <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">3x</span>

@@ -431,29 +501,29 @@ <span class="cline-any cline-yes">3x</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-yes">6x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">49x</span>
<span class="cline-any cline-yes">52x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">3x</span>

@@ -465,8 +535,8 @@ <span class="cline-any cline-yes">3x</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">7x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">50x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-yes">53x</span>
<span class="cline-any cline-neutral">&nbsp;</span>

@@ -476,9 +546,77 @@ <span class="cline-any cline-neutral">&nbsp;</span>

<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">8x</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">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">10x</span>
<span class="cline-any cline-yes">6x</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-yes">4x</span>
<span class="cline-any cline-yes">11x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">10x</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">16x</span>
<span class="cline-any cline-yes">8x</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-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">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-no">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-neutral">&nbsp;</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-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">4x</span>
<span class="cline-any cline-yes">3x</span>
<span class="cline-any cline-neutral">&nbsp;</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">1x</span>
<span class="cline-any cline-yes">2x</span>
<span class="cline-any cline-neutral">&nbsp;</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-no">&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">2x</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>

@@ -585,2 +723,3 @@ <span class="cline-any cline-yes">5x</span>

ObjectMode,
PluginValue,
} from '@contractkit/core';

@@ -700,3 +839,3 @@ import { SECURITY_NONE } from '@contractkit/core';

for (<span class="cstat-no" title="statement not covered" ><span class="branch-1 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>const [k</span></span>ey, val] of Object.entries(op.plugins)) {
lines.push(`${I3}${key}: "${val.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`);
lines.push(...printPluginEntry(key, val, I3));
}

@@ -726,2 +865,70 @@ lines.push(`${I2}}`);

&nbsp;
// ─── Plugins block ───────────────────────────────────────────────────────────
&nbsp;
const IDENT_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
&nbsp;
function escapeString(s: string): string {
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
}
&nbsp;
function printPluginEntry(key: string, value: PluginValue, indent: string): string[] {
const lines: string[] = [];
const inline = printPluginInline(value);
if (inline !== null) {
lines.push(`${indent}${key}: ${inline}`);
} else {
const head = `${indent}${key}: `;
const block = printPluginBlock(value, indent);
lines.push(`${head}${block[0]!.trimStart()}`);
for (let i = 1; i &lt; block.length; i++) lines.push(block[i]!);
}
return lines;
}
&nbsp;
function printPluginInline(value: PluginValue): string | null {
if (typeof value === 'string') return `"${escapeString(value)}"`;
if (typeof value === 'number' || typeof value === 'boolean') return String(value);
<span class="missing-if-branch" title="if path not taken" >I</span>if (value === null) <span class="cstat-no" title="statement not covered" >return 'null';</span>
<span class="missing-if-branch" title="if path not taken" >I</span>if (Array.isArray(value) &amp;&amp; value.length === 0) <span class="cstat-no" title="statement not covered" >return '[]';</span>
<span class="missing-if-branch" title="if path not taken" >I</span>if (!Array.isArray(value) &amp;&amp; typeof value === 'object' &amp;&amp; Object.keys(value).length === 0) <span class="cstat-no" title="statement not covered" >return '{}';</span>
return null;
}
&nbsp;
function printPluginBlock(value: PluginValue, indent: string): string[] {
const inner = indent + INDENT;
const lines: string[] = [];
if (Array.isArray(value)) {
lines.push(`${indent}[`);
for (<span class="cstat-no" title="statement not covered" ><span class="branch-1 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>const i</span></span>tem of value) {
const inline = printPluginInline(item);
if (inline !== null) {
lines.push(`${inner}${inline}`);
} else <span class="missing-if-branch" title="else path not taken" >E</span>{
const block = <span class="cstat-no" title="statement not covered" >printPluginBlock(item, inner);</span>
<span class="cstat-no" title="statement not covered" > for (<span class="cstat-no" title="statement not covered" >const l</span> of <span class="cstat-no" title="statement not covered" >block) <span class="cstat-no" title="statement not covered" >l</span>ines.push(l);</span></span>
}
}
lines.push(`${indent}]`);
return lines;
}
<span class="missing-if-branch" title="else path not taken" >E</span>if (typeof <span class="branch-0 cbranch-no" title="branch not covered" >value</span> === 'object' &amp;&amp; value !== null) {
lines.push(`${indent}{`);
for (<span class="cstat-no" title="statement not covered" ><span class="branch-1 cbranch-no" title="branch not covered" ><span class="missing-if-branch" title="if path not taken" >I</span>const [k</span></span>, v] of Object.entries(value)) {
const fieldKey = IDENT_RE.test(k) ? k : <span class="branch-1 cbranch-no" title="branch not covered" >`"${escapeString(k)}"`;</span>
const inline = printPluginInline(v);
if (inline !== null) {
lines.push(`${inner}${fieldKey}: ${inline}`);
} else {
const block = printPluginBlock(v, inner);
lines.push(`${inner}${fieldKey}: ${block[0]!.trimStart()}`);
for (let i = 1; i &lt; block.length; i++) lines.push(block[i]!);
}
}
lines.push(`${indent}}`);
return lines;
}
// Scalars are always inline; printPluginInline already handles them.
<span class="cstat-no" title="statement not covered" > return [`${indent}${printPluginInline(value)}`];</span>
}
&nbsp;
// ─── Security ────────────────────────────────────────────────────────────────

@@ -835,3 +1042,3 @@ &nbsp;

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -838,0 +1045,0 @@ <script src="prettify.js"></script>

@@ -520,3 +520,3 @@

<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
at 2026-05-04T13:24:25.753Z
at 2026-05-06T12:37:13.164Z
</div>

@@ -523,0 +523,0 @@ <script src="prettify.js"></script>

@@ -279,3 +279,3 @@ var __defProp = Object.defineProperty;

for (const [key, val] of Object.entries(op.plugins)) {
lines.push(`${I3}${key}: "${val.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`);
lines.push(...printPluginEntry(key, val, I3));
}

@@ -304,2 +304,68 @@ lines.push(`${I2}}`);

__name(printOperation, "printOperation");
var IDENT_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
function escapeString(s) {
return s.replace(/\\/g, "\\\\").replace(/"/g, '\\"');
}
__name(escapeString, "escapeString");
function printPluginEntry(key, value, indent) {
const lines = [];
const inline = printPluginInline(value);
if (inline !== null) {
lines.push(`${indent}${key}: ${inline}`);
} else {
const head = `${indent}${key}: `;
const block = printPluginBlock(value, indent);
lines.push(`${head}${block[0].trimStart()}`);
for (let i = 1; i < block.length; i++) lines.push(block[i]);
}
return lines;
}
__name(printPluginEntry, "printPluginEntry");
function printPluginInline(value) {
if (typeof value === "string") return `"${escapeString(value)}"`;
if (typeof value === "number" || typeof value === "boolean") return String(value);
if (value === null) return "null";
if (Array.isArray(value) && value.length === 0) return "[]";
if (!Array.isArray(value) && typeof value === "object" && Object.keys(value).length === 0) return "{}";
return null;
}
__name(printPluginInline, "printPluginInline");
function printPluginBlock(value, indent) {
const inner = indent + INDENT;
const lines = [];
if (Array.isArray(value)) {
lines.push(`${indent}[`);
for (const item of value) {
const inline = printPluginInline(item);
if (inline !== null) {
lines.push(`${inner}${inline}`);
} else {
const block = printPluginBlock(item, inner);
for (const l of block) lines.push(l);
}
}
lines.push(`${indent}]`);
return lines;
}
if (typeof value === "object" && value !== null) {
lines.push(`${indent}{`);
for (const [k, v] of Object.entries(value)) {
const fieldKey = IDENT_RE.test(k) ? k : `"${escapeString(k)}"`;
const inline = printPluginInline(v);
if (inline !== null) {
lines.push(`${inner}${fieldKey}: ${inline}`);
} else {
const block = printPluginBlock(v, inner);
lines.push(`${inner}${fieldKey}: ${block[0].trimStart()}`);
for (let i = 1; i < block.length; i++) lines.push(block[i]);
}
}
lines.push(`${indent}}`);
return lines;
}
return [
`${indent}${printPluginInline(value)}`
];
}
__name(printPluginBlock, "printPluginBlock");
function formatSignatureValue(value) {

@@ -306,0 +372,0 @@ return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value) ? value : `"${value}"`;

@@ -1,1 +0,1 @@

{"version":3,"sources":["../src/index.ts","../src/indent.ts","../src/print-type.ts","../src/print-contract.ts","../src/print-operation.ts","../src/print-ck.ts"],"sourcesContent":["import type { Plugin } from 'prettier';\nimport { builders } from 'prettier/doc';\nimport { parseCk, DiagnosticCollector } from '@contractkit/core';\nimport type { CkRootNode } from '@contractkit/core';\nimport { printCk } from './print-ck.js';\n\nconst { hardline, join } = builders;\n\nfunction toDoc(text: string) {\n const lines = text.trimEnd().split('\\n');\n return join(hardline, lines);\n}\n\nconst plugin: Plugin<CkRootNode> = {\n languages: [\n {\n name: 'ContractDSL',\n parsers: ['contract-ck'],\n extensions: ['.ck'],\n vscodeLanguageIds: ['contract-ck'],\n },\n ],\n\n parsers: {\n 'contract-ck': {\n parse(text, _options) {\n const diag = new DiagnosticCollector();\n return parseCk(text, '<stdin>', diag);\n },\n astFormat: 'contract-ck',\n locStart: () => 0,\n locEnd: _node => 0,\n },\n },\n\n printers: {\n 'contract-ck': {\n print(path, options) {\n const node = path.node as CkRootNode;\n return toDoc(printCk(node, options.printWidth));\n },\n },\n },\n};\n\nexport default plugin;\n","export const INDENT = ' ';\n","import type { ContractTypeNode, FieldNode, InlineObjectTypeNode } from '@contractkit/core';\nimport { INDENT } from './indent.js';\n\n// ─── Type expression printer ────────────────────────────────────────────────\n\n/** Render a `ContractTypeNode` back to its `.ck` source string. */\nexport function printType(type: ContractTypeNode): string {\n switch (type.kind) {\n case 'scalar': {\n const constraints: string[] = [];\n if (type.format !== undefined) {\n // Print unquoted when format contains only safe chars; quote otherwise\n const fmt = type.format;\n constraints.push(/^[a-zA-Z0-9\\-.:/]+$/.test(fmt) ? fmt : `\"${fmt}\"`);\n }\n if (type.min !== undefined) constraints.push(`min=${type.min}`);\n if (type.max !== undefined) constraints.push(`max=${type.max}`);\n if (type.len !== undefined) constraints.push(`len=${type.len}`);\n if (type.regex !== undefined) constraints.push(`regex=/${type.regex}/`);\n return constraints.length > 0 ? `${type.name}(${constraints.join(', ')})` : type.name;\n }\n case 'array': {\n const args: string[] = [printType(type.item)];\n if (type.min !== undefined) args.push(`min=${type.min}`);\n if (type.max !== undefined) args.push(`max=${type.max}`);\n return `array(${args.join(', ')})`;\n }\n case 'tuple':\n return `tuple(${type.items.map(printType).join(', ')})`;\n case 'record':\n return `record(${printType(type.key)}, ${printType(type.value)})`;\n case 'enum':\n return `enum(${type.values.map(formatEnumValue).join(', ')})`;\n case 'literal':\n return typeof type.value === 'string' ? `literal(\"${type.value}\")` : `literal(${type.value})`;\n case 'union':\n return type.members.map(printType).join(' | ');\n case 'discriminatedUnion':\n return `discriminated(by=${type.discriminator}, ${type.members.map(printType).join(' | ')})`;\n case 'intersection':\n return type.members.map(printType).join(' & ');\n case 'ref':\n return type.name;\n case 'inlineObject':\n return printInlineObjectCompact(type);\n case 'lazy':\n return `lazy(${printType(type.inner)})`;\n }\n}\n\n/** Compact single-line form — used when inline object appears nested inside another type. */\nfunction printInlineObjectCompact(obj: InlineObjectTypeNode): string {\n const prefix = obj.mode ? `mode(${obj.mode}) ` : '';\n if (obj.fields.length === 0) return `${prefix}{}`;\n const parts = obj.fields.map(f => {\n const opt = f.optional ? '?' : '';\n let t = printType(f.type);\n if (f.nullable) t += ' | null';\n return `${f.name}${opt}: ${t}`;\n });\n return `${prefix}{ ${parts.join(', ')} }`;\n}\n\n/** Multi-line enum form — one value per line, used when single-line would exceed print width. */\nexport function printEnumExpanded(values: string[], indent: string): string {\n const innerIndent = indent + INDENT;\n return `enum(\\n${values.map(v => `${innerIndent}${formatEnumValue(v)}`).join(',\\n')}\\n${indent})`;\n}\n\n// ─── Field printer ──────────────────────────────────────────────────────────\n\n/** Print a full field declaration, including visibility, default, and inline comment.\n * Modifier order is canonical: override → deprecated → readonly|writeonly → type. */\nexport function printField(field: FieldNode, indent: string, printWidth: number = 80): string {\n const opt = field.optional ? '?' : '';\n const ovr = field.override ? 'override ' : '';\n const dep = field.deprecated ? 'deprecated ' : '';\n const vis = field.visibility !== 'normal' ? `${field.visibility} ` : '';\n const mods = `${ovr}${dep}${vis}`;\n const def = field.default !== undefined ? ` = ${formatDefault(field.default)}` : '';\n const comment = field.description ? ` # ${field.description}` : '';\n const innerIndent = indent + INDENT;\n\n // Expand inline object types to multi-line — same rule as type aliases.\n // Only when there's no default and no nullable union (those can't split cleanly).\n if (!field.nullable && field.default === undefined) {\n const trailing = extractTrailingInlineObject(field.type);\n if (trailing) {\n const { prefix, inlineObj } = trailing;\n const modePart = inlineObj.mode ? `mode(${inlineObj.mode}) ` : '';\n const header = prefix\n ? `${indent}${field.name}${opt}: ${mods}${prefix} & ${modePart}{${comment}`\n : `${indent}${field.name}${opt}: ${mods}${modePart}{${comment}`;\n return [header, ...printInlineObjectExpanded(inlineObj, innerIndent, printWidth), `${indent}}`].join('\\n');\n }\n }\n\n let typeStr = printType(field.type);\n if (field.nullable) typeStr += ' | null';\n const fullLine = `${indent}${field.name}${opt}: ${mods}${typeStr}${def}${comment}`;\n if (field.type.kind === 'enum' && !field.nullable && field.default === undefined && fullLine.length > printWidth) {\n const enumStr = printEnumExpanded(field.type.values, indent);\n return `${indent}${field.name}${opt}: ${mods}${enumStr}${comment}`;\n }\n return fullLine;\n}\n\n/** Print inline-object fields expanded (used when an inline brace object trails a type alias). */\nexport function printInlineObjectExpanded(obj: InlineObjectTypeNode, indent: string, printWidth: number = 80): string[] {\n return obj.fields.map(f => printField(f, indent, printWidth));\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/** Format a single enum value: bare identifier stays bare; anything else gets double-quoted. */\nexport function formatEnumValue(v: string): string {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(v)) return v;\n return `\"${v}\"`;\n}\n\n/** Format a default value: quote strings that aren't valid bare identifiers. */\nexport function formatDefault(val: string | number | boolean): string {\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n // If it looks like a bare identifier (enum value, unquoted token), keep it bare.\n if (/^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(val)) return val;\n return `\"${val}\"`;\n}\n\n/**\n * Detect whether the last member of a type is an inline brace object, and if so\n * return the prefix type string and the inline object for expanded printing.\n * Returns null if the type doesn't end with an inline object.\n */\nexport function extractTrailingInlineObject(type: ContractTypeNode): {\n prefix: string | null;\n inlineObj: InlineObjectTypeNode;\n} | null {\n if (type.kind === 'inlineObject') {\n return { prefix: null, inlineObj: type };\n }\n if (type.kind === 'intersection') {\n const last = type.members[type.members.length - 1];\n if (last?.kind === 'inlineObject') {\n const prefixStr = type.members.slice(0, -1).map(printType).join(' & ');\n return { prefix: prefixStr, inlineObj: last };\n }\n }\n return null;\n}\n","import type { ModelNode } from '@contractkit/core';\nimport { printField, printInlineObjectExpanded, extractTrailingInlineObject, printType, printEnumExpanded } from './print-type.js';\nimport { INDENT } from './indent.js';\n\n// ─── Model declaration ───────────────────────────────────────────────────────\n\nexport function printModelDecl(model: ModelNode, printWidth: number = 80): string {\n // Type alias form: Name : typeExpression\n if (model.type !== undefined) {\n return printTypeAlias(model, printWidth);\n }\n\n // Regular model with fields (possibly inherited)\n const commentSuffix = model.description ? ` # ${model.description}` : '';\n const modifiers = [\n model.deprecated ? 'deprecated' : '',\n model.inputCase || model.outputCase\n ? `format(${[model.inputCase ? `input=${model.inputCase}` : '', model.outputCase ? `output=${model.outputCase}` : ''].filter(Boolean).join(', ')})`\n : '',\n model.mode ? `mode(${model.mode})` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const modePrefix = modifiers ? `${modifiers} ` : '';\n const baseChain = model.bases && model.bases.length > 0 ? `${model.bases.join(' & ')} & ` : '';\n const header = `${modePrefix}${model.name}: ${baseChain}{${commentSuffix}`;\n\n const lines: string[] = [header];\n for (const field of model.fields) {\n lines.push(printField(field, INDENT, printWidth));\n }\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction printTypeAlias(model: ModelNode, printWidth: number): string {\n const type = model.type!;\n const commentSuffix = model.description ? ` # ${model.description}` : '';\n const modifiers = [\n model.deprecated ? 'deprecated' : '',\n model.inputCase || model.outputCase\n ? `format(${[model.inputCase ? `input=${model.inputCase}` : '', model.outputCase ? `output=${model.outputCase}` : ''].filter(Boolean).join(', ')})`\n : '',\n model.mode ? `mode(${model.mode})` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const modePrefix = modifiers ? `${modifiers} ` : '';\n\n // If the type ends with an inline brace object, expand it as a pseudo-model block.\n const trailing = extractTrailingInlineObject(type);\n if (trailing) {\n const { prefix, inlineObj } = trailing;\n const modePart = inlineObj.mode ? `mode(${inlineObj.mode}) ` : '';\n const header = prefix\n ? `${modePrefix}${model.name}: ${prefix} & ${modePart}{${commentSuffix}`\n : `${modePrefix}${model.name}: ${modePart}{${commentSuffix}`;\n const lines: string[] = [header, ...printInlineObjectExpanded(inlineObj, INDENT, printWidth), '}'];\n return lines.join('\\n');\n }\n\n // Simple type alias — single line, unless it's a long enum.\n // Note: the contract prefix \"contract \" (9 chars) is prepended by the caller.\n const singleLine = `${modePrefix}${model.name}: ${printType(type)}${commentSuffix}`;\n if (type.kind === 'enum' && 'contract '.length + singleLine.length > printWidth) {\n return `${modePrefix}${model.name}: ${printEnumExpanded(type.values, '')}${commentSuffix}`;\n }\n return singleLine;\n}\n","import type {\n OpRouteNode,\n OpOperationNode,\n OpResponseNode,\n ParamSource,\n SecurityNode,\n SecurityFields,\n ContractTypeNode,\n ObjectMode,\n} from '@contractkit/core';\nimport { SECURITY_NONE } from '@contractkit/core';\nimport { printType, formatDefault } from './print-type.js';\nimport { INDENT } from './indent.js';\n\nconst I1 = INDENT;\nconst I2 = INDENT.repeat(2);\nconst I3 = INDENT.repeat(3);\nconst I4 = INDENT.repeat(4);\n\n// ─── Orphan comment helpers ──────────────────────────────────────────────────\n\ntype CommentEntry = { line: number; text: string };\nexport type CommentBlock = { startLine: number; lines: string[] };\n\n/** Group sorted orphan comment entries into consecutive-line blocks. */\nexport function groupComments(entries: CommentEntry[]): CommentBlock[] {\n const blocks: CommentBlock[] = [];\n let current: CommentBlock | null = null;\n for (const { line, text } of entries) {\n if (current && line === current.startLine + current.lines.length) {\n current.lines.push(text);\n } else {\n if (current) blocks.push(current);\n current = { startLine: line, lines: [text] };\n }\n }\n if (current) blocks.push(current);\n return blocks;\n}\n\n/**\n * Emit any comment blocks whose startLine is < beforeLine.\n * Lines are emitted verbatim — they already carry their original indentation.\n */\nexport function flushBlocks(out: string[], blocks: CommentBlock[], idx: { value: number }, beforeLine: number, _indent = '') {\n while (idx.value < blocks.length && blocks[idx.value]!.startLine < beforeLine) {\n for (const l of blocks[idx.value]!.lines) out.push(l);\n idx.value++;\n }\n}\n\n// ─── Route ───────────────────────────────────────────────────────────────────\n\nexport function printRoute(route: OpRouteNode, blocks: CommentBlock[], idx: { value: number }, nextRouteStart: number): string {\n const lines: string[] = [];\n const commentSuffix = route.description ? ` # ${route.description}` : '';\n lines.push(`${route.path}: {${commentSuffix}`);\n\n if (route.params !== undefined) {\n lines.push(...printParamsBlock(route.params, I1, route.paramsMode));\n }\n\n if (route.security !== undefined) {\n lines.push(...printSecurity(route.security, I1, I2));\n }\n\n for (const op of route.operations) {\n // Flush comment blocks that appear before this operation (inside the route)\n flushBlocks(lines, blocks, idx, op.loc.line, I1);\n lines.push(...printOperation(op));\n }\n\n // Flush comment blocks between last operation and the next route\n flushBlocks(lines, blocks, idx, nextRouteStart, I1);\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// ─── Params block ────────────────────────────────────────────────────────────\n\nfunction printParamsBlock(source: ParamSource, indent: string, mode?: ObjectMode): string[] {\n const prefix = mode ? `mode(${mode}) ` : '';\n if (source.kind === 'ref') {\n return [`${indent}${prefix}params: ${source.name}`];\n }\n if (source.kind === 'params') {\n const lines: string[] = [`${indent}${prefix}params: {`];\n const inner = indent + INDENT;\n for (const p of source.nodes) {\n const opt = p.optional ? '?' : '';\n let t = printType(p.type);\n if (p.nullable) t += ' | null';\n const def = p.default !== undefined ? ` = ${formatDefault(p.default)}` : '';\n const comment = p.description ? ` # ${p.description}` : '';\n lines.push(`${inner}${p.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${indent}}`);\n return lines;\n }\n // ContractTypeNode\n return [`${indent}${prefix}params: ${printType(source.node)}`];\n}\n\n// ─── HTTP operation ──────────────────────────────────────────────────────────\n\nfunction printOperation(op: OpOperationNode): string[] {\n const lines: string[] = [];\n const commentSuffix = op.description ? ` # ${op.description}` : '';\n const modPart = op.modifiers?.length ? `(${op.modifiers[0]})` : '';\n lines.push(`${I1}${op.method}${modPart}: {${commentSuffix}`);\n\n if (op.name) lines.push(`${I2}name: ${op.name}`);\n if (op.service) lines.push(`${I2}service: ${op.service}`);\n if (op.sdk) lines.push(`${I2}sdk: ${op.sdk}`);\n if (op.signature) {\n const comment = op.signatureDescription ? ` # ${op.signatureDescription}` : '';\n lines.push(`${I2}signature: ${formatSignatureValue(op.signature)}${comment}`);\n }\n if (op.security !== undefined) lines.push(...printSecurity(op.security));\n if (op.plugins && Object.keys(op.plugins).length > 0) {\n lines.push(`${I2}plugins: {`);\n for (const [key, val] of Object.entries(op.plugins)) {\n lines.push(`${I3}${key}: \"${val.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"')}\"`);\n }\n lines.push(`${I2}}`);\n }\n if (op.query !== undefined) lines.push(...printQueryOrHeaders('query', op.query, op.queryMode));\n if (op.requestHeadersOptOut) {\n lines.push(`${I2}headers: none`);\n } else if (op.headers !== undefined) {\n lines.push(...printQueryOrHeaders('headers', op.headers, op.headersMode));\n }\n if (op.request) {\n lines.push(`${I2}request: {`);\n for (const body of op.request.bodies) {\n lines.push(...printContentTypeLine(body.contentType, body.bodyType, I3));\n }\n lines.push(`${I2}}`);\n }\n if (op.responses.length > 0) {\n lines.push(...printResponseBlock(op.responses));\n }\n\n lines.push(`${I1}}`);\n return lines;\n}\n\n// ─── Security ────────────────────────────────────────────────────────────────\n\n/** Print a signature key: unquoted when it's a plain identifier, quoted otherwise. */\nfunction formatSignatureValue(value: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value) ? value : `\"${value}\"`;\n}\n\n// indent: indentation for the `security` keyword line\n// innerIndent: indentation for field lines inside the block\nexport function printSecurity(security: SecurityNode, indent = I2, innerIndent = I3): string[] {\n if (security === SECURITY_NONE) return [`${indent}security: none`];\n const fields = security as SecurityFields;\n const hasRoles = fields.roles && fields.roles.length > 0;\n if (!hasRoles) return [];\n const lines = [`${indent}security: {`];\n const comment = fields.rolesDescription ? ` # ${fields.rolesDescription}` : '';\n lines.push(`${innerIndent}roles: ${fields.roles!.join(' ')}${comment}`);\n lines.push(`${indent}}`);\n return lines;\n}\n\n// ─── Query / headers ─────────────────────────────────────────────────────────\n\nfunction printQueryOrHeaders(keyword: 'query' | 'headers', source: ParamSource, mode?: ObjectMode): string[] {\n const prefix = mode ? `mode(${mode}) ` : '';\n if (source.kind === 'ref') {\n return [`${I2}${prefix}${keyword}: ${source.name}`];\n }\n if (source.kind === 'params') {\n if (source.nodes.length === 0) return [];\n const lines: string[] = [`${I2}${prefix}${keyword}: {`];\n for (const p of source.nodes) {\n const opt = p.optional ? '?' : '';\n let t = printType(p.type);\n if (p.nullable) t += ' | null';\n const def = p.default !== undefined ? ` = ${formatDefault(p.default)}` : '';\n const comment = p.description ? ` # ${p.description}` : '';\n lines.push(`${I3}${p.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${I2}}`);\n return lines;\n }\n // ContractTypeNode (e.g. intersection)\n return [`${I2}${prefix}${keyword}: ${printType(source.node)}`];\n}\n\n// ─── Content-type line ───────────────────────────────────────────────────────\n\n/** Print a `contentType: bodyType` line, expanding inline brace objects onto separate lines. */\nfunction printContentTypeLine(contentType: string, bodyType: ContractTypeNode, lineIndent: string): string[] {\n if (bodyType.kind === 'inlineObject') {\n const fieldIndent = lineIndent + INDENT;\n const lines: string[] = [`${lineIndent}${contentType}: {`];\n for (const f of bodyType.fields) {\n const opt = f.optional ? '?' : '';\n let t = printType(f.type);\n if (f.nullable) t += ' | null';\n const def = f.default !== undefined ? ` = ${formatDefault(f.default)}` : '';\n const comment = f.description ? ` # ${f.description}` : '';\n lines.push(`${fieldIndent}${f.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${lineIndent}}`);\n return lines;\n }\n return [`${lineIndent}${contentType}: ${printType(bodyType)}`];\n}\n\n// ─── Response block ──────────────────────────────────────────────────────────\n\nfunction printResponseBlock(responses: OpResponseNode[]): string[] {\n const lines: string[] = [`${I2}response: {`];\n\n for (const resp of responses) {\n const hasBody = resp.contentType && resp.bodyType;\n const hasHeaders = resp.headers && resp.headers.length > 0;\n const optOut = resp.headersOptOut;\n if (hasBody || hasHeaders || optOut) {\n lines.push(`${I3}${resp.statusCode}: {`);\n if (hasBody) {\n lines.push(...printContentTypeLine(resp.contentType!, resp.bodyType!, I4));\n }\n if (optOut) {\n lines.push(`${I4}headers: none`);\n } else if (hasHeaders) {\n lines.push(`${I4}headers: {`);\n for (const h of resp.headers!) {\n const opt = h.optional ? '?' : '';\n const trail = h.description ? ` # ${h.description}` : '';\n lines.push(`${I4}${INDENT}${h.name}${opt}: ${printType(h.type)}${trail}`);\n }\n lines.push(`${I4}}`);\n }\n lines.push(`${I3}}`);\n } else {\n lines.push(`${I3}${resp.statusCode}:`);\n }\n }\n\n lines.push(`${I2}}`);\n return lines;\n}\n","import type { CkRootNode, OpResponseHeaderNode } from '@contractkit/core';\nimport { printModelDecl } from './print-contract.js';\nimport { printRoute, printSecurity, type CommentBlock } from './print-operation.js';\nimport { printType } from './print-type.js';\nimport { INDENT } from './indent.js';\n\nexport const DEFAULT_PRINT_WIDTH = 80;\n\n// ─── Options block ──────────────────────────────────────────────────────────\n\n/**\n * Quote an options-block value if it isn't a plain identifier.\n *\n * Plain identifiers (starts with letter/underscore/dollar, rest are\n * alphanumeric/underscore/dollar/hyphen/dot) are left bare. Everything\n * else — paths with slashes, values starting with `#`, values with spaces,\n * etc. — is double-quoted so the round-trip parse is unambiguous.\n */\nfunction quoteOptionsValue(value: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(value) ? value : `\"${value}\"`;\n}\n\nfunction printOptionsBlock(ast: CkRootNode): string | null {\n const hasMeta = Object.keys(ast.meta).length > 0;\n const hasServices = Object.keys(ast.services).length > 0;\n const hasSecurity = ast.security !== undefined;\n const hasRequestHeaders = (ast.requestHeaders?.length ?? 0) > 0;\n const hasResponseHeaders = (ast.responseHeaders?.length ?? 0) > 0;\n\n if (!hasMeta && !hasServices && !hasSecurity && !hasRequestHeaders && !hasResponseHeaders) return null;\n\n const lines: string[] = ['options {'];\n\n if (hasMeta) {\n lines.push(`${INDENT}keys: {`);\n for (const [key, value] of Object.entries(ast.meta)) {\n lines.push(`${INDENT}${INDENT}${key}: ${quoteOptionsValue(value)}`);\n }\n lines.push(`${INDENT}}`);\n }\n\n if (hasServices) {\n lines.push(`${INDENT}services: {`);\n for (const [key, value] of Object.entries(ast.services)) {\n lines.push(`${INDENT}${INDENT}${key}: ${quoteOptionsValue(value)}`);\n }\n lines.push(`${INDENT}}`);\n }\n\n if (hasRequestHeaders) {\n lines.push(...printOptionsHeaderScope('request', ast.requestHeaders!));\n }\n\n if (hasResponseHeaders) {\n lines.push(...printOptionsHeaderScope('response', ast.responseHeaders!));\n }\n\n if (hasSecurity) {\n lines.push(...printSecurity(ast.security!, INDENT, INDENT + INDENT));\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction printOptionsHeaderScope(keyword: 'request' | 'response', headers: OpResponseHeaderNode[]): string[] {\n const I2 = INDENT + INDENT;\n const I3 = INDENT + INDENT + INDENT;\n const lines = [`${INDENT}${keyword}: {`, `${I2}headers: {`];\n for (const h of headers) {\n const opt = h.optional ? '?' : '';\n const trail = h.description ? ` # ${h.description}` : '';\n lines.push(`${I3}${h.name}${opt}: ${printType(h.type)}${trail}`);\n }\n lines.push(`${I2}}`);\n lines.push(`${INDENT}}`);\n return lines;\n}\n\n// ─── CK file printer ───────────────────────────────────────────────────────\n\n/**\n * Render a parsed `.ck` AST back to source. Output is byte-identical on\n * round-trip when the input is already canonically formatted: options block\n * first, then contracts, then operations, separated by blank lines.\n *\n * `printWidth` is forwarded to per-model printing for line wrapping inside\n * inline-object types.\n */\nexport function printCk(ast: CkRootNode, printWidth: number = DEFAULT_PRINT_WIDTH): string {\n const parts: string[] = [];\n\n // Options block\n const options = printOptionsBlock(ast);\n if (options) parts.push(options);\n\n // Contracts (models)\n for (const model of ast.models) {\n if (parts.length > 0) parts.push('');\n parts.push(`contract ${printModelDecl(model, printWidth)}`);\n }\n\n // Operations (routes)\n const emptyBlocks: CommentBlock[] = [];\n const emptyIdx = { value: 0 };\n for (const route of ast.routes) {\n if (parts.length > 0) parts.push('');\n const modPart = route.modifiers?.length ? `(${route.modifiers[0]})` : '';\n parts.push(`operation${modPart} ${printRoute(route, emptyBlocks, emptyIdx, Infinity)}`);\n }\n\n return parts.join('\\n') + '\\n';\n}\n"],"mappings":";;;;AACA,SAASA,gBAAgB;AACzB,SAASC,SAASC,2BAA2B;;;ACFtC,IAAMC,SAAS;;;ACMf,SAASC,UAAUC,MAAsB;AAC5C,UAAQA,KAAKC,MAAI;IACb,KAAK,UAAU;AACX,YAAMC,cAAwB,CAAA;AAC9B,UAAIF,KAAKG,WAAWC,QAAW;AAE3B,cAAMC,MAAML,KAAKG;AACjBD,oBAAYI,KAAK,sBAAsBC,KAAKF,GAAAA,IAAOA,MAAM,IAAIA,GAAAA,GAAM;MACvE;AACA,UAAIL,KAAKQ,QAAQJ,OAAWF,aAAYI,KAAK,OAAON,KAAKQ,GAAG,EAAE;AAC9D,UAAIR,KAAKS,QAAQL,OAAWF,aAAYI,KAAK,OAAON,KAAKS,GAAG,EAAE;AAC9D,UAAIT,KAAKU,QAAQN,OAAWF,aAAYI,KAAK,OAAON,KAAKU,GAAG,EAAE;AAC9D,UAAIV,KAAKW,UAAUP,OAAWF,aAAYI,KAAK,UAAUN,KAAKW,KAAK,GAAG;AACtE,aAAOT,YAAYU,SAAS,IAAI,GAAGZ,KAAKa,IAAI,IAAIX,YAAYY,KAAK,IAAA,CAAA,MAAWd,KAAKa;IACrF;IACA,KAAK,SAAS;AACV,YAAME,OAAiB;QAAChB,UAAUC,KAAKgB,IAAI;;AAC3C,UAAIhB,KAAKQ,QAAQJ,OAAWW,MAAKT,KAAK,OAAON,KAAKQ,GAAG,EAAE;AACvD,UAAIR,KAAKS,QAAQL,OAAWW,MAAKT,KAAK,OAAON,KAAKS,GAAG,EAAE;AACvD,aAAO,SAASM,KAAKD,KAAK,IAAA,CAAA;IAC9B;IACA,KAAK;AACD,aAAO,SAASd,KAAKiB,MAAMC,IAAInB,SAAAA,EAAWe,KAAK,IAAA,CAAA;IACnD,KAAK;AACD,aAAO,UAAUf,UAAUC,KAAKmB,GAAG,CAAA,KAAMpB,UAAUC,KAAKoB,KAAK,CAAA;IACjE,KAAK;AACD,aAAO,QAAQpB,KAAKqB,OAAOH,IAAII,eAAAA,EAAiBR,KAAK,IAAA,CAAA;IACzD,KAAK;AACD,aAAO,OAAOd,KAAKoB,UAAU,WAAW,YAAYpB,KAAKoB,KAAK,OAAO,WAAWpB,KAAKoB,KAAK;IAC9F,KAAK;AACD,aAAOpB,KAAKuB,QAAQL,IAAInB,SAAAA,EAAWe,KAAK,KAAA;IAC5C,KAAK;AACD,aAAO,oBAAoBd,KAAKwB,aAAa,KAAKxB,KAAKuB,QAAQL,IAAInB,SAAAA,EAAWe,KAAK,KAAA,CAAA;IACvF,KAAK;AACD,aAAOd,KAAKuB,QAAQL,IAAInB,SAAAA,EAAWe,KAAK,KAAA;IAC5C,KAAK;AACD,aAAOd,KAAKa;IAChB,KAAK;AACD,aAAOY,yBAAyBzB,IAAAA;IACpC,KAAK;AACD,aAAO,QAAQD,UAAUC,KAAK0B,KAAK,CAAA;EAC3C;AACJ;AA1CgB3B;AA6ChB,SAAS0B,yBAAyBE,KAAyB;AACvD,QAAMC,SAASD,IAAIE,OAAO,QAAQF,IAAIE,IAAI,OAAO;AACjD,MAAIF,IAAIG,OAAOlB,WAAW,EAAG,QAAO,GAAGgB,MAAAA;AACvC,QAAMG,QAAQJ,IAAIG,OAAOZ,IAAIc,CAAAA,MAAAA;AACzB,UAAMC,MAAMD,EAAEE,WAAW,MAAM;AAC/B,QAAIC,IAAIpC,UAAUiC,EAAEhC,IAAI;AACxB,QAAIgC,EAAEI,SAAUD,MAAK;AACrB,WAAO,GAAGH,EAAEnB,IAAI,GAAGoB,GAAAA,KAAQE,CAAAA;EAC/B,CAAA;AACA,SAAO,GAAGP,MAAAA,KAAWG,MAAMjB,KAAK,IAAA,CAAA;AACpC;AAVSW;AAaF,SAASY,kBAAkBhB,QAAkBiB,QAAc;AAC9D,QAAMC,cAAcD,SAASE;AAC7B,SAAO;EAAUnB,OAAOH,IAAIuB,CAAAA,MAAK,GAAGF,WAAAA,GAAcjB,gBAAgBmB,CAAAA,CAAAA,EAAI,EAAE3B,KAAK,KAAA,CAAA;EAAWwB,MAAAA;AAC5F;AAHgBD;AAST,SAASK,WAAWC,OAAkBL,QAAgBM,aAAqB,IAAE;AAChF,QAAMX,MAAMU,MAAMT,WAAW,MAAM;AACnC,QAAMW,MAAMF,MAAMG,WAAW,cAAc;AAC3C,QAAMC,MAAMJ,MAAMK,aAAa,gBAAgB;AAC/C,QAAMC,MAAMN,MAAMO,eAAe,WAAW,GAAGP,MAAMO,UAAU,MAAM;AACrE,QAAMC,OAAO,GAAGN,GAAAA,GAAME,GAAAA,GAAME,GAAAA;AAC5B,QAAMG,MAAMT,MAAMU,YAAYjD,SAAY,MAAMkD,cAAcX,MAAMU,OAAO,CAAA,KAAM;AACjF,QAAME,UAAUZ,MAAMa,cAAc,MAAMb,MAAMa,WAAW,KAAK;AAChE,QAAMjB,cAAcD,SAASE;AAI7B,MAAI,CAACG,MAAMP,YAAYO,MAAMU,YAAYjD,QAAW;AAChD,UAAMqD,WAAWC,4BAA4Bf,MAAM3C,IAAI;AACvD,QAAIyD,UAAU;AACV,YAAM,EAAE7B,QAAQ+B,UAAS,IAAKF;AAC9B,YAAMG,WAAWD,UAAU9B,OAAO,QAAQ8B,UAAU9B,IAAI,OAAO;AAC/D,YAAMgC,SAASjC,SACT,GAAGU,MAAAA,GAASK,MAAM9B,IAAI,GAAGoB,GAAAA,KAAQkB,IAAAA,GAAOvB,MAAAA,MAAYgC,QAAAA,IAAYL,OAAAA,KAChE,GAAGjB,MAAAA,GAASK,MAAM9B,IAAI,GAAGoB,GAAAA,KAAQkB,IAAAA,GAAOS,QAAAA,IAAYL,OAAAA;AAC1D,aAAO;QAACM;WAAWC,0BAA0BH,WAAWpB,aAAaK,UAAAA;QAAa,GAAGN,MAAAA;QAAWxB,KAAK,IAAA;IACzG;EACJ;AAEA,MAAIiD,UAAUhE,UAAU4C,MAAM3C,IAAI;AAClC,MAAI2C,MAAMP,SAAU2B,YAAW;AAC/B,QAAMC,WAAW,GAAG1B,MAAAA,GAASK,MAAM9B,IAAI,GAAGoB,GAAAA,KAAQkB,IAAAA,GAAOY,OAAAA,GAAUX,GAAAA,GAAMG,OAAAA;AACzE,MAAIZ,MAAM3C,KAAKC,SAAS,UAAU,CAAC0C,MAAMP,YAAYO,MAAMU,YAAYjD,UAAa4D,SAASpD,SAASgC,YAAY;AAC9G,UAAMqB,UAAU5B,kBAAkBM,MAAM3C,KAAKqB,QAAQiB,MAAAA;AACrD,WAAO,GAAGA,MAAAA,GAASK,MAAM9B,IAAI,GAAGoB,GAAAA,KAAQkB,IAAAA,GAAOc,OAAAA,GAAUV,OAAAA;EAC7D;AACA,SAAOS;AACX;AAhCgBtB;AAmCT,SAASoB,0BAA0BnC,KAA2BW,QAAgBM,aAAqB,IAAE;AACxG,SAAOjB,IAAIG,OAAOZ,IAAIc,CAAAA,MAAKU,WAAWV,GAAGM,QAAQM,UAAAA,CAAAA;AACrD;AAFgBkB;AAOT,SAASxC,gBAAgBmB,GAAS;AACrC,MAAI,gCAAgClC,KAAKkC,CAAAA,EAAI,QAAOA;AACpD,SAAO,IAAIA,CAAAA;AACf;AAHgBnB;AAMT,SAASgC,cAAcY,KAA8B;AACxD,MAAI,OAAOA,QAAQ,YAAY,OAAOA,QAAQ,UAAW,QAAOC,OAAOD,GAAAA;AAEvE,MAAI,gCAAgC3D,KAAK2D,GAAAA,EAAM,QAAOA;AACtD,SAAO,IAAIA,GAAAA;AACf;AALgBZ;AAYT,SAASI,4BAA4B1D,MAAsB;AAI9D,MAAIA,KAAKC,SAAS,gBAAgB;AAC9B,WAAO;MAAE2B,QAAQ;MAAM+B,WAAW3D;IAAK;EAC3C;AACA,MAAIA,KAAKC,SAAS,gBAAgB;AAC9B,UAAMmE,OAAOpE,KAAKuB,QAAQvB,KAAKuB,QAAQX,SAAS,CAAA;AAChD,QAAIwD,MAAMnE,SAAS,gBAAgB;AAC/B,YAAMoE,YAAYrE,KAAKuB,QAAQ+C,MAAM,GAAG,EAAC,EAAGpD,IAAInB,SAAAA,EAAWe,KAAK,KAAA;AAChE,aAAO;QAAEc,QAAQyC;QAAWV,WAAWS;MAAK;IAChD;EACJ;AACA,SAAO;AACX;AAfgBV;;;AC/HT,SAASa,eAAeC,OAAkBC,aAAqB,IAAE;AAEpE,MAAID,MAAME,SAASC,QAAW;AAC1B,WAAOC,eAAeJ,OAAOC,UAAAA;EACjC;AAGA,QAAMI,gBAAgBL,MAAMM,cAAc,MAAMN,MAAMM,WAAW,KAAK;AACtE,QAAMC,YAAY;IACdP,MAAMQ,aAAa,eAAe;IAClCR,MAAMS,aAAaT,MAAMU,aACnB,UAAU;MAACV,MAAMS,YAAY,SAAST,MAAMS,SAAS,KAAK;MAAIT,MAAMU,aAAa,UAAUV,MAAMU,UAAU,KAAK;MAAIC,OAAOC,OAAAA,EAASC,KAAK,IAAA,CAAA,MACzI;IACNb,MAAMc,OAAO,QAAQd,MAAMc,IAAI,MAAM;IAEpCH,OAAOC,OAAAA,EACPC,KAAK,GAAA;AACV,QAAME,aAAaR,YAAY,GAAGA,SAAAA,MAAe;AACjD,QAAMS,YAAYhB,MAAMiB,SAASjB,MAAMiB,MAAMC,SAAS,IAAI,GAAGlB,MAAMiB,MAAMJ,KAAK,KAAA,CAAA,QAAc;AAC5F,QAAMM,SAAS,GAAGJ,UAAAA,GAAaf,MAAMoB,IAAI,KAAKJ,SAAAA,IAAaX,aAAAA;AAE3D,QAAMgB,QAAkB;IAACF;;AACzB,aAAWG,SAAStB,MAAMuB,QAAQ;AAC9BF,UAAMG,KAAKC,WAAWH,OAAOI,QAAQzB,UAAAA,CAAAA;EACzC;AACAoB,QAAMG,KAAK,GAAA;AACX,SAAOH,MAAMR,KAAK,IAAA;AACtB;AA3BgBd;AA6BhB,SAASK,eAAeJ,OAAkBC,YAAkB;AACxD,QAAMC,OAAOF,MAAME;AACnB,QAAMG,gBAAgBL,MAAMM,cAAc,MAAMN,MAAMM,WAAW,KAAK;AACtE,QAAMC,YAAY;IACdP,MAAMQ,aAAa,eAAe;IAClCR,MAAMS,aAAaT,MAAMU,aACnB,UAAU;MAACV,MAAMS,YAAY,SAAST,MAAMS,SAAS,KAAK;MAAIT,MAAMU,aAAa,UAAUV,MAAMU,UAAU,KAAK;MAAIC,OAAOC,OAAAA,EAASC,KAAK,IAAA,CAAA,MACzI;IACNb,MAAMc,OAAO,QAAQd,MAAMc,IAAI,MAAM;IAEpCH,OAAOC,OAAAA,EACPC,KAAK,GAAA;AACV,QAAME,aAAaR,YAAY,GAAGA,SAAAA,MAAe;AAGjD,QAAMoB,WAAWC,4BAA4B1B,IAAAA;AAC7C,MAAIyB,UAAU;AACV,UAAM,EAAEE,QAAQC,UAAS,IAAKH;AAC9B,UAAMI,WAAWD,UAAUhB,OAAO,QAAQgB,UAAUhB,IAAI,OAAO;AAC/D,UAAMK,SAASU,SACT,GAAGd,UAAAA,GAAaf,MAAMoB,IAAI,KAAKS,MAAAA,MAAYE,QAAAA,IAAY1B,aAAAA,KACvD,GAAGU,UAAAA,GAAaf,MAAMoB,IAAI,KAAKW,QAAAA,IAAY1B,aAAAA;AACjD,UAAMgB,QAAkB;MAACF;SAAWa,0BAA0BF,WAAWJ,QAAQzB,UAAAA;MAAa;;AAC9F,WAAOoB,MAAMR,KAAK,IAAA;EACtB;AAIA,QAAMoB,aAAa,GAAGlB,UAAAA,GAAaf,MAAMoB,IAAI,KAAKc,UAAUhC,IAAAA,CAAAA,GAAQG,aAAAA;AACpE,MAAIH,KAAKiC,SAAS,UAAU,YAAYjB,SAASe,WAAWf,SAASjB,YAAY;AAC7E,WAAO,GAAGc,UAAAA,GAAaf,MAAMoB,IAAI,KAAKgB,kBAAkBlC,KAAKmC,QAAQ,EAAA,CAAA,GAAMhC,aAAAA;EAC/E;AACA,SAAO4B;AACX;AAjCS7B;;;ACzBT,SAASkC,qBAAqB;AAI9B,IAAMC,KAAKC;AACX,IAAMC,KAAKD,OAAOE,OAAO,CAAA;AACzB,IAAMC,KAAKH,OAAOE,OAAO,CAAA;AACzB,IAAME,KAAKJ,OAAOE,OAAO,CAAA;AA2BlB,SAASG,YAAYC,KAAeC,QAAwBC,KAAwBC,YAAoBC,UAAU,IAAE;AACvH,SAAOF,IAAIG,QAAQJ,OAAOK,UAAUL,OAAOC,IAAIG,KAAK,EAAGE,YAAYJ,YAAY;AAC3E,eAAWK,KAAKP,OAAOC,IAAIG,KAAK,EAAGI,MAAOT,KAAIU,KAAKF,CAAAA;AACnDN,QAAIG;EACR;AACJ;AALgBN;AAST,SAASY,WAAWC,OAAoBX,QAAwBC,KAAwBW,gBAAsB;AACjH,QAAMJ,QAAkB,CAAA;AACxB,QAAMK,gBAAgBF,MAAMG,cAAc,MAAMH,MAAMG,WAAW,KAAK;AACtEN,QAAMC,KAAK,GAAGE,MAAMI,IAAI,MAAMF,aAAAA,EAAe;AAE7C,MAAIF,MAAMK,WAAWC,QAAW;AAC5BT,UAAMC,KAAI,GAAIS,iBAAiBP,MAAMK,QAAQG,IAAIR,MAAMS,UAAU,CAAA;EACrE;AAEA,MAAIT,MAAMU,aAAaJ,QAAW;AAC9BT,UAAMC,KAAI,GAAIa,cAAcX,MAAMU,UAAUF,IAAII,EAAAA,CAAAA;EACpD;AAEA,aAAWC,MAAMb,MAAMc,YAAY;AAE/B3B,gBAAYU,OAAOR,QAAQC,KAAKuB,GAAGE,IAAIC,MAAMR,EAAAA;AAC7CX,UAAMC,KAAI,GAAImB,eAAeJ,EAAAA,CAAAA;EACjC;AAGA1B,cAAYU,OAAOR,QAAQC,KAAKW,gBAAgBO,EAAAA;AAEhDX,QAAMC,KAAK,GAAA;AACX,SAAOD,MAAMqB,KAAK,IAAA;AACtB;AAxBgBnB;AA4BhB,SAASQ,iBAAiBY,QAAqBC,QAAgBC,MAAiB;AAC5E,QAAMC,SAASD,OAAO,QAAQA,IAAAA,OAAW;AACzC,MAAIF,OAAOI,SAAS,OAAO;AACvB,WAAO;MAAC,GAAGH,MAAAA,GAASE,MAAAA,WAAiBH,OAAOK,IAAI;;EACpD;AACA,MAAIL,OAAOI,SAAS,UAAU;AAC1B,UAAM1B,QAAkB;MAAC,GAAGuB,MAAAA,GAASE,MAAAA;;AACrC,UAAMG,QAAQL,SAASM;AACvB,eAAWC,KAAKR,OAAOS,OAAO;AAC1B,YAAMC,MAAMF,EAAEG,WAAW,MAAM;AAC/B,UAAIC,IAAIC,UAAUL,EAAEM,IAAI;AACxB,UAAIN,EAAEO,SAAUH,MAAK;AACrB,YAAMI,MAAMR,EAAES,YAAY9B,SAAY,MAAM+B,cAAcV,EAAES,OAAO,CAAA,KAAM;AACzE,YAAME,UAAUX,EAAExB,cAAc,MAAMwB,EAAExB,WAAW,KAAK;AACxDN,YAAMC,KAAK,GAAG2B,KAAAA,GAAQE,EAAEH,IAAI,GAAGK,GAAAA,KAAQE,CAAAA,GAAII,GAAAA,GAAMG,OAAAA,EAAS;IAC9D;AACAzC,UAAMC,KAAK,GAAGsB,MAAAA,GAAS;AACvB,WAAOvB;EACX;AAEA,SAAO;IAAC,GAAGuB,MAAAA,GAASE,MAAAA,WAAiBU,UAAUb,OAAOoB,IAAI,CAAA;;AAC9D;AArBShC;AAyBT,SAASU,eAAeJ,IAAmB;AACvC,QAAMhB,QAAkB,CAAA;AACxB,QAAMK,gBAAgBW,GAAGV,cAAc,MAAMU,GAAGV,WAAW,KAAK;AAChE,QAAMqC,UAAU3B,GAAG4B,WAAW/C,SAAS,IAAImB,GAAG4B,UAAU,CAAA,CAAE,MAAM;AAChE5C,QAAMC,KAAK,GAAGU,EAAAA,GAAKK,GAAG6B,MAAM,GAAGF,OAAAA,MAAatC,aAAAA,EAAe;AAE3D,MAAIW,GAAGW,KAAM3B,OAAMC,KAAK,GAAGc,EAAAA,SAAWC,GAAGW,IAAI,EAAE;AAC/C,MAAIX,GAAG8B,QAAS9C,OAAMC,KAAK,GAAGc,EAAAA,YAAcC,GAAG8B,OAAO,EAAE;AACxD,MAAI9B,GAAG+B,IAAK/C,OAAMC,KAAK,GAAGc,EAAAA,QAAUC,GAAG+B,GAAG,EAAE;AAC5C,MAAI/B,GAAGgC,WAAW;AACd,UAAMP,UAAUzB,GAAGiC,uBAAuB,MAAMjC,GAAGiC,oBAAoB,KAAK;AAC5EjD,UAAMC,KAAK,GAAGc,EAAAA,cAAgBmC,qBAAqBlC,GAAGgC,SAAS,CAAA,GAAIP,OAAAA,EAAS;EAChF;AACA,MAAIzB,GAAGH,aAAaJ,OAAWT,OAAMC,KAAI,GAAIa,cAAcE,GAAGH,QAAQ,CAAA;AACtE,MAAIG,GAAGmC,WAAWC,OAAOC,KAAKrC,GAAGmC,OAAO,EAAEtD,SAAS,GAAG;AAClDG,UAAMC,KAAK,GAAGc,EAAAA,YAAc;AAC5B,eAAW,CAACuC,KAAKC,GAAAA,KAAQH,OAAOI,QAAQxC,GAAGmC,OAAO,GAAG;AACjDnD,YAAMC,KAAK,GAAGwD,EAAAA,GAAKH,GAAAA,MAASC,IAAIG,QAAQ,OAAO,MAAA,EAAQA,QAAQ,MAAM,KAAA,CAAA,GAAS;IAClF;AACA1D,UAAMC,KAAK,GAAGc,EAAAA,GAAK;EACvB;AACA,MAAIC,GAAG2C,UAAUlD,OAAWT,OAAMC,KAAI,GAAI2D,oBAAoB,SAAS5C,GAAG2C,OAAO3C,GAAG6C,SAAS,CAAA;AAC7F,MAAI7C,GAAG8C,sBAAsB;AACzB9D,UAAMC,KAAK,GAAGc,EAAAA,eAAiB;EACnC,WAAWC,GAAG+C,YAAYtD,QAAW;AACjCT,UAAMC,KAAI,GAAI2D,oBAAoB,WAAW5C,GAAG+C,SAAS/C,GAAGgD,WAAW,CAAA;EAC3E;AACA,MAAIhD,GAAGiD,SAAS;AACZjE,UAAMC,KAAK,GAAGc,EAAAA,YAAc;AAC5B,eAAWmD,QAAQlD,GAAGiD,QAAQE,QAAQ;AAClCnE,YAAMC,KAAI,GAAImE,qBAAqBF,KAAKG,aAAaH,KAAKI,UAAUb,EAAAA,CAAAA;IACxE;AACAzD,UAAMC,KAAK,GAAGc,EAAAA,GAAK;EACvB;AACA,MAAIC,GAAGuD,UAAU1E,SAAS,GAAG;AACzBG,UAAMC,KAAI,GAAIuE,mBAAmBxD,GAAGuD,SAAS,CAAA;EACjD;AAEAvE,QAAMC,KAAK,GAAGU,EAAAA,GAAK;AACnB,SAAOX;AACX;AAxCSoB;AA6CT,SAAS8B,qBAAqBtD,OAAa;AACvC,SAAO,6BAA6B6E,KAAK7E,KAAAA,IAASA,QAAQ,IAAIA,KAAAA;AAClE;AAFSsD;AAMF,SAASpC,cAAcD,UAAwBU,SAASR,IAAI2D,cAAcjB,IAAE;AAC/E,MAAI5C,aAAa8D,cAAe,QAAO;IAAC,GAAGpD,MAAAA;;AAC3C,QAAMqD,SAAS/D;AACf,QAAMgE,WAAWD,OAAOE,SAASF,OAAOE,MAAMjF,SAAS;AACvD,MAAI,CAACgF,SAAU,QAAO,CAAA;AACtB,QAAM7E,QAAQ;IAAC,GAAGuB,MAAAA;;AAClB,QAAMkB,UAAUmC,OAAOG,mBAAmB,MAAMH,OAAOG,gBAAgB,KAAK;AAC5E/E,QAAMC,KAAK,GAAGyE,WAAAA,UAAqBE,OAAOE,MAAOzD,KAAK,GAAA,CAAA,GAAOoB,OAAAA,EAAS;AACtEzC,QAAMC,KAAK,GAAGsB,MAAAA,GAAS;AACvB,SAAOvB;AACX;AAVgBc;AAchB,SAAS8C,oBAAoBoB,SAA8B1D,QAAqBE,MAAiB;AAC7F,QAAMC,SAASD,OAAO,QAAQA,IAAAA,OAAW;AACzC,MAAIF,OAAOI,SAAS,OAAO;AACvB,WAAO;MAAC,GAAGX,EAAAA,GAAKU,MAAAA,GAASuD,OAAAA,KAAY1D,OAAOK,IAAI;;EACpD;AACA,MAAIL,OAAOI,SAAS,UAAU;AAC1B,QAAIJ,OAAOS,MAAMlC,WAAW,EAAG,QAAO,CAAA;AACtC,UAAMG,QAAkB;MAAC,GAAGe,EAAAA,GAAKU,MAAAA,GAASuD,OAAAA;;AAC1C,eAAWlD,KAAKR,OAAOS,OAAO;AAC1B,YAAMC,MAAMF,EAAEG,WAAW,MAAM;AAC/B,UAAIC,IAAIC,UAAUL,EAAEM,IAAI;AACxB,UAAIN,EAAEO,SAAUH,MAAK;AACrB,YAAMI,MAAMR,EAAES,YAAY9B,SAAY,MAAM+B,cAAcV,EAAES,OAAO,CAAA,KAAM;AACzE,YAAME,UAAUX,EAAExB,cAAc,MAAMwB,EAAExB,WAAW,KAAK;AACxDN,YAAMC,KAAK,GAAGwD,EAAAA,GAAK3B,EAAEH,IAAI,GAAGK,GAAAA,KAAQE,CAAAA,GAAII,GAAAA,GAAMG,OAAAA,EAAS;IAC3D;AACAzC,UAAMC,KAAK,GAAGc,EAAAA,GAAK;AACnB,WAAOf;EACX;AAEA,SAAO;IAAC,GAAGe,EAAAA,GAAKU,MAAAA,GAASuD,OAAAA,KAAY7C,UAAUb,OAAOoB,IAAI,CAAA;;AAC9D;AArBSkB;AA0BT,SAASQ,qBAAqBC,aAAqBC,UAA4BW,YAAkB;AAC7F,MAAIX,SAAS5C,SAAS,gBAAgB;AAClC,UAAMwD,cAAcD,aAAapD;AACjC,UAAM7B,QAAkB;MAAC,GAAGiF,UAAAA,GAAaZ,WAAAA;;AACzC,eAAWc,KAAKb,SAASM,QAAQ;AAC7B,YAAM5C,MAAMmD,EAAElD,WAAW,MAAM;AAC/B,UAAIC,IAAIC,UAAUgD,EAAE/C,IAAI;AACxB,UAAI+C,EAAE9C,SAAUH,MAAK;AACrB,YAAMI,MAAM6C,EAAE5C,YAAY9B,SAAY,MAAM+B,cAAc2C,EAAE5C,OAAO,CAAA,KAAM;AACzE,YAAME,UAAU0C,EAAE7E,cAAc,MAAM6E,EAAE7E,WAAW,KAAK;AACxDN,YAAMC,KAAK,GAAGiF,WAAAA,GAAcC,EAAExD,IAAI,GAAGK,GAAAA,KAAQE,CAAAA,GAAII,GAAAA,GAAMG,OAAAA,EAAS;IACpE;AACAzC,UAAMC,KAAK,GAAGgF,UAAAA,GAAa;AAC3B,WAAOjF;EACX;AACA,SAAO;IAAC,GAAGiF,UAAAA,GAAaZ,WAAAA,KAAgBlC,UAAUmC,QAAAA,CAAAA;;AACtD;AAhBSF;AAoBT,SAASI,mBAAmBD,WAA2B;AACnD,QAAMvE,QAAkB;IAAC,GAAGe,EAAAA;;AAE5B,aAAWqE,QAAQb,WAAW;AAC1B,UAAMc,UAAUD,KAAKf,eAAee,KAAKd;AACzC,UAAMgB,aAAaF,KAAKrB,WAAWqB,KAAKrB,QAAQlE,SAAS;AACzD,UAAM0F,SAASH,KAAKI;AACpB,QAAIH,WAAWC,cAAcC,QAAQ;AACjCvF,YAAMC,KAAK,GAAGwD,EAAAA,GAAK2B,KAAKK,UAAU,KAAK;AACvC,UAAIJ,SAAS;AACTrF,cAAMC,KAAI,GAAImE,qBAAqBgB,KAAKf,aAAce,KAAKd,UAAWoB,EAAAA,CAAAA;MAC1E;AACA,UAAIH,QAAQ;AACRvF,cAAMC,KAAK,GAAGyF,EAAAA,eAAiB;MACnC,WAAWJ,YAAY;AACnBtF,cAAMC,KAAK,GAAGyF,EAAAA,YAAc;AAC5B,mBAAWC,KAAKP,KAAKrB,SAAU;AAC3B,gBAAM/B,MAAM2D,EAAE1D,WAAW,MAAM;AAC/B,gBAAM2D,QAAQD,EAAErF,cAAc,MAAMqF,EAAErF,WAAW,KAAK;AACtDN,gBAAMC,KAAK,GAAGyF,EAAAA,GAAK7D,MAAAA,GAAS8D,EAAEhE,IAAI,GAAGK,GAAAA,KAAQG,UAAUwD,EAAEvD,IAAI,CAAA,GAAIwD,KAAAA,EAAO;QAC5E;AACA5F,cAAMC,KAAK,GAAGyF,EAAAA,GAAK;MACvB;AACA1F,YAAMC,KAAK,GAAGwD,EAAAA,GAAK;IACvB,OAAO;AACHzD,YAAMC,KAAK,GAAGwD,EAAAA,GAAK2B,KAAKK,UAAU,GAAG;IACzC;EACJ;AAEAzF,QAAMC,KAAK,GAAGc,EAAAA,GAAK;AACnB,SAAOf;AACX;AA/BSwE;;;ACnNF,IAAMqB,sBAAsB;AAYnC,SAASC,kBAAkBC,OAAa;AACpC,SAAO,gCAAgCC,KAAKD,KAAAA,IAASA,QAAQ,IAAIA,KAAAA;AACrE;AAFSD;AAIT,SAASG,kBAAkBC,KAAe;AACtC,QAAMC,UAAUC,OAAOC,KAAKH,IAAII,IAAI,EAAEC,SAAS;AAC/C,QAAMC,cAAcJ,OAAOC,KAAKH,IAAIO,QAAQ,EAAEF,SAAS;AACvD,QAAMG,cAAcR,IAAIS,aAAaC;AACrC,QAAMC,qBAAqBX,IAAIY,gBAAgBP,UAAU,KAAK;AAC9D,QAAMQ,sBAAsBb,IAAIc,iBAAiBT,UAAU,KAAK;AAEhE,MAAI,CAACJ,WAAW,CAACK,eAAe,CAACE,eAAe,CAACG,qBAAqB,CAACE,mBAAoB,QAAO;AAElG,QAAME,QAAkB;IAAC;;AAEzB,MAAId,SAAS;AACTc,UAAMC,KAAK,GAAGC,MAAAA,SAAe;AAC7B,eAAW,CAACC,KAAKrB,KAAAA,KAAUK,OAAOiB,QAAQnB,IAAII,IAAI,GAAG;AACjDW,YAAMC,KAAK,GAAGC,MAAAA,GAASA,MAAAA,GAASC,GAAAA,KAAQtB,kBAAkBC,KAAAA,CAAAA,EAAQ;IACtE;AACAkB,UAAMC,KAAK,GAAGC,MAAAA,GAAS;EAC3B;AAEA,MAAIX,aAAa;AACbS,UAAMC,KAAK,GAAGC,MAAAA,aAAmB;AACjC,eAAW,CAACC,KAAKrB,KAAAA,KAAUK,OAAOiB,QAAQnB,IAAIO,QAAQ,GAAG;AACrDQ,YAAMC,KAAK,GAAGC,MAAAA,GAASA,MAAAA,GAASC,GAAAA,KAAQtB,kBAAkBC,KAAAA,CAAAA,EAAQ;IACtE;AACAkB,UAAMC,KAAK,GAAGC,MAAAA,GAAS;EAC3B;AAEA,MAAIN,mBAAmB;AACnBI,UAAMC,KAAI,GAAII,wBAAwB,WAAWpB,IAAIY,cAAc,CAAA;EACvE;AAEA,MAAIC,oBAAoB;AACpBE,UAAMC,KAAI,GAAII,wBAAwB,YAAYpB,IAAIc,eAAe,CAAA;EACzE;AAEA,MAAIN,aAAa;AACbO,UAAMC,KAAI,GAAIK,cAAcrB,IAAIS,UAAWQ,QAAQA,SAASA,MAAAA,CAAAA;EAChE;AAEAF,QAAMC,KAAK,GAAA;AACX,SAAOD,MAAMO,KAAK,IAAA;AACtB;AAzCSvB;AA2CT,SAASqB,wBAAwBG,SAAiCC,SAA+B;AAC7F,QAAMC,MAAKR,SAASA;AACpB,QAAMS,MAAKT,SAASA,SAASA;AAC7B,QAAMF,QAAQ;IAAC,GAAGE,MAAAA,GAASM,OAAAA;IAAc,GAAGE,GAAAA;;AAC5C,aAAWE,KAAKH,SAAS;AACrB,UAAMI,MAAMD,EAAEE,WAAW,MAAM;AAC/B,UAAMC,QAAQH,EAAEI,cAAc,MAAMJ,EAAEI,WAAW,KAAK;AACtDhB,UAAMC,KAAK,GAAGU,GAAAA,GAAKC,EAAEK,IAAI,GAAGJ,GAAAA,KAAQK,UAAUN,EAAEO,IAAI,CAAA,GAAIJ,KAAAA,EAAO;EACnE;AACAf,QAAMC,KAAK,GAAGS,GAAAA,GAAK;AACnBV,QAAMC,KAAK,GAAGC,MAAAA,GAAS;AACvB,SAAOF;AACX;AAZSK;AAwBF,SAASe,QAAQnC,KAAiBoC,aAAqBzC,qBAAmB;AAC7E,QAAM0C,QAAkB,CAAA;AAGxB,QAAMC,UAAUvC,kBAAkBC,GAAAA;AAClC,MAAIsC,QAASD,OAAMrB,KAAKsB,OAAAA;AAGxB,aAAWC,SAASvC,IAAIwC,QAAQ;AAC5B,QAAIH,MAAMhC,SAAS,EAAGgC,OAAMrB,KAAK,EAAA;AACjCqB,UAAMrB,KAAK,YAAYyB,eAAeF,OAAOH,UAAAA,CAAAA,EAAa;EAC9D;AAGA,QAAMM,cAA8B,CAAA;AACpC,QAAMC,WAAW;IAAE9C,OAAO;EAAE;AAC5B,aAAW+C,SAAS5C,IAAI6C,QAAQ;AAC5B,QAAIR,MAAMhC,SAAS,EAAGgC,OAAMrB,KAAK,EAAA;AACjC,UAAM8B,UAAUF,MAAMG,WAAW1C,SAAS,IAAIuC,MAAMG,UAAU,CAAA,CAAE,MAAM;AACtEV,UAAMrB,KAAK,YAAY8B,OAAAA,IAAWE,WAAWJ,OAAOF,aAAaC,UAAUM,QAAAA,CAAAA,EAAW;EAC1F;AAEA,SAAOZ,MAAMf,KAAK,IAAA,IAAQ;AAC9B;AAvBgBa;;;ALnFhB,IAAM,EAAEe,UAAUC,KAAI,IAAKC;AAE3B,SAASC,MAAMC,MAAY;AACvB,QAAMC,QAAQD,KAAKE,QAAO,EAAGC,MAAM,IAAA;AACnC,SAAON,KAAKD,UAAUK,KAAAA;AAC1B;AAHSF;AAKT,IAAMK,SAA6B;EAC/BC,WAAW;IACP;MACIC,MAAM;MACNC,SAAS;QAAC;;MACVC,YAAY;QAAC;;MACbC,mBAAmB;QAAC;;IACxB;;EAGJF,SAAS;IACL,eAAe;MACXG,MAAMV,MAAMW,UAAQ;AAChB,cAAMC,OAAO,IAAIC,oBAAAA;AACjB,eAAOC,QAAQd,MAAM,WAAWY,IAAAA;MACpC;MACAG,WAAW;MACXC,UAAU,6BAAM,GAAN;MACVC,QAAQC,wBAAAA,UAAS,GAATA;IACZ;EACJ;EAEAC,UAAU;IACN,eAAe;MACXC,MAAMC,MAAMC,SAAO;AACf,cAAMC,OAAOF,KAAKE;AAClB,eAAOxB,MAAMyB,QAAQD,MAAMD,QAAQG,UAAU,CAAA;MACjD;IACJ;EACJ;AACJ;AAEA,IAAA,gBAAerB;","names":["builders","parseCk","DiagnosticCollector","INDENT","printType","type","kind","constraints","format","undefined","fmt","push","test","min","max","len","regex","length","name","join","args","item","items","map","key","value","values","formatEnumValue","members","discriminator","printInlineObjectCompact","inner","obj","prefix","mode","fields","parts","f","opt","optional","t","nullable","printEnumExpanded","indent","innerIndent","INDENT","v","printField","field","printWidth","ovr","override","dep","deprecated","vis","visibility","mods","def","default","formatDefault","comment","description","trailing","extractTrailingInlineObject","inlineObj","modePart","header","printInlineObjectExpanded","typeStr","fullLine","enumStr","val","String","last","prefixStr","slice","printModelDecl","model","printWidth","type","undefined","printTypeAlias","commentSuffix","description","modifiers","deprecated","inputCase","outputCase","filter","Boolean","join","mode","modePrefix","baseChain","bases","length","header","name","lines","field","fields","push","printField","INDENT","trailing","extractTrailingInlineObject","prefix","inlineObj","modePart","printInlineObjectExpanded","singleLine","printType","kind","printEnumExpanded","values","SECURITY_NONE","I1","INDENT","I2","repeat","I3","I4","flushBlocks","out","blocks","idx","beforeLine","_indent","value","length","startLine","l","lines","push","printRoute","route","nextRouteStart","commentSuffix","description","path","params","undefined","printParamsBlock","I1","paramsMode","security","printSecurity","I2","op","operations","loc","line","printOperation","join","source","indent","mode","prefix","kind","name","inner","INDENT","p","nodes","opt","optional","t","printType","type","nullable","def","default","formatDefault","comment","node","modPart","modifiers","method","service","sdk","signature","signatureDescription","formatSignatureValue","plugins","Object","keys","key","val","entries","I3","replace","query","printQueryOrHeaders","queryMode","requestHeadersOptOut","headers","headersMode","request","body","bodies","printContentTypeLine","contentType","bodyType","responses","printResponseBlock","test","innerIndent","SECURITY_NONE","fields","hasRoles","roles","rolesDescription","keyword","lineIndent","fieldIndent","f","resp","hasBody","hasHeaders","optOut","headersOptOut","statusCode","I4","h","trail","DEFAULT_PRINT_WIDTH","quoteOptionsValue","value","test","printOptionsBlock","ast","hasMeta","Object","keys","meta","length","hasServices","services","hasSecurity","security","undefined","hasRequestHeaders","requestHeaders","hasResponseHeaders","responseHeaders","lines","push","INDENT","key","entries","printOptionsHeaderScope","printSecurity","join","keyword","headers","I2","I3","h","opt","optional","trail","description","name","printType","type","printCk","printWidth","parts","options","model","models","printModelDecl","emptyBlocks","emptyIdx","route","routes","modPart","modifiers","printRoute","Infinity","hardline","join","builders","toDoc","text","lines","trimEnd","split","plugin","languages","name","parsers","extensions","vscodeLanguageIds","parse","_options","diag","DiagnosticCollector","parseCk","astFormat","locStart","locEnd","_node","printers","print","path","options","node","printCk","printWidth"]}
{"version":3,"sources":["../src/index.ts","../src/indent.ts","../src/print-type.ts","../src/print-contract.ts","../src/print-operation.ts","../src/print-ck.ts"],"sourcesContent":["import type { Plugin } from 'prettier';\nimport { builders } from 'prettier/doc';\nimport { parseCk, DiagnosticCollector } from '@contractkit/core';\nimport type { CkRootNode } from '@contractkit/core';\nimport { printCk } from './print-ck.js';\n\nconst { hardline, join } = builders;\n\nfunction toDoc(text: string) {\n const lines = text.trimEnd().split('\\n');\n return join(hardline, lines);\n}\n\nconst plugin: Plugin<CkRootNode> = {\n languages: [\n {\n name: 'ContractDSL',\n parsers: ['contract-ck'],\n extensions: ['.ck'],\n vscodeLanguageIds: ['contract-ck'],\n },\n ],\n\n parsers: {\n 'contract-ck': {\n parse(text, _options) {\n const diag = new DiagnosticCollector();\n return parseCk(text, '<stdin>', diag);\n },\n astFormat: 'contract-ck',\n locStart: () => 0,\n locEnd: _node => 0,\n },\n },\n\n printers: {\n 'contract-ck': {\n print(path, options) {\n const node = path.node as CkRootNode;\n return toDoc(printCk(node, options.printWidth));\n },\n },\n },\n};\n\nexport default plugin;\n","export const INDENT = ' ';\n","import type { ContractTypeNode, FieldNode, InlineObjectTypeNode } from '@contractkit/core';\nimport { INDENT } from './indent.js';\n\n// ─── Type expression printer ────────────────────────────────────────────────\n\n/** Render a `ContractTypeNode` back to its `.ck` source string. */\nexport function printType(type: ContractTypeNode): string {\n switch (type.kind) {\n case 'scalar': {\n const constraints: string[] = [];\n if (type.format !== undefined) {\n // Print unquoted when format contains only safe chars; quote otherwise\n const fmt = type.format;\n constraints.push(/^[a-zA-Z0-9\\-.:/]+$/.test(fmt) ? fmt : `\"${fmt}\"`);\n }\n if (type.min !== undefined) constraints.push(`min=${type.min}`);\n if (type.max !== undefined) constraints.push(`max=${type.max}`);\n if (type.len !== undefined) constraints.push(`len=${type.len}`);\n if (type.regex !== undefined) constraints.push(`regex=/${type.regex}/`);\n return constraints.length > 0 ? `${type.name}(${constraints.join(', ')})` : type.name;\n }\n case 'array': {\n const args: string[] = [printType(type.item)];\n if (type.min !== undefined) args.push(`min=${type.min}`);\n if (type.max !== undefined) args.push(`max=${type.max}`);\n return `array(${args.join(', ')})`;\n }\n case 'tuple':\n return `tuple(${type.items.map(printType).join(', ')})`;\n case 'record':\n return `record(${printType(type.key)}, ${printType(type.value)})`;\n case 'enum':\n return `enum(${type.values.map(formatEnumValue).join(', ')})`;\n case 'literal':\n return typeof type.value === 'string' ? `literal(\"${type.value}\")` : `literal(${type.value})`;\n case 'union':\n return type.members.map(printType).join(' | ');\n case 'discriminatedUnion':\n return `discriminated(by=${type.discriminator}, ${type.members.map(printType).join(' | ')})`;\n case 'intersection':\n return type.members.map(printType).join(' & ');\n case 'ref':\n return type.name;\n case 'inlineObject':\n return printInlineObjectCompact(type);\n case 'lazy':\n return `lazy(${printType(type.inner)})`;\n }\n}\n\n/** Compact single-line form — used when inline object appears nested inside another type. */\nfunction printInlineObjectCompact(obj: InlineObjectTypeNode): string {\n const prefix = obj.mode ? `mode(${obj.mode}) ` : '';\n if (obj.fields.length === 0) return `${prefix}{}`;\n const parts = obj.fields.map(f => {\n const opt = f.optional ? '?' : '';\n let t = printType(f.type);\n if (f.nullable) t += ' | null';\n return `${f.name}${opt}: ${t}`;\n });\n return `${prefix}{ ${parts.join(', ')} }`;\n}\n\n/** Multi-line enum form — one value per line, used when single-line would exceed print width. */\nexport function printEnumExpanded(values: string[], indent: string): string {\n const innerIndent = indent + INDENT;\n return `enum(\\n${values.map(v => `${innerIndent}${formatEnumValue(v)}`).join(',\\n')}\\n${indent})`;\n}\n\n// ─── Field printer ──────────────────────────────────────────────────────────\n\n/** Print a full field declaration, including visibility, default, and inline comment.\n * Modifier order is canonical: override → deprecated → readonly|writeonly → type. */\nexport function printField(field: FieldNode, indent: string, printWidth: number = 80): string {\n const opt = field.optional ? '?' : '';\n const ovr = field.override ? 'override ' : '';\n const dep = field.deprecated ? 'deprecated ' : '';\n const vis = field.visibility !== 'normal' ? `${field.visibility} ` : '';\n const mods = `${ovr}${dep}${vis}`;\n const def = field.default !== undefined ? ` = ${formatDefault(field.default)}` : '';\n const comment = field.description ? ` # ${field.description}` : '';\n const innerIndent = indent + INDENT;\n\n // Expand inline object types to multi-line — same rule as type aliases.\n // Only when there's no default and no nullable union (those can't split cleanly).\n if (!field.nullable && field.default === undefined) {\n const trailing = extractTrailingInlineObject(field.type);\n if (trailing) {\n const { prefix, inlineObj } = trailing;\n const modePart = inlineObj.mode ? `mode(${inlineObj.mode}) ` : '';\n const header = prefix\n ? `${indent}${field.name}${opt}: ${mods}${prefix} & ${modePart}{${comment}`\n : `${indent}${field.name}${opt}: ${mods}${modePart}{${comment}`;\n return [header, ...printInlineObjectExpanded(inlineObj, innerIndent, printWidth), `${indent}}`].join('\\n');\n }\n }\n\n let typeStr = printType(field.type);\n if (field.nullable) typeStr += ' | null';\n const fullLine = `${indent}${field.name}${opt}: ${mods}${typeStr}${def}${comment}`;\n if (field.type.kind === 'enum' && !field.nullable && field.default === undefined && fullLine.length > printWidth) {\n const enumStr = printEnumExpanded(field.type.values, indent);\n return `${indent}${field.name}${opt}: ${mods}${enumStr}${comment}`;\n }\n return fullLine;\n}\n\n/** Print inline-object fields expanded (used when an inline brace object trails a type alias). */\nexport function printInlineObjectExpanded(obj: InlineObjectTypeNode, indent: string, printWidth: number = 80): string[] {\n return obj.fields.map(f => printField(f, indent, printWidth));\n}\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\n/** Format a single enum value: bare identifier stays bare; anything else gets double-quoted. */\nexport function formatEnumValue(v: string): string {\n if (/^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(v)) return v;\n return `\"${v}\"`;\n}\n\n/** Format a default value: quote strings that aren't valid bare identifiers. */\nexport function formatDefault(val: string | number | boolean): string {\n if (typeof val === 'number' || typeof val === 'boolean') return String(val);\n // If it looks like a bare identifier (enum value, unquoted token), keep it bare.\n if (/^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(val)) return val;\n return `\"${val}\"`;\n}\n\n/**\n * Detect whether the last member of a type is an inline brace object, and if so\n * return the prefix type string and the inline object for expanded printing.\n * Returns null if the type doesn't end with an inline object.\n */\nexport function extractTrailingInlineObject(type: ContractTypeNode): {\n prefix: string | null;\n inlineObj: InlineObjectTypeNode;\n} | null {\n if (type.kind === 'inlineObject') {\n return { prefix: null, inlineObj: type };\n }\n if (type.kind === 'intersection') {\n const last = type.members[type.members.length - 1];\n if (last?.kind === 'inlineObject') {\n const prefixStr = type.members.slice(0, -1).map(printType).join(' & ');\n return { prefix: prefixStr, inlineObj: last };\n }\n }\n return null;\n}\n","import type { ModelNode } from '@contractkit/core';\nimport { printField, printInlineObjectExpanded, extractTrailingInlineObject, printType, printEnumExpanded } from './print-type.js';\nimport { INDENT } from './indent.js';\n\n// ─── Model declaration ───────────────────────────────────────────────────────\n\nexport function printModelDecl(model: ModelNode, printWidth: number = 80): string {\n // Type alias form: Name : typeExpression\n if (model.type !== undefined) {\n return printTypeAlias(model, printWidth);\n }\n\n // Regular model with fields (possibly inherited)\n const commentSuffix = model.description ? ` # ${model.description}` : '';\n const modifiers = [\n model.deprecated ? 'deprecated' : '',\n model.inputCase || model.outputCase\n ? `format(${[model.inputCase ? `input=${model.inputCase}` : '', model.outputCase ? `output=${model.outputCase}` : ''].filter(Boolean).join(', ')})`\n : '',\n model.mode ? `mode(${model.mode})` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const modePrefix = modifiers ? `${modifiers} ` : '';\n const baseChain = model.bases && model.bases.length > 0 ? `${model.bases.join(' & ')} & ` : '';\n const header = `${modePrefix}${model.name}: ${baseChain}{${commentSuffix}`;\n\n const lines: string[] = [header];\n for (const field of model.fields) {\n lines.push(printField(field, INDENT, printWidth));\n }\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction printTypeAlias(model: ModelNode, printWidth: number): string {\n const type = model.type!;\n const commentSuffix = model.description ? ` # ${model.description}` : '';\n const modifiers = [\n model.deprecated ? 'deprecated' : '',\n model.inputCase || model.outputCase\n ? `format(${[model.inputCase ? `input=${model.inputCase}` : '', model.outputCase ? `output=${model.outputCase}` : ''].filter(Boolean).join(', ')})`\n : '',\n model.mode ? `mode(${model.mode})` : '',\n ]\n .filter(Boolean)\n .join(' ');\n const modePrefix = modifiers ? `${modifiers} ` : '';\n\n // If the type ends with an inline brace object, expand it as a pseudo-model block.\n const trailing = extractTrailingInlineObject(type);\n if (trailing) {\n const { prefix, inlineObj } = trailing;\n const modePart = inlineObj.mode ? `mode(${inlineObj.mode}) ` : '';\n const header = prefix\n ? `${modePrefix}${model.name}: ${prefix} & ${modePart}{${commentSuffix}`\n : `${modePrefix}${model.name}: ${modePart}{${commentSuffix}`;\n const lines: string[] = [header, ...printInlineObjectExpanded(inlineObj, INDENT, printWidth), '}'];\n return lines.join('\\n');\n }\n\n // Simple type alias — single line, unless it's a long enum.\n // Note: the contract prefix \"contract \" (9 chars) is prepended by the caller.\n const singleLine = `${modePrefix}${model.name}: ${printType(type)}${commentSuffix}`;\n if (type.kind === 'enum' && 'contract '.length + singleLine.length > printWidth) {\n return `${modePrefix}${model.name}: ${printEnumExpanded(type.values, '')}${commentSuffix}`;\n }\n return singleLine;\n}\n","import type {\n OpRouteNode,\n OpOperationNode,\n OpResponseNode,\n ParamSource,\n SecurityNode,\n SecurityFields,\n ContractTypeNode,\n ObjectMode,\n PluginValue,\n} from '@contractkit/core';\nimport { SECURITY_NONE } from '@contractkit/core';\nimport { printType, formatDefault } from './print-type.js';\nimport { INDENT } from './indent.js';\n\nconst I1 = INDENT;\nconst I2 = INDENT.repeat(2);\nconst I3 = INDENT.repeat(3);\nconst I4 = INDENT.repeat(4);\n\n// ─── Orphan comment helpers ──────────────────────────────────────────────────\n\ntype CommentEntry = { line: number; text: string };\nexport type CommentBlock = { startLine: number; lines: string[] };\n\n/** Group sorted orphan comment entries into consecutive-line blocks. */\nexport function groupComments(entries: CommentEntry[]): CommentBlock[] {\n const blocks: CommentBlock[] = [];\n let current: CommentBlock | null = null;\n for (const { line, text } of entries) {\n if (current && line === current.startLine + current.lines.length) {\n current.lines.push(text);\n } else {\n if (current) blocks.push(current);\n current = { startLine: line, lines: [text] };\n }\n }\n if (current) blocks.push(current);\n return blocks;\n}\n\n/**\n * Emit any comment blocks whose startLine is < beforeLine.\n * Lines are emitted verbatim — they already carry their original indentation.\n */\nexport function flushBlocks(out: string[], blocks: CommentBlock[], idx: { value: number }, beforeLine: number, _indent = '') {\n while (idx.value < blocks.length && blocks[idx.value]!.startLine < beforeLine) {\n for (const l of blocks[idx.value]!.lines) out.push(l);\n idx.value++;\n }\n}\n\n// ─── Route ───────────────────────────────────────────────────────────────────\n\nexport function printRoute(route: OpRouteNode, blocks: CommentBlock[], idx: { value: number }, nextRouteStart: number): string {\n const lines: string[] = [];\n const commentSuffix = route.description ? ` # ${route.description}` : '';\n lines.push(`${route.path}: {${commentSuffix}`);\n\n if (route.params !== undefined) {\n lines.push(...printParamsBlock(route.params, I1, route.paramsMode));\n }\n\n if (route.security !== undefined) {\n lines.push(...printSecurity(route.security, I1, I2));\n }\n\n for (const op of route.operations) {\n // Flush comment blocks that appear before this operation (inside the route)\n flushBlocks(lines, blocks, idx, op.loc.line, I1);\n lines.push(...printOperation(op));\n }\n\n // Flush comment blocks between last operation and the next route\n flushBlocks(lines, blocks, idx, nextRouteStart, I1);\n\n lines.push('}');\n return lines.join('\\n');\n}\n\n// ─── Params block ────────────────────────────────────────────────────────────\n\nfunction printParamsBlock(source: ParamSource, indent: string, mode?: ObjectMode): string[] {\n const prefix = mode ? `mode(${mode}) ` : '';\n if (source.kind === 'ref') {\n return [`${indent}${prefix}params: ${source.name}`];\n }\n if (source.kind === 'params') {\n const lines: string[] = [`${indent}${prefix}params: {`];\n const inner = indent + INDENT;\n for (const p of source.nodes) {\n const opt = p.optional ? '?' : '';\n let t = printType(p.type);\n if (p.nullable) t += ' | null';\n const def = p.default !== undefined ? ` = ${formatDefault(p.default)}` : '';\n const comment = p.description ? ` # ${p.description}` : '';\n lines.push(`${inner}${p.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${indent}}`);\n return lines;\n }\n // ContractTypeNode\n return [`${indent}${prefix}params: ${printType(source.node)}`];\n}\n\n// ─── HTTP operation ──────────────────────────────────────────────────────────\n\nfunction printOperation(op: OpOperationNode): string[] {\n const lines: string[] = [];\n const commentSuffix = op.description ? ` # ${op.description}` : '';\n const modPart = op.modifiers?.length ? `(${op.modifiers[0]})` : '';\n lines.push(`${I1}${op.method}${modPart}: {${commentSuffix}`);\n\n if (op.name) lines.push(`${I2}name: ${op.name}`);\n if (op.service) lines.push(`${I2}service: ${op.service}`);\n if (op.sdk) lines.push(`${I2}sdk: ${op.sdk}`);\n if (op.signature) {\n const comment = op.signatureDescription ? ` # ${op.signatureDescription}` : '';\n lines.push(`${I2}signature: ${formatSignatureValue(op.signature)}${comment}`);\n }\n if (op.security !== undefined) lines.push(...printSecurity(op.security));\n if (op.plugins && Object.keys(op.plugins).length > 0) {\n lines.push(`${I2}plugins: {`);\n for (const [key, val] of Object.entries(op.plugins)) {\n lines.push(...printPluginEntry(key, val, I3));\n }\n lines.push(`${I2}}`);\n }\n if (op.query !== undefined) lines.push(...printQueryOrHeaders('query', op.query, op.queryMode));\n if (op.requestHeadersOptOut) {\n lines.push(`${I2}headers: none`);\n } else if (op.headers !== undefined) {\n lines.push(...printQueryOrHeaders('headers', op.headers, op.headersMode));\n }\n if (op.request) {\n lines.push(`${I2}request: {`);\n for (const body of op.request.bodies) {\n lines.push(...printContentTypeLine(body.contentType, body.bodyType, I3));\n }\n lines.push(`${I2}}`);\n }\n if (op.responses.length > 0) {\n lines.push(...printResponseBlock(op.responses));\n }\n\n lines.push(`${I1}}`);\n return lines;\n}\n\n// ─── Plugins block ───────────────────────────────────────────────────────────\n\nconst IDENT_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;\n\nfunction escapeString(s: string): string {\n return s.replace(/\\\\/g, '\\\\\\\\').replace(/\"/g, '\\\\\"');\n}\n\nfunction printPluginEntry(key: string, value: PluginValue, indent: string): string[] {\n const lines: string[] = [];\n const inline = printPluginInline(value);\n if (inline !== null) {\n lines.push(`${indent}${key}: ${inline}`);\n } else {\n const head = `${indent}${key}: `;\n const block = printPluginBlock(value, indent);\n lines.push(`${head}${block[0]!.trimStart()}`);\n for (let i = 1; i < block.length; i++) lines.push(block[i]!);\n }\n return lines;\n}\n\nfunction printPluginInline(value: PluginValue): string | null {\n if (typeof value === 'string') return `\"${escapeString(value)}\"`;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n if (value === null) return 'null';\n if (Array.isArray(value) && value.length === 0) return '[]';\n if (!Array.isArray(value) && typeof value === 'object' && Object.keys(value).length === 0) return '{}';\n return null;\n}\n\nfunction printPluginBlock(value: PluginValue, indent: string): string[] {\n const inner = indent + INDENT;\n const lines: string[] = [];\n if (Array.isArray(value)) {\n lines.push(`${indent}[`);\n for (const item of value) {\n const inline = printPluginInline(item);\n if (inline !== null) {\n lines.push(`${inner}${inline}`);\n } else {\n const block = printPluginBlock(item, inner);\n for (const l of block) lines.push(l);\n }\n }\n lines.push(`${indent}]`);\n return lines;\n }\n if (typeof value === 'object' && value !== null) {\n lines.push(`${indent}{`);\n for (const [k, v] of Object.entries(value)) {\n const fieldKey = IDENT_RE.test(k) ? k : `\"${escapeString(k)}\"`;\n const inline = printPluginInline(v);\n if (inline !== null) {\n lines.push(`${inner}${fieldKey}: ${inline}`);\n } else {\n const block = printPluginBlock(v, inner);\n lines.push(`${inner}${fieldKey}: ${block[0]!.trimStart()}`);\n for (let i = 1; i < block.length; i++) lines.push(block[i]!);\n }\n }\n lines.push(`${indent}}`);\n return lines;\n }\n // Scalars are always inline; printPluginInline already handles them.\n return [`${indent}${printPluginInline(value)}`];\n}\n\n// ─── Security ────────────────────────────────────────────────────────────────\n\n/** Print a signature key: unquoted when it's a plain identifier, quoted otherwise. */\nfunction formatSignatureValue(value: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$]*$/.test(value) ? value : `\"${value}\"`;\n}\n\n// indent: indentation for the `security` keyword line\n// innerIndent: indentation for field lines inside the block\nexport function printSecurity(security: SecurityNode, indent = I2, innerIndent = I3): string[] {\n if (security === SECURITY_NONE) return [`${indent}security: none`];\n const fields = security as SecurityFields;\n const hasRoles = fields.roles && fields.roles.length > 0;\n if (!hasRoles) return [];\n const lines = [`${indent}security: {`];\n const comment = fields.rolesDescription ? ` # ${fields.rolesDescription}` : '';\n lines.push(`${innerIndent}roles: ${fields.roles!.join(' ')}${comment}`);\n lines.push(`${indent}}`);\n return lines;\n}\n\n// ─── Query / headers ─────────────────────────────────────────────────────────\n\nfunction printQueryOrHeaders(keyword: 'query' | 'headers', source: ParamSource, mode?: ObjectMode): string[] {\n const prefix = mode ? `mode(${mode}) ` : '';\n if (source.kind === 'ref') {\n return [`${I2}${prefix}${keyword}: ${source.name}`];\n }\n if (source.kind === 'params') {\n if (source.nodes.length === 0) return [];\n const lines: string[] = [`${I2}${prefix}${keyword}: {`];\n for (const p of source.nodes) {\n const opt = p.optional ? '?' : '';\n let t = printType(p.type);\n if (p.nullable) t += ' | null';\n const def = p.default !== undefined ? ` = ${formatDefault(p.default)}` : '';\n const comment = p.description ? ` # ${p.description}` : '';\n lines.push(`${I3}${p.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${I2}}`);\n return lines;\n }\n // ContractTypeNode (e.g. intersection)\n return [`${I2}${prefix}${keyword}: ${printType(source.node)}`];\n}\n\n// ─── Content-type line ───────────────────────────────────────────────────────\n\n/** Print a `contentType: bodyType` line, expanding inline brace objects onto separate lines. */\nfunction printContentTypeLine(contentType: string, bodyType: ContractTypeNode, lineIndent: string): string[] {\n if (bodyType.kind === 'inlineObject') {\n const fieldIndent = lineIndent + INDENT;\n const lines: string[] = [`${lineIndent}${contentType}: {`];\n for (const f of bodyType.fields) {\n const opt = f.optional ? '?' : '';\n let t = printType(f.type);\n if (f.nullable) t += ' | null';\n const def = f.default !== undefined ? ` = ${formatDefault(f.default)}` : '';\n const comment = f.description ? ` # ${f.description}` : '';\n lines.push(`${fieldIndent}${f.name}${opt}: ${t}${def}${comment}`);\n }\n lines.push(`${lineIndent}}`);\n return lines;\n }\n return [`${lineIndent}${contentType}: ${printType(bodyType)}`];\n}\n\n// ─── Response block ──────────────────────────────────────────────────────────\n\nfunction printResponseBlock(responses: OpResponseNode[]): string[] {\n const lines: string[] = [`${I2}response: {`];\n\n for (const resp of responses) {\n const hasBody = resp.contentType && resp.bodyType;\n const hasHeaders = resp.headers && resp.headers.length > 0;\n const optOut = resp.headersOptOut;\n if (hasBody || hasHeaders || optOut) {\n lines.push(`${I3}${resp.statusCode}: {`);\n if (hasBody) {\n lines.push(...printContentTypeLine(resp.contentType!, resp.bodyType!, I4));\n }\n if (optOut) {\n lines.push(`${I4}headers: none`);\n } else if (hasHeaders) {\n lines.push(`${I4}headers: {`);\n for (const h of resp.headers!) {\n const opt = h.optional ? '?' : '';\n const trail = h.description ? ` # ${h.description}` : '';\n lines.push(`${I4}${INDENT}${h.name}${opt}: ${printType(h.type)}${trail}`);\n }\n lines.push(`${I4}}`);\n }\n lines.push(`${I3}}`);\n } else {\n lines.push(`${I3}${resp.statusCode}:`);\n }\n }\n\n lines.push(`${I2}}`);\n return lines;\n}\n","import type { CkRootNode, OpResponseHeaderNode } from '@contractkit/core';\nimport { printModelDecl } from './print-contract.js';\nimport { printRoute, printSecurity, type CommentBlock } from './print-operation.js';\nimport { printType } from './print-type.js';\nimport { INDENT } from './indent.js';\n\nexport const DEFAULT_PRINT_WIDTH = 80;\n\n// ─── Options block ──────────────────────────────────────────────────────────\n\n/**\n * Quote an options-block value if it isn't a plain identifier.\n *\n * Plain identifiers (starts with letter/underscore/dollar, rest are\n * alphanumeric/underscore/dollar/hyphen/dot) are left bare. Everything\n * else — paths with slashes, values starting with `#`, values with spaces,\n * etc. — is double-quoted so the round-trip parse is unambiguous.\n */\nfunction quoteOptionsValue(value: string): string {\n return /^[a-zA-Z_$][a-zA-Z0-9_$\\-.]*$/.test(value) ? value : `\"${value}\"`;\n}\n\nfunction printOptionsBlock(ast: CkRootNode): string | null {\n const hasMeta = Object.keys(ast.meta).length > 0;\n const hasServices = Object.keys(ast.services).length > 0;\n const hasSecurity = ast.security !== undefined;\n const hasRequestHeaders = (ast.requestHeaders?.length ?? 0) > 0;\n const hasResponseHeaders = (ast.responseHeaders?.length ?? 0) > 0;\n\n if (!hasMeta && !hasServices && !hasSecurity && !hasRequestHeaders && !hasResponseHeaders) return null;\n\n const lines: string[] = ['options {'];\n\n if (hasMeta) {\n lines.push(`${INDENT}keys: {`);\n for (const [key, value] of Object.entries(ast.meta)) {\n lines.push(`${INDENT}${INDENT}${key}: ${quoteOptionsValue(value)}`);\n }\n lines.push(`${INDENT}}`);\n }\n\n if (hasServices) {\n lines.push(`${INDENT}services: {`);\n for (const [key, value] of Object.entries(ast.services)) {\n lines.push(`${INDENT}${INDENT}${key}: ${quoteOptionsValue(value)}`);\n }\n lines.push(`${INDENT}}`);\n }\n\n if (hasRequestHeaders) {\n lines.push(...printOptionsHeaderScope('request', ast.requestHeaders!));\n }\n\n if (hasResponseHeaders) {\n lines.push(...printOptionsHeaderScope('response', ast.responseHeaders!));\n }\n\n if (hasSecurity) {\n lines.push(...printSecurity(ast.security!, INDENT, INDENT + INDENT));\n }\n\n lines.push('}');\n return lines.join('\\n');\n}\n\nfunction printOptionsHeaderScope(keyword: 'request' | 'response', headers: OpResponseHeaderNode[]): string[] {\n const I2 = INDENT + INDENT;\n const I3 = INDENT + INDENT + INDENT;\n const lines = [`${INDENT}${keyword}: {`, `${I2}headers: {`];\n for (const h of headers) {\n const opt = h.optional ? '?' : '';\n const trail = h.description ? ` # ${h.description}` : '';\n lines.push(`${I3}${h.name}${opt}: ${printType(h.type)}${trail}`);\n }\n lines.push(`${I2}}`);\n lines.push(`${INDENT}}`);\n return lines;\n}\n\n// ─── CK file printer ───────────────────────────────────────────────────────\n\n/**\n * Render a parsed `.ck` AST back to source. Output is byte-identical on\n * round-trip when the input is already canonically formatted: options block\n * first, then contracts, then operations, separated by blank lines.\n *\n * `printWidth` is forwarded to per-model printing for line wrapping inside\n * inline-object types.\n */\nexport function printCk(ast: CkRootNode, printWidth: number = DEFAULT_PRINT_WIDTH): string {\n const parts: string[] = [];\n\n // Options block\n const options = printOptionsBlock(ast);\n if (options) parts.push(options);\n\n // Contracts (models)\n for (const model of ast.models) {\n if (parts.length > 0) parts.push('');\n parts.push(`contract ${printModelDecl(model, printWidth)}`);\n }\n\n // Operations (routes)\n const emptyBlocks: CommentBlock[] = [];\n const emptyIdx = { value: 0 };\n for (const route of ast.routes) {\n if (parts.length > 0) parts.push('');\n const modPart = route.modifiers?.length ? `(${route.modifiers[0]})` : '';\n parts.push(`operation${modPart} ${printRoute(route, emptyBlocks, emptyIdx, Infinity)}`);\n }\n\n return parts.join('\\n') + '\\n';\n}\n"],"mappings":"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","names":["builders","parseCk","DiagnosticCollector","INDENT","printType","type","kind","constraints","format","undefined","fmt","push","test","min","max","len","regex","length","name","join","args","item","items","map","key","value","values","formatEnumValue","members","discriminator","printInlineObjectCompact","inner","obj","prefix","mode","fields","parts","f","opt","optional","t","nullable","printEnumExpanded","indent","innerIndent","INDENT","v","printField","field","printWidth","ovr","override","dep","deprecated","vis","visibility","mods","def","default","formatDefault","comment","description","trailing","extractTrailingInlineObject","inlineObj","modePart","header","printInlineObjectExpanded","typeStr","fullLine","enumStr","val","String","last","prefixStr","slice","printModelDecl","model","printWidth","type","undefined","printTypeAlias","commentSuffix","description","modifiers","deprecated","inputCase","outputCase","filter","Boolean","join","mode","modePrefix","baseChain","bases","length","header","name","lines","field","fields","push","printField","INDENT","trailing","extractTrailingInlineObject","prefix","inlineObj","modePart","printInlineObjectExpanded","singleLine","printType","kind","printEnumExpanded","values","SECURITY_NONE","I1","INDENT","I2","repeat","I3","I4","flushBlocks","out","blocks","idx","beforeLine","_indent","value","length","startLine","l","lines","push","printRoute","route","nextRouteStart","commentSuffix","description","path","params","undefined","printParamsBlock","I1","paramsMode","security","printSecurity","I2","op","operations","loc","line","printOperation","join","source","indent","mode","prefix","kind","name","inner","INDENT","p","nodes","opt","optional","t","printType","type","nullable","def","default","formatDefault","comment","node","modPart","modifiers","method","service","sdk","signature","signatureDescription","formatSignatureValue","plugins","Object","keys","key","val","entries","printPluginEntry","I3","query","printQueryOrHeaders","queryMode","requestHeadersOptOut","headers","headersMode","request","body","bodies","printContentTypeLine","contentType","bodyType","responses","printResponseBlock","IDENT_RE","escapeString","s","replace","inline","printPluginInline","head","block","printPluginBlock","trimStart","i","String","Array","isArray","item","k","v","fieldKey","test","innerIndent","SECURITY_NONE","fields","hasRoles","roles","rolesDescription","keyword","lineIndent","fieldIndent","f","resp","hasBody","hasHeaders","optOut","headersOptOut","statusCode","I4","h","trail","DEFAULT_PRINT_WIDTH","quoteOptionsValue","value","test","printOptionsBlock","ast","hasMeta","Object","keys","meta","length","hasServices","services","hasSecurity","security","undefined","hasRequestHeaders","requestHeaders","hasResponseHeaders","responseHeaders","lines","push","INDENT","key","entries","printOptionsHeaderScope","printSecurity","join","keyword","headers","I2","I3","h","opt","optional","trail","description","name","printType","type","printCk","printWidth","parts","options","model","models","printModelDecl","emptyBlocks","emptyIdx","route","routes","modPart","modifiers","printRoute","Infinity","hardline","join","builders","toDoc","text","lines","trimEnd","split","plugin","languages","name","parsers","extensions","vscodeLanguageIds","parse","_options","diag","DiagnosticCollector","parseCk","astFormat","locStart","locEnd","_node","printers","print","path","options","node","printCk","printWidth"]}

@@ -1,1 +0,1 @@

{"version":3,"file":"print-operation.d.ts","sourceRoot":"","sources":["../src/print-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EAIX,YAAY,EAIf,MAAM,mBAAmB,CAAC;AAY3B,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAElE,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAarE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,SAAK,QAK1H;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAwB7H;AAgFD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAK,EAAE,WAAW,SAAK,GAAG,MAAM,EAAE,CAU7F"}
{"version":3,"file":"print-operation.d.ts","sourceRoot":"","sources":["../src/print-operation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,WAAW,EAIX,YAAY,EAKf,MAAM,mBAAmB,CAAC;AAY3B,KAAK,YAAY,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AACnD,MAAM,MAAM,YAAY,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC;AAElE,wEAAwE;AACxE,wBAAgB,aAAa,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,YAAY,EAAE,CAarE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,SAAK,QAK1H;AAID,wBAAgB,UAAU,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,cAAc,EAAE,MAAM,GAAG,MAAM,CAwB7H;AAoJD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,SAAK,EAAE,WAAW,SAAK,GAAG,MAAM,EAAE,CAU7F"}
{
"name": "@contractkit/prettier-plugin",
"version": "0.9.2",
"version": "0.9.3",
"description": "Prettier plugin for ContractKit DSL",

@@ -32,8 +32,8 @@ "author": {

"dependencies": {
"@contractkit/core": "0.13.0"
"@contractkit/core": "0.14.0"
},
"devDependencies": {
"prettier": "^3.8.3",
"@repo/config-eslint": "0.3.1",
"@repo/config-typescript": "0.1.0"
"@repo/config-typescript": "0.1.0",
"@repo/config-eslint": "0.3.1"
},

@@ -40,0 +40,0 @@ "scripts": {

@@ -10,2 +10,3 @@ import type {

ObjectMode,
PluginValue,
} from '@contractkit/core';

@@ -125,3 +126,3 @@ import { SECURITY_NONE } from '@contractkit/core';

for (const [key, val] of Object.entries(op.plugins)) {
lines.push(`${I3}${key}: "${val.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`);
lines.push(...printPluginEntry(key, val, I3));
}

@@ -151,2 +152,70 @@ lines.push(`${I2}}`);

// ─── Plugins block ───────────────────────────────────────────────────────────
const IDENT_RE = /^[a-zA-Z_$][a-zA-Z0-9_$]*$/;
function escapeString(s: string): string {
return s.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
}
function printPluginEntry(key: string, value: PluginValue, indent: string): string[] {
const lines: string[] = [];
const inline = printPluginInline(value);
if (inline !== null) {
lines.push(`${indent}${key}: ${inline}`);
} else {
const head = `${indent}${key}: `;
const block = printPluginBlock(value, indent);
lines.push(`${head}${block[0]!.trimStart()}`);
for (let i = 1; i < block.length; i++) lines.push(block[i]!);
}
return lines;
}
function printPluginInline(value: PluginValue): string | null {
if (typeof value === 'string') return `"${escapeString(value)}"`;
if (typeof value === 'number' || typeof value === 'boolean') return String(value);
if (value === null) return 'null';
if (Array.isArray(value) && value.length === 0) return '[]';
if (!Array.isArray(value) && typeof value === 'object' && Object.keys(value).length === 0) return '{}';
return null;
}
function printPluginBlock(value: PluginValue, indent: string): string[] {
const inner = indent + INDENT;
const lines: string[] = [];
if (Array.isArray(value)) {
lines.push(`${indent}[`);
for (const item of value) {
const inline = printPluginInline(item);
if (inline !== null) {
lines.push(`${inner}${inline}`);
} else {
const block = printPluginBlock(item, inner);
for (const l of block) lines.push(l);
}
}
lines.push(`${indent}]`);
return lines;
}
if (typeof value === 'object' && value !== null) {
lines.push(`${indent}{`);
for (const [k, v] of Object.entries(value)) {
const fieldKey = IDENT_RE.test(k) ? k : `"${escapeString(k)}"`;
const inline = printPluginInline(v);
if (inline !== null) {
lines.push(`${inner}${fieldKey}: ${inline}`);
} else {
const block = printPluginBlock(v, inner);
lines.push(`${inner}${fieldKey}: ${block[0]!.trimStart()}`);
for (let i = 1; i < block.length; i++) lines.push(block[i]!);
}
}
lines.push(`${indent}}`);
return lines;
}
// Scalars are always inline; printPluginInline already handles them.
return [`${indent}${printPluginInline(value)}`];
}
// ─── Security ────────────────────────────────────────────────────────────────

@@ -153,0 +222,0 @@

@@ -227,2 +227,52 @@ import { describe, it, expect } from 'vitest';

});
it('prints object plugin value with file:// URL', () => {
const ast = makeRoot([
makeRoute('/auth/token', [
makeOp('post', { plugins: { bruno: { template: 'file://request-token.yml' } } }),
]),
]);
const out = printCk(ast);
expect(out).toContain(' bruno: {');
expect(out).toContain(' template: "file://request-token.yml"');
});
it('round-trips object plugin value through parse', () => {
const src = `operation /auth/token: {
post: {
plugins: {
bruno: {
template: "file://request-token.yml"
}
}
}
}
`;
const diag = new DiagnosticCollector();
const ast = parseCk(src, 'test.ck', diag);
expect(diag.hasErrors()).toBe(false);
const out = printCk(ast);
expect(out).toContain(' bruno: {');
expect(out).toContain(' template: "file://request-token.yml"');
});
it('prints scalar, array, and nested-object plugin values', () => {
const ast = makeRoot([
makeRoute('/x', [
makeOp('get', {
plugins: {
flag: true,
count: 3,
tags: ['a', 'b'],
meta: { nested: { x: 1 } },
},
}),
]),
]);
const out = printCk(ast);
expect(out).toContain('flag: true');
expect(out).toContain('count: 3');
expect(out).toContain('tags: [');
expect(out).toContain('meta: {');
});
});

@@ -229,0 +279,0 @@

Sorry, the diff of this file is too big to display