@alimaandev/ripple 0.6.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +109 -46
- package/dist/bin.d.ts +1 -1
- package/dist/bin.js +1184 -151
- package/dist/bin.js.map +1 -1
- package/dist/{chunk-CFH4UW2E.js → chunk-VSLCAPAH.js} +3 -3
- package/dist/chunk-VSLCAPAH.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +1 -1
- package/package.json +3 -2
- package/ripple.schema.json +2 -2
- package/dist/chunk-CFH4UW2E.js.map +0 -1
package/dist/bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/output/writer.ts","../src/types/cli.ts","../src/utils/fs.ts","../src/utils/errors.ts","../src/utils/tsconfig.ts","../src/config/aliases.ts","../src/config/loader.ts","../src/types/graph.ts","../src/analyzer/confidence.ts","../src/utils/paths.ts","../src/analyzer/categorize.ts","../src/analyzer/humanize.ts","../src/analyzer/impact.ts","../src/analyzer/reverse-traverse.ts","../src/risk/levels.ts","../src/risk/score.ts","../src/analyzer/analyze.ts","../src/formatter/text.ts","../src/ui/icons.ts","../src/ui/progress.ts","../src/ui/color.ts","../src/formatter/table.ts","../src/formatter/tree.ts","../src/ui/brand.ts","../src/ui/gauge.ts","../src/output/report.ts","../src/formatter/json.ts","../src/parser/ts-project.ts","../src/utils/globs.ts","../src/scanner/rules.ts","../src/scanner/discover.ts","../src/parser/exports.ts","../src/parser/imports.ts","../src/parser/symbols.ts","../src/parser/parse.ts","../src/graph/cycles.ts","../src/graph/resolve.ts","../src/graph/build.ts","../src/commands/pipeline.ts","../src/commands/analyze.ts","../src/formatter/graph-export.ts","../src/commands/graph.ts","../src/cli/spinner.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/git/changed.ts","../src/formatter/annotations.ts","../src/commands/diff.ts","../src/cli/program.ts","../package.json","../src/cli/bin.ts"],"names":["fsSync","path","exitCode","cycleMembers","chalk","ts","fs","internalEdges","ctx","targetPath","key","check","LEVEL_INDEX","GATE_INDEX"],"mappings":";;;;;;;;;;;;;;;;;AAOO,IAAM,iBAAN,MAA6C;AAAA,EAClD,WAAA,CAA6B,MAAA,GAAgC,OAAA,CAAQ,MAAA,EAAQ;AAAhD,IAAA,IAAA,CAAA,MAAA,GAAA,MAAA;AAAA,EAAiD;AAAA,EAAjD,MAAA;AAAA,EAE7B,MAAM,IAAA,EAAoB;AACxB,IAAA,IAAA,CAAK,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,EACxB;AAAA,EAEA,SAAA,CAAU,OAAO,EAAA,EAAU;AACzB,IAAA,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,IAAI;AAAA,CAAI,CAAA;AAAA,EAC/B;AACF,CAAA;;;AC8DO,IAAM,QAAA,GAAW;AAAA,EACtB,OAAA,EAAS,CAAA;AAAA,EACT,OAAA,EAAS,CAAA;AAAA,EACT,QAAA,EAAU,CAAA;AAAA,EACV,aAAA,EAAe;AACjB,CAAA;AC3EA,eAAsB,WAAW,QAAA,EAAoC;AACnE,EAAA,IAAI;AACF,IAAA,MAAM,EAAA,CAAG,OAAO,QAAQ,CAAA;AACxB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAEO,SAAS,eAAe,QAAA,EAA2B;AACxD,EAAA,IAAI;AACF,IAAAA,GAAA,CAAO,WAAW,QAAQ,CAAA;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGA,eAAsB,aAAa,QAAA,EAA+C;AAChF,EAAA,IAAI;AACF,IAAA,OAAO,MAAM,EAAA,CAAG,QAAA,CAAS,QAAA,EAAU,MAAM,CAAA;AAAA,EAC3C,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAeA,eAAsB,gBAAgB,QAAA,EAA+C;AACnF,EAAA,IAAI,OAAA,GAAUC,KAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,WAAS;AACP,IAAA,MAAM,SAAA,GAAYA,KAAA,CAAK,IAAA,CAAK,OAAA,EAAS,cAAc,CAAA;AACnD,IAAA,IAAI,MAAM,UAAA,CAAW,SAAS,CAAA,EAAG,OAAO,SAAA;AACxC,IAAA,MAAM,MAAA,GAASA,KAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AACnC,IAAA,IAAI,MAAA,KAAW,SAAS,OAAO,MAAA;AAC/B,IAAA,OAAA,GAAU,MAAA;AAAA,EACZ;AACF;AAGA,eAAsB,uBAAuB,eAAA,EAA4C;AACvF,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,eAAe,CAAA;AAC9C,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAC;AAClB,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC/B,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,OAAO,QAAA,CAAS,IAAA,KAAS,UAAU,OAAA,CAAQ,IAAA,CAAK,SAAS,IAAI,CAAA;AACjE,IAAA,IAAI,OAAO,QAAA,CAAS,GAAA,KAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,SAAS,GAAG,CAAA;AAC/D,IAAA,IAAI,QAAA,CAAS,GAAA,IAAO,OAAO,QAAA,CAAS,GAAA,KAAQ,QAAA;AAC1C,MAAA,OAAA,CAAQ,KAAK,GAAG,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,GAAG,CAAC,CAAA;AAC7C,IAAA,OAAO,OAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;ACrEO,IAAM,WAAA,GAAN,cAA0B,KAAA,CAAM;AAAA,EAC5B,QAAA;AAAA,EACA,IAAA;AAAA,EAET,WAAA,CAAY,OAAA,EAAiBC,SAAAA,GAAqB,QAAA,CAAS,SAAS,IAAA,EAAe;AACjF,IAAA,KAAA,CAAM,OAAO,CAAA;AACb,IAAA,IAAA,CAAK,IAAA,GAAO,aAAA;AACZ,IAAA,IAAA,CAAK,QAAA,GAAWA,SAAAA;AAChB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AAAA,EACd;AACF,CAAA;AAGO,SAAS,aAAa,QAAA,EAA+B;AAC1D,EAAA,OAAO,IAAI,WAAA;AAAA,IACT,mBAAmB,QAAQ,CAAA,CAAA;AAAA,IAC3B,QAAA,CAAS,QAAA;AAAA,IACT;AAAA,GACF;AACF;ACVA,SAAS,cAAc,KAAA,EAA0B;AAC/C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GACtB,KAAA,CAAM,MAAA,CAAO,CAAC,IAAA,KAAyB,OAAO,IAAA,KAAS,QAAQ,CAAA,GAC/D,EAAC;AACP;AAMO,SAAS,aAAa,YAAA,EAAgD;AAC3E,EAAA,IAAI,CAAC,cAAA,CAAe,YAAY,CAAA,EAAG,OAAO,MAAA;AAC1C,EAAA,MAAM,aAAa,EAAA,CAAG,cAAA,CAAe,YAAA,EAAc,EAAA,CAAG,IAAI,QAAQ,CAAA;AAClE,EAAA,IAAI,UAAA,CAAW,OAAO,OAAO,MAAA;AAE7B,EAAA,MAAM,GAAA,GAAMD,KAAAA,CAAK,OAAA,CAAQ,YAAY,CAAA;AACrC,EAAA,MAAM,SAAS,EAAA,CAAG,0BAAA;AAAA,IAChB,UAAA,CAAW,MAAA;AAAA,IACX,EAAA,CAAG,GAAA;AAAA,IACH,GAAA;AAAA,IACA,MAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,IAAI,MAAA,CAAO,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,OAAO,MAAA;AAErC,EAAA,MAAM,UAAU,MAAA,CAAO,OAAA;AACvB,EAAA,MAAM,QAAkC,EAAC;AACzC,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,KAAA,MAAW,CAAC,SAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA,EAAG;AAC9D,MAAA,KAAA,CAAM,OAAO,CAAA,GAAI,CAAC,GAAG,OAAO,CAAA;AAAA,IAC9B;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,YAAA;AAAA,IACN,GAAA;AAAA,IACA,OAAA,EAAS,QAAQ,OAAA,GAAUA,KAAAA,CAAK,QAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,GAAI,MAAA;AAAA,IAChE,KAAA;AAAA,IACA,SAAS,aAAA,CAAc,UAAA,CAAW,MAAA,CAAO,OAAA,IAAW,EAAE,CAAA;AAAA,IACtD,SAAS,aAAA,CAAc,UAAA,CAAW,MAAA,CAAO,OAAA,IAAW,EAAE;AAAA,GACxD;AACF;ACvCA,IAAM,QAAA,GAAW,GAAA;AAEjB,SAAS,YAAY,KAAA,EAAwB;AAC3C,EAAA,OAAO,KAAA,CAAM,SAAS,QAAQ,CAAA;AAChC;AAQA,SAAS,cAAA,CACP,GAAA,EACA,MAAA,EACA,OAAA,EACqC;AACrC,EAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AACzC,EAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA;AAE/C,EAAA,IAAI,WAAA,CAAY,UAAU,CAAA,EAAG;AAC3B,IAAA,OAAO,EAAE,SAAS,UAAA,EAAY,MAAA,EAAQA,MAAK,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA,EAAE;AAAA,EAC7E;AACA,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AAAA,IAClC,MAAA,EAAQA,MAAK,IAAA,CAAKA,KAAAA,CAAK,QAAQ,OAAA,EAAS,aAAa,GAAG,QAAQ;AAAA,GAClE;AACF;AAMO,SAAS,aAAA,CACd,aAAA,EACA,QAAA,EACA,OAAA,EACU;AACV,EAAA,MAAM,SAAmB,EAAC;AAE1B,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,IAAA,GAAO,QAAA,CAAS,OAAA,IAAW,QAAA,CAAS,GAAA;AAC1C,IAAA,KAAA,MAAW,CAAC,SAAS,OAAO,CAAA,IAAK,OAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAA,EAAG;AAC/D,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAC,KAAA,EAAO;AACZ,MAAA,MAAM,QAAA,GAAWA,MAAK,UAAA,CAAW,KAAK,IAAI,KAAA,GAAQA,KAAAA,CAAK,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAC1E,MAAA,MAAA,CAAO,OAAO,CAAA,GAAI,QAAA;AAAA,IACpB;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,EAAG;AACzD,IAAA,IAAI,QAAQ,EAAA,EAAI;AAChB,IAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,GAAA,EAAK,MAAA,EAAQ,OAAO,CAAA;AACjD,IAAA,MAAA,CAAO,KAAA,CAAM,OAAO,CAAA,GAAI,KAAA,CAAM,MAAA;AAAA,EAChC;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,eAAA,CAAgB,WAAmB,OAAA,EAAuC;AACxF,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,EAAG;AACvD,IAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,IAAI,cAAc,EAAA,EAAI;AACpB,MAAA,IAAI,SAAA,KAAc,SAAS,OAAO,MAAA;AAClC,MAAA;AAAA,IACF;AACA,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,SAAS,CAAA;AACzC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAC1C,IAAA,IAAI,CAAC,UAAU,UAAA,CAAW,MAAM,KAAK,CAAC,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAClE,IAAA,MAAM,QAAA,GAAW,UAAU,KAAA,CAAM,MAAA,CAAO,QAAQ,SAAA,CAAU,MAAA,GAAS,OAAO,MAAM,CAAA;AAChF,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAA;AAC1C,IAAA,IAAI,UAAA,KAAe,IAAI,OAAO,MAAA;AAC9B,IAAA,OAAO,MAAA,CAAO,MAAM,CAAA,EAAG,UAAU,IAAI,QAAA,GAAW,MAAA,CAAO,KAAA,CAAM,UAAA,GAAa,CAAC,CAAA;AAAA,EAC7E;AACA,EAAA,OAAO,MAAA;AACT;;;AC7EA,IAAM,iBAAA,GAAoB;AAAA,EACxB,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAEA,IAAM,OAAO,UAAA,CAAW,MAAA,CAAA,IAAA,CAAY,KAAK,EAAE,cAAA,EAAgB,MAAM,CAAA;AAEjE,SAAS,cAAA,CAAe,KAAa,YAAA,EAAsD;AACzF,EAAA,IAAI,YAAA,EAAc,OAAOA,KAAAA,CAAK,OAAA,CAAQ,KAAK,YAAY,CAAA;AACvD,EAAA,KAAA,MAAW,aAAa,iBAAA,EAAmB;AACzC,IAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,IAAA,CAAK,GAAA,EAAK,SAAS,CAAA;AACzC,IAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG,OAAO,QAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEA,eAAe,aAAa,UAAA,EAAsC;AAChE,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAA,GAAS,MAAM,IAAA,CAAK,MAAA,CAAO,UAAU,CAAA;AAAA,EACvC,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACpE,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,kBAAkBA,KAAAA,CAAK,QAAA,CAAS,UAAU,CAAC,KAAK,MAAM,CAAA,CAAA;AAAA,MACtD,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,MAAM,KAAA,GAAS,QAAkC,OAAA,IAAW,MAAA;AAC5D,EAAA,IAAI,OAAO,UAAU,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,CAAA,EAAGA,KAAAA,CAAK,QAAA,CAAS,UAAU,CAAC,CAAA,4CAAA,CAAA;AAAA,MAC5B,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,eAAe,KAAA,EAA8B;AACpD,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,SAAA,CAAU,KAAK,CAAA;AACjD,EAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,IAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,MAAA,CAAO,KAAK,CAAA;AAC9C,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,CAAA;AAAA,EAAoB,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,KAAU,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,MAClE,QAAA,CAAS;AAAA,KACX;AAAA,EACF;AACA,EAAA,OAAO,MAAA,CAAO,IAAA;AAChB;AAOA,eAAsB,UAAA,CAAW,KAAa,YAAA,EAAkD;AAC9F,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,GAAA,EAAK,YAAY,CAAA;AAEnD,EAAA,IAAI,YAAA,IAAgB,CAAC,UAAA,EAAY;AAC/B,IAAA,MAAM,IAAI,WAAA;AAAA,MACR,0BAA0B,YAAY,CAAA,CAAA;AAAA,MACtC,QAAA,CAAS,aAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAEA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,EAAE,MAAA,EAAQ,kBAAA,CAAmB,KAAA,CAAM,EAAE,CAAA,EAAG,OAAA,EAASA,KAAAA,CAAK,OAAA,CAAQ,GAAG,CAAA,EAAE;AAAA,EAC5E;AAEA,EAAA,MAAM,GAAA,GAAM,MAAM,YAAA,CAAa,UAAU,CAAA;AACzC,EAAA,MAAM,MAAA,GAAS,eAAe,GAAG,CAAA;AACjC,EAAA,OAAO,EAAE,MAAA,EAAQ,UAAA,EAAY,SAASA,KAAAA,CAAK,OAAA,CAAQ,UAAU,CAAA,EAAE;AACjE;AAOA,eAAsB,kBAAA,CACpB,KACA,kBAAA,EACyB;AACzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAA,EAAK,kBAAkB,CAAA;AACvD,EAAA,MAAM,EAAE,MAAA,EAAQ,OAAA,EAAQ,GAAI,MAAA;AAE5B,EAAA,MAAM,YAAA,GAAeA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,OAAO,YAAY,CAAA;AAC9D,EAAA,MAAM,QAAA,GAAW,aAAa,YAAY,CAAA;AAE1C,EAAA,MAAM,OAAA,GAAoB,aAAA,CAAc,MAAA,CAAO,OAAA,EAAS,UAAU,OAAO,CAAA;AAEzE,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa,EAAC;AAAA,IAC/B;AAAA,GACF;AACF;;;AC9BO,SAAS,iBAAiB,KAAA,EAAqC;AACpE,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,KAAA,MAAWA,MAAAA,IAAQ,MAAM,OAAA,EAAS;AAChC,MAAA,OAAA,CAAQ,IAAIA,MAAI,CAAA;AAAA,IAClB;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;;;ACrFO,SAAS,iBAAA,CAAkB,OAAmB,aAAA,EAAgC;AACnF,EAAA,MAAM,YAAY,KAAA,CAAM,KAAA,KAAU,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AAC/D,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,GAAgB,KAAA,CAAM,eAAA;AAC/C,EAAA,MAAM,cAAA,GAAiB,UAAA,KAAe,CAAA,GAAI,CAAA,GAAI,MAAM,aAAA,GAAgB,UAAA;AAEpE,EAAA,IAAI,UAAA,GAAa,SAAA,IAAa,GAAA,GAAM,GAAA,GAAM,cAAA,CAAA;AAC1C,EAAA,IAAI,eAAe,UAAA,IAAc,IAAA;AAEjC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,UAAU,CAAC,CAAA,GAAI,GAAG,CAAA;AAC9D;ACXO,IAAM,iBAAA,GAAoB,CAAC,KAAA,EAAO,MAAA,EAAQ,OAAO,MAAM,CAAA;AAEvD,IAAM,wBAAwB,CAAC,GAAG,iBAAA,EAAmB,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAG5E,SAAS,QAAQ,QAAA,EAA0B;AAChD,EAAA,OAAO,QAAA,CAAS,OAAA,CAAQ,KAAA,EAAO,GAAG,CAAA;AACpC;AAGO,SAAS,iBAAA,CAAkB,UAAkB,GAAA,EAAqB;AACvE,EAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,GAAA,EAAK,QAAQ,CAAA;AACnC;AAMO,SAAS,OAAA,CAAQ,UAAkB,GAAA,EAAqB;AAC7D,EAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,QAAA,EAAU,GAAG,CAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,QAAQ,QAAQ,CAAA;AAC9B,EAAA,OAAO,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,KAAA,CAAM,aAAY,GAAI,KAAA;AAC9D;AAaO,SAAS,eAAe,QAAA,EAA2D;AACxF,EAAA,IAAI,gBAAA,CAAiB,IAAA,CAAK,QAAQ,CAAA,EAAG,OAAO,MAAA;AAC5C,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,QAAQ,EAAE,WAAA,EAAY;AAC/C,EAAA,OAAO,kBAAkB,QAAA,CAAS,GAAyC,IACtE,GAAA,CAAI,KAAA,CAAM,CAAC,CAAA,GACZ,MAAA;AACN;AAGO,SAAS,oBAAoB,QAAA,EAA4B;AAC9D,EAAA,OAAO,qBAAA,CAAsB,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAW,GAAG,CAAA;AAC1D;AAOO,SAAS,gBAAgB,SAAA,EAA2B;AACzD,EAAA,MAAM,GAAA,GAAMA,KAAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AAClC,EAAA,IAAI,QAAQ,KAAA,EAAO,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,KAAA;AACnD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,IAAI,QAAQ,MAAA,EAAQ,OAAO,UAAU,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,GAAI,MAAA;AACpD,EAAA,OAAO,SAAA;AACT;AAGO,SAAS,WAAA,CAAY,UAAkB,GAAA,EAAqB;AACjE,EAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,QAAA,CAAS,GAAA,EAAK,QAAQ,CAAA;AAC5C,EAAA,OAAO,QAAQ,QAAA,KAAa,EAAA,GAAKA,MAAK,QAAA,CAAS,QAAQ,IAAI,QAAQ,CAAA;AACrE;AAMO,SAAS,YAAA,CAAa,UAAkB,IAAA,EAAkC;AAC/E,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,IAAA,EAAM,QAAQ,CAAC,CAAA;AACtD,EAAA,IAAI,QAAA,CAAS,WAAW,IAAI,CAAA,IAAKA,MAAK,UAAA,CAAW,QAAQ,GAAG,OAAO,MAAA;AACnE,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AACrC,EAAA,OAAO,OAAA,IAAW,OAAA,KAAY,EAAA,GAAK,OAAA,GAAU,MAAA;AAC/C;;;AC1EA,IAAM,gBAAA,uBAAuB,GAAA,CAAI;AAAA,EAC/B,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,YAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA;AACF,CAAC,CAAA;AAED,IAAM,kCAAkB,IAAI,GAAA,CAAI,CAAC,QAAA,EAAU,KAAK,CAAC,CAAA;AAEjD,IAAM,iBAAA,mBAAoB,IAAI,GAAA,CAAI,CAAC,KAAA,EAAO,SAAS,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,MAAM,CAAC,CAAA;AAEzF,IAAM,sCAAsB,IAAI,GAAA,CAAI,CAAC,YAAA,EAAc,IAAI,CAAC,CAAA;AAExD,IAAM,gBAAA,mBAAmB,IAAI,GAAA,CAAI,CAAC,OAAA,EAAS,QAAQ,KAAA,EAAO,QAAA,EAAU,KAAA,EAAO,KAAK,CAAC,CAAA;AAEjF,IAAM,YAAA,GAAe,WAAA;AAErB,SAAS,gBAAA,CAAiB,UAAkB,OAAA,EAA2B;AACrE,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,SAAU,EAAC;AACvC,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,CAAC,OAAA,KAAY,OAAA,KAAY,EAAA,IAAM,OAAA,KAAY,GAAG,CAAA;AAClF;AAEA,SAAS,YAAY,QAAA,EAA2B;AAC9C,EAAA,OAAO,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AACtC;AAEA,SAAS,UAAA,CAAW,MAAc,QAAA,EAA6B;AAC7D,EAAA,IAAI,QAAA,CAAS,QAAA,CAAS,YAAY,CAAA,EAAG,OAAO,IAAA;AAC5C,EAAA,IAAI,gCAAA,CAAiC,IAAA,CAAK,IAAI,CAAA,EAAG,OAAO,IAAA;AACxD,EAAA,OAAO,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,YAAY,OAAO,CAAA;AACvD;AAEA,SAAS,eAAA,CAAgB,QAAA,EAAkB,SAAA,EAAmB,QAAA,EAA6B;AACzF,EAAA,IAAI,SAAA,KAAc,KAAA,IAAS,SAAA,KAAc,KAAA,EAAO,OAAO,IAAA;AACvD,EAAA,IAAI,CAAC,oBAAoB,GAAA,CAAI,QAAA,CAAS,GAAG,EAAE,CAAA,IAAK,EAAE,CAAA,EAAG,OAAO,KAAA;AAC5D,EAAA,OAAO,QAAA,CAAS,KAAK,QAAQ,CAAA;AAC/B;AAEA,SAAS,cAAc,QAAA,EAA6B;AAClD,EAAA,OAAO,SAAS,IAAA,CAAK,CAAC,YAAY,iBAAA,CAAkB,GAAA,CAAI,OAAO,CAAC,CAAA;AAClE;AAEA,SAAS,WAAA,CAAY,QAAA,EAAkB,OAAA,EAAiB,WAAA,EAAmC;AACzF,EAAA,IAAI,YAAY,GAAA,CAAIA,KAAAA,CAAK,UAAU,QAAQ,CAAC,GAAG,OAAO,IAAA;AAEtD,EAAA,MAAM,WAAW,OAAA,CAAQA,KAAAA,CAAK,QAAA,CAAS,OAAA,EAAS,QAAQ,CAAC,CAAA;AACzD,EAAA,IAAI,QAAA,CAAS,UAAA,CAAW,IAAI,CAAA,EAAG,OAAO,KAAA;AACtC,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA;AACnC,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,IAAI,QAAA,CAAS,CAAC,CAAA,KAAM,KAAA,IAAS,SAAS,CAAC,CAAA,KAAM,IAAI,OAAO,KAAA;AAExD,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,CAAC,CAAA,IAAK,EAAA;AAChC,EAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,EAAA,MAAM,OAAO,GAAA,KAAQ,EAAA,GAAK,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D,EAAA,OAAO,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAClC;AAYO,SAAS,kBAAkB,OAAA,EAA+D;AAC/F,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,OAAA;AAEjC,EAAA,OAAO,CAAC,QAAA,KAAiC;AACvC,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,QAAA,EAAU,OAAO,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,QAAA,CAAS,EAAA,CAAG,EAAE,CAAA,IAAK,EAAA;AACpC,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,WAAA,CAAY,GAAG,CAAA;AACpC,IAAA,MAAM,OAAO,GAAA,KAAQ,EAAA,GAAK,WAAW,QAAA,CAAS,KAAA,CAAM,GAAG,GAAG,CAAA;AAC1D,IAAA,MAAM,SAAA,GAAY,QAAQ,EAAA,GAAK,EAAA,GAAK,SAAS,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAExE,IAAA,MAAM,aAAyB,EAAC;AAEhC,IAAA,IAAI,WAAA,CAAY,IAAI,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AAAA,SAAA,IACrC,QAAA,CAAS,IAAA,CAAK,CAAC,OAAA,KAAY,eAAA,CAAgB,GAAA,CAAI,OAAO,CAAC,CAAA,EAAG,UAAA,CAAW,IAAA,CAAK,OAAO,CAAA;AAE1F,IAAA,IAAI,WAAW,IAAA,EAAM,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,MAAM,CAAA;AACtD,IAAA,IAAI,gBAAgB,IAAA,EAAM,SAAA,EAAW,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,WAAW,CAAA;AAC3E,IAAA,IAAI,aAAA,CAAc,QAAQ,CAAA,EAAG,UAAA,CAAW,KAAK,SAAS,CAAA;AACtD,IAAA,IAAI,YAAY,QAAA,EAAU,OAAA,EAAS,WAAW,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AACxE,IAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,UAAA,CAAW,KAAK,OAAO,CAAA;AAEpD,IAAA,OAAO,UAAA;AAAA,EACT,CAAA;AACF;AAMA,eAAsB,kBAAkB,OAAA,EAAuC;AAC7E,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAY;AAEpC,EAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,OAAO,CAAA;AACrD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,MAAM,UAAA,GAAaA,KAAAA,CAAK,OAAA,CAAQ,eAAe,CAAA;AAC/C,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,sBAAA,CAAuB,eAAe,CAAA,EAAG;AACjE,MAAA,MAAM,QAAA,GAAWA,KAAAA,CAAK,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAA;AAC/C,MAAA,IAAI,cAAA,CAAe,QAAQ,CAAA,EAAG,WAAA,CAAY,IAAIA,KAAAA,CAAK,SAAA,CAAU,QAAQ,CAAC,CAAA;AAAA,IACxE;AAAA,EACF;AAEA,EAAA,MAAM,WAAW,CAAC,OAAA,EAASA,MAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAC,CAAA;AACpD,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,KAAA,MAAW,QAAQ,gBAAA,EAAkB;AACnC,MAAA,KAAA,MAAW,aAAa,CAAC,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,KAAK,CAAA,EAAG;AAClD,QAAA,MAAM,SAAA,GAAYA,MAAK,IAAA,CAAK,OAAA,EAAS,GAAG,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAC3D,QAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG,WAAA,CAAY,IAAIA,KAAAA,CAAK,SAAA,CAAU,SAAS,CAAC,CAAA;AAAA,MAC1E;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,WAAA;AACT;;;AChIA,IAAM,iBAAA,GAA4C;AAAA,EAChD,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,KAAA,EAAO,OAAA;AAAA,EACP,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK;AACP,CAAA;AAEA,SAAS,WAAW,OAAA,EAA2B;AAC7C,EAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,OAAA,CAAQ,gBAAA,EAAkB,GAAG,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,UAAA,CAAW,KAAA,CAAM,kDAAkD,CAAA;AACnF,EAAA,OAAA,CAAQ,OAAA,IAAW,CAAC,OAAO,CAAA,EAAG,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,WAAA,EAAa,CAAA;AAChE;AAEA,SAAS,WAAW,IAAA,EAAsB;AACxC,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,IAAA,CAAK,MAAM,CAAC,CAAA;AACpD;AAEO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,MAAM,KAAA,GAAQ,WAAW,OAAO,CAAA;AAChC,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,WAAW,OAAO,CAAA;AACjD,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,iBAAA,CAAkB,IAAI,CAAA,IAAK,UAAA,CAAW,IAAI,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AAClF;;;AC/CA,IAAM,gBAAA,GAAmB,CAAA;AAElB,SAAS,YAAA,CACd,QAAA,EACA,OAAA,EACA,UAAA,EACe;AACf,EAAA,IAAI,MAAA,GAAS,CAAA;AACb,EAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI,QAAA,GAAW,CAAA;AAEf,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAE3C,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAA,CAAS,MAAA,EAAO,EAAG;AACpC,IAAA,IAAI,IAAA,CAAK,KAAA,GAAQ,QAAA,EAAU,QAAA,GAAW,IAAA,CAAK,KAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,MAAA,EAAA;AACvC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,MAAM,CAAA,EAAG,KAAA,EAAA;AACtC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,WAAW,CAAA,EAAG,UAAA,EAAA;AAC3C,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,SAAS,CAAA,EAAG,SAAA,EAAA;AACzC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,QAAA,CAAS,OAAO,CAAA,EAAG,OAAA,EAAA;AAEvC,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,IAAA,CAAK,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,UAAA,CAAW,IAAI,IAAA,EAAA,CAAO,UAAA,CAAW,IAAI,IAAI,CAAA,IAAK,KAAK,CAAC,CAAA;AAAA,IACtD;AAAA,EACF;AAEA,EAAA,MAAM,YAA6B,CAAC,GAAG,UAAA,CAAW,OAAA,EAAS,CAAA,CACxD,GAAA,CAAI,CAAC,CAAC,OAAO,KAAK,CAAA,MAAO,EAAE,KAAA,EAAO,YAAA,CAAa,KAAK,CAAA,EAAG,KAAA,EAAM,CAAE,CAAA,CAC/D,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,CAAA,CAAE,KAAA,CAAM,cAAc,CAAA,CAAE,KAAK,CAAC,CAAA,CAClE,KAAA,CAAM,GAAG,gBAAgB,CAAA;AAE5B,EAAA,OAAO;AAAA,IACL,eAAe,QAAA,CAAS,IAAA;AAAA,IACxB,MAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,SAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,SAAA;AAAA,IACA;AAAA,GACF;AACF;;;AChCO,SAAS,eAAA,CACd,KAAA,EACA,SAAA,EACA,OAAA,EACwB;AACxB,EAAA,MAAM,EAAE,QAAA,EAAU,UAAA,EAAW,GAAI,OAAA;AAEjC,EAAA,MAAM,QAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,SAAS,CAAC,CAAA;AAC3C,EAAA,MAAME,aAAAA,GAAe,iBAAiB,KAAK,CAAA;AAE3C,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AACjC,IAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,CAAA,EAAE;AAAA,EACjC;AAEA,EAAA,MAAM,QAA+C,EAAC;AACtD,EAAA,KAAA,MAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,SAAS,CAAA,IAAK,EAAC,EAAG;AACzD,IAAA,KAAA,CAAM,KAAK,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AAAA,EACxC;AAEA,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,YAAY,MAAA,EAAW;AAE3B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA;AAEvB,IAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA;AACxC,IAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,IAAQ,OAAA,CAAQ,GAAA;AAEvC,IAAA,QAAA,CAAS,GAAA,CAAI,QAAQ,GAAA,EAAK;AAAA,MACxB,IAAA,EAAM,QAAA;AAAA,MACN,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,MAAA,EAAQ,QAAQ,KAAA,KAAU,CAAA;AAAA,MAC1B,UAAA,EAAY,WAAW,QAAQ,CAAA;AAAA,MAC/B,OAAA,EAASA,aAAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,GAAG;AAAA,KACtC,CAAA;AAED,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,KAAA,GAAQ,QAAA,EAAU;AACtD,MAAA,KAAA,MAAW,QAAA,IAAY,MAAM,OAAA,CAAQ,GAAA,CAAI,QAAQ,GAAG,CAAA,IAAK,EAAC,EAAG;AAC3D,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,UAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,QAAA,EAAU,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAAA,QACxD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,OAAA,EAAQ;AACvC;;;ACvEO,SAAS,YAAA,CAAa,OAAe,UAAA,EAAuC;AACjF,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,QAAA,EAAU,OAAO,UAAA;AACzC,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,IAAA,EAAM,OAAO,MAAA;AACrC,EAAA,IAAI,KAAA,IAAS,UAAA,CAAW,MAAA,EAAQ,OAAO,QAAA;AACvC,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,KAAA,CAAM,KAAA,EAAe,GAAA,EAAa,GAAA,EAAqB;AACrE,EAAA,OAAO,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA;AAC3C;AAMO,SAAS,QAAA,CAAS,OAAe,GAAA,EAAqB;AAC3D,EAAA,IAAI,KAAA,IAAS,GAAG,OAAO,CAAA;AACvB,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA,GAAI,IAAA,CAAK,KAAA,CAAM,GAAA,GAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAChE;;;ACKA,IAAM,kBAAA,GAAqB,GAAA;AAC3B,IAAM,aAAA,GAAgB,EAAA;AACtB,IAAM,SAAA,GAAY,EAAA;AAClB,IAAM,UAAA,GAAa,EAAA;AACnB,IAAM,WAAA,GAAc,EAAA;AAEpB,IAAM,OAAA,GAA8B;AAAA,EAClC;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,OAAc,QAAA,CAAS,OAAA,CAAQ,eAAe,kBAAkB;AAAA,GAC9E;AAAA,EACA;AAAA,IACE,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,OAAe,OAAA,CAAQ,OAAA,GAAU,IAAI,CAAA,GAAI;AAAA,GACvD;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,2BAAA;AAAA,IACP,aAAA,EAAe,IAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,SAAA,GAAY,aAAA,EAAe,CAAA,EAAG,CAAC;AAAA,GACzE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,eAAA;AAAA,IACN,KAAA,EAAO,uBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,YAAA,EAAa,KAAM;AAC7B,MAAA,MAAM,EAAE,SAAQ,GAAI,YAAA;AACpB,MAAA,MAAM,KAAA,GACJ,QAAQ,KAAA,CAAM,MAAA,IAAU,QAAQ,UAAA,GAAa,CAAA,GAAI,CAAA,CAAA,GAAK,OAAA,CAAQ,cAAA,CAAe,MAAA;AAC/E,MAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,WAAA,EAAa,CAAA,EAAG,CAAC,CAAA;AAAA,IACxC;AAAA,GACF;AAAA,EACA;AAAA,IACE,IAAA,EAAM,OAAA;AAAA,IACN,KAAA,EAAO,gBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,KAAA,GAAQ,SAAA,EAAW,CAAA,EAAG,CAAC;AAAA,GACjE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,QAAA;AAAA,IACN,KAAA,EAAO,iBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,OAAA,EAAS,CAAC,EAAE,OAAA,EAAQ,KAAM,MAAM,OAAA,CAAQ,MAAA,GAAS,UAAA,EAAY,CAAA,EAAG,CAAC;AAAA,GACnE;AAAA,EACA;AAAA,IACE,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,qBAAA;AAAA,IACP,aAAA,EAAe,GAAA;AAAA,IACf,SAAS,CAAC,EAAE,aAAA,EAAc,KAAO,gBAAgB,CAAA,GAAI;AAAA;AAEzD,CAAA;AAEA,SAAS,SAAA,CAAU,YAA8B,KAAA,EAA0B;AACzE,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,UAAA,CAAW,OAAA,CAAQ,WAAW,IAAmC,CAAA;AAC1F,EAAA,OAAO,cAAc,UAAA,CAAW,aAAA;AAClC;AAKO,SAAS,UAAU,KAAA,EAA8B;AACtD,EAAA,MAAM,OAAA,GAAwB,OAAA,CAAQ,GAAA,CAAI,CAAC,UAAA,KAAe;AACxD,IAAA,MAAM,MAAA,GAAS,SAAA,CAAU,UAAA,EAAY,KAAK,CAAA;AAC1C,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,CAAQ,KAAK,CAAA;AACtC,IAAA,OAAO;AAAA,MACL,MAAM,UAAA,CAAW,IAAA;AAAA,MACjB,OAAO,UAAA,CAAW,KAAA;AAAA,MAClB,MAAA;AAAA,MACA,KAAA;AAAA,MACA,cAAc,IAAA,CAAK,KAAA,CAAM,SAAS,KAAA,GAAQ,GAAA,GAAM,GAAG,CAAA,GAAI;AAAA,KACzD;AAAA,EACF,CAAC,CAAA;AAED,EAAA,MAAM,KAAA,GAAQ,KAAA;AAAA,IACZ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,CAAC,GAAA,EAAK,MAAA,KAAW,GAAA,GAAM,MAAA,CAAO,YAAA,EAAc,CAAC,CAAA,GAAI,GAAG,CAAA,GAAI,GAAA;AAAA,IAClF,CAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA,EAAO,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,WAAW,UAAU,CAAA;AAAA,IACtD;AAAA,GACF;AACF;;;ACpFO,SAAS,WAAW,OAAA,EAAyB;AAClD,EAAA,MAAM,SAAA,GAAYF,KAAAA,CAAK,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AAC1C,EAAA,OAAO,cAAA,CAAe,SAAS,CAAA,GAAI,SAAA,GAAY,OAAA;AACjD;AAEO,SAAS,YAAY,KAAA,EAAqC;AAC/D,EAAA,MAAM,EAAE,OAAO,OAAA,EAAS,WAAA,EAAa,WAAW,UAAA,EAAY,UAAA,EAAY,UAAS,GAAI,KAAA;AAErF,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AACtC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,sCAAA,EAAyC,UAAU,CAAA,CAAE,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,aAAa,iBAAA,CAAkB,EAAE,SAAS,OAAA,CAAQ,OAAA,EAAS,aAAa,CAAA;AAC9E,EAAA,MAAM,EAAE,QAAA,EAAU,QAAA,EAAU,cAAa,GAAI,eAAA,CAAgB,OAAO,SAAA,EAAW;AAAA,IAC7E,QAAA;AAAA,IACA;AAAA,GACD,CAAA;AAED,EAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,KAAK,CAAA,CAAE,IAAI,SAAS,CAAA;AAC3D,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,KAAA,CAAM,KAAA,EAAO,aAAa,CAAA;AAC/D,EAAA,MAAM,UAAU,YAAA,CAAa,QAAA,EAAU,WAAW,OAAA,CAAQ,OAAO,GAAG,UAAU,CAAA;AAE9E,EAAA,MAAM,OAAO,SAAA,CAAU;AAAA,IACrB,OAAA;AAAA,IACA,cAAc,IAAA,CAAK,MAAA;AAAA,IACnB,aAAA;AAAA,IACA,UAAA,EAAY,QAAQ,MAAA,CAAO;AAAA,GAC5B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,KAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,IAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACZ;AACF;AC9DO,SAAS,GAAA,CAAI,MAAc,KAAA,EAA0B;AAC1D,EAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,IAAI,CAAA,GAAI,IAAA;AACzC;AAGO,SAAS,MAAA,CAAO,MAAc,KAAA,EAA0B;AAC7D,EAAA,OAAO,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA;AAC1C;AAEA,IAAM,WAAA,GAA2D;AAAA,EAC/D,GAAA,EAAK,CAAC,IAAA,KAAS,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,EAC/B,MAAA,EAAQ,CAAC,IAAA,KAAS,KAAA,CAAM,OAAO,IAAI,CAAA;AAAA,EACnC,IAAA,EAAM,CAAC,IAAA,KAAS,KAAA,CAAM,QAAQ,IAAI,CAAA;AAAA,EAClC,UAAU,CAAC,IAAA,KAAS,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI;AACzC,CAAA;AAGO,SAAS,UAAU,KAAA,EAA4C;AACpE,EAAA,OAAO,YAAY,KAAK,CAAA;AAC1B;AAGO,SAAS,SAAA,CAAU,OAAkB,KAAA,EAA0B;AACpE,EAAA,OAAO,MAAM,KAAA,GAAQ,WAAA,CAAY,KAAK,CAAA,CAAE,KAAK,CAAA,GAAI,KAAA;AACnD;AAGO,SAAS,cAAA,CAAe,SAAiB,KAAA,EAA0B;AACxE,EAAA,MAAM,IAAA,GAAO,GAAG,OAAO,CAAA,CAAA,CAAA;AACvB,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,IAAA;AACzB,EAAA,IAAI,OAAA,IAAW,EAAA,EAAI,OAAO,KAAA,CAAM,MAAM,IAAI,CAAA;AAC1C,EAAA,IAAI,OAAA,IAAW,EAAA,EAAI,OAAO,KAAA,CAAM,OAAO,IAAI,CAAA;AAC3C,EAAA,OAAO,KAAA,CAAM,IAAI,IAAI,CAAA;AACvB;AAGO,SAAS,eAAe,EAAA,EAAoB;AACjD,EAAA,IAAI,EAAA,GAAK,GAAA,EAAM,OAAO,CAAA,EAAG,EAAE,CAAA,EAAA,CAAA;AAC3B,EAAA,OAAO,CAAA,EAAA,CAAI,EAAA,GAAK,GAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,CAAA;AAClC;AAGO,SAAS,UAAU,KAAA,EAAe,IAAA,EAAc,MAAA,GAAS,CAAA,EAAG,IAAI,CAAA,CAAA,CAAA,EAAa;AAClF,EAAA,OAAO,GAAG,KAAK,CAAA,CAAA,EAAI,KAAA,KAAU,CAAA,GAAI,OAAO,MAAM,CAAA,CAAA;AAChD;ACtCO,SAAS,KAAK,IAAA,EAAwB;AAC3C,EAAA,OAAO,QAAQ,IAAI,CAAA;AACrB;;;ACCA,IAAM,IAAA,GAAqB;AAAA,EACzB,MAAM,MAAM;AAAA,EAAC,CAAA;AAAA,EACb,MAAM,MAAM;AAAA,EAAC;AACf,CAAA;AAEO,SAAS,mBAAmB,OAAA,EAAgC;AACjE,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,MAAA,CAAO,OAAO,OAAO,IAAA;AAE9C,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,IAAA,GAAO,CAAA;AAEX,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,EAAA,KAAqB;AACjD,IAAA,OAAA,CAAQ,MAAA,CAAO,KAAA;AAAA,MACb,CAAA,EAAGG,KAAAA,CAAM,KAAA,CAAM,IAAA,CAAK,MAAM,CAAC,CAAC,CAAA,CAAA,EAAI,KAAK,IAAIA,KAAAA,CAAM,GAAA,CAAI,cAAA,CAAe,EAAE,CAAC,CAAC;AAAA;AAAA,KACxE;AAAA,EACF,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,KAAK,KAAA,EAAqB;AACxB,MAAA,IAAI,SAAS,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,IAAI,CAAA;AAC7C,MAAA,OAAA,GAAU,KAAA;AACV,MAAA,IAAA,GAAO,KAAK,GAAA,EAAI;AAAA,IAClB,CAAA;AAAA,IACA,IAAA,GAAa;AACX,MAAA,IAAI,SAAS,KAAA,CAAM,OAAA,EAAS,IAAA,CAAK,GAAA,KAAQ,IAAI,CAAA;AAC7C,MAAA,OAAA,GAAU,MAAA;AAAA,IACZ;AAAA,GACF;AACF;;;AC5CO,SAAS,aAAa,SAAA,EAAyC;AACpE,EAAA,IAAI,SAAA,KAAc,OAAO,OAAO,KAAA;AAChC,EAAA,MAAM,OAAA,GAAU,QAAQ,GAAA,CAAI,QAAA;AAC5B,EAAA,OAAO,OAAA,KAAY,UAAa,OAAA,KAAY,EAAA;AAC9C;;;ACCO,SAAS,WAAA,CAAY,SAAwB,IAAA,EAA0B;AAC5E,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU;AAC5C,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,CAAO,MAAA,EAAQ,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,KAAK,CAAA,IAAK,EAAE,CAAC,CAAA;AACpE,IAAA,OAAO,IAAA,CAAK,IAAI,GAAG,KAAA,CAAM,IAAI,CAAC,IAAA,KAAS,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,EACrD,CAAC,CAAA;AAED,EAAA,MAAM,GAAA,GAAM,CAAC,KAAA,EAAe,KAAA,KAA0B;AACpD,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAK,CAAA,IAAK,KAAA,CAAM,MAAA;AACrC,IAAA,OAAO,OAAA,CAAQ,KAAK,CAAA,EAAG,KAAA,KAAU,OAAA,GAAU,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAK,CAAA;AAAA,EACvF,CAAA;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,QAAQ,KAAA,KAAU,GAAA,CAAI,MAAA,CAAO,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC/E,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAC,IAAA,EAAM,KAAA,KAAU,GAAA,CAAI,IAAA,EAAM,KAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAQO,SAAS,eAAe,OAAA,EAA0C;AACvE,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AAC5D,EAAA,OAAO,QAAQ,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAClF;ACrBA,SAAS,UAAU,IAAA,EAAqC;AACtD,EAAA,IAAI,CAAC,IAAA,CAAK,QAAA,IAAY,KAAK,QAAA,CAAS,MAAA,KAAW,GAAG,OAAO,EAAA;AACzD,EAAA,MAAM,SAAqB,EAAC;AAC5B,EAAA,KAAA,MAAW,KAAA,IAAS,KAAK,QAAA,EAAU;AACjC,IAAA,MAAA,CAAO,KAAA,CAAM,KAAK,CAAA,GAAI,SAAA,CAAU,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,WAAW,KAAA,EAA2B;AACpD,EAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,EAAA;AAC/B,EAAA,MAAM,OAAmB,EAAC;AAC1B,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,IAAA,CAAK,IAAA,CAAK,KAAK,CAAA,GAAI,SAAA,CAAU,IAAI,CAAA;AAAA,EACnC;AACA,EAAA,OAAO,QAAQ,MAAA,CAAO,IAAA,EAAM,KAAA,EAAO,KAAK,EAAE,OAAA,EAAQ;AACpD;ACPO,SAAS,YAAY,OAAA,EAA+B;AACzD,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAM,GAAI,OAAA;AAClC,EAAA,IAAI,CAAC,MAAM,KAAA,EAAO;AAChB,IAAA,OAAO,iBAAY,KAAK,CAAA,EAAG,UAAU,CAAA,OAAA,EAAO,OAAO,KAAK,EAAE,CAAA,CAAA;AAAA,EAC5D;AACA,EAAA,MAAM,QAAQA,KAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,YAAA,EAAY,KAAK,CAAA,CAAE,CAAA;AACjD,EAAA,OAAO,CAAA,EAAG,KAAK,CAAA,EAAG,OAAA,GAAU,CAAA,CAAA,EAAIA,KAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,EAAM,OAAO,CAAA,CAAE,CAAC,CAAA,CAAA,GAAK,EAAE,CAAA,CAAA;AACnE;AAOO,SAAS,aAAA,CAAc,OAAe,KAAA,EAA0B;AACrE,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,KAAA;AACzB,EAAA,OAAO,CAAA,EAAGA,MAAM,GAAA,CAAI,QAAG,CAAC,CAAA,CAAA,EAAIA,KAAAA,CAAM,IAAA,CAAK,KAAK,CAAC,CAAA,CAAA;AAC/C;;;AC9BA,IAAM,KAAA,GAAQ,EAAA;AACd,IAAM,IAAA,GAAO,QAAA;AACb,IAAM,KAAA,GAAQ,QAAA;AAEP,SAAS,SAAA,CAAU,KAAA,EAAe,KAAA,EAAkB,KAAA,EAA0B;AACnF,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,EAAO,OAAO,EAAA;AACzB,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,GAAA,CAAI,KAAA,EAAO,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,GAAA,GAAO,KAAK,CAAC,CAAC,CAAA;AAC7E,EAAA,OAAO,SAAA,CAAU,KAAK,CAAA,CAAE,IAAA,CAAK,MAAA,CAAO,MAAM,CAAA,GAAI,KAAA,CAAM,MAAA,CAAO,KAAA,GAAQ,MAAM,CAAC,CAAA;AAC5E;;;ACgBA,IAAM,kBAAA,GAAqB,EAAA;AAE3B,IAAM,YAAY,CAAC,OAAA,MAAuC,EAAE,KAAA,EAAO,QAAQ,KAAA,EAAM,CAAA;AAGjF,SAAS,SAAA,CAAU,QAAA,EAAkB,KAAA,EAAe,OAAA,EAAkB,KAAA,EAA0B;AAC9F,EAAA,MAAM,KAAA,GAAkB,CAAC,GAAA,CAAI,QAAA,EAAU,KAAK,CAAC,CAAA;AAC7C,EAAA,IAAI,KAAA,IAAS,GAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA,WAAA,EAAW,KAAK,CAAA,CAAA,EAAI,KAAK,CAAC,CAAA;AACzD,EAAA,IAAI,SAAS,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,YAAA,EAAW,KAAK,CAAC,CAAA;AAC7C,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;AAGA,SAAS,UAAA,CAAW,QAAwB,KAAA,EAA0B;AACpE,EAAA,MAAM,EAAE,SAAQ,GAAI,MAAA;AACpB,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,OAAO,CAAC,CAAA;AACrE,EAAA,IAAI,OAAA,CAAQ,aAAa,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,UAAA,EAAY,WAAW,CAAC,CAAA;AACjF,EAAA,IAAI,OAAA,CAAQ,QAAQ,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,KAAA,EAAO,MAAM,CAAC,CAAA;AAClE,EAAA,IAAI,OAAA,CAAQ,YAAY,CAAA,EAAG,KAAA,CAAM,KAAK,SAAA,CAAU,OAAA,CAAQ,SAAA,EAAW,SAAS,CAAC,CAAA;AAC7E,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,GAAI,KAAA,CAAM,KAAK,QAAK,CAAA,GAAI,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAA;AACjE;AAIA,SAAS,iBAAA,CAAkB,MAAA,EAAwB,GAAA,EAAa,KAAA,EAA8B;AAC5F,EAAA,MAAM,EAAE,QAAA,EAAU,KAAA,EAAM,GAAI,MAAA;AAC5B,EAAA,MAAM,SAAS,CAAC,GAAG,QAAA,CAAS,OAAA,EAAS,CAAA,CAAE,IAAA;AAAA,IACrC,CAAC,GAAG,CAAC,CAAA,EAAG,GAAG,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA,IAAS,EAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI;AAAA,GACpE;AAEA,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAiD;AACxE,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAoB;AAC3C,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,MAAM,OAA4C,EAAE,KAAA,EAAO,EAAA,EAAI,QAAA,EAAU,EAAC,EAAE;AAC5E,IAAA,IAAA,CAAK,KAAA,GAAQ,SAAA,CAAU,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,GAAG,CAAA,EAAG,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAA,EAAS,KAAK,CAAA;AACnF,IAAA,UAAA,CAAW,GAAA,CAAI,KAAK,IAAI,CAAA;AACxB,IAAA,UAAA,CAAW,GAAA,CAAI,GAAA,EAAK,IAAA,CAAK,KAAK,CAAA;AAAA,EAChC;AAEA,EAAA,MAAM,QAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,IAAI,CAAA,IAAK,MAAA,EAAQ;AAChC,IAAA,MAAM,IAAA,GAAO,UAAA,CAAW,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,CAAC,IAAA,EAAM;AAEX,IAAA,IAAI,IAAA,CAAK,UAAU,CAAA,EAAG;AACpB,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AACf,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,GAAG,KAAK,EAAC;AAC7C,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,CAAA,CAC1B,MAAA;AAAA,MACC,CAAC,SAAA,KAAc,UAAA,CAAW,GAAA,CAAI,SAAS,CAAA,KAAM,IAAA,CAAK,KAAA,GAAQ,CAAA,IAAK,UAAA,CAAW,GAAA,CAAI,SAAS;AAAA,MAExF,IAAA,CAAK,CAAC,GAAG,CAAA,KAAA,CAAO,UAAA,CAAW,IAAI,CAAC,CAAA,IAAK,CAAA,KAAM,UAAA,CAAW,IAAI,CAAC,CAAA,IAAK,MAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AAE3F,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA,GAAI,WAAW,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,MAAA;AACzD,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,MAAA,CAAO,QAAA,CAAS,KAAK,IAAI,CAAA;AAAA,IAC3B,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAGO,SAAS,mBAAA,CACd,MAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAK,GAAI,MAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,QAAQ,GAAG,CAAA;AAEvD,EAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,iBAAA,EAAmB,SAAS,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC3F,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAClC,EAAA,MAAM,QAAQ,SAAA,CAAU,IAAA,CAAK,KAAA,EAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACrD,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,CAAC,QAAQ,IAAI,CAAA;AAAA,IACb,CAAC,MAAA,EAAQ,CAAA,EAAG,SAAA,CAAU,IAAA,CAAK,OAAO,KAAK,CAAC,CAAA,MAAA,EAAM,KAAK,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,CAAA,CAAE,CAAA;AAAA,IACpF,CAAC,QAAA,EAAU,UAAA,CAAW,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,IACpC,CAAC,UAAA,EAAY,SAAA,CAAU,OAAA,CAAQ,aAAA,EAAe,MAAM,CAAC,CAAA;AAAA,IACrD,CAAC,WAAA,EAAa,MAAA,CAAO,OAAA,CAAQ,QAAQ,CAAC,CAAA;AAAA,IACtC,CAAC,YAAA,EAAc,cAAA,CAAe,OAAA,CAAQ,UAAA,EAAY,KAAK,CAAC,CAAA;AAAA,IACxD,CAAC,YAAY,GAAA,CAAI,cAAA,CAAe,OAAO,UAAU,CAAA,EAAG,KAAK,CAAC;AAAA,GAC5D;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,EAAM;AAC/B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,YAAA,EAAc,KAAK,CAAC,CAAA;AACnD,EAAA,KAAA,MAAW,IAAA,IAAQ,QAAQ,SAAA,EAAW;AACpC,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,GAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,OAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAC,IAAI,GAAA,CAAI,CAAA,CAAA,EAAI,KAAK,KAAK,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAAA,KACjF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,uBAAA,EAAyB,KAAK,CAAC,CAAA;AAC9D,EAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AACpC,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,KAAA,IAAS,MAAA,CAAO,KAAA,CAAM,MAAA,EAAQ;AACvC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,IAAI,GAAG,CAAA;AACvC,QAAA,OAAO,WAAA,CAAY,IAAA,EAAM,IAAA,IAAQ,GAAA,EAAK,QAAQ,GAAG,CAAA;AAAA,MACnD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AACjC,MAAA,MAAA,CAAO,UAAU,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,IAAI,OAAA,CAAQ,gBAAgB,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,UAAU,aAAA,CAAc,CAAA,gBAAA,EAAmB,QAAQ,aAAa,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAClF,IAAA,MAAM,IAAA,GAAO,iBAAA,CAAkB,MAAA,EAAQ,OAAA,CAAQ,KAAK,KAAK,CAAA;AACzD,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,IAAI,CAAC,CAAA;AACjC,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,IAAa,kBAAA;AACnC,IAAA,IAAI,OAAA,CAAQ,gBAAgB,KAAA,EAAO;AACjC,MAAA,MAAA,CAAO,SAAA;AAAA,QACL,IAAI,CAAA,EAAG,OAAA,CAAQ,aAAA,GAAgB,KAAK,4CAAuC,KAAK;AAAA,OAClF;AAAA,IACF;AACA,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,cAAA,EAAgB,KAAK,CAAC,CAAA;AACrD,IAAA,MAAM,OAAA,GAAyB;AAAA,MAC7B,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA,EAAS;AAAA,MACnB,EAAE,QAAQ,QAAA;AAAS,KACrB;AACA,IAAA,MAAM,WAAA,GAAc,IAAA,CAAK,OAAA,CAAQ,GAAA,CAAI,CAAC,MAAA,KAAW;AAAA,MAC/C,MAAA,CAAO,KAAA;AAAA,MACP,MAAA,CAAO,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA;AAAA,MACvB,MAAA,CAAO,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,MACtB,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,CAAC;AAAA,KAC9B,CAAA;AACD,IAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,OAAA,EAAS,WAAW,CAAC,CAAA;AAClD,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,IAAI,MAAM,KAAA,EAAO;AACf,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAC,qDAAqD,KAAK;AAAA,KAC/E;AAAA,EACF;AACF;AAGO,SAAS,sBAAA,CACd,MAAA,EACA,OAAA,EACA,GAAA,EACmB;AACnB,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB,MAAA,CAAO,MAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG,IAAA,IAAQ,GAAA;AAE/E,EAAA,MAAM,QAAA,GAAW,CAAC,GAAG,MAAA,CAAO,SAAS,MAAA,EAAQ,CAAA,CAC1C,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,EAAE,IAAI,CAAC,CAAA,CAChE,GAAA,CAAI,CAAC,IAAA,MAAU,EAAE,GAAG,IAAA,EAAM,MAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,GAAG,GAAE,CAAE,CAAA;AAEjE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,SAAA;AAAA,IACT,IAAA,EAAM,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA;AAAA,IACxC,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,SAAS,MAAA,CAAO,OAAA;AAAA,IAChB,QAAA;AAAA,IACA,QAAQ,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MAC1C,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACnE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,GAAG,CAAC;AAAA,KAC/D,CAAE,CAAA;AAAA,IACF,eAAe,MAAA,CAAO,aAAA;AAAA,IACtB,YAAY,MAAA,CAAO;AAAA,GACrB;AACF;AAaO,SAAS,iBAAA,CACd,KAAA,EACA,OAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,KAAA,GAAQ,UAAU,OAAO,CAAA;AAC/B,EAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAElB,EAAA,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,kBAAA,EAAoB,SAAS,OAAA,CAAQ,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAC5F,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,SAAA;AAAA,IACL,cAAA,CAAe;AAAA,MACb,CAAC,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MAC7B,CAAC,OAAA,EAAS,MAAA,CAAO,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,MACrC,CAAC,UAAA,EAAY,MAAA,CAAO,KAAA,CAAM,aAAa,CAAC,CAAA;AAAA,MACxC,CAAC,YAAA,EAAc,MAAA,CAAO,KAAA,CAAM,eAAe,CAAC,CAAA;AAAA,MAC5C,CAAC,iBAAA,EAAmB,MAAA,CAAO,KAAA,CAAM,MAAM,CAAC;AAAA,KACzC;AAAA,GACH;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,sBAAA,EAAwB,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAACH,MAAAA,MAAU,EAAE,KAAA,EAAOA,MAAAA,EAAK,CAAE,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AACA,EAAA,IAAI,MAAM,OAAA,EAAS;AACjB,IAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,sBAAA,EAAwB,KAAK,CAAC,CAAA;AAC7D,IAAA,MAAA,CAAO,SAAA,CAAU,UAAA,CAAW,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAACA,MAAAA,MAAU,EAAE,KAAA,EAAOA,MAAAA,EAAK,CAAE,CAAC,CAAC,CAAA;AAC3E,IAAA,MAAA,CAAO,SAAA,EAAU;AAAA,EACnB;AAEA,EAAA,MAAA,CAAO,SAAA,CAAU,aAAA,CAAc,uBAAA,EAAyB,KAAK,CAAC,CAAA;AAC9D,EAAA,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,KAAW,CAAA,EAAG;AAC7B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,KAAK,CAAC,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,MAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,IAAA,CACjB,GAAA,CAAI,CAAC,GAAA,KAAQ;AACZ,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAChC,QAAA,OAAO,WAAA,CAAY,IAAA,EAAM,IAAA,IAAQ,GAAA,EAAK,MAAM,GAAG,CAAA;AAAA,MACjD,CAAC,CAAA,CACA,IAAA,CAAK,IAAI,IAAA,CAAK,YAAY,CAAC,CAAA,CAAA,CAAG,CAAA;AACjC,MAAA,MAAA,CAAO,UAAU,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,IAC/C;AAAA,EACF;AACF;AAGO,SAAS,oBAAA,CAAqB,OAAyB,OAAA,EAAkC;AAC9F,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAAwB,KAAA,CAAM,MAAM,GAAA,CAAI,GAAG,GAAG,IAAA,IAAQ,GAAA;AACxE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,OAAA;AAAA,IACT,SAAA,EAAW,MAAM,KAAA,CAAM,KAAA;AAAA,IACvB,SAAA,EAAW,MAAM,KAAA,CAAM,aAAA;AAAA,IACvB,iBAAA,EAAmB,MAAM,KAAA,CAAM,aAAA;AAAA,IAC/B,MAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,MAAW;AAAA,MACnC,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MACzE,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,GAAA,CAAI,CAAC,GAAA,KAAQ,WAAA,CAAY,QAAA,CAAS,GAAG,CAAA,EAAG,KAAA,CAAM,GAAG,CAAC;AAAA,KACrE,CAAE,CAAA;AAAA,IACF,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY,EAAC;AAAA,IAClD,GAAI,MAAM,OAAA,GAAU,EAAE,SAAS,KAAA,CAAM,OAAA,KAAY;AAAC,GACpD;AACF;;;AC/SO,SAAS,cAAc,MAAA,EAAyB;AACrD,EAAA,OAAO,GAAG,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAC3C;ACOO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,IAAI,OAAA,CAAQ;AAAA,IACjB,2BAAA,EAA6B,IAAA;AAAA,IAC7B,eAAA,EAAiB;AAAA,MACf,OAAA,EAAS,IAAA;AAAA,MACT,OAAA,EAAS,KAAA;AAAA,MACT,GAAA,EAAKI,GAAG,OAAA,CAAQ,QAAA;AAAA,MAChB,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQA,GAAG,YAAA,CAAa;AAAA;AAC1B,GACD,CAAA;AACH;ACJA,eAAsB,UAAU,OAAA,EAAyC;AACvE,EAAA,MAAM,OAAA,GAAU,MAAM,EAAA,CAAG,OAAA,CAAQ,QAAA,EAAU;AAAA,IACzC,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,MAAA,EAAQ,IAAA;AAAA,IACR,mBAAA,EAAqB,KAAA;AAAA,IACrB,cAAA,EAAgB;AAAA,GACjB,CAAA;AACD,EAAA,OAAO,OAAA;AACT;AAGO,SAAS,aAAa,OAAA,EAAyB;AACpD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,YAAA,EAAc,EAAE,CAAA;AAChD,EAAA,IAAI,OAAA,KAAY,IAAI,OAAO,EAAA;AAC3B,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,IAAK,OAAA,CAAQ,QAAA,CAAS,GAAG,CAAA,GAAI,OAAA,GAAU,CAAA,GAAA,EAAM,OAAO,CAAA,GAAA,CAAA;AACrF,EAAA,OAAO,IAAA;AACT;;;AC5BqC,CAAA,GAAA,EAAM,iBAAA,CAAkB,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AActF,SAAS,aAAa,QAAA,EAA2B;AACtD,EAAA,OAAO,cAAA,CAAe,QAAQ,CAAA,KAAM,MAAA;AACtC;;;ACNA,eAAsB,oBAAoB,OAAA,EAA8C;AACtF,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CACzB,GAAA,CAAI,YAAY,CAAA,CAChB,MAAA,CAAO,CAAC,IAAA,KAAS,SAAS,EAAE,CAAA,CAC5B,MAAA,CAAO,CAAC,oBAAoB,CAAC,CAAA;AAEhC,EAAA,MAAM,KAAA,GAAQ,MAAM,SAAA,CAAU;AAAA,IAC5B,KAAK,OAAA,CAAQ,OAAA;AAAA,IACb,UAAU,OAAA,CAAQ,OAAA;AAAA,IAClB,MAAA,EAAQ;AAAA,GACT,CAAA;AAED,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,YAAY,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,aAAA,CAAc,CAAC,CAAC,CAAA;AACrE;;;ACrBO,SAAS,eAAe,UAAA,EAAoC;AACjE,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,gBAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,uBAAA,EAAwB;AAC/C,IAAA,MAAM,YAAA,GAAe,KAAK,eAAA,EAAgB;AAE1C,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,QAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,MAC9B,CAAA,MAAO;AACL,QAAA,cAAA,CAAe,KAAK,SAAS,CAAA;AAAA,MAC/B;AACA,MAAA;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,eAAe,YAAA,EAAc;AACtC,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,SAAA,IAAa,UAAA,CAAW,qBAAA,EAAsB,EAAG;AAC1D,IAAA,IAAI,CAAC,SAAA,CAAU,UAAA,EAAW,EAAG;AAC7B,IAAA,KAAA,MAAW,WAAA,IAAe,SAAA,CAAU,eAAA,EAAgB,EAAG;AACrD,MAAA,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA;AAAA,IAClC;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,UAAA,CAAW,YAAA,EAAa,EAAG;AAC1C,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAW,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,UAAA,CAAW,UAAA,EAAW,EAAG;AACzC,IAAA,IAAI,CAAC,GAAA,CAAI,UAAA,EAAW,EAAG;AACvB,IAAA,MAAM,IAAA,GAAO,IAAI,OAAA,EAAQ;AACzB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,EAAA,IAAM,UAAA,CAAW,QAAA,EAAS,EAAG;AACtC,IAAA,IAAI,CAAC,EAAA,CAAG,UAAA,EAAW,EAAG;AACtB,IAAA,MAAM,IAAA,GAAO,GAAG,OAAA,EAAQ;AACxB,IAAA,IAAI,IAAA,EAAM,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,EAC3B;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,aAAA,EAAc,EAAG;AAC9C,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAW,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,KAAA,MAAW,KAAA,IAAS,UAAA,CAAW,cAAA,EAAe,EAAG;AAC/C,IAAA,IAAI,CAAC,KAAA,CAAM,UAAA,EAAW,EAAG;AACzB,IAAA,KAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,EAC5B;AAEA,EAAA,MAAM,UAAA,GACJ,UAAA,CAAW,oBAAA,EAAqB,CAAE,MAAA,GAAS,KAC3C,UAAA,CAAW,YAAA,EAAa,CAAE,IAAA,CAAK,CAAC,EAAA,KAAO,GAAG,eAAA,EAAiB,CAAA,IAC3D,UAAA,CAAW,UAAA,EAAW,CAAE,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,eAAA,EAAiB,CAAA;AAE7D,EAAA,KAAA,CAAM,IAAA,EAAK;AACX,EAAA,OAAO,EAAE,KAAA,EAAO,UAAA,EAAY,cAAA,EAAgB,aAAA,EAAc;AAC5D;AC7DA,SAAS,YAAA,CACP,QAAA,EACA,KAAA,EACA,MAAA,EACiB;AACjB,EAAA,OAAO,KAAA,IAAS,KAAA,KAAU,QAAA,GACtB,EAAE,IAAA,EAAM,QAAA,EAAU,KAAA,EAAO,MAAA,EAAO,GAChC,EAAE,IAAA,EAAM,QAAA,EAAU,MAAA,EAAO;AAC/B;AAEO,SAAS,eAAe,UAAA,EAA6C;AAC1E,EAAA,MAAM,eAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,KAAK,uBAAA,EAAwB;AAAA,MAClC,IAAA,EAAM,QAAA;AAAA,MACN,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,MAC5B,UAAA,EAAY,IAAA,CACT,eAAA,EAAgB,CAChB,GAAA;AAAA,QAAI,CAAC,KAAA,KACJ,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAA,EAAa,EAAG,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAY;AAAA;AACnF,KACH,CAAA;AAAA,EACH;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,qBAAA,EAAsB,EAAG;AACrD,IAAA,MAAM,SAAA,GAAY,KAAK,uBAAA,EAAwB;AAC/C,IAAA,IAAI,CAAC,SAAA,EAAW;AAChB,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,SAAA;AAAA,MACL,IAAA,EAAM,aAAA;AAAA,MACN,UAAA,EAAY,KAAK,UAAA,EAAW;AAAA,MAC5B,UAAA,EAAY,IAAA,CACT,eAAA,EAAgB,CAChB,GAAA;AAAA,QAAI,CAAC,KAAA,KACJ,YAAA,CAAa,KAAA,CAAM,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAA,EAAa,EAAG,OAAA,EAAQ,EAAG,KAAA,CAAM,YAAY;AAAA;AACnF,KACH,CAAA;AAAA,EACH;AAEA,EAAA,MAAM,iBAAA,GAAoB,WACvB,oBAAA,CAAqB,UAAA,CAAW,uBAAuB,CAAA,CACvD,GAAA,CAAI,CAAC,IAAA,KAAS,IAA+B,CAAA;AAChD,EAAA,KAAA,MAAW,QAAQ,iBAAA,EAAmB;AACpC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,wBAAA,CAAyB,UAAA,CAAW,aAAa,CAAA;AACtE,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,YAAA,CAAa,IAAA,CAAK;AAAA,QAChB,GAAA,EAAK,QAAQ,cAAA,EAAe;AAAA,QAC5B,IAAA,EAAM,SAAA;AAAA,QACN,UAAA,EAAY,KAAA;AAAA,QACZ,YAAY;AAAC,OACd,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,UAAA,CAAW,oBAAA,CAAqB,UAAA,CAAW,cAAc,CAAA,EAAG;AAC7E,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,aAAA,EAAc,CAAE,OAAA,EAAQ;AAC5C,IAAA,IAAI,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,QAAA,EAAU;AACjD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,YAAA,EAAa,CAAE,CAAC,CAAA;AACtC,IAAA,IAAI,CAAC,QAAA,EAAU,MAAA,CAAO,UAAA,CAAW,aAAa,CAAA,EAAG;AACjD,IAAA,YAAA,CAAa,IAAA,CAAK;AAAA,MAChB,GAAA,EAAK,SAAS,cAAA,EAAe;AAAA,MAC7B,IAAA,EAAM,MAAA,KAAW,SAAA,GAAY,SAAA,GAAY,SAAA;AAAA,MACzC,UAAA,EAAY,KAAA;AAAA,MACZ,YAAY;AAAC,KACd,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,YAAA;AACT;;;AC7EO,SAAS,eAAe,UAAA,EAAoC;AACjE,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,UAAA,CAAW,YAAA,EAAa,CAAE,GAAA,CAAI,CAAC,EAAA,KAAO,EAAA,CAAG,OAAA,EAAQ,IAAK,WAAW,CAAA;AAAA,IAC5E,OAAA,EAAS,UAAA,CAAW,UAAA,EAAW,CAAE,GAAA,CAAI,CAAC,GAAA,KAAQ,GAAA,CAAI,OAAA,EAAQ,IAAK,WAAW,CAAA;AAAA,IAC1E,UAAA,EAAY,WAAW,aAAA,EAAc,CAAE,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,EAAS,CAAA;AAAA,IACrE,KAAA,EAAO,WAAW,QAAA,EAAS,CAAE,IAAI,CAAC,EAAA,KAAO,EAAA,CAAG,OAAA,EAAS,CAAA;AAAA,IACrD,WAAA,EAAa,WAAW,cAAA,EAAe,CAAE,IAAI,CAAC,KAAA,KAAU,KAAA,CAAM,OAAA,EAAS;AAAA,GACzE;AACF;;;ACHO,SAAS,eAAA,CAAgB,SAAkB,QAAA,EAA8B;AAC9E,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI;AACF,IAAA,UAAA,GAAa,OAAA,CAAQ,oBAAoB,QAAQ,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,cAAA,CAAe,QAAQ,CAAA,IAAK,IAAA;AAAA,MAClC,SAAS,EAAC;AAAA,MACV,OAAA,EAAS,EAAE,KAAA,EAAO,EAAC,EAAG,UAAA,EAAY,KAAA,EAAO,cAAA,EAAgB,EAAC,EAAG,aAAA,EAAe,EAAC,EAAE;AAAA,MAC/E,SAAS,EAAE,SAAA,EAAW,EAAC,EAAG,SAAS,EAAC,EAAG,UAAA,EAAY,IAAI,KAAA,EAAO,EAAC,EAAG,WAAA,EAAa,EAAC,EAAE;AAAA,MAClF,YAAY,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,KACnE;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,IAAA,EAAM,cAAA,CAAe,QAAQ,CAAA,IAAK,IAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU,CAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU,CAAA;AAAA,IAClC,OAAA,EAAS,eAAe,UAAU;AAAA,GACpC;AACF;AAGO,SAAS,SAAA,CAAU,SAAkB,SAAA,EAAmC;AAC7E,EAAA,OAAO,UAAU,GAAA,CAAI,CAAC,aAAa,eAAA,CAAgB,OAAA,EAAS,QAAQ,CAAC,CAAA;AACvE;;;ACtBO,SAAS,WAAW,KAAA,EAAiC;AAC1D,EAAA,MAAM,WAAW,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA;AAGvC,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,MAAM,cAAwB,EAAC;AAE/B,EAAA,KAAA,MAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,KAAA,GAAsD,CAAC,CAAC,KAAA,EAAO,CAAC,CAAC,CAAA;AACvE,IAAA,OAAA,CAAQ,IAAI,KAAK,CAAA;AAEjB,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AAClC,MAAA,IAAI,QAAQ,MAAA,EAAW;AACvB,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,GAAA;AACtB,MAAA,MAAM,SAAA,GAAY,CAAC,GAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,EAAG,CAAA;AAErD,MAAA,IAAI,KAAA,GAAQ,UAAU,MAAA,EAAQ;AAC5B,QAAA,GAAA,CAAI,CAAC,IAAI,KAAA,GAAQ,CAAA;AACjB,QAAA,MAAM,QAAA,GAAW,UAAU,KAAK,CAAA;AAChC,QAAA,IAAI,aAAa,MAAA,EAAW;AAC5B,QAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC1B,UAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,UAAA,KAAA,CAAM,IAAA,CAAK,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAAA,QAC1B;AAAA,MACF,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,GAAA,EAAI;AACV,QAAA,WAAA,CAAY,KAAK,IAAI,CAAA;AAAA,MACvB;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAoB;AAC5C,EAAA,MAAM,aAAyB,EAAC;AAEhC,EAAA,KAAA,IAAS,IAAI,WAAA,CAAY,MAAA,GAAS,CAAA,EAAG,CAAA,IAAK,GAAG,CAAA,EAAA,EAAK;AAChD,IAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,IAAA,IAAI,KAAA,KAAU,MAAA,IAAa,WAAA,CAAY,GAAA,CAAI,KAAK,CAAA,EAAG;AAEnD,IAAA,MAAM,YAAsB,EAAC;AAC7B,IAAA,MAAM,KAAA,GAAQ,CAAC,KAAK,CAAA;AACpB,IAAA,WAAA,CAAY,GAAA,CAAI,KAAA,EAAO,UAAA,CAAW,MAAM,CAAA;AAExC,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,MAAA,MAAM,IAAA,GAAO,MAAM,GAAA,EAAI;AACvB,MAAA,IAAI,SAAS,MAAA,EAAW;AACxB,MAAA,SAAA,CAAU,KAAK,IAAI,CAAA;AACnB,MAAA,KAAA,MAAW,YAAY,KAAA,CAAM,OAAA,CAAQ,IAAI,IAAI,CAAA,IAAK,EAAC,EAAG;AACpD,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,QAAQ,CAAA,EAAG;AAC9B,UAAA,WAAA,CAAY,GAAA,CAAI,QAAA,EAAU,UAAA,CAAW,MAAM,CAAA;AAC3C,UAAA,KAAA,CAAM,KAAK,QAAQ,CAAA;AAAA,QACrB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,EAC3B;AAEA,EAAA,MAAM,SAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,MAAM,MAAA,GAAS,UAAU,CAAC,CAAA;AAC1B,MAAA,IAAI,MAAA,KAAW,UAAa,KAAA,CAAM,OAAA,CAAQ,IAAI,MAAM,CAAA,EAAG,GAAA,CAAI,MAAM,CAAA,EAAG;AAClE,QAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,CAAC,MAAM,CAAA,EAAG,IAAA,EAAM,CAAC,MAAA,EAAQ,MAAM,CAAA,EAAG,CAAA;AAAA,MAC3D;AACA,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,GAAG,SAAS,EAAE,IAAA,EAAK;AACpC,IAAA,MAAM,YAAA,GAAe,IAAI,GAAA,CAAI,SAAS,CAAA;AACtC,IAAA,MAAMJ,MAAAA,GAAO,uBAAA,CAAwB,KAAA,EAAO,SAAA,EAAW,YAAY,CAAA;AACnE,IAAA,MAAA,CAAO,IAAA,CAAK,EAAE,OAAA,EAAS,IAAA,EAAMA,MAAAA,IAAQ,CAAC,OAAA,CAAQ,CAAC,CAAA,EAAI,OAAA,CAAQ,CAAC,CAAE,GAAG,CAAA;AAAA,EACnE;AAEA,EAAA,MAAA,CAAO,IAAA;AAAA,IACL,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAA,CAAQ,SAAS,CAAA,CAAE,OAAA,CAAQ,MAAA,IAAU,CAAA,CAAE,QAAQ,CAAC,CAAA,CAAG,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,CAAE;AAAA,GAC5F;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,uBAAA,CACP,KAAA,EACA,SAAA,EACA,YAAA,EACsB;AACtB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAY;AAC/B,EAAA,MAAMA,SAAiB,EAAC;AACxB,EAAA,IAAI,OAAA,GAA8B,UAAU,CAAC,CAAA;AAE7C,EAAA,KAAA,IAAS,KAAA,GAAQ,GAAG,KAAA,IAAS,SAAA,CAAU,SAAS,CAAA,IAAK,OAAA,KAAY,QAAW,KAAA,EAAA,EAAS;AACnF,IAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,GAAA,CAAI,OAAO,CAAA;AAC1C,IAAA,IAAI,eAAA,EAAiB;AACnB,MAAA,MAAM,KAAA,GAAQA,MAAAA,CAAK,OAAA,CAAQ,OAAO,CAAA;AAClC,MAAA,IAAI,KAAA,KAAU,IAAI,OAAO,MAAA;AACzB,MAAA,MAAM,KAAA,GAAQA,MAAAA,CAAK,KAAA,CAAM,KAAK,CAAA;AAC9B,MAAA,IAAI,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,KAAA,CAAM,OAAA,CAAQ,IAAI,OAAO,CAAA,EAAG,GAAA,CAAI,OAAO,CAAA,EAAG;AAChE,QAAA,KAAA,CAAM,KAAK,OAAO,CAAA;AAClB,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,MAAA;AAAA,IACT;AACA,IAAA,MAAA,CAAO,IAAI,OAAO,CAAA;AAClB,IAAAA,MAAAA,CAAK,KAAK,OAAO,CAAA;AAEjB,IAAA,MAAM,IAAA,GAAO,CAAC,GAAI,KAAA,CAAM,OAAA,CAAQ,IAAI,OAAO,CAAA,IAAK,EAAG,CAAA,CAAE,IAAA;AAAA,MAAK,CAAC,SAAA,KACzD,YAAA,CAAa,GAAA,CAAI,SAAS;AAAA,KAC5B;AACA,IAAA,OAAA,GAAU,IAAA;AAAA,EACZ;AAEA,EAAA,OAAO,MAAA;AACT;AC9FA,SAAS,eAAA,CAAgB,IAAA,EAAc,QAAA,EAAuB,OAAA,EAAqC;AACjG,EAAA,KAAA,MAAW,SAAA,IAAa,mBAAA,CAAoB,IAAI,CAAA,EAAG;AACjD,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AACtC,IAAA,IAAI,SAAS,GAAA,CAAI,GAAG,GAAG,OAAOA,KAAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EACxD;AACA,EAAA,MAAM,SAAA,GAAY,gBAAgB,IAAI,CAAA;AACtC,EAAA,IAAI,cAAc,IAAA,EAAM;AACtB,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,SAAA,EAAW,OAAO,CAAA;AAC7C,IAAA,IAAI,SAAS,GAAA,CAAI,UAAU,GAAG,OAAOA,KAAAA,CAAK,UAAU,SAAS,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,aAAa,QAAA,EAA2B;AAC/C,EAAA,IAAI;AACF,IAAAK,GAAAA,CAAG,WAAW,QAAQ,CAAA;AACtB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMA,SAAS,eAAA,CACP,SAAA,EACA,OAAA,EACA,OAAA,EACoB;AACpB,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAQ,GAAI,OAAA;AAE7B,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,IAAA,OAAOL,MAAK,OAAA,CAAQ,OAAA,EAAS,SAAA,CAAU,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,IAAI,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,EAAG;AAC7B,IAAA,OAAOA,KAAAA,CAAK,OAAA,CAAQ,OAAA,EAAS,SAAS,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,SAAA,EAAW,OAAO,CAAA;AACtD,EAAA,IAAI,WAAA,KAAgB,QAAW,OAAO,MAAA;AACtC,EAAA,OAAOA,KAAAA,CAAK,WAAW,WAAW,CAAA,GAAI,cAAcA,KAAAA,CAAK,OAAA,CAAQ,SAAS,WAAW,CAAA;AACvF;AAGA,SAAS,aAAA,CAAc,MAAc,OAAA,EAA8C;AACjF,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,OAAA;AAE9B,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AACtC,EAAA,IAAI,SAAS,GAAA,CAAI,QAAQ,GAAG,OAAOA,KAAAA,CAAK,UAAU,IAAI,CAAA;AAEtD,EAAA,MAAM,MAAA,GAAS,eAAA,CAAgB,IAAA,EAAM,QAAA,EAAU,OAAO,CAAA;AACtD,EAAA,IAAI,QAAQ,OAAO,MAAA;AAEnB,EAAA,IAAI,YAAA,CAAa,IAAI,CAAA,IAAKK,GAAAA,CAAG,SAAS,IAAI,CAAA,CAAE,aAAY,EAAG;AACzD,IAAA,MAAM,WAAA,GAAc,gBAAgBL,KAAAA,CAAK,IAAA,CAAK,MAAM,OAAO,CAAA,EAAG,UAAU,OAAO,CAAA;AAC/E,IAAA,IAAI,aAAa,OAAO,WAAA;AAAA,EAC1B;AAEA,EAAA,OAAO,MAAA;AACT;AAMO,SAAS,WAAA,CACd,SAAA,EACA,QAAA,EACA,OAAA,EACc;AACd,EAAA,MAAM,OAAO,eAAA,CAAgB,SAAA,EAAWA,MAAK,OAAA,CAAQ,QAAQ,GAAG,OAAO,CAAA;AAEvE,EAAA,IAAI,SAAS,MAAA,EAAW;AACtB,IAAA,MAAM,QAAA,GAAW,aAAA,CAAc,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,aAAa,MAAA,EAAW,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,MAAM,UAAA,EAAW;AAC1E,IAAA,IAAI,aAAa,IAAI,CAAA,EAAG,OAAO,EAAE,MAAM,UAAA,EAAW;AAAA,EACpD;AAEA,EAAA,MAAM,aAAa,SAAA,CAAU,UAAA,CAAW,GAAG,CAAA,IAAK,SAAA,CAAU,WAAW,GAAG,CAAA;AACxE,EAAA,MAAM,OAAA,GAAU,gBAAgB,SAAA,EAAWA,KAAAA,CAAK,QAAQ,QAAQ,CAAA,EAAG,OAAO,CAAA,KAAM,MAAA;AAChF,EAAA,IAAI,UAAA,IAAc,OAAA,EAAS,OAAO,EAAE,MAAM,YAAA,EAAa;AACvD,EAAA,OAAO,EAAE,MAAM,UAAA,EAAW;AAC5B;AAOO,SAAS,cAAA,CACd,QAAA,EACA,gBAAA,EACA,OAAA,EACkE;AAClE,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,WAAqB,EAAC;AAC5B,EAAA,MAAM,aAAuB,EAAC;AAE9B,EAAA,KAAA,MAAW,aAAa,gBAAA,EAAkB;AACxC,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,SAAA,EAAW,QAAA,EAAU,OAAO,CAAA;AACrD,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,UAAA,IAAc,IAAA,CAAK,QAAA,EAAU;AAC7C,MAAA,QAAA,CAAS,IAAA,CAAK,KAAK,QAAQ,CAAA;AAAA,IAC7B,CAAA,MAAA,IAAW,IAAA,CAAK,IAAA,KAAS,UAAA,EAAY;AACnC,MAAA,QAAA,CAAS,KAAK,SAAS,CAAA;AAAA,IACzB,CAAA,MAAO;AACL,MAAA,UAAA,CAAW,KAAK,SAAS,CAAA;AAAA,IAC3B;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,QAAA,EAAU,QAAA,EAAU,UAAA,EAAW;AAC1C;;;ACtIO,SAAS,UAAA,CACd,OAAA,EACA,SAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,WAAA,GAAc,SAAA,CAAU,OAAA,EAAS,SAAS,CAAA;AAEhD,EAAA,MAAM,KAAA,uBAAsC,GAAA,EAAI;AAChD,EAAA,MAAM,OAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,OAAA,uBAA0C,GAAA,EAAI;AACpD,EAAA,MAAM,QAAA,uBAA4C,GAAA,EAAI;AAEtD,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAIM,cAAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,eAAA,GAAkB,CAAA;AACtB,EAAA,IAAI,aAAA,GAAgB,CAAA;AAEpB,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,QAAQ,OAAO,CAAA;AAChD,IAAA,KAAA,CAAM,IAAI,GAAA,EAAK,EAAE,MAAM,MAAA,CAAO,IAAA,EAAM,QAAQ,CAAA;AAC5C,IAAA,IAAI,CAAC,OAAO,UAAA,EAAY,WAAA,EAAA;AAAA,EAC1B;AAEA,EAAA,KAAA,MAAW,UAAU,WAAA,EAAa;AAChC,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,IAAA,EAAM,QAAQ,OAAO,CAAA;AACpD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAEhC,IAAA,MAAM;AAAA,MACJ,QAAA;AAAA,MACA,QAAA,EAAU,kBAAA;AAAA,MACV;AAAA,KACF,GAAI,cAAA;AAAA,MACF,MAAA,CAAO,IAAA;AAAA,MACP,OAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,GAAG,CAAA;AAAA,MACrC;AAAA,KACF;AAEA,IAAAA,kBAAiB,QAAA,CAAS,MAAA;AAC1B,IAAA,eAAA,IAAmB,UAAA,CAAW,MAAA;AAC9B,IAAA,aAAA,IAAiB,kBAAA,CAAmB,MAAA;AAEpC,IAAA,KAAA,MAAW,UAAU,QAAA,EAAU;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,MAAA,EAAQ,OAAA,CAAQ,OAAO,CAAC,CAAA;AAAA,IAC9C;AAEA,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,QAAA,CAAS,GAAA,CAAI,OAAA,EAAS,IAAI,GAAA,CAAI,kBAAkB,CAAC,CAAA;AAAA,IACnD;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,OAAO,CAAA;AAC5B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,MAAM,YAAY,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAA,wBAAS,GAAA,EAAY;AACzD,MAAA,SAAA,CAAU,IAAI,OAAO,CAAA;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,QAAQ,SAAS,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAyB;AAAA,IAC7B,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAQ,EAAC;AAAA,IACT,KAAA,EAAO;AAAA,MACL,OAAO,WAAA,CAAY,MAAA;AAAA,MACnB,MAAA,EAAQ,WAAA;AAAA,MACR,aAAA,EAAAA,cAAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,MAAA,EAAQ;AAAA;AACV,GACF;AACA,EAAA,KAAA,CAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,EAAA,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,MAAA;AAClC,EAAA,OAAO,KAAA;AACT;;;ACtEA,eAAsB,YAAY,OAAA,EAAkD;AAClF,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,EAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB;AAAA,IAC1C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAA,EAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,IACxB,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,GACxB,CAAA;AACD,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW;AAAA,IAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,QAAA,EAAU,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAC;AAAA,GACpE,CAAA;AACD,EAAA,MAAM,WAAA,GAAc,MAAM,iBAAA,CAAkB,OAAA,CAAQ,OAAO,CAAA;AAC3D,EAAA,OAAO,EAAE,OAAO,SAAA,EAAW,WAAA,EAAa,YAAY,IAAA,CAAK,GAAA,KAAQ,OAAA,EAAQ;AAC3E;AAGO,SAAS,iBAAA,CAAkB,SAAiB,GAAA,EAAqB;AACtE,EAAA,OAAON,KAAAA,CAAK,WAAW,OAAO,CAAA,GAAI,UAAUA,KAAAA,CAAK,IAAA,CAAK,KAAK,OAAO,CAAA;AACpE;AAGO,SAAS,WAAA,CACd,KAAA,EACA,UAAA,EACA,OAAA,EACiB;AACjB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,UAAA,EAAY,OAAO,CAAA;AACvC,EAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,IAAA,MAAM,YAAA,CAAa,WAAA,CAAY,UAAA,EAAY,OAAO,CAAC,CAAA;AAAA,EACrD;AACA,EAAA,OAAO,EAAE,GAAA,EAAI;AACf;;;ACtCA,eAAsB,cAAA,CACpB,OAAA,EACA,OAAA,EACAO,IAAAA,EACmB;AACnB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAASA,IAAAA,CAAI,GAAG,CAAA;AACrD,EAAA,IAAI,CAAE,MAAM,UAAA,CAAW,UAAU,CAAA,EAAI;AACnC,IAAA,MAAM,IAAI,WAAA,CAAY,CAAA,gBAAA,EAAmB,OAAO,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA;AAAA,EACvE;AAEA,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,CAAC,OAAA,CAAQ,IAAI,CAAA;AAChD,EAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAE7B,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AACzB,EAAA,MAAM,UAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAEhE,EAAA,OAAA,CAAQ,KAAK,2BAA2B,CAAA;AACxC,EAAA,MAAM,EAAE,OAAO,WAAA,EAAa,UAAA,EAAY,YAAW,GAAI,MAAM,YAAY,OAAO,CAAA;AAEhF,EAAA,OAAA,CAAQ,KAAK,kBAAkB,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAC3B,EAAA,MAAM,SAAS,WAAA,CAAY;AAAA,IACzB,KAAA;AAAA,IACA,OAAA;AAAA,IACA,WAAA;AAAA,IACA,WAAW,WAAA,CAAY,KAAA,EAAO,UAAA,EAAY,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA;AAAA,IAC3D,UAAA;AAAA,IACA,UAAA,EAAY,cAAc,SAAA,GAAY,OAAA,CAAA;AAAA,IACtC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,GAClE,CAAA;AACD,EAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,SAAS,sBAAA,CAAuB,MAAA,EAAQA,IAAAA,CAAI,OAAA,EAASA,KAAI,GAAG,CAAA;AAClE,IAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AACtC,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AAEA,EAAA,mBAAA;AAAA,IACE,MAAA;AAAA,IACA;AAAA,MACE,KAAKA,IAAAA,CAAI,GAAA;AAAA,MACT,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,MACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAASA,IAAAA,CAAI;AAAA,KACf;AAAA,IACAA,IAAAA,CAAI;AAAA,GACN;AACA,EAAA,OAAO,QAAA,CAAS,OAAA;AAClB;;;AC/CA,IAAM,SAAA,GAAY,CAAC,KAAA,KAA0B,KAAA,CAAM,OAAA,CAAQ,OAAO,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AAE7F,IAAM,aAAA,GAAgB,CAAC,KAAA,KACrB,KAAA,CAAM,OAAA,CAAQ,MAAM,MAAM,CAAA,CAAE,OAAA,CAAQ,IAAA,EAAM,QAAQ,CAAA;AAEpD,IAAM,UAAA,GAAa,CAAC,KAAA,KAClB,KAAA,CACG,QAAQ,IAAA,EAAM,OAAO,CAAA,CACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,EACpB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA,CACtB,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAA;AAG1B,SAAS,WAAW,KAAA,EAAmC;AACrD,EAAA,OAAO,CAAC,GAAG,KAAA,CAAM,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC5C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,IAAK,CAAA;AACpC,IAAA,OAAO,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EACjC,CAAC,CAAA;AACH;AAEA,IAAM,SAAA,GAAY,CAAC,KAAA,EAAyB,GAAA,KAC1C,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,GAAA,EAAK,KAAA,CAAM,GAAG,CAAA;AAGpD,SAAS,aAAa,KAAA,EAAmC;AACvD,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,EAAA,KAAA,MAAW,KAAA,IAAS,MAAM,MAAA,EAAQ;AAChC,IAAA,KAAA,MAAW,MAAA,IAAU,MAAM,OAAA,EAAS;AAClC,MAAA,IAAI,MAAM,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG,OAAA,CAAQ,IAAI,MAAM,CAAA;AAAA,IACjD;AAAA,EACF;AACA,EAAA,OAAO,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,SAAA,CAAU,KAAA,EAAO,CAAC,CAAA,CAAE,aAAA,CAAc,UAAU,KAAA,EAAO,CAAC,CAAC,CAAC,CAAA;AAC3F;AAGA,SAAS,cAAc,KAAA,EAAkD;AACvE,EAAA,MAAM,QAAiC,EAAC;AACxC,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,OAAO,CAAA,IAAK,MAAM,KAAA,EAAO;AAC3C,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,IAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,MAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,MAAM,CAAA,EAAG;AAC9B,MAAA,KAAA,CAAM,IAAA,CAAK,CAAC,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC7B;AAAA,EACF;AACA,EAAA,OAAO,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAC1B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,KAAA,EAAO,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,aAAA,CAAc,SAAA,CAAU,KAAA,EAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AACxE,IAAA,OAAO,IAAA,KAAS,CAAA,GAAI,IAAA,GAAO,SAAA,CAAU,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA,CAAE,cAAc,SAAA,CAAU,KAAA,EAAO,CAAA,CAAE,CAAC,CAAC,CAAC,CAAA;AAAA,EACxF,CAAC,CAAA;AACH;AAGO,SAAS,mBAAmB,KAAA,EAAiC;AAClE,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAoB,IAAA,CAAK,IAAI,CAAC,GAAA,EAAK,KAAA,KAAU,CAAC,GAAA,EAAK,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAC,CAAC,CAAA;AAEpF,EAAA,MAAM,KAAA,GAAkB,CAAC,cAAc,CAAA;AACvC,EAAA,KAAA,CAAM,KAAK,6DAA6D,CAAA;AACxE,EAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAC,CAAA,EAAA,EAAK,aAAA,CAAc,SAAA,CAAU,KAAA,EAAO,GAAG,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAAA,EAC/E;AACA,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAK,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAC,CAAA,KAAA,EAAQ,OAAA,CAAQ,GAAA,CAAI,MAAM,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,UAAU,YAAA,CAAa,KAAK,CAAA,CAC/B,GAAA,CAAI,CAAC,GAAA,KAAQ,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAC,CAAA,CAC7B,MAAA,CAAO,CAAC,EAAA,KAAqB,OAAO,MAAS,CAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,IAAA,KAAA,CAAM,KAAK,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,GAAG,CAAC,CAAA,OAAA,CAAS,CAAA;AAAA,EAClD;AAEA,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5B;AAGO,SAAS,eAAe,KAAA,EAAiC;AAC9D,EAAA,MAAM,KAAA,GAAkB;AAAA,IACtB,kBAAA;AAAA,IACA,eAAA;AAAA,IACA,wGAAA;AAAA,IACA;AAAA,GACF;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,UAAA,CAAW,KAAK,CAAA,EAAG;AACnC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,MAAM,SAAA,CAAU,KAAK,CAAC,CAAA,UAAA,EAAa,SAAA,CAAU,KAAK,CAAC,CAAA,GAAA,CAAK,CAAA;AAAA,EACrE;AACA,EAAA,KAAA,MAAW,CAAC,MAAA,EAAQ,MAAM,CAAA,IAAK,aAAA,CAAc,KAAK,CAAA,EAAG;AACnD,IAAA,KAAA,CAAM,IAAA;AAAA,MACJ,CAAA,GAAA,EAAM,SAAA,CAAU,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA,MAAA,EAAS,SAAA,CAAU,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA,EAAA;AAAA,KACvF;AAAA,EACF;AACA,EAAA,KAAA,MAAW,GAAA,IAAO,YAAA,CAAa,KAAK,CAAA,EAAG;AACrC,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,EAAO,GAAG,CAAA;AAClC,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,SAAA,CAAU,KAAK,CAAC,CAAA,kCAAA,CAAoC,CAAA;AAAA,EACvE;AACA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AAC5B;AAGO,SAAS,gBAAgB,KAAA,EAAiC;AAC/D,EAAA,MAAM,IAAA,GAAO,WAAW,KAAK,CAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,cAAc,KAAK,CAAA;AACjC,EAAA,MAAM,OAAA,GAAU,aAAa,KAAK,CAAA;AAElC,EAAA,MAAM,UAAA,GAAa,MAAM,MAAA,CACtB,GAAA;AAAA,IAAI,CAAC,KAAA,KACJ,KAAA,CAAM,IAAA,CACH,MAAA,CAAO,CAAC,GAAA,KAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAC,EACpC,GAAA,CAAI,CAAC,GAAA,KAAQ,UAAA,CAAW,SAAA,CAAU,KAAA,EAAO,GAAG,CAAC,CAAC,CAAA,CAC9C,IAAA,CAAK,WAAW;AAAA,IAEpB,MAAA,CAAO,CAAC,IAAA,KAAS,IAAA,CAAK,SAAS,CAAC,CAAA;AAEnC,EAAA,MAAM,WAAW,KAAA,CACd,GAAA;AAAA,IACC,CAAC,CAAC,MAAA,EAAQ,MAAM,CAAA,KACd,CAAA,cAAA,EAAiB,WAAW,SAAA,CAAU,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA,yBAAA,EAA4B,UAAA,CAAW,UAAU,KAAA,EAAO,MAAM,CAAC,CAAC,CAAA,UAAA;AAAA,GACzH,CACC,KAAK,IAAI,CAAA;AAEZ,EAAA,MAAM,SAAA,GACJ,UAAA,CAAW,MAAA,GAAS,CAAA,GAChB,WAAW,GAAA,CAAI,CAAC,IAAA,KAAS,CAAA,gBAAA,EAAmB,IAAI,CAAA,YAAA,CAAc,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA,GACzE,8BAAA;AAEN,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAAA,EA6BkB,KAAK,MAAM,CAAA;AAAA,yBAAA,EACX,MAAM,MAAM,CAAA;AAAA,yBAAA,EACZ,KAAA,CAAM,OAAO,MAAM,CAAA;AAAA;;AAAA;AAAA,MAAA,EAItC,SAAS,CAAA;AAAA,kCAAA,EACmB,QAAQ,GAAA,CAAI,UAAU,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;;AAAA;AAAA,sCAAA,EAG9B,WAAW,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAE,SAAS,CAAA;AAAA;AAAA;AAAA;;AAAA,aAAA,EAKxE,MAAM,MAAM,CAAA;AAAA;AAAA;AAAA;AAAA,EAIzB,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAMV;;;AC3KA,SAAS,IAAA,CACP,KAAA,EACA,QAAA,EACA,KAAA,EACA,UACA,GAAA,EACU;AACV,EAAA,MAAM,IAAA,mBAAO,IAAI,GAAA,CAAY,CAAC,QAAQ,CAAC,CAAA;AACvC,EAAA,MAAM,QAAoB,CAAC,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AACtD,EAAA,MAAM,UAAkD,EAAC;AAEzD,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,IAAI,OAAA,CAAQ,QAAQ,QAAA,EAAU;AAC5B,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,EAAG,QAAQ,OAAA,CAAQ,GAAA;AAC/D,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,CAAY,QAAA,EAAU,GAAG,CAAA,EAAG,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAO,CAAA;AAAA,IACzE;AACA,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,KAAA,IAAS,QAAA,EAAU;AAEzD,IAAA,KAAA,MAAW,aAAa,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,IAAK,EAAC,EAAG;AACpD,MAAA,IAAI,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,EAAG;AACzB,MAAA,IAAA,CAAK,IAAI,SAAS,CAAA;AAClB,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAAA,IACzD;AAAA,EACF;AAEA,EAAA,OAAO,OAAA,CACJ,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAA,IAAS,CAAA,CAAE,KAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAChE,IAAI,CAAC,KAAA,KAAU,MAAM,IAAI,CAAA;AAC9B;AAIA,SAAS,iBAAA,CACP,KAAA,EACA,QAAA,EACA,OAAA,EACA,UACA,GAAA,EACkB;AAClB,EAAA,MAAM,KAAA,GAAQ,OAAA,GAAU,KAAA,CAAM,OAAA,GAAU,KAAA,CAAM,OAAA;AAC9C,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,EAAA,MAAM,OAAA,mBAAU,IAAI,GAAA,CAAY,CAAC,QAAQ,CAAC,CAAA;AAC1C,EAAA,MAAM,QAAoB,CAAC,EAAE,KAAK,QAAA,EAAU,KAAA,EAAO,GAAG,CAAA;AACtD,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAAyB;AAEpD,EAAA,OAAO,KAAA,CAAM,SAAS,CAAA,EAAG;AACvB,IAAA,MAAM,OAAA,GAAU,MAAM,KAAA,EAAM;AAC5B,IAAA,IAAI,CAAC,OAAA,EAAS;AACd,IAAA,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,OAAA,CAAQ,GAAG,CAAA,EAAG,IAAA,IAAQ,OAAA,CAAQ,GAAG,CAAA;AACxE,IAAA,IAAI,QAAA,KAAa,MAAA,IAAa,OAAA,CAAQ,KAAA,IAAS,QAAA,EAAU;AAEzD,IAAA,MAAM,OAAA,uBAAc,GAAA,EAAY;AAChC,IAAA,KAAA,MAAW,aAAa,KAAA,CAAM,GAAA,CAAI,QAAQ,GAAG,CAAA,IAAK,EAAC,EAAG;AACpD,MAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAC3B,QAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,QAAA,KAAA,CAAM,IAAA,CAAK,EAAE,GAAA,EAAK,SAAA,EAAW,OAAO,OAAA,CAAQ,KAAA,GAAQ,GAAG,CAAA;AAAA,MACzD;AAAA,IACF;AACA,IAAA,IAAI,QAAQ,IAAA,GAAO,CAAA,iBAAkB,GAAA,CAAI,OAAA,CAAQ,KAAK,OAAO,CAAA;AAAA,EAC/D;AAEA,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,gBAAgB,MAAA,EAAQ,KAAA,CAAM,QAAQ,GAAA,EAAI;AACnE;AAGA,SAAS,WAAA,CACP,MAAA,EACA,KAAA,EACA,MAAA,EACM;AACN,EAAA,MAAM,QAAA,GACJ,MAAA,KAAW,SAAA,GACP,kBAAA,CAAmB,KAAK,CAAA,GACxB,MAAA,KAAW,KAAA,GACT,cAAA,CAAe,KAAK,CAAA,GACpB,eAAA,CAAgB,KAAK,CAAA;AAC7B,EAAA,MAAA,CAAO,MAAM,QAAQ,CAAA;AACvB;AAEA,eAAsB,YAAA,CACpB,OAAA,EACA,OAAA,EACAA,IAAAA,EACmB;AACnB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,OAAO,MAAA,GAAS,UAAA,CAAA;AAC1D,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,KAAW,UAAU,CAAA;AACxD,EAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,EAAA,MAAM,MAAMA,IAAAA,CAAI,GAAA;AAEhB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,CAAmB,GAAA,EAAK,QAAQ,MAAM,CAAA;AAE5D,IAAA,OAAA,CAAQ,KAAK,gBAAgB,CAAA;AAC7B,IAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAM,YAAY,OAAO,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ;AAAA,MACZ,OAAO,KAAA,CAAM,KAAA;AAAA,MACb,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,OAAO,KAAA,CAAM,KAAA;AAAA,MACb;AAAA,KACF;AAEA,IAAA,IAAI,MAAA,KAAW,SAAA,IAAa,MAAA,KAAW,KAAA,IAAS,WAAW,MAAA,EAAQ;AACjE,MAAA,IAAI,WAAA;AACJ,MAAA,IAAI,OAAA,EAAS;AACX,QAAA,MAAMC,WAAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,GAAG,CAAA;AACjD,QAAA,MAAM,EAAE,KAAAC,IAAAA,EAAI,GAAI,YAAY,KAAA,EAAOD,WAAAA,EAAY,QAAQ,OAAO,CAAA;AAC9D,QAAA,WAAA,GAAc,kBAAkB,KAAA,EAAOC,IAAAA,EAAK,QAAQ,OAAA,EAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AAAA,MACjF,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,uBAAY,GAAA,EAAoB;AACtC,QAAA,KAAA,MAAW,CAACA,IAAAA,EAAK,IAAI,CAAA,IAAK,KAAA,CAAM,OAAO,KAAA,CAAM,GAAA,CAAIA,IAAAA,EAAK,IAAA,CAAK,IAAI,CAAA;AAC/D,QAAA,WAAA,GAAc,EAAE,OAAO,KAAA,EAAO,KAAA,CAAM,SAAS,MAAA,EAAQ,KAAA,CAAM,QAAQ,GAAA,EAAI;AAAA,MACzE;AACA,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,WAAA,CAAY,MAAA,EAAQ,WAAA,EAAaF,IAAAA,CAAI,MAAM,CAAA;AAC3C,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAEA,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,MAAM,MAAA,GAAS,oBAAA,CAAqB,KAAA,EAAOA,IAAAA,CAAI,OAAO,CAAA;AACtD,QAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,MACxC,CAAA,MAAO;AACL,QAAA,iBAAA;AAAA,UACE,KAAA;AAAA,UACA;AAAA,YACE,GAAA;AAAA,YACA,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AAAA,YACjC,SAAS,OAAA,CAAQ,OAAA;AAAA,YACjB,SAASA,IAAAA,CAAI;AAAA,WACf;AAAA,UACAA,IAAAA,CAAI;AAAA,SACN;AAAA,MACF;AACA,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAEA,IAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,OAAA,EAAS,GAAG,CAAA;AACjD,IAAA,MAAM,EAAE,GAAA,EAAI,GAAI,YAAY,KAAA,EAAO,UAAA,EAAY,QAAQ,OAAO,CAAA;AAC9D,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAO,GAAA,EAAK,MAAM,OAAA,EAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AACrE,IAAA,MAAM,UAAA,GAAa,KAAK,KAAA,EAAO,GAAA,EAAK,MAAM,OAAA,EAAS,OAAA,CAAQ,OAAO,GAAG,CAAA;AAErE,IAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,IAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,MAAA,MAAM,MAAA,GAAS,oBAAA;AAAA,QACb;AAAA,UACE,GAAG,KAAA;AAAA,UACH,GAAI,QAAQ,OAAA,GAAU,EAAE,SAAS,UAAA,EAAW,GAAI,EAAE,OAAA,EAAS,UAAA;AAAW,SACxE;AAAA,QACAA,IAAAA,CAAI;AAAA,OACN;AACA,MAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAM,CAAC,CAAA;AAAA,IACxC,CAAA,MAAO;AACL,MAAA,iBAAA;AAAA,QACE;AAAA,UACE,GAAG,KAAA;AAAA,UACH,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,KAAA,CAAA,GAAY,UAAA;AAAA,UACvC,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,UAAA,GAAa,KAAA;AAAA,SAC1C;AAAA,QACA,EAAE,GAAA,EAAK,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,OAAA,EAASA,IAAAA,CAAI,OAAA,EAAQ;AAAA,QAC1FA,IAAAA,CAAI;AAAA,OACN;AAAA,IACF;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf;AACF;ACrMO,SAAS,cAAc,OAAA,EAA+D;AAC3F,EAAA,IAAI,CAAC,OAAA,IAAW,CAAC,OAAA,CAAQ,OAAO,KAAA,EAAO;AACrC,IAAA,OAAO,EAAE,OAAO,MAAM;AAAA,IAAC,CAAA,EAAG,MAAM,MAAM;AAAA,IAAC,CAAA,EAAE;AAAA,EAC3C;AACA,EAAA,IAAI,QAAA;AACJ,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,EAAoB;AACxB,MAAA,QAAA,GAAW,GAAA,CAAI,IAAI,CAAA,CAAE,KAAA,EAAM;AAAA,IAC7B,CAAA;AAAA,IACA,IAAA,GAAa;AACX,MAAA,QAAA,EAAU,IAAA,EAAK;AACf,MAAA,QAAA,GAAW,MAAA;AAAA,IACb;AAAA,GACF;AACF;;;ACUA,eAAsB,aAAA,CACpB,SACAA,IAAAA,EACmB;AACnB,EAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA;AACxC,EAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAM;AACjC,EAAA,MAAM,OAAA,GAAU,cAAc,KAAK,CAAA;AACnC,EAAA,OAAA,CAAQ,MAAM,2BAAsB,CAAA;AACpC,EAAA,MAAM,UAAyB,EAAC;AAChC,EAAA,MAAM,KAAA,GAAQ,CAAC,KAAA,EAAe,KAAA,EAA+B,MAAA,KAA0B;AACrF,IAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,KAAA,EAAO,KAAA,EAAO,QAAQ,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,IAAI;AACF,IAAA,KAAA,CAAM,iBAAA,EAAmB,IAAA,EAAM,OAAA,CAAQ,OAAO,CAAA;AAE9C,IAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgBA,IAAAA,CAAI,GAAG,CAAA;AACjD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,KAAA,CAAM,gBAAgB,IAAA,EAAMP,KAAAA,CAAK,SAASO,IAAAA,CAAI,GAAA,EAAK,WAAW,CAAC,CAAA;AAAA,IACjE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,cAAA,EAAgB,QAAQ,4CAA4C,CAAA;AAAA,IAC5E;AAEA,IAAA,IAAI,OAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAM,UAAA,CAAWA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AACvD,MAAA,KAAA;AAAA,QACE,eAAA;AAAA,QACA,IAAA;AAAA,QACA,MAAA,CAAO,aAAaP,KAAAA,CAAK,QAAA,CAASO,KAAI,GAAA,EAAK,MAAA,CAAO,UAAU,CAAA,GAAI;AAAA,OAClE;AACA,MAAA,OAAA,GAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAAA,IAC5D,SAAS,KAAA,EAAO;AACd,MAAA,KAAA,CAAM,eAAA,EAAiB,QAAQ,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AACrF,MAAA,aAAA,CAAc,OAAA,EAASA,MAAK,KAAK,CAAA;AACjC,MAAA,OAAO,QAAA,CAAS,aAAA;AAAA,IAClB;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,KAAA,CAAM,eAAA,EAAiB,MAAMP,KAAAA,CAAK,QAAA,CAASO,KAAI,GAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,IAAI,CAAC,CAAA;AAAA,IAC5E,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,eAAA,EAAiB,QAAQ,2CAAsC,CAAA;AAAA,IACvE;AAEA,IAAA,MAAM,UAAU,eAAA,EAAgB;AAChC,IAAA,MAAM,SAAA,GAAY,MAAM,mBAAA,CAAoB;AAAA,MAC1C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,OAAA,EAAS,QAAQ,MAAA,CAAO,OAAA;AAAA,MACxB,MAAA,EAAQ,QAAQ,MAAA,CAAO;AAAA,KACxB,CAAA;AACD,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AACxB,MAAA,KAAA,CAAM,cAAA,EAAgB,IAAA,EAAM,CAAA,EAAG,SAAA,CAAU,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,cAAA,EAAgB,QAAQ,2CAA2C,CAAA;AAAA,IAC3E;AAEA,IAAA,IAAI,OAAO,IAAA,CAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG;AAC3C,MAAA,KAAA,CAAM,cAAA,EAAgB,MAAM,CAAA,EAAG,MAAA,CAAO,KAAK,OAAA,CAAQ,OAAO,CAAA,CAAE,MAAM,CAAA,WAAA,CAAa,CAAA;AAAA,IACjF;AAEA,IAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,OAAA,EAAS,SAAA,EAAW;AAAA,MAC3C,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,SAAS,OAAA,CAAQ,OAAA;AAAA,MACjB,QAAA,EAAU,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,CAAA,KAAM,OAAA,CAAQ,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAC,CAAC;AAAA,KACpE,CAAA;AAED,IAAA,MAAM,EAAE,OAAM,GAAI,KAAA;AAClB,IAAA,MAAM,YAAY,KAAA,CAAM,KAAA,KAAU,IAAI,CAAA,GAAI,KAAA,CAAM,SAAS,KAAA,CAAM,KAAA;AAC/D,IAAA,IAAI,aAAa,IAAA,EAAM;AACrB,MAAA,KAAA,CAAM,OAAA,EAAS,MAAM,0BAA0B,CAAA;AAAA,IACjD,CAAA,MAAA,IAAW,aAAa,GAAA,EAAK;AAC3B,MAAA,KAAA,CAAM,SAAS,MAAA,EAAQ,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChF,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,SAAS,MAAA,EAAQ,CAAA,EAAG,MAAM,KAAA,GAAQ,KAAA,CAAM,MAAM,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAChF;AAEA,IAAA,IAAI,KAAA,CAAM,oBAAoB,CAAA,EAAG;AAC/B,MAAA,KAAA,CAAM,mBAAA,EAAqB,MAAM,+BAA+B,CAAA;AAAA,IAClE,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,mBAAA,EAAqB,MAAA,EAAQ,CAAA,EAAG,KAAA,CAAM,eAAe,CAAA,qBAAA,CAAuB,CAAA;AAAA,IACpF;AAEA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,MAAA,KAAA,CAAM,uBAAA,EAAyB,MAAM,YAAY,CAAA;AAAA,IACnD,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,uBAAA,EAAyB,MAAA,EAAQ,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,eAAA,CAAiB,CAAA;AAAA,IACzE;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,IAAA,EAAK;AAAA,EACf;AAEA,EAAA,aAAA,CAAc,OAAA,EAASA,MAAK,KAAK,CAAA;AACjC,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAACG,MAAAA,KAAUA,MAAAA,CAAM,UAAU,MAAM,CAAA;AAC7D,EAAA,MAAM,SAAS,OAAA,CAAQ,IAAA,CAAK,CAACA,MAAAA,KAAUA,MAAAA,CAAM,UAAU,MAAM,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,MAAA,GACZ,EAAE,IAAA,EAAM,KAAK,OAAO,CAAA,EAAG,IAAA,EAAM,2BAAA,EAA6B,OAAOP,KAAAA,CAAM,GAAA,EAAI,GAC3E,MAAA,GACE,EAAE,IAAA,EAAM,IAAA,CAAK,SAAS,CAAA,EAAG,IAAA,EAAM,iCAAA,EAAmC,KAAA,EAAOA,KAAAA,CAAM,QAAO,GACtF,EAAE,IAAA,EAAM,IAAA,CAAK,MAAM,CAAA,EAAG,IAAA,EAAM,oBAAA,EAAsB,KAAA,EAAOA,MAAM,KAAA,EAAM;AAC3E,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,OAAA,CAAQ,IAAI,IAAI,OAAA,CAAQ,IAAA;AACxE,EAAAI,IAAAA,CAAI,OAAO,SAAA,CAAU,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AACrD,EAAA,OAAO,MAAA,GAAS,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAC9C;AAEA,SAAS,aAAA,CAAc,OAAA,EAAwBA,IAAAA,EAAqB,KAAA,EAAsB;AACxF,EAAA,MAAM,KAAA,GAAmB,EAAE,KAAA,EAAM;AACjC,EAAAA,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAU,WAAA,CAAY,EAAE,KAAA,EAAO,sBAAA,EAAwB,OAAA,EAASA,IAAAA,CAAI,OAAA,EAAS,KAAA,EAAO,CAAC,CAAA;AAChG,EAAAA,IAAAA,CAAI,OAAO,SAAA,EAAU;AAErB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,KAAA,CAAM,KAAA,CAAM,MAAM,CAAC,CAAA;AACpE,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,SAAA,GACJ,KAAA,CAAM,KAAA,KAAU,IAAA,GACZ,KAAK,MAAM,CAAA,GACX,KAAA,CAAM,KAAA,KAAU,MAAA,GACd,IAAA,CAAK,SAAS,CAAA,GACd,KAAK,OAAO,CAAA;AACpB,IAAA,MAAM,OAAA,GACJ,KAAA,CAAM,KAAA,KAAU,IAAA,GAAOJ,KAAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,KAAU,MAAA,GAASA,KAAAA,CAAM,MAAA,GAASA,KAAAA,CAAM,GAAA;AACrF,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQ,OAAA,CAAQ,SAAS,CAAA,GAAI,SAAA;AAChD,IAAA,MAAM,MAAA,GAAS,MAAM,MAAA,GAAS,CAAA,CAAA,EAAI,IAAI,KAAA,CAAM,MAAA,EAAQ,KAAK,CAAC,CAAA,CAAA,GAAK,EAAA;AAC/D,IAAAI,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAU,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAA;AAAA,EACtE;AACA,EAAAA,IAAAA,CAAI,OAAO,SAAA,EAAU;AACvB;ACvIA,IAAM,UAAA,GAAa,sDAAA;AAEnB,SAAS,YAAY,IAAA,EAAwC;AAC3D,EAAA,MAAM,OAAA,GAAU,OAAO,EAAE,GAAG,gBAAe,GAAI,EAAE,OAAA,EAAS,cAAA,CAAe,OAAA,EAAQ;AACjF,EAAA,OAAO,EAAE,GAAG,OAAA,EAAS,OAAA,EAAS,UAAA,EAAW;AAC3C;AAGA,SAAS,OAAA,CAAQ,OAAgB,MAAA,EAAwB;AACvD,EAAA,IAAI,KAAA,KAAU,QAAW,OAAO,WAAA;AAChC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAC/B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,OAAA,CAAQ,IAAA,EAAM,CAAA,EAAG,MAAM,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,IAAA,CAAK,CAAA;AAAA,EAAM,MAAM,CAAA,EAAA,CAAI,CAAA;AACrF,IAAA,OAAO,CAAA;AAAA,EAAM,MAAM,KAAK,KAAK;AAAA,EAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AAC/C,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,CAAE,MAAA;AAAA,MAC/D,CAAC,GAAG,KAAK,MAAM,KAAA,KAAU;AAAA,KAC3B;AACA,IAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AACjC,IAAA,MAAM,QAAQ,OAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAG,GAAG,CAAA,EAAA,EAAK,OAAA,CAAQ,OAAO,CAAA,EAAG,MAAM,IAAI,CAAC,CAAA,CAAE,EAChE,IAAA,CAAK,CAAA;AAAA,EAAM,MAAM,CAAA,EAAA,CAAI,CAAA;AACxB,IAAA,OAAO,CAAA;AAAA,EAAM,MAAM,KAAK,KAAK;AAAA,EAAK,MAAM,CAAA,CAAA,CAAA;AAAA,EAC1C;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAEA,SAAS,UAAU,IAAA,EAAuB;AACxC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,OAAO,CAAA;;AAAA;AAAA,WAAA,EAGE,IAAA,CAAK,SAAA,CAAU,cAAA,CAAe,OAAO,CAAC,CAAA;AAAA;;AAAA;AAAA,CAAA;AAAA,EAKjD;AACA,EAAA,MAAM,OAAO,OAAA,CAAQ,EAAE,GAAG,cAAA,IAAkB,IAAI,CAAA;AAChD,EAAA,OAAO,CAAA;;AAAA,6BAAA,EAEsB,IAAI,CAAA;;AAAA;AAAA,CAAA;AAInC;AAEA,eAAsB,WAAA,CAAY,SAAsBA,IAAAA,EAAwC;AAC9F,EAAA,MAAM,QAAQ,EAAE,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAE;AACnD,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,EAAA,GAAK,kBAAA,GAAqB,oBAAA;AACnD,EAAA,MAAM,MAAA,GAASP,KAAAA,CAAK,IAAA,CAAKO,IAAAA,CAAI,KAAK,QAAQ,CAAA;AAE1C,EAAA,IAAI;AACF,IAAA,MAAMF,EAAAA,CAAG,OAAO,MAAM,CAAA;AACtB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAClB,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQF,KAAAA,CAAM,GAAA,CAAI,KAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA;AAClE,MAAAI,KAAI,MAAA,CAAO,SAAA,CAAU,GAAG,IAAI,CAAA,CAAA,EAAI,QAAQ,CAAA,8CAAA,CAAgD,CAAA;AACxF,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,OAAA,GAAU,QAAQ,EAAA,GACpB,SAAA,CAAU,QAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA,GAC/B,CAAA,EAAG,KAAK,SAAA,CAAU,WAAA,CAAY,QAAQ,OAAA,CAAQ,IAAI,CAAC,CAAA,EAAG,IAAA,EAAM,CAAC,CAAC;AAAA,CAAA;AAElE,EAAA,IAAI;AACF,IAAA,MAAMF,EAAAA,CAAG,SAAA,CAAU,MAAA,EAAQ,OAAA,EAAS,MAAM,CAAA;AAC1C,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQF,KAAAA,CAAM,KAAA,CAAM,KAAK,MAAM,CAAC,CAAA,GAAI,IAAA,CAAK,MAAM,CAAA;AAClE,IAAAI,KAAI,MAAA,CAAO,SAAA,CAAU,GAAG,IAAI,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AAChD,IAAAA,KAAI,MAAA,CAAO,SAAA;AAAA,MACT,CAAA,EAAA,EAAK,GAAA,CAAI,0DAAA,EAA4D,KAAK,CAAC,CAAA;AAAA,KAC7E;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,GAAQJ,KAAAA,CAAM,GAAA,CAAI,KAAK,OAAO,CAAC,CAAA,GAAI,IAAA,CAAK,OAAO,CAAA;AAClE,IAAAI,KAAI,MAAA,CAAO,SAAA;AAAA,MACT,CAAA,EAAG,IAAI,CAAA,iBAAA,EAAoB,QAAQ,CAAA,EAAA,EAAK,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAAA,KAChG;AACA,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB;AACF;ACrFA,IAAM,aAAA,GAAgB,CAAC,aAAA,EAAe,MAAA,EAAQ,QAAQ,CAAA;AAEtD,SAAS,GAAA,CAAI,MAAgB,GAAA,EAAqB;AAChD,EAAA,OAAO,YAAA,CAAa,OAAO,IAAA,EAAM;AAAA,IAC/B,GAAA;AAAA,IACA,QAAA,EAAU,MAAA;AAAA,IACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,MAAM;AAAA,GACjC,EAAE,IAAA,EAAK;AACV;AAEA,SAAS,SAAA,CAAU,KAAa,GAAA,EAAsB;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,GAAA,CAAI,CAAC,aAAa,UAAA,EAAY,GAAG,GAAG,GAAG,CAAA;AACnD,IAAA,OAAO,IAAI,MAAA,GAAS,CAAA;AAAA,EACtB,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAGO,SAAS,WAAA,CAAY,KAAa,SAAA,EAA4B;AACnE,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAI,CAAC,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA,EAAG;AAC9B,MAAA,MAAM,IAAI,WAAA,CAAY,CAAA,mBAAA,EAAsB,SAAS,CAAA,CAAA,EAAI,SAAS,QAAQ,CAAA;AAAA,IAC5E;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,KAAA,MAAW,aAAa,aAAA,EAAe;AACrC,IAAA,IAAI,SAAA,CAAU,SAAA,EAAW,GAAG,CAAA,EAAG,OAAO,SAAA;AAAA,EACxC;AACA,EAAA,MAAM,IAAI,WAAA;AAAA,IACR,wFAAA;AAAA,IACA,QAAA,CAAS;AAAA,GACX;AACF;AAMO,SAAS,YAAA,CAAa,KAAa,IAAA,EAA6B;AACrE,EAAA,MAAM,SAAA,GAAY,WAAA,CAAY,GAAA,EAAK,IAAI,CAAA;AACvC,EAAA,IAAI,UAAA,GAAa,SAAA;AACjB,EAAA,IAAI;AACF,IAAA,MAAM,YAAY,GAAA,CAAI,CAAC,cAAc,SAAA,EAAW,MAAM,GAAG,GAAG,CAAA;AAC5D,IAAA,IAAI,WAAW,UAAA,GAAa,SAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,MAAM,KAAA,uBAAY,GAAA,EAAY;AAC9B,EAAA,MAAM,OAAA,GAAU,IAAI,CAAC,MAAA,EAAQ,eAAe,qBAAA,EAAuB,UAAU,GAAG,GAAG,CAAA;AACnF,EAAA,KAAA,MAAW,IAAA,IAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,EAAG;AACtC,IAAA,IAAI,KAAK,IAAA,EAAK,QAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AACA,EAAA,MAAM,YAAY,GAAA,CAAI,CAAC,YAAY,UAAA,EAAY,oBAAoB,GAAG,GAAG,CAAA;AACzE,EAAA,KAAA,MAAW,IAAA,IAAQ,SAAA,CAAU,KAAA,CAAM,IAAI,CAAA,EAAG;AACxC,IAAA,IAAI,KAAK,IAAA,EAAK,QAAS,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,EAAE,WAAW,KAAA,EAAO,CAAC,GAAG,KAAK,CAAA,CAAE,MAAK,EAAE;AAC/C;;;ACpDA,IAAM,WAAA,GAAyC,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAEzF,IAAM,aAAwC,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA,EAAE;AAEhF,SAAS,eAAe,KAAA,EAAuB;AAC7C,EAAA,OAAO,MACJ,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,OAAA,CAAQ,OAAO,KAAK,CAAA,CACpB,QAAQ,KAAA,EAAO,KAAK,EACpB,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CACnB,OAAA,CAAQ,MAAM,KAAK,CAAA;AACxB;AAEA,SAAS,cAAc,KAAA,EAAuB;AAC5C,EAAA,OAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,EAAO,KAAK,CAAA;AAC9E;AAGO,SAAS,iBAAiB,UAAA,EAAoC;AACnE,EAAA,MAAM,QAAQ,UAAA,CAAW,IAAA,GACrB,SAAS,cAAA,CAAe,UAAA,CAAW,IAAI,CAAC,CAAA,OAAA,EAAU,cAAA,CAAe,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA,GAClF,UAAU,cAAA,CAAe,UAAA,CAAW,KAAK,CAAC,CAAA,CAAA;AAC9C,EAAA,OAAO,CAAA,EAAA,EAAK,WAAW,KAAK,CAAA,EAAG,KAAK,CAAA,EAAA,EAAK,aAAA,CAAc,UAAA,CAAW,OAAO,CAAC,CAAA,CAAA;AAC5E;AAGO,SAAS,oBAAA,CACd,OACA,IAAA,EACkB;AAClB,EAAA,OAAO,MAAM,GAAA,CAAI,CAAC,EAAE,IAAA,EAAM,QAAO,KAAM;AACrC,IAAA,MAAM,UAAU,WAAA,CAAY,MAAA,CAAO,KAAK,KAAK,CAAA,IAAK,WAAW,IAAI,CAAA;AACjE,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,UAAU,OAAA,GAAU,SAAA;AAAA,MAC3B,IAAA;AAAA,MACA,KAAA,EAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAA;AAAA,MAClC,SAAS,CAAA,EAAG,MAAA,CAAO,KAAK,KAAK,CAAA,aAAA,EAAgB,OAAO,IAAA,CAAK,KAAK,YAAO,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,UAAA,EAC/F,MAAA,CAAO,QAAQ,aAAA,KAAkB,CAAA,GAAI,SAAS,OAChD,CAAA;AAAA,KACF;AAAA,EACF,CAAC,CAAA;AACH;AAGO,SAAS,mBAAA,CACd,OAAA,EACA,IAAA,EACA,MAAA,EACgB;AAChB,EAAA,MAAM,SAAA,GAAY,WAAW,IAAI,CAAA;AACjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAI,WAAA,CAAY,QAAA,IAAY,SAAA,IAAa,MAAA,CAAO,QAAA,GAAW,CAAA;AACzD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,SAAA,CAAW,CAAA;AAC1C,EAAA,IAAI,WAAA,CAAY,IAAA,IAAQ,SAAA,IAAa,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,KAAA,CAAO,CAAA;AACtF,EAAA,IAAI,WAAA,CAAY,MAAA,IAAU,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAC9F,EAAA,MAAM,SAAS,KAAA,CAAM,MAAA,GAAS,IAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,MAAA;AACtD,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,QAAA;AAAA,IACP,KAAA,EAAO,eAAe,IAAI,CAAA,KAAA,CAAA;AAAA,IAC1B,OAAA,EAAS,UACL,CAAA,cAAA,EAAiB,MAAM,gBAAgB,IAAI,CAAA,CAAA,GAC3C,2BAA2B,IAAI,CAAA,SAAA;AAAA,GACrC;AACF;;;AChDA,IAAMI,YAAAA,GAAyC,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AAEzF,IAAMC,cAAwC,EAAE,MAAA,EAAQ,GAAG,IAAA,EAAM,CAAA,EAAG,UAAU,CAAA,EAAE;AAEhF,IAAM,YAAA,GAA0C;AAAA,EAC9C,MAAA,EAAQ,oBAAA;AAAA,EACR,IAAA,EAAM,qBAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;AASO,SAAS,YAAY,OAAA,EAAuC;AACjE,EAAA,MAAM,MAAA,GAAqB,EAAE,GAAA,EAAK,CAAA,EAAG,QAAQ,CAAA,EAAG,IAAA,EAAM,CAAA,EAAG,QAAA,EAAU,CAAA,EAAE;AACrE,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAA,CAAO,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,WAAA,EAAiC,CAAA,IAAK,CAAA;AAAA,EACjE;AACA,EAAA,OAAO,MAAA;AACT;AAOO,SAAS,wBAAA,CAAyB,SAAiB,QAAA,EAA6B;AACrF,EAAA,IAAI,QAAA,CAAS,MAAA,KAAW,CAAA,EAAG,OAAO,KAAA;AAClC,EAAA,MAAM,GAAA,GAAM,QAAQ,OAAO,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,UAAU,QAAA,CAAS,GAAA,CAAI,OAAO,CAAA,EAAG,EAAE,GAAA,EAAK,IAAA,EAAM,CAAA;AAC9D,EAAA,OAAO,QAAQ,GAAG,CAAA;AACpB;AAGO,SAAS,YAAA,CAAa,QAAoB,IAAA,EAAyB;AACxE,EAAA,MAAM,SAAA,GAAYA,YAAW,IAAI,CAAA;AACjC,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,IAAID,YAAAA,CAAY,QAAA,IAAY,SAAA,IAAa,MAAA,CAAO,QAAA,GAAW,CAAA;AACzD,IAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,SAAA,CAAW,CAAA;AAC1C,EAAA,IAAIA,YAAAA,CAAY,IAAA,IAAQ,SAAA,IAAa,MAAA,CAAO,IAAA,GAAO,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,IAAI,CAAA,KAAA,CAAO,CAAA;AACtF,EAAA,IAAIA,YAAAA,CAAY,MAAA,IAAU,SAAA,IAAa,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,OAAA,CAAS,CAAA;AAC9F,EAAA,IAAIA,YAAAA,CAAY,GAAA,IAAO,SAAA,IAAa,MAAA,CAAO,GAAA,GAAM,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,MAAA,CAAO,GAAG,CAAA,IAAA,CAAM,CAAA;AAClF,EAAA,OAAO,MAAM,MAAA,GAAS,CAAA,GAAI,KAAA,CAAM,IAAA,CAAK,QAAK,CAAA,GAAI,MAAA;AAChD;AAEA,eAAsB,WAAA,CAAY,SAAsBJ,IAAAA,EAAwC;AAC9F,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,KAAW,OAAA,CAAQ,OAAO,MAAA,GAAS,UAAA,CAAA;AAC1D,EAAA,MAAM,QAAmB,EAAE,KAAA,EAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAA,EAAE;AAC9D,EAAA,MAAM,OAAA,GAAU,kBAAA,CAAmB,MAAA,KAAW,UAAU,CAAA;AACxD,EAAA,MAAM,OAAA,GAAU,KAAK,GAAA,EAAI;AAEzB,EAAA,MAAM,UAAU,MAAM,kBAAA,CAAmBA,IAAAA,CAAI,GAAA,EAAK,QAAQ,MAAM,CAAA;AAChE,EAAA,MAAM,OAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,MAAA,CAAO,KAAK,IAAA,IAAQ,MAAA;AACzD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,OAAO,IAAA,CAAK,IAAA;AAEjD,EAAA,OAAA,CAAQ,KAAK,uBAAuB,CAAA;AACpC,EAAA,MAAM,OAAA,GAAU,YAAA,CAAaA,IAAAA,CAAI,GAAA,EAAK,IAAI,CAAA;AAE1C,EAAA,OAAA,CAAQ,KAAK,yBAAyB,CAAA;AACtC,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,MAAM,YAAY,OAAO,CAAA;AAExD,EAAA,MAAM,KAAA,uBAAY,GAAA,EAA4B;AAC9C,EAAA,MAAM,UAAoB,EAAC;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,QAAQ,KAAA,EAAO;AAC/B,IAAA,MAAM,GAAA,GAAMP,KAAAA,CAAK,OAAA,CAAQO,IAAAA,CAAI,KAAK,GAAG,CAAA;AACrC,IAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,OAAO,CAAA;AACxC,IAAA,IAAI,CAAC,KAAA,CAAM,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,KAAK,GAAG,CAAA;AAChB,MAAA;AAAA,IACF;AACA,IAAA,KAAA,CAAM,GAAA;AAAA,MACJ,GAAA;AAAA,MACA,WAAA,CAAY;AAAA,QACV,KAAA;AAAA,QACA,OAAA;AAAA,QACA,WAAA;AAAA,QACA,SAAA,EAAW,GAAA;AAAA,QACX,UAAA,EAAY,GAAA;AAAA,QACZ,UAAA,EAAY,CAAA;AAAA,QACZ,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,QAAA,EAAU,OAAA,CAAQ,KAAA,EAAM,GAAI;AAAC,OAClE;AAAA,KACH;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAA,EAAK;AAEb,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAI,OAAA,CAAQ,KAAA,IAAS,EAAC,EAAI,GAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,IAAS,EAAG,CAAA;AACrF,EAAA,MAAM,YAAA,uBAAmB,GAAA,EAAqB;AAC9C,EAAA,KAAA,MAAW,GAAA,IAAO,KAAA,CAAM,IAAA,EAAK,EAAG;AAC9B,IAAA,YAAA,CAAa,GAAA,CAAI,GAAA,EAAK,wBAAA,CAAyB,GAAA,EAAK,aAAa,CAAC,CAAA;AAAA,EACpE;AAEA,EAAA,MAAM,OAAA,GAAU,CAAC,GAAG,KAAA,CAAM,SAAS,CAAA,CAChC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO,EAAE,KAAK,MAAA,EAAQ,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,KAAA,EAAM,CAAE,CAAA,CACjF,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,OAAO,IAAA,CAAK,KAAA,GAAQ,CAAA,CAAE,MAAA,CAAO,KAAK,KAAK,CAAA;AAC3D,EAAA,MAAM,WAAA,GAAc,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,CAAC,KAAA,CAAM,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,KAAA,KAAU,MAAM,MAAM,CAAA;AACzF,EAAA,MAAM,MAAA,GAAS,YAAY,WAAW,CAAA;AACtC,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,KAAA,KAAU,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA;AAC9D,EAAA,MAAM,OAAA,GAAU,WAAA,CAAY,IAAA,CAAK,CAAC,MAAA,KAAWI,YAAAA,CAAY,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,IAAKC,WAAAA,CAAW,IAAI,CAAC,CAAA;AAC/F,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,EAAI,GAAI,OAAA;AAEhC,EAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,IAAAL,KAAI,MAAA,CAAO,KAAA;AAAA,MACT,aAAA;AAAA,QACE,mBAAA;AAAA,UACE,OAAA,CAAQ,SAAA;AAAA,UACR,OAAA,CAAQ,KAAA;AAAA,UACR,KAAA;AAAA,UACA,YAAA;AAAA,UACA,IAAA;AAAA,UACA,OAAA;AAAA,UACA,MAAA;AAAA,UACA,YAAA;AAAA,UACA,UAAA;AAAA,UACAA,IAAAA,CAAI;AAAA;AACN;AACF,KACF;AACA,IAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,WAAW,QAAA,EAAU;AACvB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,oBAAA;AAAA,QACD,CAAC,GAAG,KAAA,CAAM,OAAA,EAAS,CAAA,CAChB,MAAA,CAAO,CAAC,CAAC,GAAG,CAAA,KAAM,EAAE,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK,KAAA,CAAM,CAAA,CACnD,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,MAAM,CAAA,MAAO,EAAE,IAAA,EAAM,MAAA,EAAO,CAAE,CAAA;AAAA,QAC7C;AAAA,OACF;AAAA,MACA,mBAAA,CAAoB,OAAA,EAAS,IAAA,EAAM,MAAM;AAAA,KAC3C;AACA,IAAAA,IAAAA,CAAI,MAAA,CAAO,KAAA,CAAM,CAAA,EAAG,WAAA,CAAY,IAAI,gBAAgB,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,CAAI,CAAA;AACpE,IAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAAA,EAC/C;AAEA,EAAA,gBAAA;AAAA,IACE;AAAA,MACE,KAAKA,IAAAA,CAAI,GAAA;AAAA,MACT,WAAW,OAAA,CAAQ,SAAA;AAAA,MACnB,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,OAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,IAAA;AAAA,MACA,OAAA;AAAA,MACA,UAAA;AAAA,MACA;AAAA,KACF;AAAA,IACAA,IAAAA,CAAI;AAAA,GACN;AACA,EAAA,OAAO,OAAA,GAAU,QAAA,CAAS,OAAA,GAAU,QAAA,CAAS,OAAA;AAC/C;AAiBO,SAAS,gBAAA,CAAiB,OAAwB,MAAA,EAA4B;AACnF,EAAA,MAAM;AAAA,IACJ,GAAA;AAAA,IACA,SAAA;AAAA,IACA,KAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,KAAA;AAEJ,EAAA,MAAA,CAAO,SAAA,CAAU,YAAY,EAAE,KAAA,EAAO,WAAW,SAAS,CAAA,CAAA,EAAI,KAAA,EAAO,CAAC,CAAA;AACtE,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,IAAA,GAAgC;AAAA,IACpC,CAAC,SAAA,EAAW,SAAA,CAAU,KAAA,CAAM,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC3C,CAAC,QAAA,EAAU,SAAA,CAAU,OAAA,CAAQ,MAAA,EAAQ,MAAM,CAAC,CAAA;AAAA,IAC5C,CAAC,SAAA,EAAW,SAAA,CAAU,YAAA,EAAc,MAAM,CAAC,CAAA;AAAA,IAC3C,CAAC,UAAA,EAAY,GAAA,CAAI,eAAe,UAAU,CAAA,EAAG,KAAK,CAAC;AAAA,GACrD;AACA,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,IAAA,CAAK,GAAA,CAAI,CAAC,CAAC,GAAG,CAAA,KAAM,GAAA,CAAI,MAAM,CAAC,CAAA;AACzD,EAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,IAAA,EAAM;AAC/B,IAAA,MAAA,CAAO,SAAA,CAAU,GAAG,GAAA,CAAI,MAAA,CAAO,KAAK,CAAC,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA;AAAA,EACnD;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAM,OAAO,OAAA,GAAU,IAAA,CAAK,OAAO,CAAA,GAAI,KAAK,MAAM,CAAA;AAClD,EAAA,MAAM,KAAA,GAAQ,OAAA,GAAUJ,KAAAA,CAAM,GAAA,GAAMA,KAAAA,CAAM,KAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,IAAI,CAAA,GAAI,IAAA;AAC7C,EAAA,MAAM,OAAA,GAAU,UAAU,cAAA,GAAiB,aAAA;AAC3C,EAAA,MAAM,WAAA,GAAc,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAO,OAAA,EAAS,KAAK,CAAC,CAAA,GAAI,OAAA;AAClE,EAAA,MAAA,CAAO,SAAA;AAAA,IACL,GAAG,QAAQ,CAAA,CAAA,EAAI,WAAW,CAAA,QAAA,EAAM,aAAa,MAAA,EAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,EAAI,YAAA,CAAa,IAAI,CAAC,CAAA,CAAA,CAAA,EAAK,KAAK,CAAC,CAAA;AAAA,GACrG;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AAEjB,EAAA,MAAA,CAAO,UAAU,aAAA,CAAc,CAAA,eAAA,EAAkB,QAAQ,MAAM,CAAA,OAAA,CAAA,EAAW,KAAK,CAAC,CAAA;AAChF,EAAA,KAAA,MAAW,EAAE,MAAA,EAAQ,OAAA,EAAQ,IAAK,OAAA,EAAS;AACzC,IAAA,MAAM,QAAQQ,YAAAA,CAAY,MAAA,CAAO,KAAK,KAAK,CAAA,IAAKC,YAAW,IAAI,CAAA;AAC/D,IAAA,MAAM,WAAW,KAAA,GAAQ,IAAA,CAAK,OAAO,CAAA,GAAI,KAAK,MAAM,CAAA;AACpD,IAAA,MAAM,YAAA,GAAe,KAAA,CAAM,KAAA,GACvB,KAAA,GACET,KAAAA,CAAM,GAAA,CAAI,QAAQ,CAAA,GAClBA,KAAAA,CAAM,KAAA,CAAM,QAAQ,CAAA,GACtB,QAAA;AACJ,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,IAAA,CAAK,KAAA,CAAM,QAAQ,CAAC,CAAA;AACzC,IAAA,MAAM,KAAA,GAAQ,UAAU,MAAA,CAAO,IAAA,CAAK,OAAO,MAAA,CAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AACnE,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,MAAA,CAAO,UAAA,EAAY,GAAG,CAAA;AAC/C,IAAA,MAAM,aAAa,OAAA,GAAU,CAAA,CAAA,EAAI,IAAI,WAAA,EAAa,KAAK,CAAC,CAAA,CAAA,GAAK,EAAA;AAC7D,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,CAAA,EAAG,YAAY,CAAA,CAAA,EAAI,IAAI,KAAK,SAAA,CAAU,MAAA,CAAO,KAAK,KAAA,EAAO,KAAK,CAAC,CAAA,MAAA,EAAM,KAAK,OAAO,KAAA,GAAQ,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA,GAAK,EAAE,GAAG,UAAU,CAAA;AAAA,KACxH;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,GAAG,GAAA,CAAI,IAAA,CAAK,UAAU,CAAA,EAAG,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,GAAA,EAAK,KAAK,CAAC,CAAA,CAAA,EAAI,GAAA,CAAI,qBAAA,EAAuB,KAAK,CAAC,CAAA;AAAA,KACzF;AAAA,EACF;AACA,EAAA,MAAA,CAAO,SAAA,EAAU;AACnB;AAEO,SAAS,mBAAA,CACd,SAAA,EACA,gBAAA,EACA,KAAA,EACA,YAAA,EACA,MACA,OAAA,EACA,MAAA,EACA,YAAA,EACA,UAAA,EACA,OAAA,EACgB;AAChB,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,OAAO,gBAAA,EAAkB;AAClC,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA;AAC5B,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,KAAA,CAAM,IAAA,CAAK;AAAA,QACT,IAAA,EAAM,GAAA;AAAA,QACN,QAAA,EAAU,IAAA;AAAA,QACV,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,aAAA,EAAe,OAAO,OAAA,CAAQ,aAAA;AAAA,QAC9B,eAAe,MAAA,CAAO,aAAA;AAAA,QACtB,OAAA,EAAS,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,IAAK;AAAA,OACnC,CAAA;AAAA,IACH,CAAA,MAAO;AACL,MAAA,KAAA,CAAM,KAAK,EAAE,IAAA,EAAM,GAAA,EAAK,QAAA,EAAU,OAAO,CAAA;AAAA,IAC3C;AAAA,EACF;AACA,EAAA,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAA,CAAO,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,EAAA,KAAO,CAAA,CAAE,IAAA,EAAM,KAAA,IAAS,EAAA,CAAG,CAAA;AAElE,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,QAAA;AAAA,IACN,OAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,IAAA,EAAM,SAAA;AAAA,IACN,cAAc,gBAAA,CAAiB,MAAA;AAAA,IAC/B,KAAA;AAAA,IACA,MAAM,EAAE,KAAA,EAAO,MAAM,OAAA,EAAS,MAAA,EAAQ,SAAS,YAAA,EAAa;AAAA,IAC5D;AAAA,GACF;AACF;;;ACjTA,IAAM,YAAA,GAAe,QAAA;AAMrB,SAAS,aAAa,QAAA,EAA4B;AAChD,EAAA,MAAM,QAAQ,QAAA,CAAS,GAAA,CAAI,CAAC,OAAA,KAAY,CAAA,EAAA,EAAK,OAAO,CAAA,CAAE,CAAA;AACtD,EAAA,OAAO;AAAA;AAAA,EAAgB,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA;AACzC;AAEO,SAAS,cAAcI,IAAAA,EAA8B;AAC1D,EAAA,MAAM,UAAU,IAAI,OAAA,EAAQ,CACzB,IAAA,CAAK,YAAY,CAAA,CACjB,WAAA,CAAY,oEAAoE,CAAA,CAChF,QAAQA,IAAAA,CAAI,OAAA,EAAS,eAAA,EAAiB,0BAA0B,EAChE,kBAAA,EAAmB;AAEtB,EAAA,OAAA,CACG,OAAA,CAAQ,gBAAgB,CAAA,CACxB,WAAA,CAAY,uCAAuC,CAAA,CACnD,WAAA;AAAA,IACC,OAAA;AAAA,IACA,YAAA,CAAa;AAAA,MACX,4CAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH,CACC,MAAA,CAAO,YAAA,EAAc,qCAAqC,CAAA,CAC1D,OAAO,eAAA,EAAiB,mCAAmC,CAAA,CAC3D,MAAA,CAAO,sBAAA,EAAwB,iCAAA,EAAmC,gBAAgB,CAAA,CAClF,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,IAAA,EAAc,OAAA,KAAqC;AAChE,IAAA,MAAMN,YAAW,MAAM,cAAA;AAAA,MACrB,IAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAM;AAAA,KACF;AACA,IAAA,IAAIN,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,cAAc,CAAA,CACtB,WAAA,CAAY,8DAA8D,CAAA,CAC1E,WAAA;AAAA,IACC,OAAA;AAAA,IACA,YAAA,CAAa;AAAA,MACX,cAAA;AAAA,MACA,+CAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH,CACC,MAAA,CAAO,YAAA,EAAc,qCAAqC,CAAA,CAC1D,MAAA;AAAA,IACC,uBAAA;AAAA,IACA,uDAAA;AAAA,IACA;AAAA,GACF,CACC,MAAA,CAAO,eAAA,EAAiB,wBAAwB,CAAA,CAChD,OAAO,eAAA,EAAiB,+DAA+D,CAAA,CACvF,MAAA,CAAO,sBAAA,EAAwB,oBAAA,EAAsB,gBAAgB,CAAA,CACrE,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,IAAA,EAA0B,OAAA,KAAqC;AAC5E,IAAA,MAAMA,YAAW,MAAM,YAAA;AAAA,MACrB,IAAA;AAAA,MACA;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,MAAA,EAAS,OAAA,CAAQ,MAAA,KAA2B,OAAA,CAAQ,OAAO,MAAA,GAAS,UAAA,CAAA;AAAA,QACpE,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAM;AAAA,KACF;AACA,IAAA,IAAIN,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,+DAA+D,CAAA,CAC3E,WAAA;AAAA,IACC,OAAA;AAAA,IACA,YAAA,CAAa,CAAC,yCAAA,EAA2C,6BAA6B,CAAC;AAAA,IAExF,MAAA,CAAO,YAAA,EAAc,qCAAqC,CAAA,CAC1D,OAAO,uBAAA,EAAyB,yCAAA,EAA2C,eAAe,CAAA,CAC1F,OAAO,eAAA,EAAiB,wBAAwB,EAChD,MAAA,CAAO,kBAAA,EAAoB,8DAA8D,CAAA,CACzF,MAAA;AAAA,IACC,oBAAA;AAAA,IACA,4DAAA;AAAA,IACA;AAAA,GACF,CACC,OAAO,sBAAA,EAAwB,iCAAA,EAAmC,gBAAgB,CAAA,CAClF,MAAA,CAAO,yBAAyB,yDAAyD,CAAA,CACzF,OAAO,qBAAA,EAAuB,8BAA8B,EAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,WAAA;AAAA,MACrB;AAAA,QACE,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,MAAA,EAAS,OAAA,CAAQ,MAAA,KAA0B,OAAA,CAAQ,OAAO,MAAA,GAAS,UAAA,CAAA;AAAA,QACnE,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,GAAI,QAAQ,IAAA,KAAS,MAAA,GAAY,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAe,GAAI,EAAC;AAAA,QACrE,GAAI,QAAQ,IAAA,KAAS,MAAA,GACjB,EAAE,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAuC,GACvD,EAAC;AAAA,QACL,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAgB,GAAI,EAAC;AAAA,QACxE,GAAI,QAAQ,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,OAAA,CAAQ,KAAA,EAAkB,GAAI,EAAC;AAAA,QAC1E,GAAI,QAAQ,MAAA,KAAW,MAAA,GAAY,EAAE,MAAA,EAAQ,OAAA,CAAQ,MAAA,EAAiB,GAAI,EAAC;AAAA,QAC3E,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAM;AAAA,KACF;AACA,IAAA,IAAIN,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,QAAQ,CAAA,CAChB,WAAA,CAAY,wDAAwD,CAAA,CACpE,WAAA,CAAY,OAAA,EAAS,YAAA,CAAa,CAAC,eAAA,EAAiB,kBAAkB,CAAC,CAAC,CAAA,CACxE,MAAA,CAAO,eAAA,EAAiB,4BAA4B,CAAA,CACpD,MAAA,CAAO,qBAAA,EAAuB,8BAA8B,CAAA,CAC5D,MAAA,CAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,aAAA;AAAA,MACrB;AAAA,QACE,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,OAAO,CAAA;AAAA,QAChC,QAAQ,OAAA,CAAQ,MAAA;AAAA,QAChB,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAM;AAAA,KACF;AACA,IAAA,IAAIN,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,MAAM,CAAA,CACd,WAAA,CAAY,kDAAkD,CAAA,CAC9D,WAAA,CAAY,OAAA,EAAS,YAAA,CAAa,CAAC,qBAAA,EAAuB,yBAAyB,CAAC,CAAC,CAAA,CACrF,MAAA,CAAO,aAAA,EAAe,mCAAmC,CAAA,CACzD,MAAA,CAAO,QAAA,EAAU,0DAA0D,EAC3E,MAAA,CAAO,MAAA,EAAQ,gDAAgD,CAAA,CAC/D,OAAO,YAAA,EAAc,qBAAqB,CAAA,CAC1C,MAAA,CAAO,OAAO,OAAA,KAAqC;AAClD,IAAA,MAAMA,YAAW,MAAM,WAAA;AAAA,MACrB;AAAA,QACE,KAAA,EAAO,OAAA,CAAQ,OAAA,CAAQ,KAAK,CAAA;AAAA,QAC5B,IAAA,EAAM,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC1B,EAAA,EAAI,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,QACtB,OAAO,OAAA,CAAQ;AAAA,OACjB;AAAA,MACAM;AAAA,KACF;AACA,IAAA,IAAIN,SAAAA,KAAa,SAAS,OAAA,EAAS;AACjC,MAAA,MAAM,IAAI,UAAUA,SAAQ,CAAA;AAAA,IAC9B;AAAA,EACF,CAAC,CAAA;AAEH,EAAA,OAAA,CACG,OAAA,CAAQ,SAAS,CAAA,CACjB,WAAA,CAAY,0BAA0B,CAAA,CACtC,WAAA,CAAY,OAAA,EAAS,YAAA,CAAa,CAAC,gBAAgB,CAAC,CAAC,CAAA,CACrD,OAAO,MAAM;AACZ,IAAAM,IAAAA,CAAI,MAAA,CAAO,SAAA,CAAUA,IAAAA,CAAI,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AAEH,EAAA,OAAA,CAAQ,WAAA;AAAA,IACN,WAAA;AAAA,IACA,CAAA;AAAA;AAAA,GACF;AAEA,EAAA,OAAO,OAAA;AACT;AAGA,IAAM,SAAA,GAAN,cAAwB,KAAA,CAAM;AAAA,EAC5B,YAAqBN,SAAAA,EAAoB;AACvC,IAAA,KAAA,CAAM,CAAA,KAAA,EAAQA,SAAQ,CAAA,CAAE,CAAA;AADL,IAAA,IAAA,CAAA,QAAA,GAAAA,SAAAA;AAEnB,IAAA,IAAA,CAAK,IAAA,GAAO,WAAA;AAAA,EACd;AAAA,EAHqB,QAAA;AAIvB,CAAA;AAEA,SAAS,iBAAiB,KAAA,EAAuB;AAC/C,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,KAAA,EAAO,EAAE,CAAA;AACxC,EAAA,IAAI,CAAC,MAAA,CAAO,QAAA,CAAS,MAAM,CAAA,IAAK,SAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,cAAA;AAAA,MACR,CAAA;AAAA,MACA,2BAAA;AAAA,MACA,qCAAqC,KAAK,CAAA,CAAA;AAAA,KAC5C;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAGA,SAAS,eAAe,KAAA,EAA+C;AACrE,EAAA,IAAI,KAAA,KAAU,QAAA,IAAY,KAAA,KAAU,MAAA,IAAU,UAAU,UAAA,EAAY;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,cAAA;AAAA,IACR,CAAA;AAAA,IACA,2BAAA;AAAA,IACA,kDAAkD,KAAK,CAAA,CAAA;AAAA,GACzD;AACF;AAGA,SAAS,gBAAgB,KAAA,EAA2B;AAClD,EAAA,IAAI,KAAA,KAAU,UAAA,IAAc,KAAA,KAAU,MAAA,IAAU,UAAU,QAAA,EAAU;AAClE,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,cAAA;AAAA,IACR,CAAA;AAAA,IACA,2BAAA;AAAA,IACA,kDAAkD,KAAK,CAAA,CAAA;AAAA,GACzD;AACF;AAGA,SAAS,iBAAiB,KAAA,EAA4B;AACpD,EAAA,IACE,KAAA,KAAU,cACV,KAAA,KAAU,MAAA,IACV,UAAU,SAAA,IACV,KAAA,KAAU,KAAA,IACV,KAAA,KAAU,MAAA,EACV;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,MAAM,IAAI,cAAA;AAAA,IACR,CAAA;AAAA,IACA,2BAAA;AAAA,IACA,gEAAgE,KAAK,CAAA,CAAA;AAAA,GACvE;AACF;AAGA,SAAS,UAAA,CAAW,OAAgBM,IAAAA,EAA2B;AAC7D,EAAA,IAAI,iBAAiB,WAAA,EAAa;AAChC,IAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,CAAA,OAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC9C,IAAA,IAAI,KAAA,CAAM,MAAMA,IAAAA,CAAI,YAAY,SAAA,CAAU,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,CAAE,CAAA;AAC3D,IAAA;AAAA,EACF;AACA,EAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,IAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,CAAA,OAAA,EAAK,KAAA,CAAM,OAAO,CAAA,CAAE,CAAA;AAC9C,IAAA;AAAA,EACF;AACA,EAAAA,KAAI,WAAA,CAAY,SAAA,CAAU,UAAK,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAA;AAChD;AAQA,eAAsB,GAAA,CAAI,EAAE,IAAA,EAAM,GAAA,EAAAA,MAAI,EAAkC;AACtE,EAAA,MAAM,OAAA,GAAU,cAAcA,IAAG,CAAA;AACjC,EAAA,OAAA,CAAQ,YAAA,EAAa;AAErB,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,CAAQ,WAAW,IAAI,CAAA;AAC7B,IAAA,OAAO,QAAA,CAAS,OAAA;AAAA,EAClB,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,MAAA,OAAO,KAAA,CAAM,QAAA;AAAA,IACf;AACA,IAAA,IAAI,iBAAiB,cAAA,EAAgB;AACnC,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,CAAA,EAAG,OAAO,QAAA,CAAS,OAAA;AAC1C,MAAA,OAAO,QAAA,CAAS,OAAA;AAAA,IAClB;AACA,IAAA,UAAA,CAAW,OAAOA,IAAG,CAAA;AACrB,IAAA,OAAO,KAAA,YAAiB,WAAA,GAAc,KAAA,CAAM,QAAA,GAAW,QAAA,CAAS,OAAA;AAAA,EAClE;AACF;;;ACnTA,IAAA,eAAA,GAAA;AAAA,EAEE,OAAA,EAAW,OA2Fb,CAAA;;;ACpFA,IAAM,GAAA,GAAM;AAAA,EACV,MAAA,EAAQ,IAAI,cAAA,EAAe;AAAA,EAC3B,WAAA,EAAa,IAAI,cAAA,CAAe,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC9C,GAAA,EAAK,QAAQ,GAAA,EAAI;AAAA,EACjB,SAAS,eAAA,CAAI;AACf,CAAA;AAEA,IAAM,QAAA,GAAW,MAAM,GAAA,CAAI,EAAE,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAK,CAAA;AACtD,OAAA,CAAQ,QAAA,GAAW,QAAA","file":"bin.js","sourcesContent":["import type { OutputWriter } from \"../types/cli.js\";\n\n/**\n * Output writers. The CLI writes to stdout (or an injected stream); tests\n * use the in-memory implementation.\n */\n\nexport class TerminalWriter implements OutputWriter {\n constructor(private readonly stream: NodeJS.WritableStream = process.stdout) {}\n\n write(text: string): void {\n this.stream.write(text);\n }\n\n writeLine(text = \"\"): void {\n this.stream.write(`${text}\\n`);\n }\n}\n\nexport class InMemoryWriter implements OutputWriter {\n readonly chunks: string[] = [];\n\n write(text: string): void {\n this.chunks.push(text);\n }\n\n writeLine(text = \"\"): void {\n this.chunks.push(`${text}\\n`);\n }\n\n /** Full captured output. */\n get output(): string {\n return this.chunks.join(\"\");\n }\n\n /** Captured output split into lines (trailing newline removed). */\n get lines(): string[] {\n return this.output.replace(/\\n$/, \"\").split(\"\\n\");\n }\n}\n","/**\n * Shared contracts between the CLI layer and the analysis pipeline.\n * Kept free of commander types so the pipeline stays testable in isolation.\n */\n\n/** Parsed command-line options for `ripple analyze`. */\nexport interface AnalyzeOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Cap on reverse traversal depth. `undefined` = unlimited. */\n depth?: number;\n /** Path to a config file. Overrides discovery. */\n config?: string;\n}\n\n/** Parsed command-line options for `ripple graph`. */\nexport interface GraphOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Show the dependency tree of one file instead of project stats. */\n file?: string;\n /** Render dependents (reverse) instead of dependants (forward). */\n reverse: boolean;\n /** Cap on tree depth. */\n depth?: number;\n config?: string;\n /** Output format; `json` falls back to `--json` parsing. */\n format?: GraphFormat;\n}\n\n/** Supported output formats for `ripple graph`. */\nexport type GraphFormat = \"terminal\" | \"json\" | \"mermaid\" | \"dot\" | \"html\";\n\n/** Parsed command-line options for `ripple doctor`. */\nexport interface DoctorOptions {\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple init`. */\nexport interface InitOptions {\n force: boolean;\n /** Write every built-in default instead of a minimal config. */\n full?: boolean;\n /** Write a typed `ripple.config.ts` instead of JSON. */\n ts?: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n}\n\n/** Supported output formats for `ripple diff`. */\nexport type DiffFormat = \"terminal\" | \"json\" | \"github\";\n\n/** Parsed command-line options for `ripple diff`. */\nexport interface DiffOptions {\n json: boolean;\n verbose: boolean;\n /** Output format; `json` falls back to `--json` parsing. */\n format?: DiffFormat;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Git ref to compute the change set against. */\n base?: string;\n /** Minimum risk level that blocks the gate. */\n gate?: \"medium\" | \"high\" | \"critical\";\n /** Cap on reverse traversal depth per file. */\n depth?: number;\n /** Glob patterns of changed files exempted from blocking the gate. */\n allow?: string[];\n config?: string;\n}\n\n/** Process exit codes used across commands. */\nexport const ExitCode = {\n Success: 0,\n Failure: 1,\n NotFound: 2,\n InvalidConfig: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Abstraction over the destination of rendered output. The real CLI writes to\n * stdout; tests inject an in-memory implementation.\n */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text?: string): void;\n}\n\n/** Everything commands need injected; no globals anywhere. */\nexport interface CommandContext {\n writer: OutputWriter;\n /** Stream for error messages (stderr in the real CLI). */\n errorWriter: OutputWriter;\n cwd: string;\n version: string;\n}\n","import fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Thin, safe filesystem helpers. All reads are optional: Ripple must never\n * crash the whole analysis because one file is unreadable.\n */\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function pathExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Read a file as UTF-8; returns `undefined` when unreadable. */\nexport async function readFileSafe(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** Read a small JSON-ish file synchronously; returns `undefined` when unreadable. */\nexport function readJsonSafe(filePath: string): unknown | undefined {\n try {\n return JSON.parse(fsSync.readFileSync(filePath, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Find the closest package.json above `startDir`. Used to detect project\n * entry points (`main`, `bin`).\n */\nexport async function findPackageJson(startDir: string): Promise<string | undefined> {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, \"package.json\");\n if (await pathExists(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\n/** Read `main` / `bin` entries of a package.json for entry-point detection. */\nexport async function readPackageEntryPoints(packageJsonPath: string): Promise<string[]> {\n const raw = await readFileSafe(packageJsonPath);\n if (!raw) return [];\n try {\n const manifest = JSON.parse(raw) as { main?: string; bin?: string | Record<string, string> };\n const entries: string[] = [];\n if (typeof manifest.main === \"string\") entries.push(manifest.main);\n if (typeof manifest.bin === \"string\") entries.push(manifest.bin);\n if (manifest.bin && typeof manifest.bin === \"object\")\n entries.push(...Object.values(manifest.bin));\n return entries;\n } catch {\n return [];\n }\n}\n","import { ExitCode } from \"../types/cli.js\";\n\n/**\n * Error type surfaced to the CLI entry point. Carries an exit code and an\n * optional hint that explains how to recover.\n */\nexport class RippleError extends Error {\n readonly exitCode: ExitCode;\n readonly hint?: string;\n\n constructor(message: string, exitCode: ExitCode = ExitCode.Failure, hint?: string) {\n super(message);\n this.name = \"RippleError\";\n this.exitCode = exitCode;\n this.hint = hint;\n }\n}\n\n/** Thrown when a file passed to `ripple analyze` cannot be found. */\nexport function fileNotFound(filePath: string): RippleError {\n return new RippleError(\n `File not found: ${filePath}`,\n ExitCode.NotFound,\n \"Run `ripple graph` to list the files Ripple can analyze.\",\n );\n}\n","import path from \"node:path\";\nimport { ts } from \"ts-morph\";\nimport type { TsconfigInfo } from \"../types/project.js\";\nimport { pathExistsSync } from \"./fs.js\";\n\n/**\n * tsconfig.json loading and alias extraction.\n *\n * Uses the TypeScript compiler API (bundled with ts-morph) so that `extends`,\n * comments and JSONC are handled exactly like the real compiler handles them.\n */\nexport function findTsconfig(startDir: string): string | undefined {\n return ts.findConfigFile(startDir, pathExistsSync, \"tsconfig.json\");\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\n/**\n * Read and parse a tsconfig.json. Returns `undefined` when the file is\n * missing or malformed (callers decide how to surface that).\n */\nexport function readTsconfig(tsconfigPath: string): TsconfigInfo | undefined {\n if (!pathExistsSync(tsconfigPath)) return undefined;\n const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n if (readResult.error) return undefined;\n\n const dir = path.dirname(tsconfigPath);\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n dir,\n undefined,\n tsconfigPath,\n );\n if (parsed.errors.length > 0) return undefined;\n\n const options = parsed.options;\n const paths: Record<string, string[]> = {};\n if (options.paths) {\n for (const [pattern, targets] of Object.entries(options.paths)) {\n paths[pattern] = [...targets];\n }\n }\n\n return {\n path: tsconfigPath,\n dir,\n baseUrl: options.baseUrl ? path.resolve(dir, options.baseUrl) : undefined,\n paths,\n include: asStringArray(readResult.config.include ?? []),\n exclude: asStringArray(readResult.config.exclude ?? []),\n };\n}\n\n/**\n * Match a module specifier against `paths` patterns.\n *\n * Supports a single `*` wildcard in both pattern and replacement\n * (`\"@/*\": [\"./src/*\"]`). Returns the substituted absolute-ish path and the\n * captured wildcard value, or `undefined` when nothing matches.\n */\nexport function matchAlias(\n specifier: string,\n paths: Record<string, string[]>,\n): { target: string; matchedPattern: string } | undefined {\n for (const [pattern, replacements] of Object.entries(paths)) {\n const starIndex = pattern.indexOf(\"*\");\n if (starIndex === -1) {\n if (specifier === pattern) {\n const replacement = replacements[0];\n if (replacement) return { target: replacement, matchedPattern: pattern };\n }\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n\n for (const replacement of replacements) {\n const replacementStar = replacement.indexOf(\"*\");\n const target =\n replacementStar === -1\n ? replacement\n : replacement.slice(0, replacementStar) +\n captured +\n replacement.slice(replacementStar + 1);\n return { target, matchedPattern: pattern };\n }\n }\n return undefined;\n}\n","import path from \"node:path\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { TsconfigInfo } from \"../types/project.js\";\n\n/**\n * Alias normalization.\n *\n * User aliases (`ripple.config.ts`) and tsconfig `paths` are merged into one\n * map of pattern → absolute target. Both support a single `*` wildcard:\n *\n * `{ \"@\": \"./src\" }` → `{ \"@/*\": \"<root>/src/*\" }`\n * tsconfig `\"@/*\": [\"./src/*\"]` → `{ \"@/*\": \"<root>/src/*\" }`\n *\n * Keys without a wildcard are treated as prefixes, so `\"@\"` covers\n * `@/components/Button` the way TypeScript users expect.\n */\n\nconst WILDCARD = \"*\";\n\nfunction hasWildcard(value: string): boolean {\n return value.includes(WILDCARD);\n}\n\n/**\n * Normalize a user-config alias entry against `baseDir`.\n * Returns the pattern and its absolute target, or `undefined` for invalid\n * entries (empty key or non-relative target is allowed but must be absolute\n * after resolution).\n */\nfunction normalizeEntry(\n key: string,\n target: string,\n baseDir: string,\n): { pattern: string; target: string } {\n const trimmedKey = key.replace(/\\/+$/, \"\");\n const trimmedTarget = target.replace(/\\/+$/, \"\");\n\n if (hasWildcard(trimmedKey)) {\n return { pattern: trimmedKey, target: path.resolve(baseDir, trimmedTarget) };\n }\n return {\n pattern: `${trimmedKey}/${WILDCARD}`,\n target: path.join(path.resolve(baseDir, trimmedTarget), WILDCARD),\n };\n}\n\n/**\n * Merge user aliases and tsconfig paths into a single normalized map.\n * User aliases win on pattern collisions.\n */\nexport function buildAliasMap(\n configAliases: Record<string, string>,\n tsconfig: TsconfigInfo | undefined,\n rootDir: string,\n): AliasMap {\n const merged: AliasMap = {};\n\n if (tsconfig) {\n const base = tsconfig.baseUrl ?? tsconfig.dir;\n for (const [pattern, targets] of Object.entries(tsconfig.paths)) {\n const first = targets[0];\n if (!first) continue;\n const absolute = path.isAbsolute(first) ? first : path.resolve(base, first);\n merged[pattern] = absolute;\n }\n }\n\n for (const [key, target] of Object.entries(configAliases)) {\n if (key === \"\") continue;\n const entry = normalizeEntry(key, target, rootDir);\n merged[entry.pattern] = entry.target;\n }\n\n return merged;\n}\n\n/**\n * Substitute a specifier against an alias map. Returns the absolute-ish\n * candidate path or `undefined` when no pattern matches.\n */\nexport function substituteAlias(specifier: string, aliases: AliasMap): string | undefined {\n for (const [pattern, target] of Object.entries(aliases)) {\n const starIndex = pattern.indexOf(WILDCARD);\n if (starIndex === -1) {\n if (specifier === pattern) return target;\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n const targetStar = target.indexOf(WILDCARD);\n if (targetStar === -1) return target;\n return target.slice(0, targetStar) + captured + target.slice(targetStar + 1);\n }\n return undefined;\n}\n","import { createJiti } from \"jiti\";\nimport path from \"node:path\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AliasMap, RippleConfig } from \"../types/config.js\";\nimport type { LoadConfigResult, ProjectContext } from \"../types/project.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { readTsconfig } from \"../utils/tsconfig.js\";\nimport { buildAliasMap } from \"./aliases.js\";\nimport { formatSchemaIssues, rippleConfigSchema } from \"./schema.js\";\n\n/**\n * Config discovery and loading.\n *\n * Resolution order for `ripple.config.*`: `.ts`, `.mjs`, `.js`, `.cjs`,\n * `.json`. An explicit `--config <path>` always wins. The directory of the\n * resolved config file becomes the project root.\n */\n\nconst CONFIG_CANDIDATES = [\n \"ripple.config.ts\",\n \"ripple.config.mjs\",\n \"ripple.config.js\",\n \"ripple.config.cjs\",\n \"ripple.config.json\",\n] as const;\n\nconst jiti = createJiti(import.meta.url, { interopDefault: true });\n\nfunction findConfigFile(cwd: string, explicitPath: string | undefined): string | undefined {\n if (explicitPath) return path.resolve(cwd, explicitPath);\n for (const candidate of CONFIG_CANDIDATES) {\n const absolute = path.join(cwd, candidate);\n if (pathExistsSync(absolute)) return absolute;\n }\n return undefined;\n}\n\nasync function importConfig(configPath: string): Promise<unknown> {\n let loaded: unknown;\n try {\n loaded = await jiti.import(configPath);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new RippleError(\n `Could not load ${path.basename(configPath)}: ${detail}`,\n ExitCode.InvalidConfig,\n );\n }\n const value = (loaded as { default?: unknown })?.default ?? loaded;\n if (typeof value === \"function\") {\n throw new RippleError(\n `${path.basename(configPath)} must export a plain object, not a function.`,\n ExitCode.InvalidConfig,\n );\n }\n return value;\n}\n\nfunction validateConfig(value: unknown): RippleConfig {\n const result = rippleConfigSchema.safeParse(value);\n if (!result.success) {\n const issues = formatSchemaIssues(result.error);\n throw new RippleError(\n `Invalid config:\\n${issues.map((issue) => ` ${issue}`).join(\"\\n\")}`,\n ExitCode.InvalidConfig,\n );\n }\n return result.data;\n}\n\n/**\n * Load and validate the ripple config. Never throws for a *missing* config —\n * defaults apply. Throws `RippleError` for an explicit-but-missing path or an\n * invalid config file.\n */\nexport async function loadConfig(cwd: string, explicitPath?: string): Promise<LoadConfigResult> {\n const configPath = findConfigFile(cwd, explicitPath);\n\n if (explicitPath && !configPath) {\n throw new RippleError(\n `Config file not found: ${explicitPath}`,\n ExitCode.InvalidConfig,\n \"Pass a path that exists, or remove --config to use defaults.\",\n );\n }\n\n if (!configPath) {\n return { config: rippleConfigSchema.parse({}), rootDir: path.resolve(cwd) };\n }\n\n const raw = await importConfig(configPath);\n const config = validateConfig(raw);\n return { config, configPath, rootDir: path.dirname(configPath) };\n}\n\n/**\n * Assemble the full `ProjectContext`: config + tsconfig facts + merged alias\n * map. The alias map is baked into the context so downstream layers never\n * touch config shapes again.\n */\nexport async function loadProjectContext(\n cwd: string,\n explicitConfigPath?: string,\n): Promise<ProjectContext> {\n const loaded = await loadConfig(cwd, explicitConfigPath);\n const { config, rootDir } = loaded;\n\n const tsconfigPath = path.resolve(rootDir, config.tsconfigPath);\n const tsconfig = readTsconfig(tsconfigPath);\n\n const aliases: AliasMap = buildAliasMap(config.aliases, tsconfig, rootDir);\n\n return {\n rootDir,\n config,\n ...(tsconfig ? { tsconfig } : {}),\n aliases,\n };\n}\n","import type { ParsedFile } from \"./parser.js\";\n\n/**\n * Classification of a resolved import edge.\n */\nexport type EdgeKind = \"internal\" | \"external\" | \"unresolved\";\n\nexport interface ResolvedImport {\n /** The original declaration the edge was derived from. */\n raw: string;\n edgeKind: EdgeKind;\n /**\n * Absolute path of the resolved target. Only set when `edgeKind ===\n * \"internal\"`.\n */\n resolvedPath?: string;\n}\n\nexport interface GraphNode {\n /** Absolute path of the file. */\n path: string;\n parsed: ParsedFile;\n}\n\n/**\n * A circular dependency group: every file that is mutually reachable\n * (strongly connected component). `path` is a representative import chain\n * through the group, `members` the complete sorted member set.\n */\nexport interface Cycle {\n /** Complete sorted member paths of the cycle group. */\n members: string[];\n /** Representative ordered cycle path (first element === last element). */\n path: string[];\n}\n\n/**\n * Aggregate statistics of a graph, computed during build. Feeds the\n * confidence heuristic and `ripple graph` output.\n */\nexport interface GraphStats {\n /** Discovered files. */\n files: number;\n /** Files that parsed without errors. */\n parsed: number;\n /** Internal edges that resolved to a discovered file. */\n internalEdges: number;\n /** Relative/alias edges that resolved to nothing. */\n unresolvedEdges: number;\n /** Edges leaving the analyzed file set (packages, assets). */\n externalEdges: number;\n /** Circular dependency groups. */\n cycles: number;\n}\n\n/**\n * In-memory directed dependency graph.\n *\n * - `forward` maps a file to the set of files it imports.\n * - `reverse` maps a file to the set of files that import it.\n * - `external` maps a file to the set of specifiers that leave the project\n * (node_modules packages, assets, non-discovered files).\n */\nexport interface DependencyGraph {\n nodes: Map<string, GraphNode>;\n forward: Map<string, Set<string>>;\n reverse: Map<string, Set<string>>;\n external: Map<string, Set<string>>;\n cycles: Cycle[];\n stats: GraphStats;\n}\n\nexport function edgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.forward.values()) {\n count += targets.size;\n }\n return count;\n}\n\nexport function externalEdgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.external.values()) {\n count += targets.size;\n }\n return count;\n}\n\n/** All file paths that participate in at least one cycle. */\nexport function cycleMemberPaths(graph: DependencyGraph): Set<string> {\n const members = new Set<string>();\n for (const cycle of graph.cycles) {\n for (const path of cycle.members) {\n members.add(path);\n }\n }\n return members;\n}\n","import type { GraphStats } from \"../types/graph.js\";\n\n/**\n * Confidence heuristic: how much of the graph could be analyzed reliably.\n *\n * - Parse rate: fraction of discovered files that parsed without errors.\n * - Resolution rate: fraction of non-external import edges that resolved to\n * a known file.\n * - A cycle touching the analyzed file is a small uncertainty penalty.\n *\n * Range: 0-100, rounded.\n */\nexport function computeConfidence(stats: GraphStats, targetInCycle: boolean): number {\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n const totalEdges = stats.internalEdges + stats.unresolvedEdges;\n const resolutionRate = totalEdges === 0 ? 1 : stats.internalEdges / totalEdges;\n\n let confidence = parseRate * (0.4 + 0.6 * resolutionRate);\n if (targetInCycle) confidence *= 0.95;\n\n return Math.round(Math.min(1, Math.max(0, confidence)) * 100);\n}\n","import path from \"node:path\";\n\n/**\n * Path helpers shared across Ripple.\n *\n * Canonical path keys are POSIX-style normalized absolute paths. On Windows\n * they are lower-cased because the filesystem is case-insensitive; two paths\n * differing only in case must not create two graph nodes.\n */\n\nexport const SOURCE_EXTENSIONS = [\".ts\", \".tsx\", \".js\", \".jsx\"] as const;\n\nexport const RESOLVABLE_EXTENSIONS = [...SOURCE_EXTENSIONS, \".mjs\", \".cjs\", \".d.ts\"] as const;\n\n/** Convert a path to forward slashes for display and matching. */\nexport function toPosix(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\n/** Normalize a path and make it absolute. */\nexport function normalizeAbsolute(filePath: string, cwd: string): string {\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Canonical key for use in Maps/Sets: normalized, POSIX, and lower-cased on\n * Windows.\n */\nexport function pathKey(filePath: string, cwd: string): string {\n const absolute = normalizeAbsolute(filePath, cwd);\n const posix = toPosix(absolute);\n return process.platform === \"win32\" ? posix.toLowerCase() : posix;\n}\n\n/** Whether a module specifier is a relative import (`./` or `../`). */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/** Whether the specifier is a bare package import (`react`, `@scope/pkg`). */\nexport function isBareSpecifier(specifier: string): boolean {\n return !isRelativeSpecifier(specifier) && !specifier.startsWith(\"/\");\n}\n\n/** Source file kind from an absolute path. Declaration files are excluded. */\nexport function sourceFileKind(filePath: string): \"ts\" | \"tsx\" | \"js\" | \"jsx\" | undefined {\n if (/\\.d\\.[cm]?ts$/i.test(filePath)) return undefined;\n const ext = path.extname(filePath).toLowerCase();\n return SOURCE_EXTENSIONS.includes(ext as (typeof SOURCE_EXTENSIONS)[number])\n ? (ext.slice(1) as \"ts\" | \"tsx\" | \"js\" | \"jsx\")\n : undefined;\n}\n\n/** The extension-candidates list for resolving an extensionless import. */\nexport function extensionCandidates(basePath: string): string[] {\n return RESOLVABLE_EXTENSIONS.map((ext) => basePath + ext);\n}\n\n/**\n * TS-style JS extension swap: when a specifier imports `./x.js` but only\n * `./x.ts` exists (NodeNext-style projects), the candidate resolves to the TS\n * file.\n */\nexport function jsToTsCandidate(candidate: string): string {\n const ext = path.extname(candidate);\n if (ext === \".js\") return candidate.slice(0, -3) + \".ts\";\n if (ext === \".jsx\") return candidate.slice(0, -4) + \".tsx\";\n if (ext === \".mjs\") return candidate.slice(0, -4) + \".mts\";\n if (ext === \".cjs\") return candidate.slice(0, -4) + \".cts\";\n return candidate;\n}\n\n/** Human-readable relative path (from cwd) for display in output. */\nexport function displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return toPosix(relative === \"\" ? path.basename(filePath) : relative);\n}\n\n/**\n * First path segment of `filePath` relative to `root`, used for impact areas.\n * Returns `undefined` when the file is outside the root.\n */\nexport function firstSegment(filePath: string, root: string): string | undefined {\n const relative = toPosix(path.relative(root, filePath));\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return undefined;\n const segment = relative.split(\"/\")[0];\n return segment && segment !== \"\" ? segment : undefined;\n}\n","import path from \"node:path\";\nimport { findPackageJson, pathExistsSync, readPackageEntryPoints } from \"../utils/fs.js\";\nimport { toPosix } from \"../utils/paths.js\";\nimport type { Category } from \"../types/analysis.js\";\n\n/**\n * Deterministic file categorization heuristics.\n *\n * A file can match several categories (a `page.tsx` is both a route and a\n * component). Everything here is path/name based — no source analysis — so\n * categorization is cheap, stable and easy to document.\n */\n\nconst ROUTE_FILE_NAMES = new Set([\n \"route\",\n \"page\",\n \"layout\",\n \"middleware\",\n \"loading\",\n \"error\",\n \"not-found\",\n]);\n\nconst ROUTE_DIR_NAMES = new Set([\"routes\", \"api\"]);\n\nconst UTILITY_DIR_NAMES = new Set([\"lib\", \"utils\", \"helpers\", \"shared\", \"common\", \"core\"]);\n\nconst COMPONENT_DIR_NAMES = new Set([\"components\", \"ui\"]);\n\nconst ENTRY_FILE_NAMES = new Set([\"index\", \"main\", \"app\", \"server\", \"cli\", \"bin\"]);\n\nconst TEST_SEGMENT = \"__tests__\";\n\nfunction relativeSegments(filePath: string, rootDir: string): string[] {\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return [];\n return relative.split(\"/\").filter((segment) => segment !== \"\" && segment !== \".\");\n}\n\nfunction isRouteFile(basename: string): boolean {\n return ROUTE_FILE_NAMES.has(basename);\n}\n\nfunction isTestFile(name: string, segments: string[]): boolean {\n if (segments.includes(TEST_SEGMENT)) return true;\n if (/(^|[._-])(test|spec)([._-]|$)/i.test(name)) return true;\n return segments.some((segment) => segment === \"tests\");\n}\n\nfunction isComponentFile(basename: string, extension: string, segments: string[]): boolean {\n if (extension === \"tsx\" || extension === \"jsx\") return true;\n if (!COMPONENT_DIR_NAMES.has(segments.at(-2) ?? \"\")) return false;\n return /^[A-Z]/.test(basename);\n}\n\nfunction isUtilityFile(segments: string[]): boolean {\n return segments.some((segment) => UTILITY_DIR_NAMES.has(segment));\n}\n\nfunction isEntryFile(filePath: string, rootDir: string, entryPoints: Set<string>): boolean {\n if (entryPoints.has(path.normalize(filePath))) return true;\n\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return false;\n const segments = relative.split(\"/\");\n if (segments.length !== 2) return false;\n if (segments[0] !== \"src\" && segments[0] !== \"\") return false;\n\n const basename = segments[1] ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n return ENTRY_FILE_NAMES.has(name);\n}\n\nexport interface CategorizerOptions {\n rootDir: string;\n /** Absolute paths of entry points (package.json `main`/`bin`, conventions). */\n entryPoints: Set<string>;\n}\n\n/**\n * Create a categorizer bound to a project. Returns a function that classifies\n * an absolute file path into zero or more categories.\n */\nexport function createCategorizer(options: CategorizerOptions): (filePath: string) => Category[] {\n const { rootDir, entryPoints } = options;\n\n return (filePath: string): Category[] => {\n const segments = relativeSegments(filePath, rootDir);\n const basename = segments.at(-1) ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n const extension = dot === -1 ? \"\" : basename.slice(dot + 1).toLowerCase();\n\n const categories: Category[] = [];\n\n if (isRouteFile(name)) categories.push(\"route\");\n else if (segments.some((segment) => ROUTE_DIR_NAMES.has(segment))) categories.push(\"route\");\n\n if (isTestFile(name, segments)) categories.push(\"test\");\n if (isComponentFile(name, extension, segments)) categories.push(\"component\");\n if (isUtilityFile(segments)) categories.push(\"utility\");\n if (isEntryFile(filePath, rootDir, entryPoints)) categories.push(\"entry\");\n if (categories.length === 0) categories.push(\"other\");\n\n return categories;\n };\n}\n\n/**\n * Detect entry points: package.json `main`/`bin` plus conventional root\n * entry file names (in the project root or `src/`).\n */\nexport async function detectEntryPoints(rootDir: string): Promise<Set<string>> {\n const entryPoints = new Set<string>();\n\n const packageJsonPath = await findPackageJson(rootDir);\n if (packageJsonPath) {\n const packageDir = path.dirname(packageJsonPath);\n for (const entry of await readPackageEntryPoints(packageJsonPath)) {\n const absolute = path.resolve(packageDir, entry);\n if (pathExistsSync(absolute)) entryPoints.add(path.normalize(absolute));\n }\n }\n\n const baseDirs = [rootDir, path.join(rootDir, \"src\")];\n for (const baseDir of baseDirs) {\n for (const name of ENTRY_FILE_NAMES) {\n for (const extension of [\"ts\", \"tsx\", \"js\", \"jsx\"]) {\n const candidate = path.join(baseDir, `${name}.${extension}`);\n if (pathExistsSync(candidate)) entryPoints.add(path.normalize(candidate));\n }\n }\n }\n\n return entryPoints;\n}\n","/**\n * Turn a directory segment into a human-readable impact-area label:\n *\n * - `user-profile` → `User Profile`\n * - `userProfile` → `User Profile`\n * - `oauth` → `OAuth` (known acronyms use their canonical casing)\n * - `authentication` → `Authentication`\n */\nconst ACRONYM_CANONICAL: Record<string, string> = {\n api: \"API\",\n ui: \"UI\",\n ux: \"UX\",\n oauth: \"OAuth\",\n jwt: \"JWT\",\n http: \"HTTP\",\n https: \"HTTPS\",\n ws: \"WS\",\n sse: \"SSE\",\n db: \"DB\",\n sql: \"SQL\",\n id: \"ID\",\n cli: \"CLI\",\n ci: \"CI\",\n cd: \"CD\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n cors: \"CORS\",\n url: \"URL\",\n uri: \"URI\",\n uuid: \"UUID\",\n html: \"HTML\",\n css: \"CSS\",\n js: \"JS\",\n ts: \"TS\",\n tsx: \"TSX\",\n jsx: \"JSX\",\n aws: \"AWS\",\n s3: \"S3\",\n sms: \"SMS\",\n mfa: \"MFA\",\n otp: \"OTP\",\n smtp: \"SMTP\",\n rss: \"RSS\",\n};\n\nfunction splitWords(segment: string): string[] {\n const normalized = segment.replace(/[^a-zA-Z0-9]+/g, \" \");\n const matches = normalized.match(/[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|[0-9]+/g);\n return (matches ?? [segment]).map((word) => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nexport function humanizeArea(segment: string): string {\n const words = splitWords(segment);\n if (words.length === 0) return capitalize(segment);\n return words.map((word) => ACRONYM_CANONICAL[word] ?? capitalize(word)).join(\" \");\n}\n","import type { ImpactSummary, TopImpactArea } from \"../types/analysis.js\";\nimport type { AffectedFile } from \"../types/analysis.js\";\nimport { firstSegment } from \"../utils/paths.js\";\nimport { humanizeArea } from \"./humanize.js\";\n\n/**\n * Aggregate the affected-file map into an `ImpactSummary`: per-category\n * counters, max depth and top impact areas.\n *\n * A file matched by several categories counts once per category — counts\n * therefore do not sum to `affectedFiles`.\n */\n\nconst MAX_IMPACT_AREAS = 5;\n\nexport function buildSummary(\n affected: Map<string, AffectedFile>,\n srcRoot: string,\n confidence: number,\n): ImpactSummary {\n let routes = 0;\n let tests = 0;\n let components = 0;\n let utilities = 0;\n let entries = 0;\n let maxDepth = 0;\n\n const areaCounts = new Map<string, number>();\n\n for (const file of affected.values()) {\n if (file.depth > maxDepth) maxDepth = file.depth;\n if (file.categories.includes(\"route\")) routes++;\n if (file.categories.includes(\"test\")) tests++;\n if (file.categories.includes(\"component\")) components++;\n if (file.categories.includes(\"utility\")) utilities++;\n if (file.categories.includes(\"entry\")) entries++;\n\n const area = firstSegment(file.path, srcRoot);\n if (area) {\n areaCounts.set(area, (areaCounts.get(area) ?? 0) + 1);\n }\n }\n\n const topImpact: TopImpactArea[] = [...areaCounts.entries()]\n .map(([label, count]) => ({ label: humanizeArea(label), count }))\n .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))\n .slice(0, MAX_IMPACT_AREAS);\n\n return {\n affectedFiles: affected.size,\n routes,\n tests,\n components,\n utilities,\n entries,\n maxDepth,\n topImpact,\n confidence,\n };\n}\n","import type { AffectedFile } from \"../types/analysis.js\";\nimport type { Category } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\n\n/**\n * Reverse traversal: BFS over the reverse (importer) adjacency from a target\n * file, collecting every file that could be affected by changing it.\n *\n * - The target itself is never included in the result.\n * - `depth` is the number of import hops from the target (direct dependents\n * are depth 1).\n * - `maxDepth` caps the blast radius; `undefined` means unlimited.\n * - Visited set makes the traversal linear in the reachable subgraph.\n */\n\nexport interface ReverseTraversalOptions {\n maxDepth?: number;\n /** Classifies each visited file; provided by the caller for testability. */\n categorize: (filePath: string) => Category[];\n}\n\nexport interface ReverseTraversalResult {\n affected: Map<string, AffectedFile>;\n maxDepth: number;\n}\n\nexport function reverseTraverse(\n graph: DependencyGraph,\n targetKey: string,\n options: ReverseTraversalOptions,\n): ReverseTraversalResult {\n const { maxDepth, categorize } = options;\n\n const affected: Map<string, AffectedFile> = new Map();\n const visited = new Set<string>([targetKey]);\n const cycleMembers = cycleMemberPaths(graph);\n\n if (!graph.reverse.has(targetKey)) {\n return { affected, maxDepth: 0 };\n }\n\n const queue: Array<{ key: string; depth: number }> = [];\n for (const importer of graph.reverse.get(targetKey) ?? []) {\n queue.push({ key: importer, depth: 1 });\n }\n\n let deepest = 0;\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n\n if (visited.has(current.key)) continue;\n visited.add(current.key);\n\n deepest = Math.max(deepest, current.depth);\n const node = graph.nodes.get(current.key);\n const filePath = node?.path ?? current.key;\n\n affected.set(current.key, {\n path: filePath,\n depth: current.depth,\n direct: current.depth === 1,\n categories: categorize(filePath),\n inCycle: cycleMembers.has(current.key),\n });\n\n if (maxDepth === undefined || current.depth < maxDepth) {\n for (const importer of graph.reverse.get(current.key) ?? []) {\n if (!visited.has(importer)) {\n queue.push({ key: importer, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { affected, maxDepth: deepest };\n}\n","import type { RiskThresholds } from \"../types/config.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Map a 0-100 risk score to a level using the configured thresholds.\n */\nexport function scoreToLevel(score: number, thresholds: RiskThresholds): RiskLevel {\n if (score >= thresholds.critical) return \"CRITICAL\";\n if (score >= thresholds.high) return \"HIGH\";\n if (score >= thresholds.medium) return \"MEDIUM\";\n return \"LOW\";\n}\n\n/** Clamp a value into [min, max]. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * Log-scale a count into [0, 1]: 0 stays 0, `cap` reaches 1, everything\n * above `cap` saturates. Prevents one huge graph from dominating the score.\n */\nexport function logScale(count: number, cap: number): number {\n if (count <= 0) return 0;\n return clamp(Math.log10(count + 1) / Math.log10(cap + 1), 0, 1);\n}\n","import type { ImpactSummary } from \"../types/analysis.js\";\nimport type { RiskConfig } from \"../types/config.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { RiskFactor, RiskResult } from \"../types/risk.js\";\nimport { clamp, logScale, scoreToLevel } from \"./levels.js\";\n\n/**\n * Deterministic weighted risk heuristic.\n *\n * Each factor normalizes a graph signal into [0, 1] (see the doc comments on\n * `FACTORS`). The score is the weighted sum of the factors scaled to 0-100.\n * Factors and thresholds are user-configurable; the defaults sum to 1.0.\n */\n\ninterface RiskInput {\n summary: ImpactSummary;\n targetParsed: ParsedFile;\n targetInCycle: boolean;\n riskConfig: RiskConfig;\n}\n\ninterface FactorDefinition {\n name: string;\n label: string;\n /** Default weight (config overrides). */\n defaultWeight: number;\n compute: (input: RiskInput) => number;\n}\n\n/** Saturation caps: the count at which a factor maxes out. */\nconst CAP_AFFECTED_FILES = 100;\nconst CAP_UTILITIES = 10;\nconst CAP_TESTS = 15;\nconst CAP_ROUTES = 10;\nconst CAP_EXPORTS = 20;\n\nconst FACTORS: FactorDefinition[] = [\n {\n name: \"affectedFiles\",\n label: \"Affected files\",\n defaultWeight: 0.3,\n compute: ({ summary }) => logScale(summary.affectedFiles, CAP_AFFECTED_FILES),\n },\n {\n name: \"entryPoint\",\n label: \"Entry point impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => (summary.entries > 0 ? 1 : 0),\n },\n {\n name: \"sharedUtility\",\n label: \"Shared utilities impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => clamp(summary.utilities / CAP_UTILITIES, 0, 1),\n },\n {\n name: \"publicExports\",\n label: \"Public export surface\",\n defaultWeight: 0.1,\n compute: ({ targetParsed }) => {\n const { exports } = targetParsed;\n const count =\n exports.named.length + (exports.hasDefault ? 1 : 0) + exports.reExportedFrom.length;\n return clamp(count / CAP_EXPORTS, 0, 1);\n },\n },\n {\n name: \"tests\",\n label: \"Tests affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.tests / CAP_TESTS, 0, 1),\n },\n {\n name: \"routes\",\n label: \"Routes affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.routes / CAP_ROUTES, 0, 1),\n },\n {\n name: \"cycleMembership\",\n label: \"Circular dependency\",\n defaultWeight: 0.1,\n compute: ({ targetInCycle }) => (targetInCycle ? 1 : 0),\n },\n];\n\nfunction weightFor(definition: FactorDefinition, input: RiskInput): number {\n const configured = input.riskConfig.weights[definition.name as keyof RiskConfig[\"weights\"]];\n return configured ?? definition.defaultWeight;\n}\n\n/**\n * Compute the risk score and per-factor breakdown for an analysis result.\n */\nexport function scoreRisk(input: RiskInput): RiskResult {\n const factors: RiskFactor[] = FACTORS.map((definition) => {\n const weight = weightFor(definition, input);\n const value = definition.compute(input);\n return {\n name: definition.name,\n label: definition.label,\n weight,\n value,\n contribution: Math.round(weight * value * 100 * 100) / 100,\n };\n });\n\n const score = clamp(\n Math.round(factors.reduce((sum, factor) => sum + factor.contribution, 0) * 100) / 100,\n 0,\n 100,\n );\n\n return {\n score,\n level: scoreToLevel(score, input.riskConfig.thresholds),\n factors,\n };\n}\n","import path from \"node:path\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { computeConfidence } from \"./confidence.js\";\nimport { createCategorizer } from \"./categorize.js\";\nimport { buildSummary } from \"./impact.js\";\nimport { reverseTraverse } from \"./reverse-traverse.js\";\nimport { scoreRisk } from \"../risk/score.js\";\n\n/**\n * Orchestrates a single `ripple analyze` run on top of an already-built\n * graph. Everything the commands layer needs is injected; the function is\n * pure apart from cheap filesystem existence checks.\n */\n\nexport interface AnalyzeInput {\n graph: DependencyGraph;\n context: ProjectContext;\n /** Absolute paths of detected entry points. */\n entryPoints: Set<string>;\n /** Canonical graph key of the analyzed file. */\n targetKey: string;\n /** Absolute path of the analyzed file. */\n targetPath: string;\n /** Wall time of the whole run, for reporting. */\n durationMs: number;\n /** Cap on traversal depth (undefined = unlimited). */\n maxDepth?: number;\n}\n\n/** The source root (directory holding the source tree) for impact areas. */\nexport function sourceRoot(rootDir: string): string {\n const candidate = path.join(rootDir, \"src\");\n return pathExistsSync(candidate) ? candidate : rootDir;\n}\n\nexport function analyzeFile(input: AnalyzeInput): AnalysisResult {\n const { graph, context, entryPoints, targetKey, targetPath, durationMs, maxDepth } = input;\n\n const node = graph.nodes.get(targetKey);\n if (!node) {\n throw new Error(`Target file is not part of the graph: ${targetPath}`);\n }\n\n const categorize = createCategorizer({ rootDir: context.rootDir, entryPoints });\n const { affected, maxDepth: reachedDepth } = reverseTraverse(graph, targetKey, {\n maxDepth,\n categorize,\n });\n\n const targetInCycle = cycleMemberPaths(graph).has(targetKey);\n const confidence = computeConfidence(graph.stats, targetInCycle);\n const summary = buildSummary(affected, sourceRoot(context.rootDir), confidence);\n\n const risk = scoreRisk({\n summary,\n targetParsed: node.parsed,\n targetInCycle,\n riskConfig: context.config.risk,\n });\n\n return {\n targetPath,\n rootDir: context.rootDir,\n graph,\n affected,\n summary,\n risk,\n targetInCycle,\n durationMs,\n maxDepth: reachedDepth,\n };\n}\n","import chalk from \"chalk\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Terminal text helpers. All functions take a `color` flag so output stays\n * deterministic in tests and in `--json` mode.\n */\n\nexport interface TextStyle {\n color: boolean;\n}\n\n/** Muted/secondary text, e.g. hints and counts. */\nexport function dim(text: string, style: TextStyle): string {\n return style.color ? chalk.dim(text) : text;\n}\n\n/** Emphasized value text. */\nexport function strong(text: string, style: TextStyle): string {\n return style.color ? chalk.bold(text) : text;\n}\n\nconst RISK_COLORS: Record<RiskLevel, (text: string) => string> = {\n LOW: (text) => chalk.green(text),\n MEDIUM: (text) => chalk.yellow(text),\n HIGH: (text) => chalk.magenta(text),\n CRITICAL: (text) => chalk.red.bold(text),\n};\n\n/** Chalk style function for a risk level. */\nexport function riskColor(level: RiskLevel): (text: string) => string {\n return RISK_COLORS[level];\n}\n\n/** Colored risk level badge, e.g. ` HIGH `. */\nexport function riskBadge(level: RiskLevel, style: TextStyle): string {\n return style.color ? RISK_COLORS[level](level) : level;\n}\n\n/** Confidence percentage with a subtle color cue. */\nexport function confidenceText(percent: number, style: TextStyle): string {\n const text = `${percent}%`;\n if (!style.color) return text;\n if (percent >= 90) return chalk.green(text);\n if (percent >= 70) return chalk.yellow(text);\n return chalk.red(text);\n}\n\n/** Humanize a duration in milliseconds. */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/** Format a number with a plural-friendly noun, e.g. `7 files`. */\nexport function pluralize(count: number, noun: string, plural = `${noun}s`): string {\n return `${count} ${count === 1 ? noun : plural}`;\n}\n","import figures from \"figures\";\n\n/**\n * CLI glyph registry. `figures` keeps every symbol cross-platform and gives\n * a sensible fallback on consoles that cannot render Unicode.\n */\n\nexport type IconName =\n | \"tick\"\n | \"cross\"\n | \"warning\"\n | \"info\"\n | \"arrowRight\"\n | \"pointer\"\n | \"bullet\"\n | \"ellipsis\"\n | \"circle\";\n\n/** Resolve a named glyph for terminal output. */\nexport function icon(name: IconName): string {\n return figures[name];\n}\n","import chalk from \"chalk\";\nimport { formatDuration } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Staged progress tracker. In interactive terminals each completed stage is\n * printed as a checkmarked line with its elapsed time:\n *\n * ✔ Loading config (2ms)\n * ✔ Building dependency graph (118ms)\n * ✔ Analyzing impact (1ms)\n *\n * Everywhere else (CI, pipes, JSON mode) it is a silent no-op.\n */\n\nexport interface StageTracker {\n /** Finish the previous stage (if any) and announce the next one. */\n next(label: string): void;\n /** Finish the current stage. */\n done(): void;\n}\n\nconst noop: StageTracker = {\n next: () => {},\n done: () => {},\n};\n\nexport function createStageTracker(enabled: boolean): StageTracker {\n if (!enabled || !process.stdout.isTTY) return noop;\n\n let current: string | undefined;\n let from = 0;\n\n const stamp = (label: string, ms: number): void => {\n process.stdout.write(\n `${chalk.green(icon(\"tick\"))} ${label} ${chalk.dim(formatDuration(ms))}\\n`,\n );\n };\n\n return {\n next(label: string): void {\n if (current) stamp(current, Date.now() - from);\n current = label;\n from = Date.now();\n },\n done(): void {\n if (current) stamp(current, Date.now() - from);\n current = undefined;\n },\n };\n}\n","/**\n * Resolve whether terminal output should be styled. Honors the explicit\n * `--no-color` flag first, then the standard `NO_COLOR` environment\n * variable (https://no-color.org). Actual ANSI emission is left to chalk,\n * which further disables itself when the stream is not a TTY.\n */\nexport function resolveColor(requested: boolean | undefined): boolean {\n if (requested === false) return false;\n const noColor = process.env.NO_COLOR;\n return noColor === undefined || noColor === \"\";\n}\n","/**\n * Simple aligned table rendering. Cells are padded to the widest cell in\n * their column; rows are joined with two spaces.\n */\n\nexport interface TableColumn {\n header: string;\n /** Right-align numeric-ish columns. */\n align?: \"left\" | \"right\";\n}\n\nexport function renderTable(columns: TableColumn[], rows: string[][]): string {\n const widths = columns.map((column, index) => {\n const cells = [column.header, ...rows.map((row) => row[index] ?? \"\")];\n return Math.max(...cells.map((cell) => cell.length));\n });\n\n const pad = (value: string, index: number): string => {\n const width = widths[index] ?? value.length;\n return columns[index]?.align === \"right\" ? value.padStart(width) : value.padEnd(width);\n };\n\n const lines: string[] = [];\n lines.push(columns.map((column, index) => pad(column.header, index)).join(\" \"));\n for (const row of rows) {\n lines.push(row.map((cell, index) => pad(cell, index)).join(\" \"));\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a key-value block with aligned values:\n *\n * Risk HIGH\n * Affected 7 files\n */\nexport function renderKeyValue(entries: Array<[string, string]>): string {\n const width = Math.max(...entries.map(([key]) => key.length));\n return entries.map(([key, value]) => `${key.padEnd(width)} ${value}`).join(\"\\n\");\n}\n","import treeify from \"treeify\";\nimport type { TreeObject } from \"treeify\";\n\n/**\n * Tree rendering on top of `treeify`:\n *\n * ├─ src/index.ts\n * │ └─ src/main.ts\n *\n * `treeify` is a tiny pure function (no ink, no DOM), which keeps this layer\n * trivially testable. Leaf values are empty strings; `showValues` is off.\n */\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n}\n\nfunction toTreeify(node: TreeNode): string | TreeObject {\n if (!node.children || node.children.length === 0) return \"\";\n const branch: TreeObject = {};\n for (const child of node.children) {\n branch[child.label] = toTreeify(child);\n }\n return branch;\n}\n\nexport function renderTree(nodes: TreeNode[]): string {\n if (nodes.length === 0) return \"\";\n const root: TreeObject = {};\n for (const node of nodes) {\n root[node.label] = toTreeify(node);\n }\n return treeify.asTree(root, false, false).trimEnd();\n}\n","import chalk from \"chalk\";\nimport type { TextStyle } from \"../formatter/text.js\";\n\n/**\n * Brand identity primitives: the flat header line shown at the top of every\n * interactive command and the `›`-prefixed section titles between blocks.\n *\n * The layout is deliberately minimal — no boxes or dividers — so reports\n * read like a terminal-first tool rather than a printed page.\n */\n\nexport interface BrandOptions {\n /** Command label, e.g. `impact analysis`. */\n label: string;\n /** Semantic version to annotate the header with. */\n version?: string;\n style: TextStyle;\n}\n\n/**\n * Render the branded header as a single flat line:\n *\n * ripple · impact analysis · v0.1.1\n *\n * The brand name is bold cyan; the version is dimmed. Colorless output\n * falls back to the plain em-dash line.\n */\nexport function brandHeader(options: BrandOptions): string {\n const { label, version, style } = options;\n if (!style.color) {\n return `ripple — ${label}${version ? ` · v${version}` : \"\"}`;\n }\n const title = chalk.bold.cyan(`ripple · ${label}`);\n return `${title}${version ? ` ${chalk.dim(`· v${version}`)}` : \"\"}`;\n}\n\n/**\n * Section title, optionally prefixed with a dim caret in colored output:\n *\n * › Top impact\n */\nexport function sectionHeader(title: string, style: TextStyle): string {\n if (!style.color) return title;\n return `${chalk.dim(\"›\")} ${chalk.bold(title)}`;\n}\n","import type { TextStyle } from \"../formatter/text.js\";\nimport { riskColor } from \"../formatter/text.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Risk gauge rendering. A 10-cell bar filled proportionally to the 0-100\n * score and tinted with the risk level color, e.g.:\n *\n * MEDIUM · 34.4/100 ███░░░░░░░\n *\n * The bar is color-only; colorless output omits it entirely so logs and\n * pipes stay clean and deterministic.\n */\n\nconst CELLS = 10;\nconst FILL = \"█\";\nconst EMPTY = \"░\";\n\nexport function riskGauge(score: number, level: RiskLevel, style: TextStyle): string {\n if (!style.color) return \"\";\n const filled = Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n return riskColor(level)(FILL.repeat(filled) + EMPTY.repeat(CELLS - filled));\n}\n\n/** Cells filled for a score, exported for tests. */\nexport function filledCells(score: number): number {\n return Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n}\n","import type { AnalysisResult } from \"../types/analysis.js\";\nimport type { AnalyzeJsonReport, GraphJsonReport } from \"../types/output.js\";\nimport type { OutputWriter } from \"../types/cli.js\";\nimport type { DependencyGraph, GraphStats } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { renderKeyValue, renderTable, type TableColumn } from \"../formatter/table.js\";\nimport { renderTree, type TreeNode } from \"../formatter/tree.js\";\nimport {\n confidenceText,\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\n\n/**\n * Report rendering. Terminal output is built here; JSON payloads are built\n * as plain data and serialized by `src/formatter/json.ts`.\n */\n\nexport interface ReportOptions {\n /** Working directory used to relativize display paths. */\n cwd: string;\n /** Whether to emit ANSI colors and styled layout. */\n color: boolean;\n /** Extra sections (risk factor breakdown). */\n verbose: boolean;\n /** Package version shown in the header card. */\n version?: string;\n /** Cap on affected files listed in the terminal tree. */\n listLimit?: number;\n}\n\nconst DEFAULT_LIST_LIMIT = 20;\n\nconst textStyle = (options: ReportOptions): TextStyle => ({ color: options.color });\n\n/** Project-relative path for display, with optional depth/cycle suffixes. */\nfunction fileLabel(filePath: string, depth: number, inCycle: boolean, style: TextStyle): string {\n const parts: string[] = [dim(filePath, style)];\n if (depth >= 0) parts.push(dim(`· depth ${depth}`, style));\n if (inCycle) parts.push(dim(\"· cycle\", style));\n return parts.join(\" \");\n}\n\n/** Impact categories inline, e.g. `4 routes · 2 components · 1 test`. */\nfunction impactLine(result: AnalysisResult, style: TextStyle): string {\n const { summary } = result;\n const parts: string[] = [];\n if (summary.routes > 0) parts.push(pluralize(summary.routes, \"route\"));\n if (summary.components > 0) parts.push(pluralize(summary.components, \"component\"));\n if (summary.tests > 0) parts.push(pluralize(summary.tests, \"test\"));\n if (summary.utilities > 0) parts.push(pluralize(summary.utilities, \"utility\"));\n return parts.length > 0 ? parts.join(\" · \") : dim(\"none\", style);\n}\n\n/** Build the affected-file tree: depth-1 files are roots, deeper files are\n * nested under the first (deterministic) affected importer. */\nfunction buildAffectedTree(result: AnalysisResult, cwd: string, style: TextStyle): TreeNode[] {\n const { affected, graph } = result;\n const sorted = [...affected.entries()].sort(\n ([, a], [, b]) => a.depth - b.depth || a.path.localeCompare(b.path),\n );\n\n const nodesByKey = new Map<string, TreeNode & { children: TreeNode[] }>();\n const depthByKey = new Map<string, number>();\n for (const [key, file] of sorted) {\n const node: TreeNode & { children: TreeNode[] } = { label: \"\", children: [] };\n node.label = fileLabel(displayPath(file.path, cwd), file.depth, file.inCycle, style);\n nodesByKey.set(key, node);\n depthByKey.set(key, file.depth);\n }\n\n const roots: TreeNode[] = [];\n for (const [key, file] of sorted) {\n const node = nodesByKey.get(key);\n if (!node) continue;\n\n if (file.depth === 1) {\n roots.push(node);\n continue;\n }\n\n const importers = graph.reverse.get(key) ?? [];\n const parents = [...importers]\n .filter(\n (candidate) => depthByKey.get(candidate) === file.depth - 1 && nodesByKey.has(candidate),\n )\n .sort((a, b) => (depthByKey.get(a) ?? 0) - (depthByKey.get(b) ?? 0) || a.localeCompare(b));\n\n const parent = parents[0] ? nodesByKey.get(parents[0]) : undefined;\n if (parent) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\n/** Render the full `ripple analyze` terminal report. */\nexport function renderAnalyzeReport(\n result: AnalysisResult,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { summary, risk } = result;\n const file = displayPath(result.targetPath, options.cwd);\n\n writer.writeLine(brandHeader({ label: \"impact analysis\", version: options.version, style }));\n writer.writeLine();\n\n const score = risk.score.toFixed(1);\n const gauge = riskGauge(risk.score, risk.level, style);\n const rows: Array<[string, string]> = [\n [\"File\", file],\n [\"Risk\", `${riskBadge(risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}`],\n [\"Impact\", impactLine(result, style)],\n [\"Affected\", pluralize(summary.affectedFiles, \"file\")],\n [\"Max depth\", String(summary.maxDepth)],\n [\"Confidence\", confidenceText(summary.confidence, style)],\n [\"Duration\", dim(formatDuration(result.durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Top impact\", style));\n for (const area of summary.topImpact) {\n writer.writeLine(\n `${icon(\"bullet\")} ${strong(area.label, style)} ${dim(`(${area.count})`, style)}`,\n );\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (result.graph.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of result.graph.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = result.graph.nodes.get(key);\n return displayPath(node?.path ?? key, options.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n writer.writeLine();\n\n if (summary.affectedFiles > 0) {\n writer.writeLine(sectionHeader(`Affected files (${summary.affectedFiles})`, style));\n const tree = buildAffectedTree(result, options.cwd, style);\n writer.writeLine(renderTree(tree));\n const limit = options.listLimit ?? DEFAULT_LIST_LIMIT;\n if (summary.affectedFiles > limit) {\n writer.writeLine(\n dim(`${summary.affectedFiles - limit} more… use --json for the full list`, style),\n );\n }\n writer.writeLine();\n }\n\n if (options.verbose) {\n writer.writeLine(sectionHeader(\"Risk factors\", style));\n const columns: TableColumn[] = [\n { header: \"Factor\" },\n { header: \"Weight\" },\n { header: \"Signal\" },\n { header: \"Points\" },\n ];\n const rowsVerbose = risk.factors.map((factor) => [\n factor.label,\n factor.weight.toFixed(2),\n factor.value.toFixed(2),\n factor.contribution.toFixed(2),\n ]);\n writer.writeLine(renderTable(columns, rowsVerbose));\n writer.writeLine();\n }\n\n if (style.color) {\n writer.writeLine(\n dim(`${icon(\"info\")} Tip: run \"ripple doctor\" to check project health`, style),\n );\n }\n}\n\n/** Build the machine-readable `analyze --json` payload. */\nexport function buildAnalyzeJsonReport(\n result: AnalysisResult,\n version: string,\n cwd: string,\n): AnalyzeJsonReport {\n const realPath = (key: string): string => result.graph.nodes.get(key)?.path ?? key;\n\n const affected = [...result.affected.values()]\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((file) => ({ ...file, path: displayPath(file.path, cwd) }));\n\n return {\n tool: \"ripple\",\n version,\n command: \"analyze\",\n file: displayPath(result.targetPath, cwd),\n risk: result.risk,\n summary: result.summary,\n affected,\n cycles: result.graph.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), cwd)),\n })),\n targetInCycle: result.targetInCycle,\n durationMs: result.durationMs,\n };\n}\n\nexport interface GraphReportInput {\n stats: GraphStats;\n cycles: DependencyGraph[\"cycles\"];\n nodes: DependencyGraph[\"nodes\"];\n cwd: string;\n /** For `ripple graph <file>`: forward and reverse file lists. */\n forward?: string[];\n reverse?: string[];\n}\n\n/** Render the `ripple graph` terminal report. */\nexport function renderGraphReport(\n input: GraphReportInput,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { stats } = input;\n\n writer.writeLine(brandHeader({ label: \"dependency graph\", version: options.version, style }));\n writer.writeLine();\n\n writer.writeLine(\n renderKeyValue([\n [\"Files\", String(stats.files)],\n [\"Edges\", String(stats.internalEdges)],\n [\"External\", String(stats.externalEdges)],\n [\"Unresolved\", String(stats.unresolvedEdges)],\n [\"Circular groups\", String(stats.cycles)],\n ]),\n );\n writer.writeLine();\n\n if (input.forward) {\n writer.writeLine(sectionHeader(\"Dependants (forward)\", style));\n writer.writeLine(renderTree(input.forward.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n if (input.reverse) {\n writer.writeLine(sectionHeader(\"Dependents (reverse)\", style));\n writer.writeLine(renderTree(input.reverse.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (input.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of input.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = input.nodes.get(key);\n return displayPath(node?.path ?? key, input.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n}\n\n/** Build the machine-readable `graph --json` payload. */\nexport function buildGraphJsonReport(input: GraphReportInput, version: string): GraphJsonReport {\n const realPath = (key: string): string => input.nodes.get(key)?.path ?? key;\n return {\n tool: \"ripple\",\n version,\n command: \"graph\",\n fileCount: input.stats.files,\n edgeCount: input.stats.internalEdges,\n externalEdgeCount: input.stats.externalEdges,\n cycles: input.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), input.cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), input.cwd)),\n })),\n ...(input.forward ? { forward: input.forward } : {}),\n ...(input.reverse ? { reverse: input.reverse } : {}),\n };\n}\n","/** Serialize a report object to pretty JSON. */\nexport function serializeJson(report: unknown): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import { Project, ts } from \"ts-morph\";\n\n/**\n * Shared ts-morph `Project` factory.\n *\n * One project is created per analysis run and reused for every file:\n * ts-morph parses lazily per source file, so this keeps memory bounded while\n * avoiding per-file project overhead. Files are added individually — the\n * tsconfig is never auto-loaded, since Ripple controls discovery itself.\n */\nexport function createTsProject(): Project {\n return new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n jsx: ts.JsxEmit.Preserve,\n noEmit: true,\n target: ts.ScriptTarget.ESNext,\n },\n });\n}\n","import fg from \"fast-glob\";\n\n/**\n * File discovery on top of fast-glob.\n *\n * Patterns are resolved against `cwd`; results are absolute native paths.\n * A file may match several `include` patterns; results are deduplicated.\n */\n\nexport interface GlobOptions {\n cwd: string;\n /** Glob patterns to include. */\n patterns: string[];\n /** Glob patterns to ignore. */\n ignore: string[];\n}\n\nexport async function globFiles(options: GlobOptions): Promise<string[]> {\n const matches = await fg(options.patterns, {\n cwd: options.cwd,\n ignore: options.ignore,\n onlyFiles: true,\n absolute: true,\n unique: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n return matches;\n}\n\n/** Convert a plain directory/segment name to an ignore glob that matches it at any depth. */\nexport function toIgnoreGlob(segment: string): string {\n const trimmed = segment.replace(/^\\/+|\\/+$/g, \"\");\n if (trimmed === \"\") return \"\";\n const glob = trimmed.includes(\"*\") || trimmed.includes(\"{\") ? trimmed : `**/${trimmed}/**`;\n return glob;\n}\n","import { sourceFileKind, SOURCE_EXTENSIONS } from \"../utils/paths.js\";\n\n/**\n * Canonical discovery rules: which extensions count as source files and which\n * directories are ignored by default. `src/config/defaults.ts` imports the\n * default ignore names from here so the knowledge lives in exactly one place.\n */\n\nexport const SOURCE_EXTENSION_GLOB = `*.{${SOURCE_EXTENSIONS.map((e) => e.slice(1)).join(\",\")}}`;\n\n/** Extensions accepted by the scanner. */\nexport const STANDARD_IGNORE_NAMES = [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \"out\",\n \".git\",\n] as const;\n\n/** Whether a file path ends with a discoverable source extension. */\nexport function isSourceFile(filePath: string): boolean {\n return sourceFileKind(filePath) !== undefined;\n}\n","import { globFiles, toIgnoreGlob } from \"../utils/globs.js\";\nimport { isSourceFile } from \"./rules.js\";\n\n/**\n * Recursive source-file discovery for a project.\n *\n * Combines the configured `include` globs with the configured `ignore`\n * entries (plain directory names are converted to catch-all globs) and\n * filters results down to source extensions. Files may match multiple\n * patterns; the result is deduplicated and sorted for determinism.\n */\n\nexport interface DiscoveryOptions {\n rootDir: string;\n include: string[];\n ignore: string[];\n}\n\nexport async function discoverSourceFiles(options: DiscoveryOptions): Promise<string[]> {\n const ignoreGlobs = options.ignore\n .map(toIgnoreGlob)\n .filter((glob) => glob !== \"\")\n .concat([\"**/node_modules/**\"]);\n\n const files = await globFiles({\n cwd: options.rootDir,\n patterns: options.include,\n ignore: ignoreGlobs,\n });\n\n return files.filter(isSourceFile).sort((a, b) => a.localeCompare(b));\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { ExportInfo } from \"../types/parser.js\";\n\n/**\n * Extract the public export surface of a file:\n *\n * - `export const x`, `export function x`, `export class X`, ... (declarations)\n * - `export default ...`\n * - re-exports: `export { x } from \"...\"` and `export * from \"...\"`\n */\nexport function extractExports(sourceFile: SourceFile): ExportInfo {\n const named: string[] = [];\n const reExportedFrom: string[] = [];\n const reExportedAll: string[] = [];\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n const namedExports = decl.getNamedExports();\n\n if (specifier) {\n if (namedExports.length === 0) {\n reExportedAll.push(specifier);\n } else {\n reExportedFrom.push(specifier);\n }\n continue;\n }\n\n for (const namedExport of namedExports) {\n named.push(namedExport.getName());\n }\n }\n\n for (const statement of sourceFile.getVariableStatements()) {\n if (!statement.isExported()) continue;\n for (const declaration of statement.getDeclarations()) {\n named.push(declaration.getName());\n }\n }\n\n for (const fn of sourceFile.getFunctions()) {\n if (!fn.isExported()) continue;\n const name = fn.getName();\n if (name) named.push(name);\n }\n\n for (const cls of sourceFile.getClasses()) {\n if (!cls.isExported()) continue;\n const name = cls.getName();\n if (name) named.push(name);\n }\n\n for (const en of sourceFile.getEnums()) {\n if (!en.isExported()) continue;\n const name = en.getName();\n if (name) named.push(name);\n }\n\n for (const iface of sourceFile.getInterfaces()) {\n if (!iface.isExported()) continue;\n named.push(iface.getName());\n }\n\n for (const alias of sourceFile.getTypeAliases()) {\n if (!alias.isExported()) continue;\n named.push(alias.getName());\n }\n\n const hasDefault =\n sourceFile.getExportAssignments().length > 0 ||\n sourceFile.getFunctions().some((fn) => fn.isDefaultExport()) ||\n sourceFile.getClasses().some((cls) => cls.isDefaultExport());\n\n named.sort();\n return { named, hasDefault, reExportedFrom, reExportedAll };\n}\n","import { SyntaxKind, type ImportEqualsDeclaration, type SourceFile } from \"ts-morph\";\nimport type { ImportDeclaration, ImportSpecifier } from \"../types/parser.js\";\n\n/**\n * Extract every module specifier a file depends on:\n *\n * - `import ... from \"x\"` / bare `import \"x\"`\n * - `export { ... } from \"x\"` / `export * from \"x\"`\n * - `import(\"x\")` dynamic imports\n * - `require(\"x\")` and `import x = require(\"x\")`\n *\n * Only statically analyzable string-literal specifiers are reported.\n */\n\nfunction specifierFor(\n imported: string,\n alias: string | undefined,\n isType: boolean,\n): ImportSpecifier {\n return alias && alias !== imported\n ? { name: imported, alias, isType }\n : { name: imported, isType };\n}\n\nexport function extractImports(sourceFile: SourceFile): ImportDeclaration[] {\n const declarations: ImportDeclaration[] = [];\n\n for (const decl of sourceFile.getImportDeclarations()) {\n declarations.push({\n raw: decl.getModuleSpecifierValue(),\n kind: \"import\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedImports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier) continue;\n declarations.push({\n raw: specifier,\n kind: \"export-from\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedExports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n const importEqualsNodes = sourceFile\n .getDescendantsOfKind(SyntaxKind.ImportEqualsDeclaration)\n .map((node) => node as ImportEqualsDeclaration);\n for (const decl of importEqualsNodes) {\n const literal = decl.getFirstDescendantByKind(SyntaxKind.StringLiteral);\n if (literal) {\n declarations.push({\n raw: literal.getLiteralText(),\n kind: \"require\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n }\n\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const callee = call.getExpression().getText();\n if (callee !== \"require\" && callee !== \"import\") continue;\n const argument = call.getArguments()[0];\n if (!argument?.isKind(SyntaxKind.StringLiteral)) continue;\n declarations.push({\n raw: argument.getLiteralText(),\n kind: callee === \"require\" ? \"require\" : \"dynamic\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n\n return declarations;\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { SymbolInfo } from \"../types/parser.js\";\n\n/**\n * Extract top-level declarations of a file. Used by the risk engine to\n * estimate the public surface and by categorization to classify files.\n */\nexport function extractSymbols(sourceFile: SourceFile): SymbolInfo {\n return {\n functions: sourceFile.getFunctions().map((fn) => fn.getName() ?? \"(default)\"),\n classes: sourceFile.getClasses().map((cls) => cls.getName() ?? \"(default)\"),\n interfaces: sourceFile.getInterfaces().map((iface) => iface.getName()),\n enums: sourceFile.getEnums().map((en) => en.getName()),\n typeAliases: sourceFile.getTypeAliases().map((alias) => alias.getName()),\n };\n}\n","import type { Project, SourceFile } from \"ts-morph\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport { sourceFileKind } from \"../utils/paths.js\";\nimport { extractExports } from \"./exports.js\";\nimport { extractImports } from \"./imports.js\";\nimport { extractSymbols } from \"./symbols.js\";\n\n/**\n * Parse one file into a `ParsedFile`. A parse failure must never abort the\n * analysis: the error is recorded and the file keeps an empty surface so it\n * still participates in the graph as a node.\n */\nexport function parseSourceFile(project: Project, filePath: string): ParsedFile {\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch (error) {\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: [],\n exports: { named: [], hasDefault: false, reExportedFrom: [], reExportedAll: [] },\n symbols: { functions: [], classes: [], interfaces: [], enums: [], typeAliases: [] },\n parseError: error instanceof Error ? error.message : String(error),\n };\n }\n\n return {\n path: filePath,\n kind: sourceFileKind(filePath) ?? \"ts\",\n imports: extractImports(sourceFile),\n exports: extractExports(sourceFile),\n symbols: extractSymbols(sourceFile),\n };\n}\n\n/** Parse many files, reusing the shared project. Never throws. */\nexport function parseMany(project: Project, filePaths: string[]): ParsedFile[] {\n return filePaths.map((filePath) => parseSourceFile(project, filePath));\n}\n","import type { Cycle, DependencyGraph } from \"../types/graph.js\";\n\n/**\n * Cycle detection via Kosaraju's strongly-connected-components algorithm,\n * implemented iteratively so deep import chains can never overflow the call\n * stack.\n *\n * Every SCC with more than one node (or a self-loop) is a circular\n * dependency group. For each group we additionally walk one representative\n * cycle path so output shows the *actual import chain*, not just the member\n * set.\n *\n * Ripple reports cycle *groups*: two files in the same SCC are reported once,\n * not once per back edge.\n */\n\n/** Find SCCs in `graph`. Returns groups of node keys. */\nexport function findCycles(graph: DependencyGraph): Cycle[] {\n const nodeKeys = [...graph.nodes.keys()];\n\n // Pass 1: finish order via iterative DFS on the forward graph.\n const visited = new Set<string>();\n const finishOrder: string[] = [];\n\n for (const start of nodeKeys) {\n if (visited.has(start)) continue;\n const stack: Array<[node: string, neighborIndex: number]> = [[start, 0]];\n visited.add(start);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n if (top === undefined) break;\n const [node, index] = top;\n const neighbors = [...(graph.forward.get(node) ?? [])];\n\n if (index < neighbors.length) {\n top[1] = index + 1;\n const neighbor = neighbors[index];\n if (neighbor === undefined) continue;\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n stack.push([neighbor, 0]);\n }\n } else {\n stack.pop();\n finishOrder.push(node);\n }\n }\n }\n\n // Pass 2: process in reverse finish order on the reverse graph.\n const componentOf = new Map<string, number>();\n const components: string[][] = [];\n\n for (let i = finishOrder.length - 1; i >= 0; i--) {\n const start = finishOrder[i];\n if (start === undefined || componentOf.has(start)) continue;\n\n const component: string[] = [];\n const stack = [start];\n componentOf.set(start, components.length);\n\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) continue;\n component.push(node);\n for (const neighbor of graph.reverse.get(node) ?? []) {\n if (!componentOf.has(neighbor)) {\n componentOf.set(neighbor, components.length);\n stack.push(neighbor);\n }\n }\n }\n\n components.push(component);\n }\n\n const cycles: Cycle[] = [];\n for (const component of components) {\n if (component.length < 2) {\n const single = component[0];\n if (single !== undefined && graph.forward.get(single)?.has(single)) {\n cycles.push({ members: [single], path: [single, single] });\n }\n continue;\n }\n\n const members = [...component].sort();\n const componentSet = new Set(component);\n const path = representativeCyclePath(graph, component, componentSet);\n cycles.push({ members, path: path ?? [members[0]!, members[0]!] });\n }\n\n cycles.sort(\n (a, b) => a.members.length - b.members.length || a.members[0]!.localeCompare(b.members[0]!),\n );\n return cycles;\n}\n\n/**\n * Walk forward edges within the component until a node is revisited; the\n * segment from the first occurrence forms a cycle path (start == end).\n */\nfunction representativeCyclePath(\n graph: DependencyGraph,\n component: string[],\n componentSet: Set<string>,\n): string[] | undefined {\n const inPath = new Set<string>();\n const path: string[] = [];\n let current: string | undefined = component[0];\n\n for (let steps = 0; steps <= component.length * 2 && current !== undefined; steps++) {\n const firstOccurrence = inPath.has(current);\n if (firstOccurrence) {\n const start = path.indexOf(current);\n if (start === -1) return undefined;\n const cycle = path.slice(start);\n if (cycle.length > 1 || graph.forward.get(current)?.has(current)) {\n cycle.push(current);\n return cycle;\n }\n return undefined;\n }\n inPath.add(current);\n path.push(current);\n\n const next = [...(graph.forward.get(current) ?? [])].find((candidate) =>\n componentSet.has(candidate),\n );\n current = next;\n }\n\n return undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { substituteAlias } from \"../config/aliases.js\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { EdgeKind } from \"../types/graph.js\";\nimport { extensionCandidates, jsToTsCandidate, pathKey } from \"../utils/paths.js\";\n\n/**\n * Module specifier resolution.\n *\n * Resolution pipeline for one import declaration:\n *\n * 1. Alias substitution (`ripple.config.ts` aliases + tsconfig `paths`).\n * 2. Relative/bare classification.\n * 3. Candidate probing: exact, extension candidates, directory index files.\n * `.js` specifiers may resolve to `.ts` files (NodeNext-style projects).\n * 4. Bare specifiers that cannot be probed are external.\n * 5. Relative imports that point at existing files outside the analyzed set\n * (assets like `.css`, `.json`, or ignored source files) are external —\n * they exist, Ripple just does not model them.\n *\n * The resolver is a pure function of its inputs and does no I/O beyond\n * cheap existence checks.\n */\n\nexport interface ResolverContext {\n /** Project root. */\n rootDir: string;\n aliases: AliasMap;\n /** Canonical keys of all discovered files. */\n fileKeys: Set<string>;\n}\n\nexport interface ResolvedEdge {\n /** Absolute path of the resolved file, for internal edges. */\n filePath?: string;\n kind: EdgeKind;\n}\n\n/** Replace the last extension-less segment and probe existing files. */\nfunction probeCandidates(base: string, fileKeys: Set<string>, rootDir: string): string | undefined {\n for (const candidate of extensionCandidates(base)) {\n const key = pathKey(candidate, rootDir);\n if (fileKeys.has(key)) return path.normalize(candidate);\n }\n const jsSwapped = jsToTsCandidate(base);\n if (jsSwapped !== base) {\n const swappedKey = pathKey(jsSwapped, rootDir);\n if (fileKeys.has(swappedKey)) return path.normalize(jsSwapped);\n }\n return undefined;\n}\n\n/** An absolute path exists on disk as a file or directory. */\nfunction existsOnDisk(filePath: string): boolean {\n try {\n fs.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a specifier to an absolute candidate path (possibly\n * extension-less) or `undefined` when the specifier cannot be interpreted.\n */\nfunction specifierToBase(\n specifier: string,\n fromDir: string,\n context: ResolverContext,\n): string | undefined {\n const { rootDir, aliases } = context;\n\n if (specifier.startsWith(\"/\")) {\n return path.resolve(rootDir, specifier.slice(1));\n }\n if (specifier.startsWith(\".\")) {\n return path.resolve(fromDir, specifier);\n }\n const substituted = substituteAlias(specifier, aliases);\n if (substituted === undefined) return undefined;\n return path.isAbsolute(substituted) ? substituted : path.resolve(rootDir, substituted);\n}\n\n/** Resolve a specifier to a discovered file, or `undefined`. */\nfunction resolveToFile(base: string, context: ResolverContext): string | undefined {\n const { rootDir, fileKeys } = context;\n\n const exactKey = pathKey(base, rootDir);\n if (fileKeys.has(exactKey)) return path.normalize(base);\n\n const probed = probeCandidates(base, fileKeys, rootDir);\n if (probed) return probed;\n\n if (existsOnDisk(base) && fs.statSync(base).isDirectory()) {\n const indexProbed = probeCandidates(path.join(base, \"index\"), fileKeys, rootDir);\n if (indexProbed) return indexProbed;\n }\n\n return undefined;\n}\n\n/**\n * Resolve one import declaration from a source file. Returns the edge kind\n * and, for internal edges, the absolute target path.\n */\nexport function resolveEdge(\n specifier: string,\n fromPath: string,\n context: ResolverContext,\n): ResolvedEdge {\n const base = specifierToBase(specifier, path.dirname(fromPath), context);\n\n if (base !== undefined) {\n const resolved = resolveToFile(base, context);\n if (resolved !== undefined) return { filePath: resolved, kind: \"internal\" };\n if (existsOnDisk(base)) return { kind: \"external\" };\n }\n\n const isRelative = specifier.startsWith(\".\") || specifier.startsWith(\"/\");\n const isAlias = specifierToBase(specifier, path.dirname(fromPath), context) !== undefined;\n if (isRelative || isAlias) return { kind: \"unresolved\" };\n return { kind: \"external\" };\n}\n\n/**\n * Resolve every import of a file against the discovered file set.\n * Returns internal target paths, external specifiers and unresolved\n * specifiers, in declaration order.\n */\nexport function resolveImports(\n fromPath: string,\n importSpecifiers: string[],\n context: ResolverContext,\n): { internal: string[]; external: string[]; unresolved: string[] } {\n const internal: string[] = [];\n const external: string[] = [];\n const unresolved: string[] = [];\n\n for (const specifier of importSpecifiers) {\n const edge = resolveEdge(specifier, fromPath, context);\n if (edge.kind === \"internal\" && edge.filePath) {\n internal.push(edge.filePath);\n } else if (edge.kind === \"external\") {\n external.push(specifier);\n } else {\n unresolved.push(specifier);\n }\n }\n\n return { internal, external, unresolved };\n}\n","import type { Project } from \"ts-morph\";\nimport { parseMany } from \"../parser/parse.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findCycles } from \"./cycles.js\";\nimport { resolveImports, type ResolverContext } from \"./resolve.js\";\n\n/**\n * Build the in-memory dependency graph.\n *\n * 1. Parse every discovered file (shared ts-morph project).\n * 2. Resolve every import against the file set (aliases, index files, ...).\n * 3. Populate `forward` / `reverse` / `external` and graph stats.\n * 4. Detect cycles (SCC groups).\n *\n * `reverse` is built incrementally here so reverse traversals stay O(n).\n */\nexport function buildGraph(\n project: Project,\n filePaths: string[],\n context: ResolverContext,\n): DependencyGraph {\n const parsedFiles = parseMany(project, filePaths);\n\n const nodes: DependencyGraph[\"nodes\"] = new Map();\n const forward: DependencyGraph[\"forward\"] = new Map();\n const reverse: DependencyGraph[\"reverse\"] = new Map();\n const external: DependencyGraph[\"external\"] = new Map();\n\n let parsedCount = 0;\n let internalEdges = 0;\n let unresolvedEdges = 0;\n let externalEdges = 0;\n\n for (const parsed of parsedFiles) {\n const key = pathKey(parsed.path, context.rootDir);\n nodes.set(key, { path: parsed.path, parsed });\n if (!parsed.parseError) parsedCount++;\n }\n\n for (const parsed of parsedFiles) {\n const fromKey = pathKey(parsed.path, context.rootDir);\n const targets = new Set<string>();\n\n const {\n internal,\n external: externalSpecifiers,\n unresolved,\n } = resolveImports(\n parsed.path,\n parsed.imports.map((decl) => decl.raw),\n context,\n );\n\n internalEdges += internal.length;\n unresolvedEdges += unresolved.length;\n externalEdges += externalSpecifiers.length;\n\n for (const target of internal) {\n targets.add(pathKey(target, context.rootDir));\n }\n\n if (externalSpecifiers.length > 0) {\n external.set(fromKey, new Set(externalSpecifiers));\n }\n\n forward.set(fromKey, targets);\n for (const target of targets) {\n const importers = reverse.get(target) ?? new Set<string>();\n importers.add(fromKey);\n reverse.set(target, importers);\n }\n }\n\n const graph: DependencyGraph = {\n nodes,\n forward,\n reverse,\n external,\n cycles: [],\n stats: {\n files: parsedFiles.length,\n parsed: parsedCount,\n internalEdges,\n unresolvedEdges,\n externalEdges,\n cycles: 0,\n },\n };\n graph.cycles = findCycles(graph);\n graph.stats.cycles = graph.cycles.length;\n return graph;\n}\n\n/**\n * Look up a graph node by absolute path. Returns the node's canonical key\n * and its parsed surface, or `undefined` when the file is not in the graph.\n */\nexport function findNode(\n graph: DependencyGraph,\n filePath: string,\n rootDir: string,\n): { key: string; parsed: ParsedFile } | undefined {\n const key = pathKey(filePath, rootDir);\n const node = graph.nodes.get(key);\n if (!node) return undefined;\n return { key, parsed: node.parsed };\n}\n","import path from \"node:path\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport { detectEntryPoints } from \"../analyzer/categorize.js\";\nimport { pathKey, displayPath } from \"../utils/paths.js\";\nimport { fileNotFound } from \"../utils/errors.js\";\n\n/**\n * Shared pipeline for commands that need the full dependency graph\n * (analyze, graph, doctor). Loads context, discovers files, parses and\n * resolves everything into one graph, and detects entry points.\n */\n\nexport interface PipelineResult {\n graph: ReturnType<typeof buildGraph>;\n filePaths: string[];\n entryPoints: Set<string>;\n durationMs: number;\n}\n\nexport async function runPipeline(context: ProjectContext): Promise<PipelineResult> {\n const started = Date.now();\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n const entryPoints = await detectEntryPoints(context.rootDir);\n return { graph, filePaths, entryPoints, durationMs: Date.now() - started };\n}\n\n/** Resolve the `<file>` argument to an absolute path (cwd-relative). */\nexport function resolveTargetFile(fileArg: string, cwd: string): string {\n return path.isAbsolute(fileArg) ? fileArg : path.join(cwd, fileArg);\n}\n\n/** Verify the target path is part of the graph; throws `RippleError`. */\nexport function requireNode(\n graph: DependencyGraph,\n targetPath: string,\n rootDir: string,\n): { key: string } {\n const key = pathKey(targetPath, rootDir);\n if (!graph.nodes.has(key)) {\n throw fileNotFound(displayPath(targetPath, rootDir));\n }\n return { key };\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildAnalyzeJsonReport, renderAnalyzeReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalyzeOptions, CommandContext } from \"../types/cli.js\";\n\n/**\n * `ripple analyze <file>`\n *\n * Full impact analysis of one file: reverse traversal, risk score, and a\n * terminal or JSON report.\n */\nexport async function analyzeCommand(\n fileArg: string,\n options: AnalyzeOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const targetPath = resolveTargetFile(fileArg, ctx.cwd);\n if (!(await pathExists(targetPath))) {\n throw new RippleError(`File not found: ${fileArg}`, ExitCode.NotFound);\n }\n\n const tracker = createStageTracker(!options.json);\n tracker.next(\"Loading config\");\n\n const started = Date.now();\n const context = await loadProjectContext(ctx.cwd, options.config);\n\n tracker.next(\"Building dependency graph\");\n const { graph, entryPoints, durationMs: pipelineMs } = await runPipeline(context);\n\n tracker.next(\"Analyzing impact\");\n const completed = Date.now();\n const result = analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: requireNode(graph, targetPath, context.rootDir).key,\n targetPath,\n durationMs: pipelineMs + (completed - started),\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n });\n tracker.done();\n\n if (options.json) {\n const report = buildAnalyzeJsonReport(result, ctx.version, ctx.cwd);\n ctx.writer.write(serializeJson(report));\n return ExitCode.Success;\n }\n\n renderAnalyzeReport(\n result,\n {\n cwd: ctx.cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n return ExitCode.Success;\n}\n","import type { Cycle } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\n\n/**\n * Graph export formats: Mermaid (`--format mermaid`), Graphviz DOT\n * (`--format dot`) and a self-contained HTML report (`--format html`).\n *\n * All output is deterministic: nodes and edges are always emitted in sorted\n * order, and no rendering library is required at runtime.\n */\n\nexport interface GraphExportInput {\n /** Absolute file path per graph key. */\n nodes: Map<string, string>;\n /** Directed edges: source key -> target keys. */\n edges: Map<string, Set<string>>;\n cycles: Cycle[];\n cwd: string;\n}\n\nconst escapeDot = (value: string): string => value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\nconst escapeMermaid = (value: string): string =>\n value.replace(/#/g, \"#35;\").replace(/\"/g, \"#quot;\");\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n\n/** Node keys sorted by their display path (deterministic iteration order). */\nfunction sortedKeys(input: GraphExportInput): string[] {\n return [...input.nodes.keys()].sort((a, b) => {\n const left = input.nodes.get(a) ?? a;\n const right = input.nodes.get(b) ?? b;\n return left.localeCompare(right);\n });\n}\n\nconst nodeLabel = (input: GraphExportInput, key: string): string =>\n displayPath(input.nodes.get(key) ?? key, input.cwd);\n\n/** Cycle members that exist in the exported node set, sorted by path. */\nfunction cycleMembers(input: GraphExportInput): string[] {\n const present = new Set<string>();\n for (const cycle of input.cycles) {\n for (const member of cycle.members) {\n if (input.nodes.has(member)) present.add(member);\n }\n }\n return [...present].sort((a, b) => nodeLabel(input, a).localeCompare(nodeLabel(input, b)));\n}\n\n/** Sorted edge key pairs that stay inside the node set (sorted by labels). */\nfunction internalEdges(input: GraphExportInput): Array<[string, string]> {\n const pairs: Array<[string, string]> = [];\n for (const [source, targets] of input.edges) {\n if (!input.nodes.has(source)) continue;\n for (const target of targets) {\n if (!input.nodes.has(target)) continue;\n pairs.push([source, target]);\n }\n }\n return pairs.sort((a, b) => {\n const left = nodeLabel(input, a[0]).localeCompare(nodeLabel(input, b[0]));\n return left !== 0 ? left : nodeLabel(input, a[1]).localeCompare(nodeLabel(input, b[1]));\n });\n}\n\n/** Render the graph as a Mermaid flowchart. */\nexport function renderMermaidGraph(input: GraphExportInput): string {\n const keys = sortedKeys(input);\n const idByKey = new Map<string, string>(keys.map((key, index) => [key, `n${index}`]));\n\n const lines: string[] = [\"flowchart LR\"];\n lines.push(\" classDef cycle fill:#4a2525,stroke:#f85149,color:#f0b3b3;\");\n for (const key of keys) {\n lines.push(` ${idByKey.get(key)}[\"${escapeMermaid(nodeLabel(input, key))}\"]`);\n }\n for (const [source, target] of internalEdges(input)) {\n lines.push(` ${idByKey.get(source)} --> ${idByKey.get(target)}`);\n }\n\n const members = cycleMembers(input)\n .map((key) => idByKey.get(key))\n .filter((id): id is string => id !== undefined);\n if (members.length > 0) {\n lines.push(` class ${members.join(\",\")} cycle;`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Render the graph as Graphviz DOT. */\nexport function renderDotGraph(input: GraphExportInput): string {\n const lines: string[] = [\n \"digraph ripple {\",\n \" rankdir=LR;\",\n ' node [shape=box, style=\"rounded,filled\", fillcolor=\"#161b22\", color=\"#30363d\", fontcolor=\"#e6edf3\"];',\n ' edge [color=\"#8b949e\"];',\n ];\n for (const key of sortedKeys(input)) {\n const label = nodeLabel(input, key);\n lines.push(` \"${escapeDot(label)}\" [label=\"${escapeDot(label)}\"];`);\n }\n for (const [source, target] of internalEdges(input)) {\n lines.push(\n ` \"${escapeDot(nodeLabel(input, source))}\" -> \"${escapeDot(nodeLabel(input, target))}\";`,\n );\n }\n for (const key of cycleMembers(input)) {\n const label = nodeLabel(input, key);\n lines.push(` \"${escapeDot(label)}\" [color=\"#f85149\", penwidth=1.5];`);\n }\n lines.push(\"}\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Render the graph as a self-contained HTML report. */\nexport function renderHtmlGraph(input: GraphExportInput): string {\n const keys = sortedKeys(input);\n const edges = internalEdges(input);\n const members = cycleMembers(input);\n\n const cycleLines = input.cycles\n .map((cycle) =>\n cycle.path\n .filter((key) => input.nodes.has(key))\n .map((key) => escapeHtml(nodeLabel(input, key)))\n .join(\" → \"),\n )\n .filter((line) => line.length > 0);\n\n const edgeRows = edges\n .map(\n ([source, target]) =>\n ` <tr><td>${escapeHtml(nodeLabel(input, source))}</td><td>→</td><td>${escapeHtml(nodeLabel(input, target))}</td></tr>`,\n )\n .join(\"\\n\");\n\n const cycleRows =\n cycleLines.length > 0\n ? cycleLines.map((line) => ` <li><code>${line}</code></li>`).join(\"\\n\")\n : \" <li><em>none</em></li>\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Ripple — dependency graph</title>\n<style>\n :root { color-scheme: dark; }\n body { margin: 0; padding: 2rem; background: #0d1117; color: #e6edf3;\n font: 15px/1.6 -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n h1 { font-size: 1.4rem; margin: 0 0 .25rem; }\n h2 { font-size: 1.05rem; margin: 2rem 0 .5rem; color: #79c0ff; }\n code, pre { font-family: SFMono-Regular, Consolas, monospace; }\n pre { background: #161b22; border: 1px solid #30363d; border-radius: 8px;\n padding: 1rem; overflow-x: auto; font-size: .85rem; }\n table { border-collapse: collapse; width: 100%; font-size: .9rem; }\n th, td { text-align: left; padding: .35rem .6rem; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-weight: 600; }\n .stats { display: flex; gap: 1.5rem; margin-top: 1rem; }\n .stat b { display: block; font-size: 1.6rem; color: #79c0ff; }\n .stat span { color: #8b949e; font-size: .8rem; }\n .muted { color: #8b949e; }\n a { color: #79c0ff; }\n</style>\n</head>\n<body>\n <h1>Ripple dependency graph</h1>\n <p class=\"muted\">Exported with <code>ripple graph --format html</code> — deterministic and offline.</p>\n <div class=\"stats\">\n <div class=\"stat\"><b>${keys.length}</b><span>files</span></div>\n <div class=\"stat\"><b>${edges.length}</b><span>edges</span></div>\n <div class=\"stat\"><b>${input.cycles.length}</b><span>cycle groups</span></div>\n </div>\n\n <h2>Circular dependencies</h2>\n <ul>${cycleRows}</ul>\n <p class=\"muted\">Cycle members: ${members.map(escapeHtml).join(\", \")}</p>\n\n <h2>Graph</h2>\n <pre><code class=\"language-mermaid\">${escapeHtml(renderMermaidGraph(input)).trimEnd()}</code></pre>\n <p class=\"muted\">Render this diagram with the\n <a href=\"https://mermaid.live\">Mermaid live editor</a> or a tool that\n understands Mermaid (GitHub markdown, docs sites, IDEs).</p>\n\n <h2>Edges (${edges.length})</h2>\n <table>\n <thead><tr><th>Source</th><th></th><th>Target</th></tr></thead>\n <tbody>\n${edgeRows}\n </tbody>\n </table>\n</body>\n</html>\n`;\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildGraphJsonReport, renderGraphReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport {\n renderDotGraph,\n renderHtmlGraph,\n renderMermaidGraph,\n type GraphExportInput,\n} from \"../formatter/graph-export.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { ExitCode, type GraphFormat } from \"../types/cli.js\";\nimport type { CommandContext, GraphOptions } from \"../types/cli.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\n\n/**\n * `ripple graph [file]`\n *\n * Without a file: project-wide graph stats and circular dependencies.\n * With a file: the file's dependency tree — dependants (what it imports)\n * by default, or dependents (what imports it) with `--reverse`.\n */\n\ninterface WalkNode {\n key: string;\n depth: number;\n}\n\n/** BFS walk over an edge map, depth-capped, sorted by depth then path. */\nfunction walk(\n graph: DependencyGraph,\n startKey: string,\n edges: Map<string, Set<string>>,\n maxDepth: number | undefined,\n cwd: string,\n): string[] {\n const seen = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const entries: Array<{ path: string; depth: number }> = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current.key !== startKey) {\n const nodePath = graph.nodes.get(current.key)?.path ?? current.key;\n entries.push({ path: displayPath(nodePath, cwd), depth: current.depth });\n }\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n for (const candidate of edges.get(current.key) ?? []) {\n if (seen.has(candidate)) continue;\n seen.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n\n return entries\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((entry) => entry.path);\n}\n\n/** Reachable subgraph from `startKey` (forward = what it imports, reverse =\n * what imports it), depth-capped. Used for file-scoped exports. */\nfunction reachableSubgraph(\n graph: DependencyGraph,\n startKey: string,\n reverse: boolean,\n maxDepth: number | undefined,\n cwd: string,\n): GraphExportInput {\n const edges = reverse ? graph.reverse : graph.forward;\n const nodes = new Map<string, string>();\n const visited = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const collectedEdges = new Map<string, Set<string>>();\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n nodes.set(current.key, graph.nodes.get(current.key)?.path ?? current.key);\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n const targets = new Set<string>();\n for (const candidate of edges.get(current.key) ?? []) {\n targets.add(candidate);\n if (!visited.has(candidate)) {\n visited.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n if (targets.size > 0) collectedEdges.set(current.key, targets);\n }\n\n return { nodes, edges: collectedEdges, cycles: graph.cycles, cwd };\n}\n\n/** Render an export format (mermaid/dot/html) for a graph input. */\nfunction writeExport(\n format: Exclude<GraphFormat, \"terminal\" | \"json\">,\n input: GraphExportInput,\n writer: CommandContext[\"writer\"],\n): void {\n const rendered =\n format === \"mermaid\"\n ? renderMermaidGraph(input)\n : format === \"dot\"\n ? renderDotGraph(input)\n : renderHtmlGraph(input);\n writer.write(rendered);\n}\n\nexport async function graphCommand(\n fileArg: string | undefined,\n options: GraphOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const format = options.format ?? (options.json ? \"json\" : \"terminal\");\n const tracker = createStageTracker(format === \"terminal\");\n tracker.next(\"Loading config\");\n const cwd = ctx.cwd;\n\n try {\n const context = await loadProjectContext(cwd, options.config);\n\n tracker.next(\"Building graph\");\n const { graph } = await runPipeline(context);\n\n const input = {\n stats: graph.stats,\n cycles: graph.cycles,\n nodes: graph.nodes,\n cwd,\n };\n\n if (format === \"mermaid\" || format === \"dot\" || format === \"html\") {\n let exportInput: GraphExportInput;\n if (fileArg) {\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n exportInput = reachableSubgraph(graph, key, options.reverse, options.depth, cwd);\n } else {\n const nodes = new Map<string, string>();\n for (const [key, node] of graph.nodes) nodes.set(key, node.path);\n exportInput = { nodes, edges: graph.forward, cycles: graph.cycles, cwd };\n }\n tracker.done();\n writeExport(format, exportInput, ctx.writer);\n return ExitCode.Success;\n }\n\n if (!fileArg) {\n tracker.done();\n if (format === \"json\") {\n const report = buildGraphJsonReport(input, ctx.version);\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n input,\n {\n cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n }\n\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n const dependants = walk(graph, key, graph.forward, options.depth, cwd);\n const dependents = walk(graph, key, graph.reverse, options.depth, cwd);\n\n tracker.done();\n\n if (format === \"json\") {\n const report = buildGraphJsonReport(\n {\n ...input,\n ...(options.reverse ? { reverse: dependents } : { forward: dependants }),\n },\n ctx.version,\n );\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n {\n ...input,\n forward: options.reverse ? undefined : dependants,\n reverse: options.reverse ? dependents : undefined,\n },\n { cwd, color: resolveColor(options.color), verbose: options.verbose, version: ctx.version },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n } finally {\n tracker.done();\n }\n}\n","import ora from \"ora\";\n\n/**\n * Spinner for long-running commands. Becomes a no-op when the stream is not\n * a TTY (CI, pipes, tests) or when output is JSON — never pollute machines.\n */\nexport function createSpinner(enabled: boolean): { start(text: string): void; stop(): void } {\n if (!enabled || !process.stdout.isTTY) {\n return { start: () => {}, stop: () => {} };\n }\n let instance: ReturnType<typeof ora> | undefined;\n return {\n start(text: string): void {\n instance = ora(text).start();\n },\n stop(): void {\n instance?.stop();\n instance = undefined;\n },\n };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadConfig, loadProjectContext } from \"../config/loader.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { createSpinner } from \"../cli/spinner.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { brandHeader } from \"../ui/brand.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim, type TextStyle } from \"../formatter/text.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findPackageJson } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, DoctorOptions } from \"../types/cli.js\";\n\n/**\n * `ripple doctor`\n *\n * Environment and project health check. Each check is independent; a failed\n * check is reported but does not abort the run. Exits non-zero when any\n * check fails.\n */\n\ninterface CheckResult {\n label: string;\n state: \"ok\" | \"warn\" | \"fail\";\n detail?: string;\n}\n\nexport async function doctorCommand(\n options: DoctorOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const color = resolveColor(options.color);\n const style: TextStyle = { color };\n const spinner = createSpinner(color);\n spinner.start(\"Running diagnostics…\");\n const results: CheckResult[] = [];\n const check = (label: string, state: \"ok\" | \"warn\" | \"fail\", detail?: string): void => {\n results.push({ label, state, detail });\n };\n\n try {\n check(\"Node.js runtime\", \"ok\", process.version);\n\n const packageJson = await findPackageJson(ctx.cwd);\n if (packageJson) {\n check(\"package.json\", \"ok\", path.relative(ctx.cwd, packageJson));\n } else {\n check(\"package.json\", \"fail\", \"not found in this directory or its parents\");\n }\n\n let context;\n try {\n const loaded = await loadConfig(ctx.cwd, options.config);\n check(\n \"ripple config\",\n \"ok\",\n loaded.configPath ? path.relative(ctx.cwd, loaded.configPath) : \"defaults\",\n );\n context = await loadProjectContext(ctx.cwd, options.config);\n } catch (error) {\n check(\"ripple config\", \"fail\", error instanceof Error ? error.message : String(error));\n renderResults(results, ctx, color);\n return ExitCode.InvalidConfig;\n }\n\n if (context.tsconfig) {\n check(\"tsconfig.json\", \"ok\", path.relative(ctx.cwd, context.tsconfig.path));\n } else {\n check(\"tsconfig.json\", \"warn\", \"not found — path aliases unavailable\");\n }\n\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n if (filePaths.length > 0) {\n check(\"source files\", \"ok\", `${filePaths.length} discovered`);\n } else {\n check(\"source files\", \"fail\", \"no source files matched the include globs\");\n }\n\n if (Object.keys(context.aliases).length > 0) {\n check(\"path aliases\", \"ok\", `${Object.keys(context.aliases).length} configured`);\n }\n\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n\n const { stats } = graph;\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n if (parseRate >= 0.99) {\n check(\"parse\", \"ok\", \"all files parsed cleanly\");\n } else if (parseRate >= 0.9) {\n check(\"parse\", \"warn\", `${stats.files - stats.parsed} file(s) failed to parse`);\n } else {\n check(\"parse\", \"fail\", `${stats.files - stats.parsed} file(s) failed to parse`);\n }\n\n if (stats.unresolvedEdges === 0) {\n check(\"import resolution\", \"ok\", \"all internal imports resolved\");\n } else {\n check(\"import resolution\", \"warn\", `${stats.unresolvedEdges} unresolved import(s)`);\n }\n\n if (stats.cycles === 0) {\n check(\"circular dependencies\", \"ok\", \"none found\");\n } else {\n check(\"circular dependencies\", \"warn\", `${stats.cycles} cycle group(s)`);\n }\n } finally {\n spinner.stop();\n }\n\n renderResults(results, ctx, color);\n const failed = results.some((check) => check.state === \"fail\");\n const warned = results.some((check) => check.state === \"warn\");\n const verdict = failed\n ? { icon: icon(\"cross\"), text: \"Diagnoses found problems.\", color: chalk.red }\n : warned\n ? { icon: icon(\"warning\"), text: \"Diagnoses passed with warnings.\", color: chalk.yellow }\n : { icon: icon(\"tick\"), text: \"All checks passed.\", color: chalk.green };\n const verdictIcon = style.color ? verdict.color(verdict.icon) : verdict.icon;\n ctx.writer.writeLine(`${verdictIcon} ${verdict.text}`);\n return failed ? ExitCode.Failure : ExitCode.Success;\n}\n\nfunction renderResults(results: CheckResult[], ctx: CommandContext, color: boolean): void {\n const style: TextStyle = { color };\n ctx.writer.writeLine(brandHeader({ label: \"project health check\", version: ctx.version, style }));\n ctx.writer.writeLine();\n\n const width = Math.max(...results.map((check) => check.label.length));\n for (const check of results) {\n const stateIcon =\n check.state === \"ok\"\n ? icon(\"tick\")\n : check.state === \"warn\"\n ? icon(\"warning\")\n : icon(\"cross\");\n const colored =\n check.state === \"ok\" ? chalk.green : check.state === \"warn\" ? chalk.yellow : chalk.red;\n const mark = style.color ? colored(stateIcon) : stateIcon;\n const detail = check.detail ? ` ${dim(check.detail, style)}` : \"\";\n ctx.writer.writeLine(`${mark} ${check.label.padEnd(width)}${detail}`);\n }\n ctx.writer.writeLine();\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim } from \"../formatter/text.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, InitOptions } from \"../types/cli.js\";\n\n/**\n * `ripple init`\n *\n * Writes a config file next to the current directory. Defaults to a minimal\n * `ripple.config.json` that references the published JSON Schema for editor\n * autocomplete. `--full` dumps every built-in default; `--ts` writes a typed\n * `ripple.config.ts`. Refuses to overwrite an existing file unless `--force`.\n */\n\nconst SCHEMA_REF = \"./node_modules/@alimaandev/ripple/ripple.schema.json\";\n\nfunction jsonPayload(full: boolean): Record<string, unknown> {\n const payload = full ? { ...DEFAULT_CONFIG } : { include: DEFAULT_CONFIG.include };\n return { ...payload, $schema: SCHEMA_REF };\n}\n\n/** Render a plain value as a TypeScript object/array literal. */\nfunction tsValue(value: unknown, indent: string): string {\n if (value === undefined) return \"undefined\";\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n const items = value.map((item) => tsValue(item, `${indent} `)).join(`,\\n${indent} `);\n return `[\\n${indent} ${items}\\n${indent}]`;\n }\n if (typeof value === \"object\" && value !== null) {\n const entries = Object.entries(value as Record<string, unknown>).filter(\n ([, entry]) => entry !== undefined,\n );\n if (entries.length === 0) return \"{}\";\n const items = entries\n .map(([key, entry]) => `${key}: ${tsValue(entry, `${indent} `)}`)\n .join(`,\\n${indent} `);\n return `{\\n${indent} ${items}\\n${indent}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction tsPayload(full: boolean): string {\n if (!full) {\n return `import type { RippleConfig } from \"@alimaandev/ripple\";\n\nconst config: RippleConfig = {\n include: ${JSON.stringify(DEFAULT_CONFIG.include)},\n};\n\nexport default config;\n`;\n }\n const body = tsValue({ ...DEFAULT_CONFIG }, \" \");\n return `import type { RippleConfig } from \"@alimaandev/ripple\";\n\nconst config: RippleConfig = ${body};\n\nexport default config;\n`;\n}\n\nexport async function initCommand(options: InitOptions, ctx: CommandContext): Promise<ExitCode> {\n const style = { color: resolveColor(options.color) };\n const fileName = options.ts ? \"ripple.config.ts\" : \"ripple.config.json\";\n const target = path.join(ctx.cwd, fileName);\n\n try {\n await fs.access(target);\n if (!options.force) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(`${mark} ${fileName} already exists. Pass --force to overwrite it.`);\n return ExitCode.Failure;\n }\n } catch {\n /* file does not exist — safe to create */\n }\n\n const content = options.ts\n ? tsPayload(Boolean(options.full))\n : `${JSON.stringify(jsonPayload(Boolean(options.full)), null, 2)}\\n`;\n\n try {\n await fs.writeFile(target, content, \"utf8\");\n const mark = style.color ? chalk.green(icon(\"tick\")) : icon(\"tick\");\n ctx.writer.writeLine(`${mark} Wrote ${fileName}`);\n ctx.writer.writeLine(\n ` ${dim(\"Edit it to tune include globs, aliases and risk weights.\", style)}`,\n );\n return ExitCode.Success;\n } catch (error) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} Could not write ${fileName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return ExitCode.Failure;\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode } from \"../types/cli.js\";\n\n/**\n * Git integration for `ripple diff`. All commands run in the project\n * directory and stay read-only — never modifies the working tree.\n */\n\nexport interface ChangedFiles {\n /** Human-readable base label, e.g. `origin/main`. */\n baseLabel: string;\n /** Repo-relative paths of changed files (tracked diffs + untracked). */\n files: string[];\n}\n\n/** Base refs tried in order when `--base` is not given. */\nconst DEFAULT_BASES = [\"origin/main\", \"main\", \"HEAD~1\"];\n\nfunction git(args: string[], cwd: string): string {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n }).trim();\n}\n\nfunction refExists(ref: string, cwd: string): boolean {\n try {\n const out = git([\"rev-parse\", \"--verify\", ref], cwd);\n return out.length > 0;\n } catch {\n return false;\n }\n}\n\n/** Resolve the base ref: the requested one, or the first default that exists. */\nexport function resolveBase(cwd: string, requested?: string): string {\n if (requested) {\n if (!refExists(requested, cwd)) {\n throw new RippleError(`Git ref not found: ${requested}`, ExitCode.NotFound);\n }\n return requested;\n }\n for (const candidate of DEFAULT_BASES) {\n if (refExists(candidate, cwd)) return candidate;\n }\n throw new RippleError(\n \"No git base ref found (tried origin/main, main, HEAD~1). Pass --base <ref> explicitly.\",\n ExitCode.NotFound,\n );\n}\n\n/**\n * Compute the changed file set: everything that differs from the base\n * (merged commits plus uncommitted edits) and any untracked files.\n */\nexport function changedFiles(cwd: string, base?: string): ChangedFiles {\n const baseLabel = resolveBase(cwd, base);\n let baseCommit = baseLabel;\n try {\n const mergeBase = git([\"merge-base\", baseLabel, \"HEAD\"], cwd);\n if (mergeBase) baseCommit = mergeBase;\n } catch {\n /* base may be HEAD or a single commit — use it directly */\n }\n\n const files = new Set<string>();\n const tracked = git([\"diff\", \"--name-only\", \"--diff-filter=ACMRT\", baseCommit], cwd);\n for (const line of tracked.split(\"\\n\")) {\n if (line.trim()) files.add(line.trim());\n }\n const untracked = git([\"ls-files\", \"--others\", \"--exclude-standard\"], cwd);\n for (const line of untracked.split(\"\\n\")) {\n if (line.trim()) files.add(line.trim());\n }\n\n return { baseLabel, files: [...files].sort() };\n}\n","/**\n * GitHub Actions workflow-command output for `ripple diff --format github`.\n *\n * One line per changed source file (`::error` when it blocks the gate,\n * `::warning` otherwise), plus a `::notice` verdict line. GitHub annotates\n * each `file=` directly on the PR's Files tab, and the exit code still\n * carries the gate verdict for CI.\n *\n * Escaping follows the workflow-command rules: properties escape `%`, `\\r`,\n * `\\n`, `:`, `,`; messages escape `%`, `\\r`, `\\n`.\n */\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DiffCounts } from \"../commands/diff.js\";\nimport type { GateLevel } from \"../types/output.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\nexport type AnnotationLevel = \"error\" | \"warning\" | \"notice\";\n\nexport interface AnnotationLine {\n level: AnnotationLevel;\n /** Absolute or repo-relative path shown in the annotation. */\n file?: string;\n title: string;\n message: string;\n}\n\nconst LEVEL_INDEX: Record<RiskLevel, number> = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };\n\nconst GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nfunction escapeProperty(value: string): string {\n return value\n .replace(/%/g, \"%25\")\n .replace(/\\r/g, \"%0D\")\n .replace(/\\n/g, \"%0A\")\n .replace(/:/g, \"%3A\")\n .replace(/,/g, \"%2C\");\n}\n\nfunction escapeMessage(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/\\r/g, \"%0D\").replace(/\\n/g, \"%0A\");\n}\n\n/** Render one line of workflow-command output. */\nexport function renderAnnotation(annotation: AnnotationLine): string {\n const props = annotation.file\n ? ` file=${escapeProperty(annotation.file)},title=${escapeProperty(annotation.title)}`\n : ` title=${escapeProperty(annotation.title)}`;\n return `::${annotation.level}${props}::${escapeMessage(annotation.message)}`;\n}\n\n/** Per-file annotations for analyzed results, errors first when blocking. */\nexport function buildFileAnnotations(\n files: Array<{ file: string; result: AnalysisResult }>,\n gate: GateLevel,\n): AnnotationLine[] {\n return files.map(({ file, result }) => {\n const blocked = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n return {\n level: blocked ? \"error\" : \"warning\",\n file,\n title: `Ripple ${result.risk.level}`,\n message: `${result.risk.level} risk (score ${result.risk.score}) — ${result.summary.affectedFiles} affected ${\n result.summary.affectedFiles === 1 ? \"file\" : \"files\"\n }`,\n };\n });\n}\n\n/** One-line gate verdict for the workflow log. */\nexport function buildGateAnnotation(\n blocked: boolean,\n gate: GateLevel,\n counts: DiffCounts,\n): AnnotationLine {\n const gateIndex = GATE_INDEX[gate];\n const parts: string[] = [];\n if (LEVEL_INDEX.CRITICAL >= gateIndex && counts.critical > 0)\n parts.push(`${counts.critical} CRITICAL`);\n if (LEVEL_INDEX.HIGH >= gateIndex && counts.high > 0) parts.push(`${counts.high} HIGH`);\n if (LEVEL_INDEX.MEDIUM >= gateIndex && counts.medium > 0) parts.push(`${counts.medium} MEDIUM`);\n const atGate = parts.length > 0 ? parts.join(\" · \") : \"none\";\n return {\n level: \"notice\",\n title: `Ripple diff ${gate} gate`,\n message: blocked\n ? `Gate blocked: ${atGate} at or above ${gate}`\n : `Gate passed: nothing at ${gate} or above`,\n };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport picomatch from \"picomatch\";\nimport { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { changedFiles } from \"../git/changed.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\nimport {\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport {\n buildFileAnnotations,\n buildGateAnnotation,\n renderAnnotation,\n} from \"../formatter/annotations.js\";\nimport { runPipeline } from \"./pipeline.js\";\nimport { displayPath, pathKey, toPosix } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { CommandContext, DiffOptions, OutputWriter } from \"../types/cli.js\";\nimport type { DiffFileReport, DiffJsonReport, GateLevel } from \"../types/output.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * `ripple diff`\n *\n * Analyzes every changed file since a base git ref and gates the change set:\n * if any changed source file reaches the gate level (HIGH by default), the\n * command exits 1 so CI can block a merge; otherwise it exits 0.\n */\n\nconst LEVEL_INDEX: Record<RiskLevel, number> = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };\n\nconst GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nconst VERDICT_NOTE: Record<GateLevel, string> = {\n medium: \"no MEDIUM or worse\",\n high: \"no HIGH or CRITICAL\",\n critical: \"no CRITICAL\",\n};\n\nexport interface DiffCounts {\n low: number;\n medium: number;\n high: number;\n critical: number;\n}\n\nexport function countLevels(results: AnalysisResult[]): DiffCounts {\n const counts: DiffCounts = { low: 0, medium: 0, high: 0, critical: 0 };\n for (const result of results) {\n counts[result.risk.level.toLowerCase() as keyof DiffCounts] += 1;\n }\n return counts;\n}\n\n/**\n * Whether a project-relative path matches any of the diff allowlist globs.\n * Patterns and paths are normalized to forward slashes so the same config\n * works on Windows and POSIX.\n */\nexport function isAllowedByDiffAllowlist(relPath: string, patterns: string[]): boolean {\n if (patterns.length === 0) return false;\n const rel = toPosix(relPath);\n const matcher = picomatch(patterns.map(toPosix), { dot: true });\n return matcher(rel);\n}\n\n/** `2 HIGH · 1 CRITICAL` — counts for levels at or above the gate. */\nexport function riskySummary(counts: DiffCounts, gate: GateLevel): string {\n const gateIndex = GATE_INDEX[gate];\n const parts: string[] = [];\n if (LEVEL_INDEX.CRITICAL >= gateIndex && counts.critical > 0)\n parts.push(`${counts.critical} CRITICAL`);\n if (LEVEL_INDEX.HIGH >= gateIndex && counts.high > 0) parts.push(`${counts.high} HIGH`);\n if (LEVEL_INDEX.MEDIUM >= gateIndex && counts.medium > 0) parts.push(`${counts.medium} MEDIUM`);\n if (LEVEL_INDEX.LOW >= gateIndex && counts.low > 0) parts.push(`${counts.low} LOW`);\n return parts.length > 0 ? parts.join(\" · \") : \"none\";\n}\n\nexport async function diffCommand(options: DiffOptions, ctx: CommandContext): Promise<ExitCode> {\n const format = options.format ?? (options.json ? \"json\" : \"terminal\");\n const style: TextStyle = { color: resolveColor(options.color) };\n const tracker = createStageTracker(format === \"terminal\");\n const started = Date.now();\n\n const context = await loadProjectContext(ctx.cwd, options.config);\n const gate = options.gate ?? context.config.diff.gate ?? \"high\";\n const base = options.base ?? context.config.diff.base;\n\n tracker.next(\"Resolving git changes\");\n const changed = changedFiles(ctx.cwd, base);\n\n tracker.next(\"Analyzing changed files\");\n const { graph, entryPoints } = await runPipeline(context);\n\n const byRel = new Map<string, AnalysisResult>();\n const skipped: string[] = [];\n for (const rel of changed.files) {\n const abs = path.resolve(ctx.cwd, rel);\n const key = pathKey(abs, context.rootDir);\n if (!graph.nodes.has(key)) {\n skipped.push(rel);\n continue;\n }\n byRel.set(\n rel,\n analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: key,\n targetPath: abs,\n durationMs: 0,\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n }),\n );\n }\n tracker.done();\n\n const allowPatterns = [...(options.allow ?? []), ...(context.config.diff.allow ?? [])];\n const allowedByRel = new Map<string, boolean>();\n for (const rel of byRel.keys()) {\n allowedByRel.set(rel, isAllowedByDiffAllowlist(rel, allowPatterns));\n }\n\n const entries = [...byRel.entries()]\n .map(([rel, result]) => ({ rel, result, allowed: allowedByRel.get(rel) ?? false }))\n .sort((a, b) => b.result.risk.score - a.result.risk.score);\n const gateResults = entries.filter((entry) => !entry.allowed).map((entry) => entry.result);\n const counts = countLevels(gateResults);\n const allowedCount = entries.filter((entry) => entry.allowed).length;\n const blocked = gateResults.some((result) => LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate]);\n const durationMs = Date.now() - started;\n\n if (format === \"json\") {\n ctx.writer.write(\n serializeJson(\n buildDiffJsonReport(\n changed.baseLabel,\n changed.files,\n byRel,\n allowedByRel,\n gate,\n blocked,\n counts,\n allowedCount,\n durationMs,\n ctx.version,\n ),\n ),\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n if (format === \"github\") {\n const annotations = [\n ...buildFileAnnotations(\n [...byRel.entries()]\n .filter(([rel]) => !(allowedByRel.get(rel) ?? false))\n .map(([file, result]) => ({ file, result })),\n gate,\n ),\n buildGateAnnotation(blocked, gate, counts),\n ];\n ctx.writer.write(`${annotations.map(renderAnnotation).join(\"\\n\")}\\n`);\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n renderDiffReport(\n {\n cwd: ctx.cwd,\n baseLabel: changed.baseLabel,\n files: changed.files,\n entries,\n skipped,\n counts,\n allowedCount,\n gate,\n blocked,\n durationMs,\n style,\n },\n ctx.writer,\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n}\n\nexport interface DiffRenderInput {\n /** Working directory used to relativize displayed paths. */\n cwd: string;\n baseLabel: string;\n files: string[];\n entries: Array<{ rel: string; result: AnalysisResult; allowed: boolean }>;\n skipped: string[];\n counts: DiffCounts;\n allowedCount: number;\n gate: GateLevel;\n blocked: boolean;\n durationMs: number;\n style: TextStyle;\n}\n\nexport function renderDiffReport(input: DiffRenderInput, writer: OutputWriter): void {\n const {\n cwd,\n baseLabel,\n files,\n entries,\n skipped,\n counts,\n allowedCount,\n gate,\n blocked,\n durationMs,\n style,\n } = input;\n\n writer.writeLine(brandHeader({ label: `diff vs ${baseLabel}`, style }));\n writer.writeLine();\n\n const rows: Array<[string, string]> = [\n [\"Changed\", pluralize(files.length, \"file\")],\n [\"Source\", pluralize(entries.length, \"file\")],\n [\"Allowed\", pluralize(allowedCount, \"file\")],\n [\"Duration\", dim(formatDuration(durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n const mark = blocked ? icon(\"cross\") : icon(\"tick\");\n const color = blocked ? chalk.red : chalk.green;\n const markText = style.color ? color(mark) : mark;\n const verdict = blocked ? \"Gate blocked\" : \"Gate passed\";\n const verdictText = style.color ? color(strong(verdict, style)) : verdict;\n writer.writeLine(\n `${markText} ${verdictText} — ${riskySummary(counts, gate)} ${dim(`(${VERDICT_NOTE[gate]})`, style)}`,\n );\n writer.writeLine();\n\n writer.writeLine(sectionHeader(`Risk analysis (${entries.length} files)`, style));\n for (const { result, allowed } of entries) {\n const risky = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n const fileIcon = risky ? icon(\"cross\") : icon(\"tick\");\n const fileIconText = style.color\n ? risky\n ? chalk.red(fileIcon)\n : chalk.green(fileIcon)\n : fileIcon;\n const score = result.risk.score.toFixed(1);\n const gauge = riskGauge(result.risk.score, result.risk.level, style);\n const file = displayPath(result.targetPath, cwd);\n const allowedTag = allowed ? ` ${dim(\"(allowed)\", style)}` : \"\";\n writer.writeLine(\n `${fileIconText} ${file} ${riskBadge(result.risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}${allowedTag}`,\n );\n }\n // skipped files\n for (const rel of skipped) {\n writer.writeLine(\n `${dim(icon(\"ellipsis\"), style)} ${dim(rel, style)} ${dim(\"(not a source file)\", style)}`,\n );\n }\n writer.writeLine();\n}\n\nexport function buildDiffJsonReport(\n baseLabel: string,\n changedFileNames: string[],\n byRel: Map<string, AnalysisResult>,\n allowedByRel: Map<string, boolean>,\n gate: GateLevel,\n blocked: boolean,\n counts: DiffCounts,\n allowedCount: number,\n durationMs: number,\n version: string,\n): DiffJsonReport {\n const files: DiffFileReport[] = [];\n for (const rel of changedFileNames) {\n const result = byRel.get(rel);\n if (result) {\n files.push({\n file: rel,\n analyzed: true,\n risk: result.risk,\n affectedFiles: result.summary.affectedFiles,\n targetInCycle: result.targetInCycle,\n allowed: allowedByRel.get(rel) ?? false,\n });\n } else {\n files.push({ file: rel, analyzed: false });\n }\n }\n files.sort((a, b) => (b.risk?.score ?? -1) - (a.risk?.score ?? -1));\n\n return {\n tool: \"ripple\",\n version,\n command: \"diff\",\n base: baseLabel,\n changedFiles: changedFileNames.length,\n files,\n gate: { level: gate, blocked, counts, allowed: allowedCount },\n durationMs,\n };\n}\n","import { Command, CommanderError } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { diffCommand } from \"../commands/diff.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode, type CommandContext, type DiffFormat, type GraphFormat } from \"../types/cli.js\";\n\n/**\n * CLI program definition. `run()` returns the process exit code instead of\n * calling `process.exit`, which keeps the CLI integration-testable.\n */\n\nconst PROGRAM_NAME = \"ripple\";\n\n/**\n * One-line usage examples appended to a command's `--help` output, so the\n * CLI itself documents realistic invocations (issues #4, #9).\n */\nfunction helpExamples(examples: string[]): string {\n const lines = examples.map((example) => ` ${example}`);\n return `\\nExamples:\\n${lines.join(\"\\n\")}\\n`;\n}\n\nexport function createProgram(ctx: CommandContext): Command {\n const program = new Command()\n .name(PROGRAM_NAME)\n .description(\"Dependency impact analysis for TypeScript and JavaScript projects.\")\n .version(ctx.version, \"-V, --version\", \"print the Ripple version\")\n .showHelpAfterError();\n\n program\n .command(\"analyze <file>\")\n .description(\"Analyze the impact of changing a file\")\n .addHelpText(\n \"after\",\n helpExamples([\n \"ripple analyze src/authentication/login.ts\",\n \"ripple analyze src/index.ts --depth 3\",\n ]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-v, --verbose\", \"include the risk factor breakdown\")\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string, options: Record<string, unknown>) => {\n const exitCode = await analyzeCommand(\n file,\n {\n json: Boolean(options.json),\n verbose: Boolean(options.verbose),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"graph [file]\")\n .description(\"Show project graph stats, or the dependency tree of one file\")\n .addHelpText(\n \"after\",\n helpExamples([\n \"ripple graph\",\n \"ripple graph src/index.ts --reverse --depth 3\",\n \"ripple graph --format mermaid\",\n ]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\n \"-f, --format <format>\",\n \"output format: terminal | json | mermaid | dot | html\",\n parseGraphFormat,\n )\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-r, --reverse\", \"show dependents (what imports the file) instead of dependants\")\n .option(\"-d, --depth <number>\", \"cap the tree depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string | undefined, options: Record<string, unknown>) => {\n const exitCode = await graphCommand(\n file,\n {\n json: Boolean(options.json),\n format: (options.format as GraphFormat) ?? (options.json ? \"json\" : \"terminal\"),\n verbose: Boolean(options.verbose),\n reverse: Boolean(options.reverse),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"diff\")\n .description(\"Analyze changed files since a base ref and gate risky changes\")\n .addHelpText(\n \"after\",\n helpExamples([\"ripple diff --base main --gate critical\", \"ripple diff --format github\"]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"-f, --format <format>\", \"output format: terminal | json | github\", parseDiffFormat)\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-b, --base <ref>\", \"git ref to diff against (default: origin/main, main, HEAD~1)\")\n .option(\n \"-g, --gate <level>\",\n \"risk level that blocks the gate (medium | high | critical)\",\n parseGateLevel,\n )\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-a, --allow <glob...>\", \"changed files matching these globs never block the gate\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await diffCommand(\n {\n json: Boolean(options.json),\n format: (options.format as DiffFormat) ?? (options.json ? \"json\" : \"terminal\"),\n verbose: Boolean(options.verbose),\n ...(options.base !== undefined ? { base: options.base as string } : {}),\n ...(options.gate !== undefined\n ? { gate: options.gate as \"medium\" | \"high\" | \"critical\" }\n : {}),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.allow !== undefined ? { allow: options.allow as string[] } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Check the project and environment for Ripple readiness\")\n .addHelpText(\"after\", helpExamples([\"ripple doctor\", \"ripple doctor -v\"]))\n .option(\"-v, --verbose\", \"print detailed diagnostics\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await doctorCommand(\n {\n verbose: Boolean(options.verbose),\n config: options.config as string | undefined,\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"init\")\n .description(\"Create a ripple.config with the default settings\")\n .addHelpText(\"after\", helpExamples([\"ripple init --force\", \"ripple init --ts --full\"]))\n .option(\"-f, --force\", \"overwrite an existing config file\")\n .option(\"--full\", \"write every built-in default instead of a minimal config\")\n .option(\"--ts\", \"write a typed ripple.config.ts instead of JSON\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await initCommand(\n {\n force: Boolean(options.force),\n full: Boolean(options.full),\n ts: Boolean(options.ts),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"version\")\n .description(\"Print the Ripple version\")\n .addHelpText(\"after\", helpExamples([\"ripple version\"]))\n .action(() => {\n ctx.writer.writeLine(ctx.version);\n });\n\n program.addHelpText(\n \"beforeAll\",\n `ripple — dependency impact analysis for TypeScript and JavaScript\\n`,\n );\n\n return program;\n}\n\n/** Thrown internally to propagate a non-success exit code through commander. */\nclass ExitError extends Error {\n constructor(readonly exitCode: ExitCode) {\n super(`exit ${exitCode}`);\n this.name = \"ExitError\";\n }\n}\n\nfunction parsePositiveInt(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1) {\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected a positive integer, got \"${value}\"`,\n );\n }\n return parsed;\n}\n\n/** Validate the `--gate` argument. */\nfunction parseGateLevel(value: string): \"medium\" | \"high\" | \"critical\" {\n if (value === \"medium\" || value === \"high\" || value === \"critical\") {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of medium | high | critical, got \"${value}\"`,\n );\n}\n\n/** Validate the `--format` argument. */\nfunction parseDiffFormat(value: string): DiffFormat {\n if (value === \"terminal\" || value === \"json\" || value === \"github\") {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of terminal | json | github, got \"${value}\"`,\n );\n}\n\n/** Validate the `graph --format` argument. */\nfunction parseGraphFormat(value: string): GraphFormat {\n if (\n value === \"terminal\" ||\n value === \"json\" ||\n value === \"mermaid\" ||\n value === \"dot\" ||\n value === \"html\"\n ) {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of terminal | json | mermaid | dot | html, got \"${value}\"`,\n );\n}\n\n/** Print an error to the error stream. */\nfunction printError(error: unknown, ctx: CommandContext): void {\n if (error instanceof RippleError) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n if (error.hint) ctx.errorWriter.writeLine(` ${error.hint}`);\n return;\n }\n if (error instanceof Error) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n return;\n }\n ctx.errorWriter.writeLine(`✖ ${String(error)}`);\n}\n\nexport interface RunOptions {\n argv: string[];\n ctx: CommandContext;\n}\n\n/** Parse arguments and run the CLI, returning the exit code. */\nexport async function run({ argv, ctx }: RunOptions): Promise<ExitCode> {\n const program = createProgram(ctx);\n program.exitOverride();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.Success;\n } catch (error) {\n if (error instanceof ExitError) {\n return error.exitCode;\n }\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return ExitCode.Success;\n return ExitCode.Failure;\n }\n printError(error, ctx);\n return error instanceof RippleError ? error.exitCode : ExitCode.Failure;\n }\n}\n","{\n \"name\": \"@alimaandev/ripple\",\n \"version\": \"0.6.0\",\n \"description\": \"Dependency impact analysis for TypeScript and JavaScript. Know the blast radius of any change — before you commit.\",\n \"keywords\": [\n \"cli\",\n \"typescript\",\n \"javascript\",\n \"dependency-graph\",\n \"impact-analysis\",\n \"static-analysis\",\n \"refactoring\",\n \"risk\",\n \"cycle-detection\",\n \"ci\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Ali Sher <alishermaan0319@gmail.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/alimaandev/ripple.git\"\n },\n \"homepage\": \"https://github.com/alimaandev/ripple#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/alimaandev/ripple/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ripple\": \"dist/bin.js\"\n },\n \"files\": [\n \"dist\",\n \"ripple.schema.json\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.20.0\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:integration\": \"vitest run tests/integration\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"prepublishOnly\": \"pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build\"\n },\n \"dependencies\": {\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"figures\": \"^6.1.0\",\n \"jiti\": \"^2.7.0\",\n \"ora\": \"^9.4.1\",\n \"picomatch\": \"^4.0.5\",\n \"treeify\": \"^1.1.0\",\n \"ts-morph\": \"^28.0.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^26.1.2\",\n \"@types/picomatch\": \"^4.0.3\",\n \"@types/treeify\": \"^1.0.3\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"ajv\": \"^8.20.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^10.8.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"prettier\": \"^3.9.6\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.66.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { TerminalWriter } from \"../output/writer.js\";\nimport { run } from \"./program.js\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * Real CLI entry point. Keep this file thin — all logic lives in\n * `src/cli/program.ts` so the program stays integration-testable.\n */\n\nconst ctx = {\n writer: new TerminalWriter(),\n errorWriter: new TerminalWriter(process.stderr),\n cwd: process.cwd(),\n version: pkg.version,\n};\n\nconst exitCode = await run({ argv: process.argv, ctx });\nprocess.exitCode = exitCode;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/output/writer.ts","../src/types/cli.ts","../src/utils/fs.ts","../src/utils/errors.ts","../src/utils/tsconfig.ts","../src/config/aliases.ts","../src/config/loader.ts","../src/types/graph.ts","../src/analyzer/confidence.ts","../src/utils/paths.ts","../src/analyzer/categorize.ts","../src/analyzer/humanize.ts","../src/analyzer/impact.ts","../src/analyzer/reverse-traverse.ts","../src/risk/levels.ts","../src/risk/score.ts","../src/analyzer/analyze.ts","../src/formatter/text.ts","../src/ui/icons.ts","../src/ui/progress.ts","../src/ui/color.ts","../src/formatter/table.ts","../src/formatter/tree.ts","../src/ui/brand.ts","../src/ui/gauge.ts","../src/output/report.ts","../src/formatter/json.ts","../src/formatter/sarif.ts","../src/parser/ts-project.ts","../src/utils/globs.ts","../src/scanner/rules.ts","../src/scanner/discover.ts","../src/parser/exports.ts","../src/parser/imports.ts","../src/parser/symbols.ts","../src/parser/parse.ts","../src/graph/cycles.ts","../src/graph/resolve.ts","../src/graph/build.ts","../package.json","../src/cache/parsed.ts","../src/commands/pipeline.ts","../src/commands/analyze.ts","../src/formatter/graph-export.ts","../src/commands/graph.ts","../src/cli/spinner.ts","../src/commands/doctor.ts","../src/commands/init.ts","../src/git/changed.ts","../src/formatter/annotations.ts","../src/commands/gate.ts","../src/commands/diff.ts","../src/mcp/server.ts","../src/mcp/tools.ts","../src/commands/mcp.ts","../src/cli/program.ts","../src/cli/bin.ts"],"names":["fs","fsSync","path","exitCode","cycleMembers","chalk","realPath","ts","internalEdges","createHash","ctx","targetPath","key","check","LEVEL_INDEX","GATE_INDEX","relPath"],"mappings":"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","file":"bin.js","sourcesContent":["import type { OutputWriter } from \"../types/cli.js\";\n\n/**\n * Output writers. The CLI writes to stdout (or an injected stream); tests\n * use the in-memory implementation.\n */\n\nexport class TerminalWriter implements OutputWriter {\n constructor(private readonly stream: NodeJS.WritableStream = process.stdout) {}\n\n write(text: string): void {\n this.stream.write(text);\n }\n\n writeLine(text = \"\"): void {\n this.stream.write(`${text}\\n`);\n }\n}\n\nexport class InMemoryWriter implements OutputWriter {\n readonly chunks: string[] = [];\n\n write(text: string): void {\n this.chunks.push(text);\n }\n\n writeLine(text = \"\"): void {\n this.chunks.push(`${text}\\n`);\n }\n\n /** Full captured output. */\n get output(): string {\n return this.chunks.join(\"\");\n }\n\n /** Captured output split into lines (trailing newline removed). */\n get lines(): string[] {\n return this.output.replace(/\\n$/, \"\").split(\"\\n\");\n }\n}\n","/**\n * Shared contracts between the CLI layer and the analysis pipeline.\n * Kept free of commander types so the pipeline stays testable in isolation.\n */\n\n/** Parsed command-line options for `ripple analyze`. */\nexport interface AnalyzeOptions {\n json: boolean;\n sarif: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Cap on reverse traversal depth. `undefined` = unlimited. */\n depth?: number;\n /** Path to a config file. Overrides discovery. */\n config?: string;\n}\n\n/** Parsed command-line options for `ripple graph`. */\nexport interface GraphOptions {\n json: boolean;\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Show the dependency tree of one file instead of project stats. */\n file?: string;\n /** Render dependents (reverse) instead of dependants (forward). */\n reverse: boolean;\n /** Cap on tree depth. */\n depth?: number;\n config?: string;\n /** Output format; `json` falls back to `--json` parsing. */\n format?: GraphFormat;\n}\n\n/** Supported output formats for `ripple graph`. */\nexport type GraphFormat = \"terminal\" | \"json\" | \"mermaid\" | \"dot\" | \"html\";\n\n/** Parsed command-line options for `ripple doctor`. */\nexport interface DoctorOptions {\n verbose: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n config?: string;\n}\n\n/** Parsed command-line options for `ripple init`. */\nexport interface InitOptions {\n force: boolean;\n /** Write every built-in default instead of a minimal config. */\n full?: boolean;\n /** Write a typed `ripple.config.ts` instead of JSON. */\n ts?: boolean;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n}\n\n/** Supported output formats for `ripple diff`. */\nexport type DiffFormat = \"terminal\" | \"json\" | \"github\" | \"sarif\";\n\n/** Parsed command-line options for `ripple diff`. */\nexport interface DiffOptions {\n json: boolean;\n verbose: boolean;\n /** Output format; `json` falls back to `--json` parsing. */\n format?: DiffFormat;\n /** Whether to emit ANSI colors. `false` when `--no-color` is passed. */\n color?: boolean;\n /** Git ref to compute the change set against. */\n base?: string;\n /** Minimum risk level that blocks the gate. */\n gate?: \"medium\" | \"high\" | \"critical\";\n /** Cap on reverse traversal depth per file. */\n depth?: number;\n /** Glob patterns of changed files exempted from blocking the gate. */\n allow?: string[];\n config?: string;\n}\n\n/** Process exit codes used across commands. */\nexport const ExitCode = {\n Success: 0,\n Failure: 1,\n NotFound: 2,\n InvalidConfig: 3,\n} as const;\n\nexport type ExitCode = (typeof ExitCode)[keyof typeof ExitCode];\n\n/**\n * Abstraction over the destination of rendered output. The real CLI writes to\n * stdout; tests inject an in-memory implementation.\n */\nexport interface OutputWriter {\n write(text: string): void;\n writeLine(text?: string): void;\n}\n\n/** Everything commands need injected; no globals anywhere. */\nexport interface CommandContext {\n writer: OutputWriter;\n /** Stream for error messages (stderr in the real CLI). */\n errorWriter: OutputWriter;\n cwd: string;\n version: string;\n}\n","import fs from \"node:fs/promises\";\nimport fsSync from \"node:fs\";\nimport path from \"node:path\";\n\n/**\n * Thin, safe filesystem helpers. All reads are optional: Ripple must never\n * crash the whole analysis because one file is unreadable.\n */\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await fs.access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function pathExistsSync(filePath: string): boolean {\n try {\n fsSync.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/** Read a file as UTF-8; returns `undefined` when unreadable. */\nexport async function readFileSafe(filePath: string): Promise<string | undefined> {\n try {\n return await fs.readFile(filePath, \"utf8\");\n } catch {\n return undefined;\n }\n}\n\n/** Read a small JSON-ish file synchronously; returns `undefined` when unreadable. */\nexport function readJsonSafe(filePath: string): unknown | undefined {\n try {\n return JSON.parse(fsSync.readFileSync(filePath, \"utf8\"));\n } catch {\n return undefined;\n }\n}\n\n/**\n * Find the closest package.json above `startDir`. Used to detect project\n * entry points (`main`, `bin`).\n */\nexport async function findPackageJson(startDir: string): Promise<string | undefined> {\n let current = path.resolve(startDir);\n for (;;) {\n const candidate = path.join(current, \"package.json\");\n if (await pathExists(candidate)) return candidate;\n const parent = path.dirname(current);\n if (parent === current) return undefined;\n current = parent;\n }\n}\n\n/** Read `main` / `bin` entries of a package.json for entry-point detection. */\nexport async function readPackageEntryPoints(packageJsonPath: string): Promise<string[]> {\n const raw = await readFileSafe(packageJsonPath);\n if (!raw) return [];\n try {\n const manifest = JSON.parse(raw) as { main?: string; bin?: string | Record<string, string> };\n const entries: string[] = [];\n if (typeof manifest.main === \"string\") entries.push(manifest.main);\n if (typeof manifest.bin === \"string\") entries.push(manifest.bin);\n if (manifest.bin && typeof manifest.bin === \"object\")\n entries.push(...Object.values(manifest.bin));\n return entries;\n } catch {\n return [];\n }\n}\n","import { ExitCode } from \"../types/cli.js\";\n\n/**\n * Error type surfaced to the CLI entry point. Carries an exit code and an\n * optional hint that explains how to recover.\n */\nexport class RippleError extends Error {\n readonly exitCode: ExitCode;\n readonly hint?: string;\n\n constructor(message: string, exitCode: ExitCode = ExitCode.Failure, hint?: string) {\n super(message);\n this.name = \"RippleError\";\n this.exitCode = exitCode;\n this.hint = hint;\n }\n}\n\n/** Thrown when a file passed to `ripple analyze` cannot be found. */\nexport function fileNotFound(filePath: string): RippleError {\n return new RippleError(\n `File not found: ${filePath}`,\n ExitCode.NotFound,\n \"Run `ripple graph` to list the files Ripple can analyze.\",\n );\n}\n","import path from \"node:path\";\nimport { ts } from \"ts-morph\";\nimport type { TsconfigInfo } from \"../types/project.js\";\nimport { pathExistsSync } from \"./fs.js\";\n\n/**\n * tsconfig.json loading and alias extraction.\n *\n * Uses the TypeScript compiler API (bundled with ts-morph) so that `extends`,\n * comments and JSONC are handled exactly like the real compiler handles them.\n */\nexport function findTsconfig(startDir: string): string | undefined {\n return ts.findConfigFile(startDir, pathExistsSync, \"tsconfig.json\");\n}\n\nfunction asStringArray(value: unknown): string[] {\n return Array.isArray(value)\n ? value.filter((item): item is string => typeof item === \"string\")\n : [];\n}\n\n/**\n * Read and parse a tsconfig.json. Returns `undefined` when the file is\n * missing or malformed (callers decide how to surface that).\n */\nexport function readTsconfig(tsconfigPath: string): TsconfigInfo | undefined {\n if (!pathExistsSync(tsconfigPath)) return undefined;\n const readResult = ts.readConfigFile(tsconfigPath, ts.sys.readFile);\n if (readResult.error) return undefined;\n\n const dir = path.dirname(tsconfigPath);\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n dir,\n undefined,\n tsconfigPath,\n );\n if (parsed.errors.length > 0) return undefined;\n\n const options = parsed.options;\n const paths: Record<string, string[]> = {};\n if (options.paths) {\n for (const [pattern, targets] of Object.entries(options.paths)) {\n paths[pattern] = [...targets];\n }\n }\n\n return {\n path: tsconfigPath,\n dir,\n baseUrl: options.baseUrl ? path.resolve(dir, options.baseUrl) : undefined,\n paths,\n include: asStringArray(readResult.config.include ?? []),\n exclude: asStringArray(readResult.config.exclude ?? []),\n };\n}\n\n/**\n * Match a module specifier against `paths` patterns.\n *\n * Supports a single `*` wildcard in both pattern and replacement\n * (`\"@/*\": [\"./src/*\"]`). Returns the substituted absolute-ish path and the\n * captured wildcard value, or `undefined` when nothing matches.\n */\nexport function matchAlias(\n specifier: string,\n paths: Record<string, string[]>,\n): { target: string; matchedPattern: string } | undefined {\n for (const [pattern, replacements] of Object.entries(paths)) {\n const starIndex = pattern.indexOf(\"*\");\n if (starIndex === -1) {\n if (specifier === pattern) {\n const replacement = replacements[0];\n if (replacement) return { target: replacement, matchedPattern: pattern };\n }\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n\n for (const replacement of replacements) {\n const replacementStar = replacement.indexOf(\"*\");\n const target =\n replacementStar === -1\n ? replacement\n : replacement.slice(0, replacementStar) +\n captured +\n replacement.slice(replacementStar + 1);\n return { target, matchedPattern: pattern };\n }\n }\n return undefined;\n}\n","import path from \"node:path\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { TsconfigInfo } from \"../types/project.js\";\n\n/**\n * Alias normalization.\n *\n * User aliases (`ripple.config.ts`) and tsconfig `paths` are merged into one\n * map of pattern → absolute target. Both support a single `*` wildcard:\n *\n * `{ \"@\": \"./src\" }` → `{ \"@/*\": \"<root>/src/*\" }`\n * tsconfig `\"@/*\": [\"./src/*\"]` → `{ \"@/*\": \"<root>/src/*\" }`\n *\n * Keys without a wildcard are treated as prefixes, so `\"@\"` covers\n * `@/components/Button` the way TypeScript users expect.\n */\n\nconst WILDCARD = \"*\";\n\nfunction hasWildcard(value: string): boolean {\n return value.includes(WILDCARD);\n}\n\n/**\n * Normalize a user-config alias entry against `baseDir`.\n * Returns the pattern and its absolute target, or `undefined` for invalid\n * entries (empty key or non-relative target is allowed but must be absolute\n * after resolution).\n */\nfunction normalizeEntry(\n key: string,\n target: string,\n baseDir: string,\n): { pattern: string; target: string } {\n const trimmedKey = key.replace(/\\/+$/, \"\");\n const trimmedTarget = target.replace(/\\/+$/, \"\");\n\n if (hasWildcard(trimmedKey)) {\n return { pattern: trimmedKey, target: path.resolve(baseDir, trimmedTarget) };\n }\n return {\n pattern: `${trimmedKey}/${WILDCARD}`,\n target: path.join(path.resolve(baseDir, trimmedTarget), WILDCARD),\n };\n}\n\n/**\n * Merge user aliases and tsconfig paths into a single normalized map.\n * User aliases win on pattern collisions.\n */\nexport function buildAliasMap(\n configAliases: Record<string, string>,\n tsconfig: TsconfigInfo | undefined,\n rootDir: string,\n): AliasMap {\n const merged: AliasMap = {};\n\n if (tsconfig) {\n const base = tsconfig.baseUrl ?? tsconfig.dir;\n for (const [pattern, targets] of Object.entries(tsconfig.paths)) {\n const first = targets[0];\n if (!first) continue;\n const absolute = path.isAbsolute(first) ? first : path.resolve(base, first);\n merged[pattern] = absolute;\n }\n }\n\n for (const [key, target] of Object.entries(configAliases)) {\n if (key === \"\") continue;\n const entry = normalizeEntry(key, target, rootDir);\n merged[entry.pattern] = entry.target;\n }\n\n return merged;\n}\n\n/**\n * Substitute a specifier against an alias map. Returns the absolute-ish\n * candidate path or `undefined` when no pattern matches.\n */\nexport function substituteAlias(specifier: string, aliases: AliasMap): string | undefined {\n for (const [pattern, target] of Object.entries(aliases)) {\n const starIndex = pattern.indexOf(WILDCARD);\n if (starIndex === -1) {\n if (specifier === pattern) return target;\n continue;\n }\n const prefix = pattern.slice(0, starIndex);\n const suffix = pattern.slice(starIndex + 1);\n if (!specifier.startsWith(prefix) || !specifier.endsWith(suffix)) continue;\n const captured = specifier.slice(prefix.length, specifier.length - suffix.length);\n const targetStar = target.indexOf(WILDCARD);\n if (targetStar === -1) return target;\n return target.slice(0, targetStar) + captured + target.slice(targetStar + 1);\n }\n return undefined;\n}\n","import { createJiti } from \"jiti\";\nimport path from \"node:path\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AliasMap, RippleConfig } from \"../types/config.js\";\nimport type { LoadConfigResult, ProjectContext } from \"../types/project.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { readTsconfig } from \"../utils/tsconfig.js\";\nimport { buildAliasMap } from \"./aliases.js\";\nimport { formatSchemaIssues, rippleConfigSchema } from \"./schema.js\";\n\n/**\n * Config discovery and loading.\n *\n * Resolution order for `ripple.config.*`: `.ts`, `.mjs`, `.js`, `.cjs`,\n * `.json`. An explicit `--config <path>` always wins. The directory of the\n * resolved config file becomes the project root.\n */\n\nconst CONFIG_CANDIDATES = [\n \"ripple.config.ts\",\n \"ripple.config.mjs\",\n \"ripple.config.js\",\n \"ripple.config.cjs\",\n \"ripple.config.json\",\n] as const;\n\nconst jiti = createJiti(import.meta.url, { interopDefault: true });\n\nfunction findConfigFile(cwd: string, explicitPath: string | undefined): string | undefined {\n if (explicitPath) return path.resolve(cwd, explicitPath);\n for (const candidate of CONFIG_CANDIDATES) {\n const absolute = path.join(cwd, candidate);\n if (pathExistsSync(absolute)) return absolute;\n }\n return undefined;\n}\n\nasync function importConfig(configPath: string): Promise<unknown> {\n let loaded: unknown;\n try {\n loaded = await jiti.import(configPath);\n } catch (error) {\n const detail = error instanceof Error ? error.message : String(error);\n throw new RippleError(\n `Could not load ${path.basename(configPath)}: ${detail}`,\n ExitCode.InvalidConfig,\n );\n }\n const value = (loaded as { default?: unknown })?.default ?? loaded;\n if (typeof value === \"function\") {\n throw new RippleError(\n `${path.basename(configPath)} must export a plain object, not a function.`,\n ExitCode.InvalidConfig,\n );\n }\n return value;\n}\n\nfunction validateConfig(value: unknown): RippleConfig {\n const result = rippleConfigSchema.safeParse(value);\n if (!result.success) {\n const issues = formatSchemaIssues(result.error);\n throw new RippleError(\n `Invalid config:\\n${issues.map((issue) => ` ${issue}`).join(\"\\n\")}`,\n ExitCode.InvalidConfig,\n );\n }\n return result.data;\n}\n\n/**\n * Load and validate the ripple config. Never throws for a *missing* config —\n * defaults apply. Throws `RippleError` for an explicit-but-missing path or an\n * invalid config file.\n */\nexport async function loadConfig(cwd: string, explicitPath?: string): Promise<LoadConfigResult> {\n const configPath = findConfigFile(cwd, explicitPath);\n\n if (explicitPath && !configPath) {\n throw new RippleError(\n `Config file not found: ${explicitPath}`,\n ExitCode.InvalidConfig,\n \"Pass a path that exists, or remove --config to use defaults.\",\n );\n }\n\n if (!configPath) {\n return { config: rippleConfigSchema.parse({}), rootDir: path.resolve(cwd) };\n }\n\n const raw = await importConfig(configPath);\n const config = validateConfig(raw);\n return { config, configPath, rootDir: path.dirname(configPath) };\n}\n\n/**\n * Assemble the full `ProjectContext`: config + tsconfig facts + merged alias\n * map. The alias map is baked into the context so downstream layers never\n * touch config shapes again.\n */\nexport async function loadProjectContext(\n cwd: string,\n explicitConfigPath?: string,\n): Promise<ProjectContext> {\n const loaded = await loadConfig(cwd, explicitConfigPath);\n const { config, rootDir } = loaded;\n\n const tsconfigPath = path.resolve(rootDir, config.tsconfigPath);\n const tsconfig = readTsconfig(tsconfigPath);\n\n const aliases: AliasMap = buildAliasMap(config.aliases, tsconfig, rootDir);\n\n return {\n rootDir,\n config,\n ...(tsconfig ? { tsconfig } : {}),\n aliases,\n };\n}\n","import type { ParsedFile } from \"./parser.js\";\n\n/**\n * Classification of a resolved import edge.\n */\nexport type EdgeKind = \"internal\" | \"external\" | \"unresolved\";\n\nexport interface ResolvedImport {\n /** The original declaration the edge was derived from. */\n raw: string;\n edgeKind: EdgeKind;\n /**\n * Absolute path of the resolved target. Only set when `edgeKind ===\n * \"internal\"`.\n */\n resolvedPath?: string;\n}\n\nexport interface GraphNode {\n /** Absolute path of the file. */\n path: string;\n parsed: ParsedFile;\n}\n\n/**\n * A circular dependency group: every file that is mutually reachable\n * (strongly connected component). `path` is a representative import chain\n * through the group, `members` the complete sorted member set.\n */\nexport interface Cycle {\n /** Complete sorted member paths of the cycle group. */\n members: string[];\n /** Representative ordered cycle path (first element === last element). */\n path: string[];\n}\n\n/**\n * Aggregate statistics of a graph, computed during build. Feeds the\n * confidence heuristic and `ripple graph` output.\n */\nexport interface GraphStats {\n /** Discovered files. */\n files: number;\n /** Files that parsed without errors. */\n parsed: number;\n /** Internal edges that resolved to a discovered file. */\n internalEdges: number;\n /** Relative/alias edges that resolved to nothing. */\n unresolvedEdges: number;\n /** Edges leaving the analyzed file set (packages, assets). */\n externalEdges: number;\n /** Circular dependency groups. */\n cycles: number;\n}\n\n/**\n * In-memory directed dependency graph.\n *\n * - `forward` maps a file to the set of files it imports.\n * - `reverse` maps a file to the set of files that import it.\n * - `external` maps a file to the set of specifiers that leave the project\n * (node_modules packages, assets, non-discovered files).\n */\nexport interface DependencyGraph {\n nodes: Map<string, GraphNode>;\n forward: Map<string, Set<string>>;\n reverse: Map<string, Set<string>>;\n external: Map<string, Set<string>>;\n cycles: Cycle[];\n stats: GraphStats;\n}\n\nexport function edgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.forward.values()) {\n count += targets.size;\n }\n return count;\n}\n\nexport function externalEdgeCount(graph: DependencyGraph): number {\n let count = 0;\n for (const targets of graph.external.values()) {\n count += targets.size;\n }\n return count;\n}\n\n/** All file paths that participate in at least one cycle. */\nexport function cycleMemberPaths(graph: DependencyGraph): Set<string> {\n const members = new Set<string>();\n for (const cycle of graph.cycles) {\n for (const path of cycle.members) {\n members.add(path);\n }\n }\n return members;\n}\n","import type { GraphStats } from \"../types/graph.js\";\n\n/**\n * Confidence heuristic: how much of the graph could be analyzed reliably.\n *\n * - Parse rate: fraction of discovered files that parsed without errors.\n * - Resolution rate: fraction of non-external import edges that resolved to\n * a known file.\n * - A cycle touching the analyzed file is a small uncertainty penalty.\n *\n * Range: 0-100, rounded.\n */\nexport function computeConfidence(stats: GraphStats, targetInCycle: boolean): number {\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n const totalEdges = stats.internalEdges + stats.unresolvedEdges;\n const resolutionRate = totalEdges === 0 ? 1 : stats.internalEdges / totalEdges;\n\n let confidence = parseRate * (0.4 + 0.6 * resolutionRate);\n if (targetInCycle) confidence *= 0.95;\n\n return Math.round(Math.min(1, Math.max(0, confidence)) * 100);\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport type { SourceFileKind } from \"../types/parser.js\";\n\n/**\n * Path helpers shared across Ripple.\n *\n * Canonical path keys are POSIX-style normalized absolute paths. On Windows\n * they are lower-cased because the filesystem is case-insensitive; two paths\n * differing only in case must not create two graph nodes.\n */\n\nexport const SOURCE_EXTENSIONS = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".cts\",\n \".mjs\",\n \".cjs\",\n] as const;\n\nexport const RESOLVABLE_EXTENSIONS = [...SOURCE_EXTENSIONS, \".d.ts\"] as const;\n\n/** Convert a path to forward slashes for display and matching. */\nexport function toPosix(filePath: string): string {\n return filePath.replace(/\\\\/g, \"/\");\n}\n\n/** Normalize a path and make it absolute. */\nexport function normalizeAbsolute(filePath: string, cwd: string): string {\n return path.resolve(cwd, filePath);\n}\n\n/**\n * Canonical absolute path: resolves symlinks and Windows 8.3 short names so\n * two strings that name the same file compare equal. Falls back to\n * `path.resolve` when the path does not exist.\n *\n * Git returns canonical (long) paths while Node can inherit a short-name cwd\n * from the environment; without this, `path.relative` between the two invents\n * a `..`-laden path and the changed file looks like it is outside the project.\n */\nexport function realPath(filePath: string, cwd: string): string {\n const absolute = path.resolve(cwd, filePath);\n try {\n return fs.realpathSync.native(absolute);\n } catch {\n return absolute;\n }\n}\n\n/**\n * Canonical key for use in Maps/Sets: normalized, POSIX, and lower-cased on\n * Windows.\n */\nexport function pathKey(filePath: string, cwd: string): string {\n const absolute = normalizeAbsolute(filePath, cwd);\n const posix = toPosix(absolute);\n return process.platform === \"win32\" ? posix.toLowerCase() : posix;\n}\n\n/** Whether a module specifier is a relative import (`./` or `../`). */\nexport function isRelativeSpecifier(specifier: string): boolean {\n return specifier.startsWith(\"./\") || specifier.startsWith(\"../\");\n}\n\n/** Whether the specifier is a bare package import (`react`, `@scope/pkg`). */\nexport function isBareSpecifier(specifier: string): boolean {\n return !isRelativeSpecifier(specifier) && !specifier.startsWith(\"/\");\n}\n\n/** Source file kind from an absolute path. Declaration files are excluded. */\nexport function sourceFileKind(filePath: string): SourceFileKind | undefined {\n if (/\\.d\\.[cm]?ts$/i.test(filePath)) return undefined;\n const ext = path.extname(filePath).toLowerCase();\n return SOURCE_EXTENSIONS.includes(ext as (typeof SOURCE_EXTENSIONS)[number])\n ? (ext.slice(1) as SourceFileKind)\n : undefined;\n}\n\n/** The extension-candidates list for resolving an extensionless import. */\nexport function extensionCandidates(basePath: string): string[] {\n return RESOLVABLE_EXTENSIONS.map((ext) => basePath + ext);\n}\n\n/**\n * TS-style JS extension swaps: when a specifier imports `./x.js` but only\n * `./x.ts` (or `./x.tsx`) exists, the candidate resolves to the TS file.\n * Returns every plausible TS sibling; the resolver probes them in order.\n */\nexport function jsToTsCandidates(candidate: string): string[] {\n const ext = path.extname(candidate).toLowerCase();\n if (ext === \"\") return [];\n const stem = candidate.slice(0, -ext.length);\n switch (ext) {\n case \".js\":\n return [`${stem}.ts`, `${stem}.tsx`];\n case \".jsx\":\n return [`${stem}.tsx`];\n case \".mjs\":\n return [`${stem}.mts`];\n case \".cjs\":\n return [`${stem}.cts`];\n default:\n return [];\n }\n}\n\n/** First JS-to-TS candidate, or the input unchanged when there is none. */\nexport function jsToTsCandidate(candidate: string): string {\n return jsToTsCandidates(candidate)[0] ?? candidate;\n}\n\n/** Human-readable relative path (from cwd) for display in output. */\nexport function displayPath(filePath: string, cwd: string): string {\n const relative = path.relative(cwd, filePath);\n return toPosix(relative === \"\" ? path.basename(filePath) : relative);\n}\n\n/**\n * First path segment of `filePath` relative to `root`, used for impact areas.\n * Returns `undefined` when the file is outside the root.\n */\nexport function firstSegment(filePath: string, root: string): string | undefined {\n const relative = toPosix(path.relative(root, filePath));\n if (relative.startsWith(\"..\") || path.isAbsolute(relative)) return undefined;\n const segment = relative.split(\"/\")[0];\n return segment && segment !== \"\" ? segment : undefined;\n}\n","import path from \"node:path\";\nimport { findPackageJson, pathExistsSync, readPackageEntryPoints } from \"../utils/fs.js\";\nimport { toPosix } from \"../utils/paths.js\";\nimport type { Category } from \"../types/analysis.js\";\n\n/**\n * Deterministic file categorization heuristics.\n *\n * A file can match several categories (a `page.tsx` is both a route and a\n * component). Everything here is path/name based — no source analysis — so\n * categorization is cheap, stable and easy to document.\n */\n\nconst ROUTE_FILE_NAMES = new Set([\n \"route\",\n \"page\",\n \"layout\",\n \"middleware\",\n \"loading\",\n \"error\",\n \"not-found\",\n]);\n\nconst ROUTE_DIR_NAMES = new Set([\"routes\", \"api\"]);\n\nconst UTILITY_DIR_NAMES = new Set([\"lib\", \"utils\", \"helpers\", \"shared\", \"common\", \"core\"]);\n\nconst COMPONENT_DIR_NAMES = new Set([\"components\", \"ui\"]);\n\nconst ENTRY_FILE_NAMES = new Set([\"index\", \"main\", \"app\", \"server\", \"cli\", \"bin\"]);\n\nconst TEST_SEGMENT = \"__tests__\";\n\nfunction relativeSegments(filePath: string, rootDir: string): string[] {\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return [];\n return relative.split(\"/\").filter((segment) => segment !== \"\" && segment !== \".\");\n}\n\nfunction isRouteFile(basename: string): boolean {\n return ROUTE_FILE_NAMES.has(basename);\n}\n\nfunction isTestFile(name: string, segments: string[]): boolean {\n if (segments.includes(TEST_SEGMENT)) return true;\n if (/(^|[._-])(test|spec)([._-]|$)/i.test(name)) return true;\n return segments.some((segment) => segment === \"tests\");\n}\n\nfunction isComponentFile(basename: string, extension: string, segments: string[]): boolean {\n if (extension === \"tsx\" || extension === \"jsx\") return true;\n if (!COMPONENT_DIR_NAMES.has(segments.at(-2) ?? \"\")) return false;\n return /^[A-Z]/.test(basename);\n}\n\nfunction isUtilityFile(segments: string[]): boolean {\n return segments.some((segment) => UTILITY_DIR_NAMES.has(segment));\n}\n\nfunction isEntryFile(filePath: string, rootDir: string, entryPoints: Set<string>): boolean {\n if (entryPoints.has(path.normalize(filePath))) return true;\n\n const relative = toPosix(path.relative(rootDir, filePath));\n if (relative.startsWith(\"..\")) return false;\n const segments = relative.split(\"/\");\n if (segments.length !== 2) return false;\n if (segments[0] !== \"src\" && segments[0] !== \"\") return false;\n\n const basename = segments[1] ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n return ENTRY_FILE_NAMES.has(name);\n}\n\nexport interface CategorizerOptions {\n rootDir: string;\n /** Absolute paths of entry points (package.json `main`/`bin`, conventions). */\n entryPoints: Set<string>;\n}\n\n/**\n * Create a categorizer bound to a project. Returns a function that classifies\n * an absolute file path into zero or more categories.\n */\nexport function createCategorizer(options: CategorizerOptions): (filePath: string) => Category[] {\n const { rootDir, entryPoints } = options;\n\n return (filePath: string): Category[] => {\n const segments = relativeSegments(filePath, rootDir);\n const basename = segments.at(-1) ?? \"\";\n const dot = basename.lastIndexOf(\".\");\n const name = dot === -1 ? basename : basename.slice(0, dot);\n const extension = dot === -1 ? \"\" : basename.slice(dot + 1).toLowerCase();\n\n const categories: Category[] = [];\n\n if (isRouteFile(name)) categories.push(\"route\");\n else if (segments.some((segment) => ROUTE_DIR_NAMES.has(segment))) categories.push(\"route\");\n\n if (isTestFile(name, segments)) categories.push(\"test\");\n if (isComponentFile(name, extension, segments)) categories.push(\"component\");\n if (isUtilityFile(segments)) categories.push(\"utility\");\n if (isEntryFile(filePath, rootDir, entryPoints)) categories.push(\"entry\");\n if (categories.length === 0) categories.push(\"other\");\n\n return categories;\n };\n}\n\n/**\n * Detect entry points: package.json `main`/`bin` plus conventional root\n * entry file names (in the project root or `src/`).\n */\nexport async function detectEntryPoints(rootDir: string): Promise<Set<string>> {\n const started = Date.now();\n const entryPoints = new Set<string>();\n\n const packageJsonPath = await findPackageJson(rootDir);\n if (packageJsonPath) {\n const packageDir = path.dirname(packageJsonPath);\n for (const entry of await readPackageEntryPoints(packageJsonPath)) {\n const absolute = path.resolve(packageDir, entry);\n if (pathExistsSync(absolute)) entryPoints.add(path.normalize(absolute));\n }\n }\n\n const baseDirs = [rootDir, path.join(rootDir, \"src\")];\n for (const baseDir of baseDirs) {\n for (const name of ENTRY_FILE_NAMES) {\n for (const extension of [\"ts\", \"tsx\", \"js\", \"jsx\"]) {\n const candidate = path.join(baseDir, `${name}.${extension}`);\n if (pathExistsSync(candidate)) entryPoints.add(path.normalize(candidate));\n }\n }\n }\n\n if (process.env.RIPPLE_TRACE === \"1\") {\n console.error(`[trace] detectEntryPoints: ${Date.now() - started}ms`);\n }\n return entryPoints;\n}\n","/**\n * Turn a directory segment into a human-readable impact-area label:\n *\n * - `user-profile` → `User Profile`\n * - `userProfile` → `User Profile`\n * - `oauth` → `OAuth` (known acronyms use their canonical casing)\n * - `authentication` → `Authentication`\n */\nconst ACRONYM_CANONICAL: Record<string, string> = {\n api: \"API\",\n ui: \"UI\",\n ux: \"UX\",\n oauth: \"OAuth\",\n jwt: \"JWT\",\n http: \"HTTP\",\n https: \"HTTPS\",\n ws: \"WS\",\n sse: \"SSE\",\n db: \"DB\",\n sql: \"SQL\",\n id: \"ID\",\n cli: \"CLI\",\n ci: \"CI\",\n cd: \"CD\",\n csv: \"CSV\",\n json: \"JSON\",\n pdf: \"PDF\",\n cors: \"CORS\",\n url: \"URL\",\n uri: \"URI\",\n uuid: \"UUID\",\n html: \"HTML\",\n css: \"CSS\",\n js: \"JS\",\n ts: \"TS\",\n tsx: \"TSX\",\n jsx: \"JSX\",\n aws: \"AWS\",\n s3: \"S3\",\n sms: \"SMS\",\n mfa: \"MFA\",\n otp: \"OTP\",\n smtp: \"SMTP\",\n rss: \"RSS\",\n};\n\nfunction splitWords(segment: string): string[] {\n const normalized = segment.replace(/[^a-zA-Z0-9]+/g, \" \");\n const matches = normalized.match(/[A-Z]+(?=[A-Z][a-z])|[A-Z]?[a-z]+|[A-Z]+|[0-9]+/g);\n return (matches ?? [segment]).map((word) => word.toLowerCase());\n}\n\nfunction capitalize(word: string): string {\n return word.charAt(0).toUpperCase() + word.slice(1);\n}\n\nexport function humanizeArea(segment: string): string {\n const words = splitWords(segment);\n if (words.length === 0) return capitalize(segment);\n return words.map((word) => ACRONYM_CANONICAL[word] ?? capitalize(word)).join(\" \");\n}\n","import type { ImpactSummary, TopImpactArea } from \"../types/analysis.js\";\nimport type { AffectedFile } from \"../types/analysis.js\";\nimport { firstSegment } from \"../utils/paths.js\";\nimport { humanizeArea } from \"./humanize.js\";\n\n/**\n * Aggregate the affected-file map into an `ImpactSummary`: per-category\n * counters, max depth and top impact areas.\n *\n * A file matched by several categories counts once per category — counts\n * therefore do not sum to `affectedFiles`.\n */\n\nconst MAX_IMPACT_AREAS = 5;\n\nexport function buildSummary(\n affected: Map<string, AffectedFile>,\n srcRoot: string,\n confidence: number,\n): ImpactSummary {\n let routes = 0;\n let tests = 0;\n let components = 0;\n let utilities = 0;\n let entries = 0;\n let maxDepth = 0;\n\n const areaCounts = new Map<string, number>();\n\n for (const file of affected.values()) {\n if (file.depth > maxDepth) maxDepth = file.depth;\n if (file.categories.includes(\"route\")) routes++;\n if (file.categories.includes(\"test\")) tests++;\n if (file.categories.includes(\"component\")) components++;\n if (file.categories.includes(\"utility\")) utilities++;\n if (file.categories.includes(\"entry\")) entries++;\n\n const area = firstSegment(file.path, srcRoot);\n if (area) {\n areaCounts.set(area, (areaCounts.get(area) ?? 0) + 1);\n }\n }\n\n const topImpact: TopImpactArea[] = [...areaCounts.entries()]\n .map(([label, count]) => ({ label: humanizeArea(label), count }))\n .sort((a, b) => b.count - a.count || a.label.localeCompare(b.label))\n .slice(0, MAX_IMPACT_AREAS);\n\n return {\n affectedFiles: affected.size,\n routes,\n tests,\n components,\n utilities,\n entries,\n maxDepth,\n topImpact,\n confidence,\n };\n}\n","import type { AffectedFile } from \"../types/analysis.js\";\nimport type { Category } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\n\n/**\n * Reverse traversal: BFS over the reverse (importer) adjacency from a target\n * file, collecting every file that could be affected by changing it.\n *\n * - The target itself is never included in the result.\n * - `depth` is the number of import hops from the target (direct dependents\n * are depth 1).\n * - `maxDepth` caps the blast radius; `undefined` means unlimited.\n * - Visited set makes the traversal linear in the reachable subgraph.\n */\n\nexport interface ReverseTraversalOptions {\n maxDepth?: number;\n /** Classifies each visited file; provided by the caller for testability. */\n categorize: (filePath: string) => Category[];\n}\n\nexport interface ReverseTraversalResult {\n affected: Map<string, AffectedFile>;\n maxDepth: number;\n}\n\nexport function reverseTraverse(\n graph: DependencyGraph,\n targetKey: string,\n options: ReverseTraversalOptions,\n): ReverseTraversalResult {\n const { maxDepth, categorize } = options;\n\n const affected: Map<string, AffectedFile> = new Map();\n const visited = new Set<string>([targetKey]);\n const cycleMembers = cycleMemberPaths(graph);\n\n if (!graph.reverse.has(targetKey)) {\n return { affected, maxDepth: 0 };\n }\n\n const queue: Array<{ key: string; depth: number }> = [];\n for (const importer of graph.reverse.get(targetKey) ?? []) {\n queue.push({ key: importer, depth: 1 });\n }\n\n let deepest = 0;\n while (queue.length > 0) {\n const current = queue.shift();\n if (current === undefined) break;\n\n if (visited.has(current.key)) continue;\n visited.add(current.key);\n\n deepest = Math.max(deepest, current.depth);\n const node = graph.nodes.get(current.key);\n const filePath = node?.path ?? current.key;\n\n affected.set(current.key, {\n path: filePath,\n depth: current.depth,\n direct: current.depth === 1,\n categories: categorize(filePath),\n inCycle: cycleMembers.has(current.key),\n });\n\n if (maxDepth === undefined || current.depth < maxDepth) {\n for (const importer of graph.reverse.get(current.key) ?? []) {\n if (!visited.has(importer)) {\n queue.push({ key: importer, depth: current.depth + 1 });\n }\n }\n }\n }\n\n return { affected, maxDepth: deepest };\n}\n","import type { RiskThresholds } from \"../types/config.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Map a 0-100 risk score to a level using the configured thresholds.\n */\nexport function scoreToLevel(score: number, thresholds: RiskThresholds): RiskLevel {\n if (score >= thresholds.critical) return \"CRITICAL\";\n if (score >= thresholds.high) return \"HIGH\";\n if (score >= thresholds.medium) return \"MEDIUM\";\n return \"LOW\";\n}\n\n/** Clamp a value into [min, max]. */\nexport function clamp(value: number, min: number, max: number): number {\n return Math.min(max, Math.max(min, value));\n}\n\n/**\n * Log-scale a count into [0, 1]: 0 stays 0, `cap` reaches 1, everything\n * above `cap` saturates. Prevents one huge graph from dominating the score.\n */\nexport function logScale(count: number, cap: number): number {\n if (count <= 0) return 0;\n return clamp(Math.log10(count + 1) / Math.log10(cap + 1), 0, 1);\n}\n","import type { ImpactSummary } from \"../types/analysis.js\";\nimport type { RiskConfig } from \"../types/config.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { RiskFactor, RiskResult } from \"../types/risk.js\";\nimport { clamp, logScale, scoreToLevel } from \"./levels.js\";\n\n/**\n * Deterministic weighted risk heuristic.\n *\n * Each factor normalizes a graph signal into [0, 1] (see the doc comments on\n * `FACTORS`). The score is the weighted sum of the factors scaled to 0-100.\n * Factors and thresholds are user-configurable; the defaults sum to 1.0.\n */\n\ninterface RiskInput {\n summary: ImpactSummary;\n targetParsed: ParsedFile;\n targetInCycle: boolean;\n riskConfig: RiskConfig;\n}\n\ninterface FactorDefinition {\n name: string;\n label: string;\n /** Default weight (config overrides). */\n defaultWeight: number;\n compute: (input: RiskInput) => number;\n}\n\n/** Saturation caps: the count at which a factor maxes out. */\nconst CAP_AFFECTED_FILES = 100;\nconst CAP_UTILITIES = 10;\nconst CAP_TESTS = 15;\nconst CAP_ROUTES = 10;\nconst CAP_EXPORTS = 20;\n\nconst FACTORS: FactorDefinition[] = [\n {\n name: \"affectedFiles\",\n label: \"Affected files\",\n defaultWeight: 0.3,\n compute: ({ summary }) => logScale(summary.affectedFiles, CAP_AFFECTED_FILES),\n },\n {\n name: \"entryPoint\",\n label: \"Entry point impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => (summary.entries > 0 ? 1 : 0),\n },\n {\n name: \"sharedUtility\",\n label: \"Shared utilities impacted\",\n defaultWeight: 0.15,\n compute: ({ summary }) => clamp(summary.utilities / CAP_UTILITIES, 0, 1),\n },\n {\n name: \"publicExports\",\n label: \"Public export surface\",\n defaultWeight: 0.1,\n compute: ({ targetParsed }) => {\n const { exports } = targetParsed;\n const count =\n exports.named.length + (exports.hasDefault ? 1 : 0) + exports.reExportedFrom.length;\n return clamp(count / CAP_EXPORTS, 0, 1);\n },\n },\n {\n name: \"tests\",\n label: \"Tests affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.tests / CAP_TESTS, 0, 1),\n },\n {\n name: \"routes\",\n label: \"Routes affected\",\n defaultWeight: 0.1,\n compute: ({ summary }) => clamp(summary.routes / CAP_ROUTES, 0, 1),\n },\n {\n name: \"cycleMembership\",\n label: \"Circular dependency\",\n defaultWeight: 0.1,\n compute: ({ targetInCycle }) => (targetInCycle ? 1 : 0),\n },\n];\n\nfunction weightFor(definition: FactorDefinition, input: RiskInput): number {\n const configured = input.riskConfig.weights[definition.name as keyof RiskConfig[\"weights\"]];\n return configured ?? definition.defaultWeight;\n}\n\n/**\n * Compute the risk score and per-factor breakdown for an analysis result.\n */\nexport function scoreRisk(input: RiskInput): RiskResult {\n const factors: RiskFactor[] = FACTORS.map((definition) => {\n const weight = weightFor(definition, input);\n const value = definition.compute(input);\n return {\n name: definition.name,\n label: definition.label,\n weight,\n value,\n contribution: Math.round(weight * value * 100 * 100) / 100,\n };\n });\n\n const score = clamp(\n Math.round(factors.reduce((sum, factor) => sum + factor.contribution, 0) * 100) / 100,\n 0,\n 100,\n );\n\n return {\n score,\n level: scoreToLevel(score, input.riskConfig.thresholds),\n factors,\n };\n}\n","import path from \"node:path\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { cycleMemberPaths } from \"../types/graph.js\";\nimport { pathExistsSync } from \"../utils/fs.js\";\nimport { computeConfidence } from \"./confidence.js\";\nimport { createCategorizer } from \"./categorize.js\";\nimport { buildSummary } from \"./impact.js\";\nimport { reverseTraverse } from \"./reverse-traverse.js\";\nimport { scoreRisk } from \"../risk/score.js\";\n\n/**\n * Orchestrates a single `ripple analyze` run on top of an already-built\n * graph. Everything the commands layer needs is injected; the function is\n * pure apart from cheap filesystem existence checks.\n */\n\nexport interface AnalyzeInput {\n graph: DependencyGraph;\n context: ProjectContext;\n /** Absolute paths of detected entry points. */\n entryPoints: Set<string>;\n /** Canonical graph key of the analyzed file. */\n targetKey: string;\n /** Absolute path of the analyzed file. */\n targetPath: string;\n /** Wall time of the whole run, for reporting. */\n durationMs: number;\n /** Cap on traversal depth (undefined = unlimited). */\n maxDepth?: number;\n}\n\n/** The source root (directory holding the source tree) for impact areas. */\nexport function sourceRoot(rootDir: string): string {\n const candidate = path.join(rootDir, \"src\");\n return pathExistsSync(candidate) ? candidate : rootDir;\n}\n\nexport function analyzeFile(input: AnalyzeInput): AnalysisResult {\n const { graph, context, entryPoints, targetKey, targetPath, durationMs, maxDepth } = input;\n\n const node = graph.nodes.get(targetKey);\n if (!node) {\n throw new Error(`Target file is not part of the graph: ${targetPath}`);\n }\n\n const categorize = createCategorizer({ rootDir: context.rootDir, entryPoints });\n const { affected, maxDepth: reachedDepth } = reverseTraverse(graph, targetKey, {\n maxDepth,\n categorize,\n });\n\n const targetInCycle = cycleMemberPaths(graph).has(targetKey);\n const confidence = computeConfidence(graph.stats, targetInCycle);\n const summary = buildSummary(affected, sourceRoot(context.rootDir), confidence);\n\n const risk = scoreRisk({\n summary,\n targetParsed: node.parsed,\n targetInCycle,\n riskConfig: context.config.risk,\n });\n\n return {\n targetPath,\n rootDir: context.rootDir,\n graph,\n affected,\n summary,\n risk,\n targetInCycle,\n durationMs,\n maxDepth: reachedDepth,\n };\n}\n","import chalk from \"chalk\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Terminal text helpers. All functions take a `color` flag so output stays\n * deterministic in tests and in `--json` mode.\n */\n\nexport interface TextStyle {\n color: boolean;\n}\n\n/** Muted/secondary text, e.g. hints and counts. */\nexport function dim(text: string, style: TextStyle): string {\n return style.color ? chalk.dim(text) : text;\n}\n\n/** Emphasized value text. */\nexport function strong(text: string, style: TextStyle): string {\n return style.color ? chalk.bold(text) : text;\n}\n\nconst RISK_COLORS: Record<RiskLevel, (text: string) => string> = {\n LOW: (text) => chalk.green(text),\n MEDIUM: (text) => chalk.yellow(text),\n HIGH: (text) => chalk.magenta(text),\n CRITICAL: (text) => chalk.red.bold(text),\n};\n\n/** Chalk style function for a risk level. */\nexport function riskColor(level: RiskLevel): (text: string) => string {\n return RISK_COLORS[level];\n}\n\n/** Colored risk level badge, e.g. ` HIGH `. */\nexport function riskBadge(level: RiskLevel, style: TextStyle): string {\n return style.color ? RISK_COLORS[level](level) : level;\n}\n\n/** Confidence percentage with a subtle color cue. */\nexport function confidenceText(percent: number, style: TextStyle): string {\n const text = `${percent}%`;\n if (!style.color) return text;\n if (percent >= 90) return chalk.green(text);\n if (percent >= 70) return chalk.yellow(text);\n return chalk.red(text);\n}\n\n/** Humanize a duration in milliseconds. */\nexport function formatDuration(ms: number): string {\n if (ms < 1000) return `${ms}ms`;\n return `${(ms / 1000).toFixed(2)}s`;\n}\n\n/** Format a number with a plural-friendly noun, e.g. `7 files`. */\nexport function pluralize(count: number, noun: string, plural = `${noun}s`): string {\n return `${count} ${count === 1 ? noun : plural}`;\n}\n","import figures from \"figures\";\n\n/**\n * CLI glyph registry. `figures` keeps every symbol cross-platform and gives\n * a sensible fallback on consoles that cannot render Unicode.\n */\n\nexport type IconName =\n | \"tick\"\n | \"cross\"\n | \"warning\"\n | \"info\"\n | \"arrowRight\"\n | \"pointer\"\n | \"bullet\"\n | \"ellipsis\"\n | \"circle\";\n\n/** Resolve a named glyph for terminal output. */\nexport function icon(name: IconName): string {\n return figures[name];\n}\n","import chalk from \"chalk\";\nimport { formatDuration } from \"../formatter/text.js\";\nimport { icon } from \"./icons.js\";\n\n/**\n * Staged progress tracker. In interactive terminals each completed stage is\n * printed as a checkmarked line with its elapsed time:\n *\n * ✔ Loading config (2ms)\n * ✔ Building dependency graph (118ms)\n * ✔ Analyzing impact (1ms)\n *\n * Everywhere else (CI, pipes, JSON mode) it is a silent no-op.\n */\n\nexport interface StageTracker {\n /** Finish the previous stage (if any) and announce the next one. */\n next(label: string): void;\n /** Finish the current stage. */\n done(): void;\n}\n\nconst noop: StageTracker = {\n next: () => {},\n done: () => {},\n};\n\nexport function createStageTracker(enabled: boolean): StageTracker {\n if (!enabled || !process.stdout.isTTY) return noop;\n\n let current: string | undefined;\n let from = 0;\n\n const stamp = (label: string, ms: number): void => {\n process.stdout.write(\n `${chalk.green(icon(\"tick\"))} ${label} ${chalk.dim(formatDuration(ms))}\\n`,\n );\n };\n\n return {\n next(label: string): void {\n if (current) stamp(current, Date.now() - from);\n current = label;\n from = Date.now();\n },\n done(): void {\n if (current) stamp(current, Date.now() - from);\n current = undefined;\n },\n };\n}\n","/**\n * Resolve whether terminal output should be styled. Honors the explicit\n * `--no-color` flag first, then the standard `NO_COLOR` environment\n * variable (https://no-color.org). Actual ANSI emission is left to chalk,\n * which further disables itself when the stream is not a TTY.\n */\nexport function resolveColor(requested: boolean | undefined): boolean {\n if (requested === false) return false;\n const noColor = process.env.NO_COLOR;\n return noColor === undefined || noColor === \"\";\n}\n","/**\n * Simple aligned table rendering. Cells are padded to the widest cell in\n * their column; rows are joined with two spaces.\n */\n\nexport interface TableColumn {\n header: string;\n /** Right-align numeric-ish columns. */\n align?: \"left\" | \"right\";\n}\n\nexport function renderTable(columns: TableColumn[], rows: string[][]): string {\n const widths = columns.map((column, index) => {\n const cells = [column.header, ...rows.map((row) => row[index] ?? \"\")];\n return Math.max(...cells.map((cell) => cell.length));\n });\n\n const pad = (value: string, index: number): string => {\n const width = widths[index] ?? value.length;\n return columns[index]?.align === \"right\" ? value.padStart(width) : value.padEnd(width);\n };\n\n const lines: string[] = [];\n lines.push(columns.map((column, index) => pad(column.header, index)).join(\" \"));\n for (const row of rows) {\n lines.push(row.map((cell, index) => pad(cell, index)).join(\" \"));\n }\n return lines.join(\"\\n\");\n}\n\n/**\n * Render a key-value block with aligned values:\n *\n * Risk HIGH\n * Affected 7 files\n */\nexport function renderKeyValue(entries: Array<[string, string]>): string {\n const width = Math.max(...entries.map(([key]) => key.length));\n return entries.map(([key, value]) => `${key.padEnd(width)} ${value}`).join(\"\\n\");\n}\n","import treeify from \"treeify\";\nimport type { TreeObject } from \"treeify\";\n\n/**\n * Tree rendering on top of `treeify`:\n *\n * ├─ src/index.ts\n * │ └─ src/main.ts\n *\n * `treeify` is a tiny pure function (no ink, no DOM), which keeps this layer\n * trivially testable. Leaf values are empty strings; `showValues` is off.\n */\n\nexport interface TreeNode {\n label: string;\n children?: TreeNode[];\n}\n\nfunction toTreeify(node: TreeNode): string | TreeObject {\n if (!node.children || node.children.length === 0) return \"\";\n const branch: TreeObject = {};\n for (const child of node.children) {\n branch[child.label] = toTreeify(child);\n }\n return branch;\n}\n\nexport function renderTree(nodes: TreeNode[]): string {\n if (nodes.length === 0) return \"\";\n const root: TreeObject = {};\n for (const node of nodes) {\n root[node.label] = toTreeify(node);\n }\n return treeify.asTree(root, false, false).trimEnd();\n}\n","import chalk from \"chalk\";\nimport type { TextStyle } from \"../formatter/text.js\";\n\n/**\n * Brand identity primitives: the flat header line shown at the top of every\n * interactive command and the `›`-prefixed section titles between blocks.\n *\n * The layout is deliberately minimal — no boxes or dividers — so reports\n * read like a terminal-first tool rather than a printed page.\n */\n\nexport interface BrandOptions {\n /** Command label, e.g. `impact analysis`. */\n label: string;\n /** Semantic version to annotate the header with. */\n version?: string;\n style: TextStyle;\n}\n\n/**\n * Render the branded header as a single flat line:\n *\n * ripple · impact analysis · v0.1.1\n *\n * The brand name is bold cyan; the version is dimmed. Colorless output\n * falls back to the plain em-dash line.\n */\nexport function brandHeader(options: BrandOptions): string {\n const { label, version, style } = options;\n if (!style.color) {\n return `ripple — ${label}${version ? ` · v${version}` : \"\"}`;\n }\n const title = chalk.bold.cyan(`ripple · ${label}`);\n return `${title}${version ? ` ${chalk.dim(`· v${version}`)}` : \"\"}`;\n}\n\n/**\n * Section title, optionally prefixed with a dim caret in colored output:\n *\n * › Top impact\n */\nexport function sectionHeader(title: string, style: TextStyle): string {\n if (!style.color) return title;\n return `${chalk.dim(\"›\")} ${chalk.bold(title)}`;\n}\n","import type { TextStyle } from \"../formatter/text.js\";\nimport { riskColor } from \"../formatter/text.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\n/**\n * Risk gauge rendering. A 10-cell bar filled proportionally to the 0-100\n * score and tinted with the risk level color, e.g.:\n *\n * MEDIUM · 34.4/100 ███░░░░░░░\n *\n * The bar is color-only; colorless output omits it entirely so logs and\n * pipes stay clean and deterministic.\n */\n\nconst CELLS = 10;\nconst FILL = \"█\";\nconst EMPTY = \"░\";\n\nexport function riskGauge(score: number, level: RiskLevel, style: TextStyle): string {\n if (!style.color) return \"\";\n const filled = Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n return riskColor(level)(FILL.repeat(filled) + EMPTY.repeat(CELLS - filled));\n}\n\n/** Cells filled for a score, exported for tests. */\nexport function filledCells(score: number): number {\n return Math.max(0, Math.min(CELLS, Math.round((score / 100) * CELLS)));\n}\n","import type { AnalysisResult } from \"../types/analysis.js\";\nimport type { AnalyzeJsonReport, GraphJsonReport } from \"../types/output.js\";\nimport type { OutputWriter } from \"../types/cli.js\";\nimport type { DependencyGraph, GraphStats } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { renderKeyValue, renderTable, type TableColumn } from \"../formatter/table.js\";\nimport { renderTree, type TreeNode } from \"../formatter/tree.js\";\nimport {\n confidenceText,\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\n\n/**\n * Report rendering. Terminal output is built here; JSON payloads are built\n * as plain data and serialized by `src/formatter/json.ts`.\n */\n\nexport interface ReportOptions {\n /** Working directory used to relativize display paths. */\n cwd: string;\n /** Whether to emit ANSI colors and styled layout. */\n color: boolean;\n /** Extra sections (risk factor breakdown). */\n verbose: boolean;\n /** Package version shown in the header card. */\n version?: string;\n /** Cap on affected files listed in the terminal tree. */\n listLimit?: number;\n}\n\nconst DEFAULT_LIST_LIMIT = 20;\n\nconst textStyle = (options: ReportOptions): TextStyle => ({ color: options.color });\n\n/** Project-relative path for display, with optional depth/cycle suffixes. */\nfunction fileLabel(filePath: string, depth: number, inCycle: boolean, style: TextStyle): string {\n const parts: string[] = [dim(filePath, style)];\n if (depth >= 0) parts.push(dim(`· depth ${depth}`, style));\n if (inCycle) parts.push(dim(\"· cycle\", style));\n return parts.join(\" \");\n}\n\n/** Impact categories inline, e.g. `4 routes · 2 components · 1 test`. */\nfunction impactLine(result: AnalysisResult, style: TextStyle): string {\n const { summary } = result;\n const parts: string[] = [];\n if (summary.routes > 0) parts.push(pluralize(summary.routes, \"route\"));\n if (summary.components > 0) parts.push(pluralize(summary.components, \"component\"));\n if (summary.tests > 0) parts.push(pluralize(summary.tests, \"test\"));\n if (summary.utilities > 0) parts.push(pluralize(summary.utilities, \"utility\"));\n return parts.length > 0 ? parts.join(\" · \") : dim(\"none\", style);\n}\n\n/** Build the affected-file tree: depth-1 files are roots, deeper files are\n * nested under the first (deterministic) affected importer. `limit` caps the\n * number of files included so the terminal report matches its \"N more\" line. */\nfunction buildAffectedTree(\n result: AnalysisResult,\n cwd: string,\n style: TextStyle,\n limit: number,\n): TreeNode[] {\n const { affected, graph } = result;\n const sorted = [...affected.entries()]\n .sort(([, a], [, b]) => a.depth - b.depth || a.path.localeCompare(b.path))\n .slice(0, limit);\n\n const nodesByKey = new Map<string, TreeNode & { children: TreeNode[] }>();\n const depthByKey = new Map<string, number>();\n for (const [key, file] of sorted) {\n const node: TreeNode & { children: TreeNode[] } = { label: \"\", children: [] };\n node.label = fileLabel(displayPath(file.path, cwd), file.depth, file.inCycle, style);\n nodesByKey.set(key, node);\n depthByKey.set(key, file.depth);\n }\n\n const roots: TreeNode[] = [];\n for (const [key, file] of sorted) {\n const node = nodesByKey.get(key);\n if (!node) continue;\n\n if (file.depth === 1) {\n roots.push(node);\n continue;\n }\n\n const importers = graph.reverse.get(key) ?? [];\n const parents = [...importers]\n .filter(\n (candidate) => depthByKey.get(candidate) === file.depth - 1 && nodesByKey.has(candidate),\n )\n .sort((a, b) => (depthByKey.get(a) ?? 0) - (depthByKey.get(b) ?? 0) || a.localeCompare(b));\n\n const parent = parents[0] ? nodesByKey.get(parents[0]) : undefined;\n if (parent) {\n parent.children.push(node);\n } else {\n roots.push(node);\n }\n }\n\n return roots;\n}\n\n/** Render the full `ripple analyze` terminal report. */\nexport function renderAnalyzeReport(\n result: AnalysisResult,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { summary, risk } = result;\n const file = displayPath(result.targetPath, options.cwd);\n\n writer.writeLine(brandHeader({ label: \"impact analysis\", version: options.version, style }));\n writer.writeLine();\n\n const score = risk.score.toFixed(1);\n const gauge = riskGauge(risk.score, risk.level, style);\n const rows: Array<[string, string]> = [\n [\"File\", file],\n [\"Risk\", `${riskBadge(risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}`],\n [\"Impact\", impactLine(result, style)],\n [\"Affected\", pluralize(summary.affectedFiles, \"file\")],\n [\"Max depth\", String(summary.maxDepth)],\n [\"Confidence\", confidenceText(summary.confidence, style)],\n [\"Duration\", dim(formatDuration(result.durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Top impact\", style));\n for (const area of summary.topImpact) {\n writer.writeLine(\n `${icon(\"bullet\")} ${strong(area.label, style)} ${dim(`(${area.count})`, style)}`,\n );\n }\n writer.writeLine();\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (result.graph.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of result.graph.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = result.graph.nodes.get(key);\n return displayPath(node?.path ?? key, options.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n writer.writeLine();\n\n if (summary.affectedFiles > 0) {\n writer.writeLine(sectionHeader(`Affected files (${summary.affectedFiles})`, style));\n const limit = options.listLimit ?? DEFAULT_LIST_LIMIT;\n const tree = buildAffectedTree(result, options.cwd, style, limit);\n writer.writeLine(renderTree(tree));\n if (summary.affectedFiles > limit) {\n writer.writeLine(\n dim(`${summary.affectedFiles - limit} more… use --json for the full list`, style),\n );\n }\n writer.writeLine();\n }\n\n if (options.verbose) {\n writer.writeLine(sectionHeader(\"Risk factors\", style));\n const columns: TableColumn[] = [\n { header: \"Factor\" },\n { header: \"Weight\" },\n { header: \"Signal\" },\n { header: \"Points\" },\n ];\n const rowsVerbose = risk.factors.map((factor) => [\n factor.label,\n factor.weight.toFixed(2),\n factor.value.toFixed(2),\n factor.contribution.toFixed(2),\n ]);\n writer.writeLine(renderTable(columns, rowsVerbose));\n writer.writeLine();\n }\n\n if (style.color) {\n writer.writeLine(\n dim(`${icon(\"info\")} Tip: run \"ripple doctor\" to check project health`, style),\n );\n }\n}\n\n/** Build the machine-readable `analyze --json` payload. */\nexport function buildAnalyzeJsonReport(\n result: AnalysisResult,\n version: string,\n cwd: string,\n): AnalyzeJsonReport {\n const realPath = (key: string): string => result.graph.nodes.get(key)?.path ?? key;\n\n const affected = [...result.affected.values()]\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((file) => ({ ...file, path: displayPath(file.path, cwd) }));\n\n return {\n tool: \"ripple\",\n version,\n command: \"analyze\",\n file: displayPath(result.targetPath, cwd),\n risk: result.risk,\n summary: result.summary,\n affected,\n cycles: result.graph.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), cwd)),\n })),\n targetInCycle: result.targetInCycle,\n durationMs: result.durationMs,\n };\n}\n\nexport interface GraphReportInput {\n stats: GraphStats;\n cycles: DependencyGraph[\"cycles\"];\n nodes: DependencyGraph[\"nodes\"];\n cwd: string;\n /** For `ripple graph <file>`: forward and reverse file lists. */\n forward?: string[];\n reverse?: string[];\n}\n\n/** Render the `ripple graph` terminal report. */\nexport function renderGraphReport(\n input: GraphReportInput,\n options: ReportOptions,\n writer: OutputWriter,\n): void {\n const style = textStyle(options);\n const { stats } = input;\n\n writer.writeLine(brandHeader({ label: \"dependency graph\", version: options.version, style }));\n writer.writeLine();\n\n writer.writeLine(\n renderKeyValue([\n [\"Files\", String(stats.files)],\n [\"Edges\", String(stats.internalEdges)],\n [\"External\", String(stats.externalEdges)],\n [\"Unresolved\", String(stats.unresolvedEdges)],\n [\"Circular groups\", String(stats.cycles)],\n ]),\n );\n writer.writeLine();\n\n if (input.forward) {\n writer.writeLine(sectionHeader(\"Dependants (forward)\", style));\n writer.writeLine(renderTree(input.forward.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n if (input.reverse) {\n writer.writeLine(sectionHeader(\"Dependents (reverse)\", style));\n writer.writeLine(renderTree(input.reverse.map((path) => ({ label: path }))));\n writer.writeLine();\n }\n\n writer.writeLine(sectionHeader(\"Circular dependencies\", style));\n if (input.cycles.length === 0) {\n writer.writeLine(dim(\"none\", style));\n } else {\n for (const cycle of input.cycles) {\n const chain = cycle.path\n .map((key) => {\n const node = input.nodes.get(key);\n return displayPath(node?.path ?? key, input.cwd);\n })\n .join(` ${icon(\"arrowRight\")} `);\n writer.writeLine(`${icon(\"circle\")} ${chain}`);\n }\n }\n}\n\n/** Build the machine-readable `graph --json` payload. */\nexport function buildGraphJsonReport(input: GraphReportInput, version: string): GraphJsonReport {\n const realPath = (key: string): string => input.nodes.get(key)?.path ?? key;\n return {\n tool: \"ripple\",\n version,\n command: \"graph\",\n fileCount: input.stats.files,\n edgeCount: input.stats.internalEdges,\n externalEdgeCount: input.stats.externalEdges,\n cycles: input.cycles.map((cycle) => ({\n members: cycle.members.map((key) => displayPath(realPath(key), input.cwd)),\n path: cycle.path.map((key) => displayPath(realPath(key), input.cwd)),\n })),\n ...(input.forward ? { forward: input.forward } : {}),\n ...(input.reverse ? { reverse: input.reverse } : {}),\n };\n}\n","/** Serialize a report object to pretty JSON. */\nexport function serializeJson(report: unknown): string {\n return `${JSON.stringify(report, null, 2)}\\n`;\n}\n","import { createHash } from \"node:crypto\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\nimport type { DiffCounts } from \"../commands/diff.js\";\nimport type { GateLevel } from \"../types/output.js\";\n\n/**\n * SARIF 2.1.0 output for `ripple diff --format sarif` and\n * `ripple analyze --sarif`.\n *\n * The payload is shaped for GitHub Code Scanning uploads (`gh codeql\n * upload-sarif` / `actions/upload-sarif`): every result carries a stable\n * `partialFingerprints.primaryLocationLineHash` so findings deduplicate\n * across runs, and allowlisted files are emitted at `note` with an in-source\n * suppression so they show as exempted rather than as errors.\n */\n\nexport type SarifLevel = \"error\" | \"warning\" | \"note\";\n\nconst LEVEL_INDEX: Record<RiskLevel, number> = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };\n\nconst GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nconst INFORMATION_URI = \"https://github.com/alimaandev/ripple\";\n\n/** Minimal structural typing for the SARIF 2.1.0 document we emit. */\nexport interface SarifDocument {\n $schema: string;\n version: string;\n runs: Array<{\n tool: { driver: Record<string, unknown> };\n results: Array<Record<string, unknown>>;\n properties?: Record<string, unknown>;\n }>;\n}\n\n/** Map a Ripple risk level to a SARIF severity. */\nexport function riskToSarifLevel(level: RiskLevel): SarifLevel {\n switch (level) {\n case \"CRITICAL\":\n case \"HIGH\":\n return \"error\";\n case \"MEDIUM\":\n return \"warning\";\n default:\n return \"note\";\n }\n}\n\n/** Stable per-file fingerprint so GitHub deduplicates findings across runs. */\nexport function primaryLocationHash(ruleId: string, uri: string): string {\n return createHash(\"sha256\").update(`${ruleId}|${uri}`).digest(\"hex\");\n}\n\n/** The single rule Ripple reports against. */\nconst RISK_RULE = {\n id: \"ripple/risk\",\n name: \"riskScore\",\n shortDescription: {\n text: \"Risk of changing a file's blast radius\",\n },\n fullDescription: {\n text: \"Ripple scores how risky a change to a file is — its impact area, affected files, and circular-dependency membership — and gates merges on the resulting level.\",\n },\n defaultConfiguration: { level: \"warning\" },\n properties: { tags: [\"ripple\", \"impact-analysis\"] },\n};\n\ninterface DiffSarifEntry {\n /** Project-relative path, used for display and diagnostics. */\n rel: string;\n /** Repository-relative path for Code Scanning artifact URIs. */\n repoRel?: string;\n result: AnalysisResult;\n allowed: boolean;\n}\n\n/** File-level SARIF result for one analyzed file. */\nfunction fileResult(entry: DiffSarifEntry, gate: GateLevel): Record<string, unknown> {\n const { rel, result, allowed } = entry;\n const uri = entry.repoRel ?? rel;\n const level = allowed ? \"note\" : riskToSarifLevel(result.risk.level);\n const blocked = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n const score = result.risk.score.toFixed(1);\n const affected = result.summary.affectedFiles;\n const message = allowed\n ? `Allowlisted: ${result.risk.level} risk (${score}/100) - ${affected} affected file(s)`\n : `${result.risk.level} risk (${score}/100) - ${affected} affected file(s)`;\n\n const entryResult: Record<string, unknown> = {\n ruleId: \"ripple/risk\",\n level,\n message: { text: message },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri },\n region: { startLine: 1 },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: primaryLocationHash(\"ripple/risk\", uri),\n },\n properties: {\n ripple: {\n score: result.risk.score,\n level: result.risk.level,\n affectedFiles: result.summary.affectedFiles,\n targetInCycle: result.targetInCycle,\n allowed,\n blocked,\n gate,\n },\n },\n };\n\n if (allowed) {\n entryResult.suppressions = [\n { kind: \"inSource\", justification: \"Allowlisted via diff.allow in ripple config\" },\n ];\n }\n\n return entryResult;\n}\n\n/**\n * Build the SARIF document for `ripple diff`. Analyzed files become results;\n * changed-but-skipped (non-source) files are omitted. The gate counts ride\n * along in `run.properties` so the Code Scanning result and the CI verdict\n * stay consistent.\n */\nexport function buildDiffSarif(options: {\n baseLabel: string;\n entries: DiffSarifEntry[];\n gate: GateLevel;\n counts: DiffCounts;\n blocked: boolean;\n durationMs: number;\n version: string;\n}): SarifDocument {\n const { baseLabel, entries, gate, counts, blocked, durationMs, version } = options;\n const results = entries.map((entry) => fileResult(entry, gate));\n\n return {\n $schema: \"https://json.schemastore.org/sarif-2.1.0.json\",\n version: \"2.1.0\",\n runs: [\n {\n tool: {\n driver: {\n name: \"ripple\",\n fullName: \"Ripple — dependency impact analysis\",\n informationUri: INFORMATION_URI,\n version,\n rules: [RISK_RULE],\n },\n },\n results,\n properties: {\n ripple: {\n command: \"diff\",\n base: baseLabel,\n gate,\n blocked,\n counts,\n durationMs,\n },\n },\n },\n ],\n };\n}\n\n/** Build the SARIF document for `ripple analyze` (single-file result). */\nexport function buildAnalyzeSarif(options: {\n result: AnalysisResult;\n cwd: string;\n version: string;\n}): SarifDocument {\n const { result, cwd, version } = options;\n const rel = result.targetPath\n .slice(cwd.length)\n .replace(/^[/\\\\]+/, \"\")\n .replace(/\\\\/g, \"/\");\n const uri = rel || result.targetPath;\n\n return {\n $schema: \"https://json.schemastore.org/sarif-2.1.0.json\",\n version: \"2.1.0\",\n runs: [\n {\n tool: {\n driver: {\n name: \"ripple\",\n fullName: \"Ripple — dependency impact analysis\",\n informationUri: INFORMATION_URI,\n version,\n rules: [RISK_RULE],\n },\n },\n results: [\n {\n ruleId: \"ripple/risk\",\n level: riskToSarifLevel(result.risk.level),\n message: {\n text: `${result.risk.level} risk (${result.risk.score.toFixed(1)}/100) - ${result.summary.affectedFiles} affected file(s)`,\n },\n locations: [\n {\n physicalLocation: {\n artifactLocation: { uri },\n region: { startLine: 1 },\n },\n },\n ],\n partialFingerprints: {\n primaryLocationLineHash: primaryLocationHash(\"ripple/risk\", uri),\n },\n properties: {\n ripple: {\n score: result.risk.score,\n level: result.risk.level,\n affectedFiles: result.summary.affectedFiles,\n targetInCycle: result.targetInCycle,\n },\n },\n },\n ],\n },\n ],\n };\n}\n","import { Project, ts } from \"ts-morph\";\n\n/**\n * Shared ts-morph `Project` factory.\n *\n * One project is created per analysis run and reused for every file:\n * ts-morph parses lazily per source file, so this keeps memory bounded while\n * avoiding per-file project overhead. Files are added individually — the\n * tsconfig is never auto-loaded, since Ripple controls discovery itself.\n */\nexport function createTsProject(): Project {\n return new Project({\n skipAddingFilesFromTsConfig: true,\n compilerOptions: {\n allowJs: true,\n checkJs: false,\n jsx: ts.JsxEmit.Preserve,\n noEmit: true,\n target: ts.ScriptTarget.ESNext,\n },\n });\n}\n","import fg from \"fast-glob\";\n\n/**\n * File discovery on top of fast-glob.\n *\n * Patterns are resolved against `cwd`; results are absolute native paths.\n * A file may match several `include` patterns; results are deduplicated.\n */\n\nexport interface GlobOptions {\n cwd: string;\n /** Glob patterns to include. */\n patterns: string[];\n /** Glob patterns to ignore. */\n ignore: string[];\n}\n\nexport async function globFiles(options: GlobOptions): Promise<string[]> {\n const matches = await fg(options.patterns, {\n cwd: options.cwd,\n ignore: options.ignore,\n onlyFiles: true,\n absolute: true,\n unique: true,\n followSymbolicLinks: false,\n suppressErrors: true,\n });\n return matches;\n}\n\n/** Convert a plain directory/segment name to an ignore glob that matches it at any depth. */\nexport function toIgnoreGlob(segment: string): string {\n const trimmed = segment.replace(/^\\/+|\\/+$/g, \"\");\n if (trimmed === \"\") return \"\";\n const glob = trimmed.includes(\"*\") || trimmed.includes(\"{\") ? trimmed : `**/${trimmed}/**`;\n return glob;\n}\n","import { sourceFileKind, SOURCE_EXTENSIONS } from \"../utils/paths.js\";\n\n/**\n * Canonical discovery rules: which extensions count as source files and which\n * directories are ignored by default. `src/config/defaults.ts` imports the\n * default ignore names from here so the knowledge lives in exactly one place.\n */\n\nexport const SOURCE_EXTENSION_GLOB = `*.{${SOURCE_EXTENSIONS.map((e) => e.slice(1)).join(\",\")}}`;\n\n/** Extensions accepted by the scanner. */\nexport const STANDARD_IGNORE_NAMES = [\n \"node_modules\",\n \"dist\",\n \"build\",\n \"coverage\",\n \".next\",\n \"out\",\n \".git\",\n] as const;\n\n/** Whether a file path ends with a discoverable source extension. */\nexport function isSourceFile(filePath: string): boolean {\n return sourceFileKind(filePath) !== undefined;\n}\n","import { globFiles, toIgnoreGlob } from \"../utils/globs.js\";\nimport { isSourceFile } from \"./rules.js\";\n\n/**\n * Recursive source-file discovery for a project.\n *\n * Combines the configured `include` globs with the configured `ignore`\n * entries (plain directory names are converted to catch-all globs) and\n * filters results down to source extensions. Files may match multiple\n * patterns; the result is deduplicated and sorted for determinism.\n */\n\nexport interface DiscoveryOptions {\n rootDir: string;\n include: string[];\n ignore: string[];\n}\n\nexport async function discoverSourceFiles(options: DiscoveryOptions): Promise<string[]> {\n const ignoreGlobs = options.ignore\n .map(toIgnoreGlob)\n .filter((glob) => glob !== \"\")\n .concat([\"**/node_modules/**\", \"**/.ripple/**\"]);\n\n const files = await globFiles({\n cwd: options.rootDir,\n patterns: options.include,\n ignore: ignoreGlobs,\n });\n\n return files.filter(isSourceFile).sort((a, b) => a.localeCompare(b));\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { ExportInfo } from \"../types/parser.js\";\n\n/**\n * Extract the public export surface of a file:\n *\n * - `export const x`, `export function x`, `export class X`, ... (declarations)\n * - `export default ...`\n * - re-exports: `export { x } from \"...\"` and `export * from \"...\"`\n */\nexport function extractExports(sourceFile: SourceFile): ExportInfo {\n const named: string[] = [];\n const reExportedFrom: string[] = [];\n const reExportedAll: string[] = [];\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n const namedExports = decl.getNamedExports();\n\n if (specifier) {\n if (namedExports.length === 0) {\n reExportedAll.push(specifier);\n } else {\n reExportedFrom.push(specifier);\n }\n continue;\n }\n\n for (const namedExport of namedExports) {\n named.push(namedExport.getName());\n }\n }\n\n for (const statement of sourceFile.getVariableStatements()) {\n if (!statement.isExported()) continue;\n for (const declaration of statement.getDeclarations()) {\n named.push(declaration.getName());\n }\n }\n\n for (const fn of sourceFile.getFunctions()) {\n if (!fn.isExported()) continue;\n const name = fn.getName();\n if (name) named.push(name);\n }\n\n for (const cls of sourceFile.getClasses()) {\n if (!cls.isExported()) continue;\n const name = cls.getName();\n if (name) named.push(name);\n }\n\n for (const en of sourceFile.getEnums()) {\n if (!en.isExported()) continue;\n const name = en.getName();\n if (name) named.push(name);\n }\n\n for (const iface of sourceFile.getInterfaces()) {\n if (!iface.isExported()) continue;\n named.push(iface.getName());\n }\n\n for (const alias of sourceFile.getTypeAliases()) {\n if (!alias.isExported()) continue;\n named.push(alias.getName());\n }\n\n const hasDefault =\n sourceFile.getExportAssignments().length > 0 ||\n sourceFile.getFunctions().some((fn) => fn.isDefaultExport()) ||\n sourceFile.getClasses().some((cls) => cls.isDefaultExport());\n\n named.sort();\n return { named, hasDefault, reExportedFrom, reExportedAll };\n}\n","import { SyntaxKind, type ImportEqualsDeclaration, type SourceFile } from \"ts-morph\";\nimport type { ImportDeclaration, ImportSpecifier } from \"../types/parser.js\";\n\n/**\n * Extract every module specifier a file depends on:\n *\n * - `import ... from \"x\"` / bare `import \"x\"`\n * - `export { ... } from \"x\"` / `export * from \"x\"`\n * - `import(\"x\")` dynamic imports\n * - `require(\"x\")` and `import x = require(\"x\")`\n *\n * Only statically analyzable string-literal specifiers are reported.\n */\n\nfunction specifierFor(\n imported: string,\n alias: string | undefined,\n isType: boolean,\n): ImportSpecifier {\n return alias && alias !== imported\n ? { name: imported, alias, isType }\n : { name: imported, isType };\n}\n\nexport function extractImports(sourceFile: SourceFile): ImportDeclaration[] {\n const declarations: ImportDeclaration[] = [];\n\n for (const decl of sourceFile.getImportDeclarations()) {\n declarations.push({\n raw: decl.getModuleSpecifierValue(),\n kind: \"import\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedImports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n for (const decl of sourceFile.getExportDeclarations()) {\n const specifier = decl.getModuleSpecifierValue();\n if (!specifier) continue;\n declarations.push({\n raw: specifier,\n kind: \"export-from\",\n isTypeOnly: decl.isTypeOnly(),\n specifiers: decl\n .getNamedExports()\n .map((named) =>\n specifierFor(named.getName(), named.getAliasNode()?.getText(), named.isTypeOnly()),\n ),\n });\n }\n\n const importEqualsNodes = sourceFile\n .getDescendantsOfKind(SyntaxKind.ImportEqualsDeclaration)\n .map((node) => node as ImportEqualsDeclaration);\n for (const decl of importEqualsNodes) {\n const literal = decl.getFirstDescendantByKind(SyntaxKind.StringLiteral);\n if (literal) {\n declarations.push({\n raw: literal.getLiteralText(),\n kind: \"require\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n }\n\n for (const call of sourceFile.getDescendantsOfKind(SyntaxKind.CallExpression)) {\n const callee = call.getExpression().getText();\n if (callee !== \"require\" && callee !== \"import\") continue;\n const argument = call.getArguments()[0];\n if (!argument?.isKind(SyntaxKind.StringLiteral)) continue;\n declarations.push({\n raw: argument.getLiteralText(),\n kind: callee === \"require\" ? \"require\" : \"dynamic\",\n isTypeOnly: false,\n specifiers: [],\n });\n }\n\n return declarations;\n}\n","import type { SourceFile } from \"ts-morph\";\nimport type { SymbolInfo } from \"../types/parser.js\";\n\n/**\n * Extract top-level declarations of a file. Used by the risk engine to\n * estimate the public surface and by categorization to classify files.\n */\nexport function extractSymbols(sourceFile: SourceFile): SymbolInfo {\n return {\n functions: sourceFile.getFunctions().map((fn) => fn.getName() ?? \"(default)\"),\n classes: sourceFile.getClasses().map((cls) => cls.getName() ?? \"(default)\"),\n interfaces: sourceFile.getInterfaces().map((iface) => iface.getName()),\n enums: sourceFile.getEnums().map((en) => en.getName()),\n typeAliases: sourceFile.getTypeAliases().map((alias) => alias.getName()),\n };\n}\n","import type { DiagnosticWithLocation, Project, SourceFile } from \"ts-morph\";\nimport type { ParsedFile, SourceFileKind } from \"../types/parser.js\";\nimport { pathKey, sourceFileKind } from \"../utils/paths.js\";\nimport { extractExports } from \"./exports.js\";\nimport { extractImports } from \"./imports.js\";\nimport { extractSymbols } from \"./symbols.js\";\n\n/**\n * Parse files into `ParsedFile`s. A parse failure must never abort the\n * analysis: the error is recorded and the file keeps an empty surface so it\n * still participates in the graph as a node.\n *\n * Syntactic diagnostics are checked after all files in a batch have been\n * added, so the shared ts-morph project builds one compiler program for the\n * whole batch instead of one per file.\n */\n\nconst MAX_REPORTED_DIAGNOSTICS = 3;\n\nfunction diagnosticText(diagnostic: DiagnosticWithLocation): string {\n const message = diagnostic.getMessageText();\n return typeof message === \"string\" ? message : message.getMessageText();\n}\n\nfunction formatDiagnostics(diagnostics: DiagnosticWithLocation[]): string {\n const parts = diagnostics.slice(0, MAX_REPORTED_DIAGNOSTICS).map((diagnostic) => {\n const line = diagnostic.getLineNumber();\n return `${line !== undefined ? `line ${line}: ` : \"\"}${diagnosticText(diagnostic)}`;\n });\n const suffix =\n diagnostics.length > MAX_REPORTED_DIAGNOSTICS\n ? ` (+${diagnostics.length - MAX_REPORTED_DIAGNOSTICS} more)`\n : \"\";\n return `${parts.join(\"; \")}${suffix}`;\n}\n\n/**\n * Syntactic diagnostics are the compiler's way of saying \"this file is not\n * valid TypeScript\". ts-morph still returns a `SourceFile` for such files, so\n * an extractor-only check would report them as parsed cleanly.\n */\nfunction collectSyntacticErrors(project: Project, filePaths: string[]): Map<string, string> {\n const errors = new Map<string, string>();\n if (filePaths.length === 0) return errors;\n\n const targets = new Set(filePaths.map((filePath) => pathKey(filePath, process.cwd())));\n let diagnostics: DiagnosticWithLocation[];\n try {\n diagnostics = project.getProgram().getSyntacticDiagnostics();\n } catch {\n return errors;\n }\n\n const byFile = new Map<string, DiagnosticWithLocation[]>();\n for (const diagnostic of diagnostics) {\n const key = pathKey(diagnostic.getSourceFile().getFilePath(), process.cwd());\n if (!targets.has(key)) continue;\n const list = byFile.get(key) ?? [];\n list.push(diagnostic);\n byFile.set(key, list);\n }\n for (const [key, list] of byFile) {\n errors.set(key, formatDiagnostics(list));\n }\n return errors;\n}\n\nfunction emptySurface(filePath: string, kind: SourceFileKind, parseError: string): ParsedFile {\n return {\n path: filePath,\n kind,\n imports: [],\n exports: { named: [], hasDefault: false, reExportedFrom: [], reExportedAll: [] },\n symbols: { functions: [], classes: [], interfaces: [], enums: [], typeAliases: [] },\n parseError,\n };\n}\n\n/** Add one file and extract its surface; syntax is checked by the caller. */\nfunction parseSurface(project: Project, filePath: string): ParsedFile {\n const kind = sourceFileKind(filePath) ?? \"ts\";\n\n let sourceFile: SourceFile;\n try {\n sourceFile = project.addSourceFileAtPath(filePath);\n } catch (error) {\n return emptySurface(filePath, kind, error instanceof Error ? error.message : String(error));\n }\n\n try {\n return {\n path: filePath,\n kind,\n imports: extractImports(sourceFile),\n exports: extractExports(sourceFile),\n symbols: extractSymbols(sourceFile),\n };\n } catch (error) {\n return emptySurface(filePath, kind, error instanceof Error ? error.message : String(error));\n }\n}\n\n/** Parse one file. Convenience wrapper used by tests and single-file callers. */\nexport function parseSourceFile(project: Project, filePath: string): ParsedFile {\n return parseMany(project, [filePath])[0]!;\n}\n\n/** Parse many files, reusing the shared project. Never throws. */\nexport function parseMany(project: Project, filePaths: string[]): ParsedFile[] {\n const parsed = filePaths.map((filePath) => parseSurface(project, filePath));\n const syntaxErrors = collectSyntacticErrors(project, filePaths);\n\n return parsed.map((parsedFile) => {\n if (parsedFile.parseError !== undefined) return parsedFile;\n const error = syntaxErrors.get(pathKey(parsedFile.path, process.cwd()));\n return error === undefined ? parsedFile : emptySurface(parsedFile.path, parsedFile.kind, error);\n });\n}\n","import type { Cycle, DependencyGraph } from \"../types/graph.js\";\n\n/**\n * Cycle detection via Kosaraju's strongly-connected-components algorithm,\n * implemented iteratively so deep import chains can never overflow the call\n * stack.\n *\n * Every SCC with more than one node (or a self-loop) is a circular\n * dependency group. For each group we additionally walk one representative\n * cycle path so output shows the *actual import chain*, not just the member\n * set.\n *\n * Ripple reports cycle *groups*: two files in the same SCC are reported once,\n * not once per back edge.\n */\n\n/** Find SCCs in `graph`. Returns groups of node keys. */\nexport function findCycles(graph: DependencyGraph): Cycle[] {\n const nodeKeys = [...graph.nodes.keys()];\n\n // Pass 1: finish order via iterative DFS on the forward graph.\n const visited = new Set<string>();\n const finishOrder: string[] = [];\n\n for (const start of nodeKeys) {\n if (visited.has(start)) continue;\n const stack: Array<[node: string, neighborIndex: number]> = [[start, 0]];\n visited.add(start);\n\n while (stack.length > 0) {\n const top = stack[stack.length - 1];\n if (top === undefined) break;\n const [node, index] = top;\n const neighbors = [...(graph.forward.get(node) ?? [])];\n\n if (index < neighbors.length) {\n top[1] = index + 1;\n const neighbor = neighbors[index];\n if (neighbor === undefined) continue;\n if (!visited.has(neighbor)) {\n visited.add(neighbor);\n stack.push([neighbor, 0]);\n }\n } else {\n stack.pop();\n finishOrder.push(node);\n }\n }\n }\n\n // Pass 2: process in reverse finish order on the reverse graph.\n const componentOf = new Map<string, number>();\n const components: string[][] = [];\n\n for (let i = finishOrder.length - 1; i >= 0; i--) {\n const start = finishOrder[i];\n if (start === undefined || componentOf.has(start)) continue;\n\n const component: string[] = [];\n const stack = [start];\n componentOf.set(start, components.length);\n\n while (stack.length > 0) {\n const node = stack.pop();\n if (node === undefined) continue;\n component.push(node);\n for (const neighbor of graph.reverse.get(node) ?? []) {\n if (!componentOf.has(neighbor)) {\n componentOf.set(neighbor, components.length);\n stack.push(neighbor);\n }\n }\n }\n\n components.push(component);\n }\n\n const cycles: Cycle[] = [];\n for (const component of components) {\n if (component.length < 2) {\n const single = component[0];\n if (single !== undefined && graph.forward.get(single)?.has(single)) {\n cycles.push({ members: [single], path: [single, single] });\n }\n continue;\n }\n\n const members = [...component].sort();\n const componentSet = new Set(component);\n const path = representativeCyclePath(graph, component, componentSet);\n cycles.push({ members, path: path ?? [members[0]!, members[0]!] });\n }\n\n cycles.sort(\n (a, b) => a.members.length - b.members.length || a.members[0]!.localeCompare(b.members[0]!),\n );\n return cycles;\n}\n\n/**\n * Walk forward edges within the component until a node is revisited; the\n * segment from the first occurrence forms a cycle path (start == end).\n */\nfunction representativeCyclePath(\n graph: DependencyGraph,\n component: string[],\n componentSet: Set<string>,\n): string[] | undefined {\n const inPath = new Set<string>();\n const path: string[] = [];\n let current: string | undefined = component[0];\n\n for (let steps = 0; steps <= component.length * 2 && current !== undefined; steps++) {\n const firstOccurrence = inPath.has(current);\n if (firstOccurrence) {\n const start = path.indexOf(current);\n if (start === -1) return undefined;\n const cycle = path.slice(start);\n if (cycle.length > 1 || graph.forward.get(current)?.has(current)) {\n cycle.push(current);\n return cycle;\n }\n return undefined;\n }\n inPath.add(current);\n path.push(current);\n\n const next = [...(graph.forward.get(current) ?? [])].find((candidate) =>\n componentSet.has(candidate),\n );\n current = next;\n }\n\n return undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { substituteAlias } from \"../config/aliases.js\";\nimport type { AliasMap } from \"../types/config.js\";\nimport type { EdgeKind } from \"../types/graph.js\";\nimport { extensionCandidates, jsToTsCandidates, pathKey } from \"../utils/paths.js\";\n\n/**\n * Module specifier resolution.\n *\n * Resolution pipeline for one import declaration:\n *\n * 1. Alias substitution (`ripple.config.ts` aliases + tsconfig `paths`).\n * 2. Relative/bare classification.\n * 3. Candidate probing: exact, extension candidates, directory index files.\n * `.js` specifiers may resolve to `.ts` files (NodeNext-style projects).\n * 4. Bare specifiers that cannot be probed are external.\n * 5. Relative imports that point at existing files outside the analyzed set\n * (assets like `.css`, `.json`, or ignored source files) are external —\n * they exist, Ripple just does not model them.\n *\n * The resolver is a pure function of its inputs and does no I/O beyond\n * cheap existence checks.\n */\n\nexport interface ResolverContext {\n /** Project root. */\n rootDir: string;\n aliases: AliasMap;\n /** Canonical keys of all discovered files. */\n fileKeys: Set<string>;\n}\n\nexport interface ResolvedEdge {\n /** Absolute path of the resolved file, for internal edges. */\n filePath?: string;\n kind: EdgeKind;\n}\n\n/** Replace the last extension-less segment and probe existing files. */\nfunction probeCandidates(base: string, fileKeys: Set<string>, rootDir: string): string | undefined {\n for (const candidate of extensionCandidates(base)) {\n const key = pathKey(candidate, rootDir);\n if (fileKeys.has(key)) return path.normalize(candidate);\n }\n for (const swapped of jsToTsCandidates(base)) {\n const swappedKey = pathKey(swapped, rootDir);\n if (fileKeys.has(swappedKey)) return path.normalize(swapped);\n }\n return undefined;\n}\n\n/** An absolute path exists on disk as a file or directory. */\nfunction existsOnDisk(filePath: string): boolean {\n try {\n fs.accessSync(filePath);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a specifier to an absolute candidate path (possibly\n * extension-less) or `undefined` when the specifier cannot be interpreted.\n */\nfunction specifierToBase(\n specifier: string,\n fromDir: string,\n context: ResolverContext,\n): string | undefined {\n const { rootDir, aliases } = context;\n\n if (specifier.startsWith(\"/\")) {\n return path.resolve(rootDir, specifier.slice(1));\n }\n if (specifier.startsWith(\".\")) {\n return path.resolve(fromDir, specifier);\n }\n const substituted = substituteAlias(specifier, aliases);\n if (substituted === undefined) return undefined;\n return path.isAbsolute(substituted) ? substituted : path.resolve(rootDir, substituted);\n}\n\n/** Resolve a specifier to a discovered file, or `undefined`. */\nfunction resolveToFile(base: string, context: ResolverContext): string | undefined {\n const { rootDir, fileKeys } = context;\n\n const exactKey = pathKey(base, rootDir);\n if (fileKeys.has(exactKey)) return path.normalize(base);\n\n const probed = probeCandidates(base, fileKeys, rootDir);\n if (probed) return probed;\n\n if (existsOnDisk(base) && fs.statSync(base).isDirectory()) {\n const indexProbed = probeCandidates(path.join(base, \"index\"), fileKeys, rootDir);\n if (indexProbed) return indexProbed;\n }\n\n return undefined;\n}\n\n/**\n * Resolve one import declaration from a source file. Returns the edge kind\n * and, for internal edges, the absolute target path.\n */\nexport function resolveEdge(\n specifier: string,\n fromPath: string,\n context: ResolverContext,\n): ResolvedEdge {\n const base = specifierToBase(specifier, path.dirname(fromPath), context);\n\n if (base !== undefined) {\n const resolved = resolveToFile(base, context);\n if (resolved !== undefined) return { filePath: resolved, kind: \"internal\" };\n if (existsOnDisk(base)) return { kind: \"external\" };\n }\n\n const isRelative = specifier.startsWith(\".\") || specifier.startsWith(\"/\");\n const isAlias = specifierToBase(specifier, path.dirname(fromPath), context) !== undefined;\n if (isRelative || isAlias) return { kind: \"unresolved\" };\n return { kind: \"external\" };\n}\n\n/**\n * Resolve every import of a file against the discovered file set.\n * Returns internal target paths, external specifiers and unresolved\n * specifiers, in declaration order.\n */\nexport function resolveImports(\n fromPath: string,\n importSpecifiers: string[],\n context: ResolverContext,\n): { internal: string[]; external: string[]; unresolved: string[] } {\n const internal: string[] = [];\n const external: string[] = [];\n const unresolved: string[] = [];\n\n for (const specifier of importSpecifiers) {\n const edge = resolveEdge(specifier, fromPath, context);\n if (edge.kind === \"internal\" && edge.filePath) {\n internal.push(edge.filePath);\n } else if (edge.kind === \"external\") {\n external.push(specifier);\n } else {\n unresolved.push(specifier);\n }\n }\n\n return { internal, external, unresolved };\n}\n","import type { Project } from \"ts-morph\";\nimport { parseMany } from \"../parser/parse.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findCycles } from \"./cycles.js\";\nimport { resolveImports, type ResolverContext } from \"./resolve.js\";\n\n/**\n * Build the in-memory dependency graph.\n *\n * 1. Parse every discovered file (shared ts-morph project).\n * 2. Resolve every import against the file set (aliases, index files, ...).\n * 3. Populate `forward` / `reverse` / `external` and graph stats.\n * 4. Detect cycles (SCC groups).\n *\n * `reverse` is built incrementally here so reverse traversals stay O(n).\n */\nexport function buildGraph(\n project: Project,\n filePaths: string[],\n context: ResolverContext,\n): DependencyGraph {\n return buildGraphFromParsed(parseMany(project, filePaths), context);\n}\n\n/**\n * Build the graph from already-parsed surfaces (used by the incremental\n * parse cache, which reuses cached surfaces for unchanged files). The result\n * is identical to `buildGraph`: resolution, cycles and stats are always\n * recomputed from the parsed imports.\n */\nexport function buildGraphFromParsed(\n parsedFiles: ParsedFile[],\n context: ResolverContext,\n): DependencyGraph {\n const started = Date.now();\n const trace = process.env.RIPPLE_TRACE === \"1\";\n const mark = (label: string): void => {\n if (trace) console.error(`[trace] graph.${label}: ${Date.now() - started}ms`);\n };\n const nodes: DependencyGraph[\"nodes\"] = new Map();\n const forward: DependencyGraph[\"forward\"] = new Map();\n const reverse: DependencyGraph[\"reverse\"] = new Map();\n const external: DependencyGraph[\"external\"] = new Map();\n\n let parsedCount = 0;\n let internalEdges = 0;\n let unresolvedEdges = 0;\n let externalEdges = 0;\n\n for (const parsed of parsedFiles) {\n const key = pathKey(parsed.path, context.rootDir);\n nodes.set(key, { path: parsed.path, parsed });\n if (!parsed.parseError) parsedCount++;\n }\n mark(\"nodes\");\n\n for (const parsed of parsedFiles) {\n const fromKey = pathKey(parsed.path, context.rootDir);\n const targets = new Set<string>();\n\n const {\n internal,\n external: externalSpecifiers,\n unresolved,\n } = resolveImports(\n parsed.path,\n parsed.imports.map((decl) => decl.raw),\n context,\n );\n\n internalEdges += internal.length;\n unresolvedEdges += unresolved.length;\n externalEdges += externalSpecifiers.length;\n\n for (const target of internal) {\n targets.add(pathKey(target, context.rootDir));\n }\n\n if (externalSpecifiers.length > 0) {\n external.set(fromKey, new Set(externalSpecifiers));\n }\n\n forward.set(fromKey, targets);\n for (const target of targets) {\n const importers = reverse.get(target) ?? new Set<string>();\n importers.add(fromKey);\n reverse.set(target, importers);\n }\n }\n\n const graph: DependencyGraph = {\n nodes,\n forward,\n reverse,\n external,\n cycles: [],\n stats: {\n files: parsedFiles.length,\n parsed: parsedCount,\n internalEdges,\n unresolvedEdges,\n externalEdges,\n cycles: 0,\n },\n };\n mark(\"edges\");\n graph.cycles = findCycles(graph);\n graph.stats.cycles = graph.cycles.length;\n mark(\"cycles\");\n return graph;\n}\n\n/**\n * Look up a graph node by absolute path. Returns the node's canonical key\n * and its parsed surface, or `undefined` when the file is not in the graph.\n */\nexport function findNode(\n graph: DependencyGraph,\n filePath: string,\n rootDir: string,\n): { key: string; parsed: ParsedFile } | undefined {\n const key = pathKey(filePath, rootDir);\n const node = graph.nodes.get(key);\n if (!node) return undefined;\n return { key, parsed: node.parsed };\n}\n","{\n \"name\": \"@alimaandev/ripple\",\n \"version\": \"0.7.1\",\n \"description\": \"Dependency impact analysis for TypeScript and JavaScript. Know the blast radius of any change — before you commit.\",\n \"keywords\": [\n \"cli\",\n \"typescript\",\n \"javascript\",\n \"dependency-graph\",\n \"impact-analysis\",\n \"static-analysis\",\n \"refactoring\",\n \"risk\",\n \"cycle-detection\",\n \"ci\"\n ],\n \"license\": \"MIT\",\n \"author\": \"Ali Sher <alishermaan0319@gmail.com>\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/alimaandev/ripple.git\"\n },\n \"homepage\": \"https://github.com/alimaandev/ripple#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/alimaandev/ripple/issues\"\n },\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./package.json\": \"./package.json\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"bin\": {\n \"ripple\": \"dist/bin.js\"\n },\n \"files\": [\n \"dist\",\n \"ripple.schema.json\"\n ],\n \"engines\": {\n \"node\": \">=22\"\n },\n \"packageManager\": \"pnpm@11.20.0\",\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:unit\": \"vitest run tests/unit\",\n \"test:integration\": \"vitest run tests/integration\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"lint\": \"eslint .\",\n \"lint:fix\": \"eslint . --fix\",\n \"format\": \"prettier --write .\",\n \"format:check\": \"prettier --check .\",\n \"metrics\": \"node scripts/metrics.mjs\",\n \"prepublishOnly\": \"pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build\"\n },\n \"dependencies\": {\n \"chalk\": \"^6.0.0\",\n \"commander\": \"^15.0.0\",\n \"fast-glob\": \"^3.3.3\",\n \"figures\": \"^6.1.0\",\n \"jiti\": \"^2.7.0\",\n \"ora\": \"^9.4.1\",\n \"picomatch\": \"^4.0.5\",\n \"treeify\": \"^1.1.0\",\n \"ts-morph\": \"^28.0.0\",\n \"zod\": \"^4.4.3\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^10.0.1\",\n \"@types/node\": \"^26.1.2\",\n \"@types/picomatch\": \"^4.0.3\",\n \"@types/treeify\": \"^1.0.3\",\n \"@vitest/coverage-v8\": \"^4.1.10\",\n \"ajv\": \"^8.20.0\",\n \"esbuild\": \"^0.28.1\",\n \"eslint\": \"^10.8.0\",\n \"eslint-config-prettier\": \"^10.1.8\",\n \"prettier\": \"^3.9.6\",\n \"tsup\": \"^9.0.0\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.66.0\",\n \"vitest\": \"^4.1.10\"\n }\n}\n","import { createHash, randomUUID } from \"node:crypto\";\nimport fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { Project } from \"ts-morph\";\nimport type { RippleConfig } from \"../types/config.js\";\nimport type { ParsedFile } from \"../types/parser.js\";\nimport { parseMany } from \"../parser/parse.js\";\nimport { toPosix } from \"../utils/paths.js\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * Incremental parse cache.\n *\n * Parsing a file with ts-morph (imports, exports, symbols) is the dominant\n * cost of an analysis run. For every discovered file we reuse the previously\n * parsed surface when the file is provably unchanged. Freshness is checked\n * with a cheap mtime+size match first — the steady-state hot path touches\n * neither the file contents nor the hasher — and the cache is only rewritten\n * to disk when something actually changed, so repeated runs are near-free.\n *\n * The cache is keyed by the discovery-affecting config (include/ignore), so\n * changing discovery invalidates it wholesale. The parsed surface is only a\n * function of file content — resolution, cycles and risk are recomputed\n * fresh on every run, so cached runs are byte-identical to cold runs.\n *\n * The cache lives in `<rootDir>/.ripple/cache/` and is written atomically.\n */\n\nexport const CACHE_SCHEMA = 3;\nexport const CACHE_FILE = path.join(\".ripple\", \"cache\", \"parsed-v3.json\");\n\n/**\n * Set `RIPPLE_NO_CACHE=1` to force a cold run (e.g. for benchmarks). The\n * on-disk cache is left untouched.\n */\nexport const cacheEnabled = (): boolean => process.env.RIPPLE_NO_CACHE !== \"1\";\n\n/** One cached file: freshness metadata plus the parsed surface. */\nexport interface ParsedCacheEntry {\n /** Content hash; the source of truth when mtime+size don't match. */\n hash: string;\n /** File size in bytes at cache time (fast freshness check). */\n size: number;\n /** File mtime in ms at cache time (fast freshness check). */\n mtimeMs: number;\n parsed: ParsedFile;\n}\n\ninterface ParsedCacheManifest {\n schema: number;\n configHash: string;\n files: Record<string, ParsedCacheEntry>;\n}\n\n/** sha256 hex of a file's bytes. */\nexport async function contentHash(filePath: string): Promise<string> {\n const bytes = await fs.readFile(filePath);\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\n/**\n * Hash of everything that changes the parsed surface: the cache schema, the\n * Ripple version (a parser change ships with a release), and the\n * discovery-affecting config (include/ignore). Aliases and tsconfig paths do\n * not affect parsing, so they are deliberately excluded: resolution re-runs\n * against cached surfaces.\n */\nexport function configCacheHash(config: RippleConfig): string {\n const stable = {\n parser: `${CACHE_SCHEMA}:${pkg.version}`,\n include: [...config.include].sort(),\n ignore: [...config.ignore].sort(),\n };\n return createHash(\"sha256\").update(JSON.stringify(stable)).digest(\"hex\");\n}\n\n/** Relative POSIX path of a file under the project root. */\nfunction relPosix(rootDir: string, absPath: string): string {\n return toPosix(path.relative(rootDir, absPath));\n}\n\nfunction cachePath(rootDir: string): string {\n return path.join(rootDir, CACHE_FILE);\n}\n\n/** Load the cache manifest; any problem (missing, corrupt, stale) → empty. */\nexport async function loadParsedCache(\n rootDir: string,\n configHash: string,\n): Promise<Map<string, ParsedCacheEntry>> {\n let raw: string;\n try {\n raw = await fs.readFile(cachePath(rootDir), \"utf8\");\n } catch {\n return new Map();\n }\n try {\n const manifest = JSON.parse(raw) as Partial<ParsedCacheManifest>;\n if (manifest.schema !== CACHE_SCHEMA || manifest.configHash !== configHash) {\n return new Map();\n }\n return new Map(Object.entries(manifest.files ?? {}));\n } catch {\n return new Map();\n }\n}\n\n/** Persist the cache atomically (tmp file + rename). Never throws. */\nexport async function saveParsedCache(\n rootDir: string,\n configHash: string,\n entries: Map<string, ParsedCacheEntry>,\n): Promise<void> {\n const manifest: ParsedCacheManifest = {\n schema: CACHE_SCHEMA,\n configHash,\n files: Object.fromEntries(entries),\n };\n const target = cachePath(rootDir);\n const tmp = `${target}.${process.pid}.${randomUUID()}.tmp`;\n try {\n await fs.mkdir(path.dirname(target), { recursive: true });\n await fs.writeFile(tmp, JSON.stringify(manifest), \"utf8\");\n await fs.rename(tmp, target);\n } catch {\n try {\n await fs.rm(tmp, { force: true });\n } catch {\n /* best effort cleanup */\n }\n }\n}\n\nexport interface ParsedCacheStats {\n /** Files served from the cache without re-parsing. */\n hits: number;\n /** Files that had to be re-parsed. */\n misses: number;\n}\n\n/**\n * Load parsed surfaces for every discovered file, parsing only the files\n * whose content changed since the last run. The result is ordered exactly\n * like `filePaths`, so downstream output is identical to a cold run.\n *\n * When nothing changed, the on-disk cache is not rewritten at all — the\n * steady-state hot path is stat + JSON parse + graph rebuild.\n */\nexport async function loadParsedFiles(options: {\n project: Project;\n rootDir: string;\n filePaths: string[];\n config: RippleConfig;\n}): Promise<{ parsedFiles: ParsedFile[]; stats: ParsedCacheStats }> {\n const { project, rootDir, filePaths, config } = options;\n if (!cacheEnabled()) {\n return {\n parsedFiles: parseMany(project, filePaths),\n stats: { hits: 0, misses: filePaths.length },\n };\n }\n const configHash = configCacheHash(config);\n const cached = await loadParsedCache(rootDir, configHash);\n const trace = process.env.RIPPLE_TRACE === \"1\";\n const traceAt = (label: string, from: number): number => {\n if (trace) console.error(`[trace] cache.${label}: ${Date.now() - from}ms`);\n return Date.now();\n };\n let stage = Date.now();\n\n const states = await Promise.all(\n filePaths.map(async (abs) => {\n try {\n const stat = await fs.stat(abs);\n return { abs, rel: relPosix(rootDir, abs), size: stat.size, mtimeMs: stat.mtimeMs };\n } catch {\n return { abs, rel: relPosix(rootDir, abs), size: -1, mtimeMs: -1 };\n }\n }),\n );\n stage = traceAt(\"load-cache\", stage);\n const stateByRel = new Map(states.map((state) => [state.rel, state]));\n const hashByRel = new Map<string, string>();\n const hits = new Map<string, ParsedCacheEntry>();\n const stale: string[] = [];\n const parsed = new Map<string, ParsedFile>();\n /** Set when an entry needs persisting (miss, mtime refresh, or drift). */\n let dirty = false;\n\n for (const state of states) {\n const entry = cached.get(state.rel);\n if (\n entry !== undefined &&\n entry.size === state.size &&\n entry.mtimeMs === state.mtimeMs &&\n state.mtimeMs > 0\n ) {\n hits.set(state.rel, entry);\n parsed.set(state.rel, { ...entry.parsed, path: state.abs });\n continue;\n }\n\n let hash = \"\";\n try {\n hash = await contentHash(state.abs);\n } catch {\n /* unreadable file: hash stays \"\" and the entry is re-parsed */\n }\n hashByRel.set(state.rel, hash);\n\n if (entry !== undefined && entry.hash === hash) {\n if (entry.mtimeMs !== state.mtimeMs || entry.size !== state.size) {\n hits.set(state.rel, { ...entry, size: state.size, mtimeMs: state.mtimeMs });\n dirty = true;\n } else {\n hits.set(state.rel, entry);\n }\n parsed.set(state.rel, { ...entry.parsed, path: state.abs });\n } else {\n stale.push(state.abs);\n dirty = true;\n }\n }\n\n if (stale.length > 0) {\n for (const filePath of stale) {\n project.getSourceFile(filePath)?.forget();\n }\n for (const parsedFile of parseMany(project, stale)) {\n parsed.set(relPosix(rootDir, parsedFile.path), parsedFile);\n }\n }\n traceAt(\"freshness+parse\", stage);\n\n if (dirty) {\n const next = new Map<string, ParsedCacheEntry>(hits);\n for (const stalePath of stale) {\n const rel = relPosix(rootDir, stalePath);\n const parsedFile = parsed.get(rel);\n if (parsedFile === undefined) continue;\n const state = stateByRel.get(rel);\n next.set(rel, {\n hash: hashByRel.get(rel) ?? \"\",\n size: state?.size ?? -1,\n mtimeMs: state?.mtimeMs ?? -1,\n parsed: { ...parsedFile, path: rel },\n });\n }\n await saveParsedCache(rootDir, configHash, next);\n traceAt(\"save\", stage);\n }\n\n const parsedFiles = filePaths.map((abs) => {\n const rel = relPosix(rootDir, abs);\n const parsedFile = parsed.get(rel);\n if (parsedFile === undefined) {\n return {\n path: abs,\n kind: \"ts\" as const,\n imports: [],\n exports: { named: [], hasDefault: false, reExportedFrom: [], reExportedAll: [] },\n symbols: { functions: [], classes: [], interfaces: [], enums: [], typeAliases: [] },\n parseError: \"file disappeared during discovery\",\n };\n }\n return parsedFile;\n });\n\n return {\n parsedFiles,\n stats: { hits: hits.size, misses: stale.length },\n };\n}\n","import path from \"node:path\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { buildGraphFromParsed } from \"../graph/build.js\";\nimport { loadParsedFiles } from \"../cache/parsed.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport { detectEntryPoints } from \"../analyzer/categorize.js\";\nimport { pathKey, displayPath } from \"../utils/paths.js\";\nimport { fileNotFound } from \"../utils/errors.js\";\n\n/**\n * Shared pipeline for commands that need the full dependency graph\n * (analyze, graph, diff, doctor). Loads context, discovers files, parses and\n * resolves everything into one graph, and detects entry points.\n *\n * Parsing is incremental: unchanged files are served from the on-disk cache\n * (`.ripple/cache/`), so repeated runs only re-parse what actually changed.\n * Resolution, cycles and stats are always recomputed from the parsed\n * surfaces, keeping cached output byte-identical to cold runs.\n */\n\nexport interface PipelineResult {\n graph: ReturnType<typeof buildGraphFromParsed>;\n filePaths: string[];\n entryPoints: Set<string>;\n durationMs: number;\n}\n\nexport async function runPipeline(context: ProjectContext): Promise<PipelineResult> {\n const started = Date.now();\n const trace = process.env.RIPPLE_TRACE === \"1\";\n const mark = (label: string): void => {\n if (trace) console.error(`[trace] pipeline.${label}: ${Date.now() - started}ms`);\n };\n const project = createTsProject();\n mark(\"ts-project\");\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n mark(\"discover\");\n const { parsedFiles, stats } = await loadParsedFiles({\n project,\n rootDir: context.rootDir,\n filePaths,\n config: context.config,\n });\n if (trace) console.error(`[trace] cache: ${stats.hits} hits, ${stats.misses} misses`);\n mark(\"parsed\");\n const graph = buildGraphFromParsed(parsedFiles, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n mark(\"graph\");\n const entryPoints = await detectEntryPoints(context.rootDir);\n mark(\"entry-points\");\n return { graph, filePaths, entryPoints, durationMs: Date.now() - started };\n}\n\n/** Resolve the `<file>` argument to an absolute path (cwd-relative). */\nexport function resolveTargetFile(fileArg: string, cwd: string): string {\n return path.isAbsolute(fileArg) ? fileArg : path.join(cwd, fileArg);\n}\n\n/** Verify the target path is part of the graph; throws `RippleError`. */\nexport function requireNode(\n graph: DependencyGraph,\n targetPath: string,\n rootDir: string,\n): { key: string } {\n const key = pathKey(targetPath, rootDir);\n if (!graph.nodes.has(key)) {\n throw fileNotFound(displayPath(targetPath, rootDir));\n }\n return { key };\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildAnalyzeJsonReport, renderAnalyzeReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { buildAnalyzeSarif } from \"../formatter/sarif.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { pathExists } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalyzeOptions, CommandContext } from \"../types/cli.js\";\n\n/**\n * `ripple analyze <file>`\n *\n * Full impact analysis of one file: reverse traversal, risk score, and a\n * terminal or JSON report.\n */\nexport async function analyzeCommand(\n fileArg: string,\n options: AnalyzeOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const targetPath = resolveTargetFile(fileArg, ctx.cwd);\n if (!(await pathExists(targetPath))) {\n throw new RippleError(`File not found: ${fileArg}`, ExitCode.NotFound);\n }\n\n const tracker = createStageTracker(!options.json && !options.sarif);\n tracker.next(\"Loading config\");\n\n const started = Date.now();\n const context = await loadProjectContext(ctx.cwd, options.config);\n\n tracker.next(\"Building dependency graph\");\n const { graph, entryPoints } = await runPipeline(context);\n\n tracker.next(\"Analyzing impact\");\n const result = analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: requireNode(graph, targetPath, context.rootDir).key,\n targetPath,\n durationMs: 0,\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n });\n // One wall-clock measurement for the whole command: config + pipeline +\n // impact analysis. `runPipeline` reports its own subset, but adding the two\n // would count the pipeline twice.\n result.durationMs = Date.now() - started;\n tracker.done();\n\n if (options.json) {\n const report = buildAnalyzeJsonReport(result, ctx.version, ctx.cwd);\n ctx.writer.write(serializeJson(report));\n return ExitCode.Success;\n }\n\n if (options.sarif) {\n ctx.writer.write(\n serializeJson(buildAnalyzeSarif({ result, cwd: ctx.cwd, version: ctx.version })),\n );\n return ExitCode.Success;\n }\n\n renderAnalyzeReport(\n result,\n {\n cwd: ctx.cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n return ExitCode.Success;\n}\n","import type { Cycle } from \"../types/graph.js\";\nimport { displayPath } from \"../utils/paths.js\";\n\n/**\n * Graph export formats: Mermaid (`--format mermaid`), Graphviz DOT\n * (`--format dot`) and a self-contained HTML report (`--format html`).\n *\n * All output is deterministic: nodes and edges are always emitted in sorted\n * order, and no rendering library is required at runtime.\n */\n\nexport interface GraphExportInput {\n /** Absolute file path per graph key. */\n nodes: Map<string, string>;\n /** Directed edges: source key -> target keys. */\n edges: Map<string, Set<string>>;\n cycles: Cycle[];\n cwd: string;\n}\n\nconst escapeDot = (value: string): string => value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n\nconst escapeMermaid = (value: string): string =>\n value.replace(/#/g, \"#35;\").replace(/\"/g, \"#quot;\");\n\nconst escapeHtml = (value: string): string =>\n value\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\")\n .replace(/'/g, \"'\");\n\n/** Node keys sorted by their display path (deterministic iteration order). */\nfunction sortedKeys(input: GraphExportInput): string[] {\n return [...input.nodes.keys()].sort((a, b) => {\n const left = input.nodes.get(a) ?? a;\n const right = input.nodes.get(b) ?? b;\n return left.localeCompare(right);\n });\n}\n\nconst nodeLabel = (input: GraphExportInput, key: string): string =>\n displayPath(input.nodes.get(key) ?? key, input.cwd);\n\n/** Cycle members that exist in the exported node set, sorted by path. */\nfunction cycleMembers(input: GraphExportInput): string[] {\n const present = new Set<string>();\n for (const cycle of input.cycles) {\n for (const member of cycle.members) {\n if (input.nodes.has(member)) present.add(member);\n }\n }\n return [...present].sort((a, b) => nodeLabel(input, a).localeCompare(nodeLabel(input, b)));\n}\n\n/** Sorted edge key pairs that stay inside the node set (sorted by labels). */\nfunction internalEdges(input: GraphExportInput): Array<[string, string]> {\n const pairs: Array<[string, string]> = [];\n for (const [source, targets] of input.edges) {\n if (!input.nodes.has(source)) continue;\n for (const target of targets) {\n if (!input.nodes.has(target)) continue;\n pairs.push([source, target]);\n }\n }\n return pairs.sort((a, b) => {\n const left = nodeLabel(input, a[0]).localeCompare(nodeLabel(input, b[0]));\n return left !== 0 ? left : nodeLabel(input, a[1]).localeCompare(nodeLabel(input, b[1]));\n });\n}\n\n/** Render the graph as a Mermaid flowchart. */\nexport function renderMermaidGraph(input: GraphExportInput): string {\n const keys = sortedKeys(input);\n const idByKey = new Map<string, string>(keys.map((key, index) => [key, `n${index}`]));\n\n const lines: string[] = [\"flowchart LR\"];\n lines.push(\" classDef cycle fill:#4a2525,stroke:#f85149,color:#f0b3b3;\");\n for (const key of keys) {\n lines.push(` ${idByKey.get(key)}[\"${escapeMermaid(nodeLabel(input, key))}\"]`);\n }\n for (const [source, target] of internalEdges(input)) {\n lines.push(` ${idByKey.get(source)} --> ${idByKey.get(target)}`);\n }\n\n const members = cycleMembers(input)\n .map((key) => idByKey.get(key))\n .filter((id): id is string => id !== undefined);\n if (members.length > 0) {\n lines.push(` class ${members.join(\",\")} cycle;`);\n }\n\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Render the graph as Graphviz DOT. */\nexport function renderDotGraph(input: GraphExportInput): string {\n const lines: string[] = [\n \"digraph ripple {\",\n \" rankdir=LR;\",\n ' node [shape=box, style=\"rounded,filled\", fillcolor=\"#161b22\", color=\"#30363d\", fontcolor=\"#e6edf3\"];',\n ' edge [color=\"#8b949e\"];',\n ];\n for (const key of sortedKeys(input)) {\n const label = nodeLabel(input, key);\n lines.push(` \"${escapeDot(label)}\" [label=\"${escapeDot(label)}\"];`);\n }\n for (const [source, target] of internalEdges(input)) {\n lines.push(\n ` \"${escapeDot(nodeLabel(input, source))}\" -> \"${escapeDot(nodeLabel(input, target))}\";`,\n );\n }\n for (const key of cycleMembers(input)) {\n const label = nodeLabel(input, key);\n lines.push(` \"${escapeDot(label)}\" [color=\"#f85149\", penwidth=1.5];`);\n }\n lines.push(\"}\");\n return `${lines.join(\"\\n\")}\\n`;\n}\n\n/** Render the graph as a self-contained HTML report. */\nexport function renderHtmlGraph(input: GraphExportInput): string {\n const keys = sortedKeys(input);\n const edges = internalEdges(input);\n const members = cycleMembers(input);\n\n const cycleLines = input.cycles\n .map((cycle) =>\n cycle.path\n .filter((key) => input.nodes.has(key))\n .map((key) => escapeHtml(nodeLabel(input, key)))\n .join(\" → \"),\n )\n .filter((line) => line.length > 0);\n\n const edgeRows = edges\n .map(\n ([source, target]) =>\n ` <tr><td>${escapeHtml(nodeLabel(input, source))}</td><td>→</td><td>${escapeHtml(nodeLabel(input, target))}</td></tr>`,\n )\n .join(\"\\n\");\n\n const cycleRows =\n cycleLines.length > 0\n ? cycleLines.map((line) => ` <li><code>${line}</code></li>`).join(\"\\n\")\n : \" <li><em>none</em></li>\";\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Ripple — dependency graph</title>\n<style>\n :root { color-scheme: dark; }\n body { margin: 0; padding: 2rem; background: #0d1117; color: #e6edf3;\n font: 15px/1.6 -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif; }\n h1 { font-size: 1.4rem; margin: 0 0 .25rem; }\n h2 { font-size: 1.05rem; margin: 2rem 0 .5rem; color: #79c0ff; }\n code, pre { font-family: SFMono-Regular, Consolas, monospace; }\n pre { background: #161b22; border: 1px solid #30363d; border-radius: 8px;\n padding: 1rem; overflow-x: auto; font-size: .85rem; }\n table { border-collapse: collapse; width: 100%; font-size: .9rem; }\n th, td { text-align: left; padding: .35rem .6rem; border-bottom: 1px solid #21262d; }\n th { color: #8b949e; font-weight: 600; }\n .stats { display: flex; gap: 1.5rem; margin-top: 1rem; }\n .stat b { display: block; font-size: 1.6rem; color: #79c0ff; }\n .stat span { color: #8b949e; font-size: .8rem; }\n .muted { color: #8b949e; }\n a { color: #79c0ff; }\n</style>\n</head>\n<body>\n <h1>Ripple dependency graph</h1>\n <p class=\"muted\">Exported with <code>ripple graph --format html</code> — deterministic and offline.</p>\n <div class=\"stats\">\n <div class=\"stat\"><b>${keys.length}</b><span>files</span></div>\n <div class=\"stat\"><b>${edges.length}</b><span>edges</span></div>\n <div class=\"stat\"><b>${input.cycles.length}</b><span>cycle groups</span></div>\n </div>\n\n <h2>Circular dependencies</h2>\n <ul>${cycleRows}</ul>\n <p class=\"muted\">Cycle members: ${members.map(escapeHtml).join(\", \")}</p>\n\n <h2>Graph</h2>\n <pre><code class=\"language-mermaid\">${escapeHtml(renderMermaidGraph(input)).trimEnd()}</code></pre>\n <p class=\"muted\">Render this diagram with the\n <a href=\"https://mermaid.live\">Mermaid live editor</a> or a tool that\n understands Mermaid (GitHub markdown, docs sites, IDEs).</p>\n\n <h2>Edges (${edges.length})</h2>\n <table>\n <thead><tr><th>Source</th><th></th><th>Target</th></tr></thead>\n <tbody>\n${edgeRows}\n </tbody>\n </table>\n</body>\n</html>\n`;\n}\n","import { loadProjectContext } from \"../config/loader.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { buildGraphJsonReport, renderGraphReport } from \"../output/report.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport {\n renderDotGraph,\n renderHtmlGraph,\n renderMermaidGraph,\n type GraphExportInput,\n} from \"../formatter/graph-export.js\";\nimport { requireNode, resolveTargetFile, runPipeline } from \"./pipeline.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { ExitCode, type GraphFormat } from \"../types/cli.js\";\nimport type { CommandContext, GraphOptions } from \"../types/cli.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\n\n/**\n * `ripple graph [file]`\n *\n * Without a file: project-wide graph stats and circular dependencies.\n * With a file: the file's dependency tree — dependants (what it imports)\n * by default, or dependents (what imports it) with `--reverse`.\n */\n\ninterface WalkNode {\n key: string;\n depth: number;\n}\n\n/** BFS walk over an edge map, depth-capped, sorted by depth then path. */\nfunction walk(\n graph: DependencyGraph,\n startKey: string,\n edges: Map<string, Set<string>>,\n maxDepth: number | undefined,\n cwd: string,\n): string[] {\n const seen = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const entries: Array<{ path: string; depth: number }> = [];\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n if (current.key !== startKey) {\n const nodePath = graph.nodes.get(current.key)?.path ?? current.key;\n entries.push({ path: displayPath(nodePath, cwd), depth: current.depth });\n }\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n for (const candidate of edges.get(current.key) ?? []) {\n if (seen.has(candidate)) continue;\n seen.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n\n return entries\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((entry) => entry.path);\n}\n\n/** Reachable subgraph from `startKey` (forward = what it imports, reverse =\n * what imports it), depth-capped. Used for file-scoped exports. */\nfunction reachableSubgraph(\n graph: DependencyGraph,\n startKey: string,\n reverse: boolean,\n maxDepth: number | undefined,\n cwd: string,\n): GraphExportInput {\n const edges = reverse ? graph.reverse : graph.forward;\n const nodes = new Map<string, string>();\n const visited = new Set<string>([startKey]);\n const queue: WalkNode[] = [{ key: startKey, depth: 0 }];\n const collectedEdges = new Map<string, Set<string>>();\n\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) continue;\n nodes.set(current.key, graph.nodes.get(current.key)?.path ?? current.key);\n if (maxDepth !== undefined && current.depth >= maxDepth) continue;\n\n const targets = new Set<string>();\n for (const candidate of edges.get(current.key) ?? []) {\n targets.add(candidate);\n if (!visited.has(candidate)) {\n visited.add(candidate);\n queue.push({ key: candidate, depth: current.depth + 1 });\n }\n }\n if (targets.size > 0) collectedEdges.set(current.key, targets);\n }\n\n return { nodes, edges: collectedEdges, cycles: graph.cycles, cwd };\n}\n\n/** Render an export format (mermaid/dot/html) for a graph input. */\nfunction writeExport(\n format: Exclude<GraphFormat, \"terminal\" | \"json\">,\n input: GraphExportInput,\n writer: CommandContext[\"writer\"],\n): void {\n const rendered =\n format === \"mermaid\"\n ? renderMermaidGraph(input)\n : format === \"dot\"\n ? renderDotGraph(input)\n : renderHtmlGraph(input);\n writer.write(rendered);\n}\n\nexport async function graphCommand(\n fileArg: string | undefined,\n options: GraphOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const format = options.format ?? (options.json ? \"json\" : \"terminal\");\n const tracker = createStageTracker(format === \"terminal\");\n tracker.next(\"Loading config\");\n const cwd = ctx.cwd;\n\n try {\n const context = await loadProjectContext(cwd, options.config);\n\n tracker.next(\"Building graph\");\n const { graph } = await runPipeline(context);\n\n const input = {\n stats: graph.stats,\n cycles: graph.cycles,\n nodes: graph.nodes,\n cwd,\n };\n\n if (format === \"mermaid\" || format === \"dot\" || format === \"html\") {\n let exportInput: GraphExportInput;\n if (fileArg) {\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n exportInput = reachableSubgraph(graph, key, options.reverse, options.depth, cwd);\n } else {\n const nodes = new Map<string, string>();\n for (const [key, node] of graph.nodes) nodes.set(key, node.path);\n exportInput = { nodes, edges: graph.forward, cycles: graph.cycles, cwd };\n }\n tracker.done();\n writeExport(format, exportInput, ctx.writer);\n return ExitCode.Success;\n }\n\n if (!fileArg) {\n tracker.done();\n if (format === \"json\") {\n const report = buildGraphJsonReport(input, ctx.version);\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n input,\n {\n cwd,\n color: resolveColor(options.color),\n verbose: options.verbose,\n version: ctx.version,\n },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n }\n\n const targetPath = resolveTargetFile(fileArg, cwd);\n const { key } = requireNode(graph, targetPath, context.rootDir);\n const dependants = walk(graph, key, graph.forward, options.depth, cwd);\n const dependents = walk(graph, key, graph.reverse, options.depth, cwd);\n\n tracker.done();\n\n if (format === \"json\") {\n const report = buildGraphJsonReport(\n {\n ...input,\n ...(options.reverse ? { reverse: dependents } : { forward: dependants }),\n },\n ctx.version,\n );\n ctx.writer.write(serializeJson(report));\n } else {\n renderGraphReport(\n {\n ...input,\n forward: options.reverse ? undefined : dependants,\n reverse: options.reverse ? dependents : undefined,\n },\n { cwd, color: resolveColor(options.color), verbose: options.verbose, version: ctx.version },\n ctx.writer,\n );\n }\n return ExitCode.Success;\n } finally {\n tracker.done();\n }\n}\n","import ora from \"ora\";\n\n/**\n * Spinner for long-running commands. Becomes a no-op when the stream is not\n * a TTY (CI, pipes, tests) or when output is JSON — never pollute machines.\n */\nexport function createSpinner(enabled: boolean): { start(text: string): void; stop(): void } {\n if (!enabled || !process.stdout.isTTY) {\n return { start: () => {}, stop: () => {} };\n }\n let instance: ReturnType<typeof ora> | undefined;\n return {\n start(text: string): void {\n instance = ora(text).start();\n },\n stop(): void {\n instance?.stop();\n instance = undefined;\n },\n };\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { loadConfig, loadProjectContext } from \"../config/loader.js\";\nimport { buildGraph } from \"../graph/build.js\";\nimport { createTsProject } from \"../parser/ts-project.js\";\nimport { discoverSourceFiles } from \"../scanner/discover.js\";\nimport { createSpinner } from \"../cli/spinner.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { brandHeader } from \"../ui/brand.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim, type TextStyle } from \"../formatter/text.js\";\nimport { pathKey } from \"../utils/paths.js\";\nimport { findPackageJson } from \"../utils/fs.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, DoctorOptions } from \"../types/cli.js\";\n\n/**\n * `ripple doctor`\n *\n * Environment and project health check. Each check is independent; a failed\n * check is reported but does not abort the run. Exits non-zero when any\n * check fails.\n */\n\ninterface CheckResult {\n label: string;\n state: \"ok\" | \"warn\" | \"fail\";\n detail?: string;\n}\n\nexport async function doctorCommand(\n options: DoctorOptions,\n ctx: CommandContext,\n): Promise<ExitCode> {\n const color = resolveColor(options.color);\n const style: TextStyle = { color };\n const spinner = createSpinner(color);\n spinner.start(\"Running diagnostics…\");\n const results: CheckResult[] = [];\n const check = (label: string, state: \"ok\" | \"warn\" | \"fail\", detail?: string): void => {\n results.push({ label, state, detail });\n };\n\n try {\n check(\n \"Node.js runtime\",\n \"ok\",\n options.verbose\n ? `${process.version} · ${process.platform}/${process.arch}`\n : process.version,\n );\n\n const packageJson = await findPackageJson(ctx.cwd);\n if (packageJson) {\n check(\"package.json\", \"ok\", path.relative(ctx.cwd, packageJson));\n } else {\n check(\"package.json\", \"fail\", \"not found in this directory or its parents\");\n }\n\n let context;\n try {\n const loaded = await loadConfig(ctx.cwd, options.config);\n check(\n \"ripple config\",\n \"ok\",\n loaded.configPath ? path.relative(ctx.cwd, loaded.configPath) : \"defaults\",\n );\n context = await loadProjectContext(ctx.cwd, options.config);\n } catch (error) {\n check(\"ripple config\", \"fail\", error instanceof Error ? error.message : String(error));\n renderResults(results, ctx, color);\n return ExitCode.InvalidConfig;\n }\n\n if (context.tsconfig) {\n check(\"tsconfig.json\", \"ok\", path.relative(ctx.cwd, context.tsconfig.path));\n } else {\n check(\"tsconfig.json\", \"warn\", \"not found — path aliases unavailable\");\n }\n\n const project = createTsProject();\n const filePaths = await discoverSourceFiles({\n rootDir: context.rootDir,\n include: context.config.include,\n ignore: context.config.ignore,\n });\n if (filePaths.length > 0) {\n check(\"source files\", \"ok\", `${filePaths.length} discovered`);\n } else {\n check(\"source files\", \"fail\", \"no source files matched the include globs\");\n }\n\n if (Object.keys(context.aliases).length > 0) {\n check(\"path aliases\", \"ok\", `${Object.keys(context.aliases).length} configured`);\n }\n\n const graph = buildGraph(project, filePaths, {\n rootDir: context.rootDir,\n aliases: context.aliases,\n fileKeys: new Set(filePaths.map((p) => pathKey(p, context.rootDir))),\n });\n\n const { stats } = graph;\n const parseRate = stats.files === 0 ? 1 : stats.parsed / stats.files;\n if (parseRate >= 0.99) {\n check(\"parse\", \"ok\", \"all files parsed cleanly\");\n } else if (parseRate >= 0.9) {\n check(\"parse\", \"warn\", `${stats.files - stats.parsed} file(s) failed to parse`);\n } else {\n check(\"parse\", \"fail\", `${stats.files - stats.parsed} file(s) failed to parse`);\n }\n\n if (stats.unresolvedEdges === 0) {\n check(\"import resolution\", \"ok\", \"all internal imports resolved\");\n } else {\n check(\"import resolution\", \"warn\", `${stats.unresolvedEdges} unresolved import(s)`);\n }\n\n if (stats.cycles === 0) {\n check(\"circular dependencies\", \"ok\", \"none found\");\n } else {\n check(\"circular dependencies\", \"warn\", `${stats.cycles} cycle group(s)`);\n }\n\n if (options.verbose) {\n check(\n \"graph\",\n \"ok\",\n `${stats.files} files · ${stats.internalEdges} internal edges · ${stats.externalEdges} external · ${stats.unresolvedEdges} unresolved`,\n );\n }\n } finally {\n spinner.stop();\n }\n\n renderResults(results, ctx, color);\n const failed = results.some((check) => check.state === \"fail\");\n const warned = results.some((check) => check.state === \"warn\");\n const verdict = failed\n ? { icon: icon(\"cross\"), text: \"Diagnoses found problems.\", color: chalk.red }\n : warned\n ? { icon: icon(\"warning\"), text: \"Diagnoses passed with warnings.\", color: chalk.yellow }\n : { icon: icon(\"tick\"), text: \"All checks passed.\", color: chalk.green };\n const verdictIcon = style.color ? verdict.color(verdict.icon) : verdict.icon;\n ctx.writer.writeLine(`${verdictIcon} ${verdict.text}`);\n return failed ? ExitCode.Failure : ExitCode.Success;\n}\n\nfunction renderResults(results: CheckResult[], ctx: CommandContext, color: boolean): void {\n const style: TextStyle = { color };\n ctx.writer.writeLine(brandHeader({ label: \"project health check\", version: ctx.version, style }));\n ctx.writer.writeLine();\n\n const width = Math.max(...results.map((check) => check.label.length));\n for (const check of results) {\n const stateIcon =\n check.state === \"ok\"\n ? icon(\"tick\")\n : check.state === \"warn\"\n ? icon(\"warning\")\n : icon(\"cross\");\n const colored =\n check.state === \"ok\" ? chalk.green : check.state === \"warn\" ? chalk.yellow : chalk.red;\n const mark = style.color ? colored(stateIcon) : stateIcon;\n const detail = check.detail ? ` ${dim(check.detail, style)}` : \"\";\n ctx.writer.writeLine(`${mark} ${check.label.padEnd(width)}${detail}`);\n }\n ctx.writer.writeLine();\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\nimport chalk from \"chalk\";\nimport { DEFAULT_CONFIG } from \"../config/defaults.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { icon } from \"../ui/icons.js\";\nimport { dim } from \"../formatter/text.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext, InitOptions } from \"../types/cli.js\";\n\n/**\n * `ripple init`\n *\n * Writes a config file next to the current directory. Defaults to a minimal\n * `ripple.config.json` that references the published JSON Schema for editor\n * autocomplete. `--full` dumps every built-in default; `--ts` writes a typed\n * `ripple.config.ts`. Refuses to overwrite an existing file unless `--force`.\n */\n\nconst SCHEMA_REF = \"https://raw.githubusercontent.com/alimaandev/ripple/main/ripple.schema.json\";\n\nfunction jsonPayload(full: boolean): Record<string, unknown> {\n const payload = full ? { ...DEFAULT_CONFIG } : { include: DEFAULT_CONFIG.include };\n return { ...payload, $schema: SCHEMA_REF };\n}\n\n/** Render a plain value as a TypeScript object/array literal. */\nfunction tsValue(value: unknown, indent: string): string {\n if (value === undefined) return \"undefined\";\n if (Array.isArray(value)) {\n if (value.length === 0) return \"[]\";\n const items = value.map((item) => tsValue(item, `${indent} `)).join(`,\\n${indent} `);\n return `[\\n${indent} ${items}\\n${indent}]`;\n }\n if (typeof value === \"object\" && value !== null) {\n const entries = Object.entries(value as Record<string, unknown>).filter(\n ([, entry]) => entry !== undefined,\n );\n if (entries.length === 0) return \"{}\";\n const items = entries\n .map(([key, entry]) => `${key}: ${tsValue(entry, `${indent} `)}`)\n .join(`,\\n${indent} `);\n return `{\\n${indent} ${items}\\n${indent}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction tsPayload(full: boolean): string {\n if (!full) {\n return `import type { RippleConfig } from \"@alimaandev/ripple\";\n\nconst config: RippleConfig = {\n include: ${JSON.stringify(DEFAULT_CONFIG.include)},\n};\n\nexport default config;\n`;\n }\n const body = tsValue({ ...DEFAULT_CONFIG }, \" \");\n return `import type { RippleConfig } from \"@alimaandev/ripple\";\n\nconst config: RippleConfig = ${body};\n\nexport default config;\n`;\n}\n\nexport async function initCommand(options: InitOptions, ctx: CommandContext): Promise<ExitCode> {\n const style = { color: resolveColor(options.color) };\n const fileName = options.ts ? \"ripple.config.ts\" : \"ripple.config.json\";\n const target = path.join(ctx.cwd, fileName);\n\n try {\n await fs.access(target);\n if (!options.force) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(`${mark} ${fileName} already exists. Pass --force to overwrite it.`);\n return ExitCode.Failure;\n }\n } catch {\n /* file does not exist — safe to create */\n }\n\n const content = options.ts\n ? tsPayload(Boolean(options.full))\n : `${JSON.stringify(jsonPayload(Boolean(options.full)), null, 2)}\\n`;\n\n try {\n await fs.writeFile(target, content, \"utf8\");\n const mark = style.color ? chalk.green(icon(\"tick\")) : icon(\"tick\");\n ctx.writer.writeLine(`${mark} Wrote ${fileName}`);\n ctx.writer.writeLine(\n ` ${dim(\"Edit it to tune include globs, aliases and risk weights.\", style)}`,\n );\n return ExitCode.Success;\n } catch (error) {\n const mark = style.color ? chalk.red(icon(\"cross\")) : icon(\"cross\");\n ctx.writer.writeLine(\n `${mark} Could not write ${fileName}: ${error instanceof Error ? error.message : String(error)}`,\n );\n return ExitCode.Failure;\n }\n}\n","import { execFileSync } from \"node:child_process\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { realPath } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\n\n/**\n * Git integration for `ripple diff`. All commands run from the repository\n * root and stay read-only — never modifies the working tree.\n *\n * Git reports tracked and untracked paths relative to the *repository* root,\n * not to the process working directory. `changedFiles` therefore resolves the\n * root once and returns it alongside the change set, so callers can turn every\n * path into an absolute path correctly even when Ripple runs from a package\n * subdirectory.\n */\n\nexport interface ChangedFiles {\n /** Human-readable base label, e.g. `origin/main`. */\n baseLabel: string;\n /** Absolute path of the repository root (`git rev-parse --show-toplevel`). */\n repoRoot: string;\n /** Repo-relative POSIX paths of changed files (tracked diffs + untracked). */\n files: string[];\n}\n\n/**\n * Base refs tried in order when neither `--base` nor `diff.base` is set.\n * Remote-tracking refs come before local branches: a local `main` often\n * points at the current branch tip, which would silently narrow the diff to\n * uncommitted edits.\n */\nconst DEFAULT_BASES = [\"origin/HEAD\", \"origin/main\", \"origin/master\", \"main\", \"master\"] as const;\n\nfunction gitRaw(args: string[], cwd: string): string {\n return execFileSync(\"git\", args, {\n cwd,\n encoding: \"utf8\",\n stdio: [\"ignore\", \"pipe\", \"pipe\"],\n });\n}\n\n/** Git output minus the trailing newline; leading spaces are path content. */\nfunction chomp(text: string): string {\n return text.replace(/\\r?\\n$/, \"\");\n}\n\nfunction git(args: string[], cwd: string): string {\n return gitRaw(args, cwd).trim();\n}\n\n/** Resolve the working tree root for `cwd`. */\nexport function repoRootFor(cwd: string): string {\n try {\n const root = chomp(gitRaw([\"rev-parse\", \"--show-toplevel\"], cwd));\n if (root) return realPath(root, cwd);\n } catch {\n /* fall through to the shared error below */\n }\n throw new RippleError(\n `Not a git repository: ${cwd}`,\n ExitCode.NotFound,\n \"ripple diff needs a git repository. Run it from inside one, or pass --base only in a repo.\",\n );\n}\n\nfunction refExists(ref: string, cwd: string): boolean {\n try {\n const out = git([\"rev-parse\", \"--verify\", \"--quiet\", `${ref}^{commit}`], cwd);\n return out.length > 0;\n } catch {\n return false;\n }\n}\n\nfunction sameCommit(left: string, right: string, cwd: string): boolean {\n try {\n return (\n git([\"rev-parse\", `${left}^{commit}`], cwd) === git([\"rev-parse\", `${right}^{commit}`], cwd)\n );\n } catch {\n return false;\n }\n}\n\nfunction hasUncommittedChanges(cwd: string): boolean {\n try {\n return git([\"status\", \"--porcelain\", \"--untracked-files=normal\"], cwd).length > 0;\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve the base ref: the requested one, a GitHub PR base when available,\n * or the first default that exists and is a meaningful comparison point.\n *\n * A default ref that points at HEAD cannot reveal committed branch work. It\n * is still returned when no better ref exists — the diff then covers only\n * uncommitted edits — but the warning makes sure a green gate is never\n * mistaken for \"every change on this branch passed\".\n */\nexport function resolveBase(cwd: string, requested?: string): string {\n if (requested) {\n if (!refExists(requested, cwd)) {\n throw new RippleError(`Git ref not found: ${requested}`, ExitCode.NotFound);\n }\n return requested;\n }\n\n const candidates: string[] = [];\n const githubBase = process.env.GITHUB_BASE_REF?.trim();\n if (githubBase) {\n candidates.push(`origin/${githubBase}`, githubBase);\n }\n candidates.push(...DEFAULT_BASES);\n\n const seen = new Set<string>();\n let headCandidate: string | undefined;\n for (const candidate of candidates) {\n if (seen.has(candidate)) continue;\n seen.add(candidate);\n if (!refExists(candidate, cwd)) continue;\n if (sameCommit(candidate, \"HEAD\", cwd)) {\n headCandidate ??= candidate;\n continue;\n }\n return candidate;\n }\n\n if (headCandidate !== undefined) {\n const detail = hasUncommittedChanges(cwd)\n ? \"Only uncommitted changes are analyzed\"\n : \"The working tree is clean, so the change set is empty\";\n process.stderr.write(\n `ripple: warning: base ref \"${headCandidate}\" resolves to HEAD. ` +\n `${detail} — pass --base <ref> to compare against a branch.\\n`,\n );\n return headCandidate;\n }\n\n if (refExists(\"HEAD~1\", cwd)) {\n process.stderr.write(\n \"ripple: warning: no branch base found; falling back to HEAD~1. \" +\n \"Only the last commit will be analyzed — pass --base <ref> for a full change set.\\n\",\n );\n return \"HEAD~1\";\n }\n\n throw new RippleError(\n `No git base ref found (tried ${candidates.join(\", \")}). Pass --base <ref> explicitly.`,\n ExitCode.NotFound,\n );\n}\n\n/** Split NUL-delimited `git -z` output into exact paths. */\nfunction nulPaths(output: string): string[] {\n return output.split(\"\\0\").filter((entry) => entry.length > 0);\n}\n\n/**\n * Ripple's own cache lives inside the project and may not be gitignored.\n * Treating it as a changed file would make the second `ripple diff` in a row\n * see a different change set than the first, so any `.ripple/` directory —\n * at the repository root or inside a package — is excluded.\n */\nfunction isRippleArtifact(repoPath: string): boolean {\n return repoPath.replace(/\\\\/g, \"/\").split(\"/\").includes(\".ripple\");\n}\n\n/**\n * Compute the changed file set: everything that differs from the base\n * (merged commits plus uncommitted edits) and any untracked files.\n *\n * All git commands run from the repository root and use `-z` so paths with\n * spaces, quotes or non-ASCII characters survive intact.\n */\nexport function changedFiles(cwd: string, base?: string): ChangedFiles {\n const repoRoot = repoRootFor(cwd);\n const baseLabel = resolveBase(repoRoot, base);\n let baseCommit = baseLabel;\n try {\n // Criss-cross merges can produce several merge bases; any one is a valid\n // left-hand side for the change set.\n const mergeBase = git([\"merge-base\", baseLabel, \"HEAD\"], repoRoot).split(/\\r?\\n/)[0]?.trim();\n if (mergeBase) baseCommit = mergeBase;\n } catch {\n /* base may be HEAD or a single commit — use it directly */\n }\n\n const files = new Set<string>();\n const tracked = nulPaths(\n gitRaw([\"diff\", \"--name-only\", \"-z\", \"--diff-filter=ACMRT\", baseCommit, \"--\"], repoRoot),\n );\n for (const file of tracked) {\n if (!isRippleArtifact(file)) files.add(file);\n }\n const untracked = nulPaths(\n gitRaw([\"ls-files\", \"--others\", \"--exclude-standard\", \"-z\"], repoRoot),\n );\n for (const file of untracked) {\n if (!isRippleArtifact(file)) files.add(file);\n }\n\n return { baseLabel, repoRoot, files: [...files].sort() };\n}\n","/**\n * GitHub Actions workflow-command output for `ripple diff --format github`.\n *\n * One line per changed source file (`::error` when it blocks the gate,\n * `::warning` otherwise), plus a `::notice` verdict line. GitHub annotates\n * each `file=` directly on the PR's Files tab, and the exit code still\n * carries the gate verdict for CI.\n *\n * Escaping follows the workflow-command rules: properties escape `%`, `\\r`,\n * `\\n`, `:`, `,`; messages escape `%`, `\\r`, `\\n`.\n */\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DiffCounts } from \"../commands/diff.js\";\nimport type { GateLevel } from \"../types/output.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\n\nexport type AnnotationLevel = \"error\" | \"warning\" | \"notice\";\n\nexport interface AnnotationLine {\n level: AnnotationLevel;\n /** Absolute or repo-relative path shown in the annotation. */\n file?: string;\n title: string;\n message: string;\n}\n\nconst LEVEL_INDEX: Record<RiskLevel, number> = { LOW: 0, MEDIUM: 1, HIGH: 2, CRITICAL: 3 };\n\nconst GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nfunction escapeProperty(value: string): string {\n return value\n .replace(/%/g, \"%25\")\n .replace(/\\r/g, \"%0D\")\n .replace(/\\n/g, \"%0A\")\n .replace(/:/g, \"%3A\")\n .replace(/,/g, \"%2C\");\n}\n\nfunction escapeMessage(value: string): string {\n return value.replace(/%/g, \"%25\").replace(/\\r/g, \"%0D\").replace(/\\n/g, \"%0A\");\n}\n\n/** Render one line of workflow-command output. */\nexport function renderAnnotation(annotation: AnnotationLine): string {\n const props = annotation.file\n ? ` file=${escapeProperty(annotation.file)},title=${escapeProperty(annotation.title)}`\n : ` title=${escapeProperty(annotation.title)}`;\n return `::${annotation.level}${props}::${escapeMessage(annotation.message)}`;\n}\n\n/** Per-file annotations for analyzed results, errors first when blocking. */\nexport function buildFileAnnotations(\n files: Array<{ file: string; result: AnalysisResult }>,\n gate: GateLevel,\n): AnnotationLine[] {\n return files.map(({ file, result }) => {\n const blocked = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n return {\n level: blocked ? \"error\" : \"warning\",\n file,\n title: `Ripple ${result.risk.level}`,\n message: `${result.risk.level} risk (score ${result.risk.score}) — ${result.summary.affectedFiles} affected ${\n result.summary.affectedFiles === 1 ? \"file\" : \"files\"\n }`,\n };\n });\n}\n\n/** One-line gate verdict for the workflow log. */\nexport function buildGateAnnotation(\n blocked: boolean,\n gate: GateLevel,\n counts: DiffCounts,\n): AnnotationLine {\n const gateIndex = GATE_INDEX[gate];\n const parts: string[] = [];\n if (LEVEL_INDEX.CRITICAL >= gateIndex && counts.critical > 0)\n parts.push(`${counts.critical} CRITICAL`);\n if (LEVEL_INDEX.HIGH >= gateIndex && counts.high > 0) parts.push(`${counts.high} HIGH`);\n if (LEVEL_INDEX.MEDIUM >= gateIndex && counts.medium > 0) parts.push(`${counts.medium} MEDIUM`);\n const atGate = parts.length > 0 ? parts.join(\" · \") : \"none\";\n return {\n level: \"notice\",\n title: `Ripple diff ${gate} gate`,\n message: blocked\n ? `Gate blocked: ${atGate} at or above ${gate}`\n : `Gate passed: nothing at ${gate} or above`,\n };\n}\n","import path from \"node:path\";\nimport picomatch from \"picomatch\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { GateLevel } from \"../types/output.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { RiskLevel } from \"../types/risk.js\";\nimport type { ChangedFiles } from \"../git/changed.js\";\nimport { pathKey, realPath, toPosix } from \"../utils/paths.js\";\n\n/**\n * Shared diff-gate evaluation.\n *\n * Both `ripple diff` and the MCP `gate_status` tool must answer the same\n * question the same way: which changed files are in the graph, how risky are\n * they, which are allowlisted, and does the change set block. Keeping the\n * logic here prevents the two surfaces from drifting.\n */\n\nexport interface DiffCounts {\n low: number;\n medium: number;\n high: number;\n critical: number;\n}\n\nexport const LEVEL_INDEX: Record<RiskLevel, number> = {\n LOW: 0,\n MEDIUM: 1,\n HIGH: 2,\n CRITICAL: 3,\n};\n\nexport const GATE_INDEX: Record<GateLevel, number> = { medium: 1, high: 2, critical: 3 };\n\nexport const VERDICT_NOTE: Record<GateLevel, string> = {\n medium: \"no MEDIUM or worse\",\n high: \"no HIGH or CRITICAL\",\n critical: \"no CRITICAL\",\n};\n\nexport function countLevels(results: AnalysisResult[]): DiffCounts {\n const counts: DiffCounts = { low: 0, medium: 0, high: 0, critical: 0 };\n for (const result of results) {\n counts[result.risk.level.toLowerCase() as keyof DiffCounts] += 1;\n }\n return counts;\n}\n\n/**\n * Whether a project-relative path matches any of the diff allowlist globs.\n * Patterns and paths are normalized to forward slashes so the same config\n * works on Windows and POSIX.\n */\nexport function isAllowedByDiffAllowlist(relPath: string, patterns: string[]): boolean {\n if (patterns.length === 0) return false;\n const rel = toPosix(relPath);\n const matcher = picomatch(patterns.map(toPosix), { dot: true });\n return matcher(rel);\n}\n\n/** `2 HIGH · 1 CRITICAL` — counts for levels at or above the gate. */\nexport function riskySummary(counts: DiffCounts, gate: GateLevel): string {\n const gateIndex = GATE_INDEX[gate];\n const parts: string[] = [];\n if (LEVEL_INDEX.CRITICAL >= gateIndex && counts.critical > 0)\n parts.push(`${counts.critical} CRITICAL`);\n if (LEVEL_INDEX.HIGH >= gateIndex && counts.high > 0) parts.push(`${counts.high} HIGH`);\n if (LEVEL_INDEX.MEDIUM >= gateIndex && counts.medium > 0) parts.push(`${counts.medium} MEDIUM`);\n if (LEVEL_INDEX.LOW >= gateIndex && counts.low > 0) parts.push(`${counts.low} LOW`);\n return parts.length > 0 ? parts.join(\" · \") : \"none\";\n}\n\n/** POSIX path relative to the project root (`.` for the root itself). */\nexport function projectRelativePath(absPath: string, rootDir: string): string {\n const rel = toPosix(path.relative(realPath(rootDir, rootDir), realPath(absPath, rootDir)));\n return rel === \"\" ? \".\" : rel;\n}\n\n/** One changed file, resolved against the repository and project roots. */\nexport interface EvaluatedChange {\n /** Project-root-relative POSIX path; used in reports and allowlist matching. */\n file: string;\n /** Repository-root-relative POSIX path exactly as git reported it. */\n repoPath: string;\n /** Absolute path on disk. */\n absPath: string;\n /** Analysis result, or `undefined` when the file is outside the graph. */\n result?: AnalysisResult;\n /** Whether the file matched the diff allowlist. */\n allowed: boolean;\n}\n\nexport type AnalyzedChange = EvaluatedChange & { result: AnalysisResult };\n\nexport interface GateEvaluation {\n /** Every changed file, in the order git reported it. */\n changes: EvaluatedChange[];\n /** Analyzed files, riskiest first. */\n entries: AnalyzedChange[];\n /** Changed files that are not part of the analyzed source graph. */\n skipped: EvaluatedChange[];\n counts: DiffCounts;\n allowedCount: number;\n blocked: boolean;\n gate: GateLevel;\n}\n\nexport interface GateEvaluationInput {\n context: ProjectContext;\n graph: DependencyGraph;\n entryPoints: Set<string>;\n changed: ChangedFiles;\n gate: GateLevel;\n /** CLI `--allow` globs plus `diff.allow`; project-root-relative. */\n allowPatterns: string[];\n maxDepth?: number;\n}\n\n/**\n * Resolve and analyze every changed file, then decide whether the gate\n * blocks. Paths are always resolved against `changed.repoRoot`, never the\n * process working directory, so monorepo subdirectory runs are correct.\n */\nexport function evaluateGate(input: GateEvaluationInput): GateEvaluation {\n const { context, graph, entryPoints, changed, gate, allowPatterns, maxDepth } = input;\n const changes: EvaluatedChange[] = [];\n const seen = new Set<string>();\n\n for (const repoPath of changed.files) {\n const gitPath = path.resolve(changed.repoRoot, repoPath);\n const file = projectRelativePath(gitPath, context.rootDir);\n // Re-anchor under the project root so graph keys and display paths use the\n // same path form as discovery (Windows may hand git a long path and this\n // process a short-name cwd).\n const absPath = file === \".\" ? context.rootDir : path.resolve(context.rootDir, file);\n const key = pathKey(absPath, context.rootDir);\n if (seen.has(key)) continue;\n seen.add(key);\n\n if (!graph.nodes.has(key)) {\n changes.push({ file, repoPath, absPath, allowed: false });\n continue;\n }\n\n const result = analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: key,\n targetPath: absPath,\n durationMs: 0,\n ...(maxDepth !== undefined ? { maxDepth } : {}),\n });\n changes.push({\n file,\n repoPath,\n absPath,\n result,\n allowed: isAllowedByDiffAllowlist(file, allowPatterns),\n });\n }\n\n const entries = changes\n .filter((change): change is AnalyzedChange => change.result !== undefined)\n .sort((a, b) => b.result.risk.score - a.result.risk.score || a.file.localeCompare(b.file));\n const skipped = changes.filter((change) => change.result === undefined);\n const gateResults = entries.filter((entry) => !entry.allowed).map((entry) => entry.result);\n const counts = countLevels(gateResults);\n const allowedCount = entries.filter((entry) => entry.allowed).length;\n const blocked = gateResults.some((result) => LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate]);\n\n return { changes, entries, skipped, counts, allowedCount, blocked, gate };\n}\n","import chalk from \"chalk\";\nimport { loadProjectContext } from \"../config/loader.js\";\nimport { createStageTracker } from \"../ui/progress.js\";\nimport { resolveColor } from \"../ui/color.js\";\nimport { changedFiles } from \"../git/changed.js\";\nimport { brandHeader, sectionHeader } from \"../ui/brand.js\";\nimport { riskGauge } from \"../ui/gauge.js\";\nimport { icon } from \"../ui/icons.js\";\nimport {\n dim,\n formatDuration,\n pluralize,\n riskBadge,\n strong,\n type TextStyle,\n} from \"../formatter/text.js\";\nimport { serializeJson } from \"../formatter/json.js\";\nimport { buildDiffSarif } from \"../formatter/sarif.js\";\nimport {\n buildFileAnnotations,\n buildGateAnnotation,\n renderAnnotation,\n} from \"../formatter/annotations.js\";\nimport {\n evaluateGate,\n GATE_INDEX,\n LEVEL_INDEX,\n riskySummary,\n VERDICT_NOTE,\n type DiffCounts,\n} from \"./gate.js\";\nimport { runPipeline } from \"./pipeline.js\";\nimport { displayPath } from \"../utils/paths.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport type { CommandContext, DiffOptions, OutputWriter } from \"../types/cli.js\";\nimport type { DiffFileReport, DiffJsonReport, GateLevel } from \"../types/output.js\";\n\nexport {\n countLevels,\n isAllowedByDiffAllowlist,\n LEVEL_INDEX,\n GATE_INDEX,\n riskySummary,\n VERDICT_NOTE,\n type DiffCounts,\n} from \"./gate.js\";\n\n/**\n * `ripple diff`\n *\n * Analyzes every changed file since a base git ref and gates the change set:\n * if any changed source file reaches the gate level (HIGH by default), the\n * command exits 1 so CI can block a merge; otherwise it exits 0.\n */\n\nexport async function diffCommand(options: DiffOptions, ctx: CommandContext): Promise<ExitCode> {\n const format = options.format ?? (options.json ? \"json\" : \"terminal\");\n const style: TextStyle = { color: resolveColor(options.color) };\n const tracker = createStageTracker(format === \"terminal\");\n const started = Date.now();\n\n const context = await loadProjectContext(ctx.cwd, options.config);\n const gate = options.gate ?? context.config.diff.gate ?? \"high\";\n const base = options.base ?? context.config.diff.base;\n\n tracker.next(\"Resolving git changes\");\n const changed = changedFiles(ctx.cwd, base);\n\n tracker.next(\"Analyzing changed files\");\n const { graph, entryPoints } = await runPipeline(context);\n const allowPatterns = [...(options.allow ?? []), ...(context.config.diff.allow ?? [])];\n const evaluation = evaluateGate({\n context,\n graph,\n entryPoints,\n changed,\n gate,\n allowPatterns,\n ...(options.depth !== undefined ? { maxDepth: options.depth } : {}),\n });\n tracker.done();\n\n const { changes, entries, skipped, counts, allowedCount, blocked } = evaluation;\n const byRel = new Map<string, AnalysisResult>(entries.map((entry) => [entry.file, entry.result]));\n const allowedByRel = new Map<string, boolean>(\n entries.map((entry) => [entry.file, entry.allowed]),\n );\n const changedNames = changes.map((change) => change.file);\n const durationMs = Date.now() - started;\n\n if (format === \"json\") {\n ctx.writer.write(\n serializeJson(\n buildDiffJsonReport(\n changed.baseLabel,\n changedNames,\n byRel,\n allowedByRel,\n gate,\n blocked,\n counts,\n allowedCount,\n durationMs,\n ctx.version,\n ),\n ),\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n if (format === \"sarif\") {\n ctx.writer.write(\n serializeJson(\n buildDiffSarif({\n baseLabel: changed.baseLabel,\n entries: entries.map((entry) => ({\n rel: entry.file,\n repoRel: entry.repoPath,\n result: entry.result,\n allowed: entry.allowed,\n })),\n gate,\n counts,\n blocked,\n durationMs,\n version: ctx.version,\n }),\n ),\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n if (format === \"github\") {\n const annotations = [\n ...buildFileAnnotations(\n entries\n .filter((entry) => !entry.allowed)\n .map((entry) => ({ file: entry.repoPath, result: entry.result })),\n gate,\n ),\n buildGateAnnotation(blocked, gate, counts),\n ];\n ctx.writer.write(`${annotations.map(renderAnnotation).join(\"\\n\")}\\n`);\n return blocked ? ExitCode.Failure : ExitCode.Success;\n }\n\n renderDiffReport(\n {\n cwd: ctx.cwd,\n baseLabel: changed.baseLabel,\n files: changedNames,\n entries: entries.map((entry) => ({\n rel: entry.file,\n result: entry.result,\n allowed: entry.allowed,\n })),\n skipped: skipped.map((change) => change.file),\n counts,\n allowedCount,\n gate,\n blocked,\n durationMs,\n style,\n verbose: options.verbose,\n },\n ctx.writer,\n );\n return blocked ? ExitCode.Failure : ExitCode.Success;\n}\n\nexport interface DiffRenderInput {\n /** Working directory used to relativize displayed paths. */\n cwd: string;\n baseLabel: string;\n files: string[];\n entries: Array<{ rel: string; result: AnalysisResult; allowed: boolean }>;\n skipped: string[];\n counts: DiffCounts;\n allowedCount: number;\n gate: GateLevel;\n blocked: boolean;\n durationMs: number;\n style: TextStyle;\n /** Print per-file impact detail under each risk row. */\n verbose?: boolean;\n}\n\nexport function renderDiffReport(input: DiffRenderInput, writer: OutputWriter): void {\n const {\n cwd,\n baseLabel,\n files,\n entries,\n skipped,\n counts,\n allowedCount,\n gate,\n blocked,\n durationMs,\n style,\n verbose = false,\n } = input;\n\n writer.writeLine(brandHeader({ label: `diff vs ${baseLabel}`, style }));\n writer.writeLine();\n\n const rows: Array<[string, string]> = [\n [\"Changed\", pluralize(files.length, \"file\")],\n [\"Source\", pluralize(entries.length, \"file\")],\n [\"Allowed\", pluralize(allowedCount, \"file\")],\n [\"Duration\", dim(formatDuration(durationMs), style)],\n ];\n const width = Math.max(...rows.map(([key]) => key.length));\n for (const [key, value] of rows) {\n writer.writeLine(`${key.padEnd(width)} ${value}`);\n }\n writer.writeLine();\n\n const mark = blocked ? icon(\"cross\") : icon(\"tick\");\n const color = blocked ? chalk.red : chalk.green;\n const markText = style.color ? color(mark) : mark;\n const verdict = blocked ? \"Gate blocked\" : \"Gate passed\";\n const verdictText = style.color ? color(strong(verdict, style)) : verdict;\n writer.writeLine(\n `${markText} ${verdictText} — ${riskySummary(counts, gate)} ${dim(`(${VERDICT_NOTE[gate]})`, style)}`,\n );\n writer.writeLine();\n\n writer.writeLine(sectionHeader(`Risk analysis (${entries.length} files)`, style));\n for (const { result, allowed } of entries) {\n const risky = LEVEL_INDEX[result.risk.level] >= GATE_INDEX[gate];\n const fileIcon = risky ? icon(\"cross\") : icon(\"tick\");\n const fileIconText = style.color\n ? risky\n ? chalk.red(fileIcon)\n : chalk.green(fileIcon)\n : fileIcon;\n const score = result.risk.score.toFixed(1);\n const gauge = riskGauge(result.risk.score, result.risk.level, style);\n const file = displayPath(result.targetPath, cwd);\n const allowedTag = allowed ? ` ${dim(\"(allowed)\", style)}` : \"\";\n writer.writeLine(\n `${fileIconText} ${file} ${riskBadge(result.risk.level, style)} · ${score}/100${gauge ? ` ${gauge}` : \"\"}${allowedTag}`,\n );\n if (verbose) {\n writer.writeLine(\n ` ${dim(\n `${pluralize(result.summary.affectedFiles, \"file\")} affected · max depth ${result.summary.maxDepth} · confidence ${result.summary.confidence}%`,\n style,\n )}`,\n );\n }\n }\n // skipped files\n for (const rel of skipped) {\n writer.writeLine(\n `${dim(icon(\"ellipsis\"), style)} ${dim(rel, style)} ${dim(\"(not a source file)\", style)}`,\n );\n }\n writer.writeLine();\n}\n\nexport function buildDiffJsonReport(\n baseLabel: string,\n changedFileNames: string[],\n byRel: Map<string, AnalysisResult>,\n allowedByRel: Map<string, boolean>,\n gate: GateLevel,\n blocked: boolean,\n counts: DiffCounts,\n allowedCount: number,\n durationMs: number,\n version: string,\n): DiffJsonReport {\n const files: DiffFileReport[] = [];\n for (const rel of changedFileNames) {\n const result = byRel.get(rel);\n if (result) {\n files.push({\n file: rel,\n analyzed: true,\n risk: result.risk,\n affectedFiles: result.summary.affectedFiles,\n targetInCycle: result.targetInCycle,\n allowed: allowedByRel.get(rel) ?? false,\n });\n } else {\n files.push({ file: rel, analyzed: false });\n }\n }\n files.sort((a, b) => (b.risk?.score ?? -1) - (a.risk?.score ?? -1));\n\n return {\n tool: \"ripple\",\n version,\n command: \"diff\",\n base: baseLabel,\n changedFiles: changedFileNames.length,\n files,\n gate: { level: gate, blocked, counts, allowed: allowedCount },\n durationMs,\n };\n}\n","/**\n * Minimal Model Context Protocol server core (JSON-RPC 2.0 over stdio,\n * newline-delimited messages).\n *\n * Implements just what Ripple needs: `initialize`, `ping`,\n * `tools/list`, `tools/call` and the `notifications/initialized` lifecycle\n * notification. Everything else surfaces as a standard JSON-RPC error so\n * clients degrade gracefully instead of hanging.\n *\n * The core is transport-agnostic: `handleLine` takes one inbound message and\n * returns the response to write (or `null` for notifications), which makes it\n * unit-testable without spawning processes.\n */\n\nexport interface McpTool {\n name: string;\n description: string;\n /** JSON Schema draft-07 object describing `arguments`. */\n inputSchema: Record<string, unknown>;\n handler: (args: Record<string, unknown>) => Promise<McpToolResult> | McpToolResult;\n}\n\nexport interface McpToolResult {\n /** Markdown or JSON text returned to the client. */\n text: string;\n /** Marks the result as an error while keeping the server alive. */\n isError?: boolean;\n}\n\nexport interface McpServerOptions {\n name: string;\n version: string;\n tools: McpTool[];\n}\n\nconst PROTOCOL_VERSION = \"2025-06-18\";\n\nconst ERR_PARSE = -32700;\nconst ERR_INVALID_REQUEST = -32600;\nconst ERR_INTERNAL = -32603;\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\nexport class McpServer {\n private readonly options: McpServerOptions;\n private readonly tools = new Map<string, McpTool>();\n\n constructor(options: McpServerOptions) {\n this.options = options;\n for (const tool of options.tools) {\n this.tools.set(tool.name, tool);\n }\n }\n\n /**\n * Process one inbound message. Returns the JSON-RPC response line to write\n * back, or `null` for notifications and invalid requests.\n */\n async handleLine(line: string): Promise<string | null> {\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch {\n return this.response(undefined, {\n code: ERR_PARSE,\n message: \"Parse error: not valid JSON\",\n });\n }\n\n if (!isObject(message) || message.jsonrpc !== \"2.0\") {\n return this.response(undefined, {\n code: ERR_INVALID_REQUEST,\n message: \"Invalid Request: expected a JSON-RPC 2.0 object\",\n });\n }\n\n const hasId = \"id\" in message;\n if (message.method === \"notifications/initialized\") {\n return null;\n }\n\n if (!hasId) {\n return null;\n }\n\n const method = message.method;\n if (typeof method !== \"string\") {\n return this.response(message.id, {\n code: ERR_INVALID_REQUEST,\n message: \"Invalid Request: method must be a string\",\n });\n }\n\n try {\n const result = await this.dispatch(method, message.params);\n return this.response(message.id, result);\n } catch (error) {\n return this.response(message.id, {\n code: ERR_INTERNAL,\n message: error instanceof Error ? error.message : \"Internal error\",\n });\n }\n }\n\n private async dispatch(method: string, params: unknown): Promise<unknown> {\n switch (method) {\n case \"initialize\":\n return {\n protocolVersion: this.protocolVersion(params),\n capabilities: { tools: { listChanged: false } },\n serverInfo: { name: this.options.name, version: this.options.version },\n };\n case \"ping\":\n return {};\n case \"tools/list\":\n return {\n tools: [...this.tools.values()].map((tool) => ({\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n })),\n };\n case \"tools/call\":\n return this.callTool(params);\n case \"tools/list_changed\":\n throw new Error(\"Tool list changes are not supported by this server\");\n default:\n throw new Error(`Method not found: ${method}`);\n }\n }\n\n private protocolVersion(params: unknown): string {\n if (isObject(params) && typeof params.protocolVersion === \"string\") {\n return params.protocolVersion;\n }\n return PROTOCOL_VERSION;\n }\n\n private async callTool(params: unknown): Promise<unknown> {\n if (!isObject(params) || typeof params.name !== \"string\") {\n throw new Error(\"Invalid params: expected { name: string, arguments?: object }\");\n }\n const tool = this.tools.get(params.name);\n if (!tool) {\n throw new Error(`Unknown tool: ${params.name}`);\n }\n\n const args =\n isObject(params.arguments) || params.arguments === undefined\n ? (params.arguments ?? {})\n : null;\n if (args === null) {\n throw new Error(`Invalid arguments for tool ${params.name}: expected an object`);\n }\n\n try {\n const result = await tool.handler(args);\n return {\n content: [{ type: \"text\", text: result.text }],\n ...(result.isError ? { isError: true } : {}),\n };\n } catch (error) {\n return {\n content: [\n {\n type: \"text\",\n text: error instanceof Error ? error.message : \"Tool failed\",\n },\n ],\n isError: true,\n };\n }\n }\n\n private response(id: unknown, payload: { code: number; message: string } | unknown): string {\n if (\n typeof payload === \"object\" &&\n payload !== null &&\n \"code\" in payload &&\n typeof payload.code === \"number\"\n ) {\n const errorPayload = payload as Record<string, unknown>;\n const error = { code: errorPayload.code, message: String(errorPayload.message) };\n return `${JSON.stringify({ jsonrpc: \"2.0\", id: id ?? null, error })}\\n`;\n }\n return `${JSON.stringify({ jsonrpc: \"2.0\", id: id ?? null, result: payload })}\\n`;\n }\n}\n","import path from \"node:path\";\nimport { analyzeFile } from \"../analyzer/analyze.js\";\nimport type { ProjectContext } from \"../types/project.js\";\nimport type { DependencyGraph } from \"../types/graph.js\";\nimport type { AnalysisResult } from \"../types/analysis.js\";\nimport { pathKey, toPosix } from \"../utils/paths.js\";\nimport type { ChangedFiles } from \"../git/changed.js\";\nimport type { McpTool, McpToolResult } from \"./server.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport { evaluateGate } from \"../commands/gate.js\";\n\n/**\n * The `ripple mcp` tool set. Each tool is a thin, deterministic wrapper over\n * the same analysis pipeline the CLI uses, returning JSON text so AI clients\n * can reason over exact numbers.\n */\n\nexport interface ProjectSnapshot {\n context: ProjectContext;\n graph: DependencyGraph;\n entryPoints: Set<string>;\n}\n\nexport interface McpToolDeps {\n cwd: string;\n loadProject: () => Promise<ProjectSnapshot>;\n getChanged: (base?: string) => ChangedFiles;\n}\n\nconst MAX_DEPENDENTS = 200;\n\nfunction ok(text: string): McpToolResult {\n return { text };\n}\n\nfunction fail(error: unknown): McpToolResult {\n return { text: error instanceof Error ? error.message : \"Tool failed\", isError: true };\n}\n\n/** Validate a required string argument. */\nfunction requireString(args: Record<string, unknown>, key: string, tool: string): string {\n const value = args[key];\n if (typeof value !== \"string\" || value.trim() === \"\") {\n throw new RippleError(`Missing required argument \"${key}\" for ${tool}`, ExitCode.Failure);\n }\n return value;\n}\n\nfunction optionalPositiveInt(\n args: Record<string, unknown>,\n key: string,\n tool: string,\n): number | undefined {\n const value = args[key];\n if (value === undefined) return undefined;\n if (typeof value !== \"number\" || !Number.isInteger(value) || value < 1) {\n throw new RippleError(\n `Argument \"${key}\" for ${tool} must be a positive integer`,\n ExitCode.Failure,\n );\n }\n return value;\n}\n\nfunction resolveFile(cwd: string, file: string): string {\n return path.isAbsolute(file) ? file : path.join(cwd, file);\n}\n\nfunction analyzeIn(\n project: ProjectSnapshot,\n cwd: string,\n file: string,\n maxDepth?: number,\n): AnalysisResult {\n const { context, graph, entryPoints } = project;\n const targetPath = resolveFile(cwd, file);\n const key = pathKey(targetPath, context.rootDir);\n const node = graph.nodes.get(key);\n if (!node) {\n throw new RippleError(\n `File not found in the project graph: ${file}. Is it a source file covered by ripple's discovery?`,\n ExitCode.NotFound,\n );\n }\n return analyzeFile({\n graph,\n context,\n entryPoints,\n targetKey: key,\n targetPath,\n durationMs: 0,\n ...(maxDepth !== undefined ? { maxDepth } : {}),\n });\n}\n\nfunction relPath(targetPath: string, cwd: string): string {\n const rel = path.relative(cwd, targetPath);\n return toPosix(rel || path.basename(targetPath));\n}\n\nconst IMPACT_SCHEMA = {\n type: \"object\",\n properties: {\n file: {\n type: \"string\",\n description: \"Project-relative or absolute path of the file to analyze.\",\n },\n maxDepth: {\n type: \"integer\",\n minimum: 1,\n description: \"Cap the reverse traversal depth (default: unlimited).\",\n },\n },\n required: [\"file\"],\n} satisfies Record<string, unknown>;\n\nconst DEPENDENTS_SCHEMA = {\n type: \"object\",\n properties: {\n file: {\n type: \"string\",\n description: \"Project-relative or absolute path of the file.\",\n },\n depth: {\n type: \"integer\",\n minimum: 1,\n description: \"Max dependency depth to report (default: 1, direct dependents only).\",\n },\n },\n required: [\"file\"],\n} satisfies Record<string, unknown>;\n\nconst RISK_SCHEMA = {\n type: \"object\",\n properties: {\n file: {\n type: \"string\",\n description: \"Project-relative or absolute path of the file.\",\n },\n },\n required: [\"file\"],\n} satisfies Record<string, unknown>;\n\nconst GATE_SCHEMA = {\n type: \"object\",\n properties: {\n base: {\n type: \"string\",\n description:\n \"Git ref to diff against (default: GitHub base, origin/main, origin/master, main, master).\",\n },\n gate: {\n type: \"string\",\n enum: [\"medium\", \"high\", \"critical\"],\n description: \"Risk level that blocks the merge (default: high).\",\n },\n },\n} satisfies Record<string, unknown>;\n\nexport function createMcpTools(deps: McpToolDeps): McpTool[] {\n const { cwd, loadProject, getChanged } = deps;\n\n return [\n {\n name: \"impact\",\n description:\n \"Blast-radius analysis of a file: how many files, routes, tests and components would be affected by changing it, plus its risk score. Call before editing or refactoring a file so the change set stays low-risk.\",\n inputSchema: IMPACT_SCHEMA,\n handler: async (args) => {\n try {\n const file = requireString(args, \"file\", \"impact\");\n const maxDepth = optionalPositiveInt(args, \"maxDepth\", \"impact\");\n const project = await loadProject();\n const result = analyzeIn(project, cwd, file, maxDepth);\n return ok(\n JSON.stringify(\n {\n file: relPath(result.targetPath, cwd),\n risk: { score: result.risk.score, level: result.risk.level },\n summary: result.summary,\n targetInCycle: result.targetInCycle,\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return fail(error);\n }\n },\n },\n {\n name: \"dependents\",\n description:\n \"List the files that depend on a file (its importers), up to a depth. Depth 1 is direct dependents; deeper levels are transitive. Useful to know who breaks when the file changes.\",\n inputSchema: DEPENDENTS_SCHEMA,\n handler: async (args) => {\n try {\n const file = requireString(args, \"file\", \"dependents\");\n const depth = optionalPositiveInt(args, \"depth\", \"dependents\") ?? 1;\n const project = await loadProject();\n const result = analyzeIn(project, cwd, file, depth);\n const dependents = [...result.affected.values()]\n .filter((affected) => affected.depth <= depth)\n .sort((a, b) => a.depth - b.depth || a.path.localeCompare(b.path))\n .map((affected) => ({\n path: relPath(affected.path, cwd),\n depth: affected.depth,\n direct: affected.direct,\n inCycle: affected.inCycle,\n categories: affected.categories,\n }));\n return ok(\n JSON.stringify(\n {\n file: relPath(result.targetPath, cwd),\n depth,\n count: dependents.length,\n truncated: dependents.length > MAX_DEPENDENTS,\n dependents: dependents.slice(0, MAX_DEPENDENTS),\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return fail(error);\n }\n },\n },\n {\n name: \"risk\",\n description:\n \"The risk score (0-100) of changing a file and the factor breakdown behind it. Cheap way to compare the danger of different refactor targets.\",\n inputSchema: RISK_SCHEMA,\n handler: async (args) => {\n try {\n const file = requireString(args, \"file\", \"risk\");\n const project = await loadProject();\n const result = analyzeIn(project, cwd, file);\n return ok(\n JSON.stringify(\n {\n file: relPath(result.targetPath, cwd),\n score: result.risk.score,\n level: result.risk.level,\n targetInCycle: result.targetInCycle,\n factors: result.risk.factors,\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return fail(error);\n }\n },\n },\n {\n name: \"gate_status\",\n description:\n \"Check the current change set against the ripple merge gate: which files changed since the base ref, their risk levels, and whether the gate passes or blocks. Call after editing files to verify the changes are safe to merge.\",\n inputSchema: GATE_SCHEMA,\n handler: async (args) => {\n try {\n const base = args.base;\n const gate = args.gate;\n if (base !== undefined && typeof base !== \"string\") {\n return fail(\n new RippleError('Argument \"base\" for gate_status must be a string', ExitCode.Failure),\n );\n }\n if (gate !== undefined && gate !== \"medium\" && gate !== \"high\" && gate !== \"critical\") {\n return fail(\n new RippleError(\n 'Argument \"gate\" for gate_status must be medium | high | critical',\n ExitCode.Failure,\n ),\n );\n }\n const project = await loadProject();\n const resolvedGate = gate ?? project.context.config.diff.gate ?? \"high\";\n const changed = getChanged(base ?? project.context.config.diff.base);\n const evaluation = evaluateGate({\n context: project.context,\n graph: project.graph,\n entryPoints: project.entryPoints,\n changed,\n gate: resolvedGate,\n allowPatterns: project.context.config.diff.allow ?? [],\n });\n\n const files = evaluation.changes.map((change) => {\n if (!change.result) return { file: change.file, analyzed: false };\n return {\n file: change.file,\n analyzed: true,\n level: change.result.risk.level,\n score: change.result.risk.score,\n affectedFiles: change.result.summary.affectedFiles,\n targetInCycle: change.result.targetInCycle,\n allowed: change.allowed,\n };\n });\n\n return ok(\n JSON.stringify(\n {\n base: changed.baseLabel,\n changedFiles: evaluation.changes.length,\n files,\n counts: evaluation.counts,\n gate: {\n level: resolvedGate,\n blocked: evaluation.blocked,\n verdict: evaluation.blocked ? \"block\" : \"pass\",\n allowed: evaluation.allowedCount,\n },\n },\n null,\n 2,\n ),\n );\n } catch (error) {\n return fail(error);\n }\n },\n },\n ];\n}\n","import { createInterface } from \"node:readline\";\nimport { loadProjectContext } from \"../config/loader.js\";\nimport { runPipeline } from \"./pipeline.js\";\nimport { changedFiles } from \"../git/changed.js\";\nimport { McpServer } from \"../mcp/server.js\";\nimport { createMcpTools, type ProjectSnapshot } from \"../mcp/tools.js\";\nimport { ExitCode } from \"../types/cli.js\";\nimport type { CommandContext } from \"../types/cli.js\";\n\n/**\n * `ripple mcp`\n *\n * Exposes Ripple's analysis as Model Context Protocol tools over stdio, so\n * AI coding agents can check a file's blast radius, list its dependents,\n * score the risk of touching it, and verify the merge gate before\n * refactoring.\n *\n * stdio is a strict contract here: the server speaks one JSON-RPC message\n * per line on stdout and nothing else. All human-readable output goes to\n * stderr.\n */\n\nexport interface McpOptions {\n config?: string;\n}\n\nexport async function mcpCommand(options: McpOptions, ctx: CommandContext): Promise<ExitCode> {\n /**\n * Rebuild the project on every tool call. A long-lived MCP session is\n * exactly the workflow that edits files between calls, so a memoized graph\n * would answer from stale source. The incremental parse cache keeps the\n * rebuild cheap: unchanged files are stat + cache hits, not re-parses.\n */\n const loadProject = async (): Promise<ProjectSnapshot> => {\n const context = await loadProjectContext(ctx.cwd, options.config);\n const { graph, entryPoints } = await runPipeline(context);\n return { context, graph, entryPoints };\n };\n\n const server = new McpServer({\n name: \"ripple\",\n version: ctx.version,\n tools: createMcpTools({\n cwd: ctx.cwd,\n loadProject,\n getChanged: (base) => changedFiles(ctx.cwd, base),\n }),\n });\n\n const stdin = createInterface({ input: process.stdin, crlfDelay: Infinity });\n await new Promise<void>((resolve) => {\n stdin.on(\"line\", (line) => {\n if (!line.trim()) return;\n void server.handleLine(line).then((response) => {\n if (response) process.stdout.write(response);\n });\n });\n stdin.on(\"close\", () => resolve());\n });\n\n return ExitCode.Success;\n}\n","import { Command, CommanderError } from \"commander\";\nimport { analyzeCommand } from \"../commands/analyze.js\";\nimport { graphCommand } from \"../commands/graph.js\";\nimport { doctorCommand } from \"../commands/doctor.js\";\nimport { initCommand } from \"../commands/init.js\";\nimport { diffCommand } from \"../commands/diff.js\";\nimport { mcpCommand } from \"../commands/mcp.js\";\nimport { RippleError } from \"../utils/errors.js\";\nimport { ExitCode, type CommandContext, type DiffFormat, type GraphFormat } from \"../types/cli.js\";\n\n/**\n * CLI program definition. `run()` returns the process exit code instead of\n * calling `process.exit`, which keeps the CLI integration-testable.\n */\n\nconst PROGRAM_NAME = \"ripple\";\n\n/**\n * One-line usage examples appended to a command's `--help` output, so the\n * CLI itself documents realistic invocations (issues #4, #9).\n */\nfunction helpExamples(examples: string[]): string {\n const lines = examples.map((example) => ` ${example}`);\n return `\\nExamples:\\n${lines.join(\"\\n\")}\\n`;\n}\n\nexport function createProgram(ctx: CommandContext): Command {\n const program = new Command()\n .name(PROGRAM_NAME)\n .description(\"Dependency impact analysis for TypeScript and JavaScript projects.\")\n .version(ctx.version, \"-V, --version\", \"print the Ripple version\")\n .showHelpAfterError();\n\n program\n .command(\"analyze <file>\")\n .description(\"Analyze the impact of changing a file\")\n .addHelpText(\n \"after\",\n helpExamples([\n \"ripple analyze src/authentication/login.ts\",\n \"ripple analyze src/index.ts --depth 3\",\n ]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\"--sarif\", \"emit a SARIF 2.1.0 report for code scanning\")\n .option(\"-v, --verbose\", \"include the risk factor breakdown\")\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string, options: Record<string, unknown>) => {\n const exitCode = await analyzeCommand(\n file,\n {\n json: Boolean(options.json),\n sarif: Boolean(options.sarif),\n verbose: Boolean(options.verbose),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"graph [file]\")\n .description(\"Show project graph stats, or the dependency tree of one file\")\n .addHelpText(\n \"after\",\n helpExamples([\n \"ripple graph\",\n \"ripple graph src/index.ts --reverse --depth 3\",\n \"ripple graph --format mermaid\",\n ]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\n \"-f, --format <format>\",\n \"output format: terminal | json | mermaid | dot | html\",\n parseGraphFormat,\n )\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\"-r, --reverse\", \"show dependents (what imports the file) instead of dependants\")\n .option(\"-d, --depth <number>\", \"cap the tree depth\", parsePositiveInt)\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (file: string | undefined, options: Record<string, unknown>) => {\n const exitCode = await graphCommand(\n file,\n {\n json: Boolean(options.json),\n format: (options.format as GraphFormat) ?? (options.json ? \"json\" : \"terminal\"),\n verbose: Boolean(options.verbose),\n reverse: Boolean(options.reverse),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"diff\")\n .description(\"Analyze changed files since a base ref and gate risky changes\")\n .addHelpText(\n \"after\",\n helpExamples([\"ripple diff --base main --gate critical\", \"ripple diff --format github\"]),\n )\n .option(\"-j, --json\", \"emit a machine-readable JSON report\")\n .option(\n \"-f, --format <format>\",\n \"output format: terminal | json | github | sarif\",\n parseDiffFormat,\n )\n .option(\"-v, --verbose\", \"include extra sections\")\n .option(\n \"-b, --base <ref>\",\n \"git ref to diff against (default: GitHub base, origin/HEAD, origin/main, origin/master, main, master)\",\n )\n .option(\n \"-g, --gate <level>\",\n \"risk level that blocks the gate (medium | high | critical)\",\n parseGateLevel,\n )\n .option(\"-d, --depth <number>\", \"cap the reverse traversal depth\", parsePositiveInt)\n .option(\"-a, --allow <glob...>\", \"changed files matching these globs never block the gate\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await diffCommand(\n {\n json: Boolean(options.json),\n format: (options.format as DiffFormat) ?? (options.json ? \"json\" : \"terminal\"),\n verbose: Boolean(options.verbose),\n ...(options.base !== undefined ? { base: options.base as string } : {}),\n ...(options.gate !== undefined\n ? { gate: options.gate as \"medium\" | \"high\" | \"critical\" }\n : {}),\n ...(options.depth !== undefined ? { depth: options.depth as number } : {}),\n ...(options.allow !== undefined ? { allow: options.allow as string[] } : {}),\n ...(options.config !== undefined ? { config: options.config as string } : {}),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"doctor\")\n .description(\"Check the project and environment for Ripple readiness\")\n .addHelpText(\"after\", helpExamples([\"ripple doctor\", \"ripple doctor -v\"]))\n .option(\"-v, --verbose\", \"print detailed diagnostics\")\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await doctorCommand(\n {\n verbose: Boolean(options.verbose),\n config: options.config as string | undefined,\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"init\")\n .description(\"Create a ripple.config with the default settings\")\n .addHelpText(\"after\", helpExamples([\"ripple init --force\", \"ripple init --ts --full\"]))\n .option(\"-f, --force\", \"overwrite an existing config file\")\n .option(\"--full\", \"write every built-in default instead of a minimal config\")\n .option(\"--ts\", \"write a typed ripple.config.ts instead of JSON\")\n .option(\"--no-color\", \"disable ANSI colors\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await initCommand(\n {\n force: Boolean(options.force),\n full: Boolean(options.full),\n ts: Boolean(options.ts),\n color: options.color as boolean | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"mcp\")\n .description(\"Serve Ripple analysis tools over the Model Context Protocol (stdio)\")\n .addHelpText(\n \"after\",\n helpExamples(['ripple mcp # point an MCP client (Claude, Cursor, ...) at \"ripple mcp\"']),\n )\n .option(\"-c, --config <path>\", \"path to a ripple config file\")\n .action(async (options: Record<string, unknown>) => {\n const exitCode = await mcpCommand(\n {\n config: options.config as string | undefined,\n },\n ctx,\n );\n if (exitCode !== ExitCode.Success) {\n throw new ExitError(exitCode);\n }\n });\n\n program\n .command(\"version\")\n .description(\"Print the Ripple version\")\n .addHelpText(\"after\", helpExamples([\"ripple version\"]))\n .action(() => {\n ctx.writer.writeLine(ctx.version);\n });\n\n program.addHelpText(\n \"beforeAll\",\n `ripple — dependency impact analysis for TypeScript and JavaScript\\n`,\n );\n\n return program;\n}\n\n/** Thrown internally to propagate a non-success exit code through commander. */\nclass ExitError extends Error {\n constructor(readonly exitCode: ExitCode) {\n super(`exit ${exitCode}`);\n this.name = \"ExitError\";\n }\n}\n\nfunction parsePositiveInt(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isFinite(parsed) || parsed < 1) {\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected a positive integer, got \"${value}\"`,\n );\n }\n return parsed;\n}\n\n/** Validate the `--gate` argument. */\nfunction parseGateLevel(value: string): \"medium\" | \"high\" | \"critical\" {\n if (value === \"medium\" || value === \"high\" || value === \"critical\") {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of medium | high | critical, got \"${value}\"`,\n );\n}\n\n/** Validate the `--format` argument. */\nfunction parseDiffFormat(value: string): DiffFormat {\n if (value === \"terminal\" || value === \"json\" || value === \"github\" || value === \"sarif\") {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of terminal | json | github | sarif, got \"${value}\"`,\n );\n}\n\n/** Validate the `graph --format` argument. */\nfunction parseGraphFormat(value: string): GraphFormat {\n if (\n value === \"terminal\" ||\n value === \"json\" ||\n value === \"mermaid\" ||\n value === \"dot\" ||\n value === \"html\"\n ) {\n return value;\n }\n throw new CommanderError(\n 1,\n \"commander.invalidArgument\",\n `expected one of terminal | json | mermaid | dot | html, got \"${value}\"`,\n );\n}\n\n/** Print an error to the error stream. */\nfunction printError(error: unknown, ctx: CommandContext): void {\n if (error instanceof RippleError) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n if (error.hint) ctx.errorWriter.writeLine(` ${error.hint}`);\n return;\n }\n if (error instanceof Error) {\n ctx.errorWriter.writeLine(`✖ ${error.message}`);\n return;\n }\n ctx.errorWriter.writeLine(`✖ ${String(error)}`);\n}\n\nexport interface RunOptions {\n argv: string[];\n ctx: CommandContext;\n}\n\n/** Parse arguments and run the CLI, returning the exit code. */\nexport async function run({ argv, ctx }: RunOptions): Promise<ExitCode> {\n const program = createProgram(ctx);\n program.exitOverride();\n\n try {\n await program.parseAsync(argv);\n return ExitCode.Success;\n } catch (error) {\n if (error instanceof ExitError) {\n return error.exitCode;\n }\n if (error instanceof CommanderError) {\n if (error.exitCode === 0) return ExitCode.Success;\n return ExitCode.Failure;\n }\n printError(error, ctx);\n return error instanceof RippleError ? error.exitCode : ExitCode.Failure;\n }\n}\n","import { TerminalWriter } from \"../output/writer.js\";\nimport { run } from \"./program.js\";\nimport pkg from \"../../package.json\" with { type: \"json\" };\n\n/**\n * Real CLI entry point. Keep this file thin — all logic lives in\n * `src/cli/program.ts` so the program stays integration-testable.\n */\n\nconst ctx = {\n writer: new TerminalWriter(),\n errorWriter: new TerminalWriter(process.stderr),\n cwd: process.cwd(),\n version: pkg.version,\n};\n\nconst exitCode = await run({ argv: process.argv, ctx });\nprocess.exitCode = exitCode;\n"]}
|