mirror of
https://github.com/modelstudioai/cli.git
synced 2026-09-14 19:49:23 +08:00
d24104f7dc
包名 @ali/bailian-kb-dsh → bailian-kb-dsh(公开 npm):package.json name + cordis.patch.yml insert.name + tsdown PLUGIN_ID 三处同步(漏一处即 dsh 运行时崩)。 产物 lib/ → dist/(本仓 .gitignore 忽略 dist 不忽略 lib),连带 main/types/ exports/files/tsdown outDir 同步;.gitignore 补 *.tsbuildinfo。 依赖接 catalog(yaml/typescript/@types/node/vite-plus);测试导入 vitest → vite-plus/test(全仓统一约定,消掉唯一的 vitest 依赖漂移)。 tsconfig 拆三件套:tsconfig.json 纯类型检查覆盖 src+tests(供 oxlint 自动发现, 含 jsx/DOM),tsconfig.build.json 产出 node 半,tsconfig.web.json 隔离检查 web 半。 补齐 tests 从未被类型检查暴露的一处 partial 输入类型错误。 根 vite.config.ts 新增两条 override:web 半 no-restricted-imports 把 tsdown 构建期 的 bundle purity gate 提前到 lint 期;全包放开 _ 前缀的 no-unused-vars。 文档:新增 docs/agents/dsh-plugin.md,AGENTS.md 项目地图/版本锁步例外/分层边界/ 场景索引同步,packages.mjs 注释说明故意不进发布白名单。 格式化(单引号无分号 → 双引号加分号)由 pre-commit 的 vp check --fix 自动完成, 无法单独成 commit,一并纳入。 全仓 vp check 0 error;插件 13 文件 85 测试全绿;build + typecheck 通过。
71 lines
2.4 KiB
TypeScript
71 lines
2.4 KiB
TypeScript
import { describe, expect, it } from "vite-plus/test";
|
|
import {
|
|
consoleLoginState,
|
|
parseCallbackBody,
|
|
pickCallbackCredentials,
|
|
} from "../src/console-login.js";
|
|
|
|
describe("parseCallbackBody", () => {
|
|
it("reads a plain JSON callback", () => {
|
|
expect(parseCallbackBody('{"api_key":"sk-abc","workspace_id":"ws-1"}')).toMatchObject({
|
|
api_key: "sk-abc",
|
|
workspace_id: "ws-1",
|
|
});
|
|
});
|
|
|
|
it("flattens a `data` envelope, the top level winning", () => {
|
|
const parsed = parseCallbackBody(
|
|
'{"data":{"api_key":"sk-inner","workspace_id":"ws-1"},"api_key":"sk-outer"}',
|
|
);
|
|
expect(parsed).toMatchObject({ api_key: "sk-outer", workspace_id: "ws-1" });
|
|
});
|
|
|
|
it("reads a form-encoded callback", () => {
|
|
expect(parseCallbackBody("api_key=sk-abc&workspace_id=ws-1")).toMatchObject({
|
|
api_key: "sk-abc",
|
|
workspace_id: "ws-1",
|
|
});
|
|
});
|
|
|
|
it("tolerates a BOM, surrounding space, and an empty or broken body", () => {
|
|
expect(parseCallbackBody('\uFEFF {"api_key":"sk-abc"} ')).toMatchObject({
|
|
api_key: "sk-abc",
|
|
});
|
|
expect(parseCallbackBody("")).toEqual({});
|
|
expect(parseCallbackBody(" ")).toEqual({});
|
|
// A non-object JSON value carries no fields, and neither does an array.
|
|
expect(parseCallbackBody('["sk-abc"]')).toEqual({});
|
|
});
|
|
});
|
|
|
|
describe("pickCallbackCredentials", () => {
|
|
it("accepts both snake_case and camelCase field names", () => {
|
|
expect(pickCallbackCredentials({}, { apiKey: "sk-abc", workspaceId: "ws-1" })).toEqual({
|
|
apiKey: "sk-abc",
|
|
workspaceId: "ws-1",
|
|
});
|
|
expect(pickCallbackCredentials({}, { api_key: "sk-abc", workspace_id: "ws-1" })).toEqual({
|
|
apiKey: "sk-abc",
|
|
workspaceId: "ws-1",
|
|
});
|
|
});
|
|
|
|
it("lets query parameters win over the body", () => {
|
|
expect(pickCallbackCredentials({ api_key: "sk-query" }, { api_key: "sk-body" })).toEqual({
|
|
apiKey: "sk-query",
|
|
});
|
|
});
|
|
|
|
it("omits absent, blank, and non-string fields instead of returning empties", () => {
|
|
expect(pickCallbackCredentials({}, {})).toEqual({});
|
|
expect(pickCallbackCredentials({}, { api_key: " ", workspace_id: 42 })).toEqual({});
|
|
expect(pickCallbackCredentials({}, { api_key: " sk-abc " })).toEqual({ apiKey: "sk-abc" });
|
|
});
|
|
});
|
|
|
|
describe("consoleLoginState", () => {
|
|
it("starts idle, carrying no secret", () => {
|
|
expect(consoleLoginState()).toEqual({ phase: "idle" });
|
|
});
|
|
});
|