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

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.
@@ -1,80 +1,78 @@
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
  /** 组件内一个响应式成员的信息。 */
71
73
  interface ReactiveField {
72
74
  name: string;
73
75
  kind: ReactiveKind;
74
- /** 静态初始化器里的默认值表达式源码(用于静态取值内联),无则 undefined */
75
- init?: string;
76
- /** 是否为深层对象(init 是对象/数组字面量),影响依赖路径展开 */
77
- shallow: boolean;
78
76
  }
79
77
  /** 一个组件的完整静态分析结果。 */
80
78
  interface ComponentAnalysis {
@@ -101,9 +99,9 @@ interface ComponentAnalysis {
101
99
  bodyStart: number;
102
100
  /** `@tag` 名称,无则 undefined */
103
101
  tagName?: string;
104
- /** 响应式字段(含继承链上收集到的,按声明顺序) */
102
+ /** 本类自身声明的响应式字段(按声明顺序;继承链由依赖提取另行上溯) */
105
103
  fields: Map<string, ReactiveField>;
106
- /** 本类自身定义的实例方法名(用于 D2 降级判定) */
104
+ /** 本类自身定义的实例方法名(D2:自有方法值不可变,不推入依赖,无需拒绝) */
107
105
  ownMethods: Set<string>;
108
106
  /** 本类自身定义的 getter 名(`@computed` 之外的普通 getter,D2 视为方法) */
109
107
  ownGetters: Set<string>;
@@ -122,8 +120,8 @@ interface ComponentAnalysis {
122
120
  queryFields?: Set<string>;
123
121
  /** 本类方法 / getter / 箭头字段的函数体(name → BlockStatement 节点或表达式体),供依赖提取内联扫描 */
124
122
  bodies?: Map<string, any>;
125
- /** 降级原因;null 表示未降级 */
126
- degradeReason: string | null;
123
+ /** 静态分析未通过的原因(D0/D4/D5/D6);null 表示通过。非 null 即闸门抛错 */
124
+ staticReason: string | null;
127
125
  /** 无视图组件(render() 不存在 / 返回 null / 继承链终点为 CompElem)→ 注入 noView: true */
128
126
  noView: boolean;
129
127
  /** 跳过注入(同文件继承链上有 render 的祖先,继承其 __ce_static__)→ 不生成注入语句 */
@@ -147,11 +145,23 @@ interface ComponentAnalysis {
147
145
  * 用于 D3 判定:这些名字不是「自由标识符」。
148
146
  */
149
147
  moduleBindings: Set<string>;
148
+ /**
149
+ * 模块级 `const` 的初始化器:名字 → VariableDeclarator(见 collectModuleConstInits)。
150
+ * 供模板静态片段折叠判定 `${CONST}` 是不是模块级 `h` 标签模板常量。
151
+ * 只收同文件声明 —— compileFile 是单文件纯函数,跨文件 import 不解析。
152
+ */
153
+ moduleConstInits: Map<string, any>;
154
+ /**
155
+ * 外部指令名(options.knownDirectives,compile.ts 注入)。插值位置对这些
156
+ * 导入名的调用按指令点分类(isDirectiveCall),同 COMpelem_DIRECTIVES。
157
+ */
158
+ knownDirectives?: Set<string>;
150
159
  }
151
160
  /** 插件选项。 */
152
161
  interface CompilerOptions {
153
162
  /**
154
- * 参与编译的文件过滤。默认只处理 `.ts` 且源码里出现 `extends CompElem` 的文件。
163
+ * 参与编译的文件过滤。默认处理 `.ts`,且源码里出现 `extends CompElem`、`@tag(`
164
+ * 或家族装饰器(@prop/@state/@computed/@query)之一。
155
165
  * ⚠️ 不要放宽到 `.js`:IIFE 打包产物里指令名不在 scope,会触发 D3 误报。
156
166
  */
157
167
  include?: (id: string, code: string) => boolean;
@@ -167,10 +177,14 @@ interface CompilerOptions {
167
177
  * (TEMPLATE-CODEGEN.md §4)。
168
178
  */
169
179
  knownTags?: Iterable<string>;
170
- /** 关闭指定生成步骤(用于 A/B 实测对照) */
171
- disable?: {
172
- buildVars?: boolean;
173
- };
180
+ /**
181
+ * 外部指令注册表:经 `directive()` 包装、遵守 DirectiveInstance 契约的
182
+ * 跨包导入函数名(如 compelem-router 的 `outlet`)。插值位置对这些名字的
183
+ * 调用按指令点编译(vite 插件选项原样透传,无需跨文件累积)。
184
+ * 不提供则模块绑定调用退回值点语义 —— 与 0.28 动态引擎「函数值即指令」
185
+ * 的隐式契约断裂,外部指令将渲染成函数源码文本。
186
+ */
187
+ knownDirectives?: Iterable<string>;
174
188
  }
175
189
  //#endregion
176
190
  //#region src/vite.d.ts
@@ -188,13 +202,6 @@ interface MinimalPlugin {
188
202
  interface VitePluginOptions extends CompilerOptions {
189
203
  /** 是否输出每个文件的编译诊断 */
190
204
  verbose?: boolean;
191
- /**
192
- * D7(模板内直接嵌套模板)命中的处理力度。
193
- * - `'warn'`(默认):仅控制台提示 D7 消息
194
- * - `'error'`:直接阻断构建,用于 CI 强制把关
195
- * - `'silent'`:不提示
196
- */
197
- d7?: 'warn' | 'error' | 'silent';
198
205
  /**
199
206
  * 约定错误(E-*:emit 未声明/非字面量、@prop 缺 type/命名/赋值、@computed 非 getter、
200
207
  * @csscope 非 static getter)的处理力度。默认 `'error'` —— 约定违规直接阻断构建。
@@ -206,15 +213,10 @@ interface VitePluginOptions extends CompilerOptions {
206
213
  * 仅对真实文件生效(跳过 `?v=` 之类的虚拟 id),且只在编译确有改动时写。
207
214
  */
208
215
  emitJs?: boolean;
209
- /**
210
- * 调试编译产物用:令 sourcemap 以上游注入后的 TS 为 0 级原�? * 这样 DevTools 直接显示编译后代码(含 `__ce_static__` / buildTemplate / fx),
211
- * 在这些区域打的断点能命中。代价:跳过「编译后代码 → 原始模板」的映射,
212
- * 栈帧行号指向注入后的 TS 而非用户源码里的模板位置。默认 `false`。
213
- */
214
216
  debugSourceMap?: boolean;
215
217
  }
216
218
  /** compelem 编译期优化插件。 */
217
219
  declare function compelemCompiler(options?: VitePluginOptions): MinimalPlugin;
218
220
  //#endregion
219
221
  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
222
+ //# sourceMappingURL=vite-D178A0gy.d.ts.map
package/dist/vite.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- import { n as compelemCompiler, t as VitePluginOptions } from "./vite-BtG-4Z6L.js";
1
+ import { n as compelemCompiler, t as VitePluginOptions } from "./vite-D178A0gy.js";
2
2
  export { VitePluginOptions, compelemCompiler, compelemCompiler as default };
package/dist/vite.js CHANGED
@@ -1,3 +1,3 @@
1
- import { n as vite_default, t as compelemCompiler } from "./vite-DU4Nznh4.js";
1
+ import { n as vite_default, t as compelemCompiler } from "./vite-CY_6E-Ut.js";
2
2
 
3
3
  export { compelemCompiler, vite_default as default };
package/package.json CHANGED
@@ -1,65 +1,61 @@
1
- {
2
- "name": "@compelem/compiler",
3
- "version": "0.30.0-beta.1",
4
- "description": "A compiler for compelem",
5
- "type": "module",
6
- "license": "MIT",
7
- "author": "holyhigh2",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/holyhigh2/compelem-compiler.git"
11
- },
12
- "keywords": [
13
- "compelem",
14
- "compiler",
15
- "webcomponents",
16
- "vite-plugin",
17
- "rolldown",
18
- "reactive"
19
- ],
20
- "exports": {
21
- ".": {
22
- "types": "./dist/index.d.ts",
23
- "import": "./dist/index.js"
24
- },
25
- "./vite": {
26
- "types": "./dist/vite.d.ts",
27
- "import": "./dist/vite.js"
28
- }
29
- },
30
- "main": "./dist/index.js",
31
- "types": "./dist/index.d.ts",
32
- "files": [
33
- "dist",
34
- "README.md",
35
- "LICENSE"
36
- ],
37
- "scripts": {
38
- "build": "tsdown",
39
- "dev": "tsdown --watch",
40
- "typecheck": "tsc --noEmit"
41
- },
42
- "peerDependencies": {
43
- "compelem": ">=0.30.0"
44
- },
45
- "peerDependenciesMeta": {
46
- "compelem": {
47
- "optional": true
48
- }
49
- },
50
- "dependencies": {
51
- "magic-string": "^0.30.11"
52
- },
53
- "devDependencies": {
54
- "@types/node": "^22.10.0",
55
- "happy-dom": "^20.14.5",
56
- "myfx": "^2.0.0-beta.2",
57
- "rolldown": "^1.2.9",
58
- "tsdown": "^0.15.0",
59
- "typescript": "^5.7.3",
60
- "vite": "^8.3.0"
61
- },
62
- "engines": {
63
- "node": ">=18"
64
- }
1
+ {
2
+ "name": "@compelem/compiler",
3
+ "version": "0.30.0-beta.4",
4
+ "description": "A compiler for compelem",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "author": "holyhigh2",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/holyhigh2/compelem-compiler.git"
11
+ },
12
+ "keywords": [
13
+ "compelem",
14
+ "compiler",
15
+ "webcomponents",
16
+ "vite-plugin",
17
+ "rolldown",
18
+ "reactive"
19
+ ],
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js"
24
+ },
25
+ "./vite": {
26
+ "types": "./dist/vite.d.ts",
27
+ "import": "./dist/vite.js"
28
+ }
29
+ },
30
+ "main": "./dist/index.js",
31
+ "types": "./dist/index.d.ts",
32
+ "files": [
33
+ "dist",
34
+ "README.md",
35
+ "LICENSE"
36
+ ],
37
+ "scripts": {
38
+ "build": "tsdown",
39
+ "dev": "tsdown --watch",
40
+ "typecheck": "tsc --noEmit"
41
+ },
42
+ "dependencies": {
43
+ "@babel/parser": "^7.28.4",
44
+ "magic-string": "^0.30.11"
45
+ },
46
+ "peerDependencies": {
47
+ "myfx": "^2.0.0-beta.4"
48
+ },
49
+ "devDependencies": {
50
+ "@types/node": "^22.10.0",
51
+ "happy-dom": "^20.14.5",
52
+ "myfx": "^2.0.0-beta.4",
53
+ "rolldown": "^1.2.9",
54
+ "tsdown": "^0.15.0",
55
+ "typescript": "^5.7.3",
56
+ "vite": "^8.3.0"
57
+ },
58
+ "engines": {
59
+ "node": ">=18"
60
+ }
65
61
  }