node-karin 1.12.0 → 1.12.1

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 CHANGED
@@ -1,5 +1,12 @@
1
1
  # 更新日志
2
2
 
3
+ ## [1.12.1](https://github.com/KarinJS/Karin/compare/core-v1.12.0...core-v1.12.1) (2025-10-17)
4
+
5
+
6
+ ### 🐛 Bug Fixes
7
+
8
+ * Support all semantic versioning formats in changelog parser ([#566](https://github.com/KarinJS/Karin/issues/566)) ([de6b397](https://github.com/KarinJS/Karin/commit/de6b397ebb9fdba85d8b5999a96ed29bb1da9dd8))
9
+
3
10
  ## [1.12.0](https://github.com/KarinJS/Karin/compare/core-v1.11.6...core-v1.12.0) (2025-10-15)
4
11
 
5
12
 
package/dist/index.d.ts CHANGED
@@ -8327,28 +8327,36 @@ declare const lock: {
8327
8327
 
8328
8328
  /**
8329
8329
  * 提取指定版本号的更新日志
8330
- * @param version 版本号
8331
- * @param data `CHANGELOG.md`文件内容
8332
- * @returns 更新日志
8330
+ * @param version 版本号,可包含预发布/构建元数据(如 `-beta`)
8331
+ * @param data `CHANGELOG.md` 文件内容
8332
+ * @returns 命中的更新日志字符串;无法定位返回 `null`
8333
+ * @description
8334
+ * - 先将版本规范化为稳定版 `x.y.z`;
8335
+ * - 不存在时按新 -> 旧顺序回退到不超过目标稳定版的最新版本。
8333
8336
  */
8334
8337
  declare const log: (version: string, data: string) => string | null;
8335
8338
  /**
8336
- * 提取指定范围版本号的更新日志
8339
+ * 从指定版本开始提取连续的更新日志
8337
8340
  * @param version 起始版本号
8338
- * @param data `CHANGELOG.md`文件内容
8339
- * @param length 提取长度
8340
- * @param reverse 是否反向提取 默认为`false`向后提取
8341
+ * @param data `CHANGELOG.md` 文件内容
8342
+ * @param length 提取条数,默认为 1
8343
+ * @param reverse 是否反向提取;`false` 向后,`true` 向前
8344
+ * @returns 拼接后的更新日志字符串;找不到起始版本返回空字符串
8345
+ * @description
8346
+ * - 起始版本会规范化并回退到不超过目标稳定版的最新版本;
8347
+ * - 切片范围将做边界裁剪以避免越界。
8341
8348
  */
8342
8349
  declare const logs: (version: string, data: string, length?: number, reverse?: boolean) => string;
8343
8350
  /**
8344
- * 提取指定版本号之间的更新日志
8345
- * @param data `CHANGELOG.md`文件内容
8346
- * @param startVersion 起始版本号
8347
- * @param endVersion 结束版本号
8351
+ * 提取指定版本区间的更新日志
8352
+ * @param data `CHANGELOG.md` 文件内容
8353
+ * @param startVersion 起始版本号(较旧)
8354
+ * @param endVersion 结束版本号(较新)
8355
+ * @returns 拼接后的更新日志字符串;若任一版本无法定位返回空字符串
8348
8356
  * @description
8349
- * - `CHANGELOG.md`的版本号排序约定为从新到旧
8350
- * - 也就是说 结束版本号应该比起始版本号新
8351
- * - 举例: `range(data, '1.0.0', '2.0.0')` 提取`1.0.0`到`2.0.0`之间的更新日志
8357
+ * - CHANGELOG 的版本排序约定为从新到旧;
8358
+ * - 若传入版本不存在,将回退到不超过目标稳定版的最新版本;
8359
+ * - `start > end` 时会自动调整为有效区间。
8352
8360
  */
8353
8361
  declare const range: (data: string, startVersion: string, endVersion: string) => string;
8354
8362
  /**
package/dist/index.mjs CHANGED
@@ -1960,11 +1960,15 @@ __export(changelog_exports, {
1960
1960
  parseChangelog: () => parseChangelog,
1961
1961
  range: () => range
1962
1962
  });
1963
- var log, logs, range, parseChangelog;
1963
+ var escapeRegex, log, logs, range, parseChangelog, normalizeStableVersion, parseSemverParts, compareSemver, findFallbackVersionKey;
1964
1964
  var init_changelog = __esm({
1965
1965
  "src/utils/fs/changelog.ts"() {
1966
+ escapeRegex = (str) => {
1967
+ return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
1968
+ };
1966
1969
  log = (version2, data) => {
1967
- const regex = new RegExp(`## \\[${version2}\\](.|\\n)*?(?=## \\[|$)`, "g");
1970
+ const escapedVersion = escapeRegex(version2);
1971
+ const regex = new RegExp(`## \\[${escapedVersion}\\](.|\\n)*?(?=## \\[|$)`, "g");
1968
1972
  const match = data.match(regex);
1969
1973
  return match ? match[0] : null;
1970
1974
  };
@@ -1974,17 +1978,24 @@ var init_changelog = __esm({
1974
1978
  }
1975
1979
  const list2 = parseChangelog(data);
1976
1980
  const keys = Object.keys(list2);
1977
- const index5 = keys.indexOf(version2);
1981
+ const startKey = findFallbackVersionKey(keys, version2);
1982
+ if (!startKey) return "";
1983
+ const index5 = keys.indexOf(startKey);
1978
1984
  const start3 = reverse ? index5 - length : index5;
1979
1985
  const end = reverse ? index5 : index5 + length;
1980
- const versions = keys.slice(start3, end).map((key) => list2[key] ? list2[key] : "");
1986
+ const sliceStart = Math.max(0, start3);
1987
+ const sliceEnd = Math.min(keys.length, end);
1988
+ const versions = keys.slice(sliceStart, sliceEnd).map((key) => list2[key] ? list2[key] : "");
1981
1989
  return versions.join("");
1982
1990
  };
1983
1991
  range = (data, startVersion, endVersion) => {
1984
1992
  const list2 = parseChangelog(data);
1985
1993
  const keys = Object.keys(list2);
1986
- const start3 = keys.indexOf(startVersion);
1987
- const end = keys.indexOf(endVersion);
1994
+ const startKey = findFallbackVersionKey(keys, startVersion);
1995
+ const endKey = findFallbackVersionKey(keys, endVersion);
1996
+ if (!startKey || !endKey) return "";
1997
+ const start3 = keys.indexOf(startKey);
1998
+ const end = keys.indexOf(endKey);
1988
1999
  if (start3 > end) {
1989
2000
  const versions2 = keys.slice(end, start3).map((key) => list2[key] ? list2[key] : "");
1990
2001
  return versions2.join("");
@@ -2002,6 +2013,38 @@ var init_changelog = __esm({
2002
2013
  }
2003
2014
  return changelog;
2004
2015
  };
2016
+ normalizeStableVersion = (ver) => {
2017
+ const m = ver.match(/(\d+)\.(\d+)\.(\d+)/);
2018
+ return m ? `${m[1]}.${m[2]}.${m[3]}` : ver;
2019
+ };
2020
+ parseSemverParts = (ver) => {
2021
+ const v = normalizeStableVersion(ver);
2022
+ const m = v.match(/^(\d+)\.(\d+)\.(\d+)$/);
2023
+ return m ? [parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10)] : null;
2024
+ };
2025
+ compareSemver = (a, b) => {
2026
+ const pa = parseSemverParts(a);
2027
+ const pb = parseSemverParts(b);
2028
+ if (!pa && !pb) return 0;
2029
+ if (!pa) return -1;
2030
+ if (!pb) return 1;
2031
+ if (pa[0] !== pb[0]) return pa[0] - pb[0];
2032
+ if (pa[1] !== pb[1]) return pa[1] - pb[1];
2033
+ if (pa[2] !== pb[2]) return pa[2] - pb[2];
2034
+ return 0;
2035
+ };
2036
+ findFallbackVersionKey = (keys, input2) => {
2037
+ if (keys.includes(input2)) return input2;
2038
+ const target = normalizeStableVersion(input2);
2039
+ if (keys.includes(target)) return target;
2040
+ for (const key of keys) {
2041
+ const kval = normalizeStableVersion(key);
2042
+ if (compareSemver(kval, target) <= 0) {
2043
+ return key;
2044
+ }
2045
+ }
2046
+ return null;
2047
+ };
2005
2048
  }
2006
2049
  });
2007
2050
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "node-karin",
3
- "version": "1.12.0",
3
+ "version": "1.12.1",
4
4
  "description": "Lightweight, efficient, concise, and stable robot framework.",
5
5
  "keywords": [
6
6
  "node",