@electron-forge/core-utils 8.0.0-alpha.3 → 8.0.0-alpha.4

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.
@@ -14,7 +14,7 @@ export declare const PACKAGE_MANAGERS: Record<SupportedPackageManager, PMDetails
14
14
  /**
15
15
  * Resolves the package manager to use. In order, it checks the following:
16
16
  *
17
- * 1. The value of the `NODE_INSTALLER` environment variable.
17
+ * 1. An explicit arg being passed into the function.
18
18
  * 2. The `process.env.npm_config_user_agent` value set by the executing package manager.
19
19
  * 3. The presence of a lockfile in an ancestor directory.
20
20
  * 4. If an unknown package manager is used (or none of the above apply), then we fall back to `npm`.
@@ -24,6 +24,6 @@ export declare const PACKAGE_MANAGERS: Record<SupportedPackageManager, PMDetails
24
24
  * Supported package managers are `yarn`, `pnpm`, and `npm`.
25
25
  *
26
26
  */
27
- export declare const resolvePackageManager: () => Promise<PMDetails>;
27
+ export declare const resolvePackageManager: (packageManager?: string) => Promise<PMDetails>;
28
28
  export declare const spawnPackageManager: (pm: PMDetails, args?: CrossSpawnArgs, opts?: CrossSpawnOptions) => Promise<string>;
29
29
  //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,iBAAiB,EAElB,MAAM,6BAA6B,CAAC;AAQrC,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,uBAAuB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,uBAAuB,EAAE,SAAS,CAmBvE,CAAC;AA2BF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,OAAO,CAAC,SAAS,CAsE1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,OAC1B,SAAS,SACN,cAAc,SACd,iBAAiB,KACvB,QAAQ,MAAM,CAEhB,CAAC"}
1
+ {"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../src/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,cAAc,EACd,iBAAiB,EAElB,MAAM,6BAA6B,CAAC;AAMrC,MAAM,MAAM,uBAAuB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAC9D,MAAM,MAAM,SAAS,GAAG;IACtB,UAAU,EAAE,uBAAuB,CAAC;IACpC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;AAIF;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,uBAAuB,EAAE,SAAS,CAmBvE,CAAC;AA2BF;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,qBAAqB,EAAE,CAClC,cAAc,CAAC,EAAE,MAAM,KACpB,OAAO,CAAC,SAAS,CA0ErB,CAAC;AAEF,eAAO,MAAM,mBAAmB,OAC1B,SAAS,SACN,cAAc,SACd,iBAAiB,KACvB,QAAQ,MAAM,CAEhB,CAAC"}
@@ -6,12 +6,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.spawnPackageManager = exports.resolvePackageManager = exports.PACKAGE_MANAGERS = void 0;
7
7
  const node_path_1 = __importDefault(require("node:path"));
8
8
  const cross_spawn_promise_1 = require("@malept/cross-spawn-promise");
9
- const chalk_1 = __importDefault(require("chalk"));
10
9
  const debug_1 = __importDefault(require("debug"));
11
10
  const find_up_1 = __importDefault(require("find-up"));
12
- const log_symbols_1 = __importDefault(require("log-symbols"));
13
11
  const d = (0, debug_1.default)('electron-forge:package-manager');
14
- let hasWarned = false;
12
+ let explicitPMCache;
15
13
  /**
16
14
  * Supported package managers and the commands and flags they need to install dependencies.
17
15
  */
@@ -61,7 +59,7 @@ function pmFromUserAgent() {
61
59
  /**
62
60
  * Resolves the package manager to use. In order, it checks the following:
63
61
  *
64
- * 1. The value of the `NODE_INSTALLER` environment variable.
62
+ * 1. An explicit arg being passed into the function.
65
63
  * 2. The `process.env.npm_config_user_agent` value set by the executing package manager.
66
64
  * 3. The presence of a lockfile in an ancestor directory.
67
65
  * 4. If an unknown package manager is used (or none of the above apply), then we fall back to `npm`.
@@ -71,7 +69,31 @@ function pmFromUserAgent() {
71
69
  * Supported package managers are `yarn`, `pnpm`, and `npm`.
72
70
  *
73
71
  */
74
- const resolvePackageManager = async () => {
72
+ const resolvePackageManager = async (packageManager) => {
73
+ let installer;
74
+ let installerVersion;
75
+ // Check explicit packageManager argument FIRST, before cache
76
+ // This ensures explicit args always take precedence
77
+ if (packageManager) {
78
+ const match = packageManager.match(/^(npm|pnpm|yarn)(?:@(latest|\d+(?:\.\d+)?(?:\.\d+)?(?:-.+)?))?$/);
79
+ if (match) {
80
+ const [, executable, version] = match;
81
+ if (Object.keys(exports.PACKAGE_MANAGERS).includes(executable)) {
82
+ const pm = exports.PACKAGE_MANAGERS[executable];
83
+ installerVersion = version ?? 'latest';
84
+ explicitPMCache = { ...pm, version: installerVersion };
85
+ d(`Resolved and cached explicit package manager: ${pm.executable}`);
86
+ return explicitPMCache;
87
+ }
88
+ else {
89
+ d(`Attempted to parse ${packageManager} to regex but failed. Falling back!`);
90
+ }
91
+ }
92
+ }
93
+ if (explicitPMCache) {
94
+ d(`Using cached explicit package manager: ${explicitPMCache.executable}`);
95
+ return explicitPMCache;
96
+ }
75
97
  const executingPM = pmFromUserAgent();
76
98
  let lockfilePM;
77
99
  const lockfile = await (0, find_up_1.default)(['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml', 'pnpm-workspace.yaml'], { type: 'file' });
@@ -79,22 +101,7 @@ const resolvePackageManager = async () => {
79
101
  const lockfileName = node_path_1.default.basename(lockfile);
80
102
  lockfilePM = PM_FROM_LOCKFILE[lockfileName];
81
103
  }
82
- let installer;
83
- let installerVersion;
84
- if (typeof process.env.NODE_INSTALLER === 'string') {
85
- if (Object.keys(exports.PACKAGE_MANAGERS).includes(process.env.NODE_INSTALLER)) {
86
- installer = process.env.NODE_INSTALLER;
87
- installerVersion = await (0, exports.spawnPackageManager)(exports.PACKAGE_MANAGERS[installer], ['--version']);
88
- if (!hasWarned) {
89
- console.warn(log_symbols_1.default.warning, chalk_1.default.yellow(`The NODE_INSTALLER environment variable is deprecated and will be removed in Electron Forge v8`));
90
- hasWarned = true;
91
- }
92
- }
93
- else {
94
- console.warn(log_symbols_1.default.warning, chalk_1.default.yellow(`Package manager ${chalk_1.default.red(process.env.NODE_INSTALLER)} is unsupported. Falling back to ${chalk_1.default.green('npm')} instead.`));
95
- }
96
- }
97
- else if (executingPM) {
104
+ if (executingPM) {
98
105
  installer = executingPM.name;
99
106
  installerVersion = executingPM.version;
100
107
  }
@@ -106,7 +113,7 @@ const resolvePackageManager = async () => {
106
113
  case 'yarn':
107
114
  case 'npm':
108
115
  case 'pnpm':
109
- d(`Resolved package manager to ${installer}. (Derived from NODE_INSTALLER: ${process.env.NODE_INSTALLER}, npm_config_user_agent: ${process.env.npm_config_user_agent}, lockfile: ${lockfilePM})`);
116
+ d(`Resolved package manager to ${installer}. (Derived from npm_config_user_agent: ${process.env.npm_config_user_agent}, lockfile: ${lockfilePM})`);
110
117
  return {
111
118
  ...exports.PACKAGE_MANAGERS[installer],
112
119
  version: installerVersion,
@@ -126,4 +133,4 @@ const spawnPackageManager = async (pm, args, opts) => {
126
133
  return (await (0, cross_spawn_promise_1.spawn)(pm.executable, args, opts)).trim();
127
134
  };
128
135
  exports.spawnPackageManager = spawnPackageManager;
129
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhY2thZ2UtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBNkI7QUFFN0IscUVBSXFDO0FBQ3JDLGtEQUEwQjtBQUMxQixrREFBMEI7QUFDMUIsc0RBQTZCO0FBQzdCLDhEQUFxQztBQUVyQyxNQUFNLENBQUMsR0FBRyxJQUFBLGVBQUssRUFBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0FBV2xELElBQUksU0FBUyxHQUFHLEtBQUssQ0FBQztBQUV0Qjs7R0FFRztBQUNVLFFBQUEsZ0JBQWdCLEdBQStDO0lBQzFFLElBQUksRUFBRTtRQUNKLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsR0FBRyxFQUFFLE9BQU87UUFDWixLQUFLLEVBQUUsU0FBUztLQUNqQjtJQUNELEdBQUcsRUFBRTtRQUNILFVBQVUsRUFBRSxLQUFLO1FBQ2pCLE9BQU8sRUFBRSxTQUFTO1FBQ2xCLEdBQUcsRUFBRSxZQUFZO1FBQ2pCLEtBQUssRUFBRSxjQUFjO0tBQ3RCO0lBQ0QsSUFBSSxFQUFFO1FBQ0osVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLEtBQUs7UUFDZCxHQUFHLEVBQUUsWUFBWTtRQUNqQixLQUFLLEVBQUUsY0FBYztLQUN0QjtDQUNGLENBQUM7QUFFRixNQUFNLGdCQUFnQixHQUE0QztJQUNoRSxtQkFBbUIsRUFBRSxLQUFLO0lBQzFCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLGdCQUFnQixFQUFFLE1BQU07Q0FDekIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxTQUFTLGVBQWU7SUFDdEIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQztJQUNwRCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDZixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBQ0QsTUFBTSxNQUFN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
136
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2FnZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3BhY2thZ2UtbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSwwREFBNkI7QUFFN0IscUVBSXFDO0FBQ3JDLGtEQUEwQjtBQUMxQixzREFBNkI7QUFFN0IsTUFBTSxDQUFDLEdBQUcsSUFBQSxlQUFLLEVBQUMsZ0NBQWdDLENBQUMsQ0FBQztBQVdsRCxJQUFJLGVBQXNDLENBQUM7QUFFM0M7O0dBRUc7QUFDVSxRQUFBLGdCQUFnQixHQUErQztJQUMxRSxJQUFJLEVBQUU7UUFDSixVQUFVLEVBQUUsTUFBTTtRQUNsQixPQUFPLEVBQUUsS0FBSztRQUNkLEdBQUcsRUFBRSxPQUFPO1FBQ1osS0FBSyxFQUFFLFNBQVM7S0FDakI7SUFDRCxHQUFHLEVBQUU7UUFDSCxVQUFVLEVBQUUsS0FBSztRQUNqQixPQUFPLEVBQUUsU0FBUztRQUNsQixHQUFHLEVBQUUsWUFBWTtRQUNqQixLQUFLLEVBQUUsY0FBYztLQUN0QjtJQUNELElBQUksRUFBRTtRQUNKLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLE9BQU8sRUFBRSxLQUFLO1FBQ2QsR0FBRyxFQUFFLFlBQVk7UUFDakIsS0FBSyxFQUFFLGNBQWM7S0FDdEI7Q0FDRixDQUFDO0FBRUYsTUFBTSxnQkFBZ0IsR0FBNEM7SUFDaEUsbUJBQW1CLEVBQUUsS0FBSztJQUMxQixXQUFXLEVBQUUsTUFBTTtJQUNuQixnQkFBZ0IsRUFBRSxNQUFNO0NBQ3pCLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsU0FBUyxlQUFlO0lBQ3RCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUM7SUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ2YsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUNELE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFF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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@electron-forge/core-utils",
3
- "version": "8.0.0-alpha.3",
3
+ "version": "8.0.0-alpha.4",
4
4
  "description": "Core utilities for the Electron Forge packages",
5
5
  "repository": "https://github.com/electron/forge",
6
6
  "author": "Samuel Attard",
@@ -8,7 +8,7 @@
8
8
  "main": "dist/index.js",
9
9
  "typings": "dist/index.d.ts",
10
10
  "dependencies": {
11
- "@electron-forge/shared-types": "8.0.0-alpha.3",
11
+ "@electron-forge/shared-types": "8.0.0-alpha.4",
12
12
  "@electron/rebuild": "^3.7.0",
13
13
  "@malept/cross-spawn-promise": "^2.0.0",
14
14
  "chalk": "^4.0.0",
@@ -23,11 +23,11 @@
23
23
  "node": ">= 16.4.0"
24
24
  },
25
25
  "devDependencies": {
26
- "vitest": "^3.1.3"
26
+ "vitest": "^4.0.14"
27
27
  },
28
28
  "files": [
29
29
  "dist",
30
30
  "src"
31
31
  ],
32
- "gitHead": "1ac299b86edfb2173f44f885148310648db03e88"
32
+ "gitHead": "9f2c01f571044c66cd578cfa9e64fa352532adc0"
33
33
  }
@@ -5,10 +5,8 @@ import {
5
5
  CrossSpawnOptions,
6
6
  spawn,
7
7
  } from '@malept/cross-spawn-promise';
8
- import chalk from 'chalk';
9
8
  import debug from 'debug';
10
9
  import findUp from 'find-up';
11
- import logSymbols from 'log-symbols';
12
10
 
13
11
  const d = debug('electron-forge:package-manager');
14
12
 
@@ -21,7 +19,7 @@ export type PMDetails = {
21
19
  exact: string;
22
20
  };
23
21
 
24
- let hasWarned = false;
22
+ let explicitPMCache: PMDetails | undefined;
25
23
 
26
24
  /**
27
25
  * Supported package managers and the commands and flags they need to install dependencies.
@@ -75,7 +73,7 @@ function pmFromUserAgent() {
75
73
  /**
76
74
  * Resolves the package manager to use. In order, it checks the following:
77
75
  *
78
- * 1. The value of the `NODE_INSTALLER` environment variable.
76
+ * 1. An explicit arg being passed into the function.
79
77
  * 2. The `process.env.npm_config_user_agent` value set by the executing package manager.
80
78
  * 3. The presence of a lockfile in an ancestor directory.
81
79
  * 4. If an unknown package manager is used (or none of the above apply), then we fall back to `npm`.
@@ -85,7 +83,40 @@ function pmFromUserAgent() {
85
83
  * Supported package managers are `yarn`, `pnpm`, and `npm`.
86
84
  *
87
85
  */
88
- export const resolvePackageManager: () => Promise<PMDetails> = async () => {
86
+ export const resolvePackageManager: (
87
+ packageManager?: string,
88
+ ) => Promise<PMDetails> = async (packageManager) => {
89
+ let installer: string | undefined;
90
+ let installerVersion: string | undefined;
91
+
92
+ // Check explicit packageManager argument FIRST, before cache
93
+ // This ensures explicit args always take precedence
94
+ if (packageManager) {
95
+ const match = packageManager.match(
96
+ /^(npm|pnpm|yarn)(?:@(latest|\d+(?:\.\d+)?(?:\.\d+)?(?:-.+)?))?$/,
97
+ );
98
+
99
+ if (match) {
100
+ const [, executable, version] = match;
101
+ if (Object.keys(PACKAGE_MANAGERS).includes(executable)) {
102
+ const pm = PACKAGE_MANAGERS[executable as SupportedPackageManager];
103
+ installerVersion = version ?? 'latest';
104
+ explicitPMCache = { ...pm, version: installerVersion };
105
+ d(`Resolved and cached explicit package manager: ${pm.executable}`);
106
+ return explicitPMCache;
107
+ } else {
108
+ d(
109
+ `Attempted to parse ${packageManager} to regex but failed. Falling back!`,
110
+ );
111
+ }
112
+ }
113
+ }
114
+
115
+ if (explicitPMCache) {
116
+ d(`Using cached explicit package manager: ${explicitPMCache.executable}`);
117
+ return explicitPMCache;
118
+ }
119
+
89
120
  const executingPM = pmFromUserAgent();
90
121
  let lockfilePM;
91
122
  const lockfile = await findUp(
@@ -97,34 +128,7 @@ export const resolvePackageManager: () => Promise<PMDetails> = async () => {
97
128
  lockfilePM = PM_FROM_LOCKFILE[lockfileName];
98
129
  }
99
130
 
100
- let installer;
101
- let installerVersion;
102
-
103
- if (typeof process.env.NODE_INSTALLER === 'string') {
104
- if (Object.keys(PACKAGE_MANAGERS).includes(process.env.NODE_INSTALLER)) {
105
- installer = process.env.NODE_INSTALLER;
106
- installerVersion = await spawnPackageManager(
107
- PACKAGE_MANAGERS[installer as SupportedPackageManager],
108
- ['--version'],
109
- );
110
- if (!hasWarned) {
111
- console.warn(
112
- logSymbols.warning,
113
- chalk.yellow(
114
- `The NODE_INSTALLER environment variable is deprecated and will be removed in Electron Forge v8`,
115
- ),
116
- );
117
- hasWarned = true;
118
- }
119
- } else {
120
- console.warn(
121
- logSymbols.warning,
122
- chalk.yellow(
123
- `Package manager ${chalk.red(process.env.NODE_INSTALLER)} is unsupported. Falling back to ${chalk.green('npm')} instead.`,
124
- ),
125
- );
126
- }
127
- } else if (executingPM) {
131
+ if (executingPM) {
128
132
  installer = executingPM.name;
129
133
  installerVersion = executingPM.version;
130
134
  } else if (lockfilePM) {
@@ -140,7 +144,7 @@ export const resolvePackageManager: () => Promise<PMDetails> = async () => {
140
144
  case 'npm':
141
145
  case 'pnpm':
142
146
  d(
143
- `Resolved package manager to ${installer}. (Derived from NODE_INSTALLER: ${process.env.NODE_INSTALLER}, npm_config_user_agent: ${process.env.npm_config_user_agent}, lockfile: ${lockfilePM})`,
147
+ `Resolved package manager to ${installer}. (Derived from npm_config_user_agent: ${process.env.npm_config_user_agent}, lockfile: ${lockfilePM})`,
144
148
  );
145
149
  return {
146
150
  ...PACKAGE_MANAGERS[installer],