@maycombhq/atticus 2.0.0-beta.12 → 2.0.0-beta.12.2
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-JQG4VO47.js → chunk-24ARIOB7.js} +1 -1
- package/dist/{chunk-5M3CLAOV.js → chunk-2DFYLFBL.js} +17 -17
- package/dist/{chunk-Z47YGBUY.js → chunk-2IFPJYBT.js} +19 -18
- package/dist/{chunk-LTLR4JZJ.js → chunk-2L5XV7QK.js} +10 -10
- package/dist/{chunk-6S27MUQQ.js → chunk-2UPMPTNJ.js} +4 -4
- package/dist/{chunk-ZPT4QX3J.js → chunk-2Y4EWUDF.js} +4 -4
- package/dist/{chunk-2A24BNRZ.js → chunk-34COONQ2.js} +7 -7
- package/dist/{chunk-P6UJ22XR.js → chunk-35FTAQDX.js} +4 -4
- package/dist/{chunk-WE5VMPUP.js → chunk-3BZR2M2H.js} +173 -142
- package/dist/{chunk-DONCF2XC.js → chunk-3DMXBIDW.js} +3 -3
- package/dist/{chunk-GUNBOZ75.js → chunk-3ENG33LV.js} +3 -3
- package/dist/{chunk-KUYA2E7M.js → chunk-3LWQYHID.js} +7 -7
- package/dist/{chunk-6ROZRBWH.js → chunk-3RQK5AWY.js} +4 -4
- package/dist/{chunk-34BCKMBS.js → chunk-4CPOXPS4.js} +3 -3
- package/dist/{chunk-BXP2Q4TD.js → chunk-4DRSRU4U.js} +22 -22
- package/dist/{chunk-U4NNG3ES.js → chunk-4M3OQM5V.js} +10 -10
- package/dist/{chunk-DW4BM73R.js → chunk-4Q6HX5GQ.js} +1 -1
- package/dist/{chunk-PVW2N63M.js → chunk-5BDBPV6V.js} +28 -28
- package/dist/{chunk-BRCDEGNE.js → chunk-5BVNNYU7.js} +1 -1
- package/dist/{chunk-AYVLEB55.js → chunk-5CIFSHTS.js} +17 -17
- package/dist/{chunk-OJAJXU65.js → chunk-5P766RED.js} +1 -1
- package/dist/{chunk-QAFMLBPF.js → chunk-5VZJX75P.js} +11 -11
- package/dist/{chunk-HJ52XDST.js → chunk-5WIH5VUB.js} +4 -4
- package/dist/{chunk-RA64IK43.js → chunk-5WJCV6ED.js} +1 -1
- package/dist/{chunk-2P6IHSRO.js → chunk-64BU3UUE.js} +16 -16
- package/dist/{chunk-3ZKLWM5Y.js → chunk-66VD3EHO.js} +10 -10
- package/dist/{chunk-3M7QBKKG.js → chunk-6FYKGYAO.js} +6 -6
- package/dist/{chunk-6JV3YHRR.js → chunk-6IFOKO2R.js} +17 -17
- package/dist/{chunk-2Q2YBAR5.js → chunk-6J2BWOLO.js} +11 -10
- package/dist/chunk-6VIQB6XT.js +37 -0
- package/dist/{chunk-4HTILEXW.js → chunk-6ZQOYNTT.js} +2 -2
- package/dist/{chunk-SGNHNN3G.js → chunk-73QQ3KWY.js} +11 -11
- package/dist/{chunk-TEHH47TG.js → chunk-767WN7BP.js} +3 -3
- package/dist/{chunk-VXSJKWB7.js → chunk-7CJ2TNZZ.js} +16 -16
- package/dist/{chunk-CWSZP2LU.js → chunk-7JA7XGWC.js} +24 -24
- package/dist/{chunk-4VOG5H2K.js → chunk-7OHYHBEQ.js} +1 -1
- package/dist/{chunk-EJDZEK22.js → chunk-7V3IIWMG.js} +23 -23
- package/dist/{chunk-XJRC3ZDI.js → chunk-7XYCCKGI.js} +12 -12
- package/dist/{chunk-Z2BA4NNR.js → chunk-7YZ6JPFR.js} +2 -2
- package/dist/{chunk-Q55UP5EZ.js → chunk-AAIAS55Y.js} +21 -21
- package/dist/{chunk-FAET4BB6.js → chunk-ACW2C7CY.js} +5 -5
- package/dist/{chunk-GFZ5MIQG.js → chunk-AODGV7YL.js} +23 -23
- package/dist/{chunk-HKGQUOQ3.js → chunk-AOPL3VT7.js} +15 -15
- package/dist/{chunk-ARLH2ZMD.js → chunk-AQPK22BH.js} +1 -1
- package/dist/{chunk-PGFRXGHA.js → chunk-ASCZ47XX.js} +2 -2
- package/dist/{chunk-6ENDKY52.js → chunk-AV2DVINC.js} +10 -10
- package/dist/{chunk-ITJ7ST5E.js → chunk-AVEKRWDF.js} +4 -4
- package/dist/{chunk-A5GY2EWH.js → chunk-BGASQ4UD.js} +11 -11
- package/dist/{chunk-5FFMJMVH.js → chunk-BLEZRUU5.js} +18 -18
- package/dist/chunk-BUJJLQ7C.js +41 -0
- package/dist/{chunk-EU7VTBAI.js → chunk-C43X7Y7O.js} +4 -4
- package/dist/{chunk-DGZXJO5I.js → chunk-CAH7L2QH.js} +7 -7
- package/dist/{chunk-36KD4OGC.js → chunk-CLDB6K2T.js} +13 -13
- package/dist/{chunk-BSVTNNUK.js → chunk-CV2Y7JQU.js} +5 -5
- package/dist/{chunk-RMLUZYEA.js → chunk-CW4OVNJF.js} +10 -10
- package/dist/{chunk-QXGOEP44.js → chunk-CXDUMI7E.js} +3 -3
- package/dist/{chunk-TLCRIAU3.js → chunk-D6CUQIU3.js} +20 -20
- package/dist/{chunk-OMH3I5BH.js → chunk-DDCK4CFE.js} +2 -2
- package/dist/{chunk-MLAACAES.js → chunk-DLSPFAC5.js} +349 -102
- package/dist/{chunk-PCCPXWJC.js → chunk-DRA2V4R4.js} +15 -15
- package/dist/{chunk-CQD26SMZ.js → chunk-E52MNV5B.js} +1 -1
- package/dist/{chunk-22GLUHGE.js → chunk-E53MN24E.js} +9 -9
- package/dist/{chunk-4RDW2X43.js → chunk-EHLZJPGF.js} +23 -23
- package/dist/{chunk-VF4VOPMB.js → chunk-EL4VOLGT.js} +22 -22
- package/dist/{chunk-ZBQCLKTH.js → chunk-EPTCDW3U.js} +11 -11
- package/dist/{chunk-VRYQJZFL.js → chunk-EUK4IONY.js} +15 -7
- package/dist/{chunk-FSJMFPA3.js → chunk-EWJ32DKS.js} +6 -6
- package/dist/{chunk-GKPOCUQR.js → chunk-FAAOOT34.js} +4 -4
- package/dist/{chunk-FBFSTYAB.js → chunk-FM56YGBC.js} +7 -7
- package/dist/chunk-FML6GOUB.js +45 -0
- package/dist/{chunk-SCBU46AJ.js → chunk-FR6J2NW5.js} +3 -3
- package/dist/{chunk-MRLCNXXR.js → chunk-FT2E2DHW.js} +1 -1
- package/dist/{chunk-CXY4YDXS.js → chunk-G3CY3PFO.js} +2 -2
- package/dist/{chunk-RZWZO2JQ.js → chunk-GFMOU6YM.js} +17 -16
- package/dist/{chunk-ZS47PQ3O.js → chunk-GGBEM27J.js} +3 -3
- package/dist/{chunk-DWN7RSNQ.js → chunk-GP3NGMWY.js} +3 -3
- package/dist/chunk-HEQ2YUFK.js +43 -0
- package/dist/{chunk-HJUEQERG.js → chunk-HFMLZFY4.js} +6 -6
- package/dist/{chunk-AEZ3EICK.js → chunk-HSLT4NZA.js} +19 -19
- package/dist/{chunk-ISXNWUG7.js → chunk-HZGTUG23.js} +1 -1
- package/dist/{chunk-3CFBU2O6.js → chunk-IPB6EKUH.js} +4 -4
- package/dist/{chunk-RLJDYLID.js → chunk-IRA6XAXY.js} +11 -11
- package/dist/{chunk-CW5SEPUT.js → chunk-IUKKHYEK.js} +6 -6
- package/dist/{chunk-VTMIRRIZ.js → chunk-IUWOOFPR.js} +2 -2
- package/dist/{chunk-O5W4ECUY.js → chunk-IVBSAKVG.js} +15 -15
- package/dist/{chunk-INCECZ2E.js → chunk-J347EH7F.js} +5 -5
- package/dist/{chunk-WEG7DY5K.js → chunk-J6FWM4VI.js} +9 -9
- package/dist/{chunk-YY2WGL6S.js → chunk-JARVXMUW.js} +2 -2
- package/dist/{chunk-72DY5NCN.js → chunk-JEZM3NRF.js} +2 -2
- package/dist/{chunk-SAC6FNKR.js → chunk-JFCTPPRA.js} +102 -101
- package/dist/chunk-JHISKJFN.js +48 -0
- package/dist/{chunk-UT5OA7KA.js → chunk-JLF4JIZ6.js} +10 -10
- package/dist/{chunk-XVIVWG7B.js → chunk-JLZPUCEC.js} +6 -6
- package/dist/{chunk-5GGGAI5C.js → chunk-JQHNT45I.js} +17 -17
- package/dist/{chunk-GMDOXWIS.js → chunk-JTI3FKGI.js} +4 -4
- package/dist/{chunk-CJXM6SG4.js → chunk-JW3ENKRI.js} +20 -20
- package/dist/{chunk-QJ3OX7OC.js → chunk-K2WOVID6.js} +31 -31
- package/dist/{chunk-VLDM4QZM.js → chunk-K7ICVNZ6.js} +22 -22
- package/dist/{chunk-PJRMMWU4.js → chunk-KDKLT22F.js} +2 -2
- package/dist/chunk-KLFPFMXV.js +38 -0
- package/dist/chunk-KLROTB6N.js +113 -0
- package/dist/{chunk-ZTIMXVV5.js → chunk-KMU7XNK3.js} +2 -2
- package/dist/chunk-KSAKVVOA.js +34 -0
- package/dist/{chunk-DDZZXVQ5.js → chunk-KTHFVH6T.js} +9 -9
- package/dist/{chunk-4Q2PGM5T.js → chunk-KZSIKS64.js} +60 -17
- package/dist/{chunk-3RP34PYV.js → chunk-LIRPXFA4.js} +17 -17
- package/dist/{chunk-B6X5PJSA.js → chunk-LNPS5GQ3.js} +9 -9
- package/dist/{chunk-WM4N2L4T.js → chunk-LO3NRDCE.js} +1 -1
- package/dist/{chunk-GN5ZLSLD.js → chunk-LQ5CEQFQ.js} +3 -3
- package/dist/{chunk-5ION6STH.js → chunk-LUBKMCTR.js} +2 -2
- package/dist/{chunk-MFRPLAOH.js → chunk-LURMCWUG.js} +2 -2
- package/dist/{chunk-U25OX22K.js → chunk-LZABEKI6.js} +3 -3
- package/dist/{chunk-I2PNEG3M.js → chunk-M2U3IZ54.js} +5 -5
- package/dist/chunk-M5NKIQKM.js +34 -0
- package/dist/{chunk-3JLTN3Y7.js → chunk-M63Z7PIB.js} +7 -7
- package/dist/{chunk-3256EDLL.js → chunk-MA43MHVR.js} +3 -3
- package/dist/{chunk-GLSNVC67.js → chunk-MPC5BQ6O.js} +16 -16
- package/dist/{chunk-HIQWJ6JZ.js → chunk-MT6GHEH5.js} +4 -4
- package/dist/{chunk-JLIEAQP4.js → chunk-N3Z5NFM4.js} +4 -4
- package/dist/{chunk-4HIQ2FTI.js → chunk-NAFPFQMJ.js} +4 -4
- package/dist/{chunk-J3VAFDEX.js → chunk-NTUHEHC6.js} +13 -13
- package/dist/chunk-O23JP5EA.js +54 -0
- package/dist/{chunk-JGLZUQVN.js → chunk-O775JVDM.js} +15 -15
- package/dist/{chunk-E73QLYK7.js → chunk-OAXCNACK.js} +3 -3
- package/dist/{chunk-47HPZ34V.js → chunk-OG42OLZK.js} +24 -24
- package/dist/{chunk-EREL3TQG.js → chunk-OHBNRL75.js} +1 -1
- package/dist/{chunk-ZYASEL7K.js → chunk-OKLXZ35H.js} +4 -4
- package/dist/{chunk-TIAPEYWI.js → chunk-OOQPEISI.js} +3 -3
- package/dist/{chunk-DPNCAFMB.js → chunk-OQPFFBPQ.js} +17 -17
- package/dist/{chunk-L4UIKAWD.js → chunk-OQTSTW2G.js} +6 -6
- package/dist/{chunk-TWHZU36X.js → chunk-OV3WHHRI.js} +1 -1
- package/dist/{chunk-SSL6JMPA.js → chunk-OYGY4DI2.js} +8 -8
- package/dist/{chunk-KNGESBFW.js → chunk-P44WNZXO.js} +15 -15
- package/dist/{chunk-CXK27ZUY.js → chunk-P4L435FY.js} +12 -12
- package/dist/{chunk-QEZSA2O7.js → chunk-PG5FIVP3.js} +16 -16
- package/dist/{chunk-U5T4A2QV.js → chunk-PI6KNUBW.js} +5 -5
- package/dist/{chunk-7VNEDDCC.js → chunk-PPCCFZG7.js} +2 -2
- package/dist/{chunk-SNSFQ47W.js → chunk-PPP75X5G.js} +11 -11
- package/dist/{chunk-TVSNWIAM.js → chunk-PQVZO25F.js} +3 -3
- package/dist/{chunk-NTNJNRHW.js → chunk-PR5X4SIJ.js} +4 -4
- package/dist/{chunk-NCONDPHH.js → chunk-PURVXI7L.js} +4 -4
- package/dist/{chunk-NHS55U7T.js → chunk-PWUVIOMW.js} +17 -17
- package/dist/{chunk-NWL7XEQ4.js → chunk-QBUHJ77Q.js} +18 -17
- package/dist/{chunk-FQ6IBYFC.js → chunk-QJWE44D4.js} +3 -3
- package/dist/{chunk-PKJ3K3GM.js → chunk-QLJ7KLO3.js} +5 -5
- package/dist/{chunk-JXXQHETS.js → chunk-QQLWNMLX.js} +10 -10
- package/dist/{chunk-MQHYCS6A.js → chunk-QUHSKUDF.js} +29 -27
- package/dist/{chunk-DQKNOHUZ.js → chunk-QXI64SJ4.js} +1 -1
- package/dist/{chunk-5OACMWWI.js → chunk-QZIAPAUG.js} +192 -65
- package/dist/{chunk-GHSVJNVL.js → chunk-R2A6DAPC.js} +6 -3
- package/dist/{chunk-MNUZX67F.js → chunk-R5DGXWOX.js} +5 -5
- package/dist/{chunk-CH6LUQLD.js → chunk-RA3TVBWK.js} +1 -1
- package/dist/{chunk-NTTXTLCQ.js → chunk-REFOPAZF.js} +24 -24
- package/dist/{chunk-2ELFEKOO.js → chunk-RICWZRBR.js} +4 -4
- package/dist/{chunk-77UOXZVM.js → chunk-RNUHS433.js} +5 -5
- package/dist/{chunk-YURIUFKF.js → chunk-RSAJ33C6.js} +15 -15
- package/dist/{chunk-7TEQF64E.js → chunk-S4EGGQZB.js} +164 -35
- package/dist/{chunk-2VQLFNBO.js → chunk-S6IJNQFM.js} +19 -19
- package/dist/{chunk-GYS64N6F.js → chunk-S6JXYEG4.js} +5 -5
- package/dist/{chunk-CIIRPLI6.js → chunk-SOLKTI2T.js} +4 -4
- package/dist/{chunk-TEZSZ24W.js → chunk-T34ITVSM.js} +4 -4
- package/dist/{chunk-BTOGAUWX.js → chunk-TDKSKJU3.js} +26 -11
- package/dist/{chunk-ENZWVTTN.js → chunk-TDQNBA2N.js} +20 -20
- package/dist/{chunk-NWXY3B4R.js → chunk-THLOT563.js} +22 -22
- package/dist/{chunk-MNCQ2GL7.js → chunk-THZXSH5O.js} +11 -11
- package/dist/{chunk-ESGIBN3S.js → chunk-TLTKLVZZ.js} +1 -1
- package/dist/{chunk-TH526O6E.js → chunk-U24UW3SV.js} +11 -11
- package/dist/{chunk-V3VCUSQ6.js → chunk-U55GKPUB.js} +14 -14
- package/dist/{chunk-Z53ZB34U.js → chunk-U7RMOCQQ.js} +7 -7
- package/dist/{chunk-34NWVIBC.js → chunk-UA4DLNV7.js} +2 -2
- package/dist/{chunk-7AXMUE2U.js → chunk-UELYGLNG.js} +14 -14
- package/dist/{chunk-SK5OYWIY.js → chunk-UGMJ3Z35.js} +2 -2
- package/dist/{chunk-NSJ6ZR2A.js → chunk-UOW37F7C.js} +3 -3
- package/dist/{chunk-4G56W6H7.js → chunk-V3P5ZJSO.js} +8 -8
- package/dist/{chunk-ZBOPIYOY.js → chunk-V5UZVS74.js} +11 -11
- package/dist/{chunk-NL6XQZSV.js → chunk-VK22DOCQ.js} +22 -22
- package/dist/{chunk-BZRWJUB4.js → chunk-VOZI4AFV.js} +14 -14
- package/dist/{chunk-V5XV3JSP.js → chunk-VZM535M5.js} +6 -6
- package/dist/{chunk-SHAAGH3T.js → chunk-WKVNT6DL.js} +14 -14
- package/dist/{chunk-P76AW3PA.js → chunk-WMCKOZFT.js} +84 -9
- package/dist/{chunk-7UKETVPW.js → chunk-WMWYW4WB.js} +1 -1
- package/dist/{chunk-DWYPYVPJ.js → chunk-WOWEF5DL.js} +13 -13
- package/dist/{chunk-LDUJ6NIT.js → chunk-WPBQT6VF.js} +4 -4
- package/dist/{chunk-MH7UBG47.js → chunk-WQKMAOD7.js} +4 -4
- package/dist/chunk-WZEUA4PU.js +54 -0
- package/dist/{chunk-KY2ZHTBJ.js → chunk-X2SHYKUY.js} +6 -6
- package/dist/{chunk-TA2ZNDYD.js → chunk-X3HFDWKA.js} +1 -1
- package/dist/{chunk-WIF7A6JU.js → chunk-X4VLWQR2.js} +11 -11
- package/dist/{chunk-EE3UNC44.js → chunk-X5IKLUFM.js} +3 -3
- package/dist/{chunk-VS6FS472.js → chunk-XKARSCXA.js} +14 -14
- package/dist/chunk-XMRFYVBB.js +41 -0
- package/dist/{chunk-7TH6I6TL.js → chunk-YDBWECPT.js} +8 -8
- package/dist/{chunk-TXV2AYZB.js → chunk-YIO2LEBW.js} +23 -23
- package/dist/{chunk-X64BFQ3R.js → chunk-YU63ND72.js} +9 -9
- package/dist/{chunk-QL4VNY4U.js → chunk-YYV55774.js} +1 -1
- package/dist/{chunk-6FG7QKJC.js → chunk-ZIVRZ3WV.js} +21 -21
- package/dist/{chunk-QY7RGTUP.js → chunk-ZJDOYEW4.js} +51 -14
- package/dist/{chunk-F6FGIYPT.js → chunk-ZNXTVNPY.js} +19 -19
- package/dist/{chunk-5H46QFSL.js → chunk-ZPNRTY73.js} +4 -4
- package/dist/{chunk-HY2VVVFZ.js → chunk-ZS2EZYOR.js} +4 -4
- package/dist/{chunk-FEBYMFZA.js → chunk-ZT6WXY3J.js} +23 -23
- package/dist/{chunk-Y3ZKT6IF.js → chunk-ZTF2NSQD.js} +5 -5
- package/dist/{chunk-QR65C3DV.js → chunk-ZUCJCBS5.js} +4 -4
- package/dist/files.json +443 -439
- package/dist/packages/sdk/npm/index.js +1 -1
- package/dist/packages/ui/dist/assets/{elk-api-D2NcYpUJ.js → elk-api-GNftut9z.js} +2 -2
- package/dist/packages/ui/dist/assets/{index-CT7skl01.js → index-C2evnHpj.js} +3 -3
- package/dist/packages/ui/dist/index.html +1 -1
- package/package.json +5 -5
- package/dist/chunk-4BPROPGG.js +0 -45
- package/dist/chunk-5CSZTVXH.js +0 -34
- package/dist/chunk-76QVBNEM.js +0 -37
- package/dist/chunk-F5GA6G3U.js +0 -48
- package/dist/chunk-FMV6IZ3P.js +0 -54
- package/dist/chunk-HP32HUWR.js +0 -41
- package/dist/chunk-RSVBX6A3.js +0 -54
- package/dist/chunk-TV4CGNEY.js +0 -43
- package/dist/chunk-VP5H6DII.js +0 -34
- package/dist/chunk-Z4JSRKNR.js +0 -41
- package/dist/chunk-ZGI7DNJ6.js +0 -38
|
@@ -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-UA4DLNV7.js";
|
|
9
9
|
import {
|
|
10
10
|
globToRegExp
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-FT2E2DHW.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-LZABEKI6.js";
|
|
44
44
|
|
|
45
45
|
// packages/verify/dist/source.js
|
|
46
46
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
@@ -354,6 +354,29 @@ function parseReviewed(text) {
|
|
|
354
354
|
}
|
|
355
355
|
var isGlob = (path) => /[*?]/.test(path);
|
|
356
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
|
+
|
|
357
380
|
// packages/verify/dist/apigee-policy.js
|
|
358
381
|
var MAKES = {
|
|
359
382
|
OAuthV1: ["oauth2"],
|
|
@@ -1334,29 +1357,6 @@ function derivedNamesAt(file, lines, line, env) {
|
|
|
1334
1357
|
return out;
|
|
1335
1358
|
}
|
|
1336
1359
|
|
|
1337
|
-
// packages/verify/dist/conventions.js
|
|
1338
|
-
var SPEC_NAME = /(^|\/)[^/]*(openapi|swagger|asyncapi|api-docs)[^/]*\.(ya?ml|json|xml)$|\.oas\.(ya?ml|json)$/i;
|
|
1339
|
-
function rulesOf(c) {
|
|
1340
|
-
const folders = underFolders(c.apiSpecFolders, { tail: "(.+/)?[^/]+\\.(ya?ml|json)$" });
|
|
1341
|
-
return {
|
|
1342
|
-
apiSpec: new RegExp(`${SPEC_NAME.source}|${folders.source}`, "i"),
|
|
1343
|
-
notProduct: underFolders(c.notProductFolders),
|
|
1344
|
-
notRead: underFolders(c.notReadFolders),
|
|
1345
|
-
gatewayBundle: gatewayBundleTest(c.gatewayBundleFolders),
|
|
1346
|
-
frameworks: c.frameworks
|
|
1347
|
-
};
|
|
1348
|
-
}
|
|
1349
|
-
var DEFAULT_READ_RULES = rulesOf(DEFAULT_CONVENTIONS);
|
|
1350
|
-
var made = /* @__PURE__ */ new WeakMap();
|
|
1351
|
-
function readRulesOf(c) {
|
|
1352
|
-
if (!c || c === DEFAULT_CONVENTIONS)
|
|
1353
|
-
return DEFAULT_READ_RULES;
|
|
1354
|
-
let r = made.get(c);
|
|
1355
|
-
if (!r)
|
|
1356
|
-
made.set(c, r = rulesOf(c));
|
|
1357
|
-
return r;
|
|
1358
|
-
}
|
|
1359
|
-
|
|
1360
1360
|
// packages/verify/dist/not-product.js
|
|
1361
1361
|
var LOCALE_BUNDLE = /(^|\/)(i18n|l10n|locales?|lang|langs|languages|translations?)\/(.+\/)?[^/]+\.(json|ya?ml|properties)$|(^|\/)res\/values[^/]*\/(strings|plurals|arrays)\.xml$/i;
|
|
1362
1362
|
function isLocaleBundle(path) {
|
|
@@ -1418,6 +1418,144 @@ function pageRouteMatches(file, lines, exists, path) {
|
|
|
1418
1418
|
return norm(route) === norm(path);
|
|
1419
1419
|
}
|
|
1420
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
|
+
const entries = o.from === "entries";
|
|
1500
|
+
const calls2 = new Set(facts.filter((f) => f.kind === "call").map((f) => f.id));
|
|
1501
|
+
for (const f of facts)
|
|
1502
|
+
if (f.kind === "entry" || f.kind === "call" && !entries)
|
|
1503
|
+
for (const p of citedFiles(f))
|
|
1504
|
+
addRoot(p);
|
|
1505
|
+
for (const p of ordered)
|
|
1506
|
+
if (entries ? isEntryPointFile(p) : isRootFile(p))
|
|
1507
|
+
addRoot(p);
|
|
1508
|
+
const reached = /* @__PURE__ */ new Map();
|
|
1509
|
+
const queue = [];
|
|
1510
|
+
const reach = (names, from, own = []) => {
|
|
1511
|
+
for (const n of names) {
|
|
1512
|
+
if (own.includes(n))
|
|
1513
|
+
continue;
|
|
1514
|
+
for (const p of byName.get(n) ?? []) {
|
|
1515
|
+
const r = reached.get(p);
|
|
1516
|
+
if (r) {
|
|
1517
|
+
if (r.from === from && !r.types.includes(n))
|
|
1518
|
+
r.types.push(n);
|
|
1519
|
+
continue;
|
|
1520
|
+
}
|
|
1521
|
+
reached.set(p, { path: p, types: [n], from });
|
|
1522
|
+
queue.push(p);
|
|
1523
|
+
}
|
|
1524
|
+
}
|
|
1525
|
+
};
|
|
1526
|
+
for (const p of roots)
|
|
1527
|
+
reach(identifiers(textOf(p)), p);
|
|
1528
|
+
for (const f of facts) {
|
|
1529
|
+
for (const p of citedFiles(f))
|
|
1530
|
+
if (isModel.has(p) && !reached.has(p)) {
|
|
1531
|
+
reached.set(p, { path: p, types: [...(declared.get(p) ?? []).slice(0, 1)], from: f.id });
|
|
1532
|
+
queue.push(p);
|
|
1533
|
+
}
|
|
1534
|
+
if (f.kind === "field" && !(entries && calls2.has(f.owner)))
|
|
1535
|
+
reach(identifiers([f.type ?? "", f.transform === "message type" ? f.name : ""].join(" ")), f.id);
|
|
1536
|
+
}
|
|
1537
|
+
const rooted = roots.length > 0 || reached.size > 0;
|
|
1538
|
+
if (!rooted)
|
|
1539
|
+
return {
|
|
1540
|
+
rooted,
|
|
1541
|
+
roots,
|
|
1542
|
+
reached: models.map((p) => ({ path: p, types: declared.get(p) ?? [], from: "" })),
|
|
1543
|
+
notReached: [],
|
|
1544
|
+
models: models.length
|
|
1545
|
+
};
|
|
1546
|
+
for (let i = 0; i < queue.length; i++) {
|
|
1547
|
+
const p = queue[i];
|
|
1548
|
+
reach(identifiers(textOf(p)), p, declared.get(p));
|
|
1549
|
+
}
|
|
1550
|
+
return {
|
|
1551
|
+
rooted,
|
|
1552
|
+
roots,
|
|
1553
|
+
reached: queue.map((p) => reached.get(p)),
|
|
1554
|
+
notReached: models.filter((p) => !reached.has(p)),
|
|
1555
|
+
models: models.length
|
|
1556
|
+
};
|
|
1557
|
+
}
|
|
1558
|
+
|
|
1421
1559
|
// packages/verify/dist/method.js
|
|
1422
1560
|
var HTTP_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"]);
|
|
1423
1561
|
function wordsOf(line) {
|
|
@@ -2199,23 +2337,23 @@ async function verifyFacts(o) {
|
|
|
2199
2337
|
const accepted = facts.filter((f) => !rejected.has(f.id)).map((f) => {
|
|
2200
2338
|
o.room?.();
|
|
2201
2339
|
const verified = f.by === "person" && f.verified !== "none" ? f.verified : "line";
|
|
2202
|
-
const
|
|
2203
|
-
if (
|
|
2340
|
+
const base2 = { ...f, verified, cite: fixQuote(f.cite) };
|
|
2341
|
+
if (base2.kind === "entry" && base2.auth !== void 0 && !base2.authCite && f.by !== "person")
|
|
2204
2342
|
authUncited.push({
|
|
2205
|
-
id:
|
|
2206
|
-
auth:
|
|
2207
|
-
cite: `${
|
|
2343
|
+
id: base2.id,
|
|
2344
|
+
auth: base2.auth,
|
|
2345
|
+
cite: `${base2.cite.file}:${base2.cite.line}`
|
|
2208
2346
|
});
|
|
2209
|
-
const unseen = methodUnseenOf(
|
|
2347
|
+
const unseen = methodUnseenOf(base2, linesOf2, factById);
|
|
2210
2348
|
if (unseen)
|
|
2211
2349
|
methodUnseen.push(unseen);
|
|
2212
|
-
if (
|
|
2350
|
+
if (base2.kind === "flow")
|
|
2213
2351
|
return {
|
|
2214
|
-
...
|
|
2215
|
-
steps:
|
|
2216
|
-
errors:
|
|
2352
|
+
...base2,
|
|
2353
|
+
steps: base2.steps.map((s) => ({ ...s, cite: fixQuote(s.cite) })),
|
|
2354
|
+
errors: base2.errors.map((e) => ({ ...e, cite: fixQuote(e.cite) }))
|
|
2217
2355
|
};
|
|
2218
|
-
return
|
|
2356
|
+
return base2;
|
|
2219
2357
|
});
|
|
2220
2358
|
const excludeRes = (o.exclude ?? []).map(globToRegExp);
|
|
2221
2359
|
const sources = [];
|
|
@@ -2284,6 +2422,11 @@ async function verifyFacts(o) {
|
|
|
2284
2422
|
refuse("is not in the repo at this commit; name a file you read");
|
|
2285
2423
|
continue;
|
|
2286
2424
|
}
|
|
2425
|
+
const entryPoints = re ? matched.filter((p) => isSource.has(p) && !touched.has(p) && isEntryPointFile(p)) : [];
|
|
2426
|
+
if (entryPoints.length) {
|
|
2427
|
+
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)`);
|
|
2428
|
+
continue;
|
|
2429
|
+
}
|
|
2287
2430
|
const files = matched.filter((p) => isSource.has(p) && !touched.has(p)).sort();
|
|
2288
2431
|
for (const p of files)
|
|
2289
2432
|
reviewedSet.add(p);
|
|
@@ -2293,7 +2436,9 @@ async function verifyFacts(o) {
|
|
|
2293
2436
|
}
|
|
2294
2437
|
const read = sources.filter((p) => touched.has(p)).sort();
|
|
2295
2438
|
const reviewedFiles = sources.filter((p) => reviewedSet.has(p)).sort();
|
|
2296
|
-
const
|
|
2439
|
+
const leftOut = new Set(o.notReached ?? []);
|
|
2440
|
+
const notReached = sources.filter((p) => leftOut.has(p) && !touched.has(p) && !reviewedSet.has(p)).sort();
|
|
2441
|
+
const unknown = sources.filter((p) => !touched.has(p) && !reviewedSet.has(p) && !leftOut.has(p)).sort();
|
|
2297
2442
|
const total = read.length + reviewedFiles.length + unknown.length;
|
|
2298
2443
|
const ratio = total === 0 ? 1 : Math.round(read.length / total * 1e3) / 1e3;
|
|
2299
2444
|
const ix = indexFacts(accepted);
|
|
@@ -2326,7 +2471,14 @@ async function verifyFacts(o) {
|
|
|
2326
2471
|
accepted,
|
|
2327
2472
|
// a rejected fact goes back as it was read, at its own commit, even one that was carried
|
|
2328
2473
|
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),
|
|
2329
|
-
coverage: {
|
|
2474
|
+
coverage: {
|
|
2475
|
+
read,
|
|
2476
|
+
reviewed: reviewedFiles,
|
|
2477
|
+
unknown,
|
|
2478
|
+
excluded: excluded.sort(),
|
|
2479
|
+
notReached,
|
|
2480
|
+
ratio
|
|
2481
|
+
},
|
|
2330
2482
|
redacted,
|
|
2331
2483
|
quotesDropped,
|
|
2332
2484
|
carried: accepted.flatMap((f) => carriedFrom.has(f.id) ? [{ id: f.id, from: carriedFrom.get(f.id) }] : []),
|
|
@@ -2354,10 +2506,10 @@ var BOUNDARY_NAME = /(client|gateway|repository|repo|dao|mapper|entity|model|dto
|
|
|
2354
2506
|
var BOUNDARY_FILE = /\.(sql|proto|graphql|gql|avsc|wsdl|xsd)$|(^|\/)(openapi|swagger)[^/]*\.(ya?ml|json)$/i;
|
|
2355
2507
|
var BOUNDARY_DIR = /(^|\/)(clients?|gateways?|repositories|dao|models?|entities|dto|migrations?)\//i;
|
|
2356
2508
|
var TEST = /(^|\/)(test|tests|__tests__|spec|specs|e2e|it)\/|[._-](test|spec)\.[^/.]+$|(Test|Tests|IT|Spec)\.[^/.]+$|(^|\/)test_[^/]+$|_test\.go$/;
|
|
2357
|
-
var
|
|
2358
|
-
const
|
|
2359
|
-
const dot =
|
|
2360
|
-
return dot > 0 ?
|
|
2509
|
+
var stem2 = (path) => {
|
|
2510
|
+
const base2 = path.slice(path.lastIndexOf("/") + 1);
|
|
2511
|
+
const dot = base2.indexOf(".");
|
|
2512
|
+
return dot > 0 ? base2.slice(0, dot) : base2;
|
|
2361
2513
|
};
|
|
2362
2514
|
function readingRank(path) {
|
|
2363
2515
|
if (TEST.test(path))
|
|
@@ -2366,7 +2518,7 @@ function readingRank(path) {
|
|
|
2366
2518
|
return 0;
|
|
2367
2519
|
if (CONFIG.test(path))
|
|
2368
2520
|
return 1;
|
|
2369
|
-
const s =
|
|
2521
|
+
const s = stem2(path);
|
|
2370
2522
|
if (ENTRY_NAME.test(s) || ENTRY_DIR.test(path))
|
|
2371
2523
|
return 2;
|
|
2372
2524
|
if (BOUNDARY_NAME.test(s) || BOUNDARY_FILE.test(path) || BOUNDARY_DIR.test(path))
|
|
@@ -2482,6 +2634,8 @@ function planBatches(source, o) {
|
|
|
2482
2634
|
const rules = readRulesOf(o.conventions);
|
|
2483
2635
|
const excludeRes = (o.exclude ?? []).map(globToRegExp);
|
|
2484
2636
|
const excluded = [];
|
|
2637
|
+
const leaveOut = new Set(o.reach?.leaveOut ?? []);
|
|
2638
|
+
const notReached = [];
|
|
2485
2639
|
const paths = [];
|
|
2486
2640
|
const texts = /* @__PURE__ */ new Map();
|
|
2487
2641
|
for (const p of source.list()) {
|
|
@@ -2497,6 +2651,10 @@ function planBatches(source, o) {
|
|
|
2497
2651
|
}
|
|
2498
2652
|
if (!text.trim())
|
|
2499
2653
|
continue;
|
|
2654
|
+
if (leaveOut.has(p)) {
|
|
2655
|
+
notReached.push(p);
|
|
2656
|
+
continue;
|
|
2657
|
+
}
|
|
2500
2658
|
paths.push(p);
|
|
2501
2659
|
texts.set(p, text);
|
|
2502
2660
|
}
|
|
@@ -2512,7 +2670,7 @@ function planBatches(source, o) {
|
|
|
2512
2670
|
const slices = [];
|
|
2513
2671
|
let lines = 0;
|
|
2514
2672
|
let leastRoom = room;
|
|
2515
|
-
for (const path of
|
|
2673
|
+
for (const path of reachOrder(paths, o.reach?.first)) {
|
|
2516
2674
|
const kinds2 = fileKinds(path, rules);
|
|
2517
2675
|
const left = room - overhead(kinds2);
|
|
2518
2676
|
leastRoom = Math.min(leastRoom, left);
|
|
@@ -2561,9 +2719,20 @@ function planBatches(source, o) {
|
|
|
2561
2719
|
tokens: slices.reduce((n, s) => n + s.tokens, 0),
|
|
2562
2720
|
batches,
|
|
2563
2721
|
excluded: excluded.sort(),
|
|
2564
|
-
leastRoom
|
|
2722
|
+
leastRoom,
|
|
2723
|
+
notReached: notReached.sort()
|
|
2565
2724
|
};
|
|
2566
2725
|
}
|
|
2726
|
+
function reachOrder(paths, first) {
|
|
2727
|
+
const order = readingOrder(paths);
|
|
2728
|
+
if (!first?.length)
|
|
2729
|
+
return order;
|
|
2730
|
+
const has = new Set(paths);
|
|
2731
|
+
const head = order.filter((p) => readingRank(p) <= 1);
|
|
2732
|
+
const lead = [...new Set(first)].filter((p) => has.has(p) && readingRank(p) > 1);
|
|
2733
|
+
const taken = /* @__PURE__ */ new Set([...head, ...lead]);
|
|
2734
|
+
return [...head, ...lead, ...order.filter((p) => !taken.has(p))];
|
|
2735
|
+
}
|
|
2567
2736
|
|
|
2568
2737
|
// packages/verify/dist/vendored.js
|
|
2569
2738
|
var LICENSE_FILE = /^(LICEN[CS]E|COPYING)([._-][^/]*)?$/i;
|
|
@@ -2871,27 +3040,101 @@ function unitsOf(dir, fs, room) {
|
|
|
2871
3040
|
out.push(...unitsOf(child, children.get(child), room));
|
|
2872
3041
|
return out;
|
|
2873
3042
|
}
|
|
2874
|
-
function
|
|
3043
|
+
function groupUnits(dir, fs, room, holds) {
|
|
3044
|
+
const prefix = dir ? `${dir}/` : "";
|
|
3045
|
+
const direct = [];
|
|
3046
|
+
const children = /* @__PURE__ */ new Map();
|
|
3047
|
+
for (const f of fs) {
|
|
3048
|
+
const rest = f.path.slice(prefix.length);
|
|
3049
|
+
const slash = rest.indexOf("/");
|
|
3050
|
+
if (slash < 0)
|
|
3051
|
+
direct.push(f);
|
|
3052
|
+
else {
|
|
3053
|
+
const child = prefix + rest.slice(0, slash);
|
|
3054
|
+
children.set(child, [...children.get(child) ?? [], f]);
|
|
3055
|
+
}
|
|
3056
|
+
}
|
|
3057
|
+
if (dir && holds(dir, true, fs.length) && (sum(fs) <= room || !children.size))
|
|
3058
|
+
return [{ glob: `${dir}/**`, files: fs.length, tokens: sum(fs) }];
|
|
3059
|
+
const out = [];
|
|
3060
|
+
if (direct.length) {
|
|
3061
|
+
if (holds(dir, false, direct.length))
|
|
3062
|
+
out.push({ glob: `${prefix}*`, files: direct.length, tokens: sum(direct) });
|
|
3063
|
+
else
|
|
3064
|
+
for (const f of [...direct].sort((a, b) => byPath2(a.path, b.path)))
|
|
3065
|
+
out.push({ glob: f.path, files: 1, tokens: f.tokens });
|
|
3066
|
+
}
|
|
3067
|
+
for (const child of [...children.keys()].sort(byPath2))
|
|
3068
|
+
out.push(...groupUnits(child, children.get(child), room, holds));
|
|
3069
|
+
return out;
|
|
3070
|
+
}
|
|
3071
|
+
function rangeUnits(f, room) {
|
|
3072
|
+
return lineRanges({ ...f, lines: f.lines }, room).map((r, i) => ({
|
|
3073
|
+
glob: `${f.path}#L${r.from}-L${r.to}`,
|
|
3074
|
+
files: i === 0 ? 1 : 0,
|
|
3075
|
+
tokens: r.tokens
|
|
3076
|
+
}));
|
|
3077
|
+
}
|
|
3078
|
+
function orderedUnits(files, room, o) {
|
|
3079
|
+
const isBig = (f) => f.tokens > room && (f.lines ?? 0) > 1;
|
|
3080
|
+
const byFile = new Map(files.map((f) => [f.path, f]));
|
|
3081
|
+
const head = new Set(o.head.filter((p) => byFile.has(p)));
|
|
3082
|
+
const models = [...new Set(o.models)].filter((p) => byFile.has(p) && !head.has(p));
|
|
3083
|
+
const inModels = new Set(models);
|
|
3084
|
+
const rest = files.filter((f) => !head.has(f.path) && !inModels.has(f.path));
|
|
3085
|
+
const all2 = [...files.map((f) => f.path), ...o.leftOut];
|
|
3086
|
+
const counts = () => {
|
|
3087
|
+
const deep = /* @__PURE__ */ new Map();
|
|
3088
|
+
const own = /* @__PURE__ */ new Map();
|
|
3089
|
+
const count = (m, k) => m.set(k, (m.get(k) ?? 0) + 1);
|
|
3090
|
+
for (const p of all2) {
|
|
3091
|
+
const parts = p.split("/");
|
|
3092
|
+
count(own, parts.slice(0, -1).join("/"));
|
|
3093
|
+
for (let d = 1; d < parts.length; d++)
|
|
3094
|
+
count(deep, parts.slice(0, d).join("/"));
|
|
3095
|
+
}
|
|
3096
|
+
return (dir, isDeep, n) => (isDeep ? deep.get(dir) : own.get(dir)) === n;
|
|
3097
|
+
};
|
|
3098
|
+
const holds = counts();
|
|
3099
|
+
const unitsOfGroup = (group) => {
|
|
3100
|
+
const small = group.filter((f) => !isBig(f)).sort((a, b) => byPath2(a.path, b.path));
|
|
3101
|
+
const out = groupUnits("", small, room, holds);
|
|
3102
|
+
for (const f of group.filter(isBig))
|
|
3103
|
+
out.push(...rangeUnits(f, room));
|
|
3104
|
+
return out;
|
|
3105
|
+
};
|
|
3106
|
+
return [
|
|
3107
|
+
...unitsOfGroup(files.filter((f) => head.has(f.path))),
|
|
3108
|
+
...models.flatMap((p) => {
|
|
3109
|
+
const f = byFile.get(p);
|
|
3110
|
+
return isBig(f) ? rangeUnits(f, room) : [{ glob: p, files: 1, tokens: f.tokens }];
|
|
3111
|
+
}),
|
|
3112
|
+
...unitsOfGroup(rest)
|
|
3113
|
+
];
|
|
3114
|
+
}
|
|
3115
|
+
function planParts(files, room = SESSION_TOKENS, order) {
|
|
2875
3116
|
const total = sum(files);
|
|
2876
3117
|
if (total <= room)
|
|
2877
3118
|
return [];
|
|
2878
|
-
|
|
2879
|
-
|
|
2880
|
-
|
|
2881
|
-
|
|
2882
|
-
|
|
2883
|
-
|
|
2884
|
-
|
|
2885
|
-
|
|
2886
|
-
|
|
2887
|
-
|
|
2888
|
-
|
|
2889
|
-
|
|
2890
|
-
|
|
2891
|
-
|
|
2892
|
-
|
|
2893
|
-
...
|
|
2894
|
-
|
|
3119
|
+
let units;
|
|
3120
|
+
if (order)
|
|
3121
|
+
units = orderedUnits(files, room, order);
|
|
3122
|
+
else {
|
|
3123
|
+
const big = files.filter((f) => f.tokens > room && (f.lines ?? 0) > 1);
|
|
3124
|
+
const rest = files.filter((f) => !big.includes(f));
|
|
3125
|
+
const ranges = [];
|
|
3126
|
+
for (const f of big)
|
|
3127
|
+
for (const [i, r] of lineRanges({ ...f, lines: f.lines }, room).entries())
|
|
3128
|
+
ranges.push({
|
|
3129
|
+
glob: `${f.path}#L${r.from}-L${r.to}`,
|
|
3130
|
+
files: i === 0 ? 1 : 0,
|
|
3131
|
+
tokens: r.tokens,
|
|
3132
|
+
key: `${f.path}\0${String(r.start).padStart(12, "0")}`
|
|
3133
|
+
});
|
|
3134
|
+
const sorted = [...rest].sort((a, b) => byPath2(a.path, b.path));
|
|
3135
|
+
const keyOf = (g) => g.replace(/\/?\*\*?$/, "");
|
|
3136
|
+
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);
|
|
3137
|
+
}
|
|
2895
3138
|
const target = total / Math.ceil(total / room);
|
|
2896
3139
|
const parts = [];
|
|
2897
3140
|
let current;
|
|
@@ -2920,7 +3163,7 @@ function split(cite2) {
|
|
|
2920
3163
|
const m = /^(.+):(\d+)$/.exec(cite2);
|
|
2921
3164
|
return m ? { file: m[1], line: Number(m[2]) } : void 0;
|
|
2922
3165
|
}
|
|
2923
|
-
function planGaps(from, size, room) {
|
|
3166
|
+
function planGaps(from, size, room, o = {}) {
|
|
2924
3167
|
const whole = new Set(from.unknown ?? []);
|
|
2925
3168
|
const lines = /* @__PURE__ */ new Map();
|
|
2926
3169
|
const note = (cite2, why) => {
|
|
@@ -2936,14 +3179,15 @@ function planGaps(from, size, room) {
|
|
|
2936
3179
|
for (const h of from.reviewedHolds ?? [])
|
|
2937
3180
|
for (const s of h.skipped)
|
|
2938
3181
|
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`);
|
|
2939
|
-
for (const
|
|
2940
|
-
note(
|
|
3182
|
+
for (const o2 of from.specOpsUncovered ?? [])
|
|
3183
|
+
note(o2.cite, `declares ${o2.method} ${quoted2(o2.path)}, which no entry covers: find the code that serves it`);
|
|
2941
3184
|
for (const e of from.entriesNoFlowFollows ?? [])
|
|
2942
3185
|
note(e.cite, `is ${e.id} (${[e.entryType, e.method, quoted2(e.path)].filter(Boolean).join(" ")}), which no flow follows: write its flow`);
|
|
2943
3186
|
const unlisted = Math.max(0, (from.skippedCount ?? 0) - (from.skipped?.length ?? 0)) + Math.max(0, (from.specOpsUncoveredCount ?? 0) - (from.specOpsUncovered?.length ?? 0));
|
|
2944
3187
|
const gone = [];
|
|
2945
3188
|
const reads = [];
|
|
2946
|
-
const
|
|
3189
|
+
const named = [.../* @__PURE__ */ new Set([...whole, ...lines.keys()])].sort(byPath3);
|
|
3190
|
+
const files = o.first?.length ? reachOrder(named, o.first) : named;
|
|
2947
3191
|
for (const file of files) {
|
|
2948
3192
|
const sz = size(file);
|
|
2949
3193
|
if (!sz) {
|
|
@@ -3499,8 +3743,8 @@ function changeView(records2, change, flows, known = []) {
|
|
|
3499
3743
|
const nodes = [];
|
|
3500
3744
|
for (const id of comps) {
|
|
3501
3745
|
const sys = c.components.has(id) ? c.systemOf(id) : void 0;
|
|
3502
|
-
const
|
|
3503
|
-
const { legend: _status, ...rest } =
|
|
3746
|
+
const base2 = c.components.has(id) || c.isSystem(id) ? c.endNode(id, sys) : { id, label: id, kind: "component" };
|
|
3747
|
+
const { legend: _status, ...rest } = base2;
|
|
3504
3748
|
nodes.push({ ...rest, label: marked(rest.label, legends.get(id)), ...withMark(id) });
|
|
3505
3749
|
}
|
|
3506
3750
|
for (const t of tables) {
|
|
@@ -3596,14 +3840,14 @@ var Ids = class {
|
|
|
3596
3840
|
const known = this.map.get(key);
|
|
3597
3841
|
if (known)
|
|
3598
3842
|
return known;
|
|
3599
|
-
let
|
|
3600
|
-
if (!/^[A-Za-z]/.test(
|
|
3601
|
-
|
|
3602
|
-
if (RESERVED.has(
|
|
3603
|
-
|
|
3604
|
-
let id =
|
|
3843
|
+
let base2 = raw.replace(/[^A-Za-z0-9_]/g, "_");
|
|
3844
|
+
if (!/^[A-Za-z]/.test(base2))
|
|
3845
|
+
base2 = `n_${base2}`;
|
|
3846
|
+
if (RESERVED.has(base2.toLowerCase()))
|
|
3847
|
+
base2 = `${base2}_`;
|
|
3848
|
+
let id = base2;
|
|
3605
3849
|
for (let n = 2; this.used.has(id); n++)
|
|
3606
|
-
id = `${
|
|
3850
|
+
id = `${base2}_${n}`;
|
|
3607
3851
|
this.used.add(id);
|
|
3608
3852
|
this.map.set(key, id);
|
|
3609
3853
|
return id;
|
|
@@ -3792,8 +4036,8 @@ function nodeStyle(n) {
|
|
|
3792
4036
|
return styleText(SHAPES.topic, legend);
|
|
3793
4037
|
if (n.boundary === "vendor")
|
|
3794
4038
|
return styleText(SHAPES.vendor, n.kind === "component" ? { atticusKind: "component" } : {}, legend);
|
|
3795
|
-
const
|
|
3796
|
-
return styleText(
|
|
4039
|
+
const base2 = n.kind === "system" ? SHAPES.system : SHAPES.component;
|
|
4040
|
+
return styleText(base2, n.boundary ? BOUNDARY[n.boundary] : void 0, legend);
|
|
3797
4041
|
}
|
|
3798
4042
|
function groupStyle(g) {
|
|
3799
4043
|
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);
|
|
@@ -3884,14 +4128,14 @@ function edgeStyle(e) {
|
|
|
3884
4128
|
}
|
|
3885
4129
|
var compress = (xml) => deflateRawSync(Buffer.from(encodeURIComponent(xml), "utf8"), { level: 9 }).toString("base64");
|
|
3886
4130
|
function shapeLibrary() {
|
|
3887
|
-
const
|
|
4131
|
+
const base2 = [
|
|
3888
4132
|
["System", SHAPES.system, W, H],
|
|
3889
4133
|
["Component", SHAPES.component, W, H],
|
|
3890
4134
|
["Vendor", SHAPES.vendor, W, H + 20],
|
|
3891
4135
|
["Data store", SHAPES.datastore, 120, 80],
|
|
3892
4136
|
["Topic", SHAPES.topic, W, H]
|
|
3893
4137
|
];
|
|
3894
|
-
const entries =
|
|
4138
|
+
const entries = base2.flatMap(([title, style, w, h]) => [void 0, "new", "modify", "retire"].map((legend) => {
|
|
3895
4139
|
const value = attr(title);
|
|
3896
4140
|
const st = attr(styleText(style, legend ? LEGEND[legend] : void 0));
|
|
3897
4141
|
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>`;
|
|
@@ -4834,13 +5078,13 @@ function codeLinkerFor(o) {
|
|
|
4834
5078
|
web = `https://${scp[1]}/${scp[2]}`;
|
|
4835
5079
|
}
|
|
4836
5080
|
if (web) {
|
|
4837
|
-
const
|
|
4838
|
-
const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(
|
|
5081
|
+
const base2 = web.replace(/\/+$/, "").replace(/\.git$/, "");
|
|
5082
|
+
const ado = /(^https?:\/\/dev\.azure\.com\/)|(\.visualstudio\.com\/)/i.test(base2);
|
|
4839
5083
|
return (path, line, commit) => {
|
|
4840
5084
|
const p = encodeURI(path);
|
|
4841
5085
|
if (ado)
|
|
4842
|
-
return `${
|
|
4843
|
-
return `${
|
|
5086
|
+
return `${base2}?path=/${p}${commit ? `&version=GC${commit}` : ""}${line ? `&line=${line}` : ""}`;
|
|
5087
|
+
return `${base2}/blob/${commit ?? "HEAD"}/${p}${line ? `#L${line}` : ""}`;
|
|
4844
5088
|
};
|
|
4845
5089
|
}
|
|
4846
5090
|
const dir = (o.dir ?? "").replace(/\/+$/, "");
|
|
@@ -5289,8 +5533,8 @@ function ctxOf(i, file) {
|
|
|
5289
5533
|
}
|
|
5290
5534
|
function renderMap(i) {
|
|
5291
5535
|
const files = {};
|
|
5292
|
-
const
|
|
5293
|
-
for (const comp of [...
|
|
5536
|
+
const base2 = ctxOf(i, "map.md");
|
|
5537
|
+
for (const comp of [...base2.comps].sort(cmp2)) {
|
|
5294
5538
|
const yaml = openApiOf(i, comp);
|
|
5295
5539
|
if (yaml)
|
|
5296
5540
|
files[`contracts/${comp}.openapi.yaml`] = yaml;
|
|
@@ -5304,18 +5548,18 @@ function renderMap(i) {
|
|
|
5304
5548
|
HEADER2(i.repo, "the catalog and its specs"),
|
|
5305
5549
|
"",
|
|
5306
5550
|
...aboutLine(i.about, i.repo),
|
|
5307
|
-
...builtOnLine(
|
|
5551
|
+
...builtOnLine(base2),
|
|
5308
5552
|
trustLine(i.trust, i.repo),
|
|
5309
5553
|
"",
|
|
5310
|
-
...section("What it serves", serves(
|
|
5311
|
-
...section("What it calls", calls(
|
|
5312
|
-
...section("What it stores", stores(
|
|
5313
|
-
...section("Where it runs", deploys(
|
|
5314
|
-
...section("Config that names other systems", config(
|
|
5315
|
-
...i.terms?.length ? section("Terms", terms(
|
|
5316
|
-
...section("Flows", flowsList(
|
|
5317
|
-
...section("Contracts", contracts(
|
|
5318
|
-
...section("Open questions", openQuestions(
|
|
5554
|
+
...section("What it serves", serves(base2)),
|
|
5555
|
+
...section("What it calls", calls(base2)),
|
|
5556
|
+
...section("What it stores", stores(base2)),
|
|
5557
|
+
...section("Where it runs", deploys(base2)),
|
|
5558
|
+
...section("Config that names other systems", config(base2)),
|
|
5559
|
+
...i.terms?.length ? section("Terms", terms(base2)) : [],
|
|
5560
|
+
...section("Flows", flowsList(base2)),
|
|
5561
|
+
...section("Contracts", contracts(base2, files)),
|
|
5562
|
+
...section("Open questions", openQuestions(base2))
|
|
5319
5563
|
].join("\n");
|
|
5320
5564
|
return Object.fromEntries(Object.entries(files).sort(([a], [b]) => cmp2(a, b)));
|
|
5321
5565
|
}
|
|
@@ -5525,7 +5769,7 @@ function repairFormSlips(facts, bad, onFile = []) {
|
|
|
5525
5769
|
}
|
|
5526
5770
|
|
|
5527
5771
|
// packages/verify/dist/house-imports.js
|
|
5528
|
-
var
|
|
5772
|
+
var CODE2 = /\.(java|kt|kts|scala|groovy|cs|vb|fs|ts|tsx|js|jsx|mjs|cjs|vue|svelte|py|go|rb|php|swift)$/i;
|
|
5529
5773
|
var IMPORTS = [
|
|
5530
5774
|
// Java, Kotlin, Scala, Groovy, Python's `import a.b`, Go's one-line import
|
|
5531
5775
|
/^\s*import\s+(?:static\s+)?([A-Za-z_][\w.]*)/,
|
|
@@ -5573,7 +5817,7 @@ function houseImportsUntaught(source, o) {
|
|
|
5573
5817
|
const prefixes = o.prefixes.map(lower);
|
|
5574
5818
|
const taught = o.taught.map(lower);
|
|
5575
5819
|
const found = /* @__PURE__ */ new Map();
|
|
5576
|
-
const paths = source.list().filter((p) =>
|
|
5820
|
+
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();
|
|
5577
5821
|
for (const p of paths) {
|
|
5578
5822
|
const text = source.read(p);
|
|
5579
5823
|
if (text === void 0)
|
|
@@ -5623,9 +5867,6 @@ export {
|
|
|
5623
5867
|
readRulesOf,
|
|
5624
5868
|
lineRangeOf,
|
|
5625
5869
|
parseReviewed,
|
|
5626
|
-
sameCommit,
|
|
5627
|
-
staleMessage,
|
|
5628
|
-
verifyFacts,
|
|
5629
5870
|
readingRank,
|
|
5630
5871
|
FILE_KINDS,
|
|
5631
5872
|
fileKinds,
|
|
@@ -5633,6 +5874,12 @@ export {
|
|
|
5633
5874
|
numberedSlice,
|
|
5634
5875
|
sliceText,
|
|
5635
5876
|
planBatches,
|
|
5877
|
+
isEntryPointFile,
|
|
5878
|
+
NOT_REACHED_WHY,
|
|
5879
|
+
reachableModels,
|
|
5880
|
+
sameCommit,
|
|
5881
|
+
staleMessage,
|
|
5882
|
+
verifyFacts,
|
|
5636
5883
|
SHOWN_PROPOSALS,
|
|
5637
5884
|
proposeExclusions,
|
|
5638
5885
|
exclusionYaml,
|