repopo 0.12.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/README.md +57 -90
  3. package/THIRD-PARTY-LICENSES.txt +169 -11
  4. package/bin/dev.js +0 -0
  5. package/esm/adapters/fluidFramework.d.ts +13 -9
  6. package/esm/adapters/fluidFramework.d.ts.map +1 -1
  7. package/esm/adapters/fluidFramework.js +20 -43
  8. package/esm/adapters/fluidFramework.js.map +1 -1
  9. package/esm/api.d.ts +66 -1
  10. package/esm/api.d.ts.map +1 -1
  11. package/esm/api.js +18 -1
  12. package/esm/api.js.map +1 -1
  13. package/esm/baseCommand.d.ts.map +1 -1
  14. package/esm/baseCommand.js +2 -2
  15. package/esm/baseCommand.js.map +1 -1
  16. package/esm/commands/check-native.d.ts +5 -3
  17. package/esm/commands/check-native.d.ts.map +1 -1
  18. package/esm/commands/check-native.js +35 -7
  19. package/esm/commands/check-native.js.map +1 -1
  20. package/esm/commands/check.d.ts +8 -21
  21. package/esm/commands/check.d.ts.map +1 -1
  22. package/esm/commands/check.js +98 -154
  23. package/esm/commands/check.js.map +1 -1
  24. package/esm/commands/list.d.ts.map +1 -1
  25. package/esm/commands/list.js +1 -0
  26. package/esm/commands/list.js.map +1 -1
  27. package/esm/concurrency.d.ts +3 -0
  28. package/esm/concurrency.d.ts.map +1 -0
  29. package/esm/concurrency.js +8 -0
  30. package/esm/concurrency.js.map +1 -0
  31. package/esm/config.d.ts +10 -39
  32. package/esm/config.d.ts.map +1 -1
  33. package/esm/config.js +3 -7
  34. package/esm/config.js.map +1 -1
  35. package/esm/context.d.ts +10 -1
  36. package/esm/context.d.ts.map +1 -1
  37. package/esm/context.js +19 -1
  38. package/esm/context.js.map +1 -1
  39. package/esm/executionContractError.d.ts +4 -0
  40. package/esm/executionContractError.d.ts.map +1 -0
  41. package/esm/executionContractError.js +4 -0
  42. package/esm/executionContractError.js.map +1 -0
  43. package/esm/fileCache.d.ts +12 -0
  44. package/esm/fileCache.d.ts.map +1 -0
  45. package/esm/fileCache.js +37 -0
  46. package/esm/fileCache.js.map +1 -0
  47. package/esm/filePaths.d.ts +2 -0
  48. package/esm/filePaths.d.ts.map +1 -0
  49. package/esm/filePaths.js +9 -0
  50. package/esm/filePaths.js.map +1 -0
  51. package/esm/generators.d.ts +0 -20
  52. package/esm/generators.d.ts.map +1 -1
  53. package/esm/generators.js.map +1 -1
  54. package/esm/index.d.ts +3 -16
  55. package/esm/index.d.ts.map +1 -1
  56. package/esm/index.js +3 -17
  57. package/esm/index.js.map +1 -1
  58. package/esm/makePolicy.d.ts +20 -100
  59. package/esm/makePolicy.d.ts.map +1 -1
  60. package/esm/makePolicy.js +46 -132
  61. package/esm/makePolicy.js.map +1 -1
  62. package/esm/perf.d.ts +5 -2
  63. package/esm/perf.d.ts.map +1 -1
  64. package/esm/perf.js +10 -9
  65. package/esm/perf.js.map +1 -1
  66. package/esm/policies/CargoLicenceValidated.d.ts +4 -4
  67. package/esm/policies/CargoLicenceValidated.d.ts.map +1 -1
  68. package/esm/policies/CargoLicenceValidated.js +9 -7
  69. package/esm/policies/CargoLicenceValidated.js.map +1 -1
  70. package/esm/policies/CargoLintsConfigured.d.ts +4 -4
  71. package/esm/policies/CargoLintsConfigured.d.ts.map +1 -1
  72. package/esm/policies/CargoLintsConfigured.js +19 -15
  73. package/esm/policies/CargoLintsConfigured.js.map +1 -1
  74. package/esm/policies/CargoLockPolicy.d.ts +4 -4
  75. package/esm/policies/CargoLockPolicy.d.ts.map +1 -1
  76. package/esm/policies/CargoLockPolicy.js +15 -11
  77. package/esm/policies/CargoLockPolicy.js.map +1 -1
  78. package/esm/policies/CargoTomlRequired.d.ts +5 -5
  79. package/esm/policies/CargoTomlRequired.d.ts.map +1 -1
  80. package/esm/policies/CargoTomlRequired.js +7 -7
  81. package/esm/policies/CargoTomlRequired.js.map +1 -1
  82. package/esm/policies/CargoTomlSorted.d.ts +4 -4
  83. package/esm/policies/CargoTomlSorted.d.ts.map +1 -1
  84. package/esm/policies/CargoTomlSorted.js +21 -17
  85. package/esm/policies/CargoTomlSorted.js.map +1 -1
  86. package/esm/policies/ConditionalScripts.d.ts +10 -8
  87. package/esm/policies/ConditionalScripts.d.ts.map +1 -1
  88. package/esm/policies/ConditionalScripts.js +24 -22
  89. package/esm/policies/ConditionalScripts.js.map +1 -1
  90. package/esm/policies/ExactScripts.d.ts +8 -6
  91. package/esm/policies/ExactScripts.d.ts.map +1 -1
  92. package/esm/policies/ExactScripts.js +15 -18
  93. package/esm/policies/ExactScripts.js.map +1 -1
  94. package/esm/policies/GleamDepVersions.d.ts +5 -5
  95. package/esm/policies/GleamDepVersions.d.ts.map +1 -1
  96. package/esm/policies/GleamDepVersions.js +5 -5
  97. package/esm/policies/GleamDepVersions.js.map +1 -1
  98. package/esm/policies/GleamDocExists.d.ts +4 -4
  99. package/esm/policies/GleamDocExists.d.ts.map +1 -1
  100. package/esm/policies/GleamDocExists.js +6 -6
  101. package/esm/policies/GleamDocExists.js.map +1 -1
  102. package/esm/policies/GleamInternalModulesConfigured.d.ts +4 -4
  103. package/esm/policies/GleamInternalModulesConfigured.d.ts.map +1 -1
  104. package/esm/policies/GleamInternalModulesConfigured.js +8 -6
  105. package/esm/policies/GleamInternalModulesConfigured.js.map +1 -1
  106. package/esm/policies/GleamLicenceConfigured.d.ts +4 -4
  107. package/esm/policies/GleamLicenceConfigured.d.ts.map +1 -1
  108. package/esm/policies/GleamLicenceConfigured.js +8 -6
  109. package/esm/policies/GleamLicenceConfigured.js.map +1 -1
  110. package/esm/policies/GleamManifestCommitted.d.ts +10 -3
  111. package/esm/policies/GleamManifestCommitted.d.ts.map +1 -1
  112. package/esm/policies/GleamManifestCommitted.js +10 -9
  113. package/esm/policies/GleamManifestCommitted.js.map +1 -1
  114. package/esm/policies/GleamMonorepoConsistency.d.ts +13 -5
  115. package/esm/policies/GleamMonorepoConsistency.d.ts.map +1 -1
  116. package/esm/policies/GleamMonorepoConsistency.js +10 -10
  117. package/esm/policies/GleamMonorepoConsistency.js.map +1 -1
  118. package/esm/policies/GleamNameRestrictions.d.ts +4 -4
  119. package/esm/policies/GleamNameRestrictions.d.ts.map +1 -1
  120. package/esm/policies/GleamNameRestrictions.js +6 -6
  121. package/esm/policies/GleamNameRestrictions.js.map +1 -1
  122. package/esm/policies/GleamNoPathDepsInPublished.d.ts +4 -4
  123. package/esm/policies/GleamNoPathDepsInPublished.d.ts.map +1 -1
  124. package/esm/policies/GleamNoPathDepsInPublished.js +6 -6
  125. package/esm/policies/GleamNoPathDepsInPublished.js.map +1 -1
  126. package/esm/policies/GleamPathDepsValid.d.ts +3 -3
  127. package/esm/policies/GleamPathDepsValid.d.ts.map +1 -1
  128. package/esm/policies/GleamPathDepsValid.js +5 -5
  129. package/esm/policies/GleamPathDepsValid.js.map +1 -1
  130. package/esm/policies/GleamProjectStructure.d.ts +11 -4
  131. package/esm/policies/GleamProjectStructure.d.ts.map +1 -1
  132. package/esm/policies/GleamProjectStructure.js +7 -8
  133. package/esm/policies/GleamProjectStructure.js.map +1 -1
  134. package/esm/policies/GleamSharedDependencyVersions.d.ts +12 -4
  135. package/esm/policies/GleamSharedDependencyVersions.d.ts.map +1 -1
  136. package/esm/policies/GleamSharedDependencyVersions.js +10 -10
  137. package/esm/policies/GleamSharedDependencyVersions.js.map +1 -1
  138. package/esm/policies/GleamTomlRequired.d.ts +4 -4
  139. package/esm/policies/GleamTomlRequired.d.ts.map +1 -1
  140. package/esm/policies/GleamTomlRequired.js +5 -5
  141. package/esm/policies/GleamTomlRequired.js.map +1 -1
  142. package/esm/policies/GleamTomlSorted.d.ts +4 -4
  143. package/esm/policies/GleamTomlSorted.d.ts.map +1 -1
  144. package/esm/policies/GleamTomlSorted.js +21 -17
  145. package/esm/policies/GleamTomlSorted.js.map +1 -1
  146. package/esm/policies/GleamVersionConstraint.d.ts +4 -4
  147. package/esm/policies/GleamVersionConstraint.d.ts.map +1 -1
  148. package/esm/policies/GleamVersionConstraint.js +14 -10
  149. package/esm/policies/GleamVersionConstraint.js.map +1 -1
  150. package/esm/policies/HtmlFileHeaders.d.ts +4 -2
  151. package/esm/policies/HtmlFileHeaders.d.ts.map +1 -1
  152. package/esm/policies/HtmlFileHeaders.js +1 -1
  153. package/esm/policies/HtmlFileHeaders.js.map +1 -1
  154. package/esm/policies/JsTsFileHeaders.d.ts +4 -2
  155. package/esm/policies/JsTsFileHeaders.d.ts.map +1 -1
  156. package/esm/policies/JsTsFileHeaders.js +1 -1
  157. package/esm/policies/JsTsFileHeaders.js.map +1 -1
  158. package/esm/policies/LicenseFileExists.d.ts +10 -4
  159. package/esm/policies/LicenseFileExists.d.ts.map +1 -1
  160. package/esm/policies/LicenseFileExists.js +27 -20
  161. package/esm/policies/LicenseFileExists.js.map +1 -1
  162. package/esm/policies/MaxChangedFiles.d.ts +17 -0
  163. package/esm/policies/MaxChangedFiles.d.ts.map +1 -0
  164. package/esm/policies/MaxChangedFiles.js +22 -0
  165. package/esm/policies/MaxChangedFiles.js.map +1 -0
  166. package/esm/policies/MutuallyExclusiveScripts.d.ts +8 -6
  167. package/esm/policies/MutuallyExclusiveScripts.d.ts.map +1 -1
  168. package/esm/policies/MutuallyExclusiveScripts.js +9 -13
  169. package/esm/policies/MutuallyExclusiveScripts.js.map +1 -1
  170. package/esm/policies/NoBuildDirectory.d.ts +9 -3
  171. package/esm/policies/NoBuildDirectory.d.ts.map +1 -1
  172. package/esm/policies/NoBuildDirectory.js +8 -13
  173. package/esm/policies/NoBuildDirectory.js.map +1 -1
  174. package/esm/policies/NoJsFileExtensions.d.ts +9 -3
  175. package/esm/policies/NoJsFileExtensions.d.ts.map +1 -1
  176. package/esm/policies/NoJsFileExtensions.js +9 -14
  177. package/esm/policies/NoJsFileExtensions.js.map +1 -1
  178. package/esm/policies/NoLargeBinaryFiles.d.ts +9 -4
  179. package/esm/policies/NoLargeBinaryFiles.d.ts.map +1 -1
  180. package/esm/policies/NoLargeBinaryFiles.js +10 -16
  181. package/esm/policies/NoLargeBinaryFiles.js.map +1 -1
  182. package/esm/policies/NoPrivateWorkspaceDependencies.d.ts +10 -6
  183. package/esm/policies/NoPrivateWorkspaceDependencies.d.ts.map +1 -1
  184. package/esm/policies/NoPrivateWorkspaceDependencies.js +12 -14
  185. package/esm/policies/NoPrivateWorkspaceDependencies.js.map +1 -1
  186. package/esm/policies/NoTargetArtifacts.d.ts +9 -3
  187. package/esm/policies/NoTargetArtifacts.d.ts.map +1 -1
  188. package/esm/policies/NoTargetArtifacts.js +9 -14
  189. package/esm/policies/NoTargetArtifacts.js.map +1 -1
  190. package/esm/policies/NoUnsafeWithoutJustification.d.ts +11 -4
  191. package/esm/policies/NoUnsafeWithoutJustification.d.ts.map +1 -1
  192. package/esm/policies/NoUnsafeWithoutJustification.js +8 -9
  193. package/esm/policies/NoUnsafeWithoutJustification.js.map +1 -1
  194. package/esm/policies/NoWildcardDependencies.d.ts +5 -5
  195. package/esm/policies/NoWildcardDependencies.d.ts.map +1 -1
  196. package/esm/policies/NoWildcardDependencies.js +6 -6
  197. package/esm/policies/NoWildcardDependencies.js.map +1 -1
  198. package/esm/policies/PackageAllowedScopes.d.ts +9 -5
  199. package/esm/policies/PackageAllowedScopes.d.ts.map +1 -1
  200. package/esm/policies/PackageAllowedScopes.js +15 -16
  201. package/esm/policies/PackageAllowedScopes.js.map +1 -1
  202. package/esm/policies/PackageEsmType.d.ts +7 -5
  203. package/esm/policies/PackageEsmType.d.ts.map +1 -1
  204. package/esm/policies/PackageEsmType.js +31 -31
  205. package/esm/policies/PackageEsmType.js.map +1 -1
  206. package/esm/policies/PackageFolderName.d.ts +8 -6
  207. package/esm/policies/PackageFolderName.d.ts.map +1 -1
  208. package/esm/policies/PackageFolderName.js +13 -16
  209. package/esm/policies/PackageFolderName.js.map +1 -1
  210. package/esm/policies/PackageJsonProperties.d.ts +5 -3
  211. package/esm/policies/PackageJsonProperties.d.ts.map +1 -1
  212. package/esm/policies/PackageJsonProperties.js +6 -17
  213. package/esm/policies/PackageJsonProperties.js.map +1 -1
  214. package/esm/policies/PackageJsonRepoDirectoryProperty.d.ts +2 -7
  215. package/esm/policies/PackageJsonRepoDirectoryProperty.d.ts.map +1 -1
  216. package/esm/policies/PackageJsonRepoDirectoryProperty.js +28 -42
  217. package/esm/policies/PackageJsonRepoDirectoryProperty.js.map +1 -1
  218. package/esm/policies/PackageJsonSorted.d.ts +2 -2
  219. package/esm/policies/PackageJsonSorted.d.ts.map +1 -1
  220. package/esm/policies/PackageJsonSorted.js +15 -30
  221. package/esm/policies/PackageJsonSorted.js.map +1 -1
  222. package/esm/policies/PackageLicense.d.ts +4 -4
  223. package/esm/policies/PackageLicense.d.ts.map +1 -1
  224. package/esm/policies/PackageLicense.js +31 -52
  225. package/esm/policies/PackageLicense.js.map +1 -1
  226. package/esm/policies/PackagePrivateField.d.ts +12 -8
  227. package/esm/policies/PackagePrivateField.d.ts.map +1 -1
  228. package/esm/policies/PackagePrivateField.js +31 -23
  229. package/esm/policies/PackagePrivateField.js.map +1 -1
  230. package/esm/policies/PackageReadme.d.ts +6 -5
  231. package/esm/policies/PackageReadme.d.ts.map +1 -1
  232. package/esm/policies/PackageReadme.js +22 -59
  233. package/esm/policies/PackageReadme.js.map +1 -1
  234. package/esm/policies/PackageScripts.d.ts +26 -22
  235. package/esm/policies/PackageScripts.d.ts.map +1 -1
  236. package/esm/policies/PackageScripts.js +39 -36
  237. package/esm/policies/PackageScripts.js.map +1 -1
  238. package/esm/policies/PackageTestScripts.d.ts +10 -6
  239. package/esm/policies/PackageTestScripts.d.ts.map +1 -1
  240. package/esm/policies/PackageTestScripts.js +14 -16
  241. package/esm/policies/PackageTestScripts.js.map +1 -1
  242. package/esm/policies/PublicApiDocumented.d.ts +4 -4
  243. package/esm/policies/PublicApiDocumented.d.ts.map +1 -1
  244. package/esm/policies/PublicApiDocumented.js +10 -8
  245. package/esm/policies/PublicApiDocumented.js.map +1 -1
  246. package/esm/policies/RequireCompanionChanges.d.ts +16 -0
  247. package/esm/policies/RequireCompanionChanges.d.ts.map +1 -0
  248. package/esm/policies/RequireCompanionChanges.js +42 -0
  249. package/esm/policies/RequireCompanionChanges.js.map +1 -0
  250. package/esm/policies/RequiredGitignorePatterns.d.ts +11 -4
  251. package/esm/policies/RequiredGitignorePatterns.d.ts.map +1 -1
  252. package/esm/policies/RequiredGitignorePatterns.js +29 -36
  253. package/esm/policies/RequiredGitignorePatterns.js.map +1 -1
  254. package/esm/policies/RequiredScripts.d.ts +9 -7
  255. package/esm/policies/RequiredScripts.d.ts.map +1 -1
  256. package/esm/policies/RequiredScripts.js +24 -24
  257. package/esm/policies/RequiredScripts.js.map +1 -1
  258. package/esm/policies/RustDocExists.d.ts +4 -4
  259. package/esm/policies/RustDocExists.d.ts.map +1 -1
  260. package/esm/policies/RustDocExists.js +6 -6
  261. package/esm/policies/RustDocExists.js.map +1 -1
  262. package/esm/policies/RustToolchainExists.d.ts +11 -4
  263. package/esm/policies/RustToolchainExists.d.ts.map +1 -1
  264. package/esm/policies/RustToolchainExists.js +10 -9
  265. package/esm/policies/RustToolchainExists.js.map +1 -1
  266. package/esm/policies/RustfmtConfigExists.d.ts +11 -4
  267. package/esm/policies/RustfmtConfigExists.d.ts.map +1 -1
  268. package/esm/policies/RustfmtConfigExists.js +10 -9
  269. package/esm/policies/RustfmtConfigExists.js.map +1 -1
  270. package/esm/policies/ScriptContains.d.ts +9 -7
  271. package/esm/policies/ScriptContains.d.ts.map +1 -1
  272. package/esm/policies/ScriptContains.js +9 -13
  273. package/esm/policies/ScriptContains.js.map +1 -1
  274. package/esm/policies/SharedDependencyVersions.d.ts +9 -4
  275. package/esm/policies/SharedDependencyVersions.d.ts.map +1 -1
  276. package/esm/policies/SharedDependencyVersions.js +28 -20
  277. package/esm/policies/SharedDependencyVersions.js.map +1 -1
  278. package/esm/policies/WorkspaceInheritance.d.ts +11 -4
  279. package/esm/policies/WorkspaceInheritance.d.ts.map +1 -1
  280. package/esm/policies/WorkspaceInheritance.js +10 -11
  281. package/esm/policies/WorkspaceInheritance.js.map +1 -1
  282. package/esm/policies/WorkspaceMembersValid.d.ts +11 -4
  283. package/esm/policies/WorkspaceMembersValid.d.ts.map +1 -1
  284. package/esm/policies/WorkspaceMembersValid.js +10 -11
  285. package/esm/policies/WorkspaceMembersValid.js.map +1 -1
  286. package/esm/policies/constants.d.ts.map +1 -1
  287. package/esm/policies/constants.js +1 -1
  288. package/esm/policies/constants.js.map +1 -1
  289. package/esm/policies.d.ts +15 -5
  290. package/esm/policies.d.ts.map +1 -1
  291. package/esm/policies.js +14 -5
  292. package/esm/policies.js.map +1 -1
  293. package/esm/policy.d.ts +67 -289
  294. package/esm/policy.d.ts.map +1 -1
  295. package/esm/policy.js +1 -122
  296. package/esm/policy.js.map +1 -1
  297. package/esm/policyDefiners/defineCargoPolicy.d.ts +25 -9
  298. package/esm/policyDefiners/defineCargoPolicy.d.ts.map +1 -1
  299. package/esm/policyDefiners/defineCargoPolicy.js +10 -28
  300. package/esm/policyDefiners/defineCargoPolicy.js.map +1 -1
  301. package/esm/policyDefiners/defineFileHeaderPolicy.d.ts +27 -14
  302. package/esm/policyDefiners/defineFileHeaderPolicy.d.ts.map +1 -1
  303. package/esm/policyDefiners/defineFileHeaderPolicy.js +16 -35
  304. package/esm/policyDefiners/defineFileHeaderPolicy.js.map +1 -1
  305. package/esm/policyDefiners/defineGleamPolicy.d.ts +25 -9
  306. package/esm/policyDefiners/defineGleamPolicy.d.ts.map +1 -1
  307. package/esm/policyDefiners/defineGleamPolicy.js +10 -27
  308. package/esm/policyDefiners/defineGleamPolicy.js.map +1 -1
  309. package/esm/policyDefiners/definePackagePolicy.d.ts +24 -13
  310. package/esm/policyDefiners/definePackagePolicy.d.ts.map +1 -1
  311. package/esm/policyDefiners/definePackagePolicy.js +9 -32
  312. package/esm/policyDefiners/definePackagePolicy.js.map +1 -1
  313. package/esm/policyDefiners/spdxValidator.d.ts +4 -12
  314. package/esm/policyDefiners/spdxValidator.d.ts.map +1 -1
  315. package/esm/policyDefiners/spdxValidator.js +26 -14
  316. package/esm/policyDefiners/spdxValidator.js.map +1 -1
  317. package/esm/policyExecution.d.ts +20 -0
  318. package/esm/policyExecution.d.ts.map +1 -0
  319. package/esm/policyExecution.js +234 -0
  320. package/esm/policyExecution.js.map +1 -0
  321. package/esm/repositoryChanges.d.ts +26 -0
  322. package/esm/repositoryChanges.d.ts.map +1 -0
  323. package/esm/repositoryChanges.js +172 -0
  324. package/esm/repositoryChanges.js.map +1 -0
  325. package/esm/repositoryFiles.d.ts +6 -0
  326. package/esm/repositoryFiles.d.ts.map +1 -0
  327. package/esm/repositoryFiles.js +11 -0
  328. package/esm/repositoryFiles.js.map +1 -0
  329. package/esm/runner.d.ts +73 -47
  330. package/esm/runner.d.ts.map +1 -1
  331. package/esm/runner.js +158 -144
  332. package/esm/runner.js.map +1 -1
  333. package/esm/settlePolicyPromise.d.ts +4 -0
  334. package/esm/settlePolicyPromise.d.ts.map +1 -0
  335. package/esm/settlePolicyPromise.js +10 -0
  336. package/esm/settlePolicyPromise.js.map +1 -0
  337. package/esm/tsdoc-metadata.json +1 -1
  338. package/esm/utils/safePaths.d.ts +9 -0
  339. package/esm/utils/safePaths.d.ts.map +1 -0
  340. package/esm/utils/safePaths.js +40 -0
  341. package/esm/utils/safePaths.js.map +1 -0
  342. package/oclif.manifest.json +57 -2
  343. package/package.json +42 -27
  344. package/scripts/benchmark.mjs +341 -0
  345. package/sidecar/sidecar.mjs +388 -417
@@ -1,7 +1,6 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "pathe";
3
3
  import { glob } from "tinyglobby";
4
- import { makePolicyDefinition } from "../makePolicy.js";
5
4
  import { parseToml } from "../policyDefiners/tomlParser.js";
6
5
  function extractVersion(dep) {
7
6
  if (typeof dep === "string") {
@@ -69,18 +68,21 @@ function recordDependency(allDeps, name, version, member) {
69
68
  /**
70
69
  * Collect dependency versions from all workspace members and record which members use them.
71
70
  */
72
- async function collectMemberDeps(members, root, exclude) {
71
+ async function collectMemberDeps(members, root, exclude, files) {
73
72
  const allDeps = new Map();
74
73
  const memberCargoPaths = await glob(members.map((member) => path.join(member, "Cargo.toml")), {
75
74
  cwd: root,
76
75
  ignore: exclude.map((member) => path.join(member, "Cargo.toml")),
77
76
  });
78
77
  for (const memberCargoPath of memberCargoPaths) {
78
+ if (!files.includes(memberCargoPath)) {
79
+ continue;
80
+ }
79
81
  const memberContent = await readFile(path.resolve(root, memberCargoPath), "utf-8");
80
82
  const memberToml = await parseToml(memberContent);
81
83
  const deps = collectDeps(memberToml);
82
84
  for (const [name, version] of deps) {
83
- recordDependency(allDeps, name, version, path.dirname(memberCargoPath));
85
+ recordDependency(allDeps, name, version, memberCargoPath);
84
86
  }
85
87
  }
86
88
  return allDeps;
@@ -88,48 +90,54 @@ async function collectMemberDeps(members, root, exclude) {
88
90
  /**
89
91
  * A policy that detects dependency version mismatches across Cargo workspace members.
90
92
  *
91
- * @alpha
93
+ * @public
92
94
  */
93
- export const SharedDependencyVersions = makePolicyDefinition({
95
+ export const SharedDependencyVersions = {
94
96
  name: "SharedDependencyVersions",
95
97
  description: "Detects dependency version mismatches across Cargo workspace members.",
96
- match: /^Cargo\.toml$/,
97
- handler: async ({ file, root, config }) => {
98
+ scope: "repository",
99
+ handler: async ({ files, root, config }) => {
100
+ if (!files.includes("Cargo.toml")) {
101
+ return [];
102
+ }
98
103
  const detectMismatches = config?.detectMismatches ?? true;
99
- const content = await readFile(path.resolve(root, file), "utf-8");
104
+ const content = await readFile(path.resolve(root, "Cargo.toml"), "utf-8");
100
105
  const toml = await parseToml(content);
101
106
  const workspace = toml.workspace;
102
107
  if (!workspace) {
103
- return true;
108
+ return [];
104
109
  }
105
110
  const members = workspace.members;
106
111
  if (!members || members.length === 0) {
107
- return true;
112
+ return [];
108
113
  }
109
114
  const errors = [];
115
+ const findings = [];
116
+ const manualFix = "Use [workspace.dependencies] with `dep.workspace = true` in member Cargo.toml files to share versions.";
110
117
  // Check required workspace deps
111
118
  const workspaceDeps = (workspace.dependencies ?? {});
112
119
  checkRequiredWorkspaceDeps(config, workspaceDeps, errors);
120
+ for (const error of errors) {
121
+ findings.push({ message: error, files: ["Cargo.toml"], manualFix });
122
+ }
113
123
  // Detect mismatches across members
114
124
  if (detectMismatches) {
115
125
  const exclude = (workspace.exclude ?? []);
116
- const allDeps = await collectMemberDeps(members, root, exclude);
126
+ const allDeps = await collectMemberDeps(members, root, exclude, files);
117
127
  for (const [dep, versionMap] of allDeps) {
118
128
  if (versionMap.size > 1) {
119
129
  const details = [...versionMap.entries()]
120
130
  .map(([ver, memberList]) => `"${ver}" in ${memberList.join(", ")}`)
121
131
  .join("; ");
122
- errors.push(`Version mismatch for "${dep}": ${details}`);
132
+ findings.push({
133
+ message: `Version mismatch for "${dep}": ${details}`,
134
+ files: [...versionMap.values()].flat(),
135
+ manualFix,
136
+ });
123
137
  }
124
138
  }
125
139
  }
126
- if (errors.length > 0) {
127
- return {
128
- error: errors.join("; "),
129
- manualFix: "Use [workspace.dependencies] with `dep.workspace = true` in member Cargo.toml files to share versions.",
130
- };
131
- }
132
- return true;
140
+ return findings.length > 0 ? findings : [];
133
141
  },
134
- });
142
+ };
135
143
  //# sourceMappingURL=SharedDependencyVersions.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"SharedDependencyVersions.js","sourceRoot":"","sources":["../../src/policies/SharedDependencyVersions.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport { makePolicyDefinition } from \"../makePolicy.js\";\nimport type { PolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the SharedDependencyVersions policy.\n *\n * @alpha\n */\nexport interface SharedDependencyVersionsConfig {\n\t/**\n\t * Dependencies that should use workspace-level versions.\n\t */\n\trequireWorkspaceDeps?: string[];\n\n\t/**\n\t * If true, detect version mismatches across workspace members.\n\t * @defaultValue true\n\t */\n\tdetectMismatches?: boolean;\n}\n\nfunction extractVersion(dep: unknown): string | undefined {\n\tif (typeof dep === \"string\") {\n\t\treturn dep;\n\t}\n\tif (typeof dep === \"object\" && dep !== null) {\n\t\tconst record = dep as Record<string, unknown>;\n\t\tif (typeof record.version === \"string\") {\n\t\t\treturn record.version;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Collect dependencies from a TOML object.\n */\nfunction collectDeps(toml: Record<string, unknown>): Map<string, string> {\n\tconst deps = new Map<string, string>();\n\tconst sections = [\"dependencies\", \"dev-dependencies\", \"build-dependencies\"];\n\n\tfor (const section of sections) {\n\t\tconst sectionDeps = toml[section] as Record<string, unknown> | undefined;\n\t\tif (!sectionDeps) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [name, value] of Object.entries(sectionDeps)) {\n\t\t\tconst version = extractVersion(value);\n\t\t\tif (version && !version.startsWith(\"workspace\")) {\n\t\t\t\tdeps.set(name, version);\n\t\t\t}\n\t\t}\n\t}\n\treturn deps;\n}\n\n/**\n * Check that required dependencies are defined at the workspace level.\n */\nfunction checkRequiredWorkspaceDeps(\n\tconfig: SharedDependencyVersionsConfig | undefined,\n\tworkspaceDeps: Record<string, unknown>,\n\terrors: string[],\n): void {\n\tif (!config?.requireWorkspaceDeps) {\n\t\treturn;\n\t}\n\tfor (const dep of config.requireWorkspaceDeps) {\n\t\tif (!(dep in workspaceDeps)) {\n\t\t\terrors.push(\n\t\t\t\t`Dependency \"${dep}\" should be defined in [workspace.dependencies]`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Add a member's dependency version to the tracking map.\n */\nfunction recordDependency(\n\tallDeps: Map<string, Map<string, string[]>>,\n\tname: string,\n\tversion: string,\n\tmember: string,\n): void {\n\tif (!allDeps.has(name)) {\n\t\tallDeps.set(name, new Map());\n\t}\n\tconst versionMap = allDeps.get(name);\n\tif (versionMap !== undefined) {\n\t\tif (!versionMap.has(version)) {\n\t\t\tversionMap.set(version, []);\n\t\t}\n\t\tconst memberList = versionMap.get(version);\n\t\tif (memberList !== undefined) {\n\t\t\tmemberList.push(member);\n\t\t}\n\t}\n}\n\n/**\n * Collect dependency versions from all workspace members and record which members use them.\n */\nasync function collectMemberDeps(\n\tmembers: string[],\n\troot: string,\n\texclude: string[],\n): Promise<Map<string, Map<string, string[]>>> {\n\tconst allDeps = new Map<string, Map<string, string[]>>();\n\tconst memberCargoPaths = await glob(\n\t\tmembers.map((member) => path.join(member, \"Cargo.toml\")),\n\t\t{\n\t\t\tcwd: root,\n\t\t\tignore: exclude.map((member) => path.join(member, \"Cargo.toml\")),\n\t\t},\n\t);\n\n\tfor (const memberCargoPath of memberCargoPaths) {\n\t\tconst memberContent = await readFile(\n\t\t\tpath.resolve(root, memberCargoPath),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst memberToml = await parseToml(memberContent);\n\t\tconst deps = collectDeps(memberToml);\n\n\t\tfor (const [name, version] of deps) {\n\t\t\trecordDependency(allDeps, name, version, path.dirname(memberCargoPath));\n\t\t}\n\t}\n\n\treturn allDeps;\n}\n\n/**\n * A policy that detects dependency version mismatches across Cargo workspace members.\n *\n * @alpha\n */\nexport const SharedDependencyVersions: PolicyDefinition<SharedDependencyVersionsConfig> =\n\tmakePolicyDefinition({\n\t\tname: \"SharedDependencyVersions\",\n\t\tdescription:\n\t\t\t\"Detects dependency version mismatches across Cargo workspace members.\",\n\t\tmatch: /^Cargo\\.toml$/,\n\t\thandler: async ({ file, root, config }) => {\n\t\t\tconst detectMismatches = config?.detectMismatches ?? true;\n\t\t\tconst content = await readFile(path.resolve(root, file), \"utf-8\");\n\t\t\tconst toml = await parseToml(content);\n\n\t\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\t\tif (!workspace) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst members = workspace.members as string[] | undefined;\n\t\t\tif (!members || members.length === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst errors: string[] = [];\n\n\t\t\t// Check required workspace deps\n\t\t\tconst workspaceDeps = (workspace.dependencies ?? {}) as Record<\n\t\t\t\tstring,\n\t\t\t\tunknown\n\t\t\t>;\n\t\t\tcheckRequiredWorkspaceDeps(config, workspaceDeps, errors);\n\n\t\t\t// Detect mismatches across members\n\t\t\tif (detectMismatches) {\n\t\t\t\tconst exclude = (workspace.exclude ?? []) as string[];\n\t\t\t\tconst allDeps = await collectMemberDeps(members, root, exclude);\n\n\t\t\t\tfor (const [dep, versionMap] of allDeps) {\n\t\t\t\t\tif (versionMap.size > 1) {\n\t\t\t\t\t\tconst details = [...versionMap.entries()]\n\t\t\t\t\t\t\t.map(\n\t\t\t\t\t\t\t\t([ver, memberList]) => `\"${ver}\" in ${memberList.join(\", \")}`,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.join(\"; \");\n\t\t\t\t\t\terrors.push(`Version mismatch for \"${dep}\": ${details}`);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: errors.join(\"; \"),\n\t\t\t\t\tmanualFix:\n\t\t\t\t\t\t\"Use [workspace.dependencies] with `dep.workspace = true` in member Cargo.toml files to share versions.\",\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t});\n"]}
1
+ {"version":3,"file":"SharedDependencyVersions.js","sourceRoot":"","sources":["../../src/policies/SharedDependencyVersions.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport { glob } from \"tinyglobby\";\nimport type { PolicyFinding, RepositoryPolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the SharedDependencyVersions policy.\n *\n * @public\n */\nexport interface SharedDependencyVersionsConfig {\n\t/**\n\t * Dependencies that should use workspace-level versions.\n\t */\n\trequireWorkspaceDeps?: string[];\n\n\t/**\n\t * If true, detect version mismatches across workspace members.\n\t * @defaultValue true\n\t */\n\tdetectMismatches?: boolean;\n}\n\nfunction extractVersion(dep: unknown): string | undefined {\n\tif (typeof dep === \"string\") {\n\t\treturn dep;\n\t}\n\tif (typeof dep === \"object\" && dep !== null) {\n\t\tconst record = dep as Record<string, unknown>;\n\t\tif (typeof record.version === \"string\") {\n\t\t\treturn record.version;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * Collect dependencies from a TOML object.\n */\nfunction collectDeps(toml: Record<string, unknown>): Map<string, string> {\n\tconst deps = new Map<string, string>();\n\tconst sections = [\"dependencies\", \"dev-dependencies\", \"build-dependencies\"];\n\n\tfor (const section of sections) {\n\t\tconst sectionDeps = toml[section] as Record<string, unknown> | undefined;\n\t\tif (!sectionDeps) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const [name, value] of Object.entries(sectionDeps)) {\n\t\t\tconst version = extractVersion(value);\n\t\t\tif (version && !version.startsWith(\"workspace\")) {\n\t\t\t\tdeps.set(name, version);\n\t\t\t}\n\t\t}\n\t}\n\treturn deps;\n}\n\n/**\n * Check that required dependencies are defined at the workspace level.\n */\nfunction checkRequiredWorkspaceDeps(\n\tconfig: SharedDependencyVersionsConfig | undefined,\n\tworkspaceDeps: Record<string, unknown>,\n\terrors: string[],\n): void {\n\tif (!config?.requireWorkspaceDeps) {\n\t\treturn;\n\t}\n\tfor (const dep of config.requireWorkspaceDeps) {\n\t\tif (!(dep in workspaceDeps)) {\n\t\t\terrors.push(\n\t\t\t\t`Dependency \"${dep}\" should be defined in [workspace.dependencies]`,\n\t\t\t);\n\t\t}\n\t}\n}\n\n/**\n * Add a member's dependency version to the tracking map.\n */\nfunction recordDependency(\n\tallDeps: Map<string, Map<string, string[]>>,\n\tname: string,\n\tversion: string,\n\tmember: string,\n): void {\n\tif (!allDeps.has(name)) {\n\t\tallDeps.set(name, new Map());\n\t}\n\tconst versionMap = allDeps.get(name);\n\tif (versionMap !== undefined) {\n\t\tif (!versionMap.has(version)) {\n\t\t\tversionMap.set(version, []);\n\t\t}\n\t\tconst memberList = versionMap.get(version);\n\t\tif (memberList !== undefined) {\n\t\t\tmemberList.push(member);\n\t\t}\n\t}\n}\n\n/**\n * Collect dependency versions from all workspace members and record which members use them.\n */\nasync function collectMemberDeps(\n\tmembers: string[],\n\troot: string,\n\texclude: string[],\n\tfiles: readonly string[],\n): Promise<Map<string, Map<string, string[]>>> {\n\tconst allDeps = new Map<string, Map<string, string[]>>();\n\tconst memberCargoPaths = await glob(\n\t\tmembers.map((member) => path.join(member, \"Cargo.toml\")),\n\t\t{\n\t\t\tcwd: root,\n\t\t\tignore: exclude.map((member) => path.join(member, \"Cargo.toml\")),\n\t\t},\n\t);\n\n\tfor (const memberCargoPath of memberCargoPaths) {\n\t\tif (!files.includes(memberCargoPath)) {\n\t\t\tcontinue;\n\t\t}\n\t\tconst memberContent = await readFile(\n\t\t\tpath.resolve(root, memberCargoPath),\n\t\t\t\"utf-8\",\n\t\t);\n\t\tconst memberToml = await parseToml(memberContent);\n\t\tconst deps = collectDeps(memberToml);\n\n\t\tfor (const [name, version] of deps) {\n\t\t\trecordDependency(allDeps, name, version, memberCargoPath);\n\t\t}\n\t}\n\n\treturn allDeps;\n}\n\n/**\n * A policy that detects dependency version mismatches across Cargo workspace members.\n *\n * @public\n */\nexport const SharedDependencyVersions = {\n\tname: \"SharedDependencyVersions\",\n\tdescription:\n\t\t\"Detects dependency version mismatches across Cargo workspace members.\",\n\tscope: \"repository\",\n\thandler: async ({ files, root, config }) => {\n\t\tif (!files.includes(\"Cargo.toml\")) {\n\t\t\treturn [];\n\t\t}\n\t\tconst detectMismatches = config?.detectMismatches ?? true;\n\t\tconst content = await readFile(path.resolve(root, \"Cargo.toml\"), \"utf-8\");\n\t\tconst toml = await parseToml(content);\n\n\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\tif (!workspace) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst members = workspace.members as string[] | undefined;\n\t\tif (!members || members.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst errors: string[] = [];\n\t\tconst findings: PolicyFinding[] = [];\n\t\tconst manualFix =\n\t\t\t\"Use [workspace.dependencies] with `dep.workspace = true` in member Cargo.toml files to share versions.\";\n\n\t\t// Check required workspace deps\n\t\tconst workspaceDeps = (workspace.dependencies ?? {}) as Record<\n\t\t\tstring,\n\t\t\tunknown\n\t\t>;\n\t\tcheckRequiredWorkspaceDeps(config, workspaceDeps, errors);\n\t\tfor (const error of errors) {\n\t\t\tfindings.push({ message: error, files: [\"Cargo.toml\"], manualFix });\n\t\t}\n\n\t\t// Detect mismatches across members\n\t\tif (detectMismatches) {\n\t\t\tconst exclude = (workspace.exclude ?? []) as string[];\n\t\t\tconst allDeps = await collectMemberDeps(members, root, exclude, files);\n\n\t\t\tfor (const [dep, versionMap] of allDeps) {\n\t\t\t\tif (versionMap.size > 1) {\n\t\t\t\t\tconst details = [...versionMap.entries()]\n\t\t\t\t\t\t.map(([ver, memberList]) => `\"${ver}\" in ${memberList.join(\", \")}`)\n\t\t\t\t\t\t.join(\"; \");\n\t\t\t\t\tfindings.push({\n\t\t\t\t\t\tmessage: `Version mismatch for \"${dep}\": ${details}`,\n\t\t\t\t\t\tfiles: [...versionMap.values()].flat(),\n\t\t\t\t\t\tmanualFix,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn findings.length > 0 ? findings : [];\n\t},\n} satisfies RepositoryPolicyDefinition<SharedDependencyVersionsConfig>;\n"]}
@@ -1,8 +1,7 @@
1
- import type { PolicyDefinition } from "../policy.js";
2
1
  /**
3
2
  * Configuration for the WorkspaceInheritance policy.
4
3
  *
5
- * @alpha
4
+ * @public
6
5
  */
7
6
  export interface WorkspaceInheritanceConfig {
8
7
  /**
@@ -18,7 +17,15 @@ export interface WorkspaceInheritanceConfig {
18
17
  /**
19
18
  * A policy that ensures Cargo workspace members inherit fields from the workspace config.
20
19
  *
21
- * @alpha
20
+ * @public
22
21
  */
23
- export declare const WorkspaceInheritance: PolicyDefinition<WorkspaceInheritanceConfig>;
22
+ export declare const WorkspaceInheritance: {
23
+ name: string;
24
+ description: string;
25
+ match: RegExp;
26
+ handler: ({ file, root, config }: import("../policy.js").PolicyArgs<WorkspaceInheritanceConfig>) => Promise<{
27
+ message: string;
28
+ manualFix: string;
29
+ }[]>;
30
+ };
24
31
  //# sourceMappingURL=WorkspaceInheritance.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceInheritance.d.ts","sourceRoot":"","sources":["../../src/policies/WorkspaceInheritance.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AA0DD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,gBAAgB,CAAC,0BAA0B,CAyD3E,CAAC"}
1
+ {"version":3,"file":"WorkspaceInheritance.d.ts","sourceRoot":"","sources":["../../src/policies/WorkspaceInheritance.ts"],"names":[],"mappings":"AAKA;;;;GAIG;AACH,MAAM,WAAW,0BAA0B;IAC1C;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IAEnB;;OAEG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AA0DD;;;;GAIG;AACH,eAAO,MAAM,oBAAoB;;;;;;;;CAuD2B,CAAC"}
@@ -1,6 +1,5 @@
1
1
  import { readFile } from "node:fs/promises";
2
2
  import path from "pathe";
3
- import { makePolicyDefinition } from "../makePolicy.js";
4
3
  import { parseToml } from "../policyDefiners/tomlParser.js";
5
4
  const DEFAULT_INHERIT_FIELDS = ["version", "authors", "license", "repository"];
6
5
  /**
@@ -47,9 +46,9 @@ async function checkMemberInheritance(member, root, availableFields, errors) {
47
46
  /**
48
47
  * A policy that ensures Cargo workspace members inherit fields from the workspace config.
49
48
  *
50
- * @alpha
49
+ * @public
51
50
  */
52
- export const WorkspaceInheritance = makePolicyDefinition({
51
+ export const WorkspaceInheritance = {
53
52
  name: "WorkspaceInheritance",
54
53
  description: "Ensures Cargo workspace members inherit shared fields (version, authors, etc.) from workspace config.",
55
54
  match: /^Cargo\.toml$/,
@@ -58,11 +57,11 @@ export const WorkspaceInheritance = makePolicyDefinition({
58
57
  const toml = await parseToml(content);
59
58
  const workspace = toml.workspace;
60
59
  if (!workspace) {
61
- return true;
60
+ return [];
62
61
  }
63
62
  const members = workspace.members;
64
63
  if (!members || members.length === 0) {
65
- return true;
64
+ return [];
66
65
  }
67
66
  const inheritFields = config?.inherit ?? DEFAULT_INHERIT_FIELDS;
68
67
  const allowOverrides = config?.allowOverrides ?? [];
@@ -70,7 +69,7 @@ export const WorkspaceInheritance = makePolicyDefinition({
70
69
  const workspacePkg = (workspace.package ?? {});
71
70
  const availableFields = inheritFields.filter((field) => workspacePkg[field] !== undefined);
72
71
  if (availableFields.length === 0) {
73
- return true;
72
+ return [];
74
73
  }
75
74
  const errors = [];
76
75
  for (const member of members) {
@@ -83,12 +82,12 @@ export const WorkspaceInheritance = makePolicyDefinition({
83
82
  await checkMemberInheritance(member, root, availableFields, errors);
84
83
  }
85
84
  if (errors.length > 0) {
86
- return {
87
- error: errors.join("; "),
85
+ return errors.map((message) => ({
86
+ message,
88
87
  manualFix: "Use workspace inheritance in member Cargo.toml files, e.g., `version.workspace = true`.",
89
- };
88
+ }));
90
89
  }
91
- return true;
90
+ return [];
92
91
  },
93
- });
92
+ };
94
93
  //# sourceMappingURL=WorkspaceInheritance.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceInheritance.js","sourceRoot":"","sources":["../../src/policies/WorkspaceInheritance.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport { makePolicyDefinition } from \"../makePolicy.js\";\nimport type { PolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the WorkspaceInheritance policy.\n *\n * @alpha\n */\nexport interface WorkspaceInheritanceConfig {\n\t/**\n\t * Package fields that should use workspace inheritance.\n\t * @defaultValue [\"version\", \"authors\", \"license\", \"repository\"]\n\t */\n\tinherit?: string[];\n\n\t/**\n\t * Crate paths that are allowed to override inherited fields.\n\t */\n\tallowOverrides?: string[];\n}\n\nconst DEFAULT_INHERIT_FIELDS = [\"version\", \"authors\", \"license\", \"repository\"];\n\n/**\n * Check if a member path matches any override pattern.\n */\nfunction isOverrideAllowed(member: string, allowOverrides: string[]): boolean {\n\treturn allowOverrides.some((pattern) => {\n\t\tif (pattern.endsWith(\"*\")) {\n\t\t\treturn member.startsWith(pattern.slice(0, -1));\n\t\t}\n\t\treturn member === pattern;\n\t});\n}\n\n/**\n * Check a single member's fields for workspace inheritance compliance.\n */\nasync function checkMemberInheritance(\n\tmember: string,\n\troot: string,\n\tavailableFields: string[],\n\terrors: string[],\n): Promise<void> {\n\tconst memberCargoPath = path.join(root, member, \"Cargo.toml\");\n\n\ttry {\n\t\tconst memberContent = await readFile(memberCargoPath, \"utf-8\");\n\t\tconst memberToml = await parseToml(memberContent);\n\t\tconst memberPkg = memberToml.package as Record<string, unknown> | undefined;\n\n\t\tif (!memberPkg) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const field of availableFields) {\n\t\t\tconst value = memberPkg[field];\n\t\t\t// Check if the field uses workspace inheritance\n\t\t\tif (\n\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\tvalue !== null &&\n\t\t\t\t(value as Record<string, unknown>).workspace === true\n\t\t\t) {\n\t\t\t\t// Using workspace inheritance - good\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`${member}: package.${field} should use workspace inheritance (${field}.workspace = true)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Member might not exist (handled by WorkspaceMembersValid)\n\t}\n}\n\n/**\n * A policy that ensures Cargo workspace members inherit fields from the workspace config.\n *\n * @alpha\n */\nexport const WorkspaceInheritance: PolicyDefinition<WorkspaceInheritanceConfig> =\n\tmakePolicyDefinition({\n\t\tname: \"WorkspaceInheritance\",\n\t\tdescription:\n\t\t\t\"Ensures Cargo workspace members inherit shared fields (version, authors, etc.) from workspace config.\",\n\t\tmatch: /^Cargo\\.toml$/,\n\t\thandler: async ({ file, root, config }) => {\n\t\t\tconst content = await readFile(path.resolve(root, file), \"utf-8\");\n\t\t\tconst toml = await parseToml(content);\n\n\t\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\t\tif (!workspace) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst members = workspace.members as string[] | undefined;\n\t\t\tif (!members || members.length === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst inheritFields = config?.inherit ?? DEFAULT_INHERIT_FIELDS;\n\t\t\tconst allowOverrides = config?.allowOverrides ?? [];\n\n\t\t\t// Check which fields are defined at the workspace level\n\t\t\tconst workspacePkg = (workspace.package ?? {}) as Record<string, unknown>;\n\t\t\tconst availableFields = inheritFields.filter(\n\t\t\t\t(field) => workspacePkg[field] !== undefined,\n\t\t\t);\n\n\t\t\tif (availableFields.length === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst errors: string[] = [];\n\n\t\t\tfor (const member of members) {\n\t\t\t\tif (member.includes(\"*\")) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif (isOverrideAllowed(member, allowOverrides)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tawait checkMemberInheritance(member, root, availableFields, errors);\n\t\t\t}\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: errors.join(\"; \"),\n\t\t\t\t\tmanualFix:\n\t\t\t\t\t\t\"Use workspace inheritance in member Cargo.toml files, e.g., `version.workspace = true`.\",\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t});\n"]}
1
+ {"version":3,"file":"WorkspaceInheritance.js","sourceRoot":"","sources":["../../src/policies/WorkspaceInheritance.ts"],"names":[],"mappings":"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","sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport type { FilePolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the WorkspaceInheritance policy.\n *\n * @public\n */\nexport interface WorkspaceInheritanceConfig {\n\t/**\n\t * Package fields that should use workspace inheritance.\n\t * @defaultValue [\"version\", \"authors\", \"license\", \"repository\"]\n\t */\n\tinherit?: string[];\n\n\t/**\n\t * Crate paths that are allowed to override inherited fields.\n\t */\n\tallowOverrides?: string[];\n}\n\nconst DEFAULT_INHERIT_FIELDS = [\"version\", \"authors\", \"license\", \"repository\"];\n\n/**\n * Check if a member path matches any override pattern.\n */\nfunction isOverrideAllowed(member: string, allowOverrides: string[]): boolean {\n\treturn allowOverrides.some((pattern) => {\n\t\tif (pattern.endsWith(\"*\")) {\n\t\t\treturn member.startsWith(pattern.slice(0, -1));\n\t\t}\n\t\treturn member === pattern;\n\t});\n}\n\n/**\n * Check a single member's fields for workspace inheritance compliance.\n */\nasync function checkMemberInheritance(\n\tmember: string,\n\troot: string,\n\tavailableFields: string[],\n\terrors: string[],\n): Promise<void> {\n\tconst memberCargoPath = path.join(root, member, \"Cargo.toml\");\n\n\ttry {\n\t\tconst memberContent = await readFile(memberCargoPath, \"utf-8\");\n\t\tconst memberToml = await parseToml(memberContent);\n\t\tconst memberPkg = memberToml.package as Record<string, unknown> | undefined;\n\n\t\tif (!memberPkg) {\n\t\t\treturn;\n\t\t}\n\n\t\tfor (const field of availableFields) {\n\t\t\tconst value = memberPkg[field];\n\t\t\t// Check if the field uses workspace inheritance\n\t\t\tif (\n\t\t\t\ttypeof value === \"object\" &&\n\t\t\t\tvalue !== null &&\n\t\t\t\t(value as Record<string, unknown>).workspace === true\n\t\t\t) {\n\t\t\t\t// Using workspace inheritance - good\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (value !== undefined) {\n\t\t\t\terrors.push(\n\t\t\t\t\t`${member}: package.${field} should use workspace inheritance (${field}.workspace = true)`,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Member might not exist (handled by WorkspaceMembersValid)\n\t}\n}\n\n/**\n * A policy that ensures Cargo workspace members inherit fields from the workspace config.\n *\n * @public\n */\nexport const WorkspaceInheritance = {\n\tname: \"WorkspaceInheritance\",\n\tdescription:\n\t\t\"Ensures Cargo workspace members inherit shared fields (version, authors, etc.) from workspace config.\",\n\tmatch: /^Cargo\\.toml$/,\n\thandler: async ({ file, root, config }) => {\n\t\tconst content = await readFile(path.resolve(root, file), \"utf-8\");\n\t\tconst toml = await parseToml(content);\n\n\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\tif (!workspace) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst members = workspace.members as string[] | undefined;\n\t\tif (!members || members.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst inheritFields = config?.inherit ?? DEFAULT_INHERIT_FIELDS;\n\t\tconst allowOverrides = config?.allowOverrides ?? [];\n\n\t\t// Check which fields are defined at the workspace level\n\t\tconst workspacePkg = (workspace.package ?? {}) as Record<string, unknown>;\n\t\tconst availableFields = inheritFields.filter(\n\t\t\t(field) => workspacePkg[field] !== undefined,\n\t\t);\n\n\t\tif (availableFields.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst errors: string[] = [];\n\n\t\tfor (const member of members) {\n\t\t\tif (member.includes(\"*\")) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (isOverrideAllowed(member, allowOverrides)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tawait checkMemberInheritance(member, root, availableFields, errors);\n\t\t}\n\n\t\tif (errors.length > 0) {\n\t\t\treturn errors.map((message) => ({\n\t\t\t\tmessage,\n\t\t\t\tmanualFix:\n\t\t\t\t\t\"Use workspace inheritance in member Cargo.toml files, e.g., `version.workspace = true`.\",\n\t\t\t}));\n\t\t}\n\t\treturn [];\n\t},\n} satisfies FilePolicyDefinition<WorkspaceInheritanceConfig>;\n"]}
@@ -1,8 +1,7 @@
1
- import type { PolicyDefinition } from "../policy.js";
2
1
  /**
3
2
  * Configuration for the WorkspaceMembersValid policy.
4
3
  *
5
- * @alpha
4
+ * @public
6
5
  */
7
6
  export interface WorkspaceMembersValidConfig {
8
7
  /**
@@ -14,7 +13,15 @@ export interface WorkspaceMembersValidConfig {
14
13
  /**
15
14
  * A policy that validates Cargo workspace member paths exist.
16
15
  *
17
- * @alpha
16
+ * @public
18
17
  */
19
- export declare const WorkspaceMembersValid: PolicyDefinition<WorkspaceMembersValidConfig>;
18
+ export declare const WorkspaceMembersValid: {
19
+ name: string;
20
+ description: string;
21
+ match: RegExp;
22
+ handler: ({ file, root, config }: import("../policy.js").PolicyArgs<WorkspaceMembersValidConfig>) => Promise<{
23
+ message: string;
24
+ manualFix: string;
25
+ }[]>;
26
+ };
20
27
  //# sourceMappingURL=WorkspaceMembersValid.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceMembersValid.d.ts","sourceRoot":"","sources":["../../src/policies/WorkspaceMembersValid.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGrD;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC3C;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAoDD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,gBAAgB,CAAC,2BAA2B,CA0C7E,CAAC"}
1
+ {"version":3,"file":"WorkspaceMembersValid.d.ts","sourceRoot":"","sources":["../../src/policies/WorkspaceMembersValid.ts"],"names":[],"mappings":"AAMA;;;;GAIG;AACH,MAAM,WAAW,2BAA2B;IAC3C;;;OAGG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACxB;AAoDD;;;;GAIG;AACH,eAAO,MAAM,qBAAqB;;;;;;;;CAwC2B,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import { existsSync, readdirSync } from "node:fs";
2
2
  import { readFile } from "node:fs/promises";
3
3
  import path from "pathe";
4
- import { makePolicyDefinition } from "../makePolicy.js";
5
4
  import { parseToml } from "../policyDefiners/tomlParser.js";
6
5
  const GLOB_SUFFIX_REGEX = /\/?\*\*?$/;
7
6
  /**
@@ -51,9 +50,9 @@ function validateMember(member, root, errors) {
51
50
  /**
52
51
  * A policy that validates Cargo workspace member paths exist.
53
52
  *
54
- * @alpha
53
+ * @public
55
54
  */
56
- export const WorkspaceMembersValid = makePolicyDefinition({
55
+ export const WorkspaceMembersValid = {
57
56
  name: "WorkspaceMembersValid",
58
57
  description: "Validates that all Cargo workspace member paths exist and contain Cargo.toml files.",
59
58
  match: /^Cargo\.toml$/,
@@ -63,26 +62,26 @@ export const WorkspaceMembersValid = makePolicyDefinition({
63
62
  const toml = await parseToml(content);
64
63
  const workspace = toml.workspace;
65
64
  if (!workspace) {
66
- return true;
65
+ return [];
67
66
  }
68
67
  const members = workspace.members;
69
68
  if (!members || members.length === 0) {
70
- return true;
69
+ return [];
71
70
  }
72
71
  if (!validatePaths) {
73
- return true;
72
+ return [];
74
73
  }
75
74
  const errors = [];
76
75
  for (const member of members) {
77
76
  validateMember(member, root, errors);
78
77
  }
79
78
  if (errors.length > 0) {
80
- return {
81
- error: errors.join("; "),
79
+ return errors.map((message) => ({
80
+ message,
82
81
  manualFix: "Fix the workspace.members paths in root Cargo.toml to point to valid crate directories.",
83
- };
82
+ }));
84
83
  }
85
- return true;
84
+ return [];
86
85
  },
87
- });
86
+ };
88
87
  //# sourceMappingURL=WorkspaceMembersValid.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"WorkspaceMembersValid.js","sourceRoot":"","sources":["../../src/policies/WorkspaceMembersValid.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport { makePolicyDefinition } from \"../makePolicy.js\";\nimport type { PolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the WorkspaceMembersValid policy.\n *\n * @alpha\n */\nexport interface WorkspaceMembersValidConfig {\n\t/**\n\t * If true, validate that all member paths exist on disk.\n\t * @defaultValue true\n\t */\n\tvalidatePaths?: boolean;\n}\n\nconst GLOB_SUFFIX_REGEX = /\\/?\\*\\*?$/;\n\n/**\n * Expand a simple glob pattern (e.g., \"crates/*\") into matching directories.\n */\nfunction expandSimpleGlob(root: string, pattern: string): string[] {\n\tif (!pattern.includes(\"*\")) {\n\t\treturn [pattern];\n\t}\n\n\tconst base = pattern.replace(GLOB_SUFFIX_REGEX, \"\");\n\tconst baseDir = path.join(root, base);\n\n\tif (!existsSync(baseDir)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst entries = readdirSync(baseDir, { withFileTypes: true });\n\t\treturn entries\n\t\t\t.filter((e) => e.isDirectory())\n\t\t\t.filter((e) => existsSync(path.join(baseDir, e.name, \"Cargo.toml\")))\n\t\t\t.map((e) => path.join(base, e.name));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Validate a single workspace member entry.\n */\nfunction validateMember(member: string, root: string, errors: string[]): void {\n\tif (member.includes(\"*\")) {\n\t\t// Expand glob and check each result\n\t\tconst expanded = expandSimpleGlob(root, member);\n\t\tif (expanded.length === 0) {\n\t\t\terrors.push(\n\t\t\t\t`Workspace member glob \"${member}\" matches no directories with Cargo.toml`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tconst memberPath = path.join(root, member);\n\t\tif (!existsSync(memberPath)) {\n\t\t\terrors.push(`Workspace member \"${member}\" does not exist`);\n\t\t} else if (!existsSync(path.join(memberPath, \"Cargo.toml\"))) {\n\t\t\terrors.push(`Workspace member \"${member}\" exists but has no Cargo.toml`);\n\t\t}\n\t}\n}\n\n/**\n * A policy that validates Cargo workspace member paths exist.\n *\n * @alpha\n */\nexport const WorkspaceMembersValid: PolicyDefinition<WorkspaceMembersValidConfig> =\n\tmakePolicyDefinition({\n\t\tname: \"WorkspaceMembersValid\",\n\t\tdescription:\n\t\t\t\"Validates that all Cargo workspace member paths exist and contain Cargo.toml files.\",\n\t\tmatch: /^Cargo\\.toml$/,\n\t\thandler: async ({ file, root, config }) => {\n\t\t\tconst validatePaths = config?.validatePaths ?? true;\n\n\t\t\tconst content = await readFile(path.resolve(root, file), \"utf-8\");\n\t\t\tconst toml = await parseToml(content);\n\n\t\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\t\tif (!workspace) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst members = workspace.members as string[] | undefined;\n\t\t\tif (!members || members.length === 0) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (!validatePaths) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tconst errors: string[] = [];\n\n\t\t\tfor (const member of members) {\n\t\t\t\tvalidateMember(member, root, errors);\n\t\t\t}\n\n\t\t\tif (errors.length > 0) {\n\t\t\t\treturn {\n\t\t\t\t\terror: errors.join(\"; \"),\n\t\t\t\t\tmanualFix:\n\t\t\t\t\t\t\"Fix the workspace.members paths in root Cargo.toml to point to valid crate directories.\",\n\t\t\t\t};\n\t\t\t}\n\n\t\t\treturn true;\n\t\t},\n\t});\n"]}
1
+ {"version":3,"file":"WorkspaceMembersValid.js","sourceRoot":"","sources":["../../src/policies/WorkspaceMembersValid.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from \"node:fs\";\nimport { readFile } from \"node:fs/promises\";\nimport path from \"pathe\";\nimport type { FilePolicyDefinition } from \"../policy.js\";\nimport { parseToml } from \"../policyDefiners/tomlParser.js\";\n\n/**\n * Configuration for the WorkspaceMembersValid policy.\n *\n * @public\n */\nexport interface WorkspaceMembersValidConfig {\n\t/**\n\t * If true, validate that all member paths exist on disk.\n\t * @defaultValue true\n\t */\n\tvalidatePaths?: boolean;\n}\n\nconst GLOB_SUFFIX_REGEX = /\\/?\\*\\*?$/;\n\n/**\n * Expand a simple glob pattern (e.g., \"crates/*\") into matching directories.\n */\nfunction expandSimpleGlob(root: string, pattern: string): string[] {\n\tif (!pattern.includes(\"*\")) {\n\t\treturn [pattern];\n\t}\n\n\tconst base = pattern.replace(GLOB_SUFFIX_REGEX, \"\");\n\tconst baseDir = path.join(root, base);\n\n\tif (!existsSync(baseDir)) {\n\t\treturn [];\n\t}\n\n\ttry {\n\t\tconst entries = readdirSync(baseDir, { withFileTypes: true });\n\t\treturn entries\n\t\t\t.filter((e) => e.isDirectory())\n\t\t\t.filter((e) => existsSync(path.join(baseDir, e.name, \"Cargo.toml\")))\n\t\t\t.map((e) => path.join(base, e.name));\n\t} catch {\n\t\treturn [];\n\t}\n}\n\n/**\n * Validate a single workspace member entry.\n */\nfunction validateMember(member: string, root: string, errors: string[]): void {\n\tif (member.includes(\"*\")) {\n\t\t// Expand glob and check each result\n\t\tconst expanded = expandSimpleGlob(root, member);\n\t\tif (expanded.length === 0) {\n\t\t\terrors.push(\n\t\t\t\t`Workspace member glob \"${member}\" matches no directories with Cargo.toml`,\n\t\t\t);\n\t\t}\n\t} else {\n\t\tconst memberPath = path.join(root, member);\n\t\tif (!existsSync(memberPath)) {\n\t\t\terrors.push(`Workspace member \"${member}\" does not exist`);\n\t\t} else if (!existsSync(path.join(memberPath, \"Cargo.toml\"))) {\n\t\t\terrors.push(`Workspace member \"${member}\" exists but has no Cargo.toml`);\n\t\t}\n\t}\n}\n\n/**\n * A policy that validates Cargo workspace member paths exist.\n *\n * @public\n */\nexport const WorkspaceMembersValid = {\n\tname: \"WorkspaceMembersValid\",\n\tdescription:\n\t\t\"Validates that all Cargo workspace member paths exist and contain Cargo.toml files.\",\n\tmatch: /^Cargo\\.toml$/,\n\thandler: async ({ file, root, config }) => {\n\t\tconst validatePaths = config?.validatePaths ?? true;\n\n\t\tconst content = await readFile(path.resolve(root, file), \"utf-8\");\n\t\tconst toml = await parseToml(content);\n\n\t\tconst workspace = toml.workspace as Record<string, unknown> | undefined;\n\t\tif (!workspace) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst members = workspace.members as string[] | undefined;\n\t\tif (!members || members.length === 0) {\n\t\t\treturn [];\n\t\t}\n\n\t\tif (!validatePaths) {\n\t\t\treturn [];\n\t\t}\n\n\t\tconst errors: string[] = [];\n\n\t\tfor (const member of members) {\n\t\t\tvalidateMember(member, root, errors);\n\t\t}\n\n\t\tif (errors.length > 0) {\n\t\t\treturn errors.map((message) => ({\n\t\t\t\tmessage,\n\t\t\t\tmanualFix:\n\t\t\t\t\t\"Fix the workspace.members paths in root Cargo.toml to point to valid crate directories.\",\n\t\t\t}));\n\t\t}\n\t\treturn [];\n\t},\n} satisfies FilePolicyDefinition<WorkspaceMembersValidConfig>;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/policies/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAAyB,CAAC;AAE5D;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAuB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAuB,CAAC"}
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/policies/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAA0B,CAAC;AAC7D;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAuB,CAAC;AAExD;;GAEG;AACH,eAAO,MAAM,mBAAmB,QAAuB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * A regular expression that matches package.json files in path strings.
3
3
  */
4
- export const PackageJsonRegexMatch = /(^|\/)package\.json/i;
4
+ export const PackageJsonRegexMatch = /(^|\/)package\.json$/i;
5
5
  /**
6
6
  * A regular expression that matches Cargo.toml files in path strings.
7
7
  */
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/policies/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,sBAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC","sourcesContent":["/**\n * A regular expression that matches package.json files in path strings.\n */\nexport const PackageJsonRegexMatch = /(^|\\/)package\\.json/i;\n\n/**\n * A regular expression that matches Cargo.toml files in path strings.\n */\nexport const CargoTomlRegexMatch = /(^|\\/)Cargo\\.toml$/;\n\n/**\n * A regular expression that matches gleam.toml files in path strings.\n */\nexport const GleamTomlRegexMatch = /(^|\\/)gleam\\.toml$/;\n"]}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../../src/policies/constants.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAC7D;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC;AAExD;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,oBAAoB,CAAC","sourcesContent":["/**\n * A regular expression that matches package.json files in path strings.\n */\nexport const PackageJsonRegexMatch = /(^|\\/)package\\.json$/i;\n/**\n * A regular expression that matches Cargo.toml files in path strings.\n */\nexport const CargoTomlRegexMatch = /(^|\\/)Cargo\\.toml$/;\n\n/**\n * A regular expression that matches gleam.toml files in path strings.\n */\nexport const GleamTomlRegexMatch = /(^|\\/)gleam\\.toml$/;\n"]}
package/esm/policies.d.ts CHANGED
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Built-in file and repository policies and their configuration types.
3
+ *
4
+ * Use `makePolicy()` from `repopo` or `repopo/api` to configure these definitions.
5
+ *
6
+ * @packageDocumentation
7
+ */
1
8
  export { CargoLicenceValidated, type CargoLicenceValidatedConfig, } from "./policies/CargoLicenceValidated.js";
2
9
  export { CargoLintsConfigured, type CargoLintsConfiguredConfig, } from "./policies/CargoLintsConfigured.js";
3
10
  export { CargoLockPolicy, type CargoLockPolicyConfig, } from "./policies/CargoLockPolicy.js";
@@ -21,19 +28,20 @@ export { GleamTomlSorted, type GleamTomlSortedConfig, } from "./policies/GleamTo
21
28
  export { GleamVersionConstraint, type GleamVersionConstraintConfig, } from "./policies/GleamVersionConstraint.js";
22
29
  export { HtmlFileHeaders } from "./policies/HtmlFileHeaders.js";
23
30
  export { JsTsFileHeaders } from "./policies/JsTsFileHeaders.js";
24
- export { LicenseFileExists } from "./policies/LicenseFileExists.js";
31
+ export { LicenseFileExists, type LicenseFileExistsSettings, } from "./policies/LicenseFileExists.js";
32
+ export { MaxChangedFiles, type MaxChangedFilesConfig, } from "./policies/MaxChangedFiles.js";
25
33
  export { MutuallyExclusiveScripts, type MutuallyExclusiveScriptsConfig, } from "./policies/MutuallyExclusiveScripts.js";
26
34
  export { NoBuildDirectory } from "./policies/NoBuildDirectory.js";
27
35
  export { NoJsFileExtensions } from "./policies/NoJsFileExtensions.js";
28
- export { NoLargeBinaryFiles } from "./policies/NoLargeBinaryFiles.js";
29
- export { NoPrivateWorkspaceDependencies } from "./policies/NoPrivateWorkspaceDependencies.js";
36
+ export { NoLargeBinaryFiles, type NoLargeBinaryFilesSettings, } from "./policies/NoLargeBinaryFiles.js";
37
+ export { NoPrivateWorkspaceDependencies, type NoPrivateWorkspaceDependenciesSettings, } from "./policies/NoPrivateWorkspaceDependencies.js";
30
38
  export { NoTargetArtifacts } from "./policies/NoTargetArtifacts.js";
31
39
  export { NoUnsafeWithoutJustification, type NoUnsafeWithoutJustificationConfig, } from "./policies/NoUnsafeWithoutJustification.js";
32
40
  export { NoWildcardDependencies, type NoWildcardDependenciesConfig, } from "./policies/NoWildcardDependencies.js";
33
41
  export { PackageAllowedScopes, type PackageAllowedScopesConfig, } from "./policies/PackageAllowedScopes.js";
34
42
  export { PackageEsmType, type PackageEsmTypeConfig, } from "./policies/PackageEsmType.js";
35
43
  export { PackageFolderName, type PackageFolderNameConfig, } from "./policies/PackageFolderName.js";
36
- export { PackageJsonProperties } from "./policies/PackageJsonProperties.js";
44
+ export { PackageJsonProperties, type PackageJsonPropertiesSettings, } from "./policies/PackageJsonProperties.js";
37
45
  export { PackageJsonRepoDirectoryProperty } from "./policies/PackageJsonRepoDirectoryProperty.js";
38
46
  export { PackageJsonSorted } from "./policies/PackageJsonSorted.js";
39
47
  export { PackageLicense, type PackageLicenseSettings, } from "./policies/PackageLicense.js";
@@ -42,7 +50,8 @@ export { PackageReadme, type PackageReadmeSettings, } from "./policies/PackageRe
42
50
  export { type ConditionalScriptRule as LegacyConditionalScriptRule, PackageScripts, type PackageScriptsSettings, type RequiredScriptEntry as LegacyRequiredScriptEntry, type ScriptMustContainRule, } from "./policies/PackageScripts.js";
43
51
  export { PackageTestScripts, type PackageTestScriptsConfig, } from "./policies/PackageTestScripts.js";
44
52
  export { PublicApiDocumented, type PublicApiDocumentedConfig, } from "./policies/PublicApiDocumented.js";
45
- export { RequiredGitignorePatterns } from "./policies/RequiredGitignorePatterns.js";
53
+ export { RequireCompanionChanges } from "./policies/RequireCompanionChanges.js";
54
+ export { RequiredGitignorePatterns, type RequiredGitignorePatternsSettings, } from "./policies/RequiredGitignorePatterns.js";
46
55
  export { type RequiredScriptEntry, RequiredScripts, type RequiredScriptsConfig, } from "./policies/RequiredScripts.js";
47
56
  export { RustDocExists, type RustDocExistsConfig, } from "./policies/RustDocExists.js";
48
57
  export { RustfmtConfigExists, type RustfmtConfigExistsConfig, } from "./policies/RustfmtConfigExists.js";
@@ -52,4 +61,5 @@ export { SharedDependencyVersions, type SharedDependencyVersionsConfig, } from "
52
61
  export { WorkspaceInheritance, type WorkspaceInheritanceConfig, } from "./policies/WorkspaceInheritance.js";
53
62
  export { WorkspaceMembersValid, type WorkspaceMembersValidConfig, } from "./policies/WorkspaceMembersValid.js";
54
63
  export { DefaultPolicies } from "./policy.js";
64
+ export type { FileHeaderGeneratorConfig, FileHeaderPolicyConfig, } from "./policyDefiners/defineFileHeaderPolicy.js";
55
65
  //# sourceMappingURL=policies.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,qBAAqB,EACrB,KAAK,2BAA2B,GAChC,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EACN,oBAAoB,EACpB,KAAK,0BAA0B,GAC/B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACN,eAAe,EACf,KAAK,qBAAqB,GAC1B,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACN,iBAAiB,EACjB,KAAK,uBAAuB,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACN,eAAe,EACf,KAAK,qBAAqB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,kBAAkB,EAClB,KAAK,wBAAwB,GAC7B,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EACN,YAAY,EACZ,KAAK,kBAAkB,GACvB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EACN,gBAAgB,EAChB,KAAK,sBAAsB,GAC3B,MAAM,gCAAgC,CAAC;AAExC,OAAO,EACN,cAAc,EACd,KAAK,oBAAoB,GACzB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACN,8BAA8B,EAC9B,KAAK,oCAAoC,GACzC,MAAM,8CAA8C,CAAC;AAEtD,OAAO,EACN,sBAAsB,EACtB,KAAK,4BAA4B,GACjC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;AAE9E,OAAO,EACN,wBAAwB,EACxB,KAAK,8BAA8B,GACnC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EACN,qBAAqB,EACrB,KAAK,2BAA2B,GAChC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACN,0BAA0B,EAC1B,KAAK,gCAAgC,GACrC,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EACN,qBAAqB,EACrB,KAAK,2BAA2B,GAChC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EACN,6BAA6B,EAC7B,KAAK,mCAAmC,GACxC,MAAM,6CAA6C,CAAC;AAErD,OAAO,EACN,iBAAiB,EACjB,KAAK,uBAAuB,GAC5B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACN,eAAe,EACf,KAAK,qBAAqB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,sBAAsB,EACtB,KAAK,4BAA4B,GACjC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAEhE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACN,wBAAwB,EACxB,KAAK,8BAA8B,GACnC,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAElE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAEtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,8CAA8C,CAAC;AAE9F,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EACN,4BAA4B,EAC5B,KAAK,kCAAkC,GACvC,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EACN,sBAAsB,EACtB,KAAK,4BAA4B,GACjC,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACN,oBAAoB,EACpB,KAAK,0BAA0B,GAC/B,MAAM,oCAAoC,CAAC;AAE5C,OAAO,EACN,cAAc,EACd,KAAK,oBAAoB,GACzB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,iBAAiB,EACjB,KAAK,uBAAuB,GAC5B,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,gCAAgC,EAAE,MAAM,gDAAgD,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACN,cAAc,EACd,KAAK,sBAAsB,GAC3B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EACN,aAAa,EACb,KAAK,qBAAqB,GAC1B,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,KAAK,qBAAqB,IAAI,2BAA2B,EACzD,cAAc,EACd,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,IAAI,yBAAyB,EACrD,KAAK,qBAAqB,GAC1B,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACN,kBAAkB,EAClB,KAAK,wBAAwB,GAC7B,MAAM,kCAAkC,CAAC;AAE1C,OAAO,EACN,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,mCAAmC,CAAC;AAE3C,OAAO,EAAE,yBAAyB,EAAE,MAAM,yCAAyC,CAAC;AACpF,OAAO,EACN,KAAK,mBAAmB,EACxB,eAAe,EACf,KAAK,qBAAqB,GAC1B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EACN,aAAa,EACb,KAAK,mBAAmB,GACxB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACN,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACN,mBAAmB,EACnB,KAAK,yBAAyB,GAC9B,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EACN,cAAc,EACd,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,GACvB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACN,wBAAwB,EACxB,KAAK,8BAA8B,GACnC,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACN,oBAAoB,EACpB,KAAK,0BAA0B,GAC/B,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EACN,qBAAqB,EACrB,KAAK,2BAA2B,GAChC,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"policies.d.ts","sourceRoot":"","sources":["../src/policies.ts"],"names":[],"mappings":"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"}
package/esm/policies.js CHANGED
@@ -1,3 +1,10 @@
1
+ /**
2
+ * Built-in file and repository policies and their configuration types.
3
+ *
4
+ * Use `makePolicy()` from `repopo` or `repopo/api` to configure these definitions.
5
+ *
6
+ * @packageDocumentation
7
+ */
1
8
  // Cargo.toml / Rust policies
2
9
  // biome-ignore lint/performance/noBarrelFile: intentional public API entry point for policies
3
10
  export { CargoLicenceValidated, } from "./policies/CargoLicenceValidated.js";
@@ -37,16 +44,17 @@ export { GleamVersionConstraint, } from "./policies/GleamVersionConstraint.js";
37
44
  export { HtmlFileHeaders } from "./policies/HtmlFileHeaders.js";
38
45
  export { JsTsFileHeaders } from "./policies/JsTsFileHeaders.js";
39
46
  // License policies
40
- export { LicenseFileExists } from "./policies/LicenseFileExists.js";
47
+ export { LicenseFileExists, } from "./policies/LicenseFileExists.js";
48
+ export { MaxChangedFiles, } from "./policies/MaxChangedFiles.js";
41
49
  export { MutuallyExclusiveScripts, } from "./policies/MutuallyExclusiveScripts.js";
42
50
  // Build directory policies
43
51
  export { NoBuildDirectory } from "./policies/NoBuildDirectory.js";
44
52
  // File extension policies
45
53
  export { NoJsFileExtensions } from "./policies/NoJsFileExtensions.js";
46
54
  // File size policies
47
- export { NoLargeBinaryFiles } from "./policies/NoLargeBinaryFiles.js";
55
+ export { NoLargeBinaryFiles, } from "./policies/NoLargeBinaryFiles.js";
48
56
  // Dependency policies
49
- export { NoPrivateWorkspaceDependencies } from "./policies/NoPrivateWorkspaceDependencies.js";
57
+ export { NoPrivateWorkspaceDependencies, } from "./policies/NoPrivateWorkspaceDependencies.js";
50
58
  // Rust build artifact policies
51
59
  export { NoTargetArtifacts } from "./policies/NoTargetArtifacts.js";
52
60
  // Rust unsafe code policies
@@ -59,7 +67,7 @@ export { PackageAllowedScopes, } from "./policies/PackageAllowedScopes.js";
59
67
  export { PackageEsmType, } from "./policies/PackageEsmType.js";
60
68
  export { PackageFolderName, } from "./policies/PackageFolderName.js";
61
69
  // Package.json field policies
62
- export { PackageJsonProperties } from "./policies/PackageJsonProperties.js";
70
+ export { PackageJsonProperties, } from "./policies/PackageJsonProperties.js";
63
71
  export { PackageJsonRepoDirectoryProperty } from "./policies/PackageJsonRepoDirectoryProperty.js";
64
72
  export { PackageJsonSorted } from "./policies/PackageJsonSorted.js";
65
73
  export { PackageLicense, } from "./policies/PackageLicense.js";
@@ -71,8 +79,9 @@ export { PackageScripts, } from "./policies/PackageScripts.js";
71
79
  export { PackageTestScripts, } from "./policies/PackageTestScripts.js";
72
80
  // Rust documentation policies
73
81
  export { PublicApiDocumented, } from "./policies/PublicApiDocumented.js";
82
+ export { RequireCompanionChanges } from "./policies/RequireCompanionChanges.js";
74
83
  // Gitignore policies
75
- export { RequiredGitignorePatterns } from "./policies/RequiredGitignorePatterns.js";
84
+ export { RequiredGitignorePatterns, } from "./policies/RequiredGitignorePatterns.js";
76
85
  export { RequiredScripts, } from "./policies/RequiredScripts.js";
77
86
  // Rust documentation file policies
78
87
  export { RustDocExists, } from "./policies/RustDocExists.js";