v0.14.2
v0.14.2 — Standards & Safety Patch / 标准与安全补丁
1 commit (
c6a0e80), 27 files changed, +1111 / −152 lines
Based on ADR 0024: Standards-first Web Components Renderer Roadmap1 个提交,27 个文件变更,+1111 / −152 行
基于 ADR 0024:Web 标准优先的 Web Components 渲染器路线图
DSD Standards Correctness / DSD 标准合规修正
| # | Change / 变更 | File / 文件 | Detail / 详情 |
|---|---|---|---|
| 1 | 新增 shadowrootclonable 属性 |
core/src/types.ts, core/src/render-dsd.ts |
DsdOptions.clonable?: boolean — 允许 cloneNode()/importNode() 包含 Shadow Root。渲染输出添加 shadowrootclonable 布尔内容属性。 |
| 2 | shadowrootcustomelementregistry 修正为布尔属性 |
core/src/types.ts, core/src/render-dsd.ts |
HTML Living Standard 规定此为布尔内容属性(无值)。类型从 string 改为 boolean | string;渲染时无论传 true 还是字符串均输出无值布尔属性(兼容 v0.x 字符串传参,但不再序列化值)。 |
| 3 | 移除 escapeAttr 未用导入 |
core/src/render-dsd.ts |
customElementRegistry 不再需要转义属性值,删除了 escapeAttr 的导入。 |
涉及的 WHATWG 属性对照表 / WHATWG Attribute Reference:
| Template Attribute | v0.14.1 | v0.14.2 |
|---|---|---|
shadowrootmode="open" |
✅ | ✅ |
shadowrootdelegatesfocus |
✅ | ✅ |
shadowrootclonable |
❌ 缺失 | ✅ 新增 |
shadowrootserializable |
✅ | ✅ |
shadowrootslotassignment="manual" |
✅ | ✅ |
shadowrootcustomelementregistry |
❌ 输出 ="值" |
✅ 布尔属性(无值) |
Head Injection Safety / Head 注入安全加固
| # | Change / 变更 | File / 文件 | Detail / 详情 |
|---|---|---|---|
| 1 | headExtras 拒绝 <script> 标签 |
adapter-vite/src/index.ts |
新增 assertNoScriptTags() 校验函数。headExtras 中出现 <script> 标签直接抛 LessError(UNSAFE_HEAD_INJECTION, 400)。脚本必须通过结构化 inject.scripts 注入,由框架校验和转义 URL。 |
| 2 | inject.headFragments 拒绝 <script> 标签 |
adapter-vite/src/index.ts |
从 v0.14.1 的 log.warn 升级为 assertNoScriptTags() → 抛异常。不允许任何 head fragment 包含 <script>。 |
| 3 | 结构化 inject.scripts 仍可正常使用 |
adapter-vite/src/index.ts |
通过 inject.scripts: [{ src: '/x.js', defer: true }] 方式注入脚本不受影响,框架会验证和标记脚本 URL 为可信。 |
Dynamic SSG Route Safety / 动态 SSG 路由安全
| # | Change / 变更 | File / 文件 | Detail / 详情 |
|---|---|---|---|
| 1 | resolveDynamicRoutePath() 新函数 |
adapter-vite/src/cli/ssg-render.ts |
动态路由参数解析为单一 URL 路径段 + encodeURIComponent() 编码。拒绝路径穿越值(..、/、\、控制字符)。缺失参数直接抛错。 |
| 2 | 不安全路由跳过 | adapter-vite/src/cli/ssg-render.ts |
渲染循环中 catch 错误,log.warn + continue 跳过不安全的动态路由,不再静默生成错误路径。 |
| 3 | i18n 动态路由同样加固 | adapter-vite/src/cli/ssg-render.ts |
i18n locale 展开的动态路由也使用 resolveDynamicRoutePath()。 |
被拒绝的危险参数值示例 / Rejected unsafe param values:
| Value | Reason / 原因 |
|---|---|
.. |
Path traversal / 路径穿越 |
../evil |
Contains .. / 包含路径穿越 |
a/b |
Contains / / 包含斜杠 |
| 含控制字符 | hasControlCharacter() 检测 ≤ 0x1F 和 0x7F |
Test Coverage Expansion / 测试覆盖扩展
| Test File / 测试文件 | New Tests / 新增测试 |
|---|---|
core/__tests__/render-dsd.test.ts |
shadowrootclonable 属性测试;customElementRegistry 布尔属性测试(true 和旧字符串兼容);省略属性回归测试。 |
adapter-vite/__tests__/index-plugin.test.ts |
headExtras 拒绝 <script> 测试;inject.headFragments 拒绝 <script> 测试;结构化 inject.scripts 允许通过测试。 |
adapter-vite/__tests__/ssg-render.test.ts |
resolveDynamicRoutePath 安全编码测试;路径穿越拒绝测试;缺失参数拒绝测试。 |
adapter-vite/__tests__/ssg-smoke.test.ts |
导入真实 SSR bundle 并调用 renderRoute('/roadmap');验证 roadmap、i18n、content、ADR、UI island、PWA、DSD 输出;验证 ADR 0024 内容管线渲染。 |
Roadmap & ADR 0024 / 路线图与 ADR 0024
v0.14.2 同步更新了官网 Roadmap 页面和新增 ADR 0024 博文,明确了 Web Standards-first DSD/Web Components 应用框架 的战略定位。
ADR 0024 版本路线 / ADR 0024 Version Roadmap:
| Version | Focus / 重点 |
|---|---|
| v0.14.2 | Standards & Safety Patch(本次发布) |
| v0.15 | Renderer Kernel — 定义公共 WC 渲染协议 |
| v0.16 | WC Package Protocol — 扩展 PackageIslandMeta 为组件包清单 |
| v0.17 | Ecosystem Entry — npm 可达性、文档搜索、benchmark、交互脚手架 |
| v0.18–v1.0 | API Freeze — 公共 API 快照测试与迁移策略 |
ADR 0024 明确拒绝 / ADR 0024 Explicit Rejections:
- ❌ 不引入 webpack — ESM-first 方向不变
- ❌ 不采用 OpenWC 工具链 — Deno-first 测试栈 + Playwright 已够用
- ❌ 不在渲染协议稳定前承诺通用全栈 — DSD/WC 渲染内核优先
- ❌ 不在清单/协议就绪前做集中式 WC 注册中心 — 本地清单先行
Package Version Bump / 包版本升级
All 10 packages: 0.14.1 → 0.14.2
| Package | Version |
|---|---|
@lessjs/rpc |
0.14.2 |
@lessjs/signals |
0.14.2 |
@lessjs/core |
0.14.2 |
@lessjs/adapter-vite |
0.14.2 |
@lessjs/content |
0.14.2 |
@lessjs/i18n |
0.14.2 |
@lessjs/adapter-lit |
0.14.2 |
@lessjs/ui |
0.14.2 |
@lessjs/app |
0.14.2 |
@lessjs/create |
0.14.2 |
Appendix: v0.14.0 Summary / 附录:v0.14.0 摘要
33 commits since v0.13 (
a5ff77e→a04a7e5)
For full details seeCHANGELOG-v0.14.0.mdin the repository root.
Architecture Highlights / 架构亮点
- ESM-native SSG pipeline: Phase 3 纯 ESM 运行,不依赖 Vite。SSR bundle 自带
importmap.json。 - Phase reordering:
Phase 1→3→2→Inject,SSG 不再等待 client bundle。 - Shared
ssg-render.ts: 零 Vite 依赖的共享 SSG 渲染模块。 - Standalone SSG CLI:
cli/ssg.ts可脱离 Vite 单独运行。 - URLPattern:
extractParams()用 WHATWGURLPattern替代手写路由解析。 - Optional Phase 2: 零 island 项目跳过 client 打包。
Website v5 / 官网 v5
- 交互终端 island、代码对比、性能基准、架构图、Bundle 对比、快速开始 CTA
- 品牌色
#4752c4全站统一 - 移动端适配 760px / 480px
- Cloudflare Pages
/api/term - 25 篇 ADR 迁入 blog 管线
Code Quality / 代码质量
- 全部 10 包统一版本
0.14.0(之前碎片化在0.1.1–0.13.0) - 清理死代码(
constants.ts、strategy-recommender.ts) @lessjs/signals命名统一(从@lessjs/signal)validateSafeUrl安全加固(vbscript:/file:协议检测)- 移除
--allow-dirty,新增publish:dry-run - 补充
app/LICENSE - 新增 SSG 测试(
ssg-render.test.ts7 用例 +ssg-cli.test.ts) - CI lint 归零
- 移除
package.json(纯 Deno workspace)