@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 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[], returnDefault?: boolean): IPackageManager | undefined
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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
65
+ - `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
42
66
 
43
67
  **回傳 (Returns):** 第一個可用的套件管理器名稱或 `undefined`
44
68
 
45
- ### whichPackageManagerSyncAll(npmClients?: IPackageManager[], returnDefault?: boolean): 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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
75
+ - `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
52
76
 
53
77
  **回傳 (Returns):** 所有可用的套件管理器陣列
54
78
 
55
- ### whichPackageManagerAsync(npmClients?: IPackageManager[], returnDefault?: boolean): Promise<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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
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[], returnDefault?: boolean): Promise<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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
95
+ - `returnDefaultOrOptions?`: 選項輸入 (布林值或 IOptionsWhichPackageManager 物件)(可選)/ Options input (boolean or IOptionsWhichPackageManager object) (optional)
72
96
 
73
97
  **回傳 (Returns):** Promise resolves to 所有可用的套件管理器陣列
74
98
 
75
- ### _whichPackageManagerSyncGenerator(npmClients?: IPackageManager[], returnDefault?: boolean): Generator<IResultDetectPackageManagerRaw>
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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
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[], returnDefault?: boolean): AsyncGenerator<IResultDetectPackageManagerRaw>
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
- - `returnDefault?`: 當找不到時是否返回預設值(可選)/ Whether to return default when not found (optional)
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?: IPackageManager[] | undefined): IPackageManager[];
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
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[] | undefined, returnDefault?: boolean): ITSAsyncGenerator<IResultDetectPackageManagerRaw>;
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
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[], returnDefault?: boolean): ITSAsyncGenerator<IResultDetectRawCore<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[] | undefined, returnDefault?: boolean): Promise<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[] | undefined, returnDefault?: boolean): Promise<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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
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[] | undefined, returnDefault?: boolean): ITSGenerator<IResultDetectPackageManagerRaw>;
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
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[], returnDefault?: boolean): ITSGenerator<IResultDetectRawCore<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[] | undefined, returnDefault?: boolean): 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[] | undefined, returnDefault?: boolean): 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
- return (npmClients === null || npmClients === void 0 ? void 0 : npmClients.length)
37
- ? [...new Set([...npmClients, ...defaultClients])]
38
- : defaultClients;
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
104
+ * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
53
105
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
54
106
  */
55
- async function* _whichPackageManagerAsyncGenerator(npmClients, returnDefault) {
56
- /**
57
- * 合併使用者指定的優先順序與預設順序
58
- * Merge user-specified priority with default order
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
118
+ * @param options - 選項 / Options
70
119
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
71
120
  */
72
- async function* _whichAsyncGeneratorCore(clientsToCheck, returnDefault) {
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, returnDefault) {
96
- return _whichPackageManagerAsyncGenerator(npmClients, returnDefault).next().then(next => { var _a; return (_a = next.value) === null || _a === void 0 ? void 0 : _a[0]; });
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, returnDefault) {
154
+ async function whichPackageManagerAsyncAll(npmClients, returnDefaultOrOptions) {
106
155
  const result = [];
107
- for await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefault)) {
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
173
+ * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
125
174
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
126
175
  */
127
- function* _whichPackageManagerSyncGenerator(npmClients, returnDefault) {
128
- /**
129
- * 合併使用者指定的優先順序與預設順序
130
- * Merge user-specified priority with default order
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 returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
187
+ * @param options - 選項 / Options
142
188
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
143
189
  */
144
- function* _whichSyncGeneratorCore(clientsToCheck, returnDefault) {
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, returnDefault) {
213
+ function whichPackageManagerSyncAll(npmClients, returnDefaultOrOptions) {
168
214
  const result = [];
169
- for (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefault)) {
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, returnDefault) {
227
+ function whichPackageManagerSync(npmClients, returnDefaultOrOptions) {
182
228
  var _a;
183
- return (_a = _whichPackageManagerSyncGenerator(npmClients, returnDefault).next().value) === null || _a === void 0 ? void 0 : _a[0];
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.4",
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": "ca3fae2bbdf31ed1ce9bab14793912026200767e"
86
+ "gitHead": "b61a22288b5bbc24ba9ce0acf86b998c9785f6b6"
87
87
  }