@compelem/compiler 0.30.0-beta.1 → 0.30.0-beta.3

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { a as ComponentAnalysis, c as ReactiveKind, i as CompilerOptions, n as compelemCompiler, o as DEBUG_DIV, r as CompiledStatic, s as ReactiveField, t as VitePluginOptions } from "./vite-BtG-4Z6L.js";
1
+ import { a as ComponentAnalysis, c as ReactiveKind, i as CompilerOptions, n as compelemCompiler, o as DEBUG_DIV, r as CompiledStatic, s as ReactiveField, t as VitePluginOptions } from "./vite-BAl4p1jA.js";
2
2
 
3
3
  //#region src/utils/oxc.d.ts
4
4
  interface ParsedFile {
@@ -11,7 +11,6 @@ interface ParsedFile {
11
11
  }
12
12
  //#endregion
13
13
  //#region src/analyze/component.d.ts
14
-
15
14
  /** 判断某个 import source 是否指向 compelem 本体。 */
16
15
  declare function isCompelemSource(source: string): boolean;
17
16
  /** 从 import 表里挑出 compelem 相关绑定:本地名 → 原始导入名。 */
@@ -44,14 +43,14 @@ interface RenderAnalysis {
44
43
  viewDeps: string[];
45
44
  /** 子视图依赖:回调节点 start 偏移 → 路径列表 */
46
45
  subViewDeps: Map<number, string[]>;
47
- /** 降级原因列表(空表示未降级) */
48
- degrades: string[];
46
+ /** 阻断原因列表(空表示通过)。非空 ⇒ `assertStaticAnalysis` 抛 `StaticAnalysisError`。 */
47
+ blockers: string[];
49
48
  /**
50
49
  * 硬性违规(当前只有 D7:模板内直接嵌套模板)。
51
50
  *
52
- * 与 degrades 的区别:degrades 是「静态推不出,放弃注入(降级)」,
53
- * errors 是「写法违反约束,必须改代码」——二者都导致降级,但 errors 需要在
54
- * 构建期报给用户,因为它是可修的、且修掉后才能启用编译期产物。
51
+ * 与 `blockers` 都是「不可编译」,二者的区别只在**归因**:`blockers` 是
52
+ * 「静态推不出结论」(D0/D3/D4/D5/D6),`errors` 是「写法违反约束,用户可修」
53
+ * (D7)—— 故 errors 带源码区间,供构建期定位到具体位置。
55
54
  */
56
55
  errors: TemplateIssue[];
57
56
  }
@@ -60,17 +59,14 @@ declare function analyzeRender(comp: ComponentAnalysis, sinks?: {
60
59
  mainHits: any[];
61
60
  }): RenderAnalysis;
62
61
  //#endregion
63
- //#region src/analyze/degrade.d.ts
62
+ //#region src/analyze/static-gate.d.ts
64
63
 
65
64
  /**
66
- * 汇总单个组件的静态分析结论。
67
- * 命中任何一条 ⇒ 抛错(调用方拿不到「凑合能跑」的产物)。
65
+ * 静态分析闸门:汇总单个组件的结论,命中任何一条即抛 `StaticAnalysisError`。
66
+ *
67
+ * 无返回值 —— 只有「通过」与「抛错」两种结局(见本文件头 §架构前提)。
68
68
  */
69
- declare function decideDegrade(comp: ComponentAnalysis, ra: RenderAnalysis): {
70
- degraded: false;
71
- reason: null;
72
- errors: RenderAnalysis['errors'];
73
- };
69
+ declare function assertStaticAnalysis(comp: ComponentAnalysis, ra: RenderAnalysis): void;
74
70
  /**
75
71
  * 静态分析未通过。`name` 让它在堆栈里一眼可辨。 */
76
72
  declare class StaticAnalysisError extends Error {
@@ -82,9 +78,7 @@ declare class StaticAnalysisError extends Error {
82
78
  //#endregion
83
79
  //#region src/codegen/inject.d.ts
84
80
  interface InjectOptions {
85
- /** 是否生成取值函数 */
86
- buildVars?: boolean;
87
- /** 无视图组件标记:注入 noView: true(不创建 Shadow DOM) */
81
+ /** 无视图组件标记:注入 noView: true(不创建 Shadow DOM)*/
88
82
  noView?: boolean;
89
83
  }
90
84
  /** `buildStaticLiteral` 可选生成物(任一缺失则对应字段不注入)。 */
@@ -99,6 +93,8 @@ interface StaticLiteralCodes {
99
93
  fx?: string;
100
94
  /** watch effect 工厂数组 */
101
95
  watchEffects?: string;
96
+ /** `entries` 是否已内联**同文件**基类的 @watch —— 决定 watchEffects 是否还拼父类数组 */
97
+ inlinedWatchAncestors?: boolean;
102
98
  /** cssVars effect 工厂(读 CSS 依赖信号 → 更新自定义属性) */
103
99
  cssEffect?: string;
104
100
  /** 结构指令元数据占位字段,运行时从不读取(分派参数在 pointEffects 内) */
@@ -107,12 +103,7 @@ interface StaticLiteralCodes {
107
103
  /** 子视图表(结构指令的子模板元数据):`subViews: { <subId>: { buildTemplate, fx } }` */
108
104
  subViews?: string;
109
105
  /**
110
- * 抽出的表达式中用到的 `super.METHOD` 名。注入到 class 体:
111
- * `__ce_s_METHOD(...a){return super.METHOD(...a)}`,
112
- * 保留 home-object 的 super 绑定,供静态取值函数经 `__comp` 调用。
113
- */
114
- superHelpers?: string[];
115
- /** `__ce_static__.props` 字面量值(@prop 前移,analyze/field-extract.ts) */
106
+ /** `__ce_static__.props` 字面量值(@prop 前移,analyze/field-extract.ts) */
116
107
  props?: string;
117
108
  /** `__ce_static__.states` 字面量值(@state 前移) */
118
109
  states?: string;
@@ -215,18 +206,14 @@ interface CompileResult {
215
206
  /** 本次编译的诊断信息(组件级) */
216
207
  diagnostics: Array<{
217
208
  className: string;
218
- degraded: boolean;
219
- reason: string | null;
220
209
  viewDeps: number;
221
- /** 硬性违规(D7 嵌套模板),需在构建期暴露给用户 */
222
- errors: Array<{
223
- start: number;
224
- end: number;
225
- exprStart: number;
226
- exprEnd: number;
227
- message: string;
228
- }>;
229
- /** 约定错误(emit/@prop/@computed/@csscope 静态校验),与降级无关 */
210
+ /**
211
+ * 约定错误(emit/@prop/@computed/@csscope 静态校验)。
212
+ *
213
+ * ⚠️ 这里**只有**约定错误。静态分析未通过的组件不会出现在 diagnostics 里 ——
214
+ * `assertStaticAnalysis` 直接抛 `StaticAnalysisError`,模板 codegen 失败同样抛。
215
+ * 不合规就报错,没有「凑合能跑」的产物,因此诊断里不需要任何结论字段。
216
+ */
230
217
  conventionErrors: Array<{
231
218
  start: number;
232
219
  end: number;
@@ -275,5 +262,5 @@ declare function defaultInclude(id: string, code: string): boolean;
275
262
  /** 编译单个文件。不会抛出:解析失败时原样返回。 */
276
263
  declare function compileFile(code: string, id: string, options?: CompilerOptions): CompileResult;
277
264
  //#endregion
278
- export { type CompileResult, type CompiledStatic, type CompilerOptions, type ComponentAnalysis, DEBUG_DIV, type DepSummary, type ReactiveField, type ReactiveKind, type RenderAnalysis, StaticAnalysisError, type VitePluginOptions, analyzeFile, analyzeRender, buildStaticLiteral, collectCompelemImports, compelemCompiler, compileFile, decideDegrade, defaultInclude, injectInto, isCompelemSource };
265
+ export { type CompileResult, type CompiledStatic, type CompilerOptions, type ComponentAnalysis, DEBUG_DIV, type DepSummary, type ReactiveField, type ReactiveKind, type RenderAnalysis, StaticAnalysisError, type VitePluginOptions, analyzeFile, analyzeRender, assertStaticAnalysis, buildStaticLiteral, collectCompelemImports, compelemCompiler, compileFile, defaultInclude, injectInto, isCompelemSource };
279
266
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- import { a as buildStaticLiteral, c as analyzeRender, d as analyzeFile, f as collectCompelemImports, i as defaultInclude, l as StaticAnalysisError, o as injectInto, p as isCompelemSource, r as compileFile, s as DEBUG_DIV, t as compelemCompiler, u as decideDegrade } from "./vite-DU4Nznh4.js";
1
+ import { a as buildStaticLiteral, c as analyzeRender, d as analyzeFile, f as collectCompelemImports, i as defaultInclude, l as StaticAnalysisError, o as injectInto, p as isCompelemSource, r as compileFile, s as DEBUG_DIV, t as compelemCompiler, u as assertStaticAnalysis } from "./vite-DwMiG3VM.js";
2
2
 
3
- export { DEBUG_DIV, StaticAnalysisError, analyzeFile, analyzeRender, buildStaticLiteral, collectCompelemImports, compelemCompiler, compileFile, decideDegrade, defaultInclude, injectInto, isCompelemSource };
3
+ export { DEBUG_DIV, StaticAnalysisError, analyzeFile, analyzeRender, assertStaticAnalysis, buildStaticLiteral, collectCompelemImports, compelemCompiler, compileFile, defaultInclude, injectInto, isCompelemSource };
@@ -1,70 +1,72 @@
1
1
  //#region src/types.d.ts
2
2
  /**
3
3
  * @compelem/compiler — 类型定义
4
- *
5
- * 与 compelem 侧 `CompiledStatic`(src/types.ts)保持结构一致。
6
- * 双份定义的取舍:compiler 不应强依赖 compelem 的类型包(peer 可选),
7
- * 因此本地镜像一份,并在 `test/` 里做一致性断言防止漂移。
8
4
  */
9
5
  /**
10
- * 每个类的 `props`/`states`/`computedGetters` 都是**沿构造器原型链浅替换合并后的
11
- * 完整表**(子类字面量叠加 `Reflect.getPrototypeOf(this).__ce_static__`)。
6
+ * debug 分块产物的整行注释前缀:`//////// …… <标签>`(纯注释、不改行为)。产物默认按块生成,无开关。
12
7
  */
13
- /** debug 分块产物的整行注释前缀:`//////// …… <标签>`(纯注释、不改行为)。产物默认按块生成,无开关。 */
14
8
  declare const DEBUG_DIV = "////////////////////////////////////";
9
+ /** 一次建树的返回结构:主 buildTemplate 与 subViews 元素同形。 */
10
+ interface BuiltTemplateResult {
11
+ fragment: any;
12
+ ups: any[];
13
+ emptyEvents?: Record<number, string[]>;
14
+ /** 文档序元素+文本节点(与 nodeSn 对齐;运行时免 collectNodes 回扫) */
15
+ nodes?: any[];
16
+ updateSns?: number[];
17
+ /** 从 fragment 根取节点的 childNodes 下标链(运行时 O(1) 定位,免 collectNodes) */
18
+ updatePaths?: number[][];
19
+ }
20
+ /** 一个结构指令回调的子视图产物(`subViews[subId]`)。 */
21
+ interface CompiledSubView {
22
+ buildTemplate?: (this: any) => BuiltTemplateResult;
23
+ pointEffects?: any[];
24
+ fx?: any[];
25
+ }
15
26
  /**
16
- * 编译器注入到组件类上的静态成员。
17
- * 强制编译插件模式:`buildTemplate` 准入静态视图路径(缺失 = 无视图,无运行时回退);
18
- * 其余字段可选。取值表达式一律内联进 fx/pointEffects 工厂,产物不携带取值函数或
19
- * 静态依赖元数据;依赖在 effect 运行期动态建立(DepSummary 仅在 compile.ts 内部
20
- * 计算,供 verbose 展示)。
27
+ * 编译器注入到组件类上的静态成员
21
28
  */
22
29
  interface CompiledStatic {
23
- version: number;
24
- /**
25
- * `buildTemplate` 静态实现:纯 `document` API 建 DOM 函数
26
- * (以首个组件实例为 `this` 调用;与 compelem 侧 `CompiledStatic.buildTemplate` 同形)。
27
- */
28
- buildTemplate?: (this: any) => {
29
- fragment: any;
30
- ups: any[];
31
- emptyEvents?: Record<number, string[]>;
32
- /** 文档序元素+文本节点(与 nodeSn 对齐;运行时免 collectNodes 回扫) */
33
- nodes?: any[];
34
- updateSns?: number[];
35
- updatePaths?: number[][];
36
- };
37
- /** `@watch` 编译期解析产物(`analyze/watch-extract.ts` 序列化,装饰器被删时必须注入) */
38
- watchers?: CompiledWatcher[];
30
+ /**
31
+ * 静态视图产物。与 `noView` 构成**互斥二选一**,两者皆无会被运行时判为
32
+ * 「未编译」并抛错(`CompElem.ts` setup 的第三分支)。
33
+ *
34
+ * ⚠️ 所以**缺席不代表无视图**:缺席是错误态,专留给「插件没跑 / 该有视图却没编出来」。
35
+ * 无视图组件必须由编译器显式写 `noView: true`。
36
+ */
37
+ buildTemplate?: (this: any) => BuiltTemplateResult;
39
38
  /**
40
39
  * 结构指令模板回调的子视图 codegen:`__subId` → 独立 buildTemplate + fx/pointEffects。
41
- * 运行时结构指令经 `fn.__subId` 查表消费;缺失按构建期报错处理。
42
- */
43
- subViews?: Record<number, {
44
- buildTemplate?: (this: any) => {
45
- fragment: any;
46
- ups: any[];
47
- emptyEvents?: Record<number, string[]>;
48
- nodes?: any[];
49
- updateSns?: number[];
50
- updatePaths?: number[][];
51
- };
52
- }>;
40
+ * 运行时结构指令经 provenance / `fn.__subId` 查表消费;缺失按构建期报错处理。
41
+ */
42
+ subViews?: Record<number, CompiledSubView>;
43
+ /** prop 定义表(沿构造器原型链浅替换合并后的**完整**表) */
44
+ props?: Record<string, any>;
45
+ /** state 定义表(同上,合并语义) */
46
+ states?: Record<string, any>;
47
+ /** `@computed` getter 函数外提(装饰器与成员被剥离);仅 devtools 元数据消费 */
48
+ computedGetters?: Record<string, () => any>;
49
+ /** `@watch` 产物:每个 watch 一个 effect 工厂,setup 期逐条 `effect(factory(this))` */
50
+ watchEffects?: Array<(comp: any) => () => void>;
51
+ /** `cssVars` 的响应式 effect 工厂:工厂体内直接读 `rc.__s.<k>.value` 建依赖 */
52
+ cssEffect?: (comp: any) => () => void;
53
+ /**
54
+ * 值点(属性/文本/指令)per-point effect 工厂表。
55
+ * 数值条目 = `fx` 下标(同一工厂源码在产物里只 emit 一份),其余为工厂本体。
56
+ */
57
+ pointEffects?: Array<number | ((rc: any, nodes: any[], ...params: any[]) => () => void)>;
58
+ /** 逐实例产物工厂表(指令实例 / 事件 handler / ref 等);下标 = `up.ux` */
59
+ fx?: any[];
53
60
  /**
54
61
  * 无视图组件标记:render() 不存在 / 返回 null / 继承链终点为 CompElem(其
55
62
  * `render()` 返回 null)。注入后运行时不创建 Shadow DOM,仅支持 HOST/GLOBAL 样式。
63
+ *
64
+ * ⚠️ 与 `buildTemplate` 互斥,且**必须有** —— 缺席不等于无视图(见上)。
65
+ * 唯一豁免:继承链经 spread 从父类继承而来(`skipInjection`),以及
66
+ * `CompElem` 自身声明的本字段(运行时基类兜底,非编译器产物)。
56
67
  */
57
68
  noView?: boolean;
58
69
  }
59
- /** `@watch` 编译期解析条目(与 compelem `CompiledWatcher` 同形) */
60
- interface CompiledWatcher {
61
- name: string;
62
- sources: string[];
63
- deep?: boolean;
64
- immediate?: boolean;
65
- once?: boolean;
66
- static?: boolean;
67
- }
68
70
  /** 响应式字段类别,用于判定「该成员是否会被推入依赖收集列表」。 */
69
71
  type ReactiveKind = 'prop' | 'state' | 'computed';
70
72
  /** 组件内一个响应式成员的信息。 */
@@ -103,7 +105,7 @@ interface ComponentAnalysis {
103
105
  tagName?: string;
104
106
  /** 响应式字段(含继承链上收集到的,按声明顺序) */
105
107
  fields: Map<string, ReactiveField>;
106
- /** 本类自身定义的实例方法名(用于 D2 降级判定) */
108
+ /** 本类自身定义的实例方法名(D2:自有方法值不可变,不推入依赖,无需拒绝) */
107
109
  ownMethods: Set<string>;
108
110
  /** 本类自身定义的 getter 名(`@computed` 之外的普通 getter,D2 视为方法) */
109
111
  ownGetters: Set<string>;
@@ -122,8 +124,8 @@ interface ComponentAnalysis {
122
124
  queryFields?: Set<string>;
123
125
  /** 本类方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */
124
126
  bodies?: Map<string, any>;
125
- /** 降级原因;null 表示未降级 */
126
- degradeReason: string | null;
127
+ /** 静态分析未通过的原因(D0/D4/D5/D6);null 表示通过。非 null 即闸门抛错 */
128
+ staticReason: string | null;
127
129
  /** 无视图组件(render() 不存在 / 返回 null / 继承链终点为 CompElem)→ 注入 noView: true */
128
130
  noView: boolean;
129
131
  /** 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)→ 不生成注入语句 */
@@ -147,6 +149,17 @@ interface ComponentAnalysis {
147
149
  * 用于 D3 判定:这些名字不是「自由标识符」。
148
150
  */
149
151
  moduleBindings: Set<string>;
152
+ /**
153
+ * 模块级 `const` 的初始化器:名字 → VariableDeclarator(见 collectModuleConstInits)。
154
+ * 供模板静态片段折叠判定 `${CONST}` 是不是模块级 `h` 标签模板常量。
155
+ * 只收同文件声明 —— compileFile 是单文件纯函数,跨文件 import 不解析。
156
+ */
157
+ moduleConstInits: Map<string, any>;
158
+ /**
159
+ * 外部指令名(options.knownDirectives,compile.ts 注入)。插值位置对这些
160
+ * 导入名的调用按指令点分类(isDirectiveCall),同 COMpelem_DIRECTIVES。
161
+ */
162
+ knownDirectives?: Set<string>;
150
163
  }
151
164
  /** 插件选项。 */
152
165
  interface CompilerOptions {
@@ -167,10 +180,14 @@ interface CompilerOptions {
167
180
  * (TEMPLATE-CODEGEN.md §4)。
168
181
  */
169
182
  knownTags?: Iterable<string>;
170
- /** 关闭指定生成步骤(用于 A/B 实测对照) */
171
- disable?: {
172
- buildVars?: boolean;
173
- };
183
+ /**
184
+ * 外部指令注册表:经 `directive()` 包装、遵守 DirectiveInstance 契约的
185
+ * 跨包导入函数名(如 compelem-router 的 `outlet`)。插值位置对这些名字的
186
+ * 调用按指令点编译(vite 插件选项原样透传,无需跨文件累积)。
187
+ * 不提供则模块绑定调用退回值点语义 —— 与 0.28 动态引擎「函数值即指令」
188
+ * 的隐式契约断裂,外部指令将渲染成函数源码文本。
189
+ */
190
+ knownDirectives?: Iterable<string>;
174
191
  }
175
192
  //#endregion
176
193
  //#region src/vite.d.ts
@@ -188,13 +205,6 @@ interface MinimalPlugin {
188
205
  interface VitePluginOptions extends CompilerOptions {
189
206
  /** 是否输出每个文件的编译诊断 */
190
207
  verbose?: boolean;
191
- /**
192
- * D7(模板内直接嵌套模板)命中的处理力度。
193
- * - `'warn'`(默认):仅控制台提示 D7 消息
194
- * - `'error'`:直接阻断构建,用于 CI 强制把关
195
- * - `'silent'`:不提示
196
- */
197
- d7?: 'warn' | 'error' | 'silent';
198
208
  /**
199
209
  * 约定错误(E-*:emit 未声明/非字面量、@prop 缺 type/命名/赋值、@computed 非 getter、
200
210
  * @csscope 非 static getter)的处理力度。默认 `'error'` —— 约定违规直接阻断构建。
@@ -217,4 +227,4 @@ interface VitePluginOptions extends CompilerOptions {
217
227
  declare function compelemCompiler(options?: VitePluginOptions): MinimalPlugin;
218
228
  //#endregion
219
229
  export { ComponentAnalysis as a, ReactiveKind as c, CompilerOptions as i, compelemCompiler as n, DEBUG_DIV as o, CompiledStatic as r, ReactiveField as s, VitePluginOptions as t };
220
- //# sourceMappingURL=vite-BtG-4Z6L.d.ts.map
230
+ //# sourceMappingURL=vite-BAl4p1jA.d.ts.map