Skip to content

v0.14.2

Choose a tag to compare

@SisyphusZheng SisyphusZheng released this 14 May 11:53
· 378 commits to main since this release
910392e

v0.14.2 — Standards & Safety Patch / 标准与安全补丁

1 commit (c6a0e80), 27 files changed, +1111 / −152 lines
Based on ADR 0024: Standards-first Web Components Renderer Roadmap

1 个提交,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.10.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 (a5ff77ea04a7e5)
For full details see CHANGELOG-v0.14.0.md in 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() 用 WHATWG URLPattern 替代手写路由解析。
  • 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.10.13.0
  • 清理死代码(constants.tsstrategy-recommender.ts
  • @lessjs/signals 命名统一(从 @lessjs/signal
  • validateSafeUrl 安全加固(vbscript: / file: 协议检测)
  • 移除 --allow-dirty,新增 publish:dry-run
  • 补充 app/LICENSE
  • 新增 SSG 测试(ssg-render.test.ts 7 用例 + ssg-cli.test.ts
  • CI lint 归零
  • 移除 package.json(纯 Deno workspace)