@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.
Files changed (41) hide show
  1. package/dist/cli/install.d.ts.map +1 -1
  2. package/dist/cli/install.js +6 -12
  3. package/dist/cli/install.js.map +1 -1
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +7 -0
  7. package/dist/index.js.map +1 -1
  8. package/dist/package-manager/__mocks__/mock-package-manager.d.ts +13 -0
  9. package/dist/package-manager/__mocks__/mock-package-manager.d.ts.map +1 -0
  10. package/dist/package-manager/get-package-manager.d.ts +3 -0
  11. package/dist/package-manager/get-package-manager.d.ts.map +1 -0
  12. package/dist/package-manager/get-package-manager.js +37 -0
  13. package/dist/package-manager/get-package-manager.js.map +1 -0
  14. package/dist/package-manager/index.d.ts +4 -0
  15. package/dist/package-manager/index.d.ts.map +1 -0
  16. package/dist/package-manager/index.js +22 -0
  17. package/dist/package-manager/index.js.map +1 -0
  18. package/dist/package-manager/npm-package-manager.d.ts +28 -0
  19. package/dist/package-manager/npm-package-manager.d.ts.map +1 -0
  20. package/dist/package-manager/npm-package-manager.js +91 -0
  21. package/dist/package-manager/npm-package-manager.js.map +1 -0
  22. package/dist/package-manager/package-manager.d.ts +28 -0
  23. package/dist/package-manager/package-manager.d.ts.map +1 -0
  24. package/dist/package-manager/package-manager.js +84 -0
  25. package/dist/package-manager/package-manager.js.map +1 -0
  26. package/dist/package-manager/pnpm-package-manager.d.ts +31 -0
  27. package/dist/package-manager/pnpm-package-manager.d.ts.map +1 -0
  28. package/dist/package-manager/pnpm-package-manager.js +87 -0
  29. package/dist/package-manager/pnpm-package-manager.js.map +1 -0
  30. package/dist/utils/os.js +10 -5
  31. package/dist/utils/os.js.map +1 -1
  32. package/package.json +2 -3
  33. package/src/cli/install.ts +4 -9
  34. package/src/index.ts +2 -0
  35. package/src/package-manager/__mocks__/mock-package-manager.ts +26 -0
  36. package/src/package-manager/get-package-manager.ts +21 -0
  37. package/src/package-manager/index.ts +3 -0
  38. package/src/package-manager/npm-package-manager.ts +74 -0
  39. package/src/package-manager/package-manager.ts +53 -0
  40. package/src/package-manager/pnpm-package-manager.ts +82 -0
  41. package/src/utils/os.ts +9 -3
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAWA,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;CAmB1B"}
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"}
@@ -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 npmArguments = [
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 npm ${npmArguments.join(' ')}`);
139
+ console.log(`Running ${packageManager.command} install`);
148
140
  }
149
- (0, _utils.runCommand)('npm', npmArguments, {
141
+ packageManager.installPackages({
142
+ fix: this.args.fix
143
+ }, {
150
144
  env,
151
145
  stdio: 'inherit'
152
146
  });
@@ -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 npmArguments = [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(this.args.fix ? ['--package-lock-only', '--prefer-dedupe'] : []),\n ];\n\n if (!this.args.quiet) {\n console.log(`Running npm ${npmArguments.join(' ')}`);\n }\n\n runCommand('npm', npmArguments, { 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","npmArguments","stdio"],"mappings":"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"}
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
@@ -1,2 +1,4 @@
1
+ export { PackageManager, getPackageManager } from './package-manager';
2
+ export type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';
1
3
  export { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI } from './utils';
2
4
  //# sourceMappingURL=index.d.ts.map
@@ -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;;;uBAAQ"}
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,3 @@
1
+ import type { PackageManager } from './package-manager';
2
+ export declare function getPackageManager(): PackageManager;
3
+ //# sourceMappingURL=get-package-manager.d.ts.map
@@ -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,4 @@
1
+ export { getPackageManager } from './get-package-manager';
2
+ export { PackageManager } from './package-manager';
3
+ export type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -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(file, options) {
23
+ function getOptions(command, options) {
24
24
  return {
25
- // On Windows, npm is a command script (npm.CMD) that requires a shell
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
@@ -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(file: string, options: RunCommandOptions) {\n return {\n // On Windows, npm is a command script (npm.CMD) that requires a shell\n ...(file === 'npm' && process.platform === 'win32' ? { shell: true } : {}),\n ...options,\n ...(options.env ? { env: { ...process.env, ...options.env } } : {}),\n };\n}\n"],"names":["runCommand","command","args","options","execFileSync","debug","getOptions","toString","file","process","platform","shell","env"],"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,WAAWE,IAAY,EAAEL,OAA0B;IACxD,OAAO;QACH,sEAAsE;QACtE,GAAIK,SAAS,SAASC,QAAQC,QAAQ,KAAK,UAAU;YAAEC,OAAO;QAAK,IAAI,CAAC,CAAC;QACzE,GAAGR,OAAO;QACV,GAAIA,QAAQS,GAAG,GAAG;YAAEA,KAAK;gBAAE,GAAGH,QAAQG,GAAG;gBAAE,GAAGT,QAAQS,GAAG;YAAC;QAAE,IAAI,CAAC,CAAC;IACtE;AACJ"}
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.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
  }
@@ -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 npmArguments = [
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 npm ${npmArguments.join(' ')}`);
120
+ console.log(`Running ${packageManager.command} install`);
126
121
  }
127
122
 
128
- runCommand('npm', npmArguments, { env, stdio: 'inherit' });
123
+ packageManager.installPackages({ fix: this.args.fix }, { env, stdio: 'inherit' });
129
124
  }
130
125
  }
package/src/index.ts CHANGED
@@ -1 +1,3 @@
1
+ export { PackageManager, getPackageManager } from './package-manager';
2
+ export type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';
1
3
  export { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI } from './utils';
@@ -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,3 @@
1
+ export { getPackageManager } from './get-package-manager';
2
+ export { PackageManager } from './package-manager';
3
+ export type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';
@@ -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(file: string, options: RunCommandOptions) {
11
+ function getOptions(command: string, options: RunCommandOptions) {
12
12
  return {
13
- // On Windows, npm is a command script (npm.CMD) that requires a shell
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
+ }