跳转至

Mini Marketplace

从 2643 行的 src/utils/plugins/marketplaceManager.ts 提炼到 ~250 行 的 semver + 完整性 + peer 依赖。 6 测试场景:列插件 / 装 / 指定版本 / peer / 不兼容 core / hash 校验。

文件

mini-marketplace/
├── src/
│   ├── marketplace.ts  semver + SHA256 + peer deps + mock registry(~220 行)
│   └── cli.ts          6 测试场景
└── README.md

npm install && npm start

真实代码对照

Demo 真实文件 简化
parseSemVer / satisfiesRange marketplaceManager.ts:100 自实现简化版
fetchRegistry marketplaceManager.ts:300 (~400 行) mock 内存数组
install marketplaceManager.ts:800 (~800 行) 简化无 IO
verifyIntegrity marketplaceManager.ts:1500 (~200 行) SHA256
peerDeps marketplaceManager.ts:2000 (~300 行) 简化

核心 4 件套

1️⃣ Semver 解析 + 比较

parseSemVer("1.2.3")  { major: 1, minor: 2, patch: 3, raw: "1.2.3" }
compareSemVer(a, b)  -1 / 0 / 1
支持>=<=><=不支持~(patch range)、^(compatible)、||(or)、x.y.*(缺省)。

2️⃣ Range 匹配

satisfiesRange("1.5.0", ">=1.0.0 <2.0.0")  true
satisfiesRange("2.0.0", ">=1.0.0 <2.0.0")  false
真值:用户能装的核心是 coreRange 内的。2.0 plugin 不能装在 1.x core

3️⃣ Install = 4 步闸门

1. 找匹配版本(指定 or 取 core 兼容的最高)
2. 验 core version 兼容
3. 验 peer 依赖
4. 验 SHA256 完整性
5. 写入
4 闸门 都通过才能装,任何一闸失败就 throw(详细错误信息)。

4️⃣ SHA256 = 防篡改

const computedHash = sha256(candidate.content);
if (computedHash !== candidate.sha256) {
  throw new Error(`Integrity check failed for ${name}@${candidate.version}`);
}
真实场景:registry 内容可能被中间人篡改。SHA256 不匹配 = 拒绝装。Test 6 演示

6 场景输出

📌 Test 1: list available plugins
  - greet-plugin@2.0.0
  - translate-plugin@0.5.0
  - ai-helper@0.1.0
📌 Test 2: install greet-plugin (latest)
  ✅ installed greet-plugin@1.2.0  (选 core 兼容的最高,不是 2.0.0)
📌 Test 3: install greet-plugin@2.0.0 (specific)
  ✅ installed greet-plugin@2.0.0
📌 Test 4: peer dependency
  ✅ blocked: peer greet-plugin missing
  → install greet-plugin first
  ✅ installed translate-plugin@0.5.0
📌 Test 5: core version incompatibility
  ✅ blocked: No compatible version of ai-helper for core 1.0.0
📌 Test 6: integrity check (tampered)
  ✅ blocked: Integrity check failed for greet-plugin@1.2.0

进阶练习

  1. 加 semver 完整支持~1.2.3 / ^1.0.0 / 1.x / ||
  2. 加真实 fetch:从 https://registry.npmjs.org 下载
  3. 加签名验证:用 ed25519 公钥验 plugin 签名
  4. 加 lockfile:装过的不变 hash 才能重装
  5. 加 lazy install:装但不下载,等用时再下
  6. 加 dep graph:A → B → C 自动按序装

相关阅读