@contractkit/plugin-bruno 1.4.1 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">80.42% </span>
26
+ <span class="strong">79.78% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>378/470</span>
28
+ <span class='fraction'>379/475</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">81.72% </span>
40
+ <span class="strong">80.85% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>76/93</span>
42
+ <span class='fraction'>76/94</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">81.26% </span>
47
+ <span class="strong">80.52% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>334/411</span>
49
+ <span class='fraction'>335/416</span>
50
50
  </div>
51
51
 
52
52
 
@@ -61,7 +61,7 @@
61
61
  </div>
62
62
  </template>
63
63
  </div>
64
- <div class='status-line high'></div>
64
+ <div class='status-line medium'></div>
65
65
  <div class="pad1">
66
66
  <table class="coverage-summary">
67
67
  <thead>
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file high" data-value="src"><a href="src/index.html">src</a></td>
83
- <td data-value="80.98" class="pic high">
83
+ <td data-value="80.27" class="pic high">
84
84
  <div class="chart"><div class="cover-fill" style="width: 80%"></div><div class="cover-empty" style="width: 20%"></div></div>
85
85
  </td>
86
- <td data-value="80.98" class="pct high">80.98%</td>
87
- <td data-value="426" class="abs high">345/426</td>
86
+ <td data-value="80.27" class="pct high">80.27%</td>
87
+ <td data-value="431" class="abs high">346/431</td>
88
88
  <td data-value="74.19" class="pct medium">74.19%</td>
89
89
  <td data-value="341" class="abs medium">253/341</td>
90
- <td data-value="83.82" class="pct high">83.82%</td>
91
- <td data-value="68" class="abs high">57/68</td>
92
- <td data-value="81.5" class="pct high">81.5%</td>
93
- <td data-value="373" class="abs high">304/373</td>
90
+ <td data-value="82.6" class="pct high">82.6%</td>
91
+ <td data-value="69" class="abs high">57/69</td>
92
+ <td data-value="80.68" class="pct high">80.68%</td>
93
+ <td data-value="378" class="abs high">305/378</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-05-07T11:16:42.311Z
119
+ at 2026-05-07T11:38:24.021Z
120
120
  </div>
121
121
  <script src="prettify.js"></script>
122
122
  <script>
@@ -958,7 +958,13 @@
958
958
  <a name='L893'></a><a href='#L893'>893</a>
959
959
  <a name='L894'></a><a href='#L894'>894</a>
960
960
  <a name='L895'></a><a href='#L895'>895</a>
961
- <a name='L896'></a><a href='#L896'>896</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
961
+ <a name='L896'></a><a href='#L896'>896</a>
962
+ <a name='L897'></a><a href='#L897'>897</a>
963
+ <a name='L898'></a><a href='#L898'>898</a>
964
+ <a name='L899'></a><a href='#L899'>899</a>
965
+ <a name='L900'></a><a href='#L900'>900</a>
966
+ <a name='L901'></a><a href='#L901'>901</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
967
+ <span class="cline-any cline-neutral">&nbsp;</span>
962
968
  <span class="cline-any cline-neutral">&nbsp;</span>
963
969
  <span class="cline-any cline-neutral">&nbsp;</span>
964
970
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1083,6 +1089,11 @@
1083
1089
  <span class="cline-any cline-neutral">&nbsp;</span>
1084
1090
  <span class="cline-any cline-neutral">&nbsp;</span>
1085
1091
  <span class="cline-any cline-neutral">&nbsp;</span>
1092
+ <span class="cline-any cline-neutral">&nbsp;</span>
1093
+ <span class="cline-any cline-neutral">&nbsp;</span>
1094
+ <span class="cline-any cline-neutral">&nbsp;</span>
1095
+ <span class="cline-any cline-neutral">&nbsp;</span>
1096
+ <span class="cline-any cline-neutral">&nbsp;</span>
1086
1097
  <span class="cline-any cline-yes">94x</span>
1087
1098
  <span class="cline-any cline-yes">94x</span>
1088
1099
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1159,7 +1170,6 @@
1159
1170
  <span class="cline-any cline-neutral">&nbsp;</span>
1160
1171
  <span class="cline-any cline-neutral">&nbsp;</span>
1161
1172
  <span class="cline-any cline-neutral">&nbsp;</span>
1162
- <span class="cline-any cline-neutral">&nbsp;</span>
1163
1173
  <span class="cline-any cline-yes">108x</span>
1164
1174
  <span class="cline-any cline-neutral">&nbsp;</span>
1165
1175
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -1875,6 +1885,7 @@ import {
1875
1885
  runIncrementalCodegen,
1876
1886
  parseIncrementalManifest,
1877
1887
  emptyIncrementalManifest,
1888
+ serializeIncrementalManifest,
1878
1889
  hashFingerprint,
1879
1890
  INCREMENTAL_MANIFEST_VERSION,
1880
1891
  } from '@contractkit/core';
@@ -1972,14 +1983,19 @@ export interface IncrementalResult extends Omit&lt;IncrementalResultBase, 'skipp
1972
1983
  /**
1973
1984
  * Generates an OpenCollection (https://spec.opencollection.com/) API collection
1974
1985
  * from a set of operation roots. Produces opencollection.yml, an environment
1975
- * file, and one .yml request file per operation.
1986
+ * file, one .yml request file per operation, and the tracking manifest.
1976
1987
  *
1977
1988
  * This is the full-regeneration entry point — every file is rebuilt from scratch.
1978
1989
  * For cache-aware incremental builds, use {@link generateOpenCollectionIncremental}.
1990
+ *
1991
+ * The manifest appears in the returned list (under {@link MANIFEST_FILENAME}) for
1992
+ * convenience — single-shot callers can write the entire array as-is. The plugin's
1993
+ * incremental path persists the manifest separately (under the CLI cache dir), so
1994
+ * its `filesToWrite` does not include the manifest.
1979
1995
  */
1980
1996
  export function generateOpenCollection(roots: OpRootNode[], options: OpenCollectionOptions): OpenCollectionFile[] {
1981
1997
  const result = generateOpenCollectionIncremental(roots, options, emptyManifest());
1982
- return result.filesToWrite;
1998
+ return [...result.filesToWrite, { relativePath: MANIFEST_FILENAME, content: serializeIncrementalManifest(result.manifest) }];
1983
1999
  }
1984
2000
  &nbsp;
1985
2001
  /**
@@ -2048,7 +2064,6 @@ export function generateOpenCollectionIncremental(
2048
2064
  &nbsp;
2049
2065
  const result = runIncrementalCodegen({
2050
2066
  codegenVersion: BRUNO_CODEGEN_VERSION,
2051
- manifestFilename: MANIFEST_FILENAME,
2052
2067
  prevManifest,
2053
2068
  globalFiles,
2054
2069
  units,
@@ -2755,7 +2770,7 @@ function yamlString(value: string): string {
2755
2770
  <div class='footer quiet pad2 space-top1 center small'>
2756
2771
  Code coverage generated by
2757
2772
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
2758
- at 2026-05-07T11:16:42.311Z
2773
+ at 2026-05-07T11:38:24.021Z
2759
2774
  </div>
2760
2775
  <script src="../prettify.js"></script>
2761
2776
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">80.98% </span>
26
+ <span class="strong">80.27% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>345/426</span>
28
+ <span class='fraction'>346/431</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">83.82% </span>
40
+ <span class="strong">82.6% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>57/68</span>
42
+ <span class='fraction'>57/69</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">81.5% </span>
47
+ <span class="strong">80.68% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>304/373</span>
49
+ <span class='fraction'>305/378</span>
50
50
  </div>
51
51
 
52
52
 
@@ -95,17 +95,17 @@
95
95
 
96
96
  <tr>
97
97
  <td class="file low" data-value="index.ts"><a href="index.ts.html">index.ts</a></td>
98
- <td data-value="27.45" class="pic low">
99
- <div class="chart"><div class="cover-fill" style="width: 27%"></div><div class="cover-empty" style="width: 73%"></div></div>
98
+ <td data-value="26.78" class="pic low">
99
+ <div class="chart"><div class="cover-fill" style="width: 26%"></div><div class="cover-empty" style="width: 74%"></div></div>
100
100
  </td>
101
- <td data-value="27.45" class="pct low">27.45%</td>
102
- <td data-value="51" class="abs low">14/51</td>
101
+ <td data-value="26.78" class="pct low">26.78%</td>
102
+ <td data-value="56" class="abs low">15/56</td>
103
103
  <td data-value="40" class="pct low">40%</td>
104
104
  <td data-value="35" class="abs low">14/35</td>
105
- <td data-value="22.22" class="pct low">22.22%</td>
106
- <td data-value="9" class="abs low">2/9</td>
107
- <td data-value="26.08" class="pct low">26.08%</td>
108
- <td data-value="46" class="abs low">12/46</td>
105
+ <td data-value="20" class="pct low">20%</td>
106
+ <td data-value="10" class="abs low">2/10</td>
107
+ <td data-value="25.49" class="pct low">25.49%</td>
108
+ <td data-value="51" class="abs low">13/51</td>
109
109
  </tr>
110
110
 
111
111
  </tbody>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2026-05-07T11:16:42.311Z
119
+ at 2026-05-07T11:38:24.021Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">27.45% </span>
26
+ <span class="strong">26.78% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>14/51</span>
28
+ <span class='fraction'>15/56</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">22.22% </span>
40
+ <span class="strong">20% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>2/9</span>
42
+ <span class='fraction'>2/10</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">26.08% </span>
47
+ <span class="strong">25.49% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>12/46</span>
49
+ <span class='fraction'>13/51</span>
50
50
  </div>
51
51
 
52
52
 
@@ -254,7 +254,24 @@
254
254
  <a name='L189'></a><a href='#L189'>189</a>
255
255
  <a name='L190'></a><a href='#L190'>190</a>
256
256
  <a name='L191'></a><a href='#L191'>191</a>
257
- <a name='L192'></a><a href='#L192'>192</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
257
+ <a name='L192'></a><a href='#L192'>192</a>
258
+ <a name='L193'></a><a href='#L193'>193</a>
259
+ <a name='L194'></a><a href='#L194'>194</a>
260
+ <a name='L195'></a><a href='#L195'>195</a>
261
+ <a name='L196'></a><a href='#L196'>196</a>
262
+ <a name='L197'></a><a href='#L197'>197</a>
263
+ <a name='L198'></a><a href='#L198'>198</a>
264
+ <a name='L199'></a><a href='#L199'>199</a>
265
+ <a name='L200'></a><a href='#L200'>200</a>
266
+ <a name='L201'></a><a href='#L201'>201</a>
267
+ <a name='L202'></a><a href='#L202'>202</a>
268
+ <a name='L203'></a><a href='#L203'>203</a>
269
+ <a name='L204'></a><a href='#L204'>204</a>
270
+ <a name='L205'></a><a href='#L205'>205</a>
271
+ <a name='L206'></a><a href='#L206'>206</a>
272
+ <a name='L207'></a><a href='#L207'>207</a>
273
+ <a name='L208'></a><a href='#L208'>208</a>
274
+ <a name='L209'></a><a href='#L209'>209</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral">&nbsp;</span>
258
275
  <span class="cline-any cline-neutral">&nbsp;</span>
259
276
  <span class="cline-any cline-neutral">&nbsp;</span>
260
277
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -262,6 +279,10 @@
262
279
  <span class="cline-any cline-neutral">&nbsp;</span>
263
280
  <span class="cline-any cline-neutral">&nbsp;</span>
264
281
  <span class="cline-any cline-neutral">&nbsp;</span>
282
+ <span class="cline-any cline-yes">1x</span>
283
+ <span class="cline-any cline-neutral">&nbsp;</span>
284
+ <span class="cline-any cline-neutral">&nbsp;</span>
285
+ <span class="cline-any cline-neutral">&nbsp;</span>
265
286
  <span class="cline-any cline-neutral">&nbsp;</span>
266
287
  <span class="cline-any cline-neutral">&nbsp;</span>
267
288
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -378,6 +399,7 @@
378
399
  <span class="cline-any cline-no">&nbsp;</span>
379
400
  <span class="cline-any cline-no">&nbsp;</span>
380
401
  <span class="cline-any cline-no">&nbsp;</span>
402
+ <span class="cline-any cline-no">&nbsp;</span>
381
403
  <span class="cline-any cline-neutral">&nbsp;</span>
382
404
  <span class="cline-any cline-no">&nbsp;</span>
383
405
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -402,13 +424,23 @@
402
424
  <span class="cline-any cline-neutral">&nbsp;</span>
403
425
  <span class="cline-any cline-neutral">&nbsp;</span>
404
426
  <span class="cline-any cline-neutral">&nbsp;</span>
427
+ <span class="cline-any cline-no">&nbsp;</span>
428
+ <span class="cline-any cline-neutral">&nbsp;</span>
429
+ <span class="cline-any cline-neutral">&nbsp;</span>
405
430
  <span class="cline-any cline-neutral">&nbsp;</span>
406
431
  <span class="cline-any cline-neutral">&nbsp;</span>
407
432
  <span class="cline-any cline-no">&nbsp;</span>
408
433
  <span class="cline-any cline-no">&nbsp;</span>
409
434
  <span class="cline-any cline-no">&nbsp;</span>
435
+ <span class="cline-any cline-neutral">&nbsp;</span>
410
436
  <span class="cline-any cline-no">&nbsp;</span>
411
437
  <span class="cline-any cline-neutral">&nbsp;</span>
438
+ <span class="cline-any cline-neutral">&nbsp;</span>
439
+ <span class="cline-any cline-neutral">&nbsp;</span>
440
+ <span class="cline-any cline-neutral">&nbsp;</span>
441
+ <span class="cline-any cline-neutral">&nbsp;</span>
442
+ <span class="cline-any cline-no">&nbsp;</span>
443
+ <span class="cline-any cline-no">&nbsp;</span>
412
444
  <span class="cline-any cline-no">&nbsp;</span>
413
445
  <span class="cline-any cline-neutral">&nbsp;</span>
414
446
  <span class="cline-any cline-neutral">&nbsp;</span>
@@ -419,6 +451,8 @@
419
451
  <span class="cline-any cline-neutral">&nbsp;</span>
420
452
  <span class="cline-any cline-neutral">&nbsp;</span>
421
453
  <span class="cline-any cline-neutral">&nbsp;</span>
454
+ <span class="cline-any cline-neutral">&nbsp;</span>
455
+ <span class="cline-any cline-neutral">&nbsp;</span>
422
456
  <span class="cline-any cline-no">&nbsp;</span>
423
457
  <span class="cline-any cline-no">&nbsp;</span>
424
458
  <span class="cline-any cline-no">&nbsp;</span>
@@ -446,11 +480,15 @@
446
480
  <span class="cline-any cline-neutral">&nbsp;</span>
447
481
  <span class="cline-any cline-neutral">&nbsp;</span>
448
482
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { resolve, basename, dirname } from 'node:path';
449
- import { existsSync, readFileSync, rmSync, readdirSync, rmdirSync } from 'node:fs';
450
- import { generateOpenCollectionIncremental, MANIFEST_FILENAME, parseManifest, emptyManifest } from './codegen-bruno.js';
483
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, rmdirSync } from 'node:fs';
484
+ import { generateOpenCollectionIncremental, parseManifest, emptyManifest } from './codegen-bruno.js';
451
485
  import type { BrunoSecurityScheme } from './codegen-bruno.js';
486
+ import { serializeIncrementalManifest } from '@contractkit/core';
452
487
  import type { ContractKitPlugin, PluginContext, PluginValue, OpRootNode, ContractRootNode, IncrementalManifest } from '@contractkit/core';
453
488
  &nbsp;
489
+ /** Filename for the persisted Bruno manifest under the CLI cache directory. */
490
+ const CACHE_MANIFEST_FILENAME = 'bruno-manifest.json';
491
+ &nbsp;
454
492
  /** Configuration accepted by the Bruno plugin, both via `contractkit.config.json` and `createBrunoPlugin`. */
455
493
  export interface BrunoPluginConfig {
456
494
  baseDir?: string;
@@ -569,8 +607,9 @@ async function <span class="fstat-no" title="function not covered" >runBrunoCode
569
607
  const base = <span class="cstat-no" title="statement not covered" >config.baseDir ? resolve(ctx.rootDir, config.baseDir) : ctx.rootDir;</span>
570
608
  const <span class="cstat-no" title="statement not covered" >outDir = resolve(base, config.output ?? 'bruno-collection');</span>
571
609
  const collectionName = <span class="cstat-no" title="statement not covered" >config.collectionName ?? basename(ctx.rootDir);</span>
610
+ const <span class="cstat-no" title="statement not covered" >manifestPath = resolve(ctx.cacheDir, CACHE_MANIFEST_FILENAME);</span>
572
611
  &nbsp;
573
- const prevManifest: IncrementalManifest = <span class="cstat-no" title="statement not covered" >ctx.cacheEnabled ? readManifest(outDir) : emptyManifest();</span>
612
+ const prevManifest: IncrementalManifest = <span class="cstat-no" title="statement not covered" >ctx.cacheEnabled ? readManifest(manifestPath) : emptyManifest();</span>
574
613
  &nbsp;
575
614
  const <span class="cstat-no" title="statement not covered" >result = generateOpenCollectionIncremental(</span>
576
615
  opRoots,
@@ -591,11 +630,13 @@ async function <span class="fstat-no" title="function not covered" >runBrunoCode
591
630
  <span class="cstat-no" title="statement not covered" > for (const { relativePath, content } of result.filesToWrite) {</span>
592
631
  <span class="cstat-no" title="statement not covered" > ctx.emitFile(resolve(outDir, relativePath), content);</span>
593
632
  }
633
+ &nbsp;
634
+ // Persist the manifest under the CLI cache dir, separate from the bruno output.
635
+ <span class="cstat-no" title="statement not covered" > writeManifest(manifestPath, result.manifest);</span>
594
636
  }
595
637
  &nbsp;
596
- /** Read the previous run's manifest. Returns an empty manifest when the file is missing or unreadable so the next run safely starts from scratch. */
597
- function <span class="fstat-no" title="function not covered" >readManifest(o</span>utDir: string): IncrementalManifest {
598
- const <span class="cstat-no" title="statement not covered" >manifestPath = resolve(outDir, MANIFEST_FILENAME);</span>
638
+ /** Read the previous run's manifest from `manifestPath`. Returns an empty manifest when missing or unreadable. */
639
+ function <span class="fstat-no" title="function not covered" >readManifest(m</span>anifestPath: string): IncrementalManifest {
599
640
  <span class="cstat-no" title="statement not covered" > if (!existsSync(manifestPath)) <span class="cstat-no" title="statement not covered" >return emptyManifest();</span></span>
600
641
  <span class="cstat-no" title="statement not covered" > try {</span>
601
642
  <span class="cstat-no" title="statement not covered" > return parseManifest(readFileSync(manifestPath, 'utf-8'));</span>
@@ -604,6 +645,16 @@ function <span class="fstat-no" title="function not covered" >readManifest(o</sp
604
645
  }
605
646
  }
606
647
  &nbsp;
648
+ /** Write the manifest to `manifestPath`. Creates parent dirs as needed. Errors are swallowed so a broken cache never blocks the build. */
649
+ function <span class="fstat-no" title="function not covered" >writeManifest(m</span>anifestPath: string, manifest: IncrementalManifest): void {
650
+ <span class="cstat-no" title="statement not covered" > try {</span>
651
+ <span class="cstat-no" title="statement not covered" > mkdirSync(dirname(manifestPath), { recursive: true });</span>
652
+ <span class="cstat-no" title="statement not covered" > writeFileSync(manifestPath, serializeIncrementalManifest(manifest), 'utf-8');</span>
653
+ } catch {
654
+ // best-effort
655
+ }
656
+ }
657
+ &nbsp;
607
658
  /**
608
659
  * Delete files that the previous run tracked but the current run doesn't produce, then
609
660
  * walk back up each affected directory and remove it if it's now empty (stopping at outDir).
@@ -643,7 +694,7 @@ function <span class="fstat-no" title="function not covered" >deleteStalePaths(o
643
694
  <div class='footer quiet pad2 space-top1 center small'>
644
695
  Code coverage generated by
645
696
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
646
- at 2026-05-07T11:16:42.311Z
697
+ at 2026-05-07T11:38:24.021Z
647
698
  </div>
648
699
  <script src="../prettify.js"></script>
649
700
  <script>
@@ -589,7 +589,7 @@ export function opRoot(routes: OpRouteNode[], file = 'users.op', meta: Record&lt
589
589
  <div class='footer quiet pad2 space-top1 center small'>
590
590
  Code coverage generated by
591
591
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
592
- at 2026-05-07T11:16:42.311Z
592
+ at 2026-05-07T11:38:24.021Z
593
593
  </div>
594
594
  <script src="../prettify.js"></script>
595
595
  <script>
@@ -101,7 +101,7 @@
101
101
  <div class='footer quiet pad2 space-top1 center small'>
102
102
  Code coverage generated by
103
103
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
104
- at 2026-05-07T11:16:42.311Z
104
+ at 2026-05-07T11:38:24.021Z
105
105
  </div>
106
106
  <script src="../prettify.js"></script>
107
107
  <script>
@@ -67,10 +67,15 @@ export interface IncrementalResult extends Omit<IncrementalResultBase, 'skippedU
67
67
  /**
68
68
  * Generates an OpenCollection (https://spec.opencollection.com/) API collection
69
69
  * from a set of operation roots. Produces opencollection.yml, an environment
70
- * file, and one .yml request file per operation.
70
+ * file, one .yml request file per operation, and the tracking manifest.
71
71
  *
72
72
  * This is the full-regeneration entry point — every file is rebuilt from scratch.
73
73
  * For cache-aware incremental builds, use {@link generateOpenCollectionIncremental}.
74
+ *
75
+ * The manifest appears in the returned list (under {@link MANIFEST_FILENAME}) for
76
+ * convenience — single-shot callers can write the entire array as-is. The plugin's
77
+ * incremental path persists the manifest separately (under the CLI cache dir), so
78
+ * its `filesToWrite` does not include the manifest.
74
79
  */
75
80
  export declare function generateOpenCollection(roots: OpRootNode[], options: OpenCollectionOptions): OpenCollectionFile[];
76
81
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"codegen-bruno.d.ts","sourceRoot":"","sources":["../src/codegen-bruno.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EAMV,gBAAgB,EAGhB,mBAAmB,EAEnB,iBAAiB,IAAI,qBAAqB,EAC7C,MAAM,mBAAmB,CAAC;AAe3B,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,8JAA8J;AAC9J,eAAO,MAAM,iBAAiB,qCAAqC,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kHAAkH;AAClH,MAAM,WAAW,gBAAgB;IAC7B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACjD;AAED,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAiBD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD,uKAAuK;AACvK,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;IACtF,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,kBAAkB,EAAE,CAGhH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC7C,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,qBAAqB,EAC9B,YAAY,EAAE,mBAAmB,EACjC,UAAU,GAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAoB,GAC3D,iBAAiB,CAiEnB;AAkHD,uGAAuG;AACvG,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAmBlE;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOxF;AA2cD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD"}
1
+ {"version":3,"file":"codegen-bruno.d.ts","sourceRoot":"","sources":["../src/codegen-bruno.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,UAAU,EAMV,gBAAgB,EAGhB,mBAAmB,EAEnB,iBAAiB,IAAI,qBAAqB,EAC7C,MAAM,mBAAmB,CAAC;AAgB3B,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,8JAA8J;AAC9J,eAAO,MAAM,iBAAiB,qCAAqC,CAAC;AAEpE;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;CACf;AAED,kHAAkH;AAClH,MAAM,WAAW,gBAAgB;IAC7B,gEAAgE;IAChE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,uDAAuD;IACvD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;CACjD;AAED,qEAAqE;AACrE,MAAM,WAAW,qBAAqB;IAClC,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACnC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAiBD;;GAEG;AACH,MAAM,MAAM,aAAa,GAAG,mBAAmB,CAAC;AAEhD,uKAAuK;AACvK,MAAM,WAAW,iBAAkB,SAAQ,IAAI,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;IACtF,iFAAiF;IACjF,cAAc,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,OAAO,EAAE,qBAAqB,GAAG,kBAAkB,EAAE,CAGhH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iCAAiC,CAC7C,KAAK,EAAE,UAAU,EAAE,EACnB,OAAO,EAAE,qBAAqB,EAC9B,YAAY,EAAE,mBAAmB,EACjC,UAAU,GAAE,CAAC,YAAY,EAAE,MAAM,KAAK,OAAoB,GAC3D,iBAAiB,CAgEnB;AAkHD,uGAAuG;AACvG,wBAAgB,aAAa,IAAI,mBAAmB,CAEnD;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAmBlE;AAsBD;;;;;;;;;;GAUG;AACH,wBAAgB,eAAe,CAAC,aAAa,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,MAAM,CAOxF;AA2cD,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAMhD;AAED,uEAAuE;AACvE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CASjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,iBAAiB,EAAiB,WAAW,EAAqD,MAAM,mBAAmB,CAAC;AAE1I,8GAA8G;AAC9G,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAED,mHAAmH;AACnH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IACzD,IAAI,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;KAAE,CAAC;CACnF;AAID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAavF;AAQD,QAAA,MAAM,MAAM,EAAE,iBAOb,CAAC;AAEF,eAAe,MAAM,CAAC;AAItB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;CAAE,GAChF,iBAAiB,CAUnB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,OAAO,KAAK,EAAE,iBAAiB,EAAiB,WAAW,EAAqD,MAAM,mBAAmB,CAAC;AAK1I,8GAA8G;AAC9G,MAAM,WAAW,iBAAiB;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;;OAIG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAC1D;AAED,mHAAmH;AACnH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IACzD,IAAI,CAAC,EAAE;QAAE,aAAa,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;KAAE,CAAC;CACnF;AAID;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,WAAW,GAAG;IAAE,MAAM,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,IAAI,CAavF;AAQD,QAAA,MAAM,MAAM,EAAE,iBAOb,CAAC;AAEF,eAAe,MAAM,CAAC;AAItB;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAC7B,MAAM,EAAE,iBAAiB,EACzB,OAAO,EAAE,MAAM,EACf,IAAI,CAAC,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAA;CAAE,GAChF,iBAAiB,CAUnB"}
package/dist/index.js CHANGED
@@ -3,13 +3,12 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
3
3
 
4
4
  // src/index.ts
5
5
  import { resolve, basename as basename2, dirname } from "path";
6
- import { existsSync, readFileSync, rmSync, readdirSync, rmdirSync } from "fs";
6
+ import { existsSync, readFileSync, writeFileSync, mkdirSync, rmSync, readdirSync, rmdirSync } from "fs";
7
7
 
8
8
  // src/codegen-bruno.ts
9
- import { resolveSecurity, resolveModifiers, SECURITY_NONE, collectTransitiveModelRefs, runIncrementalCodegen, parseIncrementalManifest, emptyIncrementalManifest, hashFingerprint, INCREMENTAL_MANIFEST_VERSION } from "@contractkit/core";
9
+ import { resolveSecurity, resolveModifiers, SECURITY_NONE, collectTransitiveModelRefs, runIncrementalCodegen, parseIncrementalManifest, emptyIncrementalManifest, serializeIncrementalManifest, hashFingerprint, INCREMENTAL_MANIFEST_VERSION } from "@contractkit/core";
10
10
  import { basename } from "path";
11
11
  import { parse as parseYaml, stringify as stringifyYaml } from "yaml";
12
- var MANIFEST_FILENAME = ".contractkit-bruno-manifest.json";
13
12
  var BRUNO_CODEGEN_VERSION = "1";
14
13
  function generateOpenCollectionIncremental(roots, options, prevManifest, fileExists = () => true) {
15
14
  const modelMap = buildModelMap(options.contractRoots ?? []);
@@ -65,7 +64,6 @@ function generateOpenCollectionIncremental(roots, options, prevManifest, fileExi
65
64
  }
66
65
  const result = runIncrementalCodegen({
67
66
  codegenVersion: BRUNO_CODEGEN_VERSION,
68
- manifestFilename: MANIFEST_FILENAME,
69
67
  prevManifest,
70
68
  globalFiles,
71
69
  units,
@@ -716,6 +714,8 @@ function yamlString(value) {
716
714
  __name(yamlString, "yamlString");
717
715
 
718
716
  // src/index.ts
717
+ import { serializeIncrementalManifest as serializeIncrementalManifest2 } from "@contractkit/core";
718
+ var CACHE_MANIFEST_FILENAME = "bruno-manifest.json";
719
719
  function validateBrunoExtension(value) {
720
720
  if (value === null || typeof value !== "object" || Array.isArray(value)) {
721
721
  return {
@@ -769,7 +769,8 @@ async function runBrunoCodegen(opRoots, contractRoots, ctx, config, auth) {
769
769
  const base = config.baseDir ? resolve(ctx.rootDir, config.baseDir) : ctx.rootDir;
770
770
  const outDir = resolve(base, config.output ?? "bruno-collection");
771
771
  const collectionName = config.collectionName ?? basename2(ctx.rootDir);
772
- const prevManifest = ctx.cacheEnabled ? readManifest(outDir) : emptyManifest();
772
+ const manifestPath = resolve(ctx.cacheDir, CACHE_MANIFEST_FILENAME);
773
+ const prevManifest = ctx.cacheEnabled ? readManifest(manifestPath) : emptyManifest();
773
774
  const result = generateOpenCollectionIncremental(opRoots, {
774
775
  collectionName,
775
776
  contractRoots,
@@ -782,10 +783,10 @@ async function runBrunoCodegen(opRoots, contractRoots, ctx, config, auth) {
782
783
  for (const { relativePath, content } of result.filesToWrite) {
783
784
  ctx.emitFile(resolve(outDir, relativePath), content);
784
785
  }
786
+ writeManifest(manifestPath, result.manifest);
785
787
  }
786
788
  __name(runBrunoCodegen, "runBrunoCodegen");
787
- function readManifest(outDir) {
788
- const manifestPath = resolve(outDir, MANIFEST_FILENAME);
789
+ function readManifest(manifestPath) {
789
790
  if (!existsSync(manifestPath)) return emptyManifest();
790
791
  try {
791
792
  return parseManifest(readFileSync(manifestPath, "utf-8"));
@@ -794,6 +795,16 @@ function readManifest(outDir) {
794
795
  }
795
796
  }
796
797
  __name(readManifest, "readManifest");
798
+ function writeManifest(manifestPath, manifest) {
799
+ try {
800
+ mkdirSync(dirname(manifestPath), {
801
+ recursive: true
802
+ });
803
+ writeFileSync(manifestPath, serializeIncrementalManifest2(manifest), "utf-8");
804
+ } catch {
805
+ }
806
+ }
807
+ __name(writeManifest, "writeManifest");
797
808
  function deleteStalePaths(outDir, relPaths) {
798
809
  if (relPaths.length === 0) return;
799
810
  const removedDirs = /* @__PURE__ */ new Set();