@maycombhq/atticus 2.0.0-beta.11 → 2.0.0-beta.12.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/dist/bin.js +3 -3
- package/dist/{chunk-4UZJOQYK.js → chunk-2A24BNRZ.js} +7 -7
- package/dist/{chunk-C2YGYTU6.js → chunk-2DJUQ6CO.js} +22 -22
- package/dist/{chunk-BQNEHB5U.js → chunk-2OWSG6BK.js} +11 -11
- package/dist/{chunk-23VFQHFQ.js → chunk-2QT6WVAK.js} +31 -21
- package/dist/chunk-2RMWW6G3.js +41 -0
- package/dist/{chunk-SILY6ZEZ.js → chunk-3256EDLL.js} +3 -3
- package/dist/{chunk-YLAM4HZH.js → chunk-34BCKMBS.js} +3 -3
- package/dist/{chunk-GVFUEGGM.js → chunk-34NWVIBC.js} +2 -2
- package/dist/{chunk-UABFFMWH.js → chunk-36CTZGPH.js} +7 -7
- package/dist/{chunk-77RSRG3A.js → chunk-3JLTN3Y7.js} +7 -7
- package/dist/{chunk-QWHTTA2X.js → chunk-3M7QBKKG.js} +8 -6
- package/dist/chunk-3PLE3ZQ5.js +34 -0
- package/dist/{chunk-LUPW4WLK.js → chunk-3W5R5J65.js} +8 -8
- package/dist/{chunk-EBWIOODZ.js → chunk-42L2WHP6.js} +4 -4
- package/dist/{chunk-KU4T2CXJ.js → chunk-4GNKICU5.js} +18 -18
- package/dist/{chunk-2K2ZEJVR.js → chunk-4HTILEXW.js} +2 -2
- package/dist/{chunk-HR4DVO6X.js → chunk-4JLB5ISS.js} +3 -3
- package/dist/{chunk-XOVLGBKI.js → chunk-5C24MOXU.js} +17 -17
- package/dist/{chunk-EHUYLNLC.js → chunk-5G5GD5HF.js} +14 -14
- package/dist/{chunk-HGQZTUAC.js → chunk-5I5JDJ3R.js} +4 -4
- package/dist/{chunk-KIWEBM6G.js → chunk-5IMZYLDW.js} +11 -11
- package/dist/{chunk-XJAJQGXJ.js → chunk-5ION6STH.js} +2 -2
- package/dist/{chunk-5ICB2BXH.js → chunk-5R2EWR47.js} +7 -7
- package/dist/{chunk-HOUUBE74.js → chunk-65XZSK6S.js} +4 -4
- package/dist/{chunk-LVBPY2M6.js → chunk-6AYUBYK6.js} +348 -15
- package/dist/{chunk-IY4PHPHT.js → chunk-6HSRGY4B.js} +7 -5
- package/dist/{chunk-Y5AYBGLB.js → chunk-6IKYFARG.js} +22 -13
- package/dist/{chunk-7KXYMC2P.js → chunk-6R2OM6Y3.js} +15 -15
- package/dist/{chunk-GWSWS264.js → chunk-6ROZRBWH.js} +4 -4
- package/dist/{chunk-TZXHUDI6.js → chunk-72DY5NCN.js} +2 -2
- package/dist/{chunk-XNRPCI23.js → chunk-77UOXZVM.js} +5 -5
- package/dist/{chunk-LS3WR2RF.js → chunk-7C7PTJM2.js} +256 -73
- package/dist/{chunk-VYNZED7B.js → chunk-7FPTI62T.js} +20 -20
- package/dist/{chunk-Z2EYRUOH.js → chunk-7H5HYERS.js} +19 -19
- package/dist/{chunk-4YWRU7JK.js → chunk-7MASAGFE.js} +15 -15
- package/dist/{chunk-7SZPENUP.js → chunk-7UKETVPW.js} +1 -1
- package/dist/{chunk-55TBYJF2.js → chunk-7UXSS23C.js} +18 -16
- package/dist/{chunk-XPWSNKF3.js → chunk-7VAMO66T.js} +398 -111
- package/dist/{chunk-LDIARP6F.js → chunk-7VNEDDCC.js} +2 -2
- package/dist/{chunk-TGEOLIAK.js → chunk-7XWCTVJS.js} +3 -3
- package/dist/{chunk-RJDP642F.js → chunk-ARLH2ZMD.js} +1 -1
- package/dist/{chunk-IRW64JFF.js → chunk-AUSC47BK.js} +4 -4
- package/dist/{chunk-JUZ75OG4.js → chunk-AY7Y3WPD.js} +15 -15
- package/dist/{chunk-4URR24DD.js → chunk-BFZSO2TP.js} +6 -6
- package/dist/{chunk-MYKQVS5W.js → chunk-BHHIHENP.js} +10 -6
- package/dist/{chunk-6V3DTQWK.js → chunk-BUD6JILH.js} +21 -21
- package/dist/{chunk-MKC7P5LD.js → chunk-CCXEXCRO.js} +14 -14
- package/dist/{chunk-52WCHTVZ.js → chunk-CGF4LKXR.js} +3 -3
- package/dist/{chunk-5ACUW753.js → chunk-CH6LUQLD.js} +1 -1
- package/dist/{chunk-7VFVQX5K.js → chunk-CIIRPLI6.js} +4 -4
- package/dist/{chunk-JEUXCIRD.js → chunk-CJ5FQHST.js} +5 -5
- package/dist/{chunk-U6YKL7SI.js → chunk-CKI4VG2I.js} +22 -22
- package/dist/{chunk-BKFGGJKA.js → chunk-CQD26SMZ.js} +3 -1
- package/dist/chunk-CU35HXQ7.js +48 -0
- package/dist/{chunk-KLKENMWQ.js → chunk-CUD4I2U6.js} +58 -43
- package/dist/{chunk-5TY4DTHQ.js → chunk-CUX4GRTB.js} +3 -3
- package/dist/{chunk-5NZSJ5ZG.js → chunk-CXY4YDXS.js} +2 -2
- package/dist/{chunk-XR5DD5DQ.js → chunk-CYDJK34J.js} +12 -7
- package/dist/{chunk-WKXOEIOY.js → chunk-DBVU45FY.js} +14 -14
- package/dist/{chunk-IILZ7J3L.js → chunk-DBZNQAMN.js} +171 -62
- package/dist/{chunk-D7MWYJZF.js → chunk-DDOLWHIM.js} +17 -17
- package/dist/{chunk-EW7MRMD5.js → chunk-DIAYQLEY.js} +16 -7
- package/dist/{chunk-OFWYZH6B.js → chunk-DKGWE5ZL.js} +21 -21
- package/dist/{chunk-27EDZN52.js → chunk-DLX2R3MI.js} +31 -31
- package/dist/{chunk-TCADP67G.js → chunk-DONCF2XC.js} +3 -3
- package/dist/{chunk-ORZSD2KD.js → chunk-DQKNOHUZ.js} +1 -1
- package/dist/{chunk-EAQFRD2B.js → chunk-DREIS5Z5.js} +6 -6
- package/dist/{chunk-CAN3EBE5.js → chunk-DW4BM73R.js} +1 -1
- package/dist/{chunk-C5JFMAXX.js → chunk-DX5H5YKM.js} +11 -11
- package/dist/{chunk-LZWVK4YY.js → chunk-EE3UNC44.js} +3 -3
- package/dist/{chunk-Z46OXTBE.js → chunk-EOCZDNWU.js} +5 -5
- package/dist/chunk-EOWO4YPF.js +43 -0
- package/dist/{chunk-NBGBMRIS.js → chunk-EREL3TQG.js} +1 -1
- package/dist/{chunk-NH5QH3WS.js → chunk-ESGIBN3S.js} +1 -1
- package/dist/chunk-EZ3FDHW3.js +41 -0
- package/dist/chunk-F5L23NGR.js +45 -0
- package/dist/{chunk-MQNBEO3N.js → chunk-FF5Q7ONT.js} +118 -104
- package/dist/{chunk-TC3KTG33.js → chunk-FLROTO6F.js} +3 -3
- package/dist/{chunk-YWOMGMZB.js → chunk-FNVY656P.js} +22 -22
- package/dist/{chunk-MCWWMMLN.js → chunk-FP6GJJY7.js} +22 -22
- package/dist/{chunk-SIUDWWKS.js → chunk-FSR7OUVJ.js} +23 -23
- package/dist/{chunk-GPLFYLGH.js → chunk-FT3RXIN4.js} +10 -10
- package/dist/{chunk-SH7AZZDA.js → chunk-FYWA2CPF.js} +17 -17
- package/dist/{chunk-5BJFMAQU.js → chunk-G2K2D6XS.js} +12 -12
- package/dist/{chunk-3LU6YCSQ.js → chunk-G5SKNMPC.js} +5 -5
- package/dist/{chunk-RB2VSED2.js → chunk-GIPQHVJF.js} +11 -11
- package/dist/{chunk-NELU7LSL.js → chunk-GJ4B2FYS.js} +10 -10
- package/dist/{chunk-KQRYW7OS.js → chunk-GRZGEMO5.js} +109 -108
- package/dist/{chunk-OR5VRULZ.js → chunk-GU7PEYRC.js} +10 -10
- package/dist/{chunk-MKIULIUQ.js → chunk-GUNBOZ75.js} +3 -3
- package/dist/{chunk-Q32Y5T2U.js → chunk-GX3Q5PRC.js} +11 -11
- package/dist/{chunk-ANCI3LFS.js → chunk-HIQWJ6JZ.js} +4 -4
- package/dist/{chunk-JBSD57N7.js → chunk-HK2CF6KQ.js} +23 -23
- package/dist/{chunk-ZKUDS7JG.js → chunk-HMQXIFOL.js} +4 -4
- package/dist/{chunk-WIMOJMAK.js → chunk-HY2VVVFZ.js} +168 -14
- package/dist/{chunk-BX52REMA.js → chunk-IDLO7UCZ.js} +5 -5
- package/dist/{chunk-CE4S5ZY3.js → chunk-IJ7TPOXQ.js} +11 -11
- package/dist/{chunk-6N2GUZMZ.js → chunk-ISXNWUG7.js} +1 -1
- package/dist/{chunk-DYWTQXP4.js → chunk-IZF2VJU5.js} +22 -22
- package/dist/{chunk-6RGIM2ZH.js → chunk-J22RSFKY.js} +79 -9
- package/dist/{chunk-WFYHOXTB.js → chunk-J3DTLYER.js} +15 -15
- package/dist/{chunk-LEHZTKB3.js → chunk-JC3BMRB5.js} +11 -11
- package/dist/{chunk-7RGCQ4VZ.js → chunk-JLIEAQP4.js} +4 -4
- package/dist/chunk-JOG6LBOP.js +38 -0
- package/dist/{chunk-L7I5PKGD.js → chunk-JQG4VO47.js} +1 -1
- package/dist/{chunk-RIEFYHXI.js → chunk-JS3DJH3Q.js} +4 -4
- package/dist/{chunk-DGKNOPSE.js → chunk-JWQMD54C.js} +7 -7
- package/dist/{chunk-XKJRPVJO.js → chunk-KJ6IH2D5.js} +5 -5
- package/dist/{chunk-T6ESD5KM.js → chunk-KPHPVOME.js} +4 -4
- package/dist/{chunk-YWZDAZMA.js → chunk-KY2ZHTBJ.js} +6 -6
- package/dist/{chunk-7HWXYP4H.js → chunk-LAOZB5YC.js} +11 -11
- package/dist/chunk-LRCWWMHH.js +54 -0
- package/dist/chunk-LVQMS54L.js +54 -0
- package/dist/{chunk-NG5R2WIY.js → chunk-M3BJTXLR.js} +9 -9
- package/dist/{chunk-7RUMD56V.js → chunk-M4D3VKAS.js} +1 -1
- package/dist/{chunk-UTR67XU2.js → chunk-MFRPLAOH.js} +2 -2
- package/dist/{chunk-HZYFLEWO.js → chunk-MI3GGF7V.js} +17 -17
- package/dist/{chunk-BA5DTXHQ.js → chunk-MIOY6EXD.js} +4 -4
- package/dist/{chunk-BUWSOQLU.js → chunk-ML3HOWPI.js} +4 -4
- package/dist/{chunk-SINJKQSI.js → chunk-MOY52LHS.js} +13 -13
- package/dist/{chunk-FMRMTI7W.js → chunk-MRLCNXXR.js} +1 -1
- package/dist/{chunk-5P5BGG5L.js → chunk-N2FA53DA.js} +6 -6
- package/dist/{chunk-ATNG5VOZ.js → chunk-N6YELFHL.js} +2 -2
- package/dist/{chunk-MYOW3RPC.js → chunk-N7HG4UP7.js} +6 -6
- package/dist/{chunk-7LCQ7JAM.js → chunk-NAKVQU6F.js} +1 -1
- package/dist/{chunk-3DDJLI7N.js → chunk-NTNJNRHW.js} +4 -4
- package/dist/{chunk-OHXTB6CO.js → chunk-NZY72PGJ.js} +13 -8
- package/dist/{chunk-4ONORLK5.js → chunk-O62VA6MH.js} +13 -13
- package/dist/{chunk-IVHN2VYG.js → chunk-OJAJXU65.js} +3 -1
- package/dist/{chunk-CZI2ACNT.js → chunk-OKUYBXXI.js} +16 -16
- package/dist/{chunk-EZSZFI54.js → chunk-OMH3I5BH.js} +2 -2
- package/dist/{chunk-5RUMHLIS.js → chunk-P3VBYYAS.js} +24 -3
- package/dist/{chunk-WUE6HKIU.js → chunk-P7SONIEO.js} +165 -46
- package/dist/{chunk-6E2GJANQ.js → chunk-PAOIMLTK.js} +19 -19
- package/dist/{chunk-B3QOYE74.js → chunk-PAQDPB6T.js} +4 -4
- package/dist/{chunk-DS3ZEJVN.js → chunk-PGFRXGHA.js} +2 -2
- package/dist/{chunk-5V5BJACL.js → chunk-PJRMMWU4.js} +2 -2
- package/dist/{chunk-S7ZWCMDO.js → chunk-PKCYRG6G.js} +57 -18
- package/dist/{chunk-26DBAGOP.js → chunk-PUGPT4Y6.js} +17 -17
- package/dist/{chunk-PQW7PYUR.js → chunk-PVMGHQWB.js} +7 -7
- package/dist/{chunk-MSL3CLHX.js → chunk-Q4AWUD6C.js} +16 -16
- package/dist/{chunk-JQX6BSE4.js → chunk-QC24Z5JU.js} +10 -10
- package/dist/{chunk-WCLAOKCH.js → chunk-QKSWQBWD.js} +8 -8
- package/dist/{chunk-GMJXC5AL.js → chunk-QL4VNY4U.js} +1 -1
- package/dist/chunk-QOF7U6BI.js +363 -0
- package/dist/{chunk-JRPQX2EK.js → chunk-QOPX5M7Y.js} +4 -4
- package/dist/{chunk-TEBBD4XH.js → chunk-QR65C3DV.js} +4 -4
- package/dist/{chunk-SG5KY4VB.js → chunk-QXGOEP44.js} +3 -3
- package/dist/{chunk-XZJE6WIT.js → chunk-RA64IK43.js} +1 -1
- package/dist/{chunk-3WU7LVTL.js → chunk-RMNYY5IE.js} +5 -5
- package/dist/chunk-S3QCJWCF.js +34 -0
- package/dist/{chunk-C75W7VXX.js → chunk-S4USA5WC.js} +20 -18
- package/dist/{chunk-FOQXYMOR.js → chunk-S5X7BVWP.js} +19 -19
- package/dist/{chunk-EV4TEFOD.js → chunk-SR2M7DWL.js} +13 -13
- package/dist/{chunk-R6UTCLH5.js → chunk-T4TMX54Q.js} +16 -16
- package/dist/{chunk-OXVVRJDQ.js → chunk-T72K4PLH.js} +11 -11
- package/dist/{chunk-SKMHS4CL.js → chunk-TA2ZNDYD.js} +1 -1
- package/dist/{chunk-CRQ73DIF.js → chunk-TBKJPKDN.js} +11 -11
- package/dist/{chunk-YVCOQ5TZ.js → chunk-TEHH47TG.js} +3 -3
- package/dist/{chunk-EATSD7YD.js → chunk-TEZSZ24W.js} +4 -4
- package/dist/{chunk-WUP77GG2.js → chunk-TIAPEYWI.js} +3 -3
- package/dist/{chunk-J27QGXO4.js → chunk-TIUBGJG3.js} +9 -9
- package/dist/{chunk-RWMSJP7H.js → chunk-TJHDFS33.js} +29 -26
- package/dist/chunk-TJP2KLZI.js +41 -0
- package/dist/{chunk-ZJQUIG3A.js → chunk-TV6ECMN3.js} +15 -14
- package/dist/{chunk-JMOLB347.js → chunk-U25OX22K.js} +64 -8
- package/dist/{chunk-UNFCFJMF.js → chunk-U2SGLXFR.js} +17 -17
- package/dist/{chunk-MV4637YA.js → chunk-U3JGJ3BO.js} +24 -24
- package/dist/{chunk-XF3DATVU.js → chunk-U43G5EUN.js} +17 -17
- package/dist/{chunk-SNHOLLGN.js → chunk-UQUDITWL.js} +84 -25
- package/dist/{chunk-EQOSXLK3.js → chunk-UYKKTEWB.js} +14 -14
- package/dist/{chunk-NX6QEEOA.js → chunk-VAL7HAIR.js} +3 -3
- package/dist/{chunk-JUQHYTXN.js → chunk-VC4JMXM5.js} +19 -17
- package/dist/{chunk-NIYB5K5B.js → chunk-VRH6ITQH.js} +9 -9
- package/dist/{chunk-U5PDQTLA.js → chunk-VTMIRRIZ.js} +2 -2
- package/dist/{chunk-H4VJO3M2.js → chunk-VUBVBFJW.js} +5 -5
- package/dist/{chunk-G7WZH54P.js → chunk-W3ZWS3B3.js} +20 -10
- package/dist/{chunk-GG6HIU74.js → chunk-WBOVB3XR.js} +24 -24
- package/dist/{chunk-IA2RKC6I.js → chunk-WFJMKUTR.js} +52 -11
- package/dist/{chunk-KXZR2BLL.js → chunk-WM4N2L4T.js} +1 -1
- package/dist/{chunk-7S3XFWOU.js → chunk-WRLEYM3T.js} +4 -4
- package/dist/{chunk-REWZE2XI.js → chunk-WSFPKNKT.js} +23 -23
- package/dist/{chunk-SUQZGPVG.js → chunk-XB64FJLU.js} +24 -24
- package/dist/{chunk-4AYZQ3SY.js → chunk-XBNKOARP.js} +4 -4
- package/dist/chunk-XDTD55UU.js +89 -0
- package/dist/{chunk-DQNKG4HY.js → chunk-XMYGEZQ7.js} +17 -17
- package/dist/{chunk-R3VFLYZZ.js → chunk-XP3KLC4S.js} +6 -6
- package/dist/{chunk-S2FDPN32.js → chunk-XRDYEEDE.js} +1 -1
- package/dist/{chunk-7HQOZALR.js → chunk-XSNIHYO6.js} +10 -10
- package/dist/chunk-XVQGT4SL.js +37 -0
- package/dist/{chunk-ZTNS3L5Z.js → chunk-XZLSKGJX.js} +5 -5
- package/dist/{chunk-NR5T46ZY.js → chunk-Y2FMWQQB.js} +16 -16
- package/dist/{chunk-7A7IG7OA.js → chunk-Y6LFFSRV.js} +10 -10
- package/dist/{chunk-V4XKYGLK.js → chunk-YISWYR3Q.js} +4 -4
- package/dist/{chunk-EI4KQYJ3.js → chunk-YSFIQGDK.js} +8 -8
- package/dist/{chunk-XPJR74MA.js → chunk-YVQWJDVN.js} +37 -25
- package/dist/{chunk-R3RVFCJ2.js → chunk-YY2WGL6S.js} +2 -2
- package/dist/{chunk-HQMCHHY5.js → chunk-Z2BA4NNR.js} +2 -2
- package/dist/{chunk-G3PBLW4K.js → chunk-ZDZCUZ4N.js} +34 -9
- package/dist/{chunk-UFBKJOWB.js → chunk-ZPPLFE4N.js} +14 -14
- package/dist/{chunk-WGU6NIUV.js → chunk-ZRP6ZXOF.js} +12 -12
- package/dist/{chunk-7J7UY46S.js → chunk-ZTIMXVV5.js} +2 -2
- package/dist/{chunk-IWZPGIGT.js → chunk-ZWGU46YO.js} +23 -23
- package/dist/files.json +441 -433
- package/dist/packages/sdk/npm/index.js +9 -0
- package/dist/packages/ui/dist/assets/{elk-api-DDup23Us.js → elk-api-D2NcYpUJ.js} +2 -2
- package/dist/packages/ui/dist/assets/index-CT7skl01.js +29 -0
- package/dist/packages/ui/dist/index.html +1 -1
- package/package.json +5 -5
- package/dist/chunk-4Y4FY34K.js +0 -34
- package/dist/chunk-ACWQDL6T.js +0 -37
- package/dist/chunk-ASKDCMW5.js +0 -275
- package/dist/chunk-B3UHYXHU.js +0 -41
- package/dist/chunk-DDAEAZEV.js +0 -54
- package/dist/chunk-E25G46RW.js +0 -54
- package/dist/chunk-KQK6SQPE.js +0 -48
- package/dist/chunk-NCR24CPV.js +0 -41
- package/dist/chunk-NDW4ROST.js +0 -38
- package/dist/chunk-OJN7WME4.js +0 -34
- package/dist/chunk-UFTQIK2J.js +0 -43
- package/dist/chunk-ZHWSL6SR.js +0 -45
- package/dist/packages/ui/dist/assets/index-mTOWhQZm.js +0 -29
|
@@ -5,10 +5,10 @@ var __atticusUrl = (p) => new URL("./" + p, import.meta.url).href;
|
|
|
5
5
|
var __atticusPath = (p) => __atticusFileURLToPath(__atticusUrl(p));
|
|
6
6
|
import {
|
|
7
7
|
readOpenApiDocument
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-34NWVIBC.js";
|
|
9
9
|
import {
|
|
10
10
|
globToRegExp
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-MRLCNXXR.js";
|
|
12
12
|
import {
|
|
13
13
|
DECLARED_TOPIC,
|
|
14
14
|
DEFAULT_CONVENTIONS,
|
|
@@ -40,7 +40,7 @@ import {
|
|
|
40
40
|
staleCite,
|
|
41
41
|
toCanonicalYaml,
|
|
42
42
|
underFolders
|
|
43
|
-
} from "./chunk-
|
|
43
|
+
} from "./chunk-U25OX22K.js";
|
|
44
44
|
|
|
45
45
|
// packages/verify/dist/source.js
|
|
46
46
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
@@ -138,8 +138,11 @@ var FRAMEWORKS = [
|
|
|
138
138
|
var KNOWN = [
|
|
139
139
|
// Java and Kotlin
|
|
140
140
|
["spring-boot*", { name: "spring-boot", topic: "spring", shape: "rest" }],
|
|
141
|
-
// the
|
|
141
|
+
// the annotations a Spring Boot app's main class carries, which a reader may cite instead
|
|
142
|
+
// (matched by `annotationKey`, so bare, qualified or with arguments)
|
|
142
143
|
["@springbootapplication", { name: "spring-boot", topic: "spring", shape: "rest" }],
|
|
144
|
+
["@enableautoconfiguration", { name: "spring-boot", topic: "spring", shape: "rest" }],
|
|
145
|
+
["@quarkusmain", { name: "quarkus", topic: "quarkus" }],
|
|
143
146
|
["spring-webmvc", { name: "spring", topic: "spring", shape: "rest" }],
|
|
144
147
|
["spring-webflux", { name: "spring", topic: "spring", shape: "rest" }],
|
|
145
148
|
["spring-web", { name: "spring", topic: "spring", shape: "rest" }],
|
|
@@ -191,6 +194,10 @@ function declarationKey(declared) {
|
|
|
191
194
|
const name = colon.split(/[=<>~!,\s[]/)[0] ?? colon;
|
|
192
195
|
return name.replace(/^['"]|['"]$/g, "");
|
|
193
196
|
}
|
|
197
|
+
function annotationKey(declared) {
|
|
198
|
+
const m = /^@?(?:[a-z_$][\w$]*\.)*([A-Z][\w$]*)\s*(?:\(.*)?$/s.exec(declared.trim());
|
|
199
|
+
return m ? `@${m[1].toLowerCase()}` : void 0;
|
|
200
|
+
}
|
|
194
201
|
function houseKnown(extra) {
|
|
195
202
|
return extra.map((e) => [
|
|
196
203
|
e.declares.toLowerCase(),
|
|
@@ -205,19 +212,27 @@ function frameworkOf(declared, extra = []) {
|
|
|
205
212
|
const key = declarationKey(declared);
|
|
206
213
|
if (!key)
|
|
207
214
|
return void 0;
|
|
208
|
-
|
|
215
|
+
const table = extra.length ? [...houseKnown(extra), ...KNOWN] : KNOWN;
|
|
216
|
+
for (const [pattern, known] of table) {
|
|
209
217
|
const star = pattern.endsWith("*");
|
|
210
218
|
const p = star ? pattern.slice(0, -1) : pattern;
|
|
211
219
|
if (star ? key.startsWith(p) : key === p)
|
|
212
220
|
return known;
|
|
213
221
|
}
|
|
222
|
+
const ann = annotationKey(declared);
|
|
223
|
+
if (ann) {
|
|
224
|
+
for (const [pattern, known] of table)
|
|
225
|
+
if (pattern === ann)
|
|
226
|
+
return known;
|
|
227
|
+
}
|
|
214
228
|
return void 0;
|
|
215
229
|
}
|
|
216
230
|
function frameworkNameProblem(f, extra = []) {
|
|
217
231
|
const known = frameworkOf(f.cite.value, extra);
|
|
218
232
|
const name = f.name.trim().toLowerCase();
|
|
219
233
|
if (known) {
|
|
220
|
-
|
|
234
|
+
const legacy = annotationKey(f.cite.value) === `@${name}`;
|
|
235
|
+
return name === known.name.toLowerCase() || legacy ? void 0 : `names the framework "${f.name}", but ${f.cite.file}:${f.cite.line} declares ${f.cite.value}, which is ${known.name}`;
|
|
221
236
|
}
|
|
222
237
|
const key = declarationKey(f.cite.value);
|
|
223
238
|
if (declarationKey(name) === key || name === key)
|
|
@@ -339,6 +354,29 @@ function parseReviewed(text) {
|
|
|
339
354
|
}
|
|
340
355
|
var isGlob = (path) => /[*?]/.test(path);
|
|
341
356
|
|
|
357
|
+
// packages/verify/dist/conventions.js
|
|
358
|
+
var SPEC_NAME = /(^|\/)[^/]*(openapi|swagger|asyncapi|api-docs)[^/]*\.(ya?ml|json|xml)$|\.oas\.(ya?ml|json)$/i;
|
|
359
|
+
function rulesOf(c) {
|
|
360
|
+
const folders = underFolders(c.apiSpecFolders, { tail: "(.+/)?[^/]+\\.(ya?ml|json)$" });
|
|
361
|
+
return {
|
|
362
|
+
apiSpec: new RegExp(`${SPEC_NAME.source}|${folders.source}`, "i"),
|
|
363
|
+
notProduct: underFolders(c.notProductFolders),
|
|
364
|
+
notRead: underFolders(c.notReadFolders),
|
|
365
|
+
gatewayBundle: gatewayBundleTest(c.gatewayBundleFolders),
|
|
366
|
+
frameworks: c.frameworks
|
|
367
|
+
};
|
|
368
|
+
}
|
|
369
|
+
var DEFAULT_READ_RULES = rulesOf(DEFAULT_CONVENTIONS);
|
|
370
|
+
var made = /* @__PURE__ */ new WeakMap();
|
|
371
|
+
function readRulesOf(c) {
|
|
372
|
+
if (!c || c === DEFAULT_CONVENTIONS)
|
|
373
|
+
return DEFAULT_READ_RULES;
|
|
374
|
+
let r = made.get(c);
|
|
375
|
+
if (!r)
|
|
376
|
+
made.set(c, r = rulesOf(c));
|
|
377
|
+
return r;
|
|
378
|
+
}
|
|
379
|
+
|
|
342
380
|
// packages/verify/dist/apigee-policy.js
|
|
343
381
|
var MAKES = {
|
|
344
382
|
OAuthV1: ["oauth2"],
|
|
@@ -1319,29 +1357,6 @@ function derivedNamesAt(file, lines, line, env) {
|
|
|
1319
1357
|
return out;
|
|
1320
1358
|
}
|
|
1321
1359
|
|
|
1322
|
-
// packages/verify/dist/conventions.js
|
|
1323
|
-
var SPEC_NAME = /(^|\/)[^/]*(openapi|swagger|asyncapi|api-docs)[^/]*\.(ya?ml|json|xml)$|\.oas\.(ya?ml|json)$/i;
|
|
1324
|
-
function rulesOf(c) {
|
|
1325
|
-
const folders = underFolders(c.apiSpecFolders, { tail: "(.+/)?[^/]+\\.(ya?ml|json)$" });
|
|
1326
|
-
return {
|
|
1327
|
-
apiSpec: new RegExp(`${SPEC_NAME.source}|${folders.source}`, "i"),
|
|
1328
|
-
notProduct: underFolders(c.notProductFolders),
|
|
1329
|
-
notRead: underFolders(c.notReadFolders),
|
|
1330
|
-
gatewayBundle: gatewayBundleTest(c.gatewayBundleFolders),
|
|
1331
|
-
frameworks: c.frameworks
|
|
1332
|
-
};
|
|
1333
|
-
}
|
|
1334
|
-
var DEFAULT_READ_RULES = rulesOf(DEFAULT_CONVENTIONS);
|
|
1335
|
-
var made = /* @__PURE__ */ new WeakMap();
|
|
1336
|
-
function readRulesOf(c) {
|
|
1337
|
-
if (!c || c === DEFAULT_CONVENTIONS)
|
|
1338
|
-
return DEFAULT_READ_RULES;
|
|
1339
|
-
let r = made.get(c);
|
|
1340
|
-
if (!r)
|
|
1341
|
-
made.set(c, r = rulesOf(c));
|
|
1342
|
-
return r;
|
|
1343
|
-
}
|
|
1344
|
-
|
|
1345
1360
|
// packages/verify/dist/not-product.js
|
|
1346
1361
|
var LOCALE_BUNDLE = /(^|\/)(i18n|l10n|locales?|lang|langs|languages|translations?)\/(.+\/)?[^/]+\.(json|ya?ml|properties)$|(^|\/)res\/values[^/]*\/(strings|plurals|arrays)\.xml$/i;
|
|
1347
1362
|
function isLocaleBundle(path) {
|
|
@@ -1403,6 +1418,142 @@ function pageRouteMatches(file, lines, exists, path) {
|
|
|
1403
1418
|
return norm(route) === norm(path);
|
|
1404
1419
|
}
|
|
1405
1420
|
|
|
1421
|
+
// packages/verify/dist/reachable.js
|
|
1422
|
+
var CODE = /\.(java|kt|kts|scala|groovy|cs|vb|fs|py|rb|go|rs|php|swift|ts|tsx|js|mjs|cjs|dart)$/i;
|
|
1423
|
+
var MODEL_DIR = /(^|\/)(models?|dtos?|payloads?|schemas?|pojos?|beans|viewmodels?)\//i;
|
|
1424
|
+
var MODEL_NAME = /(dto|request|response|payload|model|body)$/i;
|
|
1425
|
+
var MODEL_PART = /[._-](dto|model|schema|payload|request|response)\.[^/.]+$/i;
|
|
1426
|
+
var MAPS_TABLE = /@Entity\b|@Table\b|@Document\b|\[Table\(|__tablename__|models\.Model\b|@Entity\(|\bgorm\.Model\b/;
|
|
1427
|
+
var ROOT_PART = /[._-](controller|resolver|gateway|handlers?|router|routes?|consumer|listener|subscriber|client|publisher|producer|endpoints?)\.[^/.]+$/i;
|
|
1428
|
+
var CLIENT_NAME = /(client|gateway|publisher|producer|sender|feign|proxy|connector)$/i;
|
|
1429
|
+
var CLIENT_DIR = /(^|\/)(clients?|gateways?|integrations?|publishers?|producers?|outbound)\//i;
|
|
1430
|
+
var base = (path) => path.slice(path.lastIndexOf("/") + 1);
|
|
1431
|
+
var stem = (path) => {
|
|
1432
|
+
const b = base(path);
|
|
1433
|
+
const dot = b.indexOf(".");
|
|
1434
|
+
return dot > 0 ? b.slice(0, dot) : b;
|
|
1435
|
+
};
|
|
1436
|
+
function isModelFile(path, text) {
|
|
1437
|
+
if (!CODE.test(path) || readingRank(path) === 5)
|
|
1438
|
+
return false;
|
|
1439
|
+
if (!MODEL_DIR.test(path) && !MODEL_NAME.test(stem(path)) && !MODEL_PART.test(path))
|
|
1440
|
+
return false;
|
|
1441
|
+
return text === void 0 || !MAPS_TABLE.test(text);
|
|
1442
|
+
}
|
|
1443
|
+
var ENTRY_POINT_NAME = /(controller|resource|router|routes?|handlers?|listener|consumer|subscriber|endpoints?|servlet|webhook|resolver)$/i;
|
|
1444
|
+
var ENTRY_POINT_DIR = /(^|\/)(controllers?|routes|routers|handlers|endpoints|listeners|consumers)\//i;
|
|
1445
|
+
var ENTRY_POINT_PART = /[._-](controller|resolver|handlers?|router|routes?|consumer|listener|subscriber|endpoints?)\.[^/.]+$/i;
|
|
1446
|
+
function isEntryPointFile(path) {
|
|
1447
|
+
if (!CODE.test(path) || readingRank(path) === 5 || isModelFile(path))
|
|
1448
|
+
return false;
|
|
1449
|
+
return ENTRY_POINT_NAME.test(stem(path)) || ENTRY_POINT_DIR.test(path) || ENTRY_POINT_PART.test(path);
|
|
1450
|
+
}
|
|
1451
|
+
function isRootFile(path) {
|
|
1452
|
+
if (!CODE.test(path) || readingRank(path) === 5 || isModelFile(path))
|
|
1453
|
+
return false;
|
|
1454
|
+
return readingRank(path) === 2 || isEntryPointFile(path) || ROOT_PART.test(path) || CLIENT_NAME.test(stem(path)) || CLIENT_DIR.test(path);
|
|
1455
|
+
}
|
|
1456
|
+
var DECLARES = /\b(?:class|record|interface|struct|enum|object)\s+([A-Za-z_][A-Za-z0-9_]*)|^\s*(?:export\s+)?(?:declare\s+)?type\s+([A-Za-z_][A-Za-z0-9_]*)/gm;
|
|
1457
|
+
var IDENT = /[A-Za-z_][A-Za-z0-9_]*/g;
|
|
1458
|
+
function declaredTypes(path, text) {
|
|
1459
|
+
const out = [];
|
|
1460
|
+
const s = stem(path);
|
|
1461
|
+
if (/^[A-Z][A-Za-z0-9_]*$/.test(s))
|
|
1462
|
+
out.push(s);
|
|
1463
|
+
for (const m of text.matchAll(DECLARES)) {
|
|
1464
|
+
const n = m[1] ?? m[2];
|
|
1465
|
+
if (n && !out.includes(n))
|
|
1466
|
+
out.push(n);
|
|
1467
|
+
}
|
|
1468
|
+
return out;
|
|
1469
|
+
}
|
|
1470
|
+
function identifiers(text) {
|
|
1471
|
+
return [...new Set(text.match(IDENT) ?? [])];
|
|
1472
|
+
}
|
|
1473
|
+
var NOT_REACHED_WHY = "model classes no entry point, call or field fact reaches (ADR 0169): left out of the read; atticus map <repo> --models all reads them";
|
|
1474
|
+
function reachableModels(o) {
|
|
1475
|
+
const texts = /* @__PURE__ */ new Map();
|
|
1476
|
+
const textOf = (p) => {
|
|
1477
|
+
if (!texts.has(p))
|
|
1478
|
+
texts.set(p, o.read(p) ?? "");
|
|
1479
|
+
return texts.get(p);
|
|
1480
|
+
};
|
|
1481
|
+
const ordered = readingOrder(o.paths);
|
|
1482
|
+
const models = ordered.filter((p) => isModelFile(p, textOf(p))).sort();
|
|
1483
|
+
const isModel = new Set(models);
|
|
1484
|
+
const byName = /* @__PURE__ */ new Map();
|
|
1485
|
+
const declared = /* @__PURE__ */ new Map();
|
|
1486
|
+
for (const p of models) {
|
|
1487
|
+
const names = declaredTypes(p, textOf(p));
|
|
1488
|
+
declared.set(p, names);
|
|
1489
|
+
for (const n of names)
|
|
1490
|
+
byName.set(n, [...byName.get(n) ?? [], p]);
|
|
1491
|
+
}
|
|
1492
|
+
const known = new Set(o.paths);
|
|
1493
|
+
const roots = [];
|
|
1494
|
+
const addRoot = (p) => {
|
|
1495
|
+
if (known.has(p) && !isModel.has(p) && !roots.includes(p))
|
|
1496
|
+
roots.push(p);
|
|
1497
|
+
};
|
|
1498
|
+
const facts = o.facts ?? [];
|
|
1499
|
+
for (const f of facts)
|
|
1500
|
+
if (f.kind === "entry" || f.kind === "call")
|
|
1501
|
+
for (const p of citedFiles(f))
|
|
1502
|
+
addRoot(p);
|
|
1503
|
+
for (const p of ordered)
|
|
1504
|
+
if (isRootFile(p))
|
|
1505
|
+
addRoot(p);
|
|
1506
|
+
const reached = /* @__PURE__ */ new Map();
|
|
1507
|
+
const queue = [];
|
|
1508
|
+
const reach = (names, from, own = []) => {
|
|
1509
|
+
for (const n of names) {
|
|
1510
|
+
if (own.includes(n))
|
|
1511
|
+
continue;
|
|
1512
|
+
for (const p of byName.get(n) ?? []) {
|
|
1513
|
+
const r = reached.get(p);
|
|
1514
|
+
if (r) {
|
|
1515
|
+
if (r.from === from && !r.types.includes(n))
|
|
1516
|
+
r.types.push(n);
|
|
1517
|
+
continue;
|
|
1518
|
+
}
|
|
1519
|
+
reached.set(p, { path: p, types: [n], from });
|
|
1520
|
+
queue.push(p);
|
|
1521
|
+
}
|
|
1522
|
+
}
|
|
1523
|
+
};
|
|
1524
|
+
for (const p of roots)
|
|
1525
|
+
reach(identifiers(textOf(p)), p);
|
|
1526
|
+
for (const f of facts) {
|
|
1527
|
+
for (const p of citedFiles(f))
|
|
1528
|
+
if (isModel.has(p) && !reached.has(p)) {
|
|
1529
|
+
reached.set(p, { path: p, types: [...(declared.get(p) ?? []).slice(0, 1)], from: f.id });
|
|
1530
|
+
queue.push(p);
|
|
1531
|
+
}
|
|
1532
|
+
if (f.kind === "field")
|
|
1533
|
+
reach(identifiers([f.type ?? "", f.transform === "message type" ? f.name : ""].join(" ")), f.id);
|
|
1534
|
+
}
|
|
1535
|
+
const rooted = roots.length > 0 || reached.size > 0;
|
|
1536
|
+
if (!rooted)
|
|
1537
|
+
return {
|
|
1538
|
+
rooted,
|
|
1539
|
+
roots,
|
|
1540
|
+
reached: models.map((p) => ({ path: p, types: declared.get(p) ?? [], from: "" })),
|
|
1541
|
+
notReached: [],
|
|
1542
|
+
models: models.length
|
|
1543
|
+
};
|
|
1544
|
+
for (let i = 0; i < queue.length; i++) {
|
|
1545
|
+
const p = queue[i];
|
|
1546
|
+
reach(identifiers(textOf(p)), p, declared.get(p));
|
|
1547
|
+
}
|
|
1548
|
+
return {
|
|
1549
|
+
rooted,
|
|
1550
|
+
roots,
|
|
1551
|
+
reached: queue.map((p) => reached.get(p)),
|
|
1552
|
+
notReached: models.filter((p) => !reached.has(p)),
|
|
1553
|
+
models: models.length
|
|
1554
|
+
};
|
|
1555
|
+
}
|
|
1556
|
+
|
|
1406
1557
|
// packages/verify/dist/method.js
|
|
1407
1558
|
var HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]);
|
|
1408
1559
|
function wordsOf(line) {
|
|
@@ -1495,6 +1646,17 @@ var topicContext = (line) => {
|
|
|
1495
1646
|
const w = wordsOf2(line);
|
|
1496
1647
|
return w.some((x) => TOPIC_WORDS.has(x)) || w.join(" ").includes("routing key");
|
|
1497
1648
|
};
|
|
1649
|
+
var BUILD_KEY_WORDS = new Set("scm git gitlab github bitbucket repository repositories repo registry mirror mirrors nexus artifactory snapshot snapshots distribution maven npm nuget pypi sonar sonarqube jenkins ci".split(" "));
|
|
1650
|
+
var BUILD_BLOCK_TAG = /<(\/?)(repositories|repository|pluginRepositories|pluginRepository|snapshotRepository|distributionManagement|scm|mirrors|mirror|site)\b[^>]*?(\/?)>/gi;
|
|
1651
|
+
var BUILD_BLOCK_OPEN = /\b(repositories|publishing|pluginManagement|dependencyResolutionManagement)\s*\{/;
|
|
1652
|
+
var keysBefore = (prefix) => [
|
|
1653
|
+
...[...prefix.matchAll(/<([A-Za-z][\w:.-]*)/g)].map((m) => m[1]),
|
|
1654
|
+
...[...prefix.matchAll(/["']?([A-Za-z][\w.-]*)["']?\s*[:=]/g)].map((m) => m[1]),
|
|
1655
|
+
...[...prefix.matchAll(/\b([A-Za-z]\w*)\s*\{/g)].map((m) => m[1])
|
|
1656
|
+
];
|
|
1657
|
+
var isBuildUrl = (u, prefix) => /\.git\/?$/i.test(u) || /\bscm:\w+:$/i.test(prefix) || keysBefore(prefix).some((k) => wordsOf2(k).some((w) => BUILD_KEY_WORDS.has(w)));
|
|
1658
|
+
var HEADER_ARG = /header\w*\s*(?:\.\s*\w+\s*)?\(\s*(?:(?:value|name)\s*=\s*)?$/i;
|
|
1659
|
+
var isHeaderName = (s, prefix) => /^x-/i.test(s) || HEADER_ARG.test(prefix.replace(/["'`]$/, ""));
|
|
1498
1660
|
var cleanUrl = (u) => u.replace(/[.:]+$/, "").replace(/^([a-z0-9+.-]+:\/\/)[^/@\s]+@/i, "$1<redacted>@");
|
|
1499
1661
|
var hostOf = (u) => /^[a-z0-9+.-]+:\/\/([^/:?#]+)/i.exec(u)?.[1] ?? "";
|
|
1500
1662
|
function pathOf(s) {
|
|
@@ -1544,9 +1706,19 @@ function codeOf(raw, state) {
|
|
|
1544
1706
|
function candidatesIn(path, lines) {
|
|
1545
1707
|
const out = [];
|
|
1546
1708
|
const state = {};
|
|
1709
|
+
let xmlDepth = 0;
|
|
1710
|
+
let braceDepth = 0;
|
|
1547
1711
|
lines.forEach((raw, i) => {
|
|
1548
1712
|
const wasBlock = state.block !== void 0;
|
|
1549
1713
|
let code2 = codeOf(raw, state);
|
|
1714
|
+
const inBuild = xmlDepth > 0 || braceDepth > 0;
|
|
1715
|
+
for (const m of code2.matchAll(BUILD_BLOCK_TAG))
|
|
1716
|
+
if (!m[3])
|
|
1717
|
+
xmlDepth = Math.max(0, xmlDepth + (m[1] ? -1 : 1));
|
|
1718
|
+
if (braceDepth > 0 || BUILD_BLOCK_OPEN.test(code2)) {
|
|
1719
|
+
const from = braceDepth > 0 ? code2 : code2.slice(BUILD_BLOCK_OPEN.exec(code2).index);
|
|
1720
|
+
braceDepth = Math.max(0, braceDepth + (from.match(/\{/g)?.length ?? 0) - (from.match(/\}/g)?.length ?? 0));
|
|
1721
|
+
}
|
|
1550
1722
|
if (!code2.trim())
|
|
1551
1723
|
return;
|
|
1552
1724
|
if (!wasBlock && isCommentLine(raw))
|
|
@@ -1565,19 +1737,24 @@ function candidatesIn(path, lines) {
|
|
|
1565
1737
|
};
|
|
1566
1738
|
const context = topicContext(code2);
|
|
1567
1739
|
const urls = [];
|
|
1740
|
+
const opened = inBuild || xmlDepth > 0 || braceDepth > 0;
|
|
1568
1741
|
for (const m of code2.matchAll(URL_RE)) {
|
|
1569
1742
|
const u = cleanUrl(m[0]);
|
|
1570
|
-
|
|
1743
|
+
const build = opened || isBuildUrl(u, code2.slice(0, m.index));
|
|
1744
|
+
if (!build && !STANDARD_HOST.test(hostOf(u)))
|
|
1571
1745
|
add("url", u);
|
|
1572
1746
|
urls.push(m[0]);
|
|
1573
1747
|
}
|
|
1574
|
-
const strings2 = [...code2.matchAll(QUOTED)].map((m) =>
|
|
1748
|
+
const strings2 = [...code2.matchAll(QUOTED)].map((m) => ({
|
|
1749
|
+
s: m[2],
|
|
1750
|
+
before: code2.slice(0, m.index + 1)
|
|
1751
|
+
}));
|
|
1575
1752
|
const kv = KEY_VALUE.exec(code2);
|
|
1576
1753
|
if (kv)
|
|
1577
|
-
strings2.push(kv[2]);
|
|
1754
|
+
strings2.push({ s: kv[2], before: "" });
|
|
1578
1755
|
for (const m of code2.matchAll(ELEMENT_TEXT))
|
|
1579
|
-
strings2.push(m[2]);
|
|
1580
|
-
for (const s of strings2) {
|
|
1756
|
+
strings2.push({ s: m[2], before: "" });
|
|
1757
|
+
for (const { s, before } of strings2) {
|
|
1581
1758
|
if (urls.some((u) => s.includes(u) || u.includes(s)))
|
|
1582
1759
|
continue;
|
|
1583
1760
|
const p = pathOf(s);
|
|
@@ -1586,7 +1763,7 @@ function candidatesIn(path, lines) {
|
|
|
1586
1763
|
continue;
|
|
1587
1764
|
}
|
|
1588
1765
|
const t = topicOf(s, context);
|
|
1589
|
-
if (t)
|
|
1766
|
+
if (t && !isHeaderName(t, before))
|
|
1590
1767
|
add("topic", t);
|
|
1591
1768
|
}
|
|
1592
1769
|
});
|
|
@@ -2158,23 +2335,23 @@ async function verifyFacts(o) {
|
|
|
2158
2335
|
const accepted = facts.filter((f) => !rejected.has(f.id)).map((f) => {
|
|
2159
2336
|
o.room?.();
|
|
2160
2337
|
const verified = f.by === "person" && f.verified !== "none" ? f.verified : "line";
|
|
2161
|
-
const
|
|
2162
|
-
if (
|
|
2338
|
+
const base2 = { ...f, verified, cite: fixQuote(f.cite) };
|
|
2339
|
+
if (base2.kind === "entry" && base2.auth !== void 0 && !base2.authCite && f.by !== "person")
|
|
2163
2340
|
authUncited.push({
|
|
2164
|
-
id:
|
|
2165
|
-
auth:
|
|
2166
|
-
cite: `${
|
|
2341
|
+
id: base2.id,
|
|
2342
|
+
auth: base2.auth,
|
|
2343
|
+
cite: `${base2.cite.file}:${base2.cite.line}`
|
|
2167
2344
|
});
|
|
2168
|
-
const unseen = methodUnseenOf(
|
|
2345
|
+
const unseen = methodUnseenOf(base2, linesOf2, factById);
|
|
2169
2346
|
if (unseen)
|
|
2170
2347
|
methodUnseen.push(unseen);
|
|
2171
|
-
if (
|
|
2348
|
+
if (base2.kind === "flow")
|
|
2172
2349
|
return {
|
|
2173
|
-
...
|
|
2174
|
-
steps:
|
|
2175
|
-
errors:
|
|
2350
|
+
...base2,
|
|
2351
|
+
steps: base2.steps.map((s) => ({ ...s, cite: fixQuote(s.cite) })),
|
|
2352
|
+
errors: base2.errors.map((e) => ({ ...e, cite: fixQuote(e.cite) }))
|
|
2176
2353
|
};
|
|
2177
|
-
return
|
|
2354
|
+
return base2;
|
|
2178
2355
|
});
|
|
2179
2356
|
const excludeRes = (o.exclude ?? []).map(globToRegExp);
|
|
2180
2357
|
const sources = [];
|
|
@@ -2243,6 +2420,11 @@ async function verifyFacts(o) {
|
|
|
2243
2420
|
refuse("is not in the repo at this commit; name a file you read");
|
|
2244
2421
|
continue;
|
|
2245
2422
|
}
|
|
2423
|
+
const entryPoints = re ? matched.filter((p) => isSource.has(p) && !touched.has(p) && isEntryPointFile(p)) : [];
|
|
2424
|
+
if (entryPoints.length) {
|
|
2425
|
+
refuse(`covers ${entryPoints[0]}, an entry point (a controller, route, handler or listener)${entryPoints.length > 1 ? ` and ${entryPoints.length - 1} more` : ""} no fact cites: read it, and write its entries and the fields of the classes it takes and returns; never mark an entry point reviewed with a glob (name it alone if it truly holds nothing)`);
|
|
2426
|
+
continue;
|
|
2427
|
+
}
|
|
2246
2428
|
const files = matched.filter((p) => isSource.has(p) && !touched.has(p)).sort();
|
|
2247
2429
|
for (const p of files)
|
|
2248
2430
|
reviewedSet.add(p);
|
|
@@ -2252,7 +2434,9 @@ async function verifyFacts(o) {
|
|
|
2252
2434
|
}
|
|
2253
2435
|
const read = sources.filter((p) => touched.has(p)).sort();
|
|
2254
2436
|
const reviewedFiles = sources.filter((p) => reviewedSet.has(p)).sort();
|
|
2255
|
-
const
|
|
2437
|
+
const leftOut = new Set(o.notReached ?? []);
|
|
2438
|
+
const notReached = sources.filter((p) => leftOut.has(p) && !touched.has(p) && !reviewedSet.has(p)).sort();
|
|
2439
|
+
const unknown = sources.filter((p) => !touched.has(p) && !reviewedSet.has(p) && !leftOut.has(p)).sort();
|
|
2256
2440
|
const total = read.length + reviewedFiles.length + unknown.length;
|
|
2257
2441
|
const ratio = total === 0 ? 1 : Math.round(read.length / total * 1e3) / 1e3;
|
|
2258
2442
|
const ix = indexFacts(accepted);
|
|
@@ -2285,7 +2469,14 @@ async function verifyFacts(o) {
|
|
|
2285
2469
|
accepted,
|
|
2286
2470
|
// a rejected fact goes back as it was read, at its own commit, even one that was carried
|
|
2287
2471
|
rejected: [...rejected.values()].map((r) => carriedFrom.has(r.fact.id) ? { ...r, fact: { ...r.fact, commit: carriedFrom.get(r.fact.id) } } : r).sort((a, b) => a.fact.id < b.fact.id ? -1 : a.fact.id > b.fact.id ? 1 : 0),
|
|
2288
|
-
coverage: {
|
|
2472
|
+
coverage: {
|
|
2473
|
+
read,
|
|
2474
|
+
reviewed: reviewedFiles,
|
|
2475
|
+
unknown,
|
|
2476
|
+
excluded: excluded.sort(),
|
|
2477
|
+
notReached,
|
|
2478
|
+
ratio
|
|
2479
|
+
},
|
|
2289
2480
|
redacted,
|
|
2290
2481
|
quotesDropped,
|
|
2291
2482
|
carried: accepted.flatMap((f) => carriedFrom.has(f.id) ? [{ id: f.id, from: carriedFrom.get(f.id) }] : []),
|
|
@@ -2313,10 +2504,10 @@ var BOUNDARY_NAME = /(client|gateway|repository|repo|dao|mapper|entity|model|dto
|
|
|
2313
2504
|
var BOUNDARY_FILE = /\.(sql|proto|graphql|gql|avsc|wsdl|xsd)$|(^|\/)(openapi|swagger)[^/]*\.(ya?ml|json)$/i;
|
|
2314
2505
|
var BOUNDARY_DIR = /(^|\/)(clients?|gateways?|repositories|dao|models?|entities|dto|migrations?)\//i;
|
|
2315
2506
|
var TEST = /(^|\/)(test|tests|__tests__|spec|specs|e2e|it)\/|[._-](test|spec)\.[^/.]+$|(Test|Tests|IT|Spec)\.[^/.]+$|(^|\/)test_[^/]+$|_test\.go$/;
|
|
2316
|
-
var
|
|
2317
|
-
const
|
|
2318
|
-
const dot =
|
|
2319
|
-
return dot > 0 ?
|
|
2507
|
+
var stem2 = (path) => {
|
|
2508
|
+
const base2 = path.slice(path.lastIndexOf("/") + 1);
|
|
2509
|
+
const dot = base2.indexOf(".");
|
|
2510
|
+
return dot > 0 ? base2.slice(0, dot) : base2;
|
|
2320
2511
|
};
|
|
2321
2512
|
function readingRank(path) {
|
|
2322
2513
|
if (TEST.test(path))
|
|
@@ -2325,7 +2516,7 @@ function readingRank(path) {
|
|
|
2325
2516
|
return 0;
|
|
2326
2517
|
if (CONFIG.test(path))
|
|
2327
2518
|
return 1;
|
|
2328
|
-
const s =
|
|
2519
|
+
const s = stem2(path);
|
|
2329
2520
|
if (ENTRY_NAME.test(s) || ENTRY_DIR.test(path))
|
|
2330
2521
|
return 2;
|
|
2331
2522
|
if (BOUNDARY_NAME.test(s) || BOUNDARY_FILE.test(path) || BOUNDARY_DIR.test(path))
|
|
@@ -2441,6 +2632,8 @@ function planBatches(source, o) {
|
|
|
2441
2632
|
const rules = readRulesOf(o.conventions);
|
|
2442
2633
|
const excludeRes = (o.exclude ?? []).map(globToRegExp);
|
|
2443
2634
|
const excluded = [];
|
|
2635
|
+
const leaveOut = new Set(o.reach?.leaveOut ?? []);
|
|
2636
|
+
const notReached = [];
|
|
2444
2637
|
const paths = [];
|
|
2445
2638
|
const texts = /* @__PURE__ */ new Map();
|
|
2446
2639
|
for (const p of source.list()) {
|
|
@@ -2456,6 +2649,10 @@ function planBatches(source, o) {
|
|
|
2456
2649
|
}
|
|
2457
2650
|
if (!text.trim())
|
|
2458
2651
|
continue;
|
|
2652
|
+
if (leaveOut.has(p)) {
|
|
2653
|
+
notReached.push(p);
|
|
2654
|
+
continue;
|
|
2655
|
+
}
|
|
2459
2656
|
paths.push(p);
|
|
2460
2657
|
texts.set(p, text);
|
|
2461
2658
|
}
|
|
@@ -2471,7 +2668,7 @@ function planBatches(source, o) {
|
|
|
2471
2668
|
const slices = [];
|
|
2472
2669
|
let lines = 0;
|
|
2473
2670
|
let leastRoom = room;
|
|
2474
|
-
for (const path of
|
|
2671
|
+
for (const path of reachOrder(paths, o.reach?.first)) {
|
|
2475
2672
|
const kinds2 = fileKinds(path, rules);
|
|
2476
2673
|
const left = room - overhead(kinds2);
|
|
2477
2674
|
leastRoom = Math.min(leastRoom, left);
|
|
@@ -2520,9 +2717,20 @@ function planBatches(source, o) {
|
|
|
2520
2717
|
tokens: slices.reduce((n, s) => n + s.tokens, 0),
|
|
2521
2718
|
batches,
|
|
2522
2719
|
excluded: excluded.sort(),
|
|
2523
|
-
leastRoom
|
|
2720
|
+
leastRoom,
|
|
2721
|
+
notReached: notReached.sort()
|
|
2524
2722
|
};
|
|
2525
2723
|
}
|
|
2724
|
+
function reachOrder(paths, first) {
|
|
2725
|
+
const order = readingOrder(paths);
|
|
2726
|
+
if (!first?.length)
|
|
2727
|
+
return order;
|
|
2728
|
+
const has = new Set(paths);
|
|
2729
|
+
const head = order.filter((p) => readingRank(p) <= 1);
|
|
2730
|
+
const lead = [...new Set(first)].filter((p) => has.has(p) && readingRank(p) > 1);
|
|
2731
|
+
const taken = /* @__PURE__ */ new Set([...head, ...lead]);
|
|
2732
|
+
return [...head, ...lead, ...order.filter((p) => !taken.has(p))];
|
|
2733
|
+
}
|
|
2526
2734
|
|
|
2527
2735
|
// packages/verify/dist/vendored.js
|
|
2528
2736
|
var LICENSE_FILE = /^(LICEN[CS]E|COPYING)([._-][^/]*)?$/i;
|
|
@@ -2830,27 +3038,101 @@ function unitsOf(dir, fs, room) {
|
|
|
2830
3038
|
out.push(...unitsOf(child, children.get(child), room));
|
|
2831
3039
|
return out;
|
|
2832
3040
|
}
|
|
2833
|
-
function
|
|
3041
|
+
function groupUnits(dir, fs, room, holds) {
|
|
3042
|
+
const prefix = dir ? `${dir}/` : "";
|
|
3043
|
+
const direct = [];
|
|
3044
|
+
const children = /* @__PURE__ */ new Map();
|
|
3045
|
+
for (const f of fs) {
|
|
3046
|
+
const rest = f.path.slice(prefix.length);
|
|
3047
|
+
const slash = rest.indexOf("/");
|
|
3048
|
+
if (slash < 0)
|
|
3049
|
+
direct.push(f);
|
|
3050
|
+
else {
|
|
3051
|
+
const child = prefix + rest.slice(0, slash);
|
|
3052
|
+
children.set(child, [...children.get(child) ?? [], f]);
|
|
3053
|
+
}
|
|
3054
|
+
}
|
|
3055
|
+
if (dir && holds(dir, true, fs.length) && (sum(fs) <= room || !children.size))
|
|
3056
|
+
return [{ glob: `${dir}/**`, files: fs.length, tokens: sum(fs) }];
|
|
3057
|
+
const out = [];
|
|
3058
|
+
if (direct.length) {
|
|
3059
|
+
if (holds(dir, false, direct.length))
|
|
3060
|
+
out.push({ glob: `${prefix}*`, files: direct.length, tokens: sum(direct) });
|
|
3061
|
+
else
|
|
3062
|
+
for (const f of [...direct].sort((a, b) => byPath2(a.path, b.path)))
|
|
3063
|
+
out.push({ glob: f.path, files: 1, tokens: f.tokens });
|
|
3064
|
+
}
|
|
3065
|
+
for (const child of [...children.keys()].sort(byPath2))
|
|
3066
|
+
out.push(...groupUnits(child, children.get(child), room, holds));
|
|
3067
|
+
return out;
|
|
3068
|
+
}
|
|
3069
|
+
function rangeUnits(f, room) {
|
|
3070
|
+
return lineRanges({ ...f, lines: f.lines }, room).map((r, i) => ({
|
|
3071
|
+
glob: `${f.path}#L${r.from}-L${r.to}`,
|
|
3072
|
+
files: i === 0 ? 1 : 0,
|
|
3073
|
+
tokens: r.tokens
|
|
3074
|
+
}));
|
|
3075
|
+
}
|
|
3076
|
+
function orderedUnits(files, room, o) {
|
|
3077
|
+
const isBig = (f) => f.tokens > room && (f.lines ?? 0) > 1;
|
|
3078
|
+
const byFile = new Map(files.map((f) => [f.path, f]));
|
|
3079
|
+
const head = new Set(o.head.filter((p) => byFile.has(p)));
|
|
3080
|
+
const models = [...new Set(o.models)].filter((p) => byFile.has(p) && !head.has(p));
|
|
3081
|
+
const inModels = new Set(models);
|
|
3082
|
+
const rest = files.filter((f) => !head.has(f.path) && !inModels.has(f.path));
|
|
3083
|
+
const all2 = [...files.map((f) => f.path), ...o.leftOut];
|
|
3084
|
+
const counts = () => {
|
|
3085
|
+
const deep = /* @__PURE__ */ new Map();
|
|
3086
|
+
const own = /* @__PURE__ */ new Map();
|
|
3087
|
+
const count = (m, k) => m.set(k, (m.get(k) ?? 0) + 1);
|
|
3088
|
+
for (const p of all2) {
|
|
3089
|
+
const parts = p.split("/");
|
|
3090
|
+
count(own, parts.slice(0, -1).join("/"));
|
|
3091
|
+
for (let d = 1; d < parts.length; d++)
|
|
3092
|
+
count(deep, parts.slice(0, d).join("/"));
|
|
3093
|
+
}
|
|
3094
|
+
return (dir, isDeep, n) => (isDeep ? deep.get(dir) : own.get(dir)) === n;
|
|
3095
|
+
};
|
|
3096
|
+
const holds = counts();
|
|
3097
|
+
const unitsOfGroup = (group) => {
|
|
3098
|
+
const small = group.filter((f) => !isBig(f)).sort((a, b) => byPath2(a.path, b.path));
|
|
3099
|
+
const out = groupUnits("", small, room, holds);
|
|
3100
|
+
for (const f of group.filter(isBig))
|
|
3101
|
+
out.push(...rangeUnits(f, room));
|
|
3102
|
+
return out;
|
|
3103
|
+
};
|
|
3104
|
+
return [
|
|
3105
|
+
...unitsOfGroup(files.filter((f) => head.has(f.path))),
|
|
3106
|
+
...models.flatMap((p) => {
|
|
3107
|
+
const f = byFile.get(p);
|
|
3108
|
+
return isBig(f) ? rangeUnits(f, room) : [{ glob: p, files: 1, tokens: f.tokens }];
|
|
3109
|
+
}),
|
|
3110
|
+
...unitsOfGroup(rest)
|
|
3111
|
+
];
|
|
3112
|
+
}
|
|
3113
|
+
function planParts(files, room = SESSION_TOKENS, order) {
|
|
2834
3114
|
const total = sum(files);
|
|
2835
3115
|
if (total <= room)
|
|
2836
3116
|
return [];
|
|
2837
|
-
|
|
2838
|
-
|
|
2839
|
-
|
|
2840
|
-
|
|
2841
|
-
|
|
2842
|
-
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
|
|
2846
|
-
|
|
2847
|
-
|
|
2848
|
-
|
|
2849
|
-
|
|
2850
|
-
|
|
2851
|
-
|
|
2852
|
-
...
|
|
2853
|
-
|
|
3117
|
+
let units;
|
|
3118
|
+
if (order)
|
|
3119
|
+
units = orderedUnits(files, room, order);
|
|
3120
|
+
else {
|
|
3121
|
+
const big = files.filter((f) => f.tokens > room && (f.lines ?? 0) > 1);
|
|
3122
|
+
const rest = files.filter((f) => !big.includes(f));
|
|
3123
|
+
const ranges = [];
|
|
3124
|
+
for (const f of big)
|
|
3125
|
+
for (const [i, r] of lineRanges({ ...f, lines: f.lines }, room).entries())
|
|
3126
|
+
ranges.push({
|
|
3127
|
+
glob: `${f.path}#L${r.from}-L${r.to}`,
|
|
3128
|
+
files: i === 0 ? 1 : 0,
|
|
3129
|
+
tokens: r.tokens,
|
|
3130
|
+
key: `${f.path}\0${String(r.start).padStart(12, "0")}`
|
|
3131
|
+
});
|
|
3132
|
+
const sorted = [...rest].sort((a, b) => byPath2(a.path, b.path));
|
|
3133
|
+
const keyOf = (g) => g.replace(/\/?\*\*?$/, "");
|
|
3134
|
+
units = [...unitsOf("", sorted, room).map((u) => ({ ...u, key: keyOf(u.glob) })), ...ranges].sort((a, b) => byPath2(a.key, b.key)).map(({ key: _k, ...u }) => u);
|
|
3135
|
+
}
|
|
2854
3136
|
const target = total / Math.ceil(total / room);
|
|
2855
3137
|
const parts = [];
|
|
2856
3138
|
let current;
|
|
@@ -2879,7 +3161,7 @@ function split(cite2) {
|
|
|
2879
3161
|
const m = /^(.+):(\d+)$/.exec(cite2);
|
|
2880
3162
|
return m ? { file: m[1], line: Number(m[2]) } : void 0;
|
|
2881
3163
|
}
|
|
2882
|
-
function planGaps(from, size, room) {
|
|
3164
|
+
function planGaps(from, size, room, o = {}) {
|
|
2883
3165
|
const whole = new Set(from.unknown ?? []);
|
|
2884
3166
|
const lines = /* @__PURE__ */ new Map();
|
|
2885
3167
|
const note = (cite2, why) => {
|
|
@@ -2895,14 +3177,15 @@ function planGaps(from, size, room) {
|
|
|
2895
3177
|
for (const h of from.reviewedHolds ?? [])
|
|
2896
3178
|
for (const s of h.skipped)
|
|
2897
3179
|
note(s.cite, `writes the ${s.kind} ${quoted2(s.value)}, but ${quoted2(h.path)} is reviewed as ${quoted2(h.why)}: write its fact, or narrow the reviewed line`);
|
|
2898
|
-
for (const
|
|
2899
|
-
note(
|
|
3180
|
+
for (const o2 of from.specOpsUncovered ?? [])
|
|
3181
|
+
note(o2.cite, `declares ${o2.method} ${quoted2(o2.path)}, which no entry covers: find the code that serves it`);
|
|
2900
3182
|
for (const e of from.entriesNoFlowFollows ?? [])
|
|
2901
3183
|
note(e.cite, `is ${e.id} (${[e.entryType, e.method, quoted2(e.path)].filter(Boolean).join(" ")}), which no flow follows: write its flow`);
|
|
2902
3184
|
const unlisted = Math.max(0, (from.skippedCount ?? 0) - (from.skipped?.length ?? 0)) + Math.max(0, (from.specOpsUncoveredCount ?? 0) - (from.specOpsUncovered?.length ?? 0));
|
|
2903
3185
|
const gone = [];
|
|
2904
3186
|
const reads = [];
|
|
2905
|
-
const
|
|
3187
|
+
const named = [.../* @__PURE__ */ new Set([...whole, ...lines.keys()])].sort(byPath3);
|
|
3188
|
+
const files = o.first?.length ? reachOrder(named, o.first) : named;
|
|
2906
3189
|
for (const file of files) {
|
|
2907
3190
|
const sz = size(file);
|
|
2908
3191
|
if (!sz) {
|
|
@@ -3458,8 +3741,8 @@ function changeView(records2, change, flows, known = []) {
|
|
|
3458
3741
|
const nodes = [];
|
|
3459
3742
|
for (const id of comps) {
|
|
3460
3743
|
const sys = c.components.has(id) ? c.systemOf(id) : void 0;
|
|
3461
|
-
const
|
|
3462
|
-
const { legend: _status, ...rest } =
|
|
3744
|
+
const base2 = c.components.has(id) || c.isSystem(id) ? c.endNode(id, sys) : { id, label: id, kind: "component" };
|
|
3745
|
+
const { legend: _status, ...rest } = base2;
|
|
3463
3746
|
nodes.push({ ...rest, label: marked(rest.label, legends.get(id)), ...withMark(id) });
|
|
3464
3747
|
}
|
|
3465
3748
|
for (const t of tables) {
|
|
@@ -3555,14 +3838,14 @@ var Ids = class {
|
|
|
3555
3838
|
const known = this.map.get(key);
|
|
3556
3839
|
if (known)
|
|
3557
3840
|
return known;
|
|
3558
|
-
let
|
|
3559
|
-
if (!/^[A-Za-z]/.test(
|
|
3560
|
-
|
|
3561
|
-
if (RESERVED.has(
|
|
3562
|
-
|
|
3563
|
-
let id =
|
|
3841
|
+
let base2 = raw.replace(/[^A-Za-z0-9_]/g, "_");
|
|
3842
|
+
if (!/^[A-Za-z]/.test(base2))
|
|
3843
|
+
base2 = `n_${base2}`;
|
|
3844
|
+
if (RESERVED.has(base2.toLowerCase()))
|
|
3845
|
+
base2 = `${base2}_`;
|
|
3846
|
+
let id = base2;
|
|
3564
3847
|
for (let n = 2; this.used.has(id); n++)
|
|
3565
|
-
id = `${
|
|
3848
|
+
id = `${base2}_${n}`;
|
|
3566
3849
|
this.used.add(id);
|
|
3567
3850
|
this.map.set(key, id);
|
|
3568
3851
|
return id;
|
|
@@ -3751,8 +4034,8 @@ function nodeStyle(n) {
|
|
|
3751
4034
|
return styleText(SHAPES.topic, legend);
|
|
3752
4035
|
if (n.boundary === "vendor")
|
|
3753
4036
|
return styleText(SHAPES.vendor, n.kind === "component" ? { atticusKind: "component" } : {}, legend);
|
|
3754
|
-
const
|
|
3755
|
-
return styleText(
|
|
4037
|
+
const base2 = n.kind === "system" ? SHAPES.system : SHAPES.component;
|
|
4038
|
+
return styleText(base2, n.boundary ? BOUNDARY[n.boundary] : void 0, legend);
|
|
3756
4039
|
}
|
|
3757
4040
|
function groupStyle(g) {
|
|
3758
4041
|
return styleText(SHAPES.group, g.kind === "datastore" ? { atticusKind: "datastore-group" } : {}, g.boundary ? { strokeColor: BOUNDARY[g.boundary].strokeColor } : void 0, g.legend ? LEGEND[g.legend] : void 0);
|
|
@@ -3843,14 +4126,14 @@ function edgeStyle(e) {
|
|
|
3843
4126
|
}
|
|
3844
4127
|
var compress = (xml) => deflateRawSync(Buffer.from(encodeURIComponent(xml), "utf8"), { level: 9 }).toString("base64");
|
|
3845
4128
|
function shapeLibrary() {
|
|
3846
|
-
const
|
|
4129
|
+
const base2 = [
|
|
3847
4130
|
["System", SHAPES.system, W, H],
|
|
3848
4131
|
["Component", SHAPES.component, W, H],
|
|
3849
4132
|
["Vendor", SHAPES.vendor, W, H + 20],
|
|
3850
4133
|
["Data store", SHAPES.datastore, 120, 80],
|
|
3851
4134
|
["Topic", SHAPES.topic, W, H]
|
|
3852
4135
|
];
|
|
3853
|
-
const entries =
|
|
4136
|
+
const entries = base2.flatMap(([title, style, w, h]) => [void 0, "new", "modify", "retire"].map((legend) => {
|
|
3854
4137
|
const value = attr(title);
|
|
3855
4138
|
const st = attr(styleText(style, legend ? LEGEND[legend] : void 0));
|
|
3856
4139
|
const xml = `<mxGraphModel><root><mxCell id="0"/><mxCell id="1" parent="0"/><mxCell id="2" value="${value}" style="${st}" vertex="1" parent="1"><mxGeometry width="${w}" height="${h}" as="geometry"/></mxCell></root></mxGraphModel>`;
|
|
@@ -4793,13 +5076,13 @@ function codeLinkerFor(o) {
|
|
|
4793
5076
|
web = `https://${scp[1]}/${scp[2]}`;
|
|
4794
5077
|
}
|
|
4795
5078
|
if (web) {
|
|
4796
|
-
const
|
|
4797
|
-
const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(
|
|
5079
|
+
const base2 = web.replace(/\/+$/, "").replace(/\.git$/, "");
|
|
5080
|
+
const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(base2);
|
|
4798
5081
|
return (path, line, commit) => {
|
|
4799
5082
|
const p = encodeURI(path);
|
|
4800
5083
|
if (ado)
|
|
4801
|
-
return `${
|
|
4802
|
-
return `${
|
|
5084
|
+
return `${base2}?path=/${p}${commit ? `&version=GC${commit}` : ""}${line ? `&line=${line}` : ""}`;
|
|
5085
|
+
return `${base2}/blob/${commit ?? "HEAD"}/${p}${line ? `#L${line}` : ""}`;
|
|
4803
5086
|
};
|
|
4804
5087
|
}
|
|
4805
5088
|
const dir = (o.dir ?? "").replace(/\/+$/, "");
|
|
@@ -5248,8 +5531,8 @@ function ctxOf(i, file) {
|
|
|
5248
5531
|
}
|
|
5249
5532
|
function renderMap(i) {
|
|
5250
5533
|
const files = {};
|
|
5251
|
-
const
|
|
5252
|
-
for (const comp of [...
|
|
5534
|
+
const base2 = ctxOf(i, "map.md");
|
|
5535
|
+
for (const comp of [...base2.comps].sort(cmp2)) {
|
|
5253
5536
|
const yaml = openApiOf(i, comp);
|
|
5254
5537
|
if (yaml)
|
|
5255
5538
|
files[`contracts/${comp}.openapi.yaml`] = yaml;
|
|
@@ -5263,18 +5546,18 @@ function renderMap(i) {
|
|
|
5263
5546
|
HEADER2(i.repo, "the catalog and its specs"),
|
|
5264
5547
|
"",
|
|
5265
5548
|
...aboutLine(i.about, i.repo),
|
|
5266
|
-
...builtOnLine(
|
|
5549
|
+
...builtOnLine(base2),
|
|
5267
5550
|
trustLine(i.trust, i.repo),
|
|
5268
5551
|
"",
|
|
5269
|
-
...section("What it serves", serves(
|
|
5270
|
-
...section("What it calls", calls(
|
|
5271
|
-
...section("What it stores", stores(
|
|
5272
|
-
...section("Where it runs", deploys(
|
|
5273
|
-
...section("Config that names other systems", config(
|
|
5274
|
-
...i.terms?.length ? section("Terms", terms(
|
|
5275
|
-
...section("Flows", flowsList(
|
|
5276
|
-
...section("Contracts", contracts(
|
|
5277
|
-
...section("Open questions", openQuestions(
|
|
5552
|
+
...section("What it serves", serves(base2)),
|
|
5553
|
+
...section("What it calls", calls(base2)),
|
|
5554
|
+
...section("What it stores", stores(base2)),
|
|
5555
|
+
...section("Where it runs", deploys(base2)),
|
|
5556
|
+
...section("Config that names other systems", config(base2)),
|
|
5557
|
+
...i.terms?.length ? section("Terms", terms(base2)) : [],
|
|
5558
|
+
...section("Flows", flowsList(base2)),
|
|
5559
|
+
...section("Contracts", contracts(base2, files)),
|
|
5560
|
+
...section("Open questions", openQuestions(base2))
|
|
5278
5561
|
].join("\n");
|
|
5279
5562
|
return Object.fromEntries(Object.entries(files).sort(([a], [b]) => cmp2(a, b)));
|
|
5280
5563
|
}
|
|
@@ -5484,7 +5767,7 @@ function repairFormSlips(facts, bad, onFile = []) {
|
|
|
5484
5767
|
}
|
|
5485
5768
|
|
|
5486
5769
|
// packages/verify/dist/house-imports.js
|
|
5487
|
-
var
|
|
5770
|
+
var CODE2 = /\.(java|kt|kts|scala|groovy|cs|vb|fs|ts|tsx|js|jsx|mjs|cjs|vue|svelte|py|go|rb|php|swift)$/i;
|
|
5488
5771
|
var IMPORTS = [
|
|
5489
5772
|
// Java, Kotlin, Scala, Groovy, Python's `import a.b`, Go's one-line import
|
|
5490
5773
|
/^\s*import\s+(?:static\s+)?([A-Za-z_][\w.]*)/,
|
|
@@ -5532,7 +5815,7 @@ function houseImportsUntaught(source, o) {
|
|
|
5532
5815
|
const prefixes = o.prefixes.map(lower);
|
|
5533
5816
|
const taught = o.taught.map(lower);
|
|
5534
5817
|
const found = /* @__PURE__ */ new Map();
|
|
5535
|
-
const paths = source.list().filter((p) =>
|
|
5818
|
+
const paths = source.list().filter((p) => CODE2.test(p) && !rules.notRead.test(p) && !(o.exclude ?? []).some((re) => re.test(p)) && isSourceFile(p, "", void 0, rules)).sort();
|
|
5536
5819
|
for (const p of paths) {
|
|
5537
5820
|
const text = source.read(p);
|
|
5538
5821
|
if (text === void 0)
|
|
@@ -5582,14 +5865,18 @@ export {
|
|
|
5582
5865
|
readRulesOf,
|
|
5583
5866
|
lineRangeOf,
|
|
5584
5867
|
parseReviewed,
|
|
5585
|
-
|
|
5586
|
-
staleMessage,
|
|
5587
|
-
verifyFacts,
|
|
5868
|
+
readingRank,
|
|
5588
5869
|
FILE_KINDS,
|
|
5870
|
+
fileKinds,
|
|
5589
5871
|
kindsOf,
|
|
5590
5872
|
numberedSlice,
|
|
5591
5873
|
sliceText,
|
|
5592
5874
|
planBatches,
|
|
5875
|
+
NOT_REACHED_WHY,
|
|
5876
|
+
reachableModels,
|
|
5877
|
+
sameCommit,
|
|
5878
|
+
staleMessage,
|
|
5879
|
+
verifyFacts,
|
|
5593
5880
|
SHOWN_PROPOSALS,
|
|
5594
5881
|
proposeExclusions,
|
|
5595
5882
|
exclusionYaml,
|