promptex-js 1.1.0 → 1.1.1-rc.2
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/cli/main.js +4 -4
- package/dist/cli/stdout.js +8 -1
- package/dist/version.d.ts +12 -2
- package/dist/version.js +79 -10
- package/package.json +7 -7
package/dist/cli/main.js
CHANGED
|
@@ -153,7 +153,7 @@ function writeHuman(text) {
|
|
|
153
153
|
if (STRUCTURED_OUTPUT)
|
|
154
154
|
console.error(text);
|
|
155
155
|
else
|
|
156
|
-
|
|
156
|
+
writeStructuredLine(text);
|
|
157
157
|
}
|
|
158
158
|
/**
|
|
159
159
|
* 用法字串。以函式承載而非模組層常數:語系在旗標解析完才設定(見下方 `setLocale`
|
|
@@ -751,7 +751,7 @@ function present(request) {
|
|
|
751
751
|
if (toStderr)
|
|
752
752
|
console.error(line.text);
|
|
753
753
|
else
|
|
754
|
-
|
|
754
|
+
writeStructuredLine(line.text);
|
|
755
755
|
}
|
|
756
756
|
}
|
|
757
757
|
/**
|
|
@@ -781,7 +781,7 @@ function printManifestQuery({ platform, unit, installRoot, supported, nodes = []
|
|
|
781
781
|
if (STRUCTURED_OUTPUT)
|
|
782
782
|
console.error(query);
|
|
783
783
|
else
|
|
784
|
-
|
|
784
|
+
writeStructuredLine(query);
|
|
785
785
|
}
|
|
786
786
|
/**
|
|
787
787
|
* 內建平台各寫入模式的結果。逐行清單由核心給,查詢指令的 JSON 另行組裝:後者
|
|
@@ -1375,7 +1375,7 @@ function printNotices(notices) {
|
|
|
1375
1375
|
if (notice.stream === 'err' || STRUCTURED_OUTPUT)
|
|
1376
1376
|
console.error(notice.text);
|
|
1377
1377
|
else
|
|
1378
|
-
|
|
1378
|
+
writeStructuredLine(notice.text);
|
|
1379
1379
|
}
|
|
1380
1380
|
}
|
|
1381
1381
|
/**
|
package/dist/cli/stdout.js
CHANGED
|
@@ -9,6 +9,10 @@
|
|
|
9
9
|
// 改以 `writeSync` 直接寫檔案描述子並寫到全部送出。`process.stdout` 一旦初始化,
|
|
10
10
|
// 描述子會被設成非阻塞:`writeSync` 可能只寫進一部分就返回,也可能在緩衝區
|
|
11
11
|
// 滿時拋 `EAGAIN`,所以要依回傳的位元組數續寫,遇到 `EAGAIN` 稍等再試。
|
|
12
|
+
//
|
|
13
|
+
// 讀端提早關閉管線(`promptex build . | head -1`)時 `writeSync` 拋 `EPIPE`。
|
|
14
|
+
// `console.log` 在這種情形會安靜結束,所以這裡也直接以 0 結束行程:沒有讀者,
|
|
15
|
+
// 後面的輸出寫了也沒人收,往上拋只會在終端機印一份堆疊。
|
|
12
16
|
import { writeSync } from 'node:fs';
|
|
13
17
|
const STDOUT_FD = 1;
|
|
14
18
|
/** `EAGAIN` 時的等待:`Atomics.wait` 是同步程式裡唯一不空轉的睡眠。 */
|
|
@@ -22,7 +26,10 @@ export function writeStructuredLine(text) {
|
|
|
22
26
|
offset += writeSync(STDOUT_FD, bytes, offset);
|
|
23
27
|
}
|
|
24
28
|
catch (error) {
|
|
25
|
-
|
|
29
|
+
const code = error.code;
|
|
30
|
+
if (code === 'EPIPE')
|
|
31
|
+
process.exit(0);
|
|
32
|
+
if (code !== 'EAGAIN')
|
|
26
33
|
throw error;
|
|
27
34
|
Atomics.wait(pause, 0, 0, 1);
|
|
28
35
|
}
|
package/dist/version.d.ts
CHANGED
|
@@ -6,10 +6,16 @@ interface SemVer {
|
|
|
6
6
|
readonly patch: number;
|
|
7
7
|
}
|
|
8
8
|
export interface VersionRange {
|
|
9
|
-
|
|
9
|
+
/** 宣告的版本;宣告帶預發布識別(如 `^1.1.1-rc.1`)時,預發布識別放在選填的 `pre`。 */
|
|
10
|
+
readonly floor: SemVer & {
|
|
11
|
+
readonly pre?: readonly string[];
|
|
12
|
+
};
|
|
10
13
|
readonly ceiling: SemVer;
|
|
11
14
|
}
|
|
12
|
-
/**
|
|
15
|
+
/**
|
|
16
|
+
* 解析單一 caret 前綴範圍(如 `^2.0.0`);缺前綴或版本格式不符回傳 null。
|
|
17
|
+
* 宣告帶預發布識別時,`floor.pre` 列出各段(正式版沒有這個欄位)。
|
|
18
|
+
*/
|
|
13
19
|
export declare function parseCaretRange(raw: string): VersionRange | null;
|
|
14
20
|
export type VersionCheckResult = {
|
|
15
21
|
readonly compatible: true;
|
|
@@ -28,6 +34,10 @@ export type VersionCheckResult = {
|
|
|
28
34
|
* 需要升級:`framework-too-old`(已安裝版本低於範圍下限)或
|
|
29
35
|
* `extension-too-old`(已安裝版本達到或超過範圍上限,擴充尚未宣告支援)。
|
|
30
36
|
*
|
|
37
|
+
* 兩端的版本都可帶預發布識別(如 `1.1.1-rc.1`),比較照 SemVer 2.0.0 優先序:
|
|
38
|
+
* 預發布小於同核心的正式版。範圍的 floor 保留預發布,ceiling 不帶預發布,
|
|
39
|
+
* 所以 `2.0.0-rc.1` 對 `^1.1.1-rc.1` 判為相容(它小於 ceiling `2.0.0`)。
|
|
40
|
+
*
|
|
31
41
|
* `frameworkVersion` 恆為 SDK 自身 `package.json` 的 `version` 欄位(呼叫端
|
|
32
42
|
* 內部提供,非使用者輸入),格式不符視為框架自身的不變式被打破,直接拋出
|
|
33
43
|
* 而非收斂為 Diagnostic;`declaredRange` 才是擴充作者的輸入,格式不符時
|
package/dist/version.js
CHANGED
|
@@ -9,33 +9,86 @@
|
|
|
9
9
|
// 重造一個小型 semver 引擎;單一 caret 前綴涵蓋「擴充相容從某版本起、同主
|
|
10
10
|
// 版本全部釋出」這個絕大多數情境,規則一句話能講完,可預測性優先於表達力。
|
|
11
11
|
import { t } from './i18n.js';
|
|
12
|
-
|
|
12
|
+
const NUMERIC = /^[0-9]+$/;
|
|
13
|
+
const PRE_ID = /^[0-9A-Za-z-]+$/;
|
|
14
|
+
const CORE = /^([0-9]+)\.([0-9]+)\.([0-9]+)$/;
|
|
15
|
+
function isValidPreId(id) {
|
|
16
|
+
if (!PRE_ID.test(id))
|
|
17
|
+
return false;
|
|
18
|
+
// 純數字段不得有前導零(單獨的 "0" 合法)。
|
|
19
|
+
return !(NUMERIC.test(id) && id.length > 1 && id.startsWith('0'));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 解析 `MAJOR.MINOR.PATCH` 加選填的 `-<預發布識別>`(不含前綴),格式不符回傳
|
|
23
|
+
* null。預發布識別照 SemVer 2.0.0:以 `.` 分段,每段非空、只含 `[0-9A-Za-z-]`,
|
|
24
|
+
* 純數字段不得有前導零。build metadata(`+...`)不接受。
|
|
25
|
+
*/
|
|
13
26
|
function parseVersion(raw) {
|
|
14
|
-
const
|
|
27
|
+
const text = raw.trim();
|
|
28
|
+
const dash = text.indexOf('-');
|
|
29
|
+
const corePart = dash === -1 ? text : text.slice(0, dash);
|
|
30
|
+
const match = CORE.exec(corePart);
|
|
15
31
|
if (!match)
|
|
16
32
|
return null;
|
|
17
|
-
|
|
33
|
+
const pre = dash === -1 ? [] : text.slice(dash + 1).split('.');
|
|
34
|
+
if (!pre.every(isValidPreId))
|
|
35
|
+
return null;
|
|
36
|
+
return { major: Number(match[1]), minor: Number(match[2]), patch: Number(match[3]), pre };
|
|
18
37
|
}
|
|
38
|
+
/** 預發布單段比較:數字段小於英數段;數字段先比長度再逐字(無前導零時等於數值比),英數段以 ASCII 字典序。 */
|
|
39
|
+
function comparePreId(a, b) {
|
|
40
|
+
const aNumeric = NUMERIC.test(a);
|
|
41
|
+
const bNumeric = NUMERIC.test(b);
|
|
42
|
+
if (aNumeric && bNumeric) {
|
|
43
|
+
if (a.length !== b.length)
|
|
44
|
+
return a.length - b.length;
|
|
45
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
46
|
+
}
|
|
47
|
+
if (aNumeric)
|
|
48
|
+
return -1;
|
|
49
|
+
if (bNumeric)
|
|
50
|
+
return 1;
|
|
51
|
+
return a < b ? -1 : a > b ? 1 : 0;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* SemVer 2.0.0 §11 優先序:先比核心;核心相同時,有預發布者小於沒有者;
|
|
55
|
+
* 兩者都有預發布時逐段比,前段全同則段數少者較小。
|
|
56
|
+
*/
|
|
19
57
|
function compare(a, b) {
|
|
20
58
|
if (a.major !== b.major)
|
|
21
59
|
return a.major - b.major;
|
|
22
60
|
if (a.minor !== b.minor)
|
|
23
61
|
return a.minor - b.minor;
|
|
24
|
-
|
|
62
|
+
if (a.patch !== b.patch)
|
|
63
|
+
return a.patch - b.patch;
|
|
64
|
+
if (a.pre.length === 0 && b.pre.length === 0)
|
|
65
|
+
return 0;
|
|
66
|
+
if (a.pre.length === 0)
|
|
67
|
+
return 1;
|
|
68
|
+
if (b.pre.length === 0)
|
|
69
|
+
return -1;
|
|
70
|
+
const shared = Math.min(a.pre.length, b.pre.length);
|
|
71
|
+
for (let i = 0; i < shared; i += 1) {
|
|
72
|
+
const order = comparePreId(a.pre[i], b.pre[i]);
|
|
73
|
+
if (order !== 0)
|
|
74
|
+
return order;
|
|
75
|
+
}
|
|
76
|
+
return a.pre.length - b.pre.length;
|
|
25
77
|
}
|
|
26
78
|
/**
|
|
27
79
|
* caret 範圍的相容區間 [floor, ceiling):與 npm 語意一致,floor 即宣告本身,
|
|
28
80
|
* ceiling 是「下一個可能引入不相容變動的版本」──主版本非 0 時為下一個主
|
|
29
81
|
* 版本,主版本為 0 時退化為下一個副版本(0.x 系列慣例上副版本即可能不
|
|
30
|
-
* 相容,之下的每個版本都當作獨立的相容單元)。
|
|
82
|
+
* 相容,之下的每個版本都當作獨立的相容單元)。ceiling 不帶預發布,所以
|
|
83
|
+
* 預發布的下一主版本(如 `2.0.0-rc.1`)小於 ceiling,仍判為相容。
|
|
31
84
|
*/
|
|
32
85
|
function caretCeiling(floor) {
|
|
33
86
|
if (floor.major > 0)
|
|
34
|
-
return { major: floor.major + 1, minor: 0, patch: 0 };
|
|
35
|
-
return { major: 0, minor: floor.minor + 1, patch: 0 };
|
|
87
|
+
return { major: floor.major + 1, minor: 0, patch: 0, pre: [] };
|
|
88
|
+
return { major: 0, minor: floor.minor + 1, patch: 0, pre: [] };
|
|
36
89
|
}
|
|
37
|
-
/**
|
|
38
|
-
|
|
90
|
+
/** 內部用的範圍:floor 與 ceiling 都是完整的 ParsedVersion,floor 保留預發布。 */
|
|
91
|
+
function parseRange(raw) {
|
|
39
92
|
if (!raw.startsWith('^'))
|
|
40
93
|
return null;
|
|
41
94
|
const floor = parseVersion(raw.slice(1));
|
|
@@ -43,18 +96,34 @@ export function parseCaretRange(raw) {
|
|
|
43
96
|
return null;
|
|
44
97
|
return { floor, ceiling: caretCeiling(floor) };
|
|
45
98
|
}
|
|
99
|
+
/**
|
|
100
|
+
* 解析單一 caret 前綴範圍(如 `^2.0.0`);缺前綴或版本格式不符回傳 null。
|
|
101
|
+
* 宣告帶預發布識別時,`floor.pre` 列出各段(正式版沒有這個欄位)。
|
|
102
|
+
*/
|
|
103
|
+
export function parseCaretRange(raw) {
|
|
104
|
+
const range = parseRange(raw);
|
|
105
|
+
if (!range)
|
|
106
|
+
return null;
|
|
107
|
+
const { pre, ...core } = range.floor;
|
|
108
|
+
const { major, minor, patch } = range.ceiling;
|
|
109
|
+
return { floor: pre.length > 0 ? { ...core, pre } : core, ceiling: { major, minor, patch } };
|
|
110
|
+
}
|
|
46
111
|
/**
|
|
47
112
|
* 已安裝框架版本是否落在擴充宣告的相容範圍內;不相容時 `reason` 指出哪一方
|
|
48
113
|
* 需要升級:`framework-too-old`(已安裝版本低於範圍下限)或
|
|
49
114
|
* `extension-too-old`(已安裝版本達到或超過範圍上限,擴充尚未宣告支援)。
|
|
50
115
|
*
|
|
116
|
+
* 兩端的版本都可帶預發布識別(如 `1.1.1-rc.1`),比較照 SemVer 2.0.0 優先序:
|
|
117
|
+
* 預發布小於同核心的正式版。範圍的 floor 保留預發布,ceiling 不帶預發布,
|
|
118
|
+
* 所以 `2.0.0-rc.1` 對 `^1.1.1-rc.1` 判為相容(它小於 ceiling `2.0.0`)。
|
|
119
|
+
*
|
|
51
120
|
* `frameworkVersion` 恆為 SDK 自身 `package.json` 的 `version` 欄位(呼叫端
|
|
52
121
|
* 內部提供,非使用者輸入),格式不符視為框架自身的不變式被打破,直接拋出
|
|
53
122
|
* 而非收斂為 Diagnostic;`declaredRange` 才是擴充作者的輸入,格式不符時
|
|
54
123
|
* 回傳 `malformed-range` 供呼叫端轉為使用者可見的診斷。
|
|
55
124
|
*/
|
|
56
125
|
export function checkVersionCompatibility(frameworkVersion, declaredRange) {
|
|
57
|
-
const range =
|
|
126
|
+
const range = parseRange(declaredRange);
|
|
58
127
|
if (!range)
|
|
59
128
|
return { compatible: false, reason: 'malformed-range' };
|
|
60
129
|
const framework = parseVersion(frameworkVersion);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "promptex-js",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.1-rc.2",
|
|
4
4
|
"description": "TypeScript SDK、核心的預編譯二進位綁定與命令列工具,三者為同一次發布產出",
|
|
5
5
|
"license": "MIT OR Apache-2.0",
|
|
6
6
|
"author": "promptex-ai",
|
|
@@ -74,11 +74,11 @@
|
|
|
74
74
|
"vitest": "^4.1.11"
|
|
75
75
|
},
|
|
76
76
|
"optionalDependencies": {
|
|
77
|
-
"promptex-js-darwin-arm64": "1.1.
|
|
78
|
-
"promptex-js-darwin-x64": "1.1.
|
|
79
|
-
"promptex-js-linux-arm64-gnu": "1.1.
|
|
80
|
-
"promptex-js-linux-x64-gnu": "1.1.
|
|
81
|
-
"promptex-js-win32-arm64-msvc": "1.1.
|
|
82
|
-
"promptex-js-win32-x64-msvc": "1.1.
|
|
77
|
+
"promptex-js-darwin-arm64": "1.1.1-rc.2",
|
|
78
|
+
"promptex-js-darwin-x64": "1.1.1-rc.2",
|
|
79
|
+
"promptex-js-linux-arm64-gnu": "1.1.1-rc.2",
|
|
80
|
+
"promptex-js-linux-x64-gnu": "1.1.1-rc.2",
|
|
81
|
+
"promptex-js-win32-arm64-msvc": "1.1.1-rc.2",
|
|
82
|
+
"promptex-js-win32-x64-msvc": "1.1.1-rc.2"
|
|
83
83
|
}
|
|
84
84
|
}
|