@servicetitan/install 36.1.1 → 36.1.2-canary.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js +6 -12
- package/dist/cli/install.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/package-manager/__mocks__/mock-package-manager.d.ts +13 -0
- package/dist/package-manager/__mocks__/mock-package-manager.d.ts.map +1 -0
- package/dist/package-manager/get-package-manager.d.ts +3 -0
- package/dist/package-manager/get-package-manager.d.ts.map +1 -0
- package/dist/package-manager/get-package-manager.js +37 -0
- package/dist/package-manager/get-package-manager.js.map +1 -0
- package/dist/package-manager/index.d.ts +4 -0
- package/dist/package-manager/index.d.ts.map +1 -0
- package/dist/package-manager/index.js +22 -0
- package/dist/package-manager/index.js.map +1 -0
- package/dist/package-manager/npm-package-manager.d.ts +28 -0
- package/dist/package-manager/npm-package-manager.d.ts.map +1 -0
- package/dist/package-manager/npm-package-manager.js +91 -0
- package/dist/package-manager/npm-package-manager.js.map +1 -0
- package/dist/package-manager/package-manager.d.ts +28 -0
- package/dist/package-manager/package-manager.d.ts.map +1 -0
- package/dist/package-manager/package-manager.js +84 -0
- package/dist/package-manager/package-manager.js.map +1 -0
- package/dist/package-manager/pnpm-package-manager.d.ts +31 -0
- package/dist/package-manager/pnpm-package-manager.d.ts.map +1 -0
- package/dist/package-manager/pnpm-package-manager.js +87 -0
- package/dist/package-manager/pnpm-package-manager.js.map +1 -0
- package/dist/utils/os.js +10 -5
- package/dist/utils/os.js.map +1 -1
- package/package.json +2 -3
- package/src/cli/install.ts +4 -9
- package/src/index.ts +2 -0
- package/src/package-manager/__mocks__/mock-package-manager.ts +26 -0
- package/src/package-manager/get-package-manager.ts +21 -0
- package/src/package-manager/index.ts +3 -0
- package/src/package-manager/npm-package-manager.ts +74 -0
- package/src/package-manager/package-manager.ts +53 -0
- package/src/package-manager/pnpm-package-manager.ts +82 -0
- package/src/utils/os.ts +9 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAYA,MAAM,WAAW,IAAI;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,qBAAa,OAAO;IAChB,IAAI,EAAE,IAAI,CAAC;gBAEC,IAAI,EAAE,IAAI;IAItB,OAAO;IASP,OAAO,CAAC,iBAAiB;IA0CzB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,eAAe;CAa1B"}
|
package/dist/cli/install.js
CHANGED
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "Install", {
|
|
|
11
11
|
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
12
|
const _os = /*#__PURE__*/ _interop_require_default(require("os"));
|
|
13
13
|
const _path = /*#__PURE__*/ _interop_require_default(require("path"));
|
|
14
|
+
const _packagemanager = require("../package-manager");
|
|
14
15
|
const _utils = require("../utils");
|
|
15
16
|
function _define_property(obj, key, value) {
|
|
16
17
|
if (key in obj) {
|
|
@@ -133,20 +134,13 @@ class Install {
|
|
|
133
134
|
if (this.args.token) {
|
|
134
135
|
return;
|
|
135
136
|
}
|
|
136
|
-
const
|
|
137
|
-
(0, _utils.isCI)() ? 'ci' : 'i',
|
|
138
|
-
'--audit=false',
|
|
139
|
-
'--fund=false',
|
|
140
|
-
'--legacy-peer-deps',
|
|
141
|
-
...this.args.fix ? [
|
|
142
|
-
'--package-lock-only',
|
|
143
|
-
'--prefer-dedupe'
|
|
144
|
-
] : []
|
|
145
|
-
];
|
|
137
|
+
const packageManager = (0, _packagemanager.getPackageManager)();
|
|
146
138
|
if (!this.args.quiet) {
|
|
147
|
-
console.log(`Running
|
|
139
|
+
console.log(`Running ${packageManager.command} install`);
|
|
148
140
|
}
|
|
149
|
-
|
|
141
|
+
packageManager.installPackages({
|
|
142
|
+
fix: this.args.fix
|
|
143
|
+
}, {
|
|
150
144
|
env,
|
|
151
145
|
stdio: 'inherit'
|
|
152
146
|
});
|
package/dist/cli/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/install.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { debug, getVersion, gitCloneRepo, isCI, npmWhoAmI, readJson, runCommand } from '../utils';\n\nconst REPO_NAME = 'frontend-dev-config';\nconst AUTH_TOKEN_KEY = '//registry.npmjs.org/:_authToken';\nconst AUTH_TOKEN_REGEX = /^\\/\\/registry\\.npmjs\\.org\\/:_authToken=\\s*(?<authToken>.+)/m;\nconst ENVIRONMENT_VARIABLE_REGEX = /\\${(?<environmentVariable>[^}]+)}/;\n\nexport interface Args {\n fix?: boolean;\n quiet?: boolean;\n token?: boolean;\n}\n\nexport class Install {\n args: Args;\n\n constructor(args: Args) {\n this.args = args;\n }\n\n execute() {\n if (!this.args.quiet) {\n console.log(`install cli v${getVersion()}`);\n }\n\n const env = this.configureNpmToken();\n this.installPackages(env);\n }\n\n private configureNpmToken() {\n if (isCI() || this.args.fix || this.args.token === false) {\n return;\n }\n\n if (!this.args.quiet) {\n console.log('Configuring NPM token ...');\n }\n\n if (this.args.token !== true) {\n if (npmWhoAmI() === 'st-team') {\n return;\n }\n }\n\n const token = this.fetchNpmToken();\n if (!token) {\n return;\n }\n\n runCommand('npm', ['config', 'set', `${AUTH_TOKEN_KEY}=${token}`]);\n\n if (!fs.existsSync('.npmrc')) {\n return;\n }\n\n const npmrc = fs.readFileSync('.npmrc', 'utf-8');\n const { authToken } = AUTH_TOKEN_REGEX.exec(npmrc)?.groups ?? {};\n debug({ authToken });\n if (!authToken) {\n return;\n }\n\n const { environmentVariable } = ENVIRONMENT_VARIABLE_REGEX.exec(authToken)?.groups ?? {};\n debug({ environmentVariable });\n if (environmentVariable) {\n return { [environmentVariable]: token };\n }\n\n runCommand('npm', ['config', 'delete', '--location=project', AUTH_TOKEN_KEY]);\n }\n\n private fetchNpmToken() {\n const tempDirPath = fs.mkdtempSync(path.join(os.tmpdir(), 'st-install-'));\n try {\n if (!gitCloneRepo({ destination: tempDirPath, name: REPO_NAME })) {\n throw new Error(`could not clone servicetitan/${REPO_NAME}`);\n }\n\n const npmJson = readJson(path.join(tempDirPath, '.npm.json'));\n debug('install:fetch-npm-token', { npmJson });\n\n if (!((npmJson && typeof npmJson === 'object') || Array.isArray(npmJson))) {\n throw new Error('.npm.json is not an object');\n }\n\n const { readOnlyToken: authToken } = npmJson;\n if (!authToken) {\n throw new Error('.npm.json does not contain auth token');\n }\n\n if (typeof authToken !== 'string') {\n throw new Error('.npm.json auth token is not a string');\n }\n\n return Buffer.from(authToken, 'base64').toString('utf-8');\n } catch (e) {\n console.warn(String(e));\n } finally {\n try {\n fs.rmSync(tempDirPath, { recursive: true, force: true });\n } catch {\n // ignore\n }\n }\n }\n\n private installPackages(env?: Record<string, string>) {\n if (this.args.token) {\n return;\n }\n\n const
|
|
1
|
+
{"version":3,"sources":["../../src/cli/install.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { getPackageManager } from '../package-manager';\nimport { debug, getVersion, gitCloneRepo, isCI, npmWhoAmI, readJson, runCommand } from '../utils';\n\nconst REPO_NAME = 'frontend-dev-config';\nconst AUTH_TOKEN_KEY = '//registry.npmjs.org/:_authToken';\nconst AUTH_TOKEN_REGEX = /^\\/\\/registry\\.npmjs\\.org\\/:_authToken=\\s*(?<authToken>.+)/m;\nconst ENVIRONMENT_VARIABLE_REGEX = /\\${(?<environmentVariable>[^}]+)}/;\n\nexport interface Args {\n fix?: boolean;\n quiet?: boolean;\n token?: boolean;\n}\n\nexport class Install {\n args: Args;\n\n constructor(args: Args) {\n this.args = args;\n }\n\n execute() {\n if (!this.args.quiet) {\n console.log(`install cli v${getVersion()}`);\n }\n\n const env = this.configureNpmToken();\n this.installPackages(env);\n }\n\n private configureNpmToken() {\n if (isCI() || this.args.fix || this.args.token === false) {\n return;\n }\n\n if (!this.args.quiet) {\n console.log('Configuring NPM token ...');\n }\n\n if (this.args.token !== true) {\n if (npmWhoAmI() === 'st-team') {\n return;\n }\n }\n\n const token = this.fetchNpmToken();\n if (!token) {\n return;\n }\n\n runCommand('npm', ['config', 'set', `${AUTH_TOKEN_KEY}=${token}`]);\n\n if (!fs.existsSync('.npmrc')) {\n return;\n }\n\n const npmrc = fs.readFileSync('.npmrc', 'utf-8');\n const { authToken } = AUTH_TOKEN_REGEX.exec(npmrc)?.groups ?? {};\n debug({ authToken });\n if (!authToken) {\n return;\n }\n\n const { environmentVariable } = ENVIRONMENT_VARIABLE_REGEX.exec(authToken)?.groups ?? {};\n debug({ environmentVariable });\n if (environmentVariable) {\n return { [environmentVariable]: token };\n }\n\n runCommand('npm', ['config', 'delete', '--location=project', AUTH_TOKEN_KEY]);\n }\n\n private fetchNpmToken() {\n const tempDirPath = fs.mkdtempSync(path.join(os.tmpdir(), 'st-install-'));\n try {\n if (!gitCloneRepo({ destination: tempDirPath, name: REPO_NAME })) {\n throw new Error(`could not clone servicetitan/${REPO_NAME}`);\n }\n\n const npmJson = readJson(path.join(tempDirPath, '.npm.json'));\n debug('install:fetch-npm-token', { npmJson });\n\n if (!((npmJson && typeof npmJson === 'object') || Array.isArray(npmJson))) {\n throw new Error('.npm.json is not an object');\n }\n\n const { readOnlyToken: authToken } = npmJson;\n if (!authToken) {\n throw new Error('.npm.json does not contain auth token');\n }\n\n if (typeof authToken !== 'string') {\n throw new Error('.npm.json auth token is not a string');\n }\n\n return Buffer.from(authToken, 'base64').toString('utf-8');\n } catch (e) {\n console.warn(String(e));\n } finally {\n try {\n fs.rmSync(tempDirPath, { recursive: true, force: true });\n } catch {\n // ignore\n }\n }\n }\n\n private installPackages(env?: Record<string, string>) {\n if (this.args.token) {\n return;\n }\n\n const packageManager = getPackageManager();\n\n if (!this.args.quiet) {\n console.log(`Running ${packageManager.command} install`);\n }\n\n packageManager.installPackages({ fix: this.args.fix }, { env, stdio: 'inherit' });\n }\n}\n"],"names":["Install","REPO_NAME","AUTH_TOKEN_KEY","AUTH_TOKEN_REGEX","ENVIRONMENT_VARIABLE_REGEX","execute","args","quiet","console","log","getVersion","env","configureNpmToken","installPackages","isCI","fix","token","npmWhoAmI","fetchNpmToken","runCommand","fs","existsSync","npmrc","readFileSync","authToken","exec","groups","debug","environmentVariable","tempDirPath","mkdtempSync","path","join","os","tmpdir","gitCloneRepo","destination","name","Error","npmJson","readJson","Array","isArray","readOnlyToken","Buffer","from","toString","e","warn","String","rmSync","recursive","force","packageManager","getPackageManager","command","stdio"],"mappings":"AAAA,6BAA6B;;;;+BAkBhBA;;;eAAAA;;;2DAjBE;2DACA;6DACE;gCACiB;uBACqD;;;;;;;;;;;;;;;;;;;AAEvF,MAAMC,YAAY;AAClB,MAAMC,iBAAiB;AACvB,MAAMC,mBAAmB;AACzB,MAAMC,6BAA6B;AAQ5B,MAAMJ;IAOTK,UAAU;QACN,IAAI,CAAC,IAAI,CAACC,IAAI,CAACC,KAAK,EAAE;YAClBC,QAAQC,GAAG,CAAC,CAAC,aAAa,EAAEC,IAAAA,iBAAU,KAAI;QAC9C;QAEA,MAAMC,MAAM,IAAI,CAACC,iBAAiB;QAClC,IAAI,CAACC,eAAe,CAACF;IACzB;IAEQC,oBAAoB;;YA2BFT,wBAMUC;QAhChC,IAAIU,IAAAA,WAAI,OAAM,IAAI,CAACR,IAAI,CAACS,GAAG,IAAI,IAAI,CAACT,IAAI,CAACU,KAAK,KAAK,OAAO;YACtD;QACJ;QAEA,IAAI,CAAC,IAAI,CAACV,IAAI,CAACC,KAAK,EAAE;YAClBC,QAAQC,GAAG,CAAC;QAChB;QAEA,IAAI,IAAI,CAACH,IAAI,CAACU,KAAK,KAAK,MAAM;YAC1B,IAAIC,IAAAA,gBAAS,QAAO,WAAW;gBAC3B;YACJ;QACJ;QAEA,MAAMD,QAAQ,IAAI,CAACE,aAAa;QAChC,IAAI,CAACF,OAAO;YACR;QACJ;QAEAG,IAAAA,iBAAU,EAAC,OAAO;YAAC;YAAU;YAAO,GAAGjB,eAAe,CAAC,EAAEc,OAAO;SAAC;QAEjE,IAAI,CAACI,WAAE,CAACC,UAAU,CAAC,WAAW;YAC1B;QACJ;QAEA,MAAMC,QAAQF,WAAE,CAACG,YAAY,CAAC,UAAU;QACxC,MAAM,EAAEC,SAAS,EAAE,YAAGrB,yBAAAA,iBAAiBsB,IAAI,CAACH,oBAAtBnB,6CAAAA,uBAA8BuB,MAAM,uCAAI,CAAC;QAC/DC,IAAAA,YAAK,EAAC;YAAEH;QAAU;QAClB,IAAI,CAACA,WAAW;YACZ;QACJ;QAEA,MAAM,EAAEI,mBAAmB,EAAE,aAAGxB,mCAAAA,2BAA2BqB,IAAI,CAACD,wBAAhCpB,uDAAAA,iCAA4CsB,MAAM,yCAAI,CAAC;QACvFC,IAAAA,YAAK,EAAC;YAAEC;QAAoB;QAC5B,IAAIA,qBAAqB;YACrB,OAAO;gBAAE,CAACA,oBAAoB,EAAEZ;YAAM;QAC1C;QAEAG,IAAAA,iBAAU,EAAC,OAAO;YAAC;YAAU;YAAU;YAAsBjB;SAAe;IAChF;IAEQgB,gBAAgB;QACpB,MAAMW,cAAcT,WAAE,CAACU,WAAW,CAACC,aAAI,CAACC,IAAI,CAACC,WAAE,CAACC,MAAM,IAAI;QAC1D,IAAI;YACA,IAAI,CAACC,IAAAA,mBAAY,EAAC;gBAAEC,aAAaP;gBAAaQ,MAAMpC;YAAU,IAAI;gBAC9D,MAAM,IAAIqC,MAAM,CAAC,6BAA6B,EAAErC,WAAW;YAC/D;YAEA,MAAMsC,UAAUC,IAAAA,eAAQ,EAACT,aAAI,CAACC,IAAI,CAACH,aAAa;YAChDF,IAAAA,YAAK,EAAC,2BAA2B;gBAAEY;YAAQ;YAE3C,IAAI,CAAE,CAAA,AAACA,WAAW,OAAOA,YAAY,YAAaE,MAAMC,OAAO,CAACH,QAAO,GAAI;gBACvE,MAAM,IAAID,MAAM;YACpB;YAEA,MAAM,EAAEK,eAAenB,SAAS,EAAE,GAAGe;YACrC,IAAI,CAACf,WAAW;gBACZ,MAAM,IAAIc,MAAM;YACpB;YAEA,IAAI,OAAOd,cAAc,UAAU;gBAC/B,MAAM,IAAIc,MAAM;YACpB;YAEA,OAAOM,OAAOC,IAAI,CAACrB,WAAW,UAAUsB,QAAQ,CAAC;QACrD,EAAE,OAAOC,GAAG;YACRvC,QAAQwC,IAAI,CAACC,OAAOF;QACxB,SAAU;YACN,IAAI;gBACA3B,WAAE,CAAC8B,MAAM,CAACrB,aAAa;oBAAEsB,WAAW;oBAAMC,OAAO;gBAAK;YAC1D,EAAE,eAAM;YACJ,SAAS;YACb;QACJ;IACJ;IAEQvC,gBAAgBF,GAA4B,EAAE;QAClD,IAAI,IAAI,CAACL,IAAI,CAACU,KAAK,EAAE;YACjB;QACJ;QAEA,MAAMqC,iBAAiBC,IAAAA,iCAAiB;QAExC,IAAI,CAAC,IAAI,CAAChD,IAAI,CAACC,KAAK,EAAE;YAClBC,QAAQC,GAAG,CAAC,CAAC,QAAQ,EAAE4C,eAAeE,OAAO,CAAC,QAAQ,CAAC;QAC3D;QAEAF,eAAexC,eAAe,CAAC;YAAEE,KAAK,IAAI,CAACT,IAAI,CAACS,GAAG;QAAC,GAAG;YAAEJ;YAAK6C,OAAO;QAAU;IACnF;IAtGA,YAAYlD,IAAU,CAAE;QAFxBA,uBAAAA,QAAAA,KAAAA;QAGI,IAAI,CAACA,IAAI,GAAGA;IAChB;AAqGJ"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtE,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACpF,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,12 @@ function _export(target, all) {
|
|
|
9
9
|
});
|
|
10
10
|
}
|
|
11
11
|
_export(exports, {
|
|
12
|
+
get PackageManager () {
|
|
13
|
+
return _packagemanager.PackageManager;
|
|
14
|
+
},
|
|
15
|
+
get getPackageManager () {
|
|
16
|
+
return _packagemanager.getPackageManager;
|
|
17
|
+
},
|
|
12
18
|
get gitCloneRepo () {
|
|
13
19
|
return _utils.gitCloneRepo;
|
|
14
20
|
},
|
|
@@ -22,6 +28,7 @@ _export(exports, {
|
|
|
22
28
|
return _utils.npmWhoAmI;
|
|
23
29
|
}
|
|
24
30
|
});
|
|
31
|
+
const _packagemanager = require("./package-manager");
|
|
25
32
|
const _utils = require("./utils");
|
|
26
33
|
|
|
27
34
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI } from './utils';\n"],"names":["gitCloneRepo","gitIsReachable","isCI","npmWhoAmI"],"mappings":";;;;;;;;;;;QAASA;eAAAA,mBAAY;;QAAEC;eAAAA,qBAAc;;QAAEC;eAAAA,WAAI;;QAAEC;eAAAA,gBAAS;;;
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { PackageManager, getPackageManager } from './package-manager';\nexport type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';\nexport { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI } from './utils';\n"],"names":["PackageManager","getPackageManager","gitCloneRepo","gitIsReachable","isCI","npmWhoAmI"],"mappings":";;;;;;;;;;;QAASA;eAAAA,8BAAc;;QAAEC;eAAAA,iCAAiB;;QAEjCC;eAAAA,mBAAY;;QAAEC;eAAAA,qBAAc;;QAAEC;eAAAA,WAAI;;QAAEC;eAAAA,gBAAS;;;gCAFJ;uBAEY"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PackageManager } from '../../package-manager';
|
|
2
|
+
import type { DeclaredVersionQuery, ResolvedVersionQuery } from '../package-manager';
|
|
3
|
+
export declare class MockPackageManager extends PackageManager {
|
|
4
|
+
readonly command = "test";
|
|
5
|
+
readonly lockFileName = "test-lock.json";
|
|
6
|
+
readonly installArgs: string[];
|
|
7
|
+
clearCache(): void;
|
|
8
|
+
getDeclaredVersion(_query: DeclaredVersionQuery): string | undefined;
|
|
9
|
+
getResolvedVersion(_query: ResolvedVersionQuery): string | undefined;
|
|
10
|
+
protected getInstallArgs(): string[];
|
|
11
|
+
protected parseLockFile(): unknown;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=mock-package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-package-manager.d.ts","sourceRoot":"","sources":["../../../src/package-manager/__mocks__/mock-package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAErF,qBAAa,kBAAmB,SAAQ,cAAc;IAClD,QAAQ,CAAC,OAAO,UAAU;IAC1B,QAAQ,CAAC,YAAY,oBAAoB;IACzC,QAAQ,CAAC,WAAW,WAAe;IAEnC,UAAU;IAEV,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAIpE,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAIpE,SAAS,CAAC,cAAc,IAAI,MAAM,EAAE;IAIpC,SAAS,CAAC,aAAa,IAAI,OAAO;CAGrC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/get-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAGxD,wBAAgB,iBAAiB,IAAI,cAAc,CAUlD"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "getPackageManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return getPackageManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
+
const _npmpackagemanager = require("./npm-package-manager");
|
|
13
|
+
const _pnpmpackagemanager = require("./pnpm-package-manager");
|
|
14
|
+
function _interop_require_default(obj) {
|
|
15
|
+
return obj && obj.__esModule ? obj : {
|
|
16
|
+
default: obj
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function getPackageManager() {
|
|
20
|
+
const name = readPackageManagerName();
|
|
21
|
+
switch(name){
|
|
22
|
+
case 'npm':
|
|
23
|
+
return new _npmpackagemanager.NpmPackageManager();
|
|
24
|
+
case 'pnpm':
|
|
25
|
+
return new _pnpmpackagemanager.PnpmPackageManager();
|
|
26
|
+
default:
|
|
27
|
+
throw new Error(`Unsupported package manager: ${name}`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
function readPackageManagerName() {
|
|
31
|
+
var _ref;
|
|
32
|
+
var _packageJson_cli;
|
|
33
|
+
const packageJson = JSON.parse(_fs.default.readFileSync('package.json', 'utf-8'));
|
|
34
|
+
return (_ref = (_packageJson_cli = packageJson.cli) === null || _packageJson_cli === void 0 ? void 0 : _packageJson_cli.packageManager) !== null && _ref !== void 0 ? _ref : 'npm';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=get-package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/get-package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport { NpmPackageManager } from './npm-package-manager';\nimport type { PackageManager } from './package-manager';\nimport { PnpmPackageManager } from './pnpm-package-manager';\n\nexport function getPackageManager(): PackageManager {\n const name = readPackageManagerName();\n switch (name) {\n case 'npm':\n return new NpmPackageManager();\n case 'pnpm':\n return new PnpmPackageManager();\n default:\n throw new Error(`Unsupported package manager: ${name}`);\n }\n}\n\nfunction readPackageManagerName(): string {\n const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf-8'));\n return packageJson.cli?.packageManager ?? 'npm';\n}\n"],"names":["getPackageManager","name","readPackageManagerName","NpmPackageManager","PnpmPackageManager","Error","packageJson","JSON","parse","fs","readFileSync","cli","packageManager"],"mappings":";;;;+BAKgBA;;;eAAAA;;;2DALD;mCACmB;oCAEC;;;;;;AAE5B,SAASA;IACZ,MAAMC,OAAOC;IACb,OAAQD;QACJ,KAAK;YACD,OAAO,IAAIE,oCAAiB;QAChC,KAAK;YACD,OAAO,IAAIC,sCAAkB;QACjC;YACI,MAAM,IAAIC,MAAM,CAAC,6BAA6B,EAAEJ,MAAM;IAC9D;AACJ;AAEA,SAASC;;QAEEI;IADP,MAAMA,cAAcC,KAAKC,KAAK,CAACC,WAAE,CAACC,YAAY,CAAC,gBAAgB;IAC/D,gBAAOJ,mBAAAA,YAAYK,GAAG,cAAfL,uCAAAA,iBAAiBM,cAAc,uCAAI;AAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/package-manager/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,YAAY,EAAE,oBAAoB,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
get PackageManager () {
|
|
13
|
+
return _packagemanager.PackageManager;
|
|
14
|
+
},
|
|
15
|
+
get getPackageManager () {
|
|
16
|
+
return _getpackagemanager.getPackageManager;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const _getpackagemanager = require("./get-package-manager");
|
|
20
|
+
const _packagemanager = require("./package-manager");
|
|
21
|
+
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/index.ts"],"sourcesContent":["export { getPackageManager } from './get-package-manager';\nexport { PackageManager } from './package-manager';\nexport type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';\n"],"names":["PackageManager","getPackageManager"],"mappings":";;;;;;;;;;;QACSA;eAAAA,8BAAc;;QADdC;eAAAA,oCAAiB;;;mCAAQ;gCACH"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';
|
|
2
|
+
import { PackageManager } from './package-manager';
|
|
3
|
+
interface NpmLockFileEntry {
|
|
4
|
+
version?: string;
|
|
5
|
+
dependencies?: Record<string, string>;
|
|
6
|
+
peerDependencies?: Record<string, string>;
|
|
7
|
+
}
|
|
8
|
+
export interface NpmLockFile {
|
|
9
|
+
packages?: Record<string, NpmLockFileEntry>;
|
|
10
|
+
}
|
|
11
|
+
export declare class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
12
|
+
readonly command = "npm";
|
|
13
|
+
readonly lockFileName = "package-lock.json";
|
|
14
|
+
clearCache(): void;
|
|
15
|
+
getDeclaredVersion({ workspacePackage, declaredBy, dependency, }: DeclaredVersionQuery): string | undefined;
|
|
16
|
+
getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined;
|
|
17
|
+
protected getInstallArgs({ fix }: InstallArgs): string[];
|
|
18
|
+
protected parseLockFile(): NpmLockFile | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Looks up a lockfile entry for the given workspace package, falling back
|
|
21
|
+
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
22
|
+
* path from the repo root; the empty string `''` denotes the root
|
|
23
|
+
* workspace package itself, matching npm's own lockfile key convention.
|
|
24
|
+
*/
|
|
25
|
+
private findEntry;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=npm-package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"npm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/npm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,gBAAgB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC/C;AAED,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC9D,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,YAAY,uBAAuB;IAE5C,UAAU;IAIV,kBAAkB,CAAC,EACf,gBAAgB,EAChB,UAAU,EACV,UAAU,GACb,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAK5C,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAI9F,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE;IAUxD,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAQlD;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAapB"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "NpmPackageManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return NpmPackageManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
+
const _utils = require("../utils");
|
|
13
|
+
const _packagemanager = require("./package-manager");
|
|
14
|
+
function _define_property(obj, key, value) {
|
|
15
|
+
if (key in obj) {
|
|
16
|
+
Object.defineProperty(obj, key, {
|
|
17
|
+
value: value,
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
obj[key] = value;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
function _interop_require_default(obj) {
|
|
28
|
+
return obj && obj.__esModule ? obj : {
|
|
29
|
+
default: obj
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
class NpmPackageManager extends _packagemanager.PackageManager {
|
|
33
|
+
clearCache() {
|
|
34
|
+
(0, _utils.runCommand)('npm', [
|
|
35
|
+
'cache',
|
|
36
|
+
'clear',
|
|
37
|
+
'--force'
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
getDeclaredVersion({ workspacePackage, declaredBy, dependency }) {
|
|
41
|
+
var _ref;
|
|
42
|
+
var _entry_dependencies, _entry_peerDependencies;
|
|
43
|
+
const entry = this.findEntry({
|
|
44
|
+
workspacePackage,
|
|
45
|
+
package: declaredBy
|
|
46
|
+
});
|
|
47
|
+
return (_ref = entry === null || entry === void 0 ? void 0 : (_entry_dependencies = entry.dependencies) === null || _entry_dependencies === void 0 ? void 0 : _entry_dependencies[dependency]) !== null && _ref !== void 0 ? _ref : entry === null || entry === void 0 ? void 0 : (_entry_peerDependencies = entry.peerDependencies) === null || _entry_peerDependencies === void 0 ? void 0 : _entry_peerDependencies[dependency];
|
|
48
|
+
}
|
|
49
|
+
getResolvedVersion({ workspacePackage, dependency }) {
|
|
50
|
+
var _this_findEntry;
|
|
51
|
+
return (_this_findEntry = this.findEntry({
|
|
52
|
+
workspacePackage,
|
|
53
|
+
package: dependency
|
|
54
|
+
})) === null || _this_findEntry === void 0 ? void 0 : _this_findEntry.version;
|
|
55
|
+
}
|
|
56
|
+
getInstallArgs({ fix }) {
|
|
57
|
+
return [
|
|
58
|
+
(0, _utils.isCI)() ? 'ci' : 'i',
|
|
59
|
+
'--audit=false',
|
|
60
|
+
'--fund=false',
|
|
61
|
+
'--legacy-peer-deps',
|
|
62
|
+
...fix ? [
|
|
63
|
+
'--package-lock-only',
|
|
64
|
+
'--prefer-dedupe'
|
|
65
|
+
] : []
|
|
66
|
+
];
|
|
67
|
+
}
|
|
68
|
+
parseLockFile() {
|
|
69
|
+
try {
|
|
70
|
+
return JSON.parse(_fs.default.readFileSync(this.lockFileName, 'utf-8'));
|
|
71
|
+
} catch (unused) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Looks up a lockfile entry for the given workspace package, falling back
|
|
77
|
+
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
78
|
+
* path from the repo root; the empty string `''` denotes the root
|
|
79
|
+
* workspace package itself, matching npm's own lockfile key convention.
|
|
80
|
+
*/ findEntry({ workspacePackage, package: packageName }) {
|
|
81
|
+
var _ref;
|
|
82
|
+
var _this_getLockFile;
|
|
83
|
+
const packages = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : _this_getLockFile.packages;
|
|
84
|
+
return (_ref = packages === null || packages === void 0 ? void 0 : packages[`${workspacePackage}/node_modules/${packageName}`]) !== null && _ref !== void 0 ? _ref : packages === null || packages === void 0 ? void 0 : packages[`node_modules/${packageName}`];
|
|
85
|
+
}
|
|
86
|
+
constructor(...args){
|
|
87
|
+
super(...args), _define_property(this, "command", 'npm'), _define_property(this, "lockFileName", 'package-lock.json');
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=npm-package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/npm-package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport { isCI, runCommand } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\n\ninterface NpmLockFileEntry {\n version?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface NpmLockFile {\n packages?: Record<string, NpmLockFileEntry>;\n}\n\nexport class NpmPackageManager extends PackageManager<NpmLockFile> {\n readonly command = 'npm';\n readonly lockFileName = 'package-lock.json';\n\n clearCache() {\n runCommand('npm', ['cache', 'clear', '--force']);\n }\n\n getDeclaredVersion({\n workspacePackage,\n declaredBy,\n dependency,\n }: DeclaredVersionQuery): string | undefined {\n const entry = this.findEntry({ workspacePackage, package: declaredBy });\n return entry?.dependencies?.[dependency] ?? entry?.peerDependencies?.[dependency];\n }\n\n getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined {\n return this.findEntry({ workspacePackage, package: dependency })?.version;\n }\n\n protected getInstallArgs({ fix }: InstallArgs): string[] {\n return [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(fix ? ['--package-lock-only', '--prefer-dedupe'] : []),\n ];\n }\n\n protected parseLockFile(): NpmLockFile | undefined {\n try {\n return JSON.parse(fs.readFileSync(this.lockFileName, 'utf-8'));\n } catch {\n return undefined;\n }\n }\n\n /**\n * Looks up a lockfile entry for the given workspace package, falling back\n * to the hoisted root entry. `workspacePackage` is the package's relative\n * path from the repo root; the empty string `''` denotes the root\n * workspace package itself, matching npm's own lockfile key convention.\n */\n private findEntry({\n workspacePackage,\n package: packageName,\n }: {\n workspacePackage: string;\n package: string;\n }): NpmLockFileEntry | undefined {\n const packages = this.getLockFile()?.packages;\n return (\n packages?.[`${workspacePackage}/node_modules/${packageName}`] ??\n packages?.[`node_modules/${packageName}`]\n );\n }\n}\n"],"names":["NpmPackageManager","PackageManager","clearCache","runCommand","getDeclaredVersion","workspacePackage","declaredBy","dependency","entry","findEntry","package","dependencies","peerDependencies","getResolvedVersion","version","getInstallArgs","fix","isCI","parseLockFile","JSON","parse","fs","readFileSync","lockFileName","undefined","packageName","packages","getLockFile","command"],"mappings":";;;;+BAeaA;;;eAAAA;;;2DAfE;uBACkB;gCAEF;;;;;;;;;;;;;;;;;;;AAYxB,MAAMA,0BAA0BC,8BAAc;IAIjDC,aAAa;QACTC,IAAAA,iBAAU,EAAC,OAAO;YAAC;YAAS;YAAS;SAAU;IACnD;IAEAC,mBAAmB,EACfC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACS,EAAsB;;YAElCC,qBAAqCA;QAD5C,MAAMA,QAAQ,IAAI,CAACC,SAAS,CAAC;YAAEJ;YAAkBK,SAASJ;QAAW;QACrE,eAAOE,kBAAAA,6BAAAA,sBAAAA,MAAOG,YAAY,cAAnBH,0CAAAA,mBAAqB,CAACD,WAAW,uCAAIC,kBAAAA,6BAAAA,0BAAAA,MAAOI,gBAAgB,cAAvBJ,8CAAAA,uBAAyB,CAACD,WAAW;IACrF;IAEAM,mBAAmB,EAAER,gBAAgB,EAAEE,UAAU,EAAwB,EAAsB;YACpF;QAAP,QAAO,kBAAA,IAAI,CAACE,SAAS,CAAC;YAAEJ;YAAkBK,SAASH;QAAW,gBAAvD,sCAAA,gBAA2DO,OAAO;IAC7E;IAEUC,eAAe,EAAEC,GAAG,EAAe,EAAY;QACrD,OAAO;YACHC,IAAAA,WAAI,MAAK,OAAO;YAChB;YACA;YACA;eACID,MAAM;gBAAC;gBAAuB;aAAkB,GAAG,EAAE;SAC5D;IACL;IAEUE,gBAAyC;QAC/C,IAAI;YACA,OAAOC,KAAKC,KAAK,CAACC,WAAE,CAACC,YAAY,CAAC,IAAI,CAACC,YAAY,EAAE;QACzD,EAAE,eAAM;YACJ,OAAOC;QACX;IACJ;IAEA;;;;;KAKC,GACD,AAAQf,UAAU,EACdJ,gBAAgB,EAChBK,SAASe,WAAW,EAIvB,EAAgC;;YACZ;QAAjB,MAAMC,YAAW,oBAAA,IAAI,CAACC,WAAW,gBAAhB,wCAAA,kBAAoBD,QAAQ;QAC7C,eACIA,qBAAAA,+BAAAA,QAAU,CAAC,GAAGrB,iBAAiB,cAAc,EAAEoB,aAAa,CAAC,uCAC7DC,qBAAAA,+BAAAA,QAAU,CAAC,CAAC,aAAa,EAAED,aAAa,CAAC;IAEjD;;QAzDG,gBACH,uBAASG,WAAU,QACnB,uBAASL,gBAAe;;AAwD5B"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { runCommand } from '../utils';
|
|
2
|
+
export interface InstallArgs {
|
|
3
|
+
fix?: boolean;
|
|
4
|
+
}
|
|
5
|
+
export interface DeclaredVersionQuery {
|
|
6
|
+
workspacePackage: string;
|
|
7
|
+
declaredBy: string;
|
|
8
|
+
dependency: string;
|
|
9
|
+
}
|
|
10
|
+
export interface ResolvedVersionQuery {
|
|
11
|
+
workspacePackage: string;
|
|
12
|
+
dependency: string;
|
|
13
|
+
}
|
|
14
|
+
export declare abstract class PackageManager<LockFile = unknown> {
|
|
15
|
+
#private;
|
|
16
|
+
abstract readonly command: string;
|
|
17
|
+
abstract readonly lockFileName: string;
|
|
18
|
+
hasValidLockFile(): boolean;
|
|
19
|
+
installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
|
|
20
|
+
protected getLockFile(): LockFile | undefined;
|
|
21
|
+
protected reset(): void;
|
|
22
|
+
abstract clearCache(): void;
|
|
23
|
+
abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;
|
|
24
|
+
abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;
|
|
25
|
+
protected abstract getInstallArgs(args: InstallArgs): string[];
|
|
26
|
+
protected abstract parseLockFile(): LockFile | undefined;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/package-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,WAAW,WAAW;IACxB,GAAG,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACjC,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,8BAAsB,cAAc,CAAC,QAAQ,GAAG,OAAO;;IACnD,QAAQ,CAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAKvC,gBAAgB,IAAI,OAAO;IAI3B,eAAe,CAAC,IAAI,GAAE,WAAgB,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAKlF,SAAS,CAAC,WAAW,IAAI,QAAQ,GAAG,SAAS;IAQ7C,SAAS,CAAC,KAAK;IAKf,QAAQ,CAAC,UAAU,IAAI,IAAI;IAC3B,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAC5E,QAAQ,CAAC,kBAAkB,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAE5E,SAAS,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,MAAM,EAAE;IAC9D,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,QAAQ,GAAG,SAAS;CAC3D"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PackageManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PackageManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _utils = require("../utils");
|
|
12
|
+
function _check_private_redeclaration(obj, privateCollection) {
|
|
13
|
+
if (privateCollection.has(obj)) {
|
|
14
|
+
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
function _class_apply_descriptor_get(receiver, descriptor) {
|
|
18
|
+
if (descriptor.get) {
|
|
19
|
+
return descriptor.get.call(receiver);
|
|
20
|
+
}
|
|
21
|
+
return descriptor.value;
|
|
22
|
+
}
|
|
23
|
+
function _class_apply_descriptor_set(receiver, descriptor, value) {
|
|
24
|
+
if (descriptor.set) {
|
|
25
|
+
descriptor.set.call(receiver, value);
|
|
26
|
+
} else {
|
|
27
|
+
if (!descriptor.writable) {
|
|
28
|
+
throw new TypeError("attempted to set read only private field");
|
|
29
|
+
}
|
|
30
|
+
descriptor.value = value;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
function _class_extract_field_descriptor(receiver, privateMap, action) {
|
|
34
|
+
if (!privateMap.has(receiver)) {
|
|
35
|
+
throw new TypeError("attempted to " + action + " private field on non-instance");
|
|
36
|
+
}
|
|
37
|
+
return privateMap.get(receiver);
|
|
38
|
+
}
|
|
39
|
+
function _class_private_field_get(receiver, privateMap) {
|
|
40
|
+
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
|
|
41
|
+
return _class_apply_descriptor_get(receiver, descriptor);
|
|
42
|
+
}
|
|
43
|
+
function _class_private_field_init(obj, privateMap, value) {
|
|
44
|
+
_check_private_redeclaration(obj, privateMap);
|
|
45
|
+
privateMap.set(obj, value);
|
|
46
|
+
}
|
|
47
|
+
function _class_private_field_set(receiver, privateMap, value) {
|
|
48
|
+
var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
|
|
49
|
+
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
var _lockFile = /*#__PURE__*/ new WeakMap(), _lockFileLoaded = /*#__PURE__*/ new WeakMap();
|
|
53
|
+
class PackageManager {
|
|
54
|
+
hasValidLockFile() {
|
|
55
|
+
return this.getLockFile() !== undefined;
|
|
56
|
+
}
|
|
57
|
+
installPackages(args = {}, options) {
|
|
58
|
+
(0, _utils.runCommand)(this.command, this.getInstallArgs(args), options);
|
|
59
|
+
this.reset();
|
|
60
|
+
}
|
|
61
|
+
getLockFile() {
|
|
62
|
+
if (!_class_private_field_get(this, _lockFileLoaded)) {
|
|
63
|
+
_class_private_field_set(this, _lockFile, this.parseLockFile());
|
|
64
|
+
_class_private_field_set(this, _lockFileLoaded, true);
|
|
65
|
+
}
|
|
66
|
+
return _class_private_field_get(this, _lockFile);
|
|
67
|
+
}
|
|
68
|
+
reset() {
|
|
69
|
+
_class_private_field_set(this, _lockFile, undefined);
|
|
70
|
+
_class_private_field_set(this, _lockFileLoaded, false);
|
|
71
|
+
}
|
|
72
|
+
constructor(){
|
|
73
|
+
_class_private_field_init(this, _lockFile, {
|
|
74
|
+
writable: true,
|
|
75
|
+
value: void 0
|
|
76
|
+
});
|
|
77
|
+
_class_private_field_init(this, _lockFileLoaded, {
|
|
78
|
+
writable: true,
|
|
79
|
+
value: false
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
//# sourceMappingURL=package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/package-manager.ts"],"sourcesContent":["import { runCommand } from '../utils';\n\nexport interface InstallArgs {\n fix?: boolean;\n}\n\nexport interface DeclaredVersionQuery {\n workspacePackage: string;\n declaredBy: string;\n dependency: string;\n}\n\nexport interface ResolvedVersionQuery {\n workspacePackage: string;\n dependency: string;\n}\n\nexport abstract class PackageManager<LockFile = unknown> {\n abstract readonly command: string;\n abstract readonly lockFileName: string;\n\n #lockFile: LockFile | undefined;\n #lockFileLoaded = false;\n\n hasValidLockFile(): boolean {\n return this.getLockFile() !== undefined;\n }\n\n installPackages(args: InstallArgs = {}, options?: Parameters<typeof runCommand>[2]) {\n runCommand(this.command, this.getInstallArgs(args), options);\n this.reset();\n }\n\n protected getLockFile(): LockFile | undefined {\n if (!this.#lockFileLoaded) {\n this.#lockFile = this.parseLockFile();\n this.#lockFileLoaded = true;\n }\n return this.#lockFile;\n }\n\n protected reset() {\n this.#lockFile = undefined;\n this.#lockFileLoaded = false;\n }\n\n abstract clearCache(): void;\n abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;\n abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;\n\n protected abstract getInstallArgs(args: InstallArgs): string[];\n protected abstract parseLockFile(): LockFile | undefined;\n}\n"],"names":["PackageManager","hasValidLockFile","getLockFile","undefined","installPackages","args","options","runCommand","command","getInstallArgs","reset","parseLockFile"],"mappings":";;;;+BAiBsBA;;;eAAAA;;;uBAjBK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAqBvB,yCACA;AALG,MAAeA;IAOlBC,mBAA4B;QACxB,OAAO,IAAI,CAACC,WAAW,OAAOC;IAClC;IAEAC,gBAAgBC,OAAoB,CAAC,CAAC,EAAEC,OAA0C,EAAE;QAChFC,IAAAA,iBAAU,EAAC,IAAI,CAACC,OAAO,EAAE,IAAI,CAACC,cAAc,CAACJ,OAAOC;QACpD,IAAI,CAACI,KAAK;IACd;IAEUR,cAAoC;QAC1C,IAAI,0BAAC,IAAI,EAAC,kBAAiB;2CAClB,WAAY,IAAI,CAACS,aAAa;2CAC9B,iBAAkB;QAC3B;QACA,gCAAO,IAAI,EAAC;IAChB;IAEUD,QAAQ;uCACT,WAAYP;uCACZ,iBAAkB;IAC3B;;QAvBA,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAkB;;;AA8BtB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';
|
|
2
|
+
import { PackageManager } from './package-manager';
|
|
3
|
+
interface PnpmImporterEntry {
|
|
4
|
+
specifier: string;
|
|
5
|
+
version: string;
|
|
6
|
+
}
|
|
7
|
+
interface PnpmImporter {
|
|
8
|
+
dependencies?: Record<string, PnpmImporterEntry>;
|
|
9
|
+
devDependencies?: Record<string, PnpmImporterEntry>;
|
|
10
|
+
optionalDependencies?: Record<string, PnpmImporterEntry>;
|
|
11
|
+
}
|
|
12
|
+
interface PnpmSnapshot {
|
|
13
|
+
dependencies?: Record<string, string>;
|
|
14
|
+
peerDependencies?: Record<string, string>;
|
|
15
|
+
}
|
|
16
|
+
export interface PnpmLockFile {
|
|
17
|
+
importers?: Record<string, PnpmImporter>;
|
|
18
|
+
snapshots?: Record<string, PnpmSnapshot>;
|
|
19
|
+
}
|
|
20
|
+
export declare class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
21
|
+
readonly command = "pnpm";
|
|
22
|
+
readonly lockFileName = "pnpm-lock.yaml";
|
|
23
|
+
clearCache(): void;
|
|
24
|
+
getDeclaredVersion({ workspacePackage, declaredBy, dependency, }: DeclaredVersionQuery): string | undefined;
|
|
25
|
+
getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined;
|
|
26
|
+
protected getInstallArgs({ fix }: InstallArgs): string[];
|
|
27
|
+
protected parseLockFile(): PnpmLockFile | undefined;
|
|
28
|
+
private resolveVersion;
|
|
29
|
+
}
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=pnpm-package-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pnpm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/pnpm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,iBAAiB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC5D;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC5C;AAED,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,YAAY,CAAC;IAChE,QAAQ,CAAC,OAAO,UAAU;IAC1B,QAAQ,CAAC,YAAY,oBAAoB;IAEzC,UAAU;IAIV,kBAAkB,CAAC,EACf,gBAAgB,EAChB,UAAU,EACV,UAAU,GACb,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAS5C,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAI9F,SAAS,CAAC,cAAc,CAAC,EAAE,GAAG,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE;IAQxD,SAAS,CAAC,aAAa,IAAI,YAAY,GAAG,SAAS;IASnD,OAAO,CAAC,cAAc;CAQzB"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "PnpmPackageManager", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return PnpmPackageManager;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
|
|
12
|
+
const _utils = require("../utils");
|
|
13
|
+
const _packagemanager = require("./package-manager");
|
|
14
|
+
function _define_property(obj, key, value) {
|
|
15
|
+
if (key in obj) {
|
|
16
|
+
Object.defineProperty(obj, key, {
|
|
17
|
+
value: value,
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true
|
|
21
|
+
});
|
|
22
|
+
} else {
|
|
23
|
+
obj[key] = value;
|
|
24
|
+
}
|
|
25
|
+
return obj;
|
|
26
|
+
}
|
|
27
|
+
function _interop_require_default(obj) {
|
|
28
|
+
return obj && obj.__esModule ? obj : {
|
|
29
|
+
default: obj
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
33
|
+
clearCache() {
|
|
34
|
+
(0, _utils.runCommand)('pnpm', [
|
|
35
|
+
'store',
|
|
36
|
+
'prune'
|
|
37
|
+
]);
|
|
38
|
+
}
|
|
39
|
+
getDeclaredVersion({ workspacePackage, declaredBy, dependency }) {
|
|
40
|
+
var _ref;
|
|
41
|
+
var _this_getLockFile_snapshots, _this_getLockFile, _snapshot_dependencies, _snapshot_peerDependencies;
|
|
42
|
+
const declaredByVersion = this.resolveVersion(workspacePackage, declaredBy);
|
|
43
|
+
if (!declaredByVersion) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const snapshot = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : (_this_getLockFile_snapshots = _this_getLockFile.snapshots) === null || _this_getLockFile_snapshots === void 0 ? void 0 : _this_getLockFile_snapshots[`${declaredBy}@${declaredByVersion}`];
|
|
47
|
+
return (_ref = snapshot === null || snapshot === void 0 ? void 0 : (_snapshot_dependencies = snapshot.dependencies) === null || _snapshot_dependencies === void 0 ? void 0 : _snapshot_dependencies[dependency]) !== null && _ref !== void 0 ? _ref : snapshot === null || snapshot === void 0 ? void 0 : (_snapshot_peerDependencies = snapshot.peerDependencies) === null || _snapshot_peerDependencies === void 0 ? void 0 : _snapshot_peerDependencies[dependency];
|
|
48
|
+
}
|
|
49
|
+
getResolvedVersion({ workspacePackage, dependency }) {
|
|
50
|
+
return this.resolveVersion(workspacePackage, dependency);
|
|
51
|
+
}
|
|
52
|
+
getInstallArgs({ fix }) {
|
|
53
|
+
return [
|
|
54
|
+
'install',
|
|
55
|
+
...(0, _utils.isCI)() ? [
|
|
56
|
+
'--frozen-lockfile'
|
|
57
|
+
] : [],
|
|
58
|
+
...fix ? [
|
|
59
|
+
'--lockfile-only'
|
|
60
|
+
] : []
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
parseLockFile() {
|
|
64
|
+
const yaml = require('js-yaml'); // eslint-disable-line import/no-extraneous-dependencies
|
|
65
|
+
try {
|
|
66
|
+
return yaml.load(_fs.default.readFileSync(this.lockFileName, 'utf-8'));
|
|
67
|
+
} catch (unused) {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
resolveVersion(workspacePackage, dependency) {
|
|
72
|
+
var _ref, _ref1;
|
|
73
|
+
var _this_getLockFile_importers, _this_getLockFile, _importer_dependencies, _importer_devDependencies, _importer_optionalDependencies;
|
|
74
|
+
const importer = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : (_this_getLockFile_importers = _this_getLockFile.importers) === null || _this_getLockFile_importers === void 0 ? void 0 : _this_getLockFile_importers[workspacePackage];
|
|
75
|
+
const entry = (_ref = (_ref1 = importer === null || importer === void 0 ? void 0 : (_importer_dependencies = importer.dependencies) === null || _importer_dependencies === void 0 ? void 0 : _importer_dependencies[dependency]) !== null && _ref1 !== void 0 ? _ref1 : importer === null || importer === void 0 ? void 0 : (_importer_devDependencies = importer.devDependencies) === null || _importer_devDependencies === void 0 ? void 0 : _importer_devDependencies[dependency]) !== null && _ref !== void 0 ? _ref : importer === null || importer === void 0 ? void 0 : (_importer_optionalDependencies = importer.optionalDependencies) === null || _importer_optionalDependencies === void 0 ? void 0 : _importer_optionalDependencies[dependency];
|
|
76
|
+
return entry ? stripPeerDependencySuffix(entry.version) : undefined;
|
|
77
|
+
}
|
|
78
|
+
constructor(...args){
|
|
79
|
+
super(...args), _define_property(this, "command", 'pnpm'), _define_property(this, "lockFileName", 'pnpm-lock.yaml');
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
function stripPeerDependencySuffix(version) {
|
|
83
|
+
// e.g., "1.2.3(react@18.2.0)(react-dom@18.2.0)" → "1.2.3"
|
|
84
|
+
return version.split('(')[0];
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
//# sourceMappingURL=pnpm-package-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/pnpm-package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport { isCI, runCommand } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\n\ninterface PnpmImporterEntry {\n specifier: string;\n version: string;\n}\n\ninterface PnpmImporter {\n dependencies?: Record<string, PnpmImporterEntry>;\n devDependencies?: Record<string, PnpmImporterEntry>;\n optionalDependencies?: Record<string, PnpmImporterEntry>;\n}\n\ninterface PnpmSnapshot {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface PnpmLockFile {\n importers?: Record<string, PnpmImporter>;\n snapshots?: Record<string, PnpmSnapshot>;\n}\n\nexport class PnpmPackageManager extends PackageManager<PnpmLockFile> {\n readonly command = 'pnpm';\n readonly lockFileName = 'pnpm-lock.yaml';\n\n clearCache() {\n runCommand('pnpm', ['store', 'prune']);\n }\n\n getDeclaredVersion({\n workspacePackage,\n declaredBy,\n dependency,\n }: DeclaredVersionQuery): string | undefined {\n const declaredByVersion = this.resolveVersion(workspacePackage, declaredBy);\n if (!declaredByVersion) {\n return undefined;\n }\n const snapshot = this.getLockFile()?.snapshots?.[`${declaredBy}@${declaredByVersion}`];\n return snapshot?.dependencies?.[dependency] ?? snapshot?.peerDependencies?.[dependency];\n }\n\n getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined {\n return this.resolveVersion(workspacePackage, dependency);\n }\n\n protected getInstallArgs({ fix }: InstallArgs): string[] {\n return [\n 'install',\n ...(isCI() ? ['--frozen-lockfile'] : []),\n ...(fix ? ['--lockfile-only'] : []),\n ];\n }\n\n protected parseLockFile(): PnpmLockFile | undefined {\n const yaml = require('js-yaml'); // eslint-disable-line import/no-extraneous-dependencies\n try {\n return yaml.load(fs.readFileSync(this.lockFileName, 'utf-8'));\n } catch {\n return undefined;\n }\n }\n\n private resolveVersion(workspacePackage: string, dependency: string): string | undefined {\n const importer = this.getLockFile()?.importers?.[workspacePackage];\n const entry =\n importer?.dependencies?.[dependency] ??\n importer?.devDependencies?.[dependency] ??\n importer?.optionalDependencies?.[dependency];\n return entry ? stripPeerDependencySuffix(entry.version) : undefined;\n }\n}\n\nfunction stripPeerDependencySuffix(version: string): string {\n // e.g., \"1.2.3(react@18.2.0)(react-dom@18.2.0)\" → \"1.2.3\"\n return version.split('(')[0];\n}\n"],"names":["PnpmPackageManager","PackageManager","clearCache","runCommand","getDeclaredVersion","workspacePackage","declaredBy","dependency","snapshot","declaredByVersion","resolveVersion","undefined","getLockFile","snapshots","dependencies","peerDependencies","getResolvedVersion","getInstallArgs","fix","isCI","parseLockFile","yaml","require","load","fs","readFileSync","lockFileName","importer","importers","entry","devDependencies","optionalDependencies","stripPeerDependencySuffix","version","command","split"],"mappings":";;;;+BA0BaA;;;eAAAA;;;2DA1BE;uBACkB;gCAEF;;;;;;;;;;;;;;;;;;;AAuBxB,MAAMA,2BAA2BC,8BAAc;IAIlDC,aAAa;QACTC,IAAAA,iBAAU,EAAC,QAAQ;YAAC;YAAS;SAAQ;IACzC;IAEAC,mBAAmB,EACfC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACS,EAAsB;;YAKxB,6BAAA,mBACVC,wBAAwCA;QAL/C,MAAMC,oBAAoB,IAAI,CAACC,cAAc,CAACL,kBAAkBC;QAChE,IAAI,CAACG,mBAAmB;YACpB,OAAOE;QACX;QACA,MAAMH,YAAW,oBAAA,IAAI,CAACI,WAAW,gBAAhB,yCAAA,8BAAA,kBAAoBC,SAAS,cAA7B,kDAAA,2BAA+B,CAAC,GAAGP,WAAW,CAAC,EAAEG,mBAAmB,CAAC;QACtF,eAAOD,qBAAAA,gCAAAA,yBAAAA,SAAUM,YAAY,cAAtBN,6CAAAA,sBAAwB,CAACD,WAAW,uCAAIC,qBAAAA,gCAAAA,6BAAAA,SAAUO,gBAAgB,cAA1BP,iDAAAA,0BAA4B,CAACD,WAAW;IAC3F;IAEAS,mBAAmB,EAAEX,gBAAgB,EAAEE,UAAU,EAAwB,EAAsB;QAC3F,OAAO,IAAI,CAACG,cAAc,CAACL,kBAAkBE;IACjD;IAEUU,eAAe,EAAEC,GAAG,EAAe,EAAY;QACrD,OAAO;YACH;eACIC,IAAAA,WAAI,MAAK;gBAAC;aAAoB,GAAG,EAAE;eACnCD,MAAM;gBAAC;aAAkB,GAAG,EAAE;SACrC;IACL;IAEUE,gBAA0C;QAChD,MAAMC,OAAOC,QAAQ,YAAY,wDAAwD;QACzF,IAAI;YACA,OAAOD,KAAKE,IAAI,CAACC,WAAE,CAACC,YAAY,CAAC,IAAI,CAACC,YAAY,EAAE;QACxD,EAAE,eAAM;YACJ,OAAOf;QACX;IACJ;IAEQD,eAAeL,gBAAwB,EAAEE,UAAkB,EAAsB;YAGjFoB;YAFa,6BAAA,mBAEbA,wBACAA,2BACAA;QAJJ,MAAMA,YAAW,oBAAA,IAAI,CAACf,WAAW,gBAAhB,yCAAA,8BAAA,kBAAoBgB,SAAS,cAA7B,kDAAA,2BAA+B,CAACvB,iBAAiB;QAClE,MAAMwB,SACFF,gBAAAA,qBAAAA,gCAAAA,yBAAAA,SAAUb,YAAY,cAAtBa,6CAAAA,sBAAwB,CAACpB,WAAW,yCACpCoB,qBAAAA,gCAAAA,4BAAAA,SAAUG,eAAe,cAAzBH,gDAAAA,yBAA2B,CAACpB,WAAW,cADvCoB,kBAAAA,OAEAA,qBAAAA,gCAAAA,iCAAAA,SAAUI,oBAAoB,cAA9BJ,qDAAAA,8BAAgC,CAACpB,WAAW;QAChD,OAAOsB,QAAQG,0BAA0BH,MAAMI,OAAO,IAAItB;IAC9D;;QAjDG,gBACH,uBAASuB,WAAU,SACnB,uBAASR,gBAAe;;AAgD5B;AAEA,SAASM,0BAA0BC,OAAe;IAC9C,0DAA0D;IAC1D,OAAOA,QAAQE,KAAK,CAAC,IAAI,CAAC,EAAE;AAChC"}
|
package/dist/utils/os.js
CHANGED
|
@@ -20,12 +20,9 @@ function runCommand(command, args, options = {}) {
|
|
|
20
20
|
});
|
|
21
21
|
return (_ref = (_execFileSync = (0, _child_process.execFileSync)(command, args, getOptions(command, options))) === null || _execFileSync === void 0 ? void 0 : _execFileSync.toString()) !== null && _ref !== void 0 ? _ref : '';
|
|
22
22
|
}
|
|
23
|
-
function getOptions(
|
|
23
|
+
function getOptions(command, options) {
|
|
24
24
|
return {
|
|
25
|
-
|
|
26
|
-
...file === 'npm' && process.platform === 'win32' ? {
|
|
27
|
-
shell: true
|
|
28
|
-
} : {},
|
|
25
|
+
...getWindowsOptions(command),
|
|
29
26
|
...options,
|
|
30
27
|
...options.env ? {
|
|
31
28
|
env: {
|
|
@@ -35,5 +32,13 @@ function getOptions(file, options) {
|
|
|
35
32
|
} : {}
|
|
36
33
|
};
|
|
37
34
|
}
|
|
35
|
+
function getWindowsOptions(command) {
|
|
36
|
+
// On Windows, npm and pnpm are command scripts (e.g., npm.CMD) that requires a shell
|
|
37
|
+
if (process.platform === 'win32' && (command === 'npm' || command === 'pnpm')) {
|
|
38
|
+
return {
|
|
39
|
+
shell: true
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
}
|
|
38
43
|
|
|
39
44
|
//# sourceMappingURL=os.js.map
|
package/dist/utils/os.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/os.ts"],"sourcesContent":["import { execFileSync, ExecSyncOptionsWithBufferEncoding } from 'child_process';\nimport { debug } from './debug';\n\ntype RunCommandOptions = ExecSyncOptionsWithBufferEncoding;\n\nexport function runCommand(command: string, args: string[], options: RunCommandOptions = {}) {\n debug('install:run', { command, args, options });\n return execFileSync(command, args, getOptions(command, options))?.toString() ?? '';\n}\n\nfunction getOptions(
|
|
1
|
+
{"version":3,"sources":["../../src/utils/os.ts"],"sourcesContent":["import { execFileSync, ExecSyncOptionsWithBufferEncoding } from 'child_process';\nimport { debug } from './debug';\n\ntype RunCommandOptions = ExecSyncOptionsWithBufferEncoding;\n\nexport function runCommand(command: string, args: string[], options: RunCommandOptions = {}) {\n debug('install:run', { command, args, options });\n return execFileSync(command, args, getOptions(command, options))?.toString() ?? '';\n}\n\nfunction getOptions(command: string, options: RunCommandOptions) {\n return {\n ...getWindowsOptions(command),\n ...options,\n ...(options.env ? { env: { ...process.env, ...options.env } } : {}),\n };\n}\n\nfunction getWindowsOptions(command: string) {\n // On Windows, npm and pnpm are command scripts (e.g., npm.CMD) that requires a shell\n if (process.platform === 'win32' && (command === 'npm' || command === 'pnpm')) {\n return { shell: true };\n }\n}\n"],"names":["runCommand","command","args","options","execFileSync","debug","getOptions","toString","getWindowsOptions","env","process","platform","shell"],"mappings":";;;;+BAKgBA;;;eAAAA;;;+BALgD;uBAC1C;AAIf,SAASA,WAAWC,OAAe,EAAEC,IAAc,EAAEC,UAA6B,CAAC,CAAC;;QAEhFC;IADPC,IAAAA,YAAK,EAAC,eAAe;QAAEJ;QAASC;QAAMC;IAAQ;IAC9C,gBAAOC,gBAAAA,IAAAA,2BAAY,EAACH,SAASC,MAAMI,WAAWL,SAASE,uBAAhDC,oCAAAA,cAA2DG,QAAQ,yCAAM;AACpF;AAEA,SAASD,WAAWL,OAAe,EAAEE,OAA0B;IAC3D,OAAO;QACH,GAAGK,kBAAkBP,QAAQ;QAC7B,GAAGE,OAAO;QACV,GAAIA,QAAQM,GAAG,GAAG;YAAEA,KAAK;gBAAE,GAAGC,QAAQD,GAAG;gBAAE,GAAGN,QAAQM,GAAG;YAAC;QAAE,IAAI,CAAC,CAAC;IACtE;AACJ;AAEA,SAASD,kBAAkBP,OAAe;IACtC,qFAAqF;IACrF,IAAIS,QAAQC,QAAQ,KAAK,WAAYV,CAAAA,YAAY,SAASA,YAAY,MAAK,GAAI;QAC3E,OAAO;YAAEW,OAAO;QAAK;IACzB;AACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/install",
|
|
3
|
-
"version": "36.1.
|
|
3
|
+
"version": "36.1.2-canary.2",
|
|
4
4
|
"description": "Lightweight wrapper around npm install that configures access to private packages",
|
|
5
5
|
"homepage": "https://docs.st.dev/docs/frontend/uikit/install",
|
|
6
6
|
"repository": {
|
|
@@ -31,6 +31,5 @@
|
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
33
|
"ts-node": "~10.9.2"
|
|
34
|
-
}
|
|
35
|
-
"gitHead": "613ecdc5bb02a009292843c9674bcd18f408bcfa"
|
|
34
|
+
}
|
|
36
35
|
}
|
package/src/cli/install.ts
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
import fs from 'fs';
|
|
3
3
|
import os from 'os';
|
|
4
4
|
import path from 'path';
|
|
5
|
+
import { getPackageManager } from '../package-manager';
|
|
5
6
|
import { debug, getVersion, gitCloneRepo, isCI, npmWhoAmI, readJson, runCommand } from '../utils';
|
|
6
7
|
|
|
7
8
|
const REPO_NAME = 'frontend-dev-config';
|
|
@@ -113,18 +114,12 @@ export class Install {
|
|
|
113
114
|
return;
|
|
114
115
|
}
|
|
115
116
|
|
|
116
|
-
const
|
|
117
|
-
isCI() ? 'ci' : 'i',
|
|
118
|
-
'--audit=false',
|
|
119
|
-
'--fund=false',
|
|
120
|
-
'--legacy-peer-deps',
|
|
121
|
-
...(this.args.fix ? ['--package-lock-only', '--prefer-dedupe'] : []),
|
|
122
|
-
];
|
|
117
|
+
const packageManager = getPackageManager();
|
|
123
118
|
|
|
124
119
|
if (!this.args.quiet) {
|
|
125
|
-
console.log(`Running
|
|
120
|
+
console.log(`Running ${packageManager.command} install`);
|
|
126
121
|
}
|
|
127
122
|
|
|
128
|
-
|
|
123
|
+
packageManager.installPackages({ fix: this.args.fix }, { env, stdio: 'inherit' });
|
|
129
124
|
}
|
|
130
125
|
}
|
package/src/index.ts
CHANGED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PackageManager } from '../../package-manager';
|
|
2
|
+
import type { DeclaredVersionQuery, ResolvedVersionQuery } from '../package-manager';
|
|
3
|
+
|
|
4
|
+
export class MockPackageManager extends PackageManager {
|
|
5
|
+
readonly command = 'test';
|
|
6
|
+
readonly lockFileName = 'test-lock.json';
|
|
7
|
+
readonly installArgs = ['install'];
|
|
8
|
+
|
|
9
|
+
clearCache() {}
|
|
10
|
+
|
|
11
|
+
getDeclaredVersion(_query: DeclaredVersionQuery): string | undefined {
|
|
12
|
+
return undefined;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
getResolvedVersion(_query: ResolvedVersionQuery): string | undefined {
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
protected getInstallArgs(): string[] {
|
|
20
|
+
return this.installArgs;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
protected parseLockFile(): unknown {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { NpmPackageManager } from './npm-package-manager';
|
|
3
|
+
import type { PackageManager } from './package-manager';
|
|
4
|
+
import { PnpmPackageManager } from './pnpm-package-manager';
|
|
5
|
+
|
|
6
|
+
export function getPackageManager(): PackageManager {
|
|
7
|
+
const name = readPackageManagerName();
|
|
8
|
+
switch (name) {
|
|
9
|
+
case 'npm':
|
|
10
|
+
return new NpmPackageManager();
|
|
11
|
+
case 'pnpm':
|
|
12
|
+
return new PnpmPackageManager();
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`Unsupported package manager: ${name}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function readPackageManagerName(): string {
|
|
19
|
+
const packageJson = JSON.parse(fs.readFileSync('package.json', 'utf-8'));
|
|
20
|
+
return packageJson.cli?.packageManager ?? 'npm';
|
|
21
|
+
}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { isCI, runCommand } from '../utils';
|
|
3
|
+
import type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';
|
|
4
|
+
import { PackageManager } from './package-manager';
|
|
5
|
+
|
|
6
|
+
interface NpmLockFileEntry {
|
|
7
|
+
version?: string;
|
|
8
|
+
dependencies?: Record<string, string>;
|
|
9
|
+
peerDependencies?: Record<string, string>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export interface NpmLockFile {
|
|
13
|
+
packages?: Record<string, NpmLockFileEntry>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
17
|
+
readonly command = 'npm';
|
|
18
|
+
readonly lockFileName = 'package-lock.json';
|
|
19
|
+
|
|
20
|
+
clearCache() {
|
|
21
|
+
runCommand('npm', ['cache', 'clear', '--force']);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
getDeclaredVersion({
|
|
25
|
+
workspacePackage,
|
|
26
|
+
declaredBy,
|
|
27
|
+
dependency,
|
|
28
|
+
}: DeclaredVersionQuery): string | undefined {
|
|
29
|
+
const entry = this.findEntry({ workspacePackage, package: declaredBy });
|
|
30
|
+
return entry?.dependencies?.[dependency] ?? entry?.peerDependencies?.[dependency];
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined {
|
|
34
|
+
return this.findEntry({ workspacePackage, package: dependency })?.version;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
protected getInstallArgs({ fix }: InstallArgs): string[] {
|
|
38
|
+
return [
|
|
39
|
+
isCI() ? 'ci' : 'i',
|
|
40
|
+
'--audit=false',
|
|
41
|
+
'--fund=false',
|
|
42
|
+
'--legacy-peer-deps',
|
|
43
|
+
...(fix ? ['--package-lock-only', '--prefer-dedupe'] : []),
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected parseLockFile(): NpmLockFile | undefined {
|
|
48
|
+
try {
|
|
49
|
+
return JSON.parse(fs.readFileSync(this.lockFileName, 'utf-8'));
|
|
50
|
+
} catch {
|
|
51
|
+
return undefined;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Looks up a lockfile entry for the given workspace package, falling back
|
|
57
|
+
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
58
|
+
* path from the repo root; the empty string `''` denotes the root
|
|
59
|
+
* workspace package itself, matching npm's own lockfile key convention.
|
|
60
|
+
*/
|
|
61
|
+
private findEntry({
|
|
62
|
+
workspacePackage,
|
|
63
|
+
package: packageName,
|
|
64
|
+
}: {
|
|
65
|
+
workspacePackage: string;
|
|
66
|
+
package: string;
|
|
67
|
+
}): NpmLockFileEntry | undefined {
|
|
68
|
+
const packages = this.getLockFile()?.packages;
|
|
69
|
+
return (
|
|
70
|
+
packages?.[`${workspacePackage}/node_modules/${packageName}`] ??
|
|
71
|
+
packages?.[`node_modules/${packageName}`]
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { runCommand } from '../utils';
|
|
2
|
+
|
|
3
|
+
export interface InstallArgs {
|
|
4
|
+
fix?: boolean;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface DeclaredVersionQuery {
|
|
8
|
+
workspacePackage: string;
|
|
9
|
+
declaredBy: string;
|
|
10
|
+
dependency: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface ResolvedVersionQuery {
|
|
14
|
+
workspacePackage: string;
|
|
15
|
+
dependency: string;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export abstract class PackageManager<LockFile = unknown> {
|
|
19
|
+
abstract readonly command: string;
|
|
20
|
+
abstract readonly lockFileName: string;
|
|
21
|
+
|
|
22
|
+
#lockFile: LockFile | undefined;
|
|
23
|
+
#lockFileLoaded = false;
|
|
24
|
+
|
|
25
|
+
hasValidLockFile(): boolean {
|
|
26
|
+
return this.getLockFile() !== undefined;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
installPackages(args: InstallArgs = {}, options?: Parameters<typeof runCommand>[2]) {
|
|
30
|
+
runCommand(this.command, this.getInstallArgs(args), options);
|
|
31
|
+
this.reset();
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
protected getLockFile(): LockFile | undefined {
|
|
35
|
+
if (!this.#lockFileLoaded) {
|
|
36
|
+
this.#lockFile = this.parseLockFile();
|
|
37
|
+
this.#lockFileLoaded = true;
|
|
38
|
+
}
|
|
39
|
+
return this.#lockFile;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
protected reset() {
|
|
43
|
+
this.#lockFile = undefined;
|
|
44
|
+
this.#lockFileLoaded = false;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
abstract clearCache(): void;
|
|
48
|
+
abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;
|
|
49
|
+
abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;
|
|
50
|
+
|
|
51
|
+
protected abstract getInstallArgs(args: InstallArgs): string[];
|
|
52
|
+
protected abstract parseLockFile(): LockFile | undefined;
|
|
53
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import { isCI, runCommand } from '../utils';
|
|
3
|
+
import type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';
|
|
4
|
+
import { PackageManager } from './package-manager';
|
|
5
|
+
|
|
6
|
+
interface PnpmImporterEntry {
|
|
7
|
+
specifier: string;
|
|
8
|
+
version: string;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
interface PnpmImporter {
|
|
12
|
+
dependencies?: Record<string, PnpmImporterEntry>;
|
|
13
|
+
devDependencies?: Record<string, PnpmImporterEntry>;
|
|
14
|
+
optionalDependencies?: Record<string, PnpmImporterEntry>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface PnpmSnapshot {
|
|
18
|
+
dependencies?: Record<string, string>;
|
|
19
|
+
peerDependencies?: Record<string, string>;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface PnpmLockFile {
|
|
23
|
+
importers?: Record<string, PnpmImporter>;
|
|
24
|
+
snapshots?: Record<string, PnpmSnapshot>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
28
|
+
readonly command = 'pnpm';
|
|
29
|
+
readonly lockFileName = 'pnpm-lock.yaml';
|
|
30
|
+
|
|
31
|
+
clearCache() {
|
|
32
|
+
runCommand('pnpm', ['store', 'prune']);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
getDeclaredVersion({
|
|
36
|
+
workspacePackage,
|
|
37
|
+
declaredBy,
|
|
38
|
+
dependency,
|
|
39
|
+
}: DeclaredVersionQuery): string | undefined {
|
|
40
|
+
const declaredByVersion = this.resolveVersion(workspacePackage, declaredBy);
|
|
41
|
+
if (!declaredByVersion) {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
const snapshot = this.getLockFile()?.snapshots?.[`${declaredBy}@${declaredByVersion}`];
|
|
45
|
+
return snapshot?.dependencies?.[dependency] ?? snapshot?.peerDependencies?.[dependency];
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined {
|
|
49
|
+
return this.resolveVersion(workspacePackage, dependency);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
protected getInstallArgs({ fix }: InstallArgs): string[] {
|
|
53
|
+
return [
|
|
54
|
+
'install',
|
|
55
|
+
...(isCI() ? ['--frozen-lockfile'] : []),
|
|
56
|
+
...(fix ? ['--lockfile-only'] : []),
|
|
57
|
+
];
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
protected parseLockFile(): PnpmLockFile | undefined {
|
|
61
|
+
const yaml = require('js-yaml'); // eslint-disable-line import/no-extraneous-dependencies
|
|
62
|
+
try {
|
|
63
|
+
return yaml.load(fs.readFileSync(this.lockFileName, 'utf-8'));
|
|
64
|
+
} catch {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
private resolveVersion(workspacePackage: string, dependency: string): string | undefined {
|
|
70
|
+
const importer = this.getLockFile()?.importers?.[workspacePackage];
|
|
71
|
+
const entry =
|
|
72
|
+
importer?.dependencies?.[dependency] ??
|
|
73
|
+
importer?.devDependencies?.[dependency] ??
|
|
74
|
+
importer?.optionalDependencies?.[dependency];
|
|
75
|
+
return entry ? stripPeerDependencySuffix(entry.version) : undefined;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function stripPeerDependencySuffix(version: string): string {
|
|
80
|
+
// e.g., "1.2.3(react@18.2.0)(react-dom@18.2.0)" → "1.2.3"
|
|
81
|
+
return version.split('(')[0];
|
|
82
|
+
}
|
package/src/utils/os.ts
CHANGED
|
@@ -8,11 +8,17 @@ export function runCommand(command: string, args: string[], options: RunCommandO
|
|
|
8
8
|
return execFileSync(command, args, getOptions(command, options))?.toString() ?? '';
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
-
function getOptions(
|
|
11
|
+
function getOptions(command: string, options: RunCommandOptions) {
|
|
12
12
|
return {
|
|
13
|
-
|
|
14
|
-
...(file === 'npm' && process.platform === 'win32' ? { shell: true } : {}),
|
|
13
|
+
...getWindowsOptions(command),
|
|
15
14
|
...options,
|
|
16
15
|
...(options.env ? { env: { ...process.env, ...options.env } } : {}),
|
|
17
16
|
};
|
|
18
17
|
}
|
|
18
|
+
|
|
19
|
+
function getWindowsOptions(command: string) {
|
|
20
|
+
// On Windows, npm and pnpm are command scripts (e.g., npm.CMD) that requires a shell
|
|
21
|
+
if (process.platform === 'win32' && (command === 'npm' || command === 'pnpm')) {
|
|
22
|
+
return { shell: true };
|
|
23
|
+
}
|
|
24
|
+
}
|