@webority / repo-checks
仓库检查webbority React web门户和React Native应用。一个命令读取每
应用程序 package.json 在git存储库和报告中,内部规则说它不能有,
必须有,以及它必须如何固定和安装。
它还计算原始尺寸,原始颜色,根字体大小和调色板读取的每一个跟踪风格, 存储库的标记和脚本文件(bootstrap-ui。md→令牌)。
使用
pnpm add -D --save-exact @webority/repo-checks
pnpm exec webority-repo-checks # every app in the repository
pnpm exec webority-repo-checks apps/portal # one app folder
应用程序是一个 package.json 谁的 dependencies 持有 react-native (移动)或 react-dom (网络)。一个 react-dom 文件夹中也有 react-native-web 是一个react-native-web演示:它获得了pnpm和Biome检查,而不是门户规则。生物群落和 @webority/biome-config 都是从 package.json 旁边的 biome.json 的嵌套配置 "root": false 参照上面的方法),因此根配置约束的子文件夹不会重复它们。一个 workspace:, file: 或者 link: 引用是本地的,永远不会被视为同步版本。
一个装有 agentation 在其 dependencies 是一个构建工具,而不是一个应用程序。它和其他任何东西(工具根,库)只得到lockfile检查。
每个应用程序也得到Node检查: engines.node (从应用程序的 package.json,否则它旁边的那个 pnpm-lock.yaml)一定是 >=24.15 <25和最近的 .nvmrc 必须持有 24。一个手机应用程序 android/ 文件夹获得Android检查,以及web应用程序的 src/ 导入检查。
这个 missing-export:<file> check运行安装在应用旁边或应用上方文件夹中的Biome,所以它需要 @biomejs/biome 安装;没有一个,它什么也不报告,而且 required:@biomejs/biome 查找失败的应用程序。
| 发现 | 这意味着什么? |
|---|---|
banned:<name> | 一个依赖规则退役或禁止(ESLint, Prettier, lint-stage, react-toastify, moment等;移动列表是退役库表) |
required:<name> | 每个应用都带有依赖关系(Biome和共享预设,核心和UI包,web上的Bootstrap和react-bootstrap,手机上的Crashlytics)。 |
not-exact:<name> | 一、 ^ 或者 ~ 范围内。网络销 @webority/* 和 bootstrap 准确;React Native应用会精确地固定每个依赖项 |
bootstrap-version | 5.3.3以外的引导 |
lockstep:<set> | 在一个版本上一起发布的包被固定在不同的版本上 |
pnpm:* | 一个承诺 package-lock.json 或者 yarn.lock,没有 pnpm-lock.yaml,没有 devEngines.packageManager 的 { "name": "pnpm", "version": "<x.y.z>", "onFail": "error" } (一个普通 npm install 失败了,PNPM拒绝任何其他版本),这是一个遗留问题 packageManager 字段(pnpm会忽略devEngines旁边的字段),或者 pnpm-workspace.yaml 没有 engineStrict: true 和 strictPeerDependencies: true |
biome:* | 没有Biome配置,一个不扩展的配置 @webority/biome-config/biome.jsonc,一个 formatter.lineEnding 或者根 linter.rules,或(手机)号码 __DEV__ 全局的,可以是顶级的,也可以是覆盖中的 includes 覆盖应用程序文件夹 |
catalogue-copy:<file> | 下面的web文件 src/components/ 名字像a @webority/ui-react 出口 |
engines-node-floor:package.json | engines.node 是不是失踪了 >=24.15 <25 |
engines-node-floor:.nvmrc | 否 .nvmrc 在应用程序的上方或下方,否则无法保持 24 |
android-release-signing | android/app/build.gradle 没有一个卫兵会扔球吗 GradleException 当请求的任务名称包含 release 签名设置或上传密钥丢失 |
android-edge-to-edge | android/gradle.properties 集合 edgeToEdgeEnabled=false |
rn-mainactivity-oncreate-bundle:<file> | 一、 MainActivity.kt 或者 .java 将一个bundle传递给 super.onCreate;通过 null |
metro-bridge:<file> | React Native应用程序的入口文件(package.json main、默认 index.js),根 App.js 或者 src/App.js 也不是应用程序的任何其他源文件(外部) node_modules, ios, android 以及构建输出)导入 createMetroBridge 从 @webority/mobile-core/metro 和分配 globalThis.__METRO_BRIDGE__ 从一个 createMetroBridge(...) 电话里面 if (__DEV__) 在同一档案中;react-native-procedures。md→调试:开发桥梁 |
mobile-production-stamps:<file> | 移动应用的Android或iOS清单 Expo.plist 将无线更新指向Staging或Development提要,或者 android/gradle.properties 带有 .staging 或者 .development App id,由 mobile-tools prebuild。运行 mobile-tools prebuild --env Production 之前 |
spa-host-immutable-assets:<file> | web应用程序 web.config, staticwebapp.config.json, _headers 或者 spa-host*.json 设置缓存控制 immutable |
stale-theme-name:<file> | web样式或源文件将0.89.0之前的主题名称作为整个令牌读取(var(--radius), --color-primary-ink). 这些船没有别名。运行 webority upgrade 0.89.0 --path <folder> 有一次,然后 webority brand. --color-primary-text 没有标记。从未在基线中记录 |
lint:<file> | Biome在app文件夹中检查,警告为错误:任何错误或警告。从未在基线中记录;修复发现 |
web-import-axios:<file> | 一个web源文件下 src/ 导入 axios; HTTP通过 @webority/web-core |
web-import-router:<file> | 导入web源文件 BrowserRouter 或者 Routes 从 react-router 或者 react-router-dom; 路由是 createBrowserRouter |
web-import-env-branch:<file> | web源文件如下 import.meta.env.DEV 或者 import.meta.env.PROD; 分支 AppSettings.ENVIRONMENT |
missing-export:<file> | 一个文件导入了一个它的模块没有导出的名称;Biome的React错误警报和未解决的别名没有报告 |
raw-measure:<file> | 一个px, rem或em文字,或一个粗细或行距的数字,在填充,边距,间隙,插入,角,字体大小,字体粗细或行高。每个文件计数。 |
raw-colour:<file> | 一个六角,一个 rgb() 或者 hsl() 使用数字,或者在颜色属性或样式键中使用名为color的CSS,其中颜色含义所属。每个文件计数。 |
root-font-size:<file> | 一、 font-size 或者 font 上声明 html 或者 :root。类型大小采用浏览器的根大小。每个文件计数。 |
palette-read:<file> | 对原始调色板步骤的读取(var(--wui-<step>),或者手机 palette. 阅读)或Bootstrap主题颜色(var(--bs-primary), var(--bs-primary-rgb) 或萨斯 $primary(为八种主题颜色),其中颜色的含义所属。消息命名了要读取的含义。每个文件计数。 |
missing-canvas-key:<file> | 列表中的第一个JSX标记 .map( Callback),没有 data-canvas 网页或 testID 就一个电话,没有传播。每个文件计数。 |
repeated-canvas-key:<file> | 一个引用 data-canvas 或者 testID 相同模块中第二个标签重复的值。每个文件计数。 |
raw-bootstrap:<file> | 一、 .jsx, .tsx 或者 .cshtml 文件写入一个原始的引导组件类(btn, card, modal, table, badge, alert, form-control, form-select, form-check-input, pagination, nav-tabs, dropdown-menu, offcanvas, breadcrumb, progress, spinner-border, accordion); 消息命名库组件。修饰语,如 btn-primary 单独不算。每个文件计数。 |
library-class-restyle:<file> | 一个产品 .scss 或者 .css 选择器为库主题定义的类命名(a wui-* 组件类或 app-* Shell、导航或TAB类),包括作为祖先(.my-page .wui-card-body, .app-shell.collapsed .app-sidebar .brand-logo); 使用库道具或令牌,或产品类。只设置自定义属性的令牌文件不命名类,也不计数。每个文件计数。 |
shadowed-library-name:<file> | 一、 .jsx 或者 .tsx 导入目录组件 @webority/ui-react 在另一个名称下,并以目录名称(import { AppButton as LibraryAppButton } 与 function AppButton),因此它的调用站点被读取为库组件。使用库组件和它的props,或者给产品组件起一个自己的名字。每个文件计数。 |
rename-wrapper:<file> | 再出口 @webority/ui-react,其主体只返回一个目录组件的组件,或 _Name.cshtml 偏导是1 <app-*> 元素:导入库名。每个文件计数。 |
single-use-component:<file> | 下面的文件 src/components/<feature>/ (不 layout/),或共享的部分下 Pages/Shared/ 或者一个 *.Web.Common 项目,即少于两个文件使用;将其移动到使用它的页面旁边。跳过布局:A _…Layout.cshtml 文件,或者一个 _ViewStart.cshtml 的项目名称 Layout = "<name>"在美国,因为很多地区都叫它这个名字。Razor文件的第一行是 @* layering-allow single-use-component: <reason> *@ 也被跳过了;一个没有理由的标记是一个发现。每个文件计数。 |
error-summary-title:<file> | 一、 .cshtml <app-error-summary> 设置一个 title 使用旧的通用措辞(“Please fix the following”,“There were errors”);放下它,库将写入标准标题。计算的标题或命名失败操作的标题不计算在内。每个文件计数。 |
route-internal-id:<file> | 路由绑定了一条记录的内部编号:A .cshtml @page 或者c# [Route], [Http*] 或者 Map* 模板的 id 或者 ...Id 参数受限 int 或者 long,或 asp-route-* 传递记录的链接 .Id。通过公共id ({publicId:guid})。一个无类型 {id} 不计算在内。每个文件计数。 |
oversize:<file> | 一、 .jsx, .tsx 或者 .cshtml 文件超过600行(超过800行表示按照关注点拆分)。只是一个警告:它永远不会失败,即使在基线之外。每个文件计数。 |
hook:drift | 根 .husky/pre-commit 缺少或不同于此包提供的共享钩子(CRLF被忽略) |
tracked-case:<path> | 一个被跟踪的文件或文件夹,它在磁盘上的名字只有字母大小写不同,在Mac上手工重命名,git从未见过;Linux签出无法找到导入。运行 git mv 信息给出。一个文件夹只报告一次。总是失败。 |
注释行(//, /*, *), .test. 或者 .spec. 导入检查不读取文件。
令牌规则:按文件计数
这四条规则解读了每一条轨迹 .scss, .css, .cshtml, .jsx 和 .tsx 文件,每个 .js 或者
.ts 导入的文件 react-native。它们跳过带有a的路径 node_modules, dist, generated,
vendor, __tests__ 或者 __mocks__ 段,一个电子邮件模板项目文件夹(<Product>.Email 或者
<Product>.Emails电子邮件客户端读取没有CSS变量,所以需要内联像素和颜色;
一个普通 Email 文件夹的管理屏幕保持选中),路径包含 wwwroot/lib/,一个 .generated. 名字,
一个 .min.css 名称、 .test. 或者 .spec. 脚本,以及repo列表下的任何路径 generated[].paths 在
.webority/map.json (落后于 / 命名一个文件夹; * 同一段内的匹配)。列出已编译的
样式表:它捆绑了共享主题,所以它的库规则不是产品的代码
规则仍然读取构建它的SCSS。
raw-measure 计数一个非零的px, rem或em字面量,或一个纯数字的权重或前导,in
填充、边距、间隙、插入、角、字体大小、字体粗细或行高:每个发现一个
声明或样式键。一个零,一个关键字auto, bold, normal),一个令牌
(var(--wui-space-md)),百分比或其他单位,以及自定义属性或Sass变量
声明不计算在内。
raw-colour 算一个十六进制,然后 rgb(), rgba(), hsl() 或者 hsla() 带有数字参数或CSS
命名为color,在颜色属性或样式键中(包括内部的回退) var(--color-x, #fff))。
transparent, currentColor,含义读取,自定义属性或Sass变量声明,以及
中的文本 url() 或者带引号的字符串不计算在内。
root-font-size 计算每一个 font-size 或者 font 选择器为的规则中的声明 html 或者
:root (带或不带属性、类或伪类),无论其值是多少。
palette-read 计算每个 var(--wui-<step>) 每个电话 palette. 阅读,加上每个
var(--bs-<colour>), var(--bs-<colour>-rgb) 和萨斯 $<colour> Bootstrap的八个主题
颜色:每次读取一个发现,声明不是读取。
missing-canvas-key 和 repeated-canvas-key 阅读导入的每个脚本模块 react-native,
@webority/mobile-ui 或者 @webority/ui-react。属性为 testID 的模块中
react-native 或者 @webority/mobile-ui, data-canvas 在任何其他地方。该项目的价差计为
键入,重复在第一个标记之后为每个标记添加一个查找结果。
src/assets/styles/_home.scss:12: color: var(--wui-primary);
(read the meaning: var(--color-primary))
新规定以警告开始
lint, rn-mainactivity-oncreate-bundle, spa-host-immutable-assets 和 oversize 以警告形式打印,直到
REPO_CHECKS_ENFORCE 名称: REPO_CHECKS_ENFORCE=lint,rn-mainactivity-oncreate-bundle,或者 all。一个版本
当没有存储库有命中时,从警告列表中删除规则。 --json 带有下面的警告 warnings.
现有的发现是:一个只会缩小的基线
采用检查的存储库记录它今天的内容,一次:
pnpm exec webority-repo-checks --baseline-init
写 .webority/baselines/repo-checks-baseline.json,创建文件夹:依赖项发现为
"<app folder> | <id>",每个文件计算代码规则:
{
"version": 2,
"findings": ["apps/portal | banned:@webority/ui-elements", "samples/react-sandbox | required:@webority/web-core"],
"counts": { "palette-read:packages/theme/scss/wui/_buttons.scss": 3, "raw-measure:src/assets/styles/_home.scss": 14 }
}
从那时起,基线中的发现被作为已知的报告,并且不会失败;还有其他发现吗?
失败(退出1)。计数可能只会下降:超过其记录计数的文件失败并打印其行,
从基线缺失的文件从0开始,因此新的或重命名的文件从0开始。修旧后
发现或降低计数, --baseline-shrink 丢弃固定的结果并将每个计数降低到
它的当前值,删除一个达到0的;它从不加1或加1。
--baseline-accept <folder> --reason <text> 记录所有者接受的债务:添加该文件夹下的每个当前发现和计数,并将计数提高到其当前值,而不会降低。只用于债权人接受的债务,并说明理由;原因被保留了下来 accepted 在基线文件中,和 --baseline-shrink 保留这个条目。
--baseline-adopt <rule,...> 记录今天的发现,并计算基线从未记录的规则,例如新版本添加的规则。它拒绝基线已经记录的规则,因此它永远不会提出一个现有条目,并命名每个规则采用了多少个发现和计数。
--baseline-init 运行一次:它拒绝现有的文件和文件夹参数。当文件为
早期形状(否) version),删除并运行 --baseline-init 从git根目录查看一次,然后查看
提交之前的困难。
--json 打印 { root, new, known, stale } 的工具;记录上面的计数出现在 new
用它的线条。
共享的预提交钩子
每个存储库都运行这个包附带的预提交钩子。从git根目录中采用一次:
pnpm exec webority-repo-checks --sync-hook
写 .husky/pre-commit,创造 .husky 当缺少时,用LF行结尾。一个
多应用程序存储库只在根目录下安装一次。赫斯基一直是安装者,通过
prepare 脚本。移除绒毛分级(pnpm remove lint-staged,并删除其配置键):
共享钩子运行Biome本身。加入仅支持回购的步骤 .husky/pre-commit.local; 共享钩子
在Biome之后运行该文件,然后 --sync-hook 永远不要碰它。
hook:drift 保持根副本等于附带的副本。
版本控制
发表于 webority-ui Monorepo和另一个人步调一致 @webority/* 包。销
精确版本;当你撞到它时,新的规则就会出现。