@yarn-tool/detect-package-manager 1.0.4 → 1.0.5

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,26 @@
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.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)
7
+
8
+
9
+ ### BREAKING CHANGES
10
+
11
+ * **detect-package-manager:** The second parameter now accepts boolean or IOptionsWhichPackageManager object instead of just boolean
12
+
13
+
14
+
15
+ ### 📦 Code Refactoring
16
+
17
+ * **detect-package-manager:** add IOptionsWhichPackageManager interface and noUseDefaultClients option ([98a8ae4](https://github.com/bluelovers/ws-yarn-workspaces/commit/98a8ae4a4b9a6814064fc2cae8cf475f68b11469))
18
+
19
+
20
+ ### ♻️ Chores
21
+
22
+ * **detect-package-manager:** 新增 `.nx` 到 .gitignore ([eddc452](https://github.com/bluelovers/ws-yarn-workspaces/commit/eddc452f1e047a79fa05baefeaede97c5df36741))
23
+
24
+
25
+
6
26
  ## [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
27
 
8
28
  **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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): {
70
+ options: IOptionsWhichPackageManager;
71
+ /**
72
+ * 合併使用者指定的優先順序與預設順序
73
+ * Merge user-specified priority with default order
74
+ */
75
+ clientsToCheck: readonly 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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, options?: IOptionsWhichPackageManager): readonly IPackageManager[];
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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSAsyncGenerator<IResultDetectPackageManagerRaw>;
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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSGenerator<IResultDetectPackageManagerRaw>;
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,62 @@ 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
+ return (options === null || options === void 0 ? void 0 : options.noUseDefaultClients)
85
+ ? [...new Set([...npmClients])]
86
+ : [...new Set([...npmClients, ...defaultClients])];
87
+ }
88
+ return [...defaultClients];
39
89
  }
40
90
  /**
41
91
  * 使用 which 依序檢查套件管理器列表,返回第一個可用的
@@ -49,16 +99,13 @@ function _handleClientsToCheck(npmClients) {
49
99
  * Async generator - sequentially check package managers using which
50
100
  *
51
101
  * @param npmClients - 套件管理器列表 / Package manager list
52
- * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
102
+ * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
53
103
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
54
104
  */
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);
105
+ // @ts-ignore
106
+ async function* _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions) {
107
+ const { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);
108
+ yield* _whichAsyncGeneratorCore(clientsToCheck, options);
62
109
  }
63
110
  /**
64
111
  * 非同步生成器核心實作 - 依序檢查每個套件管理器是否可用
@@ -66,23 +113,23 @@ async function* _whichPackageManagerAsyncGenerator(npmClients, returnDefault) {
66
113
  *
67
114
  * @typeParam T - 套件管理器類型 / Package manager type
68
115
  * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
69
- * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
116
+ * @param options - 選項 / Options
70
117
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
71
118
  */
72
- async function* _whichAsyncGeneratorCore(clientsToCheck, returnDefault) {
119
+ async function* _whichAsyncGeneratorCore(clientsToCheck, options) {
73
120
  let notFound = true;
74
121
  /**
75
122
  * 依序檢查每個套件管理器是否可用
76
123
  * Check each package manager sequentially for availability
77
124
  */
78
125
  for (const client of clientsToCheck) {
79
- const commandPath = await (0, which_1.default)(client).catch(() => null);
126
+ const commandPath = await (0, which_1.default)(client, _whichOptions).catch(() => null);
80
127
  if (commandPath) {
81
128
  yield [client, commandPath];
82
129
  notFound = false;
83
130
  }
84
131
  }
85
- if (returnDefault && notFound)
132
+ if (options.returnDefault && notFound)
86
133
  return [clientsToCheck[0]];
87
134
  }
88
135
  /**
@@ -92,8 +139,8 @@ async function* _whichAsyncGeneratorCore(clientsToCheck, returnDefault) {
92
139
  * @param npmClients - 套件管理器列表 / Package manager list
93
140
  * @returns 可用的套件管理器名稱 / Available package manager name
94
141
  */
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]; });
142
+ async function whichPackageManagerAsync(npmClients, returnDefaultOrOptions) {
143
+ return _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions).next().then(next => { var _a; return (_a = next.value) === null || _a === void 0 ? void 0 : _a[0]; });
97
144
  }
98
145
  /**
99
146
  * 使用 which 依序檢查套件管理器列表,返回所有可用的套件管理器陣列
@@ -102,9 +149,9 @@ function whichPackageManagerAsync(npmClients, returnDefault) {
102
149
  * @param npmClients - 套件管理器列表 / Package manager list
103
150
  * @returns 所有可用的套件管理器陣列 / Array of all available package managers
104
151
  */
105
- async function whichPackageManagerAsyncAll(npmClients, returnDefault) {
152
+ async function whichPackageManagerAsyncAll(npmClients, returnDefaultOrOptions) {
106
153
  const result = [];
107
- for await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefault)) {
154
+ for await (const client of _whichPackageManagerAsyncGenerator(npmClients, returnDefaultOrOptions)) {
108
155
  result.push(client[0]);
109
156
  }
110
157
  return result;
@@ -121,16 +168,13 @@ async function whichPackageManagerAsyncAll(npmClients, returnDefault) {
121
168
  * Sync generator - sequentially check package managers using which
122
169
  *
123
170
  * @param npmClients - 套件管理器列表 / Package manager list
124
- * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
171
+ * @param returnDefaultOrOptions - 選項輸入 (布林值或 IOptionsWhichPackageManager) / Options input (boolean or IOptionsWhichPackageManager)
125
172
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
126
173
  */
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);
174
+ // @ts-ignore
175
+ function* _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions) {
176
+ const { clientsToCheck, options } = handleOptionsWhichPackageManager(npmClients, returnDefaultOrOptions);
177
+ yield* _whichSyncGeneratorCore(clientsToCheck, options);
134
178
  }
135
179
  /**
136
180
  * 同步生成器核心實作 - 依序檢查每個套件管理器是否可用
@@ -138,23 +182,23 @@ function* _whichPackageManagerSyncGenerator(npmClients, returnDefault) {
138
182
  *
139
183
  * @typeParam T - 套件管理器類型 / Package manager type
140
184
  * @param clientsToCheck - 要檢查的套件管理器列表 / List of package managers to check
141
- * @param returnDefault - 當找不到時是否返回預設值 / Whether to return default when not found
185
+ * @param options - 選項 / Options
142
186
  * @yield - 可用的套件管理器元組 [名稱, 路徑] / Available package manager tuple [name, path]
143
187
  */
144
- function* _whichSyncGeneratorCore(clientsToCheck, returnDefault) {
188
+ function* _whichSyncGeneratorCore(clientsToCheck, options) {
145
189
  let notFound = true;
146
190
  /**
147
191
  * 依序檢查每個套件管理器是否可用
148
192
  * Check each package manager sequentially for availability
149
193
  */
150
194
  for (const client of clientsToCheck) {
151
- const commandPath = (0, which_1.sync)(client);
195
+ const commandPath = (0, which_1.sync)(client, _whichOptions);
152
196
  if (commandPath) {
153
197
  yield [client, commandPath];
154
198
  notFound = false;
155
199
  }
156
200
  }
157
- if (returnDefault && notFound)
201
+ if (options.returnDefault && notFound)
158
202
  return [clientsToCheck[0]];
159
203
  }
160
204
  /**
@@ -164,9 +208,9 @@ function* _whichSyncGeneratorCore(clientsToCheck, returnDefault) {
164
208
  * @param npmClients - 套件管理器列表 / Package manager list
165
209
  * @returns 所有可用的套件管理器陣列 / Array of all available package managers
166
210
  */
167
- function whichPackageManagerSyncAll(npmClients, returnDefault) {
211
+ function whichPackageManagerSyncAll(npmClients, returnDefaultOrOptions) {
168
212
  const result = [];
169
- for (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefault)) {
213
+ for (const client of _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions)) {
170
214
  result.push(client[0]);
171
215
  }
172
216
  return result;
@@ -178,9 +222,9 @@ function whichPackageManagerSyncAll(npmClients, returnDefault) {
178
222
  * @param npmClients - 套件管理器列表 / Package manager list
179
223
  * @returns 可用的套件管理器名稱 / Available package manager name
180
224
  */
181
- function whichPackageManagerSync(npmClients, returnDefault) {
225
+ function whichPackageManagerSync(npmClients, returnDefaultOrOptions) {
182
226
  var _a;
183
- return (_a = _whichPackageManagerSyncGenerator(npmClients, returnDefault).next().value) === null || _a === void 0 ? void 0 : _a[0];
227
+ return (_a = _whichPackageManagerSyncGenerator(npmClients, returnDefaultOrOptions).next().value) === null || _a === void 0 ? void 0 : _a[0];
184
228
  }
185
229
  exports.default = whichPackageManagerSync;
186
230
  //# 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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | 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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, options?: IOptionsWhichPackageManager): readonly IPackageManager[]\n{\n\t/**\n\t * 合併使用者指定的優先順序與預設順序\n\t * Merge user-specified priority with default order\n\t */\n\tif (npmClients?.length)\n\t{\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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSAsyncGenerator<IResultDetectPackageManagerRaw>\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(npmClients?: ITSArrayListMaybeReadonly<IPackageManager> | undefined, returnDefaultOrOptions?: IRuntimeOptionInput): ITSGenerator<IResultDetectPackageManagerRaw>\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.5",
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": "73804da54e39cd8250f1dec1e1a35f72acdecfc3"
87
87
  }