semantic-release-minecraft 1.1.3 → 1.2.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/CHANGELOG.md +6 -0
- package/dist/curseforge.d.ts +2 -2
- package/dist/curseforge.d.ts.map +1 -1
- package/dist/curseforge.js +47 -115
- package/dist/curseforge.js.map +1 -1
- package/dist/definitions/curseforge.d.ts +6 -6
- package/dist/definitions/{plugin_config.d.ts → plugin-config.d.ts} +4 -3
- package/dist/definitions/plugin-config.d.ts.map +1 -0
- package/dist/definitions/plugin-config.js +2 -0
- package/dist/definitions/plugin-config.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -23
- package/dist/index.js.map +1 -1
- package/dist/modrinth.d.ts +3 -3
- package/dist/modrinth.d.ts.map +1 -1
- package/dist/modrinth.js +58 -224
- package/dist/modrinth.js.map +1 -1
- package/dist/prepare.d.ts +4 -8
- package/dist/prepare.d.ts.map +1 -1
- package/dist/prepare.js +31 -32
- package/dist/prepare.js.map +1 -1
- package/dist/utils/glob-utils.d.ts +6 -0
- package/dist/utils/glob-utils.d.ts.map +1 -0
- package/dist/utils/glob-utils.js +27 -0
- package/dist/utils/glob-utils.js.map +1 -0
- package/dist/utils/platform/curseforge-utils.d.ts +4 -0
- package/dist/utils/platform/curseforge-utils.d.ts.map +1 -0
- package/dist/utils/platform/curseforge-utils.js +7 -0
- package/dist/utils/platform/curseforge-utils.js.map +1 -0
- package/dist/utils/platform/utils.d.ts +10 -0
- package/dist/utils/platform/utils.d.ts.map +1 -0
- package/dist/utils/platform/utils.js +56 -0
- package/dist/utils/platform/utils.js.map +1 -0
- package/dist/utils/template-utils.d.ts +26 -0
- package/dist/utils/template-utils.d.ts.map +1 -0
- package/dist/utils/template-utils.js +40 -0
- package/dist/utils/template-utils.js.map +1 -0
- package/dist/utils/utils.d.ts +4 -26
- package/dist/utils/utils.d.ts.map +1 -1
- package/dist/utils/utils.js +5 -79
- package/dist/utils/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/curseforge.ts +98 -160
- package/src/definitions/curseforge.ts +6 -6
- package/src/definitions/plugin-config.ts +68 -0
- package/src/index.ts +28 -34
- package/src/modrinth.ts +78 -272
- package/src/prepare.ts +43 -52
- package/src/utils/glob-utils.ts +38 -0
- package/src/utils/platform/curseforge-utils.ts +17 -0
- package/src/utils/platform/utils.ts +84 -0
- package/src/utils/template-utils.ts +54 -0
- package/src/utils/utils.ts +5 -115
- package/dist/definitions/plugin_config.d.ts.map +0 -1
- package/dist/definitions/plugin_config.js +0 -2
- package/dist/definitions/plugin_config.js.map +0 -1
- package/src/definitions/plugin_config.ts +0 -68
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [1.2.0](https://github.com/pynickle/semantic-release-minecraft/compare/v1.1.3...v1.2.0) (2025-10-20)
|
|
2
|
+
|
|
3
|
+
### ✨ 功能更新
|
|
4
|
+
|
|
5
|
+
* add strategy for multiple release ([b688b0c](https://github.com/pynickle/semantic-release-minecraft/commit/b688b0cd698c63f8e3f00216cd317a2f665561eb))
|
|
6
|
+
|
|
1
7
|
## [1.1.3](https://github.com/pynickle/semantic-release-minecraft/compare/v1.1.2...v1.1.3) (2025-10-18)
|
|
2
8
|
|
|
3
9
|
### 🐛 Bug修复
|
package/dist/curseforge.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { PublishContext } from 'semantic-release';
|
|
2
|
-
import {
|
|
3
|
-
export declare function publishToCurseforge(pluginConfig:
|
|
2
|
+
import { PluginConfig } from './definitions/plugin-config.js';
|
|
3
|
+
export declare function publishToCurseforge(pluginConfig: PluginConfig, context: PublishContext, strategy: Record<string, string>, curseforgeGameVersionIds?: number[]): Promise<number>;
|
|
4
4
|
//# sourceMappingURL=curseforge.d.ts.map
|
package/dist/curseforge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curseforge.d.ts","sourceRoot":"","sources":["../src/curseforge.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"curseforge.d.ts","sourceRoot":"","sources":["../src/curseforge.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAK9D,wBAAsB,mBAAmB,CACrC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,wBAAwB,CAAC,EAAE,MAAM,EAAE,GACpC,OAAO,CAAC,MAAM,CAAC,CAqCjB"}
|
package/dist/curseforge.js
CHANGED
|
@@ -1,137 +1,69 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import FormData from 'form-data';
|
|
3
3
|
import { readFile } from 'fs/promises';
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
async function
|
|
9
|
-
const {
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
});
|
|
19
|
-
// 查找文件
|
|
20
|
-
const files = await findFiles(curseforgeGlob, context);
|
|
21
|
-
// 如果只找到一个文件,直接返回
|
|
22
|
-
if (files.length === 1) {
|
|
23
|
-
logger.log(`Using the only found file for CurseForge: ${files[0]}`);
|
|
24
|
-
return files[0];
|
|
25
|
-
}
|
|
26
|
-
logger.log(`Found ${files.length} files for CurseForge, trying to filter by version`);
|
|
27
|
-
// 如果有版本号,尝试筛选包含版本号的文件
|
|
28
|
-
if (version) {
|
|
29
|
-
const versionedFiles = files.filter((file) => file.includes(version));
|
|
30
|
-
if (versionedFiles.length === 1) {
|
|
31
|
-
logger.log(`Using versioned file for CurseForge: ${versionedFiles[0]}`);
|
|
32
|
-
return versionedFiles[0];
|
|
33
|
-
}
|
|
34
|
-
else if (versionedFiles.length > 1) {
|
|
35
|
-
throw new Error(`Multiple files found containing version ${version} for CurseForge. Please specify a more specific glob pattern. Found: ${versionedFiles.join(', ')}`);
|
|
4
|
+
import { basename } from 'path';
|
|
5
|
+
import { getCurseForgeModLoaders } from './utils/platform/curseforge-utils';
|
|
6
|
+
import { findFilesAndPrimaryFile } from './utils/platform/utils';
|
|
7
|
+
import { resolveAndRenderTemplate } from './utils/template-utils';
|
|
8
|
+
export async function publishToCurseforge(pluginConfig, context, strategy, curseforgeGameVersionIds) {
|
|
9
|
+
const { logger } = context;
|
|
10
|
+
const { curseforge } = pluginConfig;
|
|
11
|
+
const projectId = curseforge.project_id;
|
|
12
|
+
const { files, primaryFile } = await findFilesAndPrimaryFile(pluginConfig, context, strategy);
|
|
13
|
+
logger.log(`Publishing ${files.length} file(s) to CurseForge project ${projectId}...`);
|
|
14
|
+
let primaryFileId = await uploadCurseForgeFile(pluginConfig, context, curseforgeGameVersionIds, primaryFile);
|
|
15
|
+
for (const filePath of files) {
|
|
16
|
+
if (filePath === primaryFile) {
|
|
17
|
+
continue;
|
|
36
18
|
}
|
|
19
|
+
await uploadCurseForgeFile(pluginConfig, context, curseforgeGameVersionIds, filePath, primaryFileId);
|
|
37
20
|
}
|
|
38
|
-
|
|
39
|
-
throw new Error(`Multiple files found for CurseForge but could not determine which to use. Found: ${files.join(', ')}`);
|
|
21
|
+
return primaryFileId;
|
|
40
22
|
}
|
|
41
|
-
|
|
23
|
+
async function uploadCurseForgeFile(pluginConfig, context, curseforgeGameVersionIds, filePath, primaryFileId) {
|
|
42
24
|
const { env, logger } = context;
|
|
43
25
|
const { curseforge } = pluginConfig;
|
|
44
26
|
const apiKey = env.CURSEFORGE_TOKEN;
|
|
45
27
|
const projectId = curseforge.project_id;
|
|
46
|
-
const nextRelease = context.nextRelease;
|
|
47
|
-
// 查找单个文件
|
|
48
|
-
const filePath = await findFileCurseforge(pluginConfig, context);
|
|
49
|
-
logger.log(`Publishing file ${filePath} to CurseForge project ${projectId}...`);
|
|
50
28
|
const form = new FormData();
|
|
51
29
|
const file = await readFile(filePath);
|
|
52
30
|
form.append('file', file, {
|
|
53
|
-
filename: filePath
|
|
31
|
+
filename: basename(filePath),
|
|
32
|
+
});
|
|
33
|
+
const metadata = prepareMetadata(pluginConfig, context, curseforgeGameVersionIds);
|
|
34
|
+
if (primaryFileId) {
|
|
35
|
+
metadata.parentFileID = primaryFileId;
|
|
36
|
+
}
|
|
37
|
+
form.append('metadata', metadata);
|
|
38
|
+
const response = await axios.post(`https://upload.curseforge.com/api/projects/${projectId}/upload-file`, form, {
|
|
39
|
+
headers: {
|
|
40
|
+
...form.getHeaders(),
|
|
41
|
+
'X-API-TOKEN': apiKey,
|
|
42
|
+
},
|
|
54
43
|
});
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
44
|
+
const resData = response.data;
|
|
45
|
+
if (resData && typeof resData.id === 'number') {
|
|
46
|
+
logger.log(`Successfully published to CurseForge, File ID: ${resData.id}`);
|
|
47
|
+
return resData.id;
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
throw new Error(`CurseForge API returned unexpected response: ${resData}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function prepareMetadata(pluginConfig, context, curseforgeGameVersionIds) {
|
|
54
|
+
const { nextRelease } = context;
|
|
55
|
+
const { curseforge } = pluginConfig;
|
|
64
56
|
const metadata = {
|
|
65
57
|
gameVersions: curseforgeGameVersionIds,
|
|
66
58
|
releaseType: pluginConfig.release_type || 'release',
|
|
67
59
|
changelog: curseforge?.changelog || context.nextRelease.notes,
|
|
68
60
|
changelogType: curseforge?.changelog_type || 'markdown',
|
|
61
|
+
isMarkedForManualRelease: curseforge?.is_marked_for_manual_release || false,
|
|
62
|
+
relations: curseforge?.relations || [],
|
|
69
63
|
};
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
else {
|
|
75
|
-
// 如果没有找到任何配置,使用默认值
|
|
76
|
-
metadata.displayName = context.nextRelease.name;
|
|
77
|
-
}
|
|
78
|
-
// 添加 metadataModLoaders(如果有值)
|
|
79
|
-
const metadataModLoaders = getCurseForgeModLoaders(pluginConfig, env, nextRelease);
|
|
80
|
-
if (metadataModLoaders) {
|
|
81
|
-
metadata.modLoaders = metadataModLoaders;
|
|
82
|
-
}
|
|
83
|
-
// 只有当提供值时才添加这三个特定字段
|
|
84
|
-
if (curseforge?.parent_file_id !== undefined) {
|
|
85
|
-
metadata.parentFileID = curseforge.parent_file_id;
|
|
86
|
-
}
|
|
87
|
-
if (curseforge?.is_marked_for_manual_release !== undefined) {
|
|
88
|
-
metadata.isMarkedForManualRelease =
|
|
89
|
-
curseforge.is_marked_for_manual_release;
|
|
90
|
-
}
|
|
91
|
-
if (curseforge?.relations && Object.keys(curseforge.relations).length > 0) {
|
|
92
|
-
metadata.relations = curseforge.relations;
|
|
93
|
-
}
|
|
94
|
-
form.append('metadata', JSON.stringify(metadata));
|
|
95
|
-
try {
|
|
96
|
-
const response = await axios.post(`https://upload.curseforge.com/api/projects/${projectId}/upload-file`, form, {
|
|
97
|
-
headers: {
|
|
98
|
-
...form.getHeaders(),
|
|
99
|
-
'X-API-TOKEN': apiKey,
|
|
100
|
-
},
|
|
101
|
-
});
|
|
102
|
-
// 验证返回的数据是否包含 id 字段
|
|
103
|
-
if (response.data && typeof response.data.id === 'number') {
|
|
104
|
-
logger.log(`Successfully published to CurseForge: ${response.data.displayName || `File ID: ${response.data.id}`}`);
|
|
105
|
-
return response.data.id.toString();
|
|
106
|
-
}
|
|
107
|
-
else {
|
|
108
|
-
throw new Error(`CurseForge API returned unexpected response: ${JSON.stringify(response.data)}`);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
if (error.response) {
|
|
113
|
-
// 服务器返回了错误响应
|
|
114
|
-
const status = error.response.status;
|
|
115
|
-
const data = error.response.data;
|
|
116
|
-
if (data && data.error && data.description) {
|
|
117
|
-
logger.error(`CurseForge API Error (${status}): ${data.error} - ${data.description}`);
|
|
118
|
-
throw new Error(`CurseForge 发布失败:${data.error} - ${data.description}`);
|
|
119
|
-
}
|
|
120
|
-
else {
|
|
121
|
-
logger.error(`CurseForge API Error (${status}): ${JSON.stringify(data)}`);
|
|
122
|
-
throw new Error(`CurseForge 发布失败 (状态码:${status}): ${JSON.stringify(data)}`);
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
else if (error.request) {
|
|
126
|
-
// 请求已发送但未收到响应
|
|
127
|
-
logger.error('CurseForge API 请求失败,未收到响应');
|
|
128
|
-
throw new Error('CurseForge 发布失败:未收到服务器响应');
|
|
129
|
-
}
|
|
130
|
-
else {
|
|
131
|
-
// 请求配置出错
|
|
132
|
-
logger.error('CurseForge API 请求配置错误:', error.message);
|
|
133
|
-
throw new Error(`CurseForge 发布失败:${error.message}`);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
64
|
+
const displayName = resolveAndRenderTemplate([curseforge?.display_name, pluginConfig.display_name], { nextRelease });
|
|
65
|
+
metadata.display_name = displayName || context.nextRelease.name;
|
|
66
|
+
metadata.modLoaders = getCurseForgeModLoaders(pluginConfig, nextRelease);
|
|
67
|
+
return metadata;
|
|
136
68
|
}
|
|
137
69
|
//# sourceMappingURL=curseforge.js.map
|
package/dist/curseforge.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"curseforge.js","sourceRoot":"","sources":["../src/curseforge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,QAAQ,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"curseforge.js","sourceRoot":"","sources":["../src/curseforge.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,27 +12,27 @@ export interface CurseForgeGameVersionType {
|
|
|
12
12
|
}
|
|
13
13
|
export interface CurseForgeGameVersionMap {
|
|
14
14
|
/**
|
|
15
|
-
* Minecraft
|
|
15
|
+
* Array of Minecraft game versions.
|
|
16
16
|
*/
|
|
17
17
|
game_versions: CurseForgeGameVersion[];
|
|
18
18
|
/**
|
|
19
|
-
*
|
|
19
|
+
* Array of game versions primarily used for Bukkit plugins.
|
|
20
20
|
*/
|
|
21
21
|
game_versions_for_plugins: CurseForgeGameVersion[];
|
|
22
22
|
/**
|
|
23
|
-
*
|
|
23
|
+
* Array of game versions for add-ons.
|
|
24
24
|
*/
|
|
25
25
|
game_versions_for_addons: CurseForgeGameVersion[];
|
|
26
26
|
/**
|
|
27
|
-
* Java
|
|
27
|
+
* Array of Java versions.
|
|
28
28
|
*/
|
|
29
29
|
java_versions: CurseForgeGameVersion[];
|
|
30
30
|
/**
|
|
31
|
-
*
|
|
31
|
+
* Array of game versions for mod loaders.
|
|
32
32
|
*/
|
|
33
33
|
loaders: CurseForgeGameVersion[];
|
|
34
34
|
/**
|
|
35
|
-
*
|
|
35
|
+
* Array of game versions for different environments.
|
|
36
36
|
*/
|
|
37
37
|
environments: CurseForgeGameVersion[];
|
|
38
38
|
}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
export type
|
|
1
|
+
export type PluginConfig = {
|
|
2
2
|
release_type?: 'alpha' | 'beta' | 'release';
|
|
3
3
|
game_versions?: string | string[];
|
|
4
4
|
mod_loaders?: string | string[];
|
|
5
5
|
display_name?: string;
|
|
6
|
+
strategies?: Record<string, string>[];
|
|
6
7
|
glob?: string | string[];
|
|
8
|
+
primary_file_glob: string | string[];
|
|
7
9
|
curseforge?: {
|
|
8
10
|
project_id: string;
|
|
9
11
|
game_versions?: string | string[];
|
|
@@ -15,7 +17,6 @@ export type Plugin_config = {
|
|
|
15
17
|
changelog?: string;
|
|
16
18
|
changelog_type?: 'text' | 'html' | 'markdown';
|
|
17
19
|
display_name?: string;
|
|
18
|
-
parent_file_id?: number;
|
|
19
20
|
is_marked_for_manual_release?: boolean;
|
|
20
21
|
relations?: {
|
|
21
22
|
projects?: Array<{
|
|
@@ -46,4 +47,4 @@ export type Plugin_config = {
|
|
|
46
47
|
primary_file_glob?: string | string[];
|
|
47
48
|
};
|
|
48
49
|
};
|
|
49
|
-
//# sourceMappingURL=
|
|
50
|
+
//# sourceMappingURL=plugin-config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-config.d.ts","sourceRoot":"","sources":["../../src/definitions/plugin-config.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACvB,YAAY,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;IAC5C,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC;IAEtC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IACzB,iBAAiB,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;IAErC,UAAU,CAAC,EAAE;QACT,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAClC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAClC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACjC,yBAAyB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC9C,uBAAuB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAC5C,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QAChC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;QAC9C,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,4BAA4B,CAAC,EAAE,OAAO,CAAC;QACvC,SAAS,CAAC,EAAE;YACR,QAAQ,CAAC,EAAE,KAAK,CAAC;gBACb,IAAI,EAAE,MAAM,CAAC;gBACb,UAAU,CAAC,EAAE,MAAM,CAAC;gBACpB,IAAI,EACE,kBAAkB,GAClB,cAAc,GACd,qBAAqB,GACrB,qBAAqB,GACrB,MAAM,CAAC;aAChB,CAAC,CAAC;SACN,CAAC;QACF,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KAC5B,CAAC;IACF,QAAQ,CAAC,EAAE;QACP,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;QACzB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,YAAY,CAAC,EAAE,KAAK,CAAC;YACjB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,UAAU,CAAC,EAAE,MAAM,CAAC;YACpB,SAAS,CAAC,EAAE,MAAM,CAAC;YACnB,eAAe,EACT,UAAU,GACV,UAAU,GACV,cAAc,GACd,UAAU,CAAC;SACpB,CAAC,CAAC;QACH,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,MAAM,CAAC,EACD,QAAQ,GACR,UAAU,GACV,OAAO,GACP,UAAU,GACV,WAAW,GACX,SAAS,CAAC;QAChB,gBAAgB,CAAC,EAAE,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,UAAU,CAAC;QAChE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;QACzB,iBAAiB,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;KACzC,CAAC;CACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-config.js","sourceRoot":"","sources":["../../src/definitions/plugin-config.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { PrepareContext, PublishContext, VerifyConditionsContext } from 'semantic-release';
|
|
2
|
-
import {
|
|
3
|
-
export declare function verifyConditions(pluginConfig:
|
|
4
|
-
export declare function prepare(pluginConfig:
|
|
5
|
-
export declare function publish(pluginConfig:
|
|
2
|
+
import { PluginConfig } from './definitions/plugin-config.js';
|
|
3
|
+
export declare function verifyConditions(pluginConfig: PluginConfig, context: VerifyConditionsContext): Promise<void>;
|
|
4
|
+
export declare function prepare(pluginConfig: PluginConfig, context: PrepareContext): Promise<void>;
|
|
5
|
+
export declare function publish(pluginConfig: PluginConfig, context: PublishContext): Promise<{
|
|
6
6
|
url: string;
|
|
7
7
|
}[]>;
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EACd,cAAc,EACd,uBAAuB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EACd,cAAc,EACd,uBAAuB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAO9D,wBAAsB,gBAAgB,CAClC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,uBAAuB,iBAWnC;AAED,wBAAsB,OAAO,CACzB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,iBAkB1B;AAED,wBAAsB,OAAO,CACzB,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,GACxB,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,CAsC5B"}
|
package/dist/index.js
CHANGED
|
@@ -1,38 +1,32 @@
|
|
|
1
1
|
import { publishToCurseforge } from './curseforge.js';
|
|
2
2
|
import { publishToModrinth } from './modrinth.js';
|
|
3
3
|
import { getCurseForgeGameVersionIds } from './prepare.js';
|
|
4
|
-
//
|
|
4
|
+
// Game version IDs transformed from user's input, used during publishing to CurseForge
|
|
5
5
|
let curseforgeGameVersionsIds;
|
|
6
6
|
export async function verifyConditions(pluginConfig, context) {
|
|
7
|
-
|
|
8
|
-
if (
|
|
7
|
+
const { env } = context;
|
|
8
|
+
if (env.CURSEFORGE_TOKEN && !pluginConfig.curseforge?.project_id) {
|
|
9
9
|
throw new Error('CurseForge project ID is required');
|
|
10
10
|
}
|
|
11
|
-
if (
|
|
11
|
+
if (env.MODRINTH_TOKEN && !pluginConfig.modrinth?.project_id) {
|
|
12
12
|
throw new Error('Modrinth project ID is required');
|
|
13
13
|
}
|
|
14
14
|
}
|
|
15
15
|
export async function prepare(pluginConfig, context) {
|
|
16
16
|
const { env, logger } = context;
|
|
17
17
|
if (env.CURSEFORGE_TOKEN) {
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
curseforgeGameVersionsIds = await getCurseForgeGameVersionIds(apiKey, pluginConfig, env, context.nextRelease);
|
|
23
|
-
logger.log(`Successfully transform ${Object.keys(curseforgeGameVersionsIds).length} CurseForge game versions`);
|
|
24
|
-
}
|
|
25
|
-
catch (error) {
|
|
26
|
-
logger.warn(`Failed to fetch CurseForge game versions: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
27
|
-
}
|
|
18
|
+
const apiToken = env.CURSEFORGE_TOKEN;
|
|
19
|
+
logger.log('Fetching CurseForge game versions and types...');
|
|
20
|
+
curseforgeGameVersionsIds = await getCurseForgeGameVersionIds(apiToken, pluginConfig, context);
|
|
21
|
+
logger.log(`Successfully transform into ${Object.keys(curseforgeGameVersionsIds).length} CurseForge game versions`);
|
|
28
22
|
}
|
|
29
23
|
}
|
|
30
24
|
export async function publish(pluginConfig, context) {
|
|
31
25
|
const { env, logger } = context;
|
|
32
26
|
const results = [];
|
|
33
|
-
|
|
27
|
+
for (const strategy of pluginConfig.strategies || [{}]) {
|
|
34
28
|
if (env.CURSEFORGE_TOKEN) {
|
|
35
|
-
const curseforgeId = await publishToCurseforge(pluginConfig, context, curseforgeGameVersionsIds);
|
|
29
|
+
const curseforgeId = await publishToCurseforge(pluginConfig, context, strategy, curseforgeGameVersionsIds);
|
|
36
30
|
results.push({
|
|
37
31
|
url: `https://www.curseforge.com/minecraft/mc-mods/${pluginConfig.curseforge.project_id}/files/${curseforgeId}`,
|
|
38
32
|
});
|
|
@@ -40,9 +34,8 @@ export async function publish(pluginConfig, context) {
|
|
|
40
34
|
else {
|
|
41
35
|
logger.log('CurseForge publishing is skipped: CURSEFORGE_TOKEN environment variable not found.');
|
|
42
36
|
}
|
|
43
|
-
// 发布到 Modrinth(如果配置了 Modrinth 且存在环境变量)
|
|
44
37
|
if (env.MODRINTH_TOKEN) {
|
|
45
|
-
const modrinthId = await publishToModrinth(pluginConfig, context);
|
|
38
|
+
const modrinthId = await publishToModrinth(pluginConfig, context, strategy);
|
|
46
39
|
results.push({
|
|
47
40
|
url: `https://modrinth.com/mod/${pluginConfig.modrinth.project_id}/version/${modrinthId}`,
|
|
48
41
|
});
|
|
@@ -50,11 +43,7 @@ export async function publish(pluginConfig, context) {
|
|
|
50
43
|
else {
|
|
51
44
|
logger.log('Modrinth publishing is skipped: MODRINTH_TOKEN environment variable not found.');
|
|
52
45
|
}
|
|
53
|
-
return results;
|
|
54
|
-
}
|
|
55
|
-
catch (error) {
|
|
56
|
-
logger.error('Failed to publish:', error);
|
|
57
|
-
throw error;
|
|
58
46
|
}
|
|
47
|
+
return results;
|
|
59
48
|
}
|
|
60
49
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAEtD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,cAAc,CAAC;AAE3D,uFAAuF;AACvF,IAAI,yBAA+C,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAClC,YAA0B,EAC1B,OAAgC;IAEhC,MAAM,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC;IAExB,IAAI,GAAG,CAAC,gBAAgB,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,EAAE,CAAC;QAC/D,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACzD,CAAC;IAED,IAAI,GAAG,CAAC,cAAc,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACvD,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,YAA0B,EAC1B,OAAuB;IAEvB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAEhC,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;QACvB,MAAM,QAAQ,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;QAE7D,yBAAyB,GAAG,MAAM,2BAA2B,CACzD,QAAQ,EACR,YAAY,EACZ,OAAO,CACV,CAAC;QAEF,MAAM,CAAC,GAAG,CACN,+BAA+B,MAAM,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,MAAM,2BAA2B,CAC1G,CAAC;IACN,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CACzB,YAA0B,EAC1B,OAAuB;IAEvB,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAChC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,QAAQ,IAAI,YAAY,CAAC,UAAU,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QACrD,IAAI,GAAG,CAAC,gBAAgB,EAAE,CAAC;YACvB,MAAM,YAAY,GAAG,MAAM,mBAAmB,CAC1C,YAAY,EACZ,OAAO,EACP,QAAQ,EACR,yBAAyB,CAC5B,CAAC;YACF,OAAO,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,gDAAgD,YAAY,CAAC,UAAW,CAAC,UAAU,UAAU,YAAY,EAAE;aACnH,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CACN,oFAAoF,CACvF,CAAC;QACN,CAAC;QAED,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC;YACrB,MAAM,UAAU,GAAG,MAAM,iBAAiB,CACtC,YAAY,EACZ,OAAO,EACP,QAAQ,CACX,CAAC;YACF,OAAO,CAAC,IAAI,CAAC;gBACT,GAAG,EAAE,4BAA4B,YAAY,CAAC,QAAS,CAAC,UAAU,YAAY,UAAU,EAAE;aAC7F,CAAC,CAAC;QACP,CAAC;aAAM,CAAC;YACJ,MAAM,CAAC,GAAG,CACN,gFAAgF,CACnF,CAAC;QACN,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC"}
|
package/dist/modrinth.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PublishContext } from 'semantic-release';
|
|
2
|
-
import {
|
|
2
|
+
import { PluginConfig } from './definitions/plugin-config';
|
|
3
3
|
/**
|
|
4
|
-
*
|
|
4
|
+
* Publishes files to Modrinth.
|
|
5
5
|
*/
|
|
6
|
-
export declare function publishToModrinth(pluginConfig:
|
|
6
|
+
export declare function publishToModrinth(pluginConfig: PluginConfig, context: PublishContext, strategy: Record<string, string>): Promise<string>;
|
|
7
7
|
//# sourceMappingURL=modrinth.d.ts.map
|
package/dist/modrinth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modrinth.d.ts","sourceRoot":"","sources":["../src/modrinth.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modrinth.d.ts","sourceRoot":"","sources":["../src/modrinth.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAO3D;;GAEG;AACH,wBAAsB,iBAAiB,CACnC,YAAY,EAAE,YAAY,EAC1B,OAAO,EAAE,cAAc,EACvB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GACjC,OAAO,CAAC,MAAM,CAAC,CAsHjB"}
|