@yarn-tool/detect-package-manager 1.0.4 → 1.0.6
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 +35 -0
- package/README.md +47 -12
- package/index.d.ts +61 -14
- package/index.js +82 -36
- package/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,41 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.0.6](https://github.com/bluelovers/ws-yarn-workspaces/compare/@yarn-tool/detect-package-manager@1.0.5...@yarn-tool/detect-package-manager@1.0.6) (2026-03-10)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
### BREAKING CHANGES
|
|
10
|
+
|
|
11
|
+
* **detect-package-manager:** 過濾 npmClients 陣列中的 null、undefined 和空值
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### 🐛 Bug Fixes
|
|
16
|
+
|
|
17
|
+
* **detect-package-manager:** 過濾 npmClients 陣列中的 null、undefined 和空值 ([c19b988](https://github.com/bluelovers/ws-yarn-workspaces/commit/c19b988b4a1c06fd5e319d4655d9f64b77fd73df))
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
## [1.0.5](https://github.com/bluelovers/ws-yarn-workspaces/compare/@yarn-tool/detect-package-manager@1.0.4...@yarn-tool/detect-package-manager@1.0.5) (2026-03-09)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
### BREAKING CHANGES
|
|
25
|
+
|
|
26
|
+
* **detect-package-manager:** The second parameter now accepts boolean or IOptionsWhichPackageManager object instead of just boolean
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
### 📦 Code Refactoring
|
|
31
|
+
|
|
32
|
+
* **detect-package-manager:** add IOptionsWhichPackageManager interface and noUseDefaultClients option ([98a8ae4](https://github.com/bluelovers/ws-yarn-workspaces/commit/98a8ae4a4b9a6814064fc2cae8cf475f68b11469))
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
### ♻️ Chores
|
|
36
|
+
|
|
37
|
+
* **detect-package-manager:** 新增 `.nx` 到 .gitignore ([eddc452](https://github.com/bluelovers/ws-yarn-workspaces/commit/eddc452f1e047a79fa05baefeaede97c5df36741))
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
6
41
|
## [1.0.4](https://github.com/bluelovers/ws-yarn-workspaces/compare/@yarn-tool/detect-package-manager@1.0.3...@yarn-tool/detect-package-manager@1.0.4) (2026-03-09)
|
|
7
42
|
|
|
8
43
|
**Note:** Version bump only for package @yarn-tool/detect-package-manager
|
package/README.md
CHANGED
|
@@ -30,65 +30,89 @@ type IPackageManager = 'yarn' | 'npm' | 'pnpm';
|
|
|
30
30
|
type IResultDetectPackageManagerRaw = readonly [IPackageManager, string?];
|
|
31
31
|
```
|
|
32
32
|
|
|
33
|
+
### IOptionsWhichPackageManager
|
|
34
|
+
|
|
35
|
+
選項配置類型 (Options configuration type)
|
|
36
|
+
|
|
37
|
+
```typescript
|
|
38
|
+
interface IOptionsWhichPackageManager {
|
|
39
|
+
/** 當找不到時是否返回預設值 / Whether to return default when not found */
|
|
40
|
+
returnDefault?: boolean;
|
|
41
|
+
/**
|
|
42
|
+
* 只使用使用者指定的套件管理器
|
|
43
|
+
* 不合併使用者指定的優先順序與預設順序
|
|
44
|
+
*/
|
|
45
|
+
noUseDefaultClients?: boolean;
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### IRuntimeOptionInput
|
|
50
|
+
|
|
51
|
+
_runtime 選項輸入類型 - 可接受布林值或 IOptionsWhichPackageManager 物件
|
|
52
|
+
|
|
53
|
+
```typescript
|
|
54
|
+
type IRuntimeOptionInput = boolean | IOptionsWhichPackageManager;
|
|
55
|
+
```
|
|
56
|
+
|
|
33
57
|
## API (API)
|
|
34
58
|
|
|
35
|
-
### whichPackageManagerSync(npmClients?: IPackageManager[],
|
|
59
|
+
### whichPackageManagerSync(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): IPackageManager | undefined
|
|
36
60
|
|
|
37
61
|
同步偵測第一個可用的套件管理器
|
|
38
62
|
|
|
39
63
|
**參數 (Parameters):**
|
|
40
64
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
41
|
-
- `
|
|
65
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
42
66
|
|
|
43
67
|
**回傳 (Returns):** 第一個可用的套件管理器名稱或 `undefined`
|
|
44
68
|
|
|
45
|
-
### whichPackageManagerSyncAll(npmClients?: IPackageManager[],
|
|
69
|
+
### whichPackageManagerSyncAll(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): IPackageManager[]
|
|
46
70
|
|
|
47
71
|
同步偵測所有可用的套件管理器
|
|
48
72
|
|
|
49
73
|
**參數 (Parameters):**
|
|
50
74
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
51
|
-
- `
|
|
75
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
52
76
|
|
|
53
77
|
**回傳 (Returns):** 所有可用的套件管理器陣列
|
|
54
78
|
|
|
55
|
-
### whichPackageManagerAsync(npmClients?: IPackageManager[],
|
|
79
|
+
### whichPackageManagerAsync(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager>
|
|
56
80
|
|
|
57
81
|
非同步偵測第一個可用的套件管理器
|
|
58
82
|
|
|
59
83
|
**參數 (Parameters):**
|
|
60
84
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
61
|
-
- `
|
|
85
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
62
86
|
|
|
63
87
|
**回傳 (Returns):** Promise resolves to 第一個可用的套件管理器名稱或 `undefined`
|
|
64
88
|
|
|
65
|
-
### whichPackageManagerAsyncAll(npmClients?: IPackageManager[],
|
|
89
|
+
### whichPackageManagerAsyncAll(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager[]>
|
|
66
90
|
|
|
67
91
|
非同步偵測所有可用的套件管理器
|
|
68
92
|
|
|
69
93
|
**參數 (Parameters):**
|
|
70
94
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
71
|
-
- `
|
|
95
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
72
96
|
|
|
73
97
|
**回傳 (Returns):** Promise resolves to 所有可用的套件管理器陣列
|
|
74
98
|
|
|
75
|
-
### _whichPackageManagerSyncGenerator(npmClients?: IPackageManager[],
|
|
99
|
+
### _whichPackageManagerSyncGenerator(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): Generator<IResultDetectPackageManagerRaw>
|
|
76
100
|
|
|
77
101
|
同步生成器版本,回傳包含路徑的結果
|
|
78
102
|
|
|
79
103
|
**參數 (Parameters):**
|
|
80
104
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
81
|
-
- `
|
|
105
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
82
106
|
|
|
83
107
|
**回傳 (Returns):** Generator yields `[packageManager, commandPath]` tuples
|
|
84
108
|
|
|
85
|
-
### _whichPackageManagerAsyncGenerator(npmClients?: IPackageManager[],
|
|
109
|
+
### _whichPackageManagerAsyncGenerator(npmClients?: IPackageManager[], returnDefaultOrOptions?: IRuntimeOptionInput): AsyncGenerator<IResultDetectPackageManagerRaw>
|
|
86
110
|
|
|
87
111
|
非同步生成器版本,回傳包含路徑的結果
|
|
88
112
|
|
|
89
113
|
**參數 (Parameters):**
|
|
90
114
|
- `npmClients?`: 自訂套件管理器列表(可選)/ Custom package manager list (optional)
|
|
91
|
-
- `
|
|
115
|
+
- `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
|
|
92
116
|
|
|
93
117
|
**回傳 (Returns):** AsyncGenerator yields `[packageManager, commandPath]` tuples
|
|
94
118
|
|
|
@@ -147,4 +171,15 @@ for (const [pm, path] of _whichPackageManagerSyncGenerator()) {
|
|
|
147
171
|
for await (const [pm, path] of _whichPackageManagerAsyncGenerator()) {
|
|
148
172
|
console.log(`Found ${pm} at ${path}`);
|
|
149
173
|
}
|
|
174
|
+
|
|
175
|
+
// 使用布林值參數 - 當找不到時返回預設值
|
|
176
|
+
const pmWithDefault = whichPackageManagerSync(['yarn'], true);
|
|
177
|
+
console.log(pmWithDefault); // 如果 yarn 找不到,會返回 'pnpm' (預設順序的第一個)
|
|
178
|
+
|
|
179
|
+
// 使用選項物件參數
|
|
180
|
+
const pmWithOptions = whichPackageManagerSync(['yarn'], {
|
|
181
|
+
returnDefault: true,
|
|
182
|
+
noUseDefaultClients: false,
|
|
183
|
+
});
|
|
184
|
+
console.log(pmWithOptions);
|
|
150
185
|
```
|
package/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ITSAsyncGenerator, ITSGenerator, ITSTypeAndStringLiteral } from 'ts-type';
|
|
1
|
+
import { ITSAsyncGenerator, ITSGenerator, ITSTypeAndStringLiteral, ITSArrayListMaybeReadonly } from 'ts-type';
|
|
2
2
|
/**
|
|
3
3
|
* 支援的套件管理器類型
|
|
4
4
|
* Supported package manager types
|
|
@@ -27,11 +27,58 @@ export type IResultDetectPackageManagerRaw<T extends IPackageManager = IPackageM
|
|
|
27
27
|
* @typeParam T - 字串類型 / String type
|
|
28
28
|
*/
|
|
29
29
|
export type IResultDetectRawCore<T extends string = IPackageManager> = readonly [T, string?];
|
|
30
|
+
/**
|
|
31
|
+
* 選項配置介面
|
|
32
|
+
* Options configuration interface
|
|
33
|
+
*/
|
|
34
|
+
export interface IOptionsWhichPackageManager {
|
|
35
|
+
/**
|
|
36
|
+
* 當找不到時是否返回預設值
|
|
37
|
+
* Whether to return default when not found
|
|
38
|
+
*/
|
|
39
|
+
returnDefault?: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* 只使用使用者指定的套件管理器
|
|
42
|
+
* 不合併使用者指定的優先順序與預設順序
|
|
43
|
+
* Only use user-specified package managers
|
|
44
|
+
* Do not merge user-specified priority with default order
|
|
45
|
+
*/
|
|
46
|
+
noUseDefaultClients?: boolean;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* 選項輸入類型 - 可接受布林值或選項物件
|
|
50
|
+
* Options input type - accepts boolean or options object
|
|
51
|
+
*/
|
|
52
|
+
export type IRuntimeOptionInput = boolean | IOptionsWhichPackageManager;
|
|
53
|
+
/**
|
|
54
|
+
* 核心選項處理函數 - 將輸入轉換為標準選項物件
|
|
55
|
+
* Core options handler function - converts input to standard options object
|
|
56
|
+
*
|
|
57
|
+
* @param returnDefaultOrOptions - 布林值或選項物件 / Boolean or options object
|
|
58
|
+
* @returns 標準選項物件 / Standard options object
|
|
59
|
+
*/
|
|
60
|
+
export declare function _handleOptionsWhichPackageManagerCore(returnDefaultOrOptions?: IRuntimeOptionInput): IOptionsWhichPackageManager;
|
|
61
|
+
/**
|
|
62
|
+
* 處理套件管理器選項與客戶端列表
|
|
63
|
+
* Handle package manager options and client list
|
|
64
|
+
*
|
|
65
|
+
* @param npmClients - 套件管理器列表 / Package manager list
|
|
66
|
+
* @param returnDefaultOrOptions - 選項輸入 / Options input
|
|
67
|
+
* @returns 包含選項與檢查列表的物件 / Object containing options and check list
|
|
68
|
+
*/
|
|
69
|
+
export declare function handleOptionsWhichPackageManager<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): {
|
|
70
|
+
options: IOptionsWhichPackageManager;
|
|
71
|
+
/**
|
|
72
|
+
* 合併使用者指定的優先順序與預設順序
|
|
73
|
+
* Merge user-specified priority with default order
|
|
74
|
+
*/
|
|
75
|
+
clientsToCheck: readonly (T | IPackageManager)[];
|
|
76
|
+
};
|
|
30
77
|
/**
|
|
31
78
|
* 合併使用者指定的優先順序與預設順序
|
|
32
79
|
* Merge user-specified priority with default order
|
|
33
80
|
*/
|
|
34
|
-
export declare function _handleClientsToCheck(npmClients?:
|
|
81
|
+
export declare function _handleClientsToCheck<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<T> | undefined, options?: IOptionsWhichPackageManager): readonly (IPackageManager | T)[];
|
|
35
82
|
/**
|
|
36
83
|
* 使用 which 依序檢查套件管理器列表,返回第一個可用的
|
|
37
84
|
* Sequentially check package managers using which, return the first available one
|
|
@@ -44,20 +91,20 @@ export declare function _handleClientsToCheck(npmClients?: IPackageManager[] | u
|
|
|
44
91
|
* Async generator - sequentially check package managers using which
|
|
45
92
|
*
|
|
46
93
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
47
|
-
* @param
|
|
94
|
+
* @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
|
|
48
95
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
49
96
|
*/
|
|
50
|
-
export declare function _whichPackageManagerAsyncGenerator(npmClients?: IPackageManager
|
|
97
|
+
export declare function _whichPackageManagerAsyncGenerator<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSAsyncGenerator<IResultDetectPackageManagerRaw<IPackageManager | T>>;
|
|
51
98
|
/**
|
|
52
99
|
* 非同步生成器核心實作 - 依序檢查每個套件管理器是否可用
|
|
53
100
|
* Async generator core implementation - sequentially check each package manager for availability
|
|
54
101
|
*
|
|
55
102
|
* @typeParam T - 套件管理器類型 / Package manager type
|
|
56
103
|
* @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
|
|
57
|
-
* @param
|
|
104
|
+
* @param options - 選項 / Options
|
|
58
105
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
59
106
|
*/
|
|
60
|
-
export declare function _whichAsyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: T
|
|
107
|
+
export declare function _whichAsyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: ITSArrayListMaybeReadonly<T>, options: IOptionsWhichPackageManager): ITSAsyncGenerator<IResultDetectRawCore<T>>;
|
|
61
108
|
/**
|
|
62
109
|
* 使用 which 依序檢查套件管理器列表,返回第一個可用的
|
|
63
110
|
* Sequentially check package managers using which, return the first available one
|
|
@@ -65,7 +112,7 @@ export declare function _whichAsyncGeneratorCore<T extends string = IPackageMana
|
|
|
65
112
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
66
113
|
* @returns 可用的套件管理器名稱 / Available package manager name
|
|
67
114
|
*/
|
|
68
|
-
export declare function whichPackageManagerAsync(npmClients?: IPackageManager
|
|
115
|
+
export declare function whichPackageManagerAsync(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager>;
|
|
69
116
|
/**
|
|
70
117
|
* 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列
|
|
71
118
|
* Sequentially check package managers using which, return all available package managers as array
|
|
@@ -73,7 +120,7 @@ export declare function whichPackageManagerAsync(npmClients?: IPackageManager[]
|
|
|
73
120
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
74
121
|
* @returns 所有可用的套件管理器陣列 / Array of all available package managers
|
|
75
122
|
*/
|
|
76
|
-
export declare function whichPackageManagerAsyncAll(npmClients?: IPackageManager
|
|
123
|
+
export declare function whichPackageManagerAsyncAll(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager[]>;
|
|
77
124
|
/**
|
|
78
125
|
* 使用 which 依序檢查套件管理器列表,以同步生成器方式 yield 所有可用的套件管理器
|
|
79
126
|
* Sequentially check package managers using which, yield all available package managers via sync generator
|
|
@@ -86,20 +133,20 @@ export declare function whichPackageManagerAsyncAll(npmClients?: IPackageManager
|
|
|
86
133
|
* Sync generator - sequentially check package managers using which
|
|
87
134
|
*
|
|
88
135
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
89
|
-
* @param
|
|
136
|
+
* @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
|
|
90
137
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
91
138
|
*/
|
|
92
|
-
export declare function _whichPackageManagerSyncGenerator(npmClients?: IPackageManager
|
|
139
|
+
export declare function _whichPackageManagerSyncGenerator<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSGenerator<IResultDetectPackageManagerRaw<IPackageManager | T>>;
|
|
93
140
|
/**
|
|
94
141
|
* 同步生成器核心實作 - 依序檢查每個套件管理器是否可用
|
|
95
142
|
* Sync generator core implementation - sequentially check each package manager for availability
|
|
96
143
|
*
|
|
97
144
|
* @typeParam T - 套件管理器類型 / Package manager type
|
|
98
145
|
* @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
|
|
99
|
-
* @param
|
|
146
|
+
* @param options - 選項 / Options
|
|
100
147
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
101
148
|
*/
|
|
102
|
-
export declare function _whichSyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: T
|
|
149
|
+
export declare function _whichSyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: ITSArrayListMaybeReadonly<T>, options: IOptionsWhichPackageManager): ITSGenerator<IResultDetectRawCore<T>>;
|
|
103
150
|
/**
|
|
104
151
|
* 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列(同步版本)
|
|
105
152
|
* Sequentially check package managers using which, return all available package managers as array (sync version)
|
|
@@ -107,7 +154,7 @@ export declare function _whichSyncGeneratorCore<T extends string = IPackageManag
|
|
|
107
154
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
108
155
|
* @returns 所有可用的套件管理器陣列 / Array of all available package managers
|
|
109
156
|
*/
|
|
110
|
-
export declare function whichPackageManagerSyncAll(npmClients?: IPackageManager
|
|
157
|
+
export declare function whichPackageManagerSyncAll(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): IPackageManager[];
|
|
111
158
|
/**
|
|
112
159
|
* 使用 which 依序檢查套件管理器列表,返回第一個可用的
|
|
113
160
|
* Sequentially check package managers using which, return the first available one
|
|
@@ -115,5 +162,5 @@ export declare function whichPackageManagerSyncAll(npmClients?: IPackageManager[
|
|
|
115
162
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
116
163
|
* @returns 可用的套件管理器名稱 / Available package manager name
|
|
117
164
|
*/
|
|
118
|
-
export declare function whichPackageManagerSync(npmClients?: IPackageManager
|
|
165
|
+
export declare function whichPackageManagerSync(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): IPackageManager;
|
|
119
166
|
export default whichPackageManagerSync;
|
package/index.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.EnumPackageManager = void 0;
|
|
4
|
+
exports._handleOptionsWhichPackageManagerCore = _handleOptionsWhichPackageManagerCore;
|
|
5
|
+
exports.handleOptionsWhichPackageManager = handleOptionsWhichPackageManager;
|
|
4
6
|
exports._handleClientsToCheck = _handleClientsToCheck;
|
|
5
7
|
exports._whichPackageManagerAsyncGenerator = _whichPackageManagerAsyncGenerator;
|
|
6
8
|
exports._whichAsyncGeneratorCore = _whichAsyncGeneratorCore;
|
|
@@ -28,14 +30,64 @@ var EnumPackageManager;
|
|
|
28
30
|
* Default package manager priority order
|
|
29
31
|
*/
|
|
30
32
|
const defaultClients = ["pnpm" /* EnumPackageManager.pnpm */, "yarn" /* EnumPackageManager.yarn */, "npm" /* EnumPackageManager.npm */];
|
|
33
|
+
/**
|
|
34
|
+
* which 命令選項配置
|
|
35
|
+
* which command options configuration
|
|
36
|
+
*/
|
|
37
|
+
const _whichOptions = {
|
|
38
|
+
nothrow: true,
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* 核心選項處理函數 - 將輸入轉換為標準選項物件
|
|
42
|
+
* Core options handler function - converts input to standard options object
|
|
43
|
+
*
|
|
44
|
+
* @param returnDefaultOrOptions - 布林值或選項物件 / Boolean or options object
|
|
45
|
+
* @returns 標準選項物件 / Standard options object
|
|
46
|
+
*/
|
|
47
|
+
function _handleOptionsWhichPackageManagerCore(returnDefaultOrOptions) {
|
|
48
|
+
if (typeof returnDefaultOrOptions === 'boolean') {
|
|
49
|
+
returnDefaultOrOptions = {
|
|
50
|
+
returnDefault: returnDefaultOrOptions,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
return returnDefaultOrOptions !== null && returnDefaultOrOptions !== void 0 ? returnDefaultOrOptions : {};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* 處理套件管理器選項與客戶端列表
|
|
57
|
+
* Handle package manager options and client list
|
|
58
|
+
*
|
|
59
|
+
* @param npmClients - 套件管理器列表 / Package manager list
|
|
60
|
+
* @param returnDefaultOrOptions - 選項輸入 / Options input
|
|
61
|
+
* @returns 包含選項與檢查列表的物件 / Object containing options and check list
|
|
62
|
+
*/
|
|
63
|
+
function handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions) {
|
|
64
|
+
returnDefaultOrOptions = _handleOptionsWhichPackageManagerCore(returnDefaultOrOptions);
|
|
65
|
+
return {
|
|
66
|
+
options: returnDefaultOrOptions,
|
|
67
|
+
/**
|
|
68
|
+
* 合併使用者指定的優先順序與預設順序
|
|
69
|
+
* Merge user-specified priority with default order
|
|
70
|
+
*/
|
|
71
|
+
clientsToCheck: _handleClientsToCheck(npmClients, returnDefaultOrOptions),
|
|
72
|
+
};
|
|
73
|
+
}
|
|
31
74
|
/**
|
|
32
75
|
* 合併使用者指定的優先順序與預設順序
|
|
33
76
|
* Merge user-specified priority with default order
|
|
34
77
|
*/
|
|
35
|
-
function _handleClientsToCheck(npmClients) {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
78
|
+
function _handleClientsToCheck(npmClients, options) {
|
|
79
|
+
/**
|
|
80
|
+
* 合併使用者指定的優先順序與預設順序
|
|
81
|
+
* Merge user-specified priority with default order
|
|
82
|
+
*/
|
|
83
|
+
if (npmClients === null || npmClients === void 0 ? void 0 : npmClients.length) {
|
|
84
|
+
// 過濾不合法的名稱
|
|
85
|
+
npmClients = npmClients.filter(v => v === null || v === void 0 ? void 0 : v.length);
|
|
86
|
+
return (options === null || options === void 0 ? void 0 : options.noUseDefaultClients)
|
|
87
|
+
? [...new Set([...npmClients])]
|
|
88
|
+
: [...new Set([...npmClients, ...defaultClients])];
|
|
89
|
+
}
|
|
90
|
+
return [...defaultClients];
|
|
39
91
|
}
|
|
40
92
|
/**
|
|
41
93
|
* 使用 which 依序檢查套件管理器列表,返回第一個可用的
|
|
@@ -49,16 +101,13 @@ function _handleClientsToCheck(npmClients) {
|
|
|
49
101
|
* Async generator - sequentially check package managers using which
|
|
50
102
|
*
|
|
51
103
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
52
|
-
* @param
|
|
104
|
+
* @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
|
|
53
105
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
54
106
|
*/
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
*/
|
|
60
|
-
const clientsToCheck = _handleClientsToCheck(npmClients);
|
|
61
|
-
return _whichAsyncGeneratorCore(clientsToCheck, returnDefault);
|
|
107
|
+
// @ts-ignore
|
|
108
|
+
async function* _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions) {
|
|
109
|
+
const { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);
|
|
110
|
+
yield* _whichAsyncGeneratorCore(clientsToCheck, options);
|
|
62
111
|
}
|
|
63
112
|
/**
|
|
64
113
|
* 非同步生成器核心實作 - 依序檢查每個套件管理器是否可用
|
|
@@ -66,23 +115,23 @@ async function* _whichPackageManagerAsyncGenerator(npmClients, returnDefault) {
|
|
|
66
115
|
*
|
|
67
116
|
* @typeParam T - 套件管理器類型 / Package manager type
|
|
68
117
|
* @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
|
|
69
|
-
* @param
|
|
118
|
+
* @param options - 選項 / Options
|
|
70
119
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
71
120
|
*/
|
|
72
|
-
async function* _whichAsyncGeneratorCore(clientsToCheck,
|
|
121
|
+
async function* _whichAsyncGeneratorCore(clientsToCheck, options) {
|
|
73
122
|
let notFound = true;
|
|
74
123
|
/**
|
|
75
124
|
* 依序檢查每個套件管理器是否可用
|
|
76
125
|
* Check each package manager sequentially for availability
|
|
77
126
|
*/
|
|
78
127
|
for (const client of clientsToCheck) {
|
|
79
|
-
const commandPath = await (0, which_1.default)(client).catch(() => null);
|
|
128
|
+
const commandPath = await (0, which_1.default)(client, _whichOptions).catch(() => null);
|
|
80
129
|
if (commandPath) {
|
|
81
130
|
yield [client, commandPath];
|
|
82
131
|
notFound = false;
|
|
83
132
|
}
|
|
84
133
|
}
|
|
85
|
-
if (returnDefault && notFound)
|
|
134
|
+
if (options.returnDefault && notFound)
|
|
86
135
|
return [clientsToCheck[0]];
|
|
87
136
|
}
|
|
88
137
|
/**
|
|
@@ -92,8 +141,8 @@ async function* _whichAsyncGeneratorCore(clientsToCheck, returnDefault) {
|
|
|
92
141
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
93
142
|
* @returns 可用的套件管理器名稱 / Available package manager name
|
|
94
143
|
*/
|
|
95
|
-
function whichPackageManagerAsync(npmClients,
|
|
96
|
-
return _whichPackageManagerAsyncGenerator(npmClients,
|
|
144
|
+
async function whichPackageManagerAsync(npmClients, returnDefaultOrOptions) {
|
|
145
|
+
return _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions).next().then(next => { var _a; return (_a = next.value) === null || _a === void 0 ? void 0 : _a[0]; });
|
|
97
146
|
}
|
|
98
147
|
/**
|
|
99
148
|
* 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列
|
|
@@ -102,9 +151,9 @@ function whichPackageManagerAsync(npmClients, returnDefault) {
|
|
|
102
151
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
103
152
|
* @returns 所有可用的套件管理器陣列 / Array of all available package managers
|
|
104
153
|
*/
|
|
105
|
-
async function whichPackageManagerAsyncAll(npmClients,
|
|
154
|
+
async function whichPackageManagerAsyncAll(npmClients, returnDefaultOrOptions) {
|
|
106
155
|
const result = [];
|
|
107
|
-
for await (const client of _whichPackageManagerAsyncGenerator(npmClients,
|
|
156
|
+
for await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions)) {
|
|
108
157
|
result.push(client[0]);
|
|
109
158
|
}
|
|
110
159
|
return result;
|
|
@@ -121,16 +170,13 @@ async function whichPackageManagerAsyncAll(npmClients, returnDefault) {
|
|
|
121
170
|
* Sync generator - sequentially check package managers using which
|
|
122
171
|
*
|
|
123
172
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
124
|
-
* @param
|
|
173
|
+
* @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
|
|
125
174
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
126
175
|
*/
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
*/
|
|
132
|
-
const clientsToCheck = _handleClientsToCheck(npmClients);
|
|
133
|
-
return _whichSyncGeneratorCore(clientsToCheck, returnDefault);
|
|
176
|
+
// @ts-ignore
|
|
177
|
+
function* _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions) {
|
|
178
|
+
const { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);
|
|
179
|
+
yield* _whichSyncGeneratorCore(clientsToCheck, options);
|
|
134
180
|
}
|
|
135
181
|
/**
|
|
136
182
|
* 同步生成器核心實作 - 依序檢查每個套件管理器是否可用
|
|
@@ -138,23 +184,23 @@ function* _whichPackageManagerSyncGenerator(npmClients, returnDefault) {
|
|
|
138
184
|
*
|
|
139
185
|
* @typeParam T - 套件管理器類型 / Package manager type
|
|
140
186
|
* @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
|
|
141
|
-
* @param
|
|
187
|
+
* @param options - 選項 / Options
|
|
142
188
|
* @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
|
|
143
189
|
*/
|
|
144
|
-
function* _whichSyncGeneratorCore(clientsToCheck,
|
|
190
|
+
function* _whichSyncGeneratorCore(clientsToCheck, options) {
|
|
145
191
|
let notFound = true;
|
|
146
192
|
/**
|
|
147
193
|
* 依序檢查每個套件管理器是否可用
|
|
148
194
|
* Check each package manager sequentially for availability
|
|
149
195
|
*/
|
|
150
196
|
for (const client of clientsToCheck) {
|
|
151
|
-
const commandPath = (0, which_1.sync)(client);
|
|
197
|
+
const commandPath = (0, which_1.sync)(client, _whichOptions);
|
|
152
198
|
if (commandPath) {
|
|
153
199
|
yield [client, commandPath];
|
|
154
200
|
notFound = false;
|
|
155
201
|
}
|
|
156
202
|
}
|
|
157
|
-
if (returnDefault && notFound)
|
|
203
|
+
if (options.returnDefault && notFound)
|
|
158
204
|
return [clientsToCheck[0]];
|
|
159
205
|
}
|
|
160
206
|
/**
|
|
@@ -164,9 +210,9 @@ function* _whichSyncGeneratorCore(clientsToCheck, returnDefault) {
|
|
|
164
210
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
165
211
|
* @returns 所有可用的套件管理器陣列 / Array of all available package managers
|
|
166
212
|
*/
|
|
167
|
-
function whichPackageManagerSyncAll(npmClients,
|
|
213
|
+
function whichPackageManagerSyncAll(npmClients, returnDefaultOrOptions) {
|
|
168
214
|
const result = [];
|
|
169
|
-
for (const client of _whichPackageManagerSyncGenerator(npmClients,
|
|
215
|
+
for (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions)) {
|
|
170
216
|
result.push(client[0]);
|
|
171
217
|
}
|
|
172
218
|
return result;
|
|
@@ -178,9 +224,9 @@ function whichPackageManagerSyncAll(npmClients, returnDefault) {
|
|
|
178
224
|
* @param npmClients - 套件管理器列表 / Package manager list
|
|
179
225
|
* @returns 可用的套件管理器名稱 / Available package manager name
|
|
180
226
|
*/
|
|
181
|
-
function whichPackageManagerSync(npmClients,
|
|
227
|
+
function whichPackageManagerSync(npmClients, returnDefaultOrOptions) {
|
|
182
228
|
var _a;
|
|
183
|
-
return (_a = _whichPackageManagerSyncGenerator(npmClients,
|
|
229
|
+
return (_a = _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions).next().value) === null || _a === void 0 ? void 0 : _a[0];
|
|
184
230
|
}
|
|
185
231
|
exports.default = whichPackageManagerSync;
|
|
186
232
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import { ITSAsyncGenerator, ITSGenerator, ITSTypeAndStringLiteral } from 'ts-type';\nimport which, { sync as whichSync } from 'which';\n\n/**\n * 支援的套件管理器類型\n * Supported package manager types\n */\nexport const enum EnumPackageManager\n{\n\t'yarn' = 'yarn',\n\t'npm' = 'npm',\n\t'pnpm' = 'pnpm',\n};\n\n/**\n * 支援的套件管理器類型\n * Supported package manager types\n */\nexport type IPackageManager = ITSTypeAndStringLiteral<EnumPackageManager>;\n\n/**\n * 預設的套件管理器優先順序\n * Default package manager priority order\n */\nconst defaultClients: readonly IPackageManager[] = [EnumPackageManager.pnpm, EnumPackageManager.yarn, EnumPackageManager.npm];\n\n/**\n * 偵測結果類型 - 包含套件管理器名稱和命令路徑\n * Detection result type - contains package manager name and command path\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n */\nexport type IResultDetectPackageManagerRaw<T extends IPackageManager = IPackageManager> = IResultDetectRawCore<T>;\n\n/**\n * 偵測結果核心類型 - 元組 [名稱, 路徑?]\n * Detection result core type - tuple [name, path?]\n *\n * @typeParam T - 字串類型 / String type\n */\nexport type IResultDetectRawCore<T extends string = IPackageManager> = readonly [T, string?];\n\n/**\n * 合併使用者指定的優先順序與預設順序\n * Merge user-specified priority with default order\n */\nexport function _handleClientsToCheck(npmClients?: IPackageManager[] | undefined): IPackageManager[]\n{\n\treturn npmClients?.length\n\t\t? [...new Set([...npmClients, ...defaultClients])]\n\t\t: defaultClients as IPackageManager[];\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\n/**\n * 非同步生成器 - 使用 which 依序檢查套件管理器列表\n * Async generator - sequentially check package managers using which\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport async function* _whichPackageManagerAsyncGenerator(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean): ITSAsyncGenerator<IResultDetectPackageManagerRaw>\n{\n\t/**\n\t * 合併使用者指定的優先順序與預設順序\n\t * Merge user-specified priority with default order\n\t */\n\tconst clientsToCheck: IPackageManager[] = _handleClientsToCheck(npmClients);\n\n\treturn _whichAsyncGeneratorCore(clientsToCheck, returnDefault) as any;\n}\n\n/**\n * 非同步生成器核心實作 - 依序檢查每個套件管理器是否可用\n * Async generator core implementation - sequentially check each package manager for availability\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check\n * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport async function* _whichAsyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: T[], returnDefault?: boolean): ITSAsyncGenerator<IResultDetectRawCore<T>>\n{\n\tlet notFound = true;\n\n\t/**\n\t * 依序檢查每個套件管理器是否可用\n\t * Check each package manager sequentially for availability\n\t */\n\tfor (const client of clientsToCheck)\n\t{\n\t\tconst commandPath = await which(client).catch(() => null);\n\t\tif (commandPath)\n\t\t{\n\t\t\tyield [client, commandPath as string] as IResultDetectRawCore<T>;\n\t\t\tnotFound = false;\n\t\t}\n\t}\n\n\tif (returnDefault && notFound) return [clientsToCheck[0]] as IResultDetectRawCore<T>;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\nexport function whichPackageManagerAsync(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean): Promise<IPackageManager>\n{\n\treturn _whichPackageManagerAsyncGenerator(npmClients, returnDefault).next().then(next => next.value?.[0]);\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列\n * Sequentially check package managers using which, return all available package managers as array\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 所有可用的套件管理器陣列 / Array of all available package managers\n */\nexport async function whichPackageManagerAsyncAll(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean): Promise<IPackageManager[]>\n{\n\tconst result: IPackageManager[] = [];\n\n\tfor await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefault))\n\t{\n\t\tresult.push(client[0]);\n\t}\n\n\treturn result;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,以同步生成器方式 yield 所有可用的套件管理器\n * Sequentially check package managers using which, yield all available package managers via sync generator\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器(透過 yield)/ Available package manager (via yield)\n */\n/**\n * 同步生成器 - 使用 which 依序檢查套件管理器列表\n * Sync generator - sequentially check package managers using which\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport function* _whichPackageManagerSyncGenerator(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean): ITSGenerator<IResultDetectPackageManagerRaw>\n{\n\t/**\n\t * 合併使用者指定的優先順序與預設順序\n\t * Merge user-specified priority with default order\n\t */\n\tconst clientsToCheck: IPackageManager[] = _handleClientsToCheck(npmClients);\n\n\treturn _whichSyncGeneratorCore(clientsToCheck, returnDefault) as any;\n}\n\n/**\n * 同步生成器核心實作 - 依序檢查每個套件管理器是否可用\n * Sync generator core implementation - sequentially check each package manager for availability\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check\n * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport function* _whichSyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: T[], returnDefault?: boolean): ITSGenerator<IResultDetectRawCore<T>>\n{\n\tlet notFound = true;\n\n\t/**\n\t * 依序檢查每個套件管理器是否可用\n\t * Check each package manager sequentially for availability\n\t */\n\tfor (const client of clientsToCheck)\n\t{\n\t\tconst commandPath = whichSync(client);\n\t\tif (commandPath)\n\t\t{\n\t\t\tyield [client, commandPath as string] as IResultDetectRawCore<T>;\n\t\t\tnotFound = false;\n\t\t}\n\t}\n\n\tif (returnDefault && notFound) return [clientsToCheck[0]] as IResultDetectRawCore<T>;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列(同步版本)\n * Sequentially check package managers using which, return all available package managers as array (sync version)\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 所有可用的套件管理器陣列 / Array of all available package managers\n */\nexport function whichPackageManagerSyncAll(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean): IPackageManager[]\n{\n\tconst result: IPackageManager[] = [];\n\n\tfor (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefault))\n\t{\n\t\tresult.push(client[0]);\n\t}\n\n\treturn result;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\nexport function whichPackageManagerSync(npmClients?: IPackageManager[] | undefined, returnDefault?: boolean)\n{\n\treturn _whichPackageManagerSyncGenerator(npmClients, returnDefault).next().value?.[0]\n}\n\nexport default whichPackageManagerSync\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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","sourcesContent":["import _ from 'lodash';\nimport { ITSAsyncGenerator, ITSGenerator, ITSTypeAndStringLiteral, ITSArrayListMaybeReadonly } from 'ts-type';\nimport which, { sync as whichSync } from 'which';\n\n/**\n * 支援的套件管理器類型\n * Supported package manager types\n */\nexport const enum EnumPackageManager\n{\n\t'yarn' = 'yarn',\n\t'npm' = 'npm',\n\t'pnpm' = 'pnpm',\n};\n\n/**\n * 支援的套件管理器類型\n * Supported package manager types\n */\nexport type IPackageManager = ITSTypeAndStringLiteral<EnumPackageManager>;\n\n/**\n * 預設的套件管理器優先順序\n * Default package manager priority order\n */\nconst defaultClients: readonly IPackageManager[] = [EnumPackageManager.pnpm, EnumPackageManager.yarn, EnumPackageManager.npm];\n\n/**\n * 偵測結果類型 - 包含套件管理器名稱和命令路徑\n * Detection result type - contains package manager name and command path\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n */\nexport type IResultDetectPackageManagerRaw<T extends IPackageManager = IPackageManager> = IResultDetectRawCore<T>;\n\n/**\n * 偵測結果核心類型 - 元組 [名稱, 路徑?]\n * Detection result core type - tuple [name, path?]\n *\n * @typeParam T - 字串類型 / String type\n */\nexport type IResultDetectRawCore<T extends string = IPackageManager> = readonly [T, string?];\n\n/**\n * which 命令選項配置\n * which command options configuration\n */\nconst _whichOptions: which.Options = {\n\tnothrow: true,\n}\n\n/**\n * 選項配置介面\n * Options configuration interface\n */\nexport interface IOptionsWhichPackageManager\n{\n\t/**\n\t * 當找不到時是否返回預設值\n\t * Whether to return default when not found\n\t */\n\treturnDefault?: boolean;\n\t/**\n\t * 只使用使用者指定的套件管理器\n\t * 不合併使用者指定的優先順序與預設順序\n\t * Only use user-specified package managers\n\t * Do not merge user-specified priority with default order\n\t */\n\tnoUseDefaultClients?: boolean;\n}\n\n/**\n * 選項輸入類型 - 可接受布林值或選項物件\n * Options input type - accepts boolean or options object\n */\nexport type IRuntimeOptionInput = boolean | IOptionsWhichPackageManager;\n\n/**\n * 核心選項處理函數 - 將輸入轉換為標準選項物件\n * Core options handler function - converts input to standard options object\n *\n * @param returnDefaultOrOptions - 布林值或選項物件 / Boolean or options object\n * @returns 標準選項物件 / Standard options object\n */\nexport function _handleOptionsWhichPackageManagerCore(returnDefaultOrOptions?: IRuntimeOptionInput): IOptionsWhichPackageManager\n{\n\tif (typeof returnDefaultOrOptions === 'boolean')\n\t{\n\t\treturnDefaultOrOptions = {\n\t\t\treturnDefault: returnDefaultOrOptions,\n\t\t}\n\t}\n\n\treturn returnDefaultOrOptions ?? {};\n}\n\n/**\n * 處理套件管理器選項與客戶端列表\n * Handle package manager options and client list\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @param returnDefaultOrOptions - 選項輸入 / Options input\n * @returns 包含選項與檢查列表的物件 / Object containing options and check list\n */\nexport function handleOptionsWhichPackageManager<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput)\n{\n\treturnDefaultOrOptions = _handleOptionsWhichPackageManagerCore(returnDefaultOrOptions);\n\n\treturn {\n\t\toptions: returnDefaultOrOptions,\n\t\t/**\n\t\t * 合併使用者指定的優先順序與預設順序\n\t\t * Merge user-specified priority with default order\n\t\t */\n\t\tclientsToCheck: _handleClientsToCheck(npmClients, returnDefaultOrOptions),\n\t};\n}\n\n/**\n * 合併使用者指定的優先順序與預設順序\n * Merge user-specified priority with default order\n */\nexport function _handleClientsToCheck<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<T> | undefined, options?: IOptionsWhichPackageManager): readonly (IPackageManager | T)[]\n{\n\t/**\n\t * 合併使用者指定的優先順序與預設順序\n\t * Merge user-specified priority with default order\n\t */\n\tif (npmClients?.length)\n\t{\n\t\t// 過濾不合法的名稱\n\t\tnpmClients = npmClients.filter(v => v?.length);\n\n\t\treturn options?.noUseDefaultClients\n\t\t\t? [...new Set([...npmClients])]\n\t\t\t: [...new Set([...npmClients, ...defaultClients])];\n\t}\n\n\treturn [...defaultClients];\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\n/**\n * 非同步生成器 - 使用 which 依序檢查套件管理器列表\n * Async generator - sequentially check package managers using which\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\n// @ts-ignore\nexport async function* _whichPackageManagerAsyncGenerator<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSAsyncGenerator<IResultDetectPackageManagerRaw<IPackageManager | T>>\n{\n\n\tconst { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);\n\n\tyield* _whichAsyncGeneratorCore(clientsToCheck, options) as any;\n}\n\n/**\n * 非同步生成器核心實作 - 依序檢查每個套件管理器是否可用\n * Async generator core implementation - sequentially check each package manager for availability\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check\n * @param options - 選項 / Options\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport async function* _whichAsyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: ITSArrayListMaybeReadonly<T>, options: IOptionsWhichPackageManager): ITSAsyncGenerator<IResultDetectRawCore<T>>\n{\n\tlet notFound = true;\n\n\t/**\n\t * 依序檢查每個套件管理器是否可用\n\t * Check each package manager sequentially for availability\n\t */\n\tfor (const client of clientsToCheck)\n\t{\n\t\tconst commandPath = await which(client, _whichOptions).catch(() => null);\n\t\tif (commandPath)\n\t\t{\n\t\t\tyield [client, commandPath as string] as IResultDetectRawCore<T>;\n\t\t\tnotFound = false;\n\t\t}\n\t}\n\n\tif (options.returnDefault && notFound) return [clientsToCheck[0]] as IResultDetectRawCore<T>;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\nexport async function whichPackageManagerAsync(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager>\n{\n\treturn _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions).next().then(next => next.value?.[0]);\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列\n * Sequentially check package managers using which, return all available package managers as array\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 所有可用的套件管理器陣列 / Array of all available package managers\n */\nexport async function whichPackageManagerAsyncAll(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): Promise<IPackageManager[]>\n{\n\tconst result: IPackageManager[] = [];\n\n\tfor await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions))\n\t{\n\t\tresult.push(client[0]);\n\t}\n\n\treturn result;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,以同步生成器方式 yield 所有可用的套件管理器\n * Sequentially check package managers using which, yield all available package managers via sync generator\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器(透過 yield)/ Available package manager (via yield)\n */\n/**\n * 同步生成器 - 使用 which 依序檢查套件管理器列表\n * Sync generator - sequentially check package managers using which\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\n// @ts-ignore\nexport function* _whichPackageManagerSyncGenerator<T extends string = IPackageManager>(npmClients?: ITSArrayListMaybeReadonly<IPackageManager | T> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSGenerator<IResultDetectPackageManagerRaw<IPackageManager | T>>\n{\n\tconst { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);\n\n\tyield* _whichSyncGeneratorCore(clientsToCheck, options) as any;\n}\n\n/**\n * 同步生成器核心實作 - 依序檢查每個套件管理器是否可用\n * Sync generator core implementation - sequentially check each package manager for availability\n *\n * @typeParam T - 套件管理器類型 / Package manager type\n * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check\n * @param options - 選項 / Options\n * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]\n */\nexport function* _whichSyncGeneratorCore<T extends string = IPackageManager>(clientsToCheck: ITSArrayListMaybeReadonly<T>, options: IOptionsWhichPackageManager): ITSGenerator<IResultDetectRawCore<T>>\n{\n\tlet notFound = true;\n\n\t/**\n\t * 依序檢查每個套件管理器是否可用\n\t * Check each package manager sequentially for availability\n\t */\n\tfor (const client of clientsToCheck)\n\t{\n\t\tconst commandPath = whichSync(client, _whichOptions);\n\t\tif (commandPath)\n\t\t{\n\t\t\tyield [client, commandPath as string] as IResultDetectRawCore<T>;\n\t\t\tnotFound = false;\n\t\t}\n\t}\n\n\tif (options.returnDefault && notFound) return [clientsToCheck[0]] as IResultDetectRawCore<T>;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列(同步版本)\n * Sequentially check package managers using which, return all available package managers as array (sync version)\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 所有可用的套件管理器陣列 / Array of all available package managers\n */\nexport function whichPackageManagerSyncAll(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): IPackageManager[]\n{\n\tconst result: IPackageManager[] = [];\n\n\tfor (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions))\n\t{\n\t\tresult.push(client[0]);\n\t}\n\n\treturn result;\n}\n\n/**\n * 使用 which 依序檢查套件管理器列表,返回第一個可用的\n * Sequentially check package managers using which, return the first available one\n *\n * @param npmClients - 套件管理器列表 / Package manager list\n * @returns 可用的套件管理器名稱 / Available package manager name\n */\nexport function whichPackageManagerSync(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput)\n{\n\treturn _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions).next().value?.[0]\n}\n\nexport default whichPackageManagerSync\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@yarn-tool/detect-package-manager",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.6",
|
|
4
4
|
"description": "Detect available package manager (yarn, npm, pnpm) using which command",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"detect",
|
|
@@ -83,5 +83,5 @@
|
|
|
83
83
|
"publishConfig": {
|
|
84
84
|
"access": "public"
|
|
85
85
|
},
|
|
86
|
-
"gitHead": "
|
|
86
|
+
"gitHead": "b61a22288b5bbc24ba9ce0acf86b998c9785f6b6"
|
|
87
87
|
}
|