@servicetitan/install 39.0.0 → 39.1.0

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.
@@ -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;AAQnD,UAAU,gBAAgB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,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;IAwDlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAYlD;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,qBAAqB;CAOhC"}
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;AASnD,UAAU,gBAAgB;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,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;IAwDlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAYlD;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,qBAAqB;CAOhC"}
@@ -81,7 +81,7 @@ class NpmPackageManager extends _packagemanager.PackageManager {
81
81
  * `true` means npm install already ran every script, `false`
82
82
  * means the user opted out.
83
83
  */ if (Array.isArray(allowScripts) && allowScripts.length > 0) {
84
- this.runRebuild(allowScripts);
84
+ (0, _utils1.withProjectAllowScripts)(allowScripts, ()=>this.runRebuild(allowScripts));
85
85
  }
86
86
  /*
87
87
  * Warn against the effective allowlist so teams can see which
@@ -134,8 +134,15 @@ class NpmPackageManager extends _packagemanager.PackageManager {
134
134
  (0, _utils.runCommand)(this.command, [
135
135
  'rebuild',
136
136
  ...scripts
137
- ]);
138
- } catch (unused) {
137
+ ], {
138
+ stdio: [
139
+ 'inherit',
140
+ 'inherit',
141
+ 'pipe'
142
+ ]
143
+ });
144
+ } catch (error) {
145
+ console.error(String(error));
139
146
  console.error(`Failed to run allowed scripts: ${scripts.join(', ')}`);
140
147
  process.exitCode = 1;
141
148
  }
@@ -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';\nimport {\n DEFAULT_ALLOWED_SCRIPTS,\n logAllowedScripts,\n resolveAllowScripts,\n usesStartup,\n} from './utils';\n\ninterface NpmLockFileEntry {\n version?: string;\n resolved?: string;\n link?: boolean;\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(this.command, ['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 const builtInAllowlist = usesStartup() ? DEFAULT_ALLOWED_SCRIPTS : [];\n const allowScripts = resolveAllowScripts(args.allowScripts ?? [], builtInAllowlist);\n\n if (!args.quiet) {\n logAllowedScripts(allowScripts, builtInAllowlist);\n }\n\n runCommand(\n this.command,\n [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(allowScripts !== true ? ['--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 a non-empty explicit list:\n * `true` means npm install already ran every script, `false`\n * means the user opted out.\n */\n if (Array.isArray(allowScripts) && allowScripts.length > 0) {\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 : builtInAllowlist\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 const lockFilePath = this.getLockFilePath();\n if (!lockFilePath) {\n return undefined;\n }\n try {\n return JSON.parse(fs.readFileSync(lockFilePath, '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 * Follows link entries to the resolved workspace package, so callers see\n * the workspace package's own metadata rather than the symlink stub.\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 const entry =\n packages?.[`${workspacePackage}/node_modules/${packageName}`] ??\n packages?.[`node_modules/${packageName}`];\n if (entry?.link && entry.resolved) {\n return packages?.[entry.resolved];\n }\n return entry;\n }\n\n private runRebuild(scripts: string[]) {\n try {\n runCommand(this.command, ['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(this.command, ['run', 'postinstall', '--if-present'], options);\n } catch {\n process.exitCode = 1;\n }\n }\n}\n"],"names":["NpmPackageManager","PackageManager","clearCache","runCommand","command","getDeclaredVersion","workspacePackage","declaredBy","dependency","entry","findEntry","package","dependencies","peerDependencies","getResolvedVersion","version","installPackages","args","options","builtInAllowlist","usesStartup","DEFAULT_ALLOWED_SCRIPTS","allowScripts","resolveAllowScripts","quiet","logAllowedScripts","isCI","fix","Array","isArray","length","runRebuild","warnUntrustedInstallScripts","runProjectPostinstall","reset","parseLockFile","lockFilePath","getLockFilePath","undefined","JSON","parse","fs","readFileSync","packageName","packages","getLockFile","link","resolved","scripts","console","error","join","process","exitCode","lockFileName"],"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 usesStartup,\n withProjectAllowScripts,\n} from './utils';\n\ninterface NpmLockFileEntry {\n version?: string;\n resolved?: string;\n link?: boolean;\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(this.command, ['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 const builtInAllowlist = usesStartup() ? DEFAULT_ALLOWED_SCRIPTS : [];\n const allowScripts = resolveAllowScripts(args.allowScripts ?? [], builtInAllowlist);\n\n if (!args.quiet) {\n logAllowedScripts(allowScripts, builtInAllowlist);\n }\n\n runCommand(\n this.command,\n [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(allowScripts !== true ? ['--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 a non-empty explicit list:\n * `true` means npm install already ran every script, `false`\n * means the user opted out.\n */\n if (Array.isArray(allowScripts) && allowScripts.length > 0) {\n withProjectAllowScripts(allowScripts, () => 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 : builtInAllowlist\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 const lockFilePath = this.getLockFilePath();\n if (!lockFilePath) {\n return undefined;\n }\n try {\n return JSON.parse(fs.readFileSync(lockFilePath, '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 * Follows link entries to the resolved workspace package, so callers see\n * the workspace package's own metadata rather than the symlink stub.\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 const entry =\n packages?.[`${workspacePackage}/node_modules/${packageName}`] ??\n packages?.[`node_modules/${packageName}`];\n if (entry?.link && entry.resolved) {\n return packages?.[entry.resolved];\n }\n return entry;\n }\n\n private runRebuild(scripts: string[]) {\n try {\n runCommand(this.command, ['rebuild', ...scripts], {\n stdio: ['inherit', 'inherit', 'pipe'],\n });\n } catch (error) {\n console.error(String(error));\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(this.command, ['run', 'postinstall', '--if-present'], options);\n } catch {\n process.exitCode = 1;\n }\n }\n}\n"],"names":["NpmPackageManager","PackageManager","clearCache","runCommand","command","getDeclaredVersion","workspacePackage","declaredBy","dependency","entry","findEntry","package","dependencies","peerDependencies","getResolvedVersion","version","installPackages","args","options","builtInAllowlist","usesStartup","DEFAULT_ALLOWED_SCRIPTS","allowScripts","resolveAllowScripts","quiet","logAllowedScripts","isCI","fix","Array","isArray","length","withProjectAllowScripts","runRebuild","warnUntrustedInstallScripts","runProjectPostinstall","reset","parseLockFile","lockFilePath","getLockFilePath","undefined","JSON","parse","fs","readFileSync","packageName","packages","getLockFile","link","resolved","scripts","stdio","error","console","String","join","process","exitCode","lockFileName"],"mappings":"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"}
@@ -2,4 +2,5 @@ export * from './log-allowed-scripts';
2
2
  export * from './parse-allow-scripts';
3
3
  export * from './resolve-allow-scripts';
4
4
  export * from './uses-startup';
5
+ export * from './with-project-allow-scripts';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/package-manager/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/package-manager/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC"}
@@ -6,6 +6,7 @@ _export_star(require("./log-allowed-scripts"), exports);
6
6
  _export_star(require("./parse-allow-scripts"), exports);
7
7
  _export_star(require("./resolve-allow-scripts"), exports);
8
8
  _export_star(require("./uses-startup"), exports);
9
+ _export_star(require("./with-project-allow-scripts"), exports);
9
10
  function _export_star(from, to) {
10
11
  Object.keys(from).forEach(function(k) {
11
12
  if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/package-manager/utils/index.ts"],"sourcesContent":["export * from './log-allowed-scripts';\nexport * from './parse-allow-scripts';\nexport * from './resolve-allow-scripts';\nexport * from './uses-startup';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA"}
1
+ {"version":3,"sources":["../../../src/package-manager/utils/index.ts"],"sourcesContent":["export * from './log-allowed-scripts';\nexport * from './parse-allow-scripts';\nexport * from './resolve-allow-scripts';\nexport * from './uses-startup';\nexport * from './with-project-allow-scripts';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA"}
@@ -0,0 +1,2 @@
1
+ export declare function withProjectAllowScripts<T>(scripts: string[], fn: () => T): T;
2
+ //# sourceMappingURL=with-project-allow-scripts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-project-allow-scripts.d.ts","sourceRoot":"","sources":["../../../src/package-manager/utils/with-project-allow-scripts.ts"],"names":[],"mappings":"AAMA,wBAAgB,uBAAuB,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,CAiB5E"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "withProjectAllowScripts", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return withProjectAllowScripts;
9
+ }
10
+ });
11
+ const _fs = /*#__PURE__*/ _interop_require_default(require("fs"));
12
+ const _path = /*#__PURE__*/ _interop_require_default(require("path"));
13
+ const _utils = require("../../utils");
14
+ function _interop_require_default(obj) {
15
+ return obj && obj.__esModule ? obj : {
16
+ default: obj
17
+ };
18
+ }
19
+ const NPM = 'npm';
20
+ function withProjectAllowScripts(scripts, fn) {
21
+ if (!supportsProjectAllowScriptsConfig(getNpmVersion())) {
22
+ return fn();
23
+ }
24
+ const packageJsonPath = _path.default.join(getNpmPrefix(), 'package.json');
25
+ const backupPath = `${packageJsonPath}.bak`;
26
+ const original = _fs.default.readFileSync(packageJsonPath, 'utf-8');
27
+ _fs.default.copyFileSync(packageJsonPath, backupPath);
28
+ try {
29
+ _fs.default.writeFileSync(packageJsonPath, buildPackageJsonWithAllowScripts(original, scripts));
30
+ return fn();
31
+ } finally{
32
+ _fs.default.copyFileSync(backupPath, packageJsonPath);
33
+ _fs.default.rmSync(backupPath);
34
+ }
35
+ }
36
+ function getNpmVersion() {
37
+ return (0, _utils.runCommand)(NPM, [
38
+ '--version'
39
+ ]).trim();
40
+ }
41
+ function getNpmPrefix() {
42
+ return (0, _utils.runCommand)(NPM, [
43
+ 'prefix'
44
+ ]).trim();
45
+ }
46
+ function buildPackageJsonWithAllowScripts(original, scripts) {
47
+ const packageJson = JSON.parse(original);
48
+ const allowed = Object.fromEntries(scripts.map((name)=>[
49
+ name,
50
+ true
51
+ ]));
52
+ return JSON.stringify({
53
+ ...packageJson,
54
+ allowScripts: {
55
+ ...allowed,
56
+ ...packageJson.allowScripts
57
+ }
58
+ }, null, 2);
59
+ }
60
+ function supportsProjectAllowScriptsConfig(npmVersion) {
61
+ const [major, minor] = npmVersion.split('.').map((part)=>Number.parseInt(part, 10));
62
+ if (!Number.isFinite(major)) {
63
+ return false;
64
+ }
65
+ return major > 11 || major === 11 && minor >= 16;
66
+ }
67
+
68
+ //# sourceMappingURL=with-project-allow-scripts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/package-manager/utils/with-project-allow-scripts.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { runCommand } from '../../utils';\n\nconst NPM = 'npm';\n\nexport function withProjectAllowScripts<T>(scripts: string[], fn: () => T): T {\n if (!supportsProjectAllowScriptsConfig(getNpmVersion())) {\n return fn();\n }\n\n const packageJsonPath = path.join(getNpmPrefix(), 'package.json');\n const backupPath = `${packageJsonPath}.bak`;\n const original = fs.readFileSync(packageJsonPath, 'utf-8');\n fs.copyFileSync(packageJsonPath, backupPath);\n\n try {\n fs.writeFileSync(packageJsonPath, buildPackageJsonWithAllowScripts(original, scripts));\n return fn();\n } finally {\n fs.copyFileSync(backupPath, packageJsonPath);\n fs.rmSync(backupPath);\n }\n}\n\nfunction getNpmVersion(): string {\n return runCommand(NPM, ['--version']).trim();\n}\n\nfunction getNpmPrefix(): string {\n return runCommand(NPM, ['prefix']).trim();\n}\n\nfunction buildPackageJsonWithAllowScripts(original: string, scripts: string[]): string {\n const packageJson = JSON.parse(original);\n const allowed = Object.fromEntries(scripts.map(name => [name, true]));\n\n return JSON.stringify(\n { ...packageJson, allowScripts: { ...allowed, ...packageJson.allowScripts } },\n null,\n 2\n );\n}\n\nfunction supportsProjectAllowScriptsConfig(npmVersion: string): boolean {\n const [major, minor] = npmVersion.split('.').map(part => Number.parseInt(part, 10));\n if (!Number.isFinite(major)) {\n return false;\n }\n return major > 11 || (major === 11 && minor >= 16);\n}\n"],"names":["withProjectAllowScripts","NPM","scripts","fn","supportsProjectAllowScriptsConfig","getNpmVersion","packageJsonPath","path","join","getNpmPrefix","backupPath","original","fs","readFileSync","copyFileSync","writeFileSync","buildPackageJsonWithAllowScripts","rmSync","runCommand","trim","packageJson","JSON","parse","allowed","Object","fromEntries","map","name","stringify","allowScripts","npmVersion","major","minor","split","part","Number","parseInt","isFinite"],"mappings":";;;;+BAMgBA;;;eAAAA;;;2DAND;6DACE;uBACU;;;;;;AAE3B,MAAMC,MAAM;AAEL,SAASD,wBAA2BE,OAAiB,EAAEC,EAAW;IACrE,IAAI,CAACC,kCAAkCC,kBAAkB;QACrD,OAAOF;IACX;IAEA,MAAMG,kBAAkBC,aAAI,CAACC,IAAI,CAACC,gBAAgB;IAClD,MAAMC,aAAa,GAAGJ,gBAAgB,IAAI,CAAC;IAC3C,MAAMK,WAAWC,WAAE,CAACC,YAAY,CAACP,iBAAiB;IAClDM,WAAE,CAACE,YAAY,CAACR,iBAAiBI;IAEjC,IAAI;QACAE,WAAE,CAACG,aAAa,CAACT,iBAAiBU,iCAAiCL,UAAUT;QAC7E,OAAOC;IACX,SAAU;QACNS,WAAE,CAACE,YAAY,CAACJ,YAAYJ;QAC5BM,WAAE,CAACK,MAAM,CAACP;IACd;AACJ;AAEA,SAASL;IACL,OAAOa,IAAAA,iBAAU,EAACjB,KAAK;QAAC;KAAY,EAAEkB,IAAI;AAC9C;AAEA,SAASV;IACL,OAAOS,IAAAA,iBAAU,EAACjB,KAAK;QAAC;KAAS,EAAEkB,IAAI;AAC3C;AAEA,SAASH,iCAAiCL,QAAgB,EAAET,OAAiB;IACzE,MAAMkB,cAAcC,KAAKC,KAAK,CAACX;IAC/B,MAAMY,UAAUC,OAAOC,WAAW,CAACvB,QAAQwB,GAAG,CAACC,CAAAA,OAAQ;YAACA;YAAM;SAAK;IAEnE,OAAON,KAAKO,SAAS,CACjB;QAAE,GAAGR,WAAW;QAAES,cAAc;YAAE,GAAGN,OAAO;YAAE,GAAGH,YAAYS,YAAY;QAAC;IAAE,GAC5E,MACA;AAER;AAEA,SAASzB,kCAAkC0B,UAAkB;IACzD,MAAM,CAACC,OAAOC,MAAM,GAAGF,WAAWG,KAAK,CAAC,KAAKP,GAAG,CAACQ,CAAAA,OAAQC,OAAOC,QAAQ,CAACF,MAAM;IAC/E,IAAI,CAACC,OAAOE,QAAQ,CAACN,QAAQ;QACzB,OAAO;IACX;IACA,OAAOA,QAAQ,MAAOA,UAAU,MAAMC,SAAS;AACnD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/install",
3
- "version": "39.0.0",
3
+ "version": "39.1.0",
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": {
@@ -30,7 +30,7 @@
30
30
  "webpack": false
31
31
  },
32
32
  "peerDependencies": {
33
- "js-yaml": "~5.2.2"
33
+ "js-yaml": "~5.3.0"
34
34
  },
35
35
  "peerDependenciesMeta": {
36
36
  "js-yaml": {
@@ -40,5 +40,5 @@
40
40
  "devDependencies": {
41
41
  "ts-node": "~10.9.2"
42
42
  },
43
- "gitHead": "9138e3fcda061941b89620b9004426f5c13a89ae"
43
+ "gitHead": "a2471578a506e8c40e90956a5c70cc1638bbe9c1"
44
44
  }
@@ -8,6 +8,7 @@ import {
8
8
  logAllowedScripts,
9
9
  resolveAllowScripts,
10
10
  usesStartup,
11
+ withProjectAllowScripts,
11
12
  } from './utils';
12
13
 
13
14
  interface NpmLockFileEntry {
@@ -74,7 +75,7 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
74
75
  * means the user opted out.
75
76
  */
76
77
  if (Array.isArray(allowScripts) && allowScripts.length > 0) {
77
- this.runRebuild(allowScripts);
78
+ withProjectAllowScripts(allowScripts, () => this.runRebuild(allowScripts));
78
79
  }
79
80
  /*
80
81
  * Warn against the effective allowlist so teams can see which
@@ -138,8 +139,11 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
138
139
 
139
140
  private runRebuild(scripts: string[]) {
140
141
  try {
141
- runCommand(this.command, ['rebuild', ...scripts]);
142
- } catch {
142
+ runCommand(this.command, ['rebuild', ...scripts], {
143
+ stdio: ['inherit', 'inherit', 'pipe'],
144
+ });
145
+ } catch (error) {
146
+ console.error(String(error));
143
147
  console.error(`Failed to run allowed scripts: ${scripts.join(', ')}`);
144
148
  process.exitCode = 1;
145
149
  }
@@ -2,3 +2,4 @@ export * from './log-allowed-scripts';
2
2
  export * from './parse-allow-scripts';
3
3
  export * from './resolve-allow-scripts';
4
4
  export * from './uses-startup';
5
+ export * from './with-project-allow-scripts';
@@ -0,0 +1,51 @@
1
+ import fs from 'fs';
2
+ import path from 'path';
3
+ import { runCommand } from '../../utils';
4
+
5
+ const NPM = 'npm';
6
+
7
+ export function withProjectAllowScripts<T>(scripts: string[], fn: () => T): T {
8
+ if (!supportsProjectAllowScriptsConfig(getNpmVersion())) {
9
+ return fn();
10
+ }
11
+
12
+ const packageJsonPath = path.join(getNpmPrefix(), 'package.json');
13
+ const backupPath = `${packageJsonPath}.bak`;
14
+ const original = fs.readFileSync(packageJsonPath, 'utf-8');
15
+ fs.copyFileSync(packageJsonPath, backupPath);
16
+
17
+ try {
18
+ fs.writeFileSync(packageJsonPath, buildPackageJsonWithAllowScripts(original, scripts));
19
+ return fn();
20
+ } finally {
21
+ fs.copyFileSync(backupPath, packageJsonPath);
22
+ fs.rmSync(backupPath);
23
+ }
24
+ }
25
+
26
+ function getNpmVersion(): string {
27
+ return runCommand(NPM, ['--version']).trim();
28
+ }
29
+
30
+ function getNpmPrefix(): string {
31
+ return runCommand(NPM, ['prefix']).trim();
32
+ }
33
+
34
+ function buildPackageJsonWithAllowScripts(original: string, scripts: string[]): string {
35
+ const packageJson = JSON.parse(original);
36
+ const allowed = Object.fromEntries(scripts.map(name => [name, true]));
37
+
38
+ return JSON.stringify(
39
+ { ...packageJson, allowScripts: { ...allowed, ...packageJson.allowScripts } },
40
+ null,
41
+ 2
42
+ );
43
+ }
44
+
45
+ function supportsProjectAllowScriptsConfig(npmVersion: string): boolean {
46
+ const [major, minor] = npmVersion.split('.').map(part => Number.parseInt(part, 10));
47
+ if (!Number.isFinite(major)) {
48
+ return false;
49
+ }
50
+ return major > 11 || (major === 11 && minor >= 16);
51
+ }