@spaceflow/core 0.19.0 → 0.21.0
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.
- package/dist/index.js +36 -9
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/__mocks__/c12.ts +3 -1
- package/src/cli-runtime/i18n/i18n.spec.ts +2 -1
- package/src/commands/build/build.service.ts +1 -1
- package/src/commands/list/list.service.ts +1 -1
- package/src/commands/update/update.service.ts +2 -2
- package/src/config/spaceflow.config.ts +3 -3
- package/src/shared/git-provider/adapters/gitea.adapter.ts +30 -1
- package/src/shared/git-provider/detect-provider.ts +4 -4
- package/src/shared/git-provider/types.ts +2 -2
- package/src/shared/logger/logger.spec.ts +3 -3
package/package.json
CHANGED
package/src/__mocks__/c12.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { t, addLocaleResources, resetI18n } from "./i18n";
|
|
2
|
+
import { initCliI18n as initI18n } from "./init";
|
|
2
3
|
import zhCN from "../../locales/zh-cn/translation.json";
|
|
3
4
|
import en from "../../locales/en/translation.json";
|
|
4
5
|
|
|
@@ -117,7 +117,7 @@ export class BuildService {
|
|
|
117
117
|
private discoverExtensionDirs(): string[] {
|
|
118
118
|
const dependencies = getDependencies(this.projectRoot);
|
|
119
119
|
const parentDirs = new Set<string>();
|
|
120
|
-
for (const source of Object.values(dependencies)) {
|
|
120
|
+
for (const source of Object.values(dependencies) as string[]) {
|
|
121
121
|
if (!source.startsWith("link:")) continue;
|
|
122
122
|
const linkPath = source.slice(5);
|
|
123
123
|
const absolutePath = resolve(this.projectRoot, linkPath);
|
|
@@ -46,7 +46,7 @@ export class ListService {
|
|
|
46
46
|
const editors = getSupportedEditors(cwd);
|
|
47
47
|
// 收集所有外部扩展信息
|
|
48
48
|
const extensionInfos: ExtensionListInfo[] = [];
|
|
49
|
-
for (const [name, source] of Object.entries(dependencies)) {
|
|
49
|
+
for (const [name, source] of Object.entries(dependencies) as [string, string][]) {
|
|
50
50
|
const type = getSourceType(source);
|
|
51
51
|
const installed = await this.checkInstalled(name, source, type, editors);
|
|
52
52
|
extensionInfos.push({ name, source, type, installed, commands: [] });
|
|
@@ -312,7 +312,7 @@ export class UpdateService {
|
|
|
312
312
|
return false;
|
|
313
313
|
}
|
|
314
314
|
|
|
315
|
-
const { source } = this.parseExtensionConfig(dependencies[name]);
|
|
315
|
+
const { source } = this.parseExtensionConfig(dependencies[name] as ExtensionConfig);
|
|
316
316
|
const sourceType = this.getSourceType(source);
|
|
317
317
|
|
|
318
318
|
if (shouldLog(verbose, 1)) console.log(t("update:updating", { name }));
|
|
@@ -344,7 +344,7 @@ export class UpdateService {
|
|
|
344
344
|
let successCount = 0;
|
|
345
345
|
let failCount = 0;
|
|
346
346
|
|
|
347
|
-
for (const [name, config] of Object.entries(dependencies)) {
|
|
347
|
+
for (const [name, config] of Object.entries(dependencies) as [string, ExtensionConfig][]) {
|
|
348
348
|
const { source } = this.parseExtensionConfig(config);
|
|
349
349
|
const sourceType = this.getSourceType(source);
|
|
350
350
|
|
|
@@ -41,15 +41,15 @@ const GitProviderConfigSchema = z.object({
|
|
|
41
41
|
const CiConfigSchema = z.object({
|
|
42
42
|
repository: z
|
|
43
43
|
.string()
|
|
44
|
-
.default(process.env.GITHUB_REPOSITORY || "")
|
|
44
|
+
.default(process.env.GITHUB_REPOSITORY || process.env.GITEA_REPOSITORY || "")
|
|
45
45
|
.describe("仓库名称 (owner/repo 格式)"),
|
|
46
46
|
refName: z
|
|
47
47
|
.string()
|
|
48
|
-
.default(process.env.GITHUB_REF_NAME || "")
|
|
48
|
+
.default(process.env.GITHUB_REF_NAME || process.env.GITEA_REF_NAME || "")
|
|
49
49
|
.describe("当前分支名称"),
|
|
50
50
|
actor: z
|
|
51
51
|
.string()
|
|
52
|
-
.default(process.env.GITHUB_ACTOR || "")
|
|
52
|
+
.default(process.env.GITHUB_ACTOR || process.env.GITEA_ACTOR || "")
|
|
53
53
|
.describe("当前操作者"),
|
|
54
54
|
});
|
|
55
55
|
|
|
@@ -385,7 +385,36 @@ export class GiteaAdapter implements GitProvider {
|
|
|
385
385
|
// ============ Issue 操作 ============
|
|
386
386
|
|
|
387
387
|
async createIssue(owner: string, repo: string, options: CreateIssueOption): Promise<Issue> {
|
|
388
|
-
|
|
388
|
+
const body: Record<string, unknown> = {
|
|
389
|
+
title: options.title,
|
|
390
|
+
body: options.body,
|
|
391
|
+
assignees: options.assignees,
|
|
392
|
+
milestone: options.milestone,
|
|
393
|
+
due_date: options.due_date,
|
|
394
|
+
};
|
|
395
|
+
if (options.labels?.length) {
|
|
396
|
+
body.labels = await this.resolveLabelIds(owner, repo, options.labels);
|
|
397
|
+
}
|
|
398
|
+
return this.request<Issue>("POST", `/repos/${owner}/${repo}/issues`, body);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/**
|
|
402
|
+
* 将标签名称列表转换为 Gitea label ID 列表
|
|
403
|
+
*/
|
|
404
|
+
protected async resolveLabelIds(owner: string, repo: string, names: string[]): Promise<number[]> {
|
|
405
|
+
const allLabels = await this.request<Array<{ id: number; name: string }>>(
|
|
406
|
+
"GET",
|
|
407
|
+
`/repos/${owner}/${repo}/labels`,
|
|
408
|
+
);
|
|
409
|
+
const nameToId = new Map(allLabels.map((l) => [l.name.toLowerCase(), l.id]));
|
|
410
|
+
const ids: number[] = [];
|
|
411
|
+
for (const name of names) {
|
|
412
|
+
const id = nameToId.get(name.toLowerCase());
|
|
413
|
+
if (id !== undefined) {
|
|
414
|
+
ids.push(id);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return ids;
|
|
389
418
|
}
|
|
390
419
|
|
|
391
420
|
async listIssueComments(owner: string, repo: string, index: number): Promise<IssueComment[]> {
|
|
@@ -65,7 +65,7 @@ function buildResult(
|
|
|
65
65
|
* 解析服务器 URL
|
|
66
66
|
* - 优先使用 GIT_PROVIDER_URL
|
|
67
67
|
* - Gitea: GITEA_SERVER_URL > GITHUB_SERVER_URL
|
|
68
|
-
* - GitHub: GITHUB_API_URL > 默认 https://api.github.com
|
|
68
|
+
* - GitHub: GITHUB_API_URL > GITEA_API_URL > 默认 https://api.github.com
|
|
69
69
|
* - GitLab: CI_SERVER_URL > GITLAB_URL
|
|
70
70
|
*/
|
|
71
71
|
function resolveServerUrl(
|
|
@@ -76,7 +76,7 @@ function resolveServerUrl(
|
|
|
76
76
|
return env.GIT_PROVIDER_URL;
|
|
77
77
|
}
|
|
78
78
|
if (provider === "github") {
|
|
79
|
-
return env.GITHUB_API_URL || "https://api.github.com";
|
|
79
|
+
return env.GITHUB_API_URL || env.GITEA_API_URL || "https://api.github.com";
|
|
80
80
|
}
|
|
81
81
|
if (provider === "gitlab") {
|
|
82
82
|
return env.CI_SERVER_URL || env.GITLAB_URL || "https://gitlab.com";
|
|
@@ -95,7 +95,7 @@ function resolveServerUrl(
|
|
|
95
95
|
* 解析 API Token
|
|
96
96
|
* - 优先使用 GIT_PROVIDER_TOKEN
|
|
97
97
|
* - Gitea: GITEA_TOKEN > GITHUB_TOKEN
|
|
98
|
-
* - GitHub: GITHUB_TOKEN
|
|
98
|
+
* - GitHub: GITHUB_TOKEN > GITEA_TOKEN
|
|
99
99
|
* - GitLab: GITLAB_TOKEN > CI_JOB_TOKEN
|
|
100
100
|
*/
|
|
101
101
|
function resolveToken(provider: GitProviderType, env: Record<string, string | undefined>): string {
|
|
@@ -103,7 +103,7 @@ function resolveToken(provider: GitProviderType, env: Record<string, string | un
|
|
|
103
103
|
return env.GIT_PROVIDER_TOKEN;
|
|
104
104
|
}
|
|
105
105
|
if (provider === "github") {
|
|
106
|
-
return env.GITHUB_TOKEN || "";
|
|
106
|
+
return env.GITHUB_TOKEN || env.GITEA_TOKEN || "";
|
|
107
107
|
}
|
|
108
108
|
if (provider === "gitlab") {
|
|
109
109
|
return env.GITLAB_TOKEN || env.CI_JOB_TOKEN || "";
|
|
@@ -277,8 +277,8 @@ export interface CreateIssueOption {
|
|
|
277
277
|
body?: string;
|
|
278
278
|
/** 指派人用户名列表 */
|
|
279
279
|
assignees?: string[];
|
|
280
|
-
/**
|
|
281
|
-
labels?:
|
|
280
|
+
/** 标签名称列表,各平台 adapter 内部负责名称到 ID 的转换 */
|
|
281
|
+
labels?: string[];
|
|
282
282
|
/** 里程碑 ID */
|
|
283
283
|
milestone?: number;
|
|
284
284
|
/** 截止日期 */
|
|
@@ -10,9 +10,9 @@ describe("Logger", () => {
|
|
|
10
10
|
|
|
11
11
|
beforeEach(() => {
|
|
12
12
|
consoleSpy = {
|
|
13
|
-
log: vi.spyOn(console, "log").mockImplementation(),
|
|
14
|
-
warn: vi.spyOn(console, "warn").mockImplementation(),
|
|
15
|
-
error: vi.spyOn(console, "error").mockImplementation(),
|
|
13
|
+
log: vi.spyOn(console, "log").mockImplementation(() => {}),
|
|
14
|
+
warn: vi.spyOn(console, "warn").mockImplementation(() => {}),
|
|
15
|
+
error: vi.spyOn(console, "error").mockImplementation(() => {}),
|
|
16
16
|
};
|
|
17
17
|
});
|
|
18
18
|
|