semantic-release-minecraft 1.0.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.
Files changed (42) hide show
  1. package/.github/workflows/release.yml +43 -0
  2. package/.prettierrc +18 -0
  3. package/.releaserc.json +51 -0
  4. package/CHANGELOG.md +10 -0
  5. package/dist/curseforge.d.ts +4 -0
  6. package/dist/curseforge.d.ts.map +1 -0
  7. package/dist/curseforge.js +131 -0
  8. package/dist/curseforge.js.map +1 -0
  9. package/dist/definitions/curseforge.d.ts +40 -0
  10. package/dist/definitions/curseforge.d.ts.map +1 -0
  11. package/dist/definitions/curseforge.js +6 -0
  12. package/dist/definitions/curseforge.js.map +1 -0
  13. package/dist/definitions/plugin_config.d.ts +49 -0
  14. package/dist/definitions/plugin_config.d.ts.map +1 -0
  15. package/dist/definitions/plugin_config.js +2 -0
  16. package/dist/definitions/plugin_config.js.map +1 -0
  17. package/dist/index.d.ts +8 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +60 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/modrinth.d.ts +7 -0
  22. package/dist/modrinth.d.ts.map +1 -0
  23. package/dist/modrinth.js +238 -0
  24. package/dist/modrinth.js.map +1 -0
  25. package/dist/prepare.d.ts +11 -0
  26. package/dist/prepare.d.ts.map +1 -0
  27. package/dist/prepare.js +88 -0
  28. package/dist/prepare.js.map +1 -0
  29. package/dist/utils/utils.d.ts +29 -0
  30. package/dist/utils/utils.d.ts.map +1 -0
  31. package/dist/utils/utils.js +92 -0
  32. package/dist/utils/utils.js.map +1 -0
  33. package/eslint.config.js +22 -0
  34. package/package.json +49 -0
  35. package/src/curseforge.ts +192 -0
  36. package/src/definitions/curseforge.ts +51 -0
  37. package/src/definitions/plugin_config.ts +68 -0
  38. package/src/index.ts +98 -0
  39. package/src/modrinth.ts +316 -0
  40. package/src/prepare.ts +199 -0
  41. package/src/utils/utils.ts +120 -0
  42. package/tsconfig.json +25 -0
@@ -0,0 +1,238 @@
1
+ import axios from 'axios';
2
+ import FormData from 'form-data';
3
+ import { readFile } from 'fs/promises';
4
+ import { glob } from 'glob';
5
+ import { template } from 'lodash';
6
+ import { resolve } from 'path';
7
+ import { findFiles, renderTemplates, resolveTemplate, toArray, } from './utils/utils';
8
+ /**
9
+ * 发布到 Modrinth
10
+ */
11
+ export async function publishToModrinth(pluginConfig, context) {
12
+ const { env, logger } = context;
13
+ const { modrinth } = pluginConfig;
14
+ const token = env.MODRINTH_TOKEN;
15
+ const projectId = modrinth?.project_id;
16
+ const nextRelease = context.nextRelease;
17
+ const nextReleaseVersion = nextRelease.version;
18
+ // 查找文件并确定主要文件
19
+ const { files, primaryFile } = await findModrinthJarFiles(pluginConfig, context);
20
+ logger.log(`Publishing ${files.length} file(s) to Modrinth project ${projectId}...`);
21
+ // 使用 multipart/form-data 方式上传文件和版本信息
22
+ const form = new FormData();
23
+ const filePartNames = [];
24
+ let primaryFilePartName = undefined;
25
+ // 上传所有文件
26
+ for (let i = 0; i < files.length; i++) {
27
+ const jarPath = files[i];
28
+ const jarFile = await readFile(jarPath);
29
+ const fileName = jarPath.split('\\').pop() || `mod-${i}.jar`;
30
+ const filePartName = `file-${i}`;
31
+ form.append(filePartName, jarFile, { filename: fileName });
32
+ filePartNames.push(filePartName);
33
+ // 标记主要文件
34
+ if (jarPath === primaryFile) {
35
+ primaryFilePartName = filePartName;
36
+ }
37
+ }
38
+ // 使用根据primaryFileGlob确定的主要文件
39
+ const finalPrimaryFile = primaryFilePartName;
40
+ // 准备版本信息,只包含必需字段和存在的可选字段
41
+ // displayName按照优先级:平台特定配置 > 全局配置 > 平台特定环境变量 > 全局环境变量
42
+ let displayName;
43
+ if (modrinth?.display_name) {
44
+ displayName = template(modrinth.display_name)(nextRelease);
45
+ }
46
+ else if (pluginConfig.display_name) {
47
+ displayName = template(pluginConfig.display_name)(nextRelease);
48
+ }
49
+ else if (env.MODRINTH_DISPLAY_NAME) {
50
+ displayName = env.MODRINTH_DISPLAY_NAME;
51
+ }
52
+ else if (env.DISPLAY_NAME) {
53
+ displayName = env.DISPLAY_NAME;
54
+ }
55
+ // version_number 按照优先级:平台特定配置 > 平台特定环境变量 > 全局环境变量
56
+ const versionNumber = resolveTemplate([modrinth?.version_number, env.MODRINTH_VERSION_NUMBER], nextRelease);
57
+ // 准备版本信息,只包含必需字段和存在的可选字段
58
+ const versionData = {
59
+ project_id: projectId,
60
+ file_parts: filePartNames, // 必需字段,列出所有文件部分的名称
61
+ };
62
+ // 只有找到值时才添加 name 字段
63
+ if (displayName) {
64
+ versionData.name = displayName;
65
+ }
66
+ else {
67
+ // 如果没有找到任何配置,使用默认值
68
+ versionData.name = context.nextRelease.name;
69
+ }
70
+ // 只有找到值时才添加 version_number 字段
71
+ if (versionNumber) {
72
+ versionData.version_number = versionNumber;
73
+ }
74
+ else {
75
+ // 如果没有找到任何配置,使用默认值
76
+ versionData.version_number = nextReleaseVersion;
77
+ }
78
+ // 只添加存在的可选字段
79
+ if (modrinth?.changelog || context.nextRelease?.notes) {
80
+ versionData.changelog =
81
+ modrinth?.changelog || context.nextRelease?.notes || '';
82
+ }
83
+ if (modrinth?.game_versions && modrinth.game_versions.length > 0) {
84
+ versionData.game_versions = renderTemplates(modrinth.game_versions, {
85
+ nextRelease,
86
+ });
87
+ }
88
+ else if (pluginConfig.game_versions &&
89
+ pluginConfig.game_versions.length > 0) {
90
+ versionData.game_versions = renderTemplates(toArray(pluginConfig.game_versions), {
91
+ nextRelease,
92
+ });
93
+ }
94
+ // modLoaders 按照优先级:平台特定配置 > 全局配置 > 平台特定环境变量 > 全局环境变量
95
+ let modLoaders;
96
+ if (modrinth?.mod_loaders && modrinth.mod_loaders.length > 0) {
97
+ modLoaders = renderTemplates(modrinth.mod_loaders, {
98
+ nextRelease,
99
+ });
100
+ }
101
+ else if (pluginConfig.mod_loaders &&
102
+ pluginConfig.mod_loaders.length > 0) {
103
+ modLoaders = renderTemplates(toArray(pluginConfig.mod_loaders), {
104
+ nextRelease,
105
+ });
106
+ }
107
+ else if (env.MODRINTH_MOD_LOADERS) {
108
+ modLoaders = env.MODRINTH_MOD_LOADERS.split(',').map((s) => s.trim());
109
+ }
110
+ else if (env.MOD_LOADERS) {
111
+ modLoaders = env.MOD_LOADERS.split(',').map((s) => s.trim());
112
+ }
113
+ if (modLoaders) {
114
+ versionData.loaders = modLoaders;
115
+ }
116
+ if (pluginConfig.release_type) {
117
+ versionData.version_type = pluginConfig.release_type;
118
+ }
119
+ if (modrinth?.dependencies && modrinth.dependencies.length > 0) {
120
+ versionData.dependencies = modrinth.dependencies;
121
+ }
122
+ if (modrinth?.featured !== undefined) {
123
+ versionData.featured = modrinth.featured;
124
+ }
125
+ if (modrinth?.status) {
126
+ versionData.status = modrinth.status;
127
+ }
128
+ if (modrinth?.requested_status) {
129
+ versionData.requested_status = modrinth.requested_status;
130
+ }
131
+ // 只有当 finalPrimaryFile 存在时才添加 primary_file 字段
132
+ if (finalPrimaryFile) {
133
+ versionData.primary_file = finalPrimaryFile;
134
+ }
135
+ // 添加版本信息作为 JSON
136
+ form.append('data', JSON.stringify(versionData));
137
+ // 发送版本创建请求
138
+ try {
139
+ const versionResponse = await axios.post('https://api.modrinth.com/v2/version', form, {
140
+ headers: {
141
+ ...form.getHeaders(),
142
+ Authorization: token,
143
+ },
144
+ validateStatus: (status) => status < 500, // 仅拒绝5xx错误
145
+ });
146
+ // 检查响应状态码
147
+ if (versionResponse.status === 200) {
148
+ // 成功
149
+ logger.log(`Successfully published to Modrinth: ${versionResponse.data.name || versionResponse.data.id}`);
150
+ return versionResponse.data.id;
151
+ }
152
+ else if (versionResponse.status === 400 ||
153
+ versionResponse.status === 401) {
154
+ // 处理客户端错误
155
+ const data = versionResponse.data;
156
+ if (data && data.error && data.description) {
157
+ logger.error(`Modrinth API Error (${versionResponse.status}): ${data.error} - ${data.description}`);
158
+ throw new Error(`Modrinth发布失败: ${data.error} - ${data.description}`);
159
+ }
160
+ else {
161
+ logger.error(`Modrinth API Error (${versionResponse.status}): ${JSON.stringify(data)}`);
162
+ throw new Error(`Modrinth发布失败 (状态码: ${versionResponse.status}): ${JSON.stringify(data)}`);
163
+ }
164
+ }
165
+ else {
166
+ // 其他错误状态码
167
+ const data = versionResponse.data;
168
+ logger.error(`Modrinth API Error (${versionResponse.status}): ${JSON.stringify(data)}`);
169
+ throw new Error(`Modrinth发布失败 (状态码: ${versionResponse.status}): ${JSON.stringify(data)}`);
170
+ }
171
+ }
172
+ catch (error) {
173
+ if (error.response) {
174
+ // 已经在上面处理过
175
+ throw error;
176
+ }
177
+ else if (error.request) {
178
+ // 请求已发送但未收到响应
179
+ logger.error('Modrinth API 请求失败,未收到响应');
180
+ throw new Error('Modrinth发布失败: 未收到服务器响应');
181
+ }
182
+ else {
183
+ // 请求配置出错
184
+ logger.error('Modrinth API 请求配置错误:', error.message);
185
+ throw new Error(`Modrinth发布失败: ${error.message}`);
186
+ }
187
+ }
188
+ }
189
+ /**
190
+ * 为 Modrinth 查找文件并确定主要文件
191
+ */
192
+ async function findModrinthJarFiles(pluginConfig, context) {
193
+ const { logger } = context;
194
+ // 获取 Modrinth 专用的 glob 配置,如果没有则使用全局配置
195
+ const modrinthGlob = pluginConfig.modrinth?.glob || pluginConfig.glob || [];
196
+ // 查找所有文件
197
+ const jarFiles = await findFiles(modrinthGlob, context);
198
+ logger.log(`Found ${jarFiles.length} JAR file(s) for Modrinth: ${jarFiles.join(', ')}`);
199
+ // 确定主要文件
200
+ let primaryFile = undefined;
201
+ // 检查是否提供了 primaryFileGlob
202
+ if (pluginConfig.modrinth?.primary_file_glob) {
203
+ const primaryPatterns = Array.isArray(pluginConfig.modrinth.primary_file_glob)
204
+ ? pluginConfig.modrinth.primary_file_glob
205
+ : [pluginConfig.modrinth.primary_file_glob];
206
+ // 查找匹配 primaryFileGlob 的文件
207
+ let primaryCandidates = [];
208
+ for (const pattern of primaryPatterns) {
209
+ logger.log(`Searching for primary file with pattern: ${pattern}`);
210
+ const matches = await glob(pattern, {
211
+ cwd: context.cwd,
212
+ nodir: true,
213
+ });
214
+ primaryCandidates.push(...matches.map((file) => resolve(context.cwd, file)));
215
+ }
216
+ // 过滤出 JAR 文件并与找到的文件列表交叉检查
217
+ primaryCandidates = primaryCandidates
218
+ .filter((file) => file.endsWith('.jar'))
219
+ .filter((file) => jarFiles.includes(file));
220
+ if (primaryCandidates.length === 1) {
221
+ primaryFile = primaryCandidates[0];
222
+ logger.log(`Selected primary file for Modrinth: ${primaryFile}`);
223
+ }
224
+ else if (primaryCandidates.length > 1) {
225
+ throw new Error(`Multiple files matched primaryFileGlob for Modrinth. Please specify a more specific pattern. Found: ${primaryCandidates.join(', ')}`);
226
+ }
227
+ else {
228
+ throw new Error(`No files matched primaryFileGlob for Modrinth that were also in the main file list.`);
229
+ }
230
+ }
231
+ else if (jarFiles.length > 1) {
232
+ // 当有多个文件但没有指定 primaryFileGlob 时,需要指定主要文件
233
+ throw new Error(`Multiple files found for Modrinth but no primaryFileGlob specified. Please specify which file should be primary.`);
234
+ }
235
+ // 当只有一个文件时,不设置 primaryFile,让网站做决定
236
+ return { files: jarFiles, primaryFile };
237
+ }
238
+ //# sourceMappingURL=modrinth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modrinth.js","sourceRoot":"","sources":["../src/modrinth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { NextRelease } from 'semantic-release';
2
+ import { Plugin_config } from './definitions/plugin_config';
3
+ /**
4
+ * 根据提供的游戏版本联合对象检索游戏版本 ID 变体数组。
5
+ */
6
+ export declare function getCurseForgeGameVersionIds(apiToken: string, pluginConfig: Plugin_config, env: Record<string, string>, nextRelease: NextRelease): Promise<number[]>;
7
+ /**
8
+ * 比较器:忽略名称中的 "-Snapshot" 后缀
9
+ */
10
+ export declare const CURSEFORGE_GAME_VERSION_SNAPSHOT_NAME_COMPARER: (a: string, b: string) => boolean;
11
+ //# sourceMappingURL=prepare.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.d.ts","sourceRoot":"","sources":["../src/prepare.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAO/C,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAG5D;;GAEG;AACH,wBAAsB,2BAA2B,CAC7C,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,aAAa,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,WAAW,EAAE,WAAW,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAsEnB;AAoGD;;GAEG;AACH,eAAO,MAAM,8CAA8C,GACvD,GAAG,MAAM,EACT,GAAG,MAAM,KACV,OAGF,CAAC"}
@@ -0,0 +1,88 @@
1
+ import axios from 'axios';
2
+ import { BUKKIT_GAME_VERSION_TYPE, } from './definitions/curseforge';
3
+ import { getCurseForgeModLoaders, toArray } from './utils/utils';
4
+ /**
5
+ * 根据提供的游戏版本联合对象检索游戏版本 ID 变体数组。
6
+ */
7
+ export async function getCurseForgeGameVersionIds(apiToken, pluginConfig, env, nextRelease) {
8
+ const curseforgeConfig = pluginConfig.curseforge;
9
+ const modLoaders = getCurseForgeModLoaders(pluginConfig, env, nextRelease);
10
+ const javaVersions = toArray(curseforgeConfig.java_versions || []);
11
+ const gameVersions = toArray(curseforgeConfig.game_versions || pluginConfig.game_versions || []);
12
+ const pluginGameVersions = toArray(curseforgeConfig.game_versions_for_plugins || []);
13
+ const addonGameVersions = toArray(curseforgeConfig.game_versions_for_addon || []);
14
+ const environments = toArray(curseforgeConfig.environments || []);
15
+ const map = await createCurseForgeGameVersionMap(apiToken);
16
+ const javaVersionNames = javaVersions.map((javaVersion) => `Java ${javaVersion}`);
17
+ // TODO: Modrinth 和 CurseForge 的游戏版本命名格式转化,以 Modrinth 为基准
18
+ // const gameVersionNames = gameVersions.map(x => formatCurseForgeGameVersionSnapshot(x));
19
+ // 模组的游戏版本名称
20
+ const gameVersionIds = findCurseForgeGameVersionIdsByNames(map.game_versions, gameVersions, undefined, CURSEFORGE_GAME_VERSION_SNAPSHOT_NAME_COMPARER);
21
+ const loaderIds = findCurseForgeGameVersionIdsByNames(map.loaders, modLoaders);
22
+ const javaIds = findCurseForgeGameVersionIdsByNames(map.java_versions, javaVersionNames);
23
+ // 插件的游戏版本名称
24
+ const pluginGameVersionIds = findCurseForgeGameVersionIdsByNames(map.game_versions_for_plugins, pluginGameVersions);
25
+ // 附加组件的游戏版本名称
26
+ const addonGameVersionIds = findCurseForgeGameVersionIdsByNames(map.game_versions_for_addons, addonGameVersions);
27
+ const environmentIds = findCurseForgeGameVersionIdsByNames(map.environments, environments);
28
+ const curseforgeGameVersionIds = [];
29
+ curseforgeGameVersionIds.push(...gameVersionIds, ...loaderIds, ...javaIds, ...pluginGameVersionIds, ...addonGameVersionIds, ...environmentIds);
30
+ return curseforgeGameVersionIds;
31
+ }
32
+ // 创建一个 CurseForge 游戏版本映射,通过根据类型名称对游戏版本类型进行分类。
33
+ async function createCurseForgeGameVersionMap(apiToken) {
34
+ const { versions, types } = await fetchCurseForgeGameVersionInfo(apiToken);
35
+ return {
36
+ game_versions: filterGameVersionsByTypeName(versions, types, 'minecraft'),
37
+ game_versions_for_plugins: filterGameVersionsByTypeName(versions, types, 'bukkit'),
38
+ game_versions_for_addons: filterGameVersionsByTypeName(versions, types, 'addon'),
39
+ loaders: filterGameVersionsByTypeName(versions, types, 'modloader'),
40
+ java_versions: filterGameVersionsByTypeName(versions, types, 'java'),
41
+ environments: filterGameVersionsByTypeName(versions, types, 'environment'),
42
+ };
43
+ }
44
+ function filterGameVersionsByTypeName(versions, types, typeName) {
45
+ const filteredTypes = types.filter((x) => x.slug.startsWith(typeName));
46
+ return versions.filter((v) => filteredTypes.some((t) => t.id === v.gameVersionTypeID));
47
+ }
48
+ // 获取 CurseForge 游戏版本和版本类型信息
49
+ async function fetchCurseForgeGameVersionInfo(apiToken) {
50
+ const gameVersionsRes = await axios.get('https://minecraft.curseforge.com/api/game/versions', {
51
+ headers: {
52
+ 'X-Api-Token': apiToken,
53
+ },
54
+ });
55
+ const gameVersionTypesRes = await axios.get('https://minecraft.curseforge.com/api/game/version-types', {
56
+ headers: {
57
+ 'X-Api-Token': apiToken,
58
+ },
59
+ });
60
+ const gameVersionTypes = gameVersionTypesRes.data;
61
+ if (!gameVersionTypes.some((x) => x.id === BUKKIT_GAME_VERSION_TYPE.id)) {
62
+ gameVersionTypes.unshift(BUKKIT_GAME_VERSION_TYPE);
63
+ }
64
+ return {
65
+ versions: gameVersionsRes.data,
66
+ types: gameVersionTypes,
67
+ };
68
+ }
69
+ function findCurseForgeGameVersionIdsByNames(versions, names, comparer = (a, b) => a.toLowerCase() === b.toLowerCase(), fallbackComparer) {
70
+ const result = [];
71
+ for (const name of names) {
72
+ let version = versions.find((v) => comparer(v.name, name));
73
+ if (!version && fallbackComparer) {
74
+ version = versions.find((v) => fallbackComparer(v.name, name));
75
+ }
76
+ if (version)
77
+ result.push(version.id);
78
+ }
79
+ return [...new Set(result)];
80
+ }
81
+ /**
82
+ * 比较器:忽略名称中的 "-Snapshot" 后缀
83
+ */
84
+ export const CURSEFORGE_GAME_VERSION_SNAPSHOT_NAME_COMPARER = (a, b) => {
85
+ const normalize = (s) => s?.replace(/-snapshot$/i, '') ?? '';
86
+ return normalize(a).toLowerCase() === normalize(b).toLowerCase();
87
+ };
88
+ //# sourceMappingURL=prepare.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prepare.js","sourceRoot":"","sources":["../src/prepare.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { NextRelease, PublishContext } from 'semantic-release';
2
+ import { Plugin_config } from '../definitions/plugin_config';
3
+ /**
4
+ * 根据 glob 模式查找文件
5
+ */
6
+ export declare function findFiles(patterns: string | string[], context: PublishContext, defaultPatterns?: string[]): Promise<string[]>;
7
+ /**
8
+ * 依次使用 lodash.template 渲染字符串数组。
9
+ * @param templates 字符串模板数组
10
+ * @param context 模板变量上下文对象
11
+ * @returns 渲染后的字符串数组
12
+ */
13
+ export declare function renderTemplates(templates: string[], context: Record<string, any>): string[];
14
+ /**
15
+ * 从多个来源中按优先级选择第一个非空模板并渲染。
16
+ * @param sources 模板字符串来源(优先级从高到低)
17
+ * @param context 模板渲染上下文(传给 lodash.template)
18
+ * @returns 渲染后的字符串或 undefined
19
+ */
20
+ export declare function resolveTemplate(sources: Array<string | undefined | null>, context: Record<string, any>): string | undefined;
21
+ /**
22
+ * 确保给定的值总是以数组形式返回。
23
+ *
24
+ * @param value - 单个项目或项目数组。
25
+ * @returns 如果不是数组,则将值包装在数组中返回。
26
+ */
27
+ export declare function toArray<T>(value: T | T[]): T[];
28
+ export declare function getCurseForgeModLoaders(pluginConfig: Plugin_config, env: Record<string, string>, nextRelease: NextRelease): string[];
29
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAE7D;;GAEG;AACH,wBAAsB,SAAS,CAC3B,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,EAC3B,OAAO,EAAE,cAAc,EACvB,eAAe,GAAE,MAAM,EAGtB,GACF,OAAO,CAAC,MAAM,EAAE,CAAC,CA+BnB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC3B,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,EAAE,CAEV;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC3B,OAAO,EAAE,KAAK,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAC7B,MAAM,GAAG,SAAS,CAUpB;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,EAAE,CAE9C;AAED,wBAAgB,uBAAuB,CACnC,YAAY,EAAE,aAAa,EAC3B,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC3B,WAAW,EAAE,WAAW,GACzB,MAAM,EAAE,CAsBV"}
@@ -0,0 +1,92 @@
1
+ import { glob } from 'glob/dist/esm';
2
+ import { template } from 'lodash';
3
+ import { resolve } from 'path';
4
+ /**
5
+ * 根据 glob 模式查找文件
6
+ */
7
+ export async function findFiles(patterns, context, defaultPatterns = [
8
+ 'build/libs/!(*-@(dev|sources|javadoc)).jar',
9
+ 'build/libs/*-@(dev|sources|javadoc).jar',
10
+ ]) {
11
+ const { logger, cwd } = context;
12
+ // 使用提供的 glob 模式,如果没有则使用默认模式
13
+ const searchPatterns = patterns
14
+ ? Array.isArray(patterns)
15
+ ? patterns
16
+ : [patterns]
17
+ : defaultPatterns;
18
+ const allFiles = [];
19
+ for (const pattern of searchPatterns) {
20
+ logger.log(`Searching for files with pattern: ${pattern}`);
21
+ const files = await glob(pattern, {
22
+ cwd,
23
+ nodir: true,
24
+ });
25
+ allFiles.push(...files);
26
+ }
27
+ // 转换为绝对路径
28
+ const files = allFiles.map((file) => resolve(cwd, file));
29
+ if (files.length === 0) {
30
+ throw new Error(`No files found matching patterns: ${searchPatterns.join(', ')}`);
31
+ }
32
+ return files;
33
+ }
34
+ /**
35
+ * 依次使用 lodash.template 渲染字符串数组。
36
+ * @param templates 字符串模板数组
37
+ * @param context 模板变量上下文对象
38
+ * @returns 渲染后的字符串数组
39
+ */
40
+ export function renderTemplates(templates, context) {
41
+ return templates.map((tpl) => template(tpl)(context));
42
+ }
43
+ /**
44
+ * 从多个来源中按优先级选择第一个非空模板并渲染。
45
+ * @param sources 模板字符串来源(优先级从高到低)
46
+ * @param context 模板渲染上下文(传给 lodash.template)
47
+ * @returns 渲染后的字符串或 undefined
48
+ */
49
+ export function resolveTemplate(sources, context) {
50
+ const source = sources.find(Boolean);
51
+ if (!source)
52
+ return undefined;
53
+ try {
54
+ return template(source)(context);
55
+ }
56
+ catch (err) {
57
+ console.error('Failed to render template:', err);
58
+ return undefined;
59
+ }
60
+ }
61
+ /**
62
+ * 确保给定的值总是以数组形式返回。
63
+ *
64
+ * @param value - 单个项目或项目数组。
65
+ * @returns 如果不是数组,则将值包装在数组中返回。
66
+ */
67
+ export function toArray(value) {
68
+ return Array.isArray(value) ? value : [value];
69
+ }
70
+ export function getCurseForgeModLoaders(pluginConfig, env, nextRelease) {
71
+ const curseforge = pluginConfig.curseforge;
72
+ let modLoaders;
73
+ if (curseforge?.mod_loaders && curseforge.mod_loaders.length > 0) {
74
+ modLoaders = renderTemplates(toArray(curseforge.mod_loaders), {
75
+ nextRelease,
76
+ });
77
+ }
78
+ else if (pluginConfig.mod_loaders &&
79
+ pluginConfig.mod_loaders.length > 0) {
80
+ modLoaders = renderTemplates(toArray(pluginConfig.mod_loaders), {
81
+ nextRelease,
82
+ });
83
+ }
84
+ else if (env.CURSEFORGE_MOD_LOADERS) {
85
+ modLoaders = env.CURSEFORGE_MOD_LOADERS.split(',').map((s) => s.trim());
86
+ }
87
+ else if (env.MOD_LOADERS) {
88
+ modLoaders = env.MOD_LOADERS.split(',').map((s) => s.trim());
89
+ }
90
+ return modLoaders || [];
91
+ }
92
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import typescriptEslint from 'typescript-eslint';
2
+ import prettier from 'eslint-plugin-prettier';
3
+ import prettierConfig from 'eslint-config-prettier';
4
+
5
+ export default typescriptEslint.config({
6
+ files: ['src/**/*.ts'],
7
+ plugins: {
8
+ '@typescript-eslint': typescriptEslint.plugin,
9
+ prettier,
10
+ },
11
+ languageOptions: {
12
+ parser: typescriptEslint.parser,
13
+ parserOptions: {
14
+ project: true,
15
+ },
16
+ },
17
+ rules: {
18
+ ...typescriptEslint.configs.recommended.rules,
19
+ ...prettierConfig.rules,
20
+ 'prettier/prettier': ['error']
21
+ },
22
+ });
package/package.json ADDED
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "semantic-release-minecraft",
3
+ "version": "1.0.0",
4
+ "description": "Automated Release For Minecraft Project",
5
+ "keywords": [
6
+ "semantic-release",
7
+ "minecraft",
8
+ "automation"
9
+ ],
10
+ "author": "ENC_Euphony <2330458484@qq.com>",
11
+ "license": "MIT",
12
+ "main": "dist/index.js",
13
+ "types": "dist/index.d.ts",
14
+ "type": "module",
15
+ "scripts": {
16
+ "lint": "eslint ./src --ext .ts",
17
+ "lint:fix": "eslint ./src --ext .ts --fix",
18
+ "build": "tsc",
19
+ "prepublishOnly": "npm run build",
20
+ "semantic-release": "semantic-release"
21
+ },
22
+ "devDependencies": {
23
+ "@trivago/prettier-plugin-sort-imports": "^5.2.2",
24
+ "@types/node": "^24.8.1",
25
+ "@types/lodash": "^4.17.20",
26
+ "eslint": "^9.38.0",
27
+ "eslint-config-prettier": "^10.1.8",
28
+ "eslint-plugin-prettier": "^5.5.4",
29
+ "prettier": "^3.6.2",
30
+ "semantic-release": "^25.0.0",
31
+ "@semantic-release/changelog": "^6.0.3",
32
+ "@semantic-release/commit-analyzer": "^13.0.1",
33
+ "@semantic-release/git": "^10.0.1",
34
+ "@semantic-release/npm": "^13.0.0",
35
+ "@semantic-release/release-notes-generator": "^14.1.0",
36
+ "conventional-changelog-conventionalcommits": "^9.1.0",
37
+ "typescript": "^5.9.3",
38
+ "typescript-eslint": "^8.46.1"
39
+ },
40
+ "peerDependencies": {
41
+ "semantic-release": ">=18.0.0"
42
+ },
43
+ "dependencies": {
44
+ "axios": "^1.12.2",
45
+ "form-data": "^4.0.4",
46
+ "glob": "^11.0.3",
47
+ "lodash": "^4.17.21"
48
+ }
49
+ }