东方诊断
关于类型脚本检查器的东意识诊断规则
东方诊断 是共享规则引擎,可以捕获东方特有
纯类型脚本无法读取的错误—— 相同的检查浮出到代理服务器
写入时间( Claude 插件守护进程) 以及编辑器和 CI 中的开发者
(单位:千美元)@elaraai/eslint-plugin-east) (中文(简体) ). 规则与
真实 ts.Program,因此它们具有类型意识,而不是正电子热能.
每一个规则 东-内自有门 它只在有真正的东方的地方开火
代码( 东类型/ 块, a) e3 构造,或 @elaraai/* 输入),所以该集
在平版Script上通过安装和惰性选择。 没有
软件包标识允许/拒绝列表;每个项目压制是 disabled 选项,
喜欢任何linter.
特征
- 共享规则集 - 一个引擎,
runEastRules(ts, program, sourceFile, checker),在每一个表面重复使用. - 类型意识 - 规则参考TypeScript检查器(例如解决)
BlockBuilder,变体上下文类型). - 没有捆绑的编译器 - 说吧
typescript是一个对等依赖; 主机的版本被注入. - 诊断服务 - 说吧
createDiagnosticsService()解决最近的 tsconfig, 持有温暖LanguageService,然后将本地类型错误与文件的 East 规则合并。 支持未保存的缓冲器的嵌入式覆盖 . - 可读的东方类型出错 - 东部类型的本地TS可分配性错误通过东部的结构类型diff重写(
diffTypes)),因此一个递归型内部深处的不匹配读取为一行本地化行,而不是被重报的通名的页面. 这个项目是自己的@elaraai/east在运行时解决,所以 diff 总是匹配项目的类型语义. - LSP 服务器 - 说吧
runEastLsp()服务于语言服务器协议上的相同诊断(stdio, 零依赖性), Claude 代码插件可以使用lspServersNeovim 或者任何LSP客户端. - tserver 插件 - 那个
@elaraai/east-diagnostics/tsserver-plugin条目装饰编辑器现有的 TypeScript 语言服务( 无第二程序), 通过 East UI 预览扩展发送到 VS 代码typescriptServerPlugins捐款.
规则
东侧平庸卫生
no-redundant-east-cast- 关于价值的冗余TS类型信息$.let编号 :$.const东方类型的论据已经支配着——一个铸造者(as …编号 :<…>, (中文(简体) ),new Map<K,V>()通用词,或East.value(x, T)包装.prefer-explicit-east-type- 单弧$.let编号 :$.const的数值([], (中文(简体) ),{}, (中文(简体) ),new Map()) (中文(简体) ).prefer-some-none- 说吧variant("some"/"none", …)改为some()编号 :none。 。 。 .no-handrolled-variant- 普通物体文字,其中需要东方变体/选项,或者在导入东方的文件中,a{ type, value }在任意槽中带有字符串标记的字元, 但已公布的 API 自己类型( 声明文件, 如 East's)Resolution) (中文(简体) ). 字面上缺少"东方"的品牌 来形容一个变体.no-east-namespaced-type- 说吧East.IntegerType等,而不是赤色导入.prefer-let-const-over-east-value- 说吧East.value(…)已声明或返回East.function块.no-relative-src-import- 进口 又一个 包的内部通过../src/…或深处@elaraai/x/src路径而不是其已公布的名称。 (软件包导入其 拥有src相对的——例如: spec's../src/index.js——是免责的;它不能导入自己已公布的名称. )no-let-const-in-expression- 说吧$.let编号 :$.const用于除a以外的任何地方const编号 :let初始化器, 一个赤裸的语句, areturn,或简洁的箭头正文(例如:struct-field值、数组元素、调用参数,或链式目标在表达式中将声明掩埋).no-unexecuted-east-expression- 一个赤裸的东方表达式声明,从未用过$( … )或约束。 声明对其具有约束力,转让也具有约束力(keyFn = East.function(…),在两个函数之间作出选择).no-reinlined-east-binding- 东边Expr受联署材料约束const编号 :let并在一个东体内读出两次, 或者在每个元素回调,a$.for编号 :$.while身体或被窝East.function,在每次读取时重新加注——并重新评价;将其绑定一次$.let编号 :$.const单臂1个读取(.ifElse, (中文(简体) ),$.if … .else页:1match(手)和(a)项$.const在任何地方读作保持沉默,在每一个东方机构之外所做的一项职能也是如此(East.function,或一个帮助者或一个条件给它:它捕捉到没有约束,所以在每次读取时再次使它重新评价无.prefer-jsx-over-factory-call- 在一个.tsx档案,工厂的Foo.Root(...)其结果是JSX要素——作者:<Foo>标记代替.no-untracked-east-data- 一个赤裸的JSconst在一个区块内东型位置所消耗的文字——用$.const编号 :$.let。 。 。 .
东方主机
这些原则有一个原则: 东区内部的代码必须是东区,主机语言可能 声明 东/ E3 程序, 但从未 计算 其数据依赖的IR、密钥或值.
no-host-in-east-block- 东区内部,任何主机语言结构:主机呼叫(当地TS助手、JS内建、JS阵列方法)、TS关闭/功能 声明,东行运行器上的主办操作器(a + b, (中文(简体) ),cond ? a : b, (中文(简体) ),&&编号 :||),主机索引访问(arr[i]联合来文的价值)for编号 :while编号 :if发送 IR, 或主机字符串插值。 (东方方法链,$.*, (中文(简体) ),East.*编号 :Expr.*, (中文(简体) ),variant编号 :some编号 :none, (中文(简体) ),East.str,以及任意@elaraai/*电话是东方的 从来没有标记。 )no-module-scope-east-macro- 模块范围TS帮助器,每次返回都建有东IR(a)Expr链条,East.value, (中文(简体) ),variant编号 :some超过一个Expr),或复合字符串键((o, l) =>${o}|${l}``} 输入 East 数据的${o}|${l}``} — 使它成为真实East.function,或以打入的键/嵌入的东结构来建模数据。 在主机数据(一个渲染器的处理器,一个测试的固定器)和主机存储密钥上,帮助构建解码值是主机代码,并且通过. 申报工厂也这样做——帮助者返回e3定义(TaskDef, (中文(简体) ),RecordIndexDef, (中文(简体) ),MigrationDef,.)或记录的部分作为其构建者起草(.)index.on(…), (中文(简体) ),mutation.patch(), (中文(简体) ),migration.value(…)),它构成程序的结构——返回交还帮助者自己的参数,例如检查缩小(return fn as FunctionExpr<I, O>),它不建立;程序构建者,返回其程序的IR捆绑(toIR()),将它序列化;和一个函数厂,每个返回一个函数值来自主机数据(类型,声明)和其他函数,一个程序绑定和调用。 仍然检查一个使用函数以外的东值的帮助者:它返回的函数将捕获它.no-compile-time-data-injection- 构建时间数据摄入(a)node:fs进口/呼叫,JSON.parse, (中文(简体) ),process.env在模块范围——运行时通过e3.input/数据集/平台任务. (一个没有东边读取器的真正的种子时靴子是可以接受的警告。 )no-compile-time-seed-data- 主机计算数据作为第3个参数的种子传递e3.input(name, type, variant('value', seed))a 包括:new Map()按东道方填入的/阵列for- loops,或主机调用的对象文字(num(cfg.x), (中文(简体) ),BigInt(...))——将构建时段快照烤入已部署程序. 默认必须是小的 作者常数 (字形,为空/字形)Map编号 :Set/阵列/结构,或东值variant编号 :some编号 :none编号 :East.value)或省略;运行时装入真实/繁多的数据(a)BlobType输入解析为blob.decodeCsv(…)在一个e3.task,一个平台FileSystem.readFile,或一个e3.record它的变异.
部署/运行时间-故障分类,进行打字检查
require-runner-platforms- 一个e3.task调用 PROJECT 宣布的平台功能(East.platform("proj.x", …)其选项宣布不runner.platforms{ custom: … }条目 —— 仅在“ Platform 函数... 不可用” 的数据流运行时失败 .no-cross-block-builder- 一个被窝住的东方回叫 排放约束 通过一个OEER块$(单位:千美元)xs.map((_$, x) => { $.let(…) }))——错误地块中的束缚地.no-state-outside-reactive-东来State.*外部a<Reactive>构建器 — UI 函数在分析时变为同位素并被部署时拒绝.prefer-const-ui-callbacks- 一个East.function操作员用JSX道具内写——重建每个道具equalFor无法区分函数值,因此被纪念的渲染器错过了互换. 捆绑一次$.const。 。 。 .no-dynamic-bind-path- 一个Data.bind编号 :State.bind从东值计算出的密钥 — 绑定密钥必须是 IR- 构建常数, 或绑定从ui()显出.no-build-time-clock- 说吧Date.now()/ 无标记new Date()在East/e3源的模块范围——BUILD时钟被烤入已部署的程序.no-handrolled-value-type-mirror- 手写的interface Foo {…}镜像内镜的东向类型值FooType,一个as { type: …; value: … }主张,或*Like介面或字面字面标注在 East 类型上 – 以ValueTypeOf<typeof FooType>因此它不能漂移, 并缩小一个解码的结合 在它的标签。 一个工厂的选项接口( Q)SubtypeExprOrValue<…>成员)是输入而非镜子,并经过.no-host-comparison-on-east-values- 说吧===编号 :<,并排序比较器,减去它们 ——使用equalFor(T)编号 :compareFor(T),或Object.is(a, b),指同一个对象(备忘录、缓存).require-example-returns- 一个example()无returns(对非NullType编号 :UIComponentType)——牵引装置运行fn作为赤裸的语句和断言假道.no-duplicate-definition-name- 两个同种e3定义在一个文件中共享一个名称字符串——它们在部署时会碰撞.no-inline-credentials- 字串证书(password, (中文(简体) ),secretAccessKey, (中文(简体) ),token直接或包裹在some(…)编号 :variant("some", …))在East/e3源中——IR是内容地址,输出,复制,因此其中的秘密实际上不可信赖. 使用Env.get("NAME")(东-节点-std),提供每个环境的价值. 与本地主机/端点(测试容器)配对的证书免责.
主机代码持有解码后东方值
一旦东方解码出东方值, 渲染器、运行时间或测试会持有东方值,
这里的每个规则都标出JavaScript的站牌 代表东方的公用事业.
每个站台的打字检查都干净, 和几个隐藏真正的错误在渲染器中
(#960,#962) (中文(简体) ).
一种价值通过它的类型来源于:a ValueTypeOf 结构, a
成员携带 [variant_symbol]页:1 SortedSet 编号 : SortedMap,或一块地,
有效载荷或元素从一个清单中读出——从不列出姓名. hostValueRuleNames
名称集( 有 no-host-comparison-on-east-values, (中文(简体) ),
no-handrolled-value-type-mirror, (中文(简体) ), no-handrolled-variant, (中文(简体) ),
prefer-some-none 财务报告和审定财务报表 no-struct-type-from-object以便一个只奔跑的召唤者
带有 only。 。 。 .
no-host-print-of-east-values- 说吧String(x), (中文(简体) ),x.toString(), (中文(简体) ),`${x}`, (中文(简体) ),JSON.stringify(x), (中文(简体) ),x.toISOString()在一个值 JavaScript 上与 East 不同的打印——一个浮点,一个 DateTime,一个 Blob,一个struct,一个变体,一个收藏. 使用printFor(T),或个人的本地化格式。 字符串、整数和布尔打印方式相同,数字写作CSS长度(`${w}px`)是风格,不是指印.no-host-parse-to-east-values- 说吧BigInt(s), (中文(简体) ),Number(s), (中文(简体) ),parseFloat(s), (中文(简体) ),parseInt(s), (中文(简体) ),new Date(s), (中文(简体) ),Date.parse(s)或者说JSON.parse(s)将文本读入一个东槽——一个东函数值的参数,一个变体的有效载荷,一个struct的字段. 使用parseFor(T)并采取行动success。在来源中写入的文本是其作者的,但保存一个无区日期时间,该时间new Date在当地时间读取.no-js-type-dispatch-on-east-values- 说吧typeof x或者说x instanceof C——按其东类发送isValueOf(x, T))或它的变体标记.no-js-collection-for-east-collection- 一个Java脚本Set编号 :Map由structs,变体或 DateTimes 在东集, Dict 或变体有效载荷中起落而来—— 它通过身份来找到一个密钥, 所以一个平等的密钥永远找不到它的入入. 使用SortedSet编号 :SortedMap与compareFor(K)弦,整数,花键和布尔键是东方自己的平和和通过.no-struct-type-from-object- 东边的StructType给一个只在运行时才知道字段的物体——Object.fromEntries(…)页:1Record<string, …>或一般结构fields,一个分布,一个类型的计算名称string− 或像整数一样命名字段的对象("10", (中文(简体) ),2024),写出或类型. 物体在所有其他物体之前都列出这样的名称,无论它在哪里写,所以它不能使这个字段保持原位,以及StructType拒绝(# 1574) 。 宣布田地为列表,StructType([[name, type], …]),保持任何命令;Object.entries(T.fields)列出结构类型.StructType(Object.fromEntries(list))固定为StructType(list)名称已知且无一物像整数的物体——写出、记录、宣布的结晶fields或散取一分,一分一分.
使用量
import * as ts from "typescript";
import { runEastRules, createDiagnosticsService, hostValueRuleNames } from "@elaraai/east-diagnostics";
// Pure: run the rules over one source file you already have a program + checker for.
const diagnostics = runEastRules(ts, program, sourceFile, checker, { disabled: ["prefer-some-none"] });
// Only the rules over host code holding decoded East values.
const hostValues = runEastRules(ts, program, sourceFile, checker, { only: hostValueRuleNames });
// Or let the service resolve the project and merge native + rule diagnostics.
const service = createDiagnosticsService();
const text = service.diagnoseText("/path/to/file.ts"); // "" when clean
Claude 代码插件
东方生态系统也运载a 克劳德代码 插件 — East 语言技能, 实例搜索, 以及 East 代码的先发制人诊断 elaraai 市场:
# Inside Claude Code
/plugin marketplace add elaraai/east-workspace
/plugin install east@elaraai
# From a terminal
claude plugin marketplace add elaraai/east-workspace
claude plugin install east@elaraai
许可证
双重许可证:
- 开源数字 : AGPL-3.0 导弹 - 免费开放源码使用
- 商业:可供专有用途-联系方式 支助@elara.ai
开发者 Elara AI Pty有限公司