@servicetitan/install 36.1.2-canary.6 → 36.1.2-canary.7

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 (65) hide show
  1. package/dist/cli/index.js +5 -5
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli/install.d.ts +4 -3
  4. package/dist/cli/install.d.ts.map +1 -1
  5. package/dist/cli/install.js +51 -32
  6. package/dist/cli/install.js.map +1 -1
  7. package/dist/package-manager/__mocks__/index.js +18 -0
  8. package/dist/package-manager/__mocks__/index.js.map +1 -0
  9. package/dist/package-manager/__mocks__/mock-package-manager.d.ts +1 -3
  10. package/dist/package-manager/__mocks__/mock-package-manager.d.ts.map +1 -1
  11. package/dist/package-manager/__mocks__/mock-package-manager.js +34 -0
  12. package/dist/package-manager/__mocks__/mock-package-manager.js.map +1 -0
  13. package/dist/package-manager/index.d.ts +1 -1
  14. package/dist/package-manager/index.d.ts.map +1 -1
  15. package/dist/package-manager/index.js.map +1 -1
  16. package/dist/package-manager/npm-package-manager.d.ts +3 -4
  17. package/dist/package-manager/npm-package-manager.d.ts.map +1 -1
  18. package/dist/package-manager/npm-package-manager.js +58 -34
  19. package/dist/package-manager/npm-package-manager.js.map +1 -1
  20. package/dist/package-manager/package-manager.d.ts +4 -5
  21. package/dist/package-manager/package-manager.d.ts.map +1 -1
  22. package/dist/package-manager/package-manager.js +0 -6
  23. package/dist/package-manager/package-manager.js.map +1 -1
  24. package/dist/package-manager/pnpm-package-manager.d.ts +2 -2
  25. package/dist/package-manager/pnpm-package-manager.d.ts.map +1 -1
  26. package/dist/package-manager/pnpm-package-manager.js +14 -13
  27. package/dist/package-manager/pnpm-package-manager.js.map +1 -1
  28. package/dist/package-manager/utils/index.d.ts +5 -0
  29. package/dist/package-manager/utils/index.d.ts.map +1 -0
  30. package/dist/package-manager/utils/index.js +23 -0
  31. package/dist/package-manager/utils/index.js.map +1 -0
  32. package/dist/package-manager/utils/log-allowed-scripts.d.ts +3 -0
  33. package/dist/package-manager/utils/log-allowed-scripts.d.ts.map +1 -0
  34. package/dist/package-manager/utils/log-allowed-scripts.js +26 -0
  35. package/dist/package-manager/utils/log-allowed-scripts.js.map +1 -0
  36. package/dist/package-manager/utils/parse-allow-scripts.d.ts +2 -0
  37. package/dist/package-manager/utils/parse-allow-scripts.d.ts.map +1 -0
  38. package/dist/package-manager/utils/parse-allow-scripts.js +15 -0
  39. package/dist/package-manager/utils/parse-allow-scripts.js.map +1 -0
  40. package/dist/package-manager/utils/resolve-allow-scripts.d.ts +4 -0
  41. package/dist/package-manager/utils/resolve-allow-scripts.d.ts.map +1 -0
  42. package/dist/package-manager/utils/resolve-allow-scripts.js +36 -0
  43. package/dist/package-manager/utils/resolve-allow-scripts.js.map +1 -0
  44. package/dist/package-manager/utils/should-ignore-scripts.d.ts +3 -0
  45. package/dist/package-manager/utils/should-ignore-scripts.d.ts.map +1 -0
  46. package/dist/package-manager/utils/should-ignore-scripts.js +21 -0
  47. package/dist/package-manager/utils/should-ignore-scripts.js.map +1 -0
  48. package/dist/utils/warn-untrusted-install-scripts.d.ts +5 -1
  49. package/dist/utils/warn-untrusted-install-scripts.d.ts.map +1 -1
  50. package/dist/utils/warn-untrusted-install-scripts.js +2 -2
  51. package/dist/utils/warn-untrusted-install-scripts.js.map +1 -1
  52. package/package.json +2 -2
  53. package/src/cli/index.ts +5 -6
  54. package/src/cli/install.ts +10 -31
  55. package/src/package-manager/__mocks__/mock-package-manager.ts +1 -6
  56. package/src/package-manager/index.ts +6 -1
  57. package/src/package-manager/npm-package-manager.ts +79 -45
  58. package/src/package-manager/package-manager.ts +5 -13
  59. package/src/package-manager/pnpm-package-manager.ts +14 -10
  60. package/src/package-manager/utils/index.ts +4 -0
  61. package/src/package-manager/utils/log-allowed-scripts.ts +17 -0
  62. package/src/package-manager/utils/parse-allow-scripts.ts +6 -0
  63. package/src/package-manager/utils/resolve-allow-scripts.ts +11 -0
  64. package/src/package-manager/utils/should-ignore-scripts.ts +11 -0
  65. package/src/utils/warn-untrusted-install-scripts.ts +10 -2
package/dist/cli/index.js CHANGED
@@ -6,7 +6,6 @@ const _util = require("util");
6
6
  const _utils = require("../utils");
7
7
  const _install = require("./install");
8
8
  const args = function getArgs() {
9
- var _result, _allowScripts;
10
9
  const { tokens } = (0, _util.parseArgs)({
11
10
  args: process.argv.slice(2),
12
11
  options: {
@@ -36,18 +35,20 @@ const args = function getArgs() {
36
35
  tokens: true
37
36
  });
38
37
  const result = {};
39
- const allowScripts = [];
40
38
  tokens.forEach((token)=>{
41
39
  if (token.kind === 'option') {
42
40
  switch(token.name){
43
41
  case 'allow-scripts':
44
- allowScripts.push(token.value);
42
+ if (!Array.isArray(result.allowScripts)) {
43
+ result.allowScripts = [];
44
+ }
45
+ result.allowScripts.push(token.value);
45
46
  break;
46
47
  case 'no-allow-scripts':
47
48
  result.allowScripts = false;
48
49
  break;
49
50
  case 'allow-all-scripts':
50
- result.allowAllScripts = true;
51
+ result.allowScripts = true;
51
52
  break;
52
53
  case 'no-token':
53
54
  result.token = false;
@@ -57,7 +58,6 @@ const args = function getArgs() {
57
58
  }
58
59
  }
59
60
  });
60
- (_allowScripts = (_result = result).allowScripts) !== null && _allowScripts !== void 0 ? _allowScripts : _result.allowScripts = allowScripts;
61
61
  return result;
62
62
  }();
63
63
  (0, _utils.debug)('install:args', {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["import { parseArgs } from 'util';\nimport { debug } from '../utils';\nimport type { Args } from './install';\nimport { Install } from './install';\n\nconst args = (function getArgs() {\n const { tokens } = parseArgs({\n args: process.argv.slice(2),\n options: {\n 'allow-scripts': { type: 'string', multiple: true },\n 'no-allow-scripts': { type: 'boolean' },\n 'allow-all-scripts': { type: 'boolean' },\n 'fix': { type: 'boolean' },\n 'quiet': { type: 'boolean' },\n 'token': { type: 'boolean' },\n 'no-token': { type: 'boolean' },\n },\n tokens: true,\n });\n\n const result: Args = {};\n\n const allowScripts: string[] = [];\n\n tokens.forEach(token => {\n if (token.kind === 'option') {\n switch (token.name) {\n case 'allow-scripts':\n allowScripts.push(token.value);\n break;\n case 'no-allow-scripts':\n result.allowScripts = false;\n break;\n case 'allow-all-scripts':\n result.allowAllScripts = true;\n break;\n case 'no-token':\n result.token = false;\n break;\n default:\n result[token.name] = true;\n }\n }\n });\n\n result.allowScripts ??= allowScripts;\n\n return result;\n})();\n\ndebug('install:args', { args });\n\nnew Install(args).execute();\n"],"names":["args","getArgs","result","tokens","parseArgs","process","argv","slice","options","type","multiple","allowScripts","forEach","token","kind","name","push","value","allowAllScripts","debug","Install","execute"],"mappings":";;;;sBAA0B;uBACJ;yBAEE;AAExB,MAAMA,OAAO,AAAC,SAASC;QAwCnBC,SAAAA;IAvCA,MAAM,EAAEC,MAAM,EAAE,GAAGC,IAAAA,eAAS,EAAC;QACzBJ,MAAMK,QAAQC,IAAI,CAACC,KAAK,CAAC;QACzBC,SAAS;YACL,iBAAiB;gBAAEC,MAAM;gBAAUC,UAAU;YAAK;YAClD,oBAAoB;gBAAED,MAAM;YAAU;YACtC,qBAAqB;gBAAEA,MAAM;YAAU;YACvC,OAAO;gBAAEA,MAAM;YAAU;YACzB,SAAS;gBAAEA,MAAM;YAAU;YAC3B,SAAS;gBAAEA,MAAM;YAAU;YAC3B,YAAY;gBAAEA,MAAM;YAAU;QAClC;QACAN,QAAQ;IACZ;IAEA,MAAMD,SAAe,CAAC;IAEtB,MAAMS,eAAyB,EAAE;IAEjCR,OAAOS,OAAO,CAACC,CAAAA;QACX,IAAIA,MAAMC,IAAI,KAAK,UAAU;YACzB,OAAQD,MAAME,IAAI;gBACd,KAAK;oBACDJ,aAAaK,IAAI,CAACH,MAAMI,KAAK;oBAC7B;gBACJ,KAAK;oBACDf,OAAOS,YAAY,GAAG;oBACtB;gBACJ,KAAK;oBACDT,OAAOgB,eAAe,GAAG;oBACzB;gBACJ,KAAK;oBACDhB,OAAOW,KAAK,GAAG;oBACf;gBACJ;oBACIX,MAAM,CAACW,MAAME,IAAI,CAAC,GAAG;YAC7B;QACJ;IACJ;KAEAb,gBAAAA,CAAAA,UAAAA,QAAOS,YAAY,cAAnBT,2BAAAA,gBAAAA,QAAOS,YAAY,GAAKA;IAExB,OAAOT;AACX;AAEAiB,IAAAA,YAAK,EAAC,gBAAgB;IAAEnB;AAAK;AAE7B,IAAIoB,gBAAO,CAACpB,MAAMqB,OAAO"}
1
+ {"version":3,"sources":["../../src/cli/index.ts"],"sourcesContent":["import { parseArgs } from 'util';\nimport { debug } from '../utils';\nimport type { Args } from './install';\nimport { Install } from './install';\n\nconst args = (function getArgs() {\n const { tokens } = parseArgs({\n args: process.argv.slice(2),\n options: {\n 'allow-scripts': { type: 'string', multiple: true },\n 'no-allow-scripts': { type: 'boolean' },\n 'allow-all-scripts': { type: 'boolean' },\n 'fix': { type: 'boolean' },\n 'quiet': { type: 'boolean' },\n 'token': { type: 'boolean' },\n 'no-token': { type: 'boolean' },\n },\n tokens: true,\n });\n\n const result: Args = {};\n\n tokens.forEach(token => {\n if (token.kind === 'option') {\n switch (token.name) {\n case 'allow-scripts':\n if (!Array.isArray(result.allowScripts)) {\n result.allowScripts = [];\n }\n result.allowScripts.push(token.value);\n break;\n case 'no-allow-scripts':\n result.allowScripts = false;\n break;\n case 'allow-all-scripts':\n result.allowScripts = true;\n break;\n case 'no-token':\n result.token = false;\n break;\n default:\n result[token.name] = true;\n }\n }\n });\n\n return result;\n})();\n\ndebug('install:args', { args });\n\nnew Install(args).execute();\n"],"names":["args","getArgs","tokens","parseArgs","process","argv","slice","options","type","multiple","result","forEach","token","kind","name","Array","isArray","allowScripts","push","value","debug","Install","execute"],"mappings":";;;;sBAA0B;uBACJ;yBAEE;AAExB,MAAMA,OAAO,AAAC,SAASC;IACnB,MAAM,EAAEC,MAAM,EAAE,GAAGC,IAAAA,eAAS,EAAC;QACzBH,MAAMI,QAAQC,IAAI,CAACC,KAAK,CAAC;QACzBC,SAAS;YACL,iBAAiB;gBAAEC,MAAM;gBAAUC,UAAU;YAAK;YAClD,oBAAoB;gBAAED,MAAM;YAAU;YACtC,qBAAqB;gBAAEA,MAAM;YAAU;YACvC,OAAO;gBAAEA,MAAM;YAAU;YACzB,SAAS;gBAAEA,MAAM;YAAU;YAC3B,SAAS;gBAAEA,MAAM;YAAU;YAC3B,YAAY;gBAAEA,MAAM;YAAU;QAClC;QACAN,QAAQ;IACZ;IAEA,MAAMQ,SAAe,CAAC;IAEtBR,OAAOS,OAAO,CAACC,CAAAA;QACX,IAAIA,MAAMC,IAAI,KAAK,UAAU;YACzB,OAAQD,MAAME,IAAI;gBACd,KAAK;oBACD,IAAI,CAACC,MAAMC,OAAO,CAACN,OAAOO,YAAY,GAAG;wBACrCP,OAAOO,YAAY,GAAG,EAAE;oBAC5B;oBACAP,OAAOO,YAAY,CAACC,IAAI,CAACN,MAAMO,KAAK;oBACpC;gBACJ,KAAK;oBACDT,OAAOO,YAAY,GAAG;oBACtB;gBACJ,KAAK;oBACDP,OAAOO,YAAY,GAAG;oBACtB;gBACJ,KAAK;oBACDP,OAAOE,KAAK,GAAG;oBACf;gBACJ;oBACIF,MAAM,CAACE,MAAME,IAAI,CAAC,GAAG;YAC7B;QACJ;IACJ;IAEA,OAAOJ;AACX;AAEAU,IAAAA,YAAK,EAAC,gBAAgB;IAAEpB;AAAK;AAE7B,IAAIqB,gBAAO,CAACrB,MAAMsB,OAAO"}
@@ -1,18 +1,19 @@
1
+ import type { AllowScripts } from '../package-manager';
1
2
  export interface Args {
2
- allowAllScripts?: boolean;
3
- allowScripts?: string[] | false;
3
+ allowScripts?: AllowScripts;
4
4
  fix?: boolean;
5
5
  quiet?: boolean;
6
6
  token?: boolean;
7
7
  }
8
8
  export declare class Install {
9
+ #private;
9
10
  args: Args;
10
11
  constructor(args: Args);
11
12
  execute(): void;
12
13
  private configureNpmToken;
13
14
  private fetchNpmToken;
14
15
  private installPackages;
16
+ private get packageManager();
15
17
  private log;
16
- private parseScripts;
17
18
  }
18
19
  //# sourceMappingURL=install.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,IAAI;IACjB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,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;IAOP,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,eAAe;IA4BvB,OAAO,CAAC,GAAG;IAMX,OAAO,CAAC,YAAY;CAMvB"}
1
+ {"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../../src/cli/install.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AASvD,MAAM,WAAW,IAAI;IACjB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,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;gBAGC,IAAI,EAAE,IAAI;IAItB,OAAO;IAOP,OAAO,CAAC,iBAAiB;IAwCzB,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,eAAe;IAUvB,OAAO,KAAK,cAAc,GAEzB;IAED,OAAO,CAAC,GAAG;CAKd"}
@@ -13,6 +13,46 @@ const _os = /*#__PURE__*/ _interop_require_default(require("os"));
13
13
  const _path = /*#__PURE__*/ _interop_require_default(require("path"));
14
14
  const _packagemanager = require("../package-manager");
15
15
  const _utils = require("../utils");
16
+ function _check_private_redeclaration(obj, privateCollection) {
17
+ if (privateCollection.has(obj)) {
18
+ throw new TypeError("Cannot initialize the same private elements twice on an object");
19
+ }
20
+ }
21
+ function _class_apply_descriptor_get(receiver, descriptor) {
22
+ if (descriptor.get) {
23
+ return descriptor.get.call(receiver);
24
+ }
25
+ return descriptor.value;
26
+ }
27
+ function _class_apply_descriptor_set(receiver, descriptor, value) {
28
+ if (descriptor.set) {
29
+ descriptor.set.call(receiver, value);
30
+ } else {
31
+ if (!descriptor.writable) {
32
+ throw new TypeError("attempted to set read only private field");
33
+ }
34
+ descriptor.value = value;
35
+ }
36
+ }
37
+ function _class_extract_field_descriptor(receiver, privateMap, action) {
38
+ if (!privateMap.has(receiver)) {
39
+ throw new TypeError("attempted to " + action + " private field on non-instance");
40
+ }
41
+ return privateMap.get(receiver);
42
+ }
43
+ function _class_private_field_get(receiver, privateMap) {
44
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "get");
45
+ return _class_apply_descriptor_get(receiver, descriptor);
46
+ }
47
+ function _class_private_field_init(obj, privateMap, value) {
48
+ _check_private_redeclaration(obj, privateMap);
49
+ privateMap.set(obj, value);
50
+ }
51
+ function _class_private_field_set(receiver, privateMap, value) {
52
+ var descriptor = _class_extract_field_descriptor(receiver, privateMap, "set");
53
+ _class_apply_descriptor_set(receiver, descriptor, value);
54
+ return value;
55
+ }
16
56
  function _define_property(obj, key, value) {
17
57
  if (key in obj) {
18
58
  Object.defineProperty(obj, key, {
@@ -35,12 +75,7 @@ const REPO_NAME = 'frontend-dev-config';
35
75
  const AUTH_TOKEN_KEY = '//registry.npmjs.org/:_authToken';
36
76
  const AUTH_TOKEN_REGEX = /^\/\/registry\.npmjs\.org\/:_authToken=\s*(?<authToken>.+)/m;
37
77
  const ENVIRONMENT_VARIABLE_REGEX = /\${(?<environmentVariable>[^}]+)}/;
38
- const ALLOWED_SCRIPTS = [
39
- '@servicetitan/startup',
40
- 'cypress',
41
- 'msw',
42
- 'nx'
43
- ];
78
+ var _packageManager = /*#__PURE__*/ new WeakMap();
44
79
  class Install {
45
80
  execute() {
46
81
  this.log(`install cli v${(0, _utils.getVersion)()}`);
@@ -136,43 +171,27 @@ class Install {
136
171
  if (this.args.token) {
137
172
  return;
138
173
  }
139
- const packageManager = (0, _packagemanager.getPackageManager)();
140
- this.log(`Running ${packageManager.command} install`);
141
- let allowScripts;
142
- if (this.args.allowAllScripts) {
143
- this.log('Allowing all install scripts');
144
- } else if (this.args.allowScripts === false) {
145
- allowScripts = false;
146
- } else {
147
- allowScripts = [
148
- ...ALLOWED_SCRIPTS
149
- ];
150
- if (Array.isArray(this.args.allowScripts)) {
151
- const extra = this.parseScripts(this.args.allowScripts);
152
- if (extra.length) {
153
- this.log(`Allowing additional install scripts: ${extra.join(', ')}`);
154
- }
155
- allowScripts.push(...extra);
156
- }
157
- }
158
- packageManager.installPackages({
159
- ...this.args,
160
- allowScripts
161
- }, {
174
+ this.log(`Running ${this.packageManager.command} install`);
175
+ this.packageManager.installPackages(this.args, {
162
176
  env,
163
177
  stdio: 'inherit'
164
178
  });
165
179
  }
180
+ get packageManager() {
181
+ var _class_private_field_get1;
182
+ return _class_private_field_set(this, _packageManager, (_class_private_field_get1 = _class_private_field_get(this, _packageManager)) !== null && _class_private_field_get1 !== void 0 ? _class_private_field_get1 : (0, _packagemanager.getPackageManager)());
183
+ }
166
184
  log(message) {
167
185
  if (!this.args.quiet) {
168
186
  console.log(message);
169
187
  }
170
188
  }
171
- parseScripts(allowedScripts) {
172
- return (allowedScripts !== null && allowedScripts !== void 0 ? allowedScripts : []).flatMap((s)=>s.split(',')).map((s)=>s.trim()).filter((s)=>!!s);
173
- }
174
189
  constructor(args){
175
190
  _define_property(this, "args", void 0);
191
+ _class_private_field_init(this, _packageManager, {
192
+ writable: true,
193
+ value: void 0
194
+ });
176
195
  this.args = args;
177
196
  }
178
197
  }
@@ -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 { 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>[^}]+)}/;\nconst ALLOWED_SCRIPTS = ['@servicetitan/startup', 'cypress', 'msw', 'nx'];\n\nexport interface Args {\n allowAllScripts?: boolean;\n allowScripts?: string[] | false;\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 this.log(`install cli v${getVersion()}`);\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 this.log('Configuring NPM token ...');\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 this.log(`Running ${packageManager.command} install`);\n\n let allowScripts: string[] | false | undefined;\n if (this.args.allowAllScripts) {\n this.log('Allowing all install scripts');\n } else if (this.args.allowScripts === false) {\n allowScripts = false;\n } else {\n allowScripts = [...ALLOWED_SCRIPTS];\n if (Array.isArray(this.args.allowScripts)) {\n const extra = this.parseScripts(this.args.allowScripts);\n if (extra.length) {\n this.log(`Allowing additional install scripts: ${extra.join(', ')}`);\n }\n allowScripts.push(...extra);\n }\n }\n\n packageManager.installPackages({ ...this.args, allowScripts }, { env, stdio: 'inherit' });\n }\n\n private log(message: string) {\n if (!this.args.quiet) {\n console.log(message);\n }\n }\n\n private parseScripts(allowedScripts: string[]) {\n return (allowedScripts ?? [])\n .flatMap(s => s.split(','))\n .map(s => s.trim())\n .filter(s => !!s);\n }\n}\n"],"names":["Install","REPO_NAME","AUTH_TOKEN_KEY","AUTH_TOKEN_REGEX","ENVIRONMENT_VARIABLE_REGEX","ALLOWED_SCRIPTS","execute","log","getVersion","env","configureNpmToken","installPackages","isCI","args","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","console","warn","String","rmSync","recursive","force","packageManager","getPackageManager","command","allowScripts","allowAllScripts","extra","parseScripts","length","push","stdio","message","quiet","allowedScripts","flatMap","s","split","map","trim","filter"],"mappings":"AAAA,6BAA6B;;;;+BAqBhBA;;;eAAAA;;;2DApBE;2DACA;6DACE;gCACiB;uBACqD;;;;;;;;;;;;;;;;;;;AAEvF,MAAMC,YAAY;AAClB,MAAMC,iBAAiB;AACvB,MAAMC,mBAAmB;AACzB,MAAMC,6BAA6B;AACnC,MAAMC,kBAAkB;IAAC;IAAyB;IAAW;IAAO;CAAK;AAUlE,MAAML;IAOTM,UAAU;QACN,IAAI,CAACC,GAAG,CAAC,CAAC,aAAa,EAAEC,IAAAA,iBAAU,KAAI;QAEvC,MAAMC,MAAM,IAAI,CAACC,iBAAiB;QAClC,IAAI,CAACC,eAAe,CAACF;IACzB;IAEQC,oBAAoB;;YAyBFP,wBAMUC;QA9BhC,IAAIQ,IAAAA,WAAI,OAAM,IAAI,CAACC,IAAI,CAACC,GAAG,IAAI,IAAI,CAACD,IAAI,CAACE,KAAK,KAAK,OAAO;YACtD;QACJ;QAEA,IAAI,CAACR,GAAG,CAAC;QAET,IAAI,IAAI,CAACM,IAAI,CAACE,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,GAAGhB,eAAe,CAAC,EAAEa,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,YAAGpB,yBAAAA,iBAAiBqB,IAAI,CAACH,oBAAtBlB,6CAAAA,uBAA8BsB,MAAM,uCAAI,CAAC;QAC/DC,IAAAA,YAAK,EAAC;YAAEH;QAAU;QAClB,IAAI,CAACA,WAAW;YACZ;QACJ;QAEA,MAAM,EAAEI,mBAAmB,EAAE,aAAGvB,mCAAAA,2BAA2BoB,IAAI,CAACD,wBAAhCnB,uDAAAA,iCAA4CqB,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;YAAsBhB;SAAe;IAChF;IAEQe,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,MAAMnC;YAAU,IAAI;gBAC9D,MAAM,IAAIoC,MAAM,CAAC,6BAA6B,EAAEpC,WAAW;YAC/D;YAEA,MAAMqC,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;YACRC,QAAQC,IAAI,CAACC,OAAOH;QACxB,SAAU;YACN,IAAI;gBACA3B,WAAE,CAAC+B,MAAM,CAACtB,aAAa;oBAAEuB,WAAW;oBAAMC,OAAO;gBAAK;YAC1D,EAAE,eAAM;YACJ,SAAS;YACb;QACJ;IACJ;IAEQzC,gBAAgBF,GAA4B,EAAE;QAClD,IAAI,IAAI,CAACI,IAAI,CAACE,KAAK,EAAE;YACjB;QACJ;QAEA,MAAMsC,iBAAiBC,IAAAA,iCAAiB;QAExC,IAAI,CAAC/C,GAAG,CAAC,CAAC,QAAQ,EAAE8C,eAAeE,OAAO,CAAC,QAAQ,CAAC;QAEpD,IAAIC;QACJ,IAAI,IAAI,CAAC3C,IAAI,CAAC4C,eAAe,EAAE;YAC3B,IAAI,CAAClD,GAAG,CAAC;QACb,OAAO,IAAI,IAAI,CAACM,IAAI,CAAC2C,YAAY,KAAK,OAAO;YACzCA,eAAe;QACnB,OAAO;YACHA,eAAe;mBAAInD;aAAgB;YACnC,IAAImC,MAAMC,OAAO,CAAC,IAAI,CAAC5B,IAAI,CAAC2C,YAAY,GAAG;gBACvC,MAAME,QAAQ,IAAI,CAACC,YAAY,CAAC,IAAI,CAAC9C,IAAI,CAAC2C,YAAY;gBACtD,IAAIE,MAAME,MAAM,EAAE;oBACd,IAAI,CAACrD,GAAG,CAAC,CAAC,qCAAqC,EAAEmD,MAAM3B,IAAI,CAAC,OAAO;gBACvE;gBACAyB,aAAaK,IAAI,IAAIH;YACzB;QACJ;QAEAL,eAAe1C,eAAe,CAAC;YAAE,GAAG,IAAI,CAACE,IAAI;YAAE2C;QAAa,GAAG;YAAE/C;YAAKqD,OAAO;QAAU;IAC3F;IAEQvD,IAAIwD,OAAe,EAAE;QACzB,IAAI,CAAC,IAAI,CAAClD,IAAI,CAACmD,KAAK,EAAE;YAClBjB,QAAQxC,GAAG,CAACwD;QAChB;IACJ;IAEQJ,aAAaM,cAAwB,EAAE;QAC3C,OAAO,CAACA,2BAAAA,4BAAAA,iBAAkB,EAAE,EACvBC,OAAO,CAACC,CAAAA,IAAKA,EAAEC,KAAK,CAAC,MACrBC,GAAG,CAACF,CAAAA,IAAKA,EAAEG,IAAI,IACfC,MAAM,CAACJ,CAAAA,IAAK,CAAC,CAACA;IACvB;IA7HA,YAAYtD,IAAU,CAAE;QAFxBA,uBAAAA,QAAAA,KAAAA;QAGI,IAAI,CAACA,IAAI,GAAGA;IAChB;AA4HJ"}
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 type { AllowScripts } from '../package-manager';\nimport { getPackageManager, PackageManager } 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 allowScripts?: AllowScripts;\n fix?: boolean;\n quiet?: boolean;\n token?: boolean;\n}\n\nexport class Install {\n args: Args;\n #packageManager: PackageManager | undefined;\n\n constructor(args: Args) {\n this.args = args;\n }\n\n execute() {\n this.log(`install cli v${getVersion()}`);\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 this.log('Configuring NPM token ...');\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 this.log(`Running ${this.packageManager.command} install`);\n\n this.packageManager.installPackages(this.args, { env, stdio: 'inherit' });\n }\n\n private get packageManager() {\n return (this.#packageManager ??= getPackageManager());\n }\n\n private log(message: string) {\n if (!this.args.quiet) {\n console.log(message);\n }\n }\n}\n"],"names":["Install","REPO_NAME","AUTH_TOKEN_KEY","AUTH_TOKEN_REGEX","ENVIRONMENT_VARIABLE_REGEX","execute","log","getVersion","env","configureNpmToken","installPackages","isCI","args","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","console","warn","String","rmSync","recursive","force","packageManager","command","stdio","getPackageManager","message","quiet"],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./mock-package-manager"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/package-manager/__mocks__/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yDAAuC"}
@@ -3,12 +3,10 @@ import type { DeclaredVersionQuery, ResolvedVersionQuery } from '../package-mana
3
3
  export declare class MockPackageManager extends PackageManager {
4
4
  readonly command = "test";
5
5
  readonly lockFileName = "test-lock.json";
6
- readonly installArgs: string[];
7
6
  clearCache(): void;
8
7
  getDeclaredVersion(_query: DeclaredVersionQuery): string | undefined;
9
8
  getResolvedVersion(_query: ResolvedVersionQuery): string | undefined;
10
- protected getInstallArgs(): string[];
9
+ installPackages(): void;
11
10
  protected parseLockFile(): unknown;
12
- protected postInstall(): void;
13
11
  }
14
12
  //# sourceMappingURL=mock-package-manager.d.ts.map
@@ -1 +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;IAIlC,SAAS,CAAC,WAAW,IAAI,IAAI;CAChC"}
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;IAEzC,UAAU;IAEV,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAIpE,kBAAkB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAIpE,eAAe;IAEf,SAAS,CAAC,aAAa,IAAI,OAAO;CAGrC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MockPackageManager = void 0;
4
+ const package_manager_1 = require("../../package-manager");
5
+ class MockPackageManager extends package_manager_1.PackageManager {
6
+ constructor() {
7
+ super(...arguments);
8
+ Object.defineProperty(this, "command", {
9
+ enumerable: true,
10
+ configurable: true,
11
+ writable: true,
12
+ value: 'test'
13
+ });
14
+ Object.defineProperty(this, "lockFileName", {
15
+ enumerable: true,
16
+ configurable: true,
17
+ writable: true,
18
+ value: 'test-lock.json'
19
+ });
20
+ }
21
+ clearCache() { }
22
+ getDeclaredVersion(_query) {
23
+ return undefined;
24
+ }
25
+ getResolvedVersion(_query) {
26
+ return undefined;
27
+ }
28
+ installPackages() { }
29
+ parseLockFile() {
30
+ return undefined;
31
+ }
32
+ }
33
+ exports.MockPackageManager = MockPackageManager;
34
+ //# sourceMappingURL=mock-package-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mock-package-manager.js","sourceRoot":"","sources":["../../../src/package-manager/__mocks__/mock-package-manager.ts"],"names":[],"mappings":";;;AAAA,2DAAuD;AAGvD,MAAa,kBAAmB,SAAQ,gCAAc;IAAtD;;QACa;;;;mBAAU,MAAM;WAAC;QACjB;;;;mBAAe,gBAAgB;WAAC;IAiB7C,CAAC;IAfG,UAAU,KAAI,CAAC;IAEf,kBAAkB,CAAC,MAA4B;QAC3C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,kBAAkB,CAAC,MAA4B;QAC3C,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,eAAe,KAAI,CAAC;IAEV,aAAa;QACnB,OAAO,SAAS,CAAC;IACrB,CAAC;CACJ;AAnBD,gDAmBC"}
@@ -1,4 +1,4 @@
1
1
  export { getPackageManager } from './get-package-manager';
2
2
  export { PackageManager } from './package-manager';
3
- export type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';
3
+ export type { AllowScripts, DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery, } from './package-manager';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +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,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
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,EACR,YAAY,EACZ,oBAAoB,EACpB,WAAW,EACX,oBAAoB,GACvB,MAAM,mBAAmB,CAAC"}
@@ -1 +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, InstallArgs, ResolvedVersionQuery } from './package-manager';\n"],"names":["PackageManager","getPackageManager"],"mappings":";;;;;;;;;;;QACSA;eAAAA,8BAAc;;QADdC;eAAAA,oCAAiB;;;mCAAQ;gCACH"}
1
+ {"version":3,"sources":["../../src/package-manager/index.ts"],"sourcesContent":["export { getPackageManager } from './get-package-manager';\nexport { PackageManager } from './package-manager';\nexport type {\n AllowScripts,\n DeclaredVersionQuery,\n InstallArgs,\n ResolvedVersionQuery,\n} from './package-manager';\n"],"names":["PackageManager","getPackageManager"],"mappings":";;;;;;;;;;;QACSA;eAAAA,8BAAc;;QADdC;eAAAA,oCAAiB;;;mCAAQ;gCACH"}
@@ -15,11 +15,8 @@ export declare class NpmPackageManager extends PackageManager<NpmLockFile> {
15
15
  clearCache(): void;
16
16
  getDeclaredVersion({ workspacePackage, declaredBy, dependency, }: DeclaredVersionQuery): string | undefined;
17
17
  getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined;
18
- protected getInstallArgs({ fix, allowScripts }: InstallArgs): string[];
18
+ installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
19
19
  protected parseLockFile(): NpmLockFile | undefined;
20
- protected postInstall(args: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
21
- private runAllowedScripts;
22
- private runProjectPostinstall;
23
20
  /**
24
21
  * Looks up a lockfile entry for the given workspace package, falling back
25
22
  * to the hoisted root entry. `workspacePackage` is the package's relative
@@ -27,6 +24,8 @@ export declare class NpmPackageManager extends PackageManager<NpmLockFile> {
27
24
  * workspace package itself, matching npm's own lockfile key convention.
28
25
  */
29
26
  private findEntry;
27
+ private runRebuild;
28
+ private runProjectPostinstall;
30
29
  }
31
30
  export {};
32
31
  //# sourceMappingURL=npm-package-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"npm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/npm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,UAAU,EAA+B,MAAM,UAAU,CAAC;AACzE,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,YAAY,EAAE,EAAE,WAAW,GAAG,MAAM,EAAE;IAWtE,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAQlD,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAS1F,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,qBAAqB;IAe7B;;;;;OAKG;IACH,OAAO,CAAC,SAAS;CAapB"}
1
+ {"version":3,"file":"npm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/npm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,UAAU,EAA+B,MAAM,UAAU,CAAC;AACzE,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAQnD,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,eAAe,CAAC,IAAI,GAAE,WAAgB,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IA6DlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAQlD;;;;;OAKG;IACH,OAAO,CAAC,SAAS;IAcjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,qBAAqB;CAOhC"}
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "NpmPackageManager", {
11
11
  const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
12
12
  const _utils = require("../utils");
13
13
  const _packagemanager = require("./package-manager");
14
+ const _utils1 = require("./utils");
14
15
  function _define_property(obj, key, value) {
15
16
  if (key in obj) {
16
17
  Object.defineProperty(obj, key, {
@@ -53,20 +54,58 @@ class NpmPackageManager extends _packagemanager.PackageManager {
53
54
  package: dependency
54
55
  })) === null || _this_findEntry === void 0 ? void 0 : _this_findEntry.version;
55
56
  }
56
- getInstallArgs({ fix, allowScripts }) {
57
- return [
57
+ installPackages(args = {}, options) {
58
+ var _args_allowScripts;
59
+ /*
60
+ * The `true` fallback allows projects a grace period to identify and
61
+ * allowlist trusted scripts. Remove the fallback when the grace period expires.
62
+ */ const allowScripts = (0, _utils1.resolveAllowScripts)((_args_allowScripts = args.allowScripts) !== null && _args_allowScripts !== void 0 ? _args_allowScripts : true);
63
+ if (!args.quiet) {
64
+ (0, _utils1.logAllowedScripts)(allowScripts);
65
+ }
66
+ (0, _utils.runCommand)('npm', [
58
67
  (0, _utils.isCI)() ? 'ci' : 'i',
59
68
  '--audit=false',
60
69
  '--fund=false',
61
70
  '--legacy-peer-deps',
62
- ...allowScripts === false || (allowScripts === null || allowScripts === void 0 ? void 0 : allowScripts.length) ? [
71
+ ...(0, _utils1.shouldIgnoreScripts)(allowScripts) ? [
63
72
  '--ignore-scripts'
64
73
  ] : [],
65
- ...fix ? [
74
+ ...args.fix ? [
66
75
  '--package-lock-only',
67
76
  '--prefer-dedupe'
68
77
  ] : []
69
- ];
78
+ ], options);
79
+ try {
80
+ if (args.fix) {
81
+ return;
82
+ }
83
+ /*
84
+ * Rebuild applies when allowScripts is an explicit list:
85
+ * `true` means npm install already ran every script, `false`
86
+ * means the user opted out.
87
+ */ if (Array.isArray(allowScripts)) {
88
+ this.runRebuild(allowScripts);
89
+ }
90
+ /*
91
+ * Warn against the effective allowlist so teams can see which
92
+ * scripts they should add to --allow-scripts. Skip when the user
93
+ * explicitly opted out (`false`); they made an informed choice.
94
+ */ if (allowScripts !== false) {
95
+ (0, _utils.warnUntrustedInstallScripts)(Array.isArray(allowScripts) ? allowScripts : _utils1.DEFAULT_ALLOWED_SCRIPTS, this.lockFileName, {
96
+ force: true
97
+ });
98
+ }
99
+ /*
100
+ * When allowScripts is `true`, npm already ran project postinstall.
101
+ * In other cases, we run it manually. Note, `false` only ignores
102
+ * package scripts, the project postinstall is always trusted.
103
+ */ if (allowScripts !== true) {
104
+ this.runProjectPostinstall(options);
105
+ }
106
+ } finally{
107
+ this.reset();
108
+ }
70
109
  }
71
110
  parseLockFile() {
72
111
  try {
@@ -75,33 +114,29 @@ class NpmPackageManager extends _packagemanager.PackageManager {
75
114
  return undefined;
76
115
  }
77
116
  }
78
- postInstall(args, options) {
79
- if (args.fix || args.allowAllScripts) {
80
- return;
81
- }
82
- this.runAllowedScripts(args);
83
- this.runProjectPostinstall(args, options);
117
+ /**
118
+ * Looks up a lockfile entry for the given workspace package, falling back
119
+ * to the hoisted root entry. `workspacePackage` is the package's relative
120
+ * path from the repo root; the empty string `''` denotes the root
121
+ * workspace package itself, matching npm's own lockfile key convention.
122
+ */ findEntry({ workspacePackage, package: packageName }) {
123
+ var _ref;
124
+ var _this_getLockFile;
125
+ const packages = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : _this_getLockFile.packages;
126
+ 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}`];
84
127
  }
85
- runAllowedScripts(args) {
86
- var _args_allowScripts;
87
- if (args.allowScripts === false || !((_args_allowScripts = args.allowScripts) === null || _args_allowScripts === void 0 ? void 0 : _args_allowScripts.length)) {
88
- return;
89
- }
128
+ runRebuild(scripts) {
90
129
  try {
91
130
  (0, _utils.runCommand)('npm', [
92
131
  'rebuild',
93
- ...args.allowScripts
132
+ ...scripts
94
133
  ]);
95
134
  } catch (unused) {
96
- console.error(`Failed to run allowed scripts: ${args.allowScripts.join(', ')}`);
135
+ console.error(`Failed to run allowed scripts: ${scripts.join(', ')}`);
97
136
  process.exitCode = 1;
98
137
  }
99
- (0, _utils.warnUntrustedInstallScripts)(args.allowScripts, this.lockFileName);
100
138
  }
101
- runProjectPostinstall(args, options) {
102
- if (args.allowScripts === false) {
103
- return;
104
- }
139
+ runProjectPostinstall(options) {
105
140
  try {
106
141
  (0, _utils.runCommand)('npm', [
107
142
  'run',
@@ -112,17 +147,6 @@ class NpmPackageManager extends _packagemanager.PackageManager {
112
147
  process.exitCode = 1;
113
148
  }
114
149
  }
115
- /**
116
- * Looks up a lockfile entry for the given workspace package, falling back
117
- * to the hoisted root entry. `workspacePackage` is the package's relative
118
- * path from the repo root; the empty string `''` denotes the root
119
- * workspace package itself, matching npm's own lockfile key convention.
120
- */ findEntry({ workspacePackage, package: packageName }) {
121
- var _ref;
122
- var _this_getLockFile;
123
- const packages = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : _this_getLockFile.packages;
124
- 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}`];
125
- }
126
150
  constructor(...args){
127
151
  super(...args), _define_property(this, "command", 'npm'), _define_property(this, "lockFileName", 'package-lock.json');
128
152
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/package-manager/npm-package-manager.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport { isCI, runCommand, warnUntrustedInstallScripts } 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, allowScripts }: InstallArgs): string[] {\n return [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(allowScripts === false || allowScripts?.length ? ['--ignore-scripts'] : []),\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 protected postInstall(args: InstallArgs, options?: Parameters<typeof runCommand>[2]): void {\n if (args.fix || args.allowAllScripts) {\n return;\n }\n\n this.runAllowedScripts(args);\n this.runProjectPostinstall(args, options);\n }\n\n private runAllowedScripts(args: InstallArgs) {\n if (args.allowScripts === false || !args.allowScripts?.length) {\n return;\n }\n\n try {\n runCommand('npm', ['rebuild', ...args.allowScripts]);\n } catch {\n console.error(`Failed to run allowed scripts: ${args.allowScripts.join(', ')}`);\n process.exitCode = 1;\n }\n\n warnUntrustedInstallScripts(args.allowScripts, this.lockFileName);\n }\n\n private runProjectPostinstall(\n args: InstallArgs,\n options?: Parameters<typeof runCommand>[2]\n ): void {\n if (args.allowScripts === false) {\n return;\n }\n\n try {\n runCommand('npm', ['run', 'postinstall', '--if-present'], options);\n } catch {\n process.exitCode = 1;\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","allowScripts","isCI","length","parseLockFile","JSON","parse","fs","readFileSync","lockFileName","undefined","postInstall","args","options","allowAllScripts","runAllowedScripts","runProjectPostinstall","console","error","join","process","exitCode","warnUntrustedInstallScripts","packageName","packages","getLockFile","command"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/package-manager/npm-package-manager.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport { isCI, runCommand, warnUntrustedInstallScripts } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\nimport {\n DEFAULT_ALLOWED_SCRIPTS,\n logAllowedScripts,\n resolveAllowScripts,\n shouldIgnoreScripts,\n} from './utils';\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 installPackages(args: InstallArgs = {}, options?: Parameters<typeof runCommand>[2]) {\n /*\n * The `true` fallback allows projects a grace period to identify and\n * allowlist trusted scripts. Remove the fallback when the grace period expires.\n */\n const allowScripts = resolveAllowScripts(args.allowScripts ?? true);\n\n if (!args.quiet) {\n logAllowedScripts(allowScripts);\n }\n\n runCommand(\n 'npm',\n [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(shouldIgnoreScripts(allowScripts) ? ['--ignore-scripts'] : []),\n ...(args.fix ? ['--package-lock-only', '--prefer-dedupe'] : []),\n ],\n options\n );\n\n try {\n if (args.fix) {\n return;\n }\n /*\n * Rebuild applies when allowScripts is an explicit list:\n * `true` means npm install already ran every script, `false`\n * means the user opted out.\n */\n if (Array.isArray(allowScripts)) {\n this.runRebuild(allowScripts);\n }\n /*\n * Warn against the effective allowlist so teams can see which\n * scripts they should add to --allow-scripts. Skip when the user\n * explicitly opted out (`false`); they made an informed choice.\n */\n if (allowScripts !== false) {\n warnUntrustedInstallScripts(\n Array.isArray(allowScripts) ? allowScripts : DEFAULT_ALLOWED_SCRIPTS,\n this.lockFileName,\n { force: true }\n );\n }\n /*\n * When allowScripts is `true`, npm already ran project postinstall.\n * In other cases, we run it manually. Note, `false` only ignores\n * package scripts, the project postinstall is always trusted.\n */\n if (allowScripts !== true) {\n this.runProjectPostinstall(options);\n }\n } finally {\n this.reset();\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 private runRebuild(scripts: string[]) {\n try {\n runCommand('npm', ['rebuild', ...scripts]);\n } catch {\n console.error(`Failed to run allowed scripts: ${scripts.join(', ')}`);\n process.exitCode = 1;\n }\n }\n\n private runProjectPostinstall(options?: Parameters<typeof runCommand>[2]) {\n try {\n runCommand('npm', ['run', 'postinstall', '--if-present'], options);\n } catch {\n process.exitCode = 1;\n }\n }\n}\n"],"names":["NpmPackageManager","PackageManager","clearCache","runCommand","getDeclaredVersion","workspacePackage","declaredBy","dependency","entry","findEntry","package","dependencies","peerDependencies","getResolvedVersion","version","installPackages","args","options","allowScripts","resolveAllowScripts","quiet","logAllowedScripts","isCI","shouldIgnoreScripts","fix","Array","isArray","runRebuild","warnUntrustedInstallScripts","DEFAULT_ALLOWED_SCRIPTS","lockFileName","force","runProjectPostinstall","reset","parseLockFile","JSON","parse","fs","readFileSync","undefined","packageName","packages","getLockFile","scripts","console","error","join","process","exitCode","command"],"mappings":"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"}
@@ -1,8 +1,9 @@
1
1
  import { runCommand } from '../utils';
2
+ export type AllowScripts = true | false | string[];
2
3
  export interface InstallArgs {
3
- allowAllScripts?: boolean;
4
- allowScripts?: string[] | false;
4
+ allowScripts?: AllowScripts;
5
5
  fix?: boolean;
6
+ quiet?: boolean;
6
7
  }
7
8
  export interface DeclaredVersionQuery {
8
9
  workspacePackage: string;
@@ -18,14 +19,12 @@ export declare abstract class PackageManager<LockFile = unknown> {
18
19
  abstract readonly command: string;
19
20
  abstract readonly lockFileName: string;
20
21
  hasValidLockFile(): boolean;
21
- installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
22
22
  protected getLockFile(): LockFile | undefined;
23
23
  protected reset(): void;
24
24
  abstract clearCache(): void;
25
25
  abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;
26
26
  abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;
27
- protected abstract getInstallArgs(args: InstallArgs): string[];
27
+ abstract installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
28
28
  protected abstract parseLockFile(): LockFile | undefined;
29
- protected abstract postInstall(args: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
30
29
  }
31
30
  //# sourceMappingURL=package-manager.d.ts.map
@@ -1 +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,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,KAAK,CAAC;IAChC,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;IAMlF,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;IACxD,SAAS,CAAC,QAAQ,CAAC,WAAW,CAC1B,IAAI,EAAE,WAAW,EACjB,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAC3C,IAAI;CACV"}
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,MAAM,YAAY,GAAG,IAAI,GAAG,KAAK,GAAG,MAAM,EAAE,CAAC;AAEnD,MAAM,WAAW,WAAW;IACxB,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;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,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;IAC5E,QAAQ,CAAC,eAAe,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI;IAE9F,SAAS,CAAC,QAAQ,CAAC,aAAa,IAAI,QAAQ,GAAG,SAAS;CAC3D"}