@servicetitan/install 39.2.0 → 40.0.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.
- package/dist/cli/index.js +6 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/install.d.ts +1 -0
- package/dist/cli/install.d.ts.map +1 -1
- package/dist/cli/install.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/package-manager/npm-package-manager.d.ts +2 -0
- package/dist/package-manager/npm-package-manager.d.ts.map +1 -1
- package/dist/package-manager/npm-package-manager.js +63 -4
- package/dist/package-manager/npm-package-manager.js.map +1 -1
- package/dist/package-manager/package-manager.d.ts +1 -0
- package/dist/package-manager/package-manager.d.ts.map +1 -1
- package/dist/package-manager/package-manager.js.map +1 -1
- package/dist/package-manager/pnpm-package-manager.d.ts +2 -0
- package/dist/package-manager/pnpm-package-manager.d.ts.map +1 -1
- package/dist/package-manager/pnpm-package-manager.js +40 -1
- package/dist/package-manager/pnpm-package-manager.js.map +1 -1
- package/dist/package-manager/utils/filter-trusted-scripts.d.ts +13 -0
- package/dist/package-manager/utils/filter-trusted-scripts.d.ts.map +1 -0
- package/dist/package-manager/utils/filter-trusted-scripts.js +42 -0
- package/dist/package-manager/utils/filter-trusted-scripts.js.map +1 -0
- package/dist/package-manager/utils/index.d.ts +2 -0
- package/dist/package-manager/utils/index.d.ts.map +1 -1
- package/dist/package-manager/utils/index.js +2 -0
- package/dist/package-manager/utils/index.js.map +1 -1
- package/dist/package-manager/utils/resolve-allow-scripts.d.ts +0 -1
- package/dist/package-manager/utils/resolve-allow-scripts.d.ts.map +1 -1
- package/dist/package-manager/utils/resolve-allow-scripts.js +3 -18
- package/dist/package-manager/utils/resolve-allow-scripts.js.map +1 -1
- package/dist/package-manager/utils/resolve-min-release-age.d.ts +6 -0
- package/dist/package-manager/utils/resolve-min-release-age.d.ts.map +1 -0
- package/dist/package-manager/utils/resolve-min-release-age.js +25 -0
- package/dist/package-manager/utils/resolve-min-release-age.js.map +1 -0
- package/dist/utils/audited-scripts.d.ts +8 -0
- package/dist/utils/audited-scripts.d.ts.map +1 -0
- package/dist/utils/audited-scripts.js +102 -0
- package/dist/utils/audited-scripts.js.map +1 -0
- package/dist/utils/get-packages-with-install-scripts.d.ts.map +1 -1
- package/dist/utils/get-packages-with-install-scripts.js +10 -14
- package/dist/utils/get-packages-with-install-scripts.js.map +1 -1
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/version-compare.d.ts +2 -0
- package/dist/utils/version-compare.d.ts.map +1 -0
- package/dist/utils/version-compare.js +44 -0
- package/dist/utils/version-compare.js.map +1 -0
- package/dist/utils/warn-untrusted-install-scripts.d.ts +2 -1
- package/dist/utils/warn-untrusted-install-scripts.d.ts.map +1 -1
- package/dist/utils/warn-untrusted-install-scripts.js +18 -25
- package/dist/utils/warn-untrusted-install-scripts.js.map +1 -1
- package/package.json +2 -2
- package/src/cli/index.ts +4 -0
- package/src/cli/install.ts +1 -0
- package/src/index.ts +1 -1
- package/src/package-manager/npm-package-manager.ts +89 -6
- package/src/package-manager/package-manager.ts +1 -0
- package/src/package-manager/pnpm-package-manager.ts +47 -1
- package/src/package-manager/utils/filter-trusted-scripts.ts +44 -0
- package/src/package-manager/utils/index.ts +2 -0
- package/src/package-manager/utils/resolve-allow-scripts.ts +0 -8
- package/src/package-manager/utils/resolve-min-release-age.ts +16 -0
- package/src/utils/audited-scripts.ts +92 -0
- package/src/utils/get-packages-with-install-scripts.ts +6 -10
- package/src/utils/index.ts +2 -0
- package/src/utils/version-compare.ts +34 -0
- package/src/utils/warn-untrusted-install-scripts.ts +26 -24
package/dist/cli/index.js
CHANGED
|
@@ -22,6 +22,9 @@ const args = function getArgs() {
|
|
|
22
22
|
'fix': {
|
|
23
23
|
type: 'boolean'
|
|
24
24
|
},
|
|
25
|
+
'no-min-release-age': {
|
|
26
|
+
type: 'boolean'
|
|
27
|
+
},
|
|
25
28
|
'quiet': {
|
|
26
29
|
type: 'boolean'
|
|
27
30
|
},
|
|
@@ -50,6 +53,9 @@ const args = function getArgs() {
|
|
|
50
53
|
case 'allow-all-scripts':
|
|
51
54
|
result.allowScripts = true;
|
|
52
55
|
break;
|
|
56
|
+
case 'no-min-release-age':
|
|
57
|
+
result.minReleaseAge = false;
|
|
58
|
+
break;
|
|
53
59
|
case 'no-token':
|
|
54
60
|
result.token = false;
|
|
55
61
|
break;
|
package/dist/cli/index.js.map
CHANGED
|
@@ -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 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;
|
|
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 'no-min-release-age': { 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-min-release-age':\n result.minReleaseAge = false;\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","minReleaseAge","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,sBAAsB;gBAAEA,MAAM;YAAU;YACxC,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,OAAOU,aAAa,GAAG;oBACvB;gBACJ,KAAK;oBACDV,OAAOE,KAAK,GAAG;oBACf;gBACJ;oBACIF,MAAM,CAACE,MAAME,IAAI,CAAC,GAAG;YAC7B;QACJ;IACJ;IAEA,OAAOJ;AACX;AAEAW,IAAAA,YAAK,EAAC,gBAAgB;IAAErB;AAAK;AAE7B,IAAIsB,gBAAO,CAACtB,MAAMuB,OAAO"}
|
package/dist/cli/install.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
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"}
|
|
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,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,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"}
|
package/dist/cli/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/install.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport 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":"AAAA,6BAA6B;;;;+
|
|
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 minReleaseAge?: false;\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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
export { PackageManager, getPackageManager } from './package-manager';
|
|
2
2
|
export type { DeclaredVersionQuery, ResolvedVersionQuery } from './package-manager';
|
|
3
|
-
export { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI } from './utils';
|
|
3
|
+
export { gitCloneRepo, gitIsReachable, isCI, npmWhoAmI, versionCompare } from './utils';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,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"}
|
|
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,cAAc,EAAE,MAAM,SAAS,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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;;;
|
|
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, versionCompare } from './utils';\n"],"names":["PackageManager","getPackageManager","gitCloneRepo","gitIsReachable","isCI","npmWhoAmI","versionCompare"],"mappings":";;;;;;;;;;;QAASA;eAAAA,8BAAc;;QAAEC;eAAAA,iCAAiB;;QAEjCC;eAAAA,mBAAY;;QAAEC;eAAAA,qBAAc;;QAAEC;eAAAA,WAAI;;QAAEC;eAAAA,gBAAS;;QAAEC;eAAAA,qBAAc;;;gCAFpB;uBAE4B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"npm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/npm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,
|
|
1
|
+
{"version":3,"file":"npm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/npm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAIH,UAAU,EAGb,MAAM,UAAU,CAAC;AAClB,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAcnD,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;IAgFlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAYlD;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,yBAAyB;IA4BjC,OAAO,CAAC,0BAA0B;IAmBlC,OAAO,CAAC,qBAAqB;CAOhC"}
|
|
@@ -28,6 +28,7 @@ function _interop_require_default(obj) {
|
|
|
28
28
|
default: obj
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
+
const MIN_NPM_VERSION_FOR_RELEASE_AGE = '11.10.0';
|
|
31
32
|
class NpmPackageManager extends _packagemanager.PackageManager {
|
|
32
33
|
clearCache() {
|
|
33
34
|
(0, _utils.runCommand)(this.command, [
|
|
@@ -54,8 +55,12 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
54
55
|
}
|
|
55
56
|
installPackages(args = {}, options) {
|
|
56
57
|
var _args_allowScripts;
|
|
57
|
-
const
|
|
58
|
+
const builtInIgnoredScripts = _utils.AUDITED_SCRIPTS.filter((script)=>script.action === 'ignore');
|
|
59
|
+
const builtInAllowedScripts = (0, _utils1.usesStartup)() ? _utils.AUDITED_SCRIPTS.filter((script)=>script.action === 'allow') : [];
|
|
60
|
+
const builtInAllowlist = builtInAllowedScripts.map((script)=>script.name);
|
|
58
61
|
const allowScripts = (0, _utils1.resolveAllowScripts)((_args_allowScripts = args.allowScripts) !== null && _args_allowScripts !== void 0 ? _args_allowScripts : [], builtInAllowlist);
|
|
62
|
+
const userAllowlist = Array.isArray(args.allowScripts) ? (0, _utils1.parseAllowScripts)(args.allowScripts) : [];
|
|
63
|
+
const minReleaseAgeFlags = this.resolveMinReleaseAgeFlags(args);
|
|
59
64
|
if (!args.quiet) {
|
|
60
65
|
(0, _utils1.logAllowedScripts)(allowScripts, builtInAllowlist);
|
|
61
66
|
}
|
|
@@ -67,6 +72,7 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
67
72
|
...allowScripts !== true ? [
|
|
68
73
|
'--ignore-scripts'
|
|
69
74
|
] : [],
|
|
75
|
+
...minReleaseAgeFlags,
|
|
70
76
|
...args.fix ? [
|
|
71
77
|
'--package-lock-only',
|
|
72
78
|
'--prefer-dedupe'
|
|
@@ -76,19 +82,30 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
76
82
|
if (args.fix) {
|
|
77
83
|
return;
|
|
78
84
|
}
|
|
85
|
+
let trusted;
|
|
86
|
+
if (Array.isArray(allowScripts)) {
|
|
87
|
+
try {
|
|
88
|
+
trusted = (0, _utils1.filterTrustedScripts)((0, _utils.getPackagesWithInstallScripts)(), builtInAllowedScripts, userAllowlist);
|
|
89
|
+
} catch (error) {
|
|
90
|
+
console.error(String(error));
|
|
91
|
+
console.error('Failed to determine trusted install scripts');
|
|
92
|
+
process.exitCode = 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
79
95
|
/*
|
|
80
96
|
* Rebuild applies when allowScripts is a non-empty explicit list:
|
|
81
97
|
* `true` means npm install already ran every script, `false`
|
|
82
98
|
* means the user opted out.
|
|
83
|
-
*/ if (
|
|
84
|
-
(0, _utils1.withProjectAllowScripts)(
|
|
99
|
+
*/ if (trusted && trusted.specs.length > 0) {
|
|
100
|
+
(0, _utils1.withProjectAllowScripts)(trusted.names, ()=>this.runRebuild(trusted.specs));
|
|
85
101
|
}
|
|
86
102
|
/*
|
|
87
103
|
* Warn against the effective allowlist so teams can see which
|
|
88
104
|
* scripts they should add to --allow-scripts. Skip when the user
|
|
89
105
|
* explicitly opted out (`false`); they made an informed choice.
|
|
90
106
|
*/ if (allowScripts !== false) {
|
|
91
|
-
|
|
107
|
+
var _ref;
|
|
108
|
+
(0, _utils.warnUntrustedInstallScripts)((_ref = trusted === null || trusted === void 0 ? void 0 : trusted.specs) !== null && _ref !== void 0 ? _ref : builtInAllowlist, builtInIgnoredScripts);
|
|
92
109
|
}
|
|
93
110
|
/*
|
|
94
111
|
* When allowScripts is `true`, npm already ran project postinstall.
|
|
@@ -147,6 +164,48 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
147
164
|
process.exitCode = 1;
|
|
148
165
|
}
|
|
149
166
|
}
|
|
167
|
+
resolveMinReleaseAgeFlags(args) {
|
|
168
|
+
if (args.fix) {
|
|
169
|
+
return [];
|
|
170
|
+
}
|
|
171
|
+
const resolved = (0, _utils1.resolveMinReleaseAge)(args.minReleaseAge);
|
|
172
|
+
if (!resolved) {
|
|
173
|
+
return [];
|
|
174
|
+
}
|
|
175
|
+
const version = (0, _utils.runCommand)(this.command, [
|
|
176
|
+
'--version'
|
|
177
|
+
]).trim();
|
|
178
|
+
if ((0, _utils.versionCompare)(version, MIN_NPM_VERSION_FOR_RELEASE_AGE) < 0) {
|
|
179
|
+
console.warn(`WARNING: npm ${version} does not support minimum release age protection. Installing without it.`);
|
|
180
|
+
return [];
|
|
181
|
+
}
|
|
182
|
+
if (this.hasConfiguredMinReleaseAge()) {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
return [
|
|
186
|
+
`--min-release-age=${resolved.days}`,
|
|
187
|
+
...resolved.exclude.map((pattern)=>`--min-release-age-exclude=${pattern}`)
|
|
188
|
+
];
|
|
189
|
+
}
|
|
190
|
+
hasConfiguredMinReleaseAge() {
|
|
191
|
+
try {
|
|
192
|
+
const config = JSON.parse((0, _utils.runCommand)(this.command, [
|
|
193
|
+
'config',
|
|
194
|
+
'list',
|
|
195
|
+
'--json'
|
|
196
|
+
]));
|
|
197
|
+
if (Number(config['min-release-age']) > 0) {
|
|
198
|
+
return true;
|
|
199
|
+
}
|
|
200
|
+
/*
|
|
201
|
+
* On npm >=11.10.0 <11.14.0, min-release-age is flattened into an
|
|
202
|
+
* absolute `before` cutoff date and removed from the config, so
|
|
203
|
+
* fall back to checking that cutoff instead.
|
|
204
|
+
*/ return typeof config.before === 'string' && new Date(config.before).getTime() < Date.now();
|
|
205
|
+
} catch (unused) {
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
150
209
|
runProjectPostinstall(options) {
|
|
151
210
|
try {
|
|
152
211
|
(0, _utils.runCommand)(this.command, [
|
|
@@ -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 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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"}
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/npm-package-manager.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport {\n AUDITED_SCRIPTS,\n getPackagesWithInstallScripts,\n isCI,\n runCommand,\n versionCompare,\n warnUntrustedInstallScripts,\n} from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\nimport type { TrustedScripts } from './utils';\nimport {\n filterTrustedScripts,\n logAllowedScripts,\n parseAllowScripts,\n resolveAllowScripts,\n resolveMinReleaseAge,\n usesStartup,\n withProjectAllowScripts,\n} from './utils';\n\nconst MIN_NPM_VERSION_FOR_RELEASE_AGE = '11.10.0';\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 builtInIgnoredScripts = AUDITED_SCRIPTS.filter(script => script.action === 'ignore');\n const builtInAllowedScripts = usesStartup()\n ? AUDITED_SCRIPTS.filter(script => script.action === 'allow')\n : [];\n const builtInAllowlist = builtInAllowedScripts.map(script => script.name);\n const allowScripts = resolveAllowScripts(args.allowScripts ?? [], builtInAllowlist);\n const userAllowlist = Array.isArray(args.allowScripts)\n ? parseAllowScripts(args.allowScripts)\n : [];\n const minReleaseAgeFlags = this.resolveMinReleaseAgeFlags(args);\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 ...minReleaseAgeFlags,\n ...(args.fix ? ['--package-lock-only', '--prefer-dedupe'] : []),\n ],\n options\n );\n\n try {\n if (args.fix) {\n return;\n }\n let trusted: TrustedScripts | undefined;\n if (Array.isArray(allowScripts)) {\n try {\n trusted = filterTrustedScripts(\n getPackagesWithInstallScripts(),\n builtInAllowedScripts,\n userAllowlist\n );\n } catch (error) {\n console.error(String(error));\n console.error('Failed to determine trusted install scripts');\n process.exitCode = 1;\n }\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 (trusted && trusted.specs.length > 0) {\n withProjectAllowScripts(trusted.names, () => this.runRebuild(trusted.specs));\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 trusted?.specs ?? builtInAllowlist,\n builtInIgnoredScripts\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 resolveMinReleaseAgeFlags(args: InstallArgs): string[] {\n if (args.fix) {\n return [];\n }\n\n const resolved = resolveMinReleaseAge(args.minReleaseAge);\n if (!resolved) {\n return [];\n }\n\n const version = runCommand(this.command, ['--version']).trim();\n if (versionCompare(version, MIN_NPM_VERSION_FOR_RELEASE_AGE) < 0) {\n console.warn(\n `WARNING: npm ${version} does not support minimum release age protection. Installing without it.`\n );\n return [];\n }\n\n if (this.hasConfiguredMinReleaseAge()) {\n return [];\n }\n\n return [\n `--min-release-age=${resolved.days}`,\n ...resolved.exclude.map(pattern => `--min-release-age-exclude=${pattern}`),\n ];\n }\n\n private hasConfiguredMinReleaseAge(): boolean {\n try {\n const config = JSON.parse(runCommand(this.command, ['config', 'list', '--json']));\n if (Number(config['min-release-age']) > 0) {\n return true;\n }\n /*\n * On npm >=11.10.0 <11.14.0, min-release-age is flattened into an\n * absolute `before` cutoff date and removed from the config, so\n * fall back to checking that cutoff instead.\n */\n return (\n typeof config.before === 'string' && new Date(config.before).getTime() < Date.now()\n );\n } catch {\n return false;\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","MIN_NPM_VERSION_FOR_RELEASE_AGE","PackageManager","clearCache","runCommand","command","getDeclaredVersion","workspacePackage","declaredBy","dependency","entry","findEntry","package","dependencies","peerDependencies","getResolvedVersion","version","installPackages","args","options","builtInIgnoredScripts","AUDITED_SCRIPTS","filter","script","action","builtInAllowedScripts","usesStartup","builtInAllowlist","map","name","allowScripts","resolveAllowScripts","userAllowlist","Array","isArray","parseAllowScripts","minReleaseAgeFlags","resolveMinReleaseAgeFlags","quiet","logAllowedScripts","isCI","fix","trusted","filterTrustedScripts","getPackagesWithInstallScripts","error","console","String","process","exitCode","specs","length","withProjectAllowScripts","names","runRebuild","warnUntrustedInstallScripts","runProjectPostinstall","reset","parseLockFile","lockFilePath","getLockFilePath","undefined","JSON","parse","fs","readFileSync","packageName","packages","getLockFile","link","resolved","scripts","stdio","join","resolveMinReleaseAge","minReleaseAge","trim","versionCompare","warn","hasConfiguredMinReleaseAge","days","exclude","pattern","config","Number","before","Date","getTime","now","lockFileName"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9C,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;IAOvC,gBAAgB,IAAI,OAAO;IAI3B,eAAe,IAAI,MAAM,GAAG,SAAS;IAWrC;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,SAAgB,GAAG,MAAM;IAYvD,SAAS,CAAC,WAAW,IAAI,QAAQ,GAAG,SAAS;IAQ7C,SAAS,CAAC,KAAK;IAOf,SAAS,KAAK,oBAAoB,IAAI,MAAM,CAE3C;IAED,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"}
|
|
1
|
+
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAU,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9C,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,aAAa,CAAC,EAAE,KAAK,CAAC;IACtB,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;IAOvC,gBAAgB,IAAI,OAAO;IAI3B,eAAe,IAAI,MAAM,GAAG,SAAS;IAWrC;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,SAAgB,GAAG,MAAM;IAYvD,SAAS,CAAC,WAAW,IAAI,QAAQ,GAAG,SAAS;IAQ7C,SAAS,CAAC,KAAK;IAOf,SAAS,KAAK,oBAAoB,IAAI,MAAM,CAE3C;IAED,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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/package-manager/package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'node:path';\nimport { findUp, runCommand } from '../utils';\n\nexport type AllowScripts = true | false | string[];\n\nexport interface InstallArgs {\n allowScripts?: AllowScripts;\n fix?: boolean;\n quiet?: 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 #lockFilePath: string | undefined;\n #lockFilePathLoaded = false;\n\n hasValidLockFile(): boolean {\n return this.getLockFile() !== undefined;\n }\n\n getLockFilePath(): string | undefined {\n if (!this.#lockFilePathLoaded) {\n this.#lockFilePath = findUp(directory => {\n const candidate = path.join(directory, this.lockFileName);\n return fs.existsSync(candidate) ? candidate : undefined;\n });\n this.#lockFilePathLoaded = true;\n }\n return this.#lockFilePath;\n }\n\n /**\n * Returns the lockfile key for a package given its absolute or\n * cwd-relative directory. Both npm and pnpm key their lockfile entries\n * by the package's path relative to the workspace root.\n */\n getWorkspacePackage(packageDir = process.cwd()): string {\n const lockFilePath = this.getLockFilePath();\n if (!lockFilePath) {\n return this.rootWorkspacePackage;\n }\n const relative = path\n .relative(path.dirname(lockFilePath), path.resolve(packageDir))\n .split(path.sep)\n .join('/');\n return relative === '' ? this.rootWorkspacePackage : relative;\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 this.#lockFilePath = undefined;\n this.#lockFilePathLoaded = false;\n }\n\n protected get rootWorkspacePackage(): string {\n return '';\n }\n\n abstract clearCache(): void;\n abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;\n abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;\n abstract installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;\n\n protected abstract parseLockFile(): LockFile | undefined;\n}\n"],"names":["PackageManager","hasValidLockFile","getLockFile","undefined","getLockFilePath","findUp","directory","candidate","path","join","lockFileName","fs","existsSync","getWorkspacePackage","packageDir","process","cwd","lockFilePath","rootWorkspacePackage","relative","dirname","resolve","split","sep","parseLockFile","reset"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'node:path';\nimport { findUp, runCommand } from '../utils';\n\nexport type AllowScripts = true | false | string[];\n\nexport interface InstallArgs {\n allowScripts?: AllowScripts;\n fix?: boolean;\n minReleaseAge?: false;\n quiet?: 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 #lockFilePath: string | undefined;\n #lockFilePathLoaded = false;\n\n hasValidLockFile(): boolean {\n return this.getLockFile() !== undefined;\n }\n\n getLockFilePath(): string | undefined {\n if (!this.#lockFilePathLoaded) {\n this.#lockFilePath = findUp(directory => {\n const candidate = path.join(directory, this.lockFileName);\n return fs.existsSync(candidate) ? candidate : undefined;\n });\n this.#lockFilePathLoaded = true;\n }\n return this.#lockFilePath;\n }\n\n /**\n * Returns the lockfile key for a package given its absolute or\n * cwd-relative directory. Both npm and pnpm key their lockfile entries\n * by the package's path relative to the workspace root.\n */\n getWorkspacePackage(packageDir = process.cwd()): string {\n const lockFilePath = this.getLockFilePath();\n if (!lockFilePath) {\n return this.rootWorkspacePackage;\n }\n const relative = path\n .relative(path.dirname(lockFilePath), path.resolve(packageDir))\n .split(path.sep)\n .join('/');\n return relative === '' ? this.rootWorkspacePackage : relative;\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 this.#lockFilePath = undefined;\n this.#lockFilePathLoaded = false;\n }\n\n protected get rootWorkspacePackage(): string {\n return '';\n }\n\n abstract clearCache(): void;\n abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;\n abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;\n abstract installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;\n\n protected abstract parseLockFile(): LockFile | undefined;\n}\n"],"names":["PackageManager","hasValidLockFile","getLockFile","undefined","getLockFilePath","findUp","directory","candidate","path","join","lockFileName","fs","existsSync","getWorkspacePackage","packageDir","process","cwd","lockFilePath","rootWorkspacePackage","relative","dirname","resolve","split","sep","parseLockFile","reset"],"mappings":";;;;+BAwBsBA;;;eAAAA;;;2DAxBP;iEACE;uBACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA0B/B,yCACA,+CACA,6CACA;AAPG,MAAeA;IASlBC,mBAA4B;QACxB,OAAO,IAAI,CAACC,WAAW,OAAOC;IAClC;IAEAC,kBAAsC;QAClC,IAAI,0BAAC,IAAI,EAAC,sBAAqB;2CACtB,eAAgBC,IAAAA,aAAM,EAACC,CAAAA;gBACxB,MAAMC,YAAYC,iBAAI,CAACC,IAAI,CAACH,WAAW,IAAI,CAACI,YAAY;gBACxD,OAAOC,WAAE,CAACC,UAAU,CAACL,aAAaA,YAAYJ;YAClD;2CACK,qBAAsB;QAC/B;QACA,gCAAO,IAAI,EAAC;IAChB;IAEA;;;;KAIC,GACDU,oBAAoBC,aAAaC,QAAQC,GAAG,EAAE,EAAU;QACpD,MAAMC,eAAe,IAAI,CAACb,eAAe;QACzC,IAAI,CAACa,cAAc;YACf,OAAO,IAAI,CAACC,oBAAoB;QACpC;QACA,MAAMC,WAAWX,iBAAI,CAChBW,QAAQ,CAACX,iBAAI,CAACY,OAAO,CAACH,eAAeT,iBAAI,CAACa,OAAO,CAACP,aAClDQ,KAAK,CAACd,iBAAI,CAACe,GAAG,EACdd,IAAI,CAAC;QACV,OAAOU,aAAa,KAAK,IAAI,CAACD,oBAAoB,GAAGC;IACzD;IAEUjB,cAAoC;QAC1C,IAAI,0BAAC,IAAI,EAAC,kBAAiB;2CAClB,WAAY,IAAI,CAACsB,aAAa;2CAC9B,iBAAkB;QAC3B;QACA,gCAAO,IAAI,EAAC;IAChB;IAEUC,QAAQ;uCACT,WAAYtB;uCACZ,iBAAkB;uCAClB,eAAgBA;uCAChB,qBAAsB;IAC/B;IAEA,IAAce,uBAA+B;QACzC,OAAO;IACX;;QAtDA,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAkB;;QAClB,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAsB;;;AA2D1B"}
|
|
@@ -28,6 +28,8 @@ export declare class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
|
28
28
|
installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;
|
|
29
29
|
protected parseLockFile(): PnpmLockFile | undefined;
|
|
30
30
|
private resolveVersion;
|
|
31
|
+
private warnIfMinReleaseAgeNotConfigured;
|
|
32
|
+
private hasConfiguredMinReleaseAge;
|
|
31
33
|
}
|
|
32
34
|
export {};
|
|
33
35
|
//# sourceMappingURL=pnpm-package-manager.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/pnpm-package-manager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"pnpm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/pnpm-package-manager.ts"],"names":[],"mappings":"AAEA,OAAO,EAAQ,UAAU,EAAkB,MAAM,UAAU,CAAC;AAC5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAKnD,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,cAAuB,oBAAoB,IAAI,MAAM,CAEpD;IAED,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,eAAe,CAAC,IAAI,GAAE,WAAgB,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAkBlF,SAAS,CAAC,aAAa,IAAI,YAAY,GAAG,SAAS;IAiBnD,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gCAAgC;IA8BxC,OAAO,CAAC,0BAA0B;CASrC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
/* eslint-disable no-console */ "use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
@@ -11,6 +11,7 @@ Object.defineProperty(exports, "PnpmPackageManager", {
|
|
|
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, {
|
|
@@ -27,6 +28,7 @@ function _interop_require_default(obj) {
|
|
|
27
28
|
default: obj
|
|
28
29
|
};
|
|
29
30
|
}
|
|
31
|
+
const MIN_PNPM_VERSION_FOR_RELEASE_AGE = '10.16.0';
|
|
30
32
|
class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
31
33
|
get rootWorkspacePackage() {
|
|
32
34
|
return '.';
|
|
@@ -51,6 +53,7 @@ class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
|
51
53
|
return this.resolveVersion(workspacePackage, dependency);
|
|
52
54
|
}
|
|
53
55
|
installPackages(args = {}, options) {
|
|
56
|
+
this.warnIfMinReleaseAgeNotConfigured(args);
|
|
54
57
|
try {
|
|
55
58
|
(0, _utils.runCommand)(this.command, [
|
|
56
59
|
'install',
|
|
@@ -87,6 +90,42 @@ class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
|
87
90
|
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];
|
|
88
91
|
return entry ? stripPeerDependencySuffix(entry.version) : undefined;
|
|
89
92
|
}
|
|
93
|
+
warnIfMinReleaseAgeNotConfigured(args) {
|
|
94
|
+
if (args.fix) {
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
if (!(0, _utils1.resolveMinReleaseAge)(args.minReleaseAge)) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const version = (0, _utils.runCommand)(this.command, [
|
|
101
|
+
'--version'
|
|
102
|
+
]).trim();
|
|
103
|
+
if ((0, _utils.versionCompare)(version, MIN_PNPM_VERSION_FOR_RELEASE_AGE) < 0) {
|
|
104
|
+
console.warn(`WARNING: pnpm ${version} does not support minimum release age protection. Installing without it.`);
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
if (this.hasConfiguredMinReleaseAge()) {
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
console.warn('WARNING: this project does not enforce a minimum release age for pnpm installs. Configure minimumReleaseAge in pnpm-workspace.yaml.');
|
|
111
|
+
}
|
|
112
|
+
/*
|
|
113
|
+
* `pnpm config list --json` reports this key as `minimum-release-age` on
|
|
114
|
+
* pnpm <11 and `minimumReleaseAge` on pnpm >=11, so both are checked.
|
|
115
|
+
*/ hasConfiguredMinReleaseAge() {
|
|
116
|
+
try {
|
|
117
|
+
var _config_minimumReleaseAge;
|
|
118
|
+
const config = JSON.parse((0, _utils.runCommand)(this.command, [
|
|
119
|
+
'config',
|
|
120
|
+
'list',
|
|
121
|
+
'--json'
|
|
122
|
+
]));
|
|
123
|
+
const configuredAge = (_config_minimumReleaseAge = config.minimumReleaseAge) !== null && _config_minimumReleaseAge !== void 0 ? _config_minimumReleaseAge : config['minimum-release-age'];
|
|
124
|
+
return Number(configuredAge) > 0;
|
|
125
|
+
} catch (unused) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
90
129
|
constructor(...args){
|
|
91
130
|
super(...args), _define_property(this, "command", 'pnpm'), _define_property(this, "lockFileName", 'pnpm-lock.yaml');
|
|
92
131
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/package-manager/pnpm-package-manager.ts"],"sourcesContent":["
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/pnpm-package-manager.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport { isCI, runCommand, versionCompare } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\nimport { resolveMinReleaseAge } from './utils';\n\nconst MIN_PNPM_VERSION_FOR_RELEASE_AGE = '10.16.0';\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 protected override get rootWorkspacePackage(): string {\n return '.';\n }\n\n clearCache() {\n runCommand(this.command, ['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 installPackages(args: InstallArgs = {}, options?: Parameters<typeof runCommand>[2]) {\n this.warnIfMinReleaseAgeNotConfigured(args);\n\n try {\n runCommand(\n this.command,\n [\n 'install',\n ...(isCI() ? ['--frozen-lockfile'] : []),\n ...(args.fix ? ['--lockfile-only'] : []),\n ],\n options\n );\n } finally {\n this.reset();\n }\n }\n\n protected parseLockFile(): PnpmLockFile | undefined {\n const lockFilePath = this.getLockFilePath();\n if (!lockFilePath) {\n return undefined;\n }\n /*\n * js-yaml is an optional peer; let MODULE_NOT_FOUND surface so a caller\n * missing the dep gets a clear error instead of silent `undefined`.\n */\n const yaml = require('js-yaml');\n try {\n return yaml.load(fs.readFileSync(lockFilePath, '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 private warnIfMinReleaseAgeNotConfigured(args: InstallArgs) {\n if (args.fix) {\n return;\n }\n\n if (!resolveMinReleaseAge(args.minReleaseAge)) {\n return;\n }\n\n const version = runCommand(this.command, ['--version']).trim();\n if (versionCompare(version, MIN_PNPM_VERSION_FOR_RELEASE_AGE) < 0) {\n console.warn(\n `WARNING: pnpm ${version} does not support minimum release age protection. Installing without it.`\n );\n return;\n }\n\n if (this.hasConfiguredMinReleaseAge()) {\n return;\n }\n\n console.warn(\n 'WARNING: this project does not enforce a minimum release age for pnpm installs. Configure minimumReleaseAge in pnpm-workspace.yaml.'\n );\n }\n\n /*\n * `pnpm config list --json` reports this key as `minimum-release-age` on\n * pnpm <11 and `minimumReleaseAge` on pnpm >=11, so both are checked.\n */\n private hasConfiguredMinReleaseAge(): boolean {\n try {\n const config = JSON.parse(runCommand(this.command, ['config', 'list', '--json']));\n const configuredAge = config.minimumReleaseAge ?? config['minimum-release-age'];\n return Number(configuredAge) > 0;\n } catch {\n return false;\n }\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","MIN_PNPM_VERSION_FOR_RELEASE_AGE","PackageManager","rootWorkspacePackage","clearCache","runCommand","command","getDeclaredVersion","workspacePackage","declaredBy","dependency","snapshot","declaredByVersion","resolveVersion","undefined","getLockFile","snapshots","dependencies","peerDependencies","getResolvedVersion","installPackages","args","options","warnIfMinReleaseAgeNotConfigured","isCI","fix","reset","parseLockFile","lockFilePath","getLockFilePath","yaml","require","load","fs","readFileSync","importer","importers","entry","devDependencies","optionalDependencies","stripPeerDependencySuffix","version","resolveMinReleaseAge","minReleaseAge","trim","versionCompare","console","warn","hasConfiguredMinReleaseAge","config","JSON","parse","configuredAge","minimumReleaseAge","Number","lockFileName","split"],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AuditedScript } from '../../utils';
|
|
2
|
+
export interface InstallScript {
|
|
3
|
+
name: string;
|
|
4
|
+
version: string;
|
|
5
|
+
}
|
|
6
|
+
export interface TrustedScripts {
|
|
7
|
+
/** Trusted package name or <name>@<version> */
|
|
8
|
+
specs: string[];
|
|
9
|
+
/** Bare names for all trusted packages */
|
|
10
|
+
names: string[];
|
|
11
|
+
}
|
|
12
|
+
export declare function filterTrustedScripts(installScripts: InstallScript[], builtInAllowlist: AuditedScript[], userAllowlist: string[]): TrustedScripts;
|
|
13
|
+
//# sourceMappingURL=filter-trusted-scripts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter-trusted-scripts.d.ts","sourceRoot":"","sources":["../../../src/package-manager/utils/filter-trusted-scripts.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,MAAM,WAAW,aAAa;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,+CAA+C;IAC/C,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,0CAA0C;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,wBAAgB,oBAAoB,CAChC,cAAc,EAAE,aAAa,EAAE,EAC/B,gBAAgB,EAAE,aAAa,EAAE,EACjC,aAAa,EAAE,MAAM,EAAE,GACxB,cAAc,CAwBhB"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
Object.defineProperty(exports, "filterTrustedScripts", {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: function() {
|
|
8
|
+
return filterTrustedScripts;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
const _utils = require("../../utils");
|
|
12
|
+
function filterTrustedScripts(installScripts, builtInAllowlist, userAllowlist) {
|
|
13
|
+
const specs = new Set();
|
|
14
|
+
const names = new Set();
|
|
15
|
+
for (const { name, version } of installScripts){
|
|
16
|
+
const allowlistEntry = builtInAllowlist.find((entry)=>entry.name === name);
|
|
17
|
+
if (!allowlistEntry) {
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
if (!allowlistEntry.maximumVersion) {
|
|
21
|
+
specs.add(name);
|
|
22
|
+
names.add(name);
|
|
23
|
+
} else if ((0, _utils.versionCompare)(version, allowlistEntry.maximumVersion) <= 0) {
|
|
24
|
+
specs.add(`${name}@${version}`);
|
|
25
|
+
names.add(name);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
for (const name of userAllowlist){
|
|
29
|
+
specs.add(name);
|
|
30
|
+
names.add(name);
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
specs: [
|
|
34
|
+
...specs
|
|
35
|
+
],
|
|
36
|
+
names: [
|
|
37
|
+
...names
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=filter-trusted-scripts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/package-manager/utils/filter-trusted-scripts.ts"],"sourcesContent":["import type { AuditedScript } from '../../utils';\nimport { versionCompare } from '../../utils';\n\nexport interface InstallScript {\n name: string;\n version: string;\n}\n\nexport interface TrustedScripts {\n /** Trusted package name or <name>@<version> */\n specs: string[];\n /** Bare names for all trusted packages */\n names: string[];\n}\n\nexport function filterTrustedScripts(\n installScripts: InstallScript[],\n builtInAllowlist: AuditedScript[],\n userAllowlist: string[]\n): TrustedScripts {\n const specs = new Set<string>();\n const names = new Set<string>();\n\n for (const { name, version } of installScripts) {\n const allowlistEntry = builtInAllowlist.find(entry => entry.name === name);\n if (!allowlistEntry) {\n continue;\n }\n if (!allowlistEntry.maximumVersion) {\n specs.add(name);\n names.add(name);\n } else if (versionCompare(version, allowlistEntry.maximumVersion) <= 0) {\n specs.add(`${name}@${version}`);\n names.add(name);\n }\n }\n\n for (const name of userAllowlist) {\n specs.add(name);\n names.add(name);\n }\n\n return { specs: [...specs], names: [...names] };\n}\n"],"names":["filterTrustedScripts","installScripts","builtInAllowlist","userAllowlist","specs","Set","names","name","version","allowlistEntry","find","entry","maximumVersion","add","versionCompare"],"mappings":";;;;+BAegBA;;;eAAAA;;;uBAde;AAcxB,SAASA,qBACZC,cAA+B,EAC/BC,gBAAiC,EACjCC,aAAuB;IAEvB,MAAMC,QAAQ,IAAIC;IAClB,MAAMC,QAAQ,IAAID;IAElB,KAAK,MAAM,EAAEE,IAAI,EAAEC,OAAO,EAAE,IAAIP,eAAgB;QAC5C,MAAMQ,iBAAiBP,iBAAiBQ,IAAI,CAACC,CAAAA,QAASA,MAAMJ,IAAI,KAAKA;QACrE,IAAI,CAACE,gBAAgB;YACjB;QACJ;QACA,IAAI,CAACA,eAAeG,cAAc,EAAE;YAChCR,MAAMS,GAAG,CAACN;YACVD,MAAMO,GAAG,CAACN;QACd,OAAO,IAAIO,IAAAA,qBAAc,EAACN,SAASC,eAAeG,cAAc,KAAK,GAAG;YACpER,MAAMS,GAAG,CAAC,GAAGN,KAAK,CAAC,EAAEC,SAAS;YAC9BF,MAAMO,GAAG,CAACN;QACd;IACJ;IAEA,KAAK,MAAMA,QAAQJ,cAAe;QAC9BC,MAAMS,GAAG,CAACN;QACVD,MAAMO,GAAG,CAACN;IACd;IAEA,OAAO;QAAEH,OAAO;eAAIA;SAAM;QAAEE,OAAO;eAAIA;SAAM;IAAC;AAClD"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
export * from './filter-trusted-scripts';
|
|
1
2
|
export * from './log-allowed-scripts';
|
|
2
3
|
export * from './parse-allow-scripts';
|
|
3
4
|
export * from './resolve-allow-scripts';
|
|
5
|
+
export * from './resolve-min-release-age';
|
|
4
6
|
export * from './uses-startup';
|
|
5
7
|
export * from './with-project-allow-scripts';
|
|
6
8
|
//# 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;AAC/B,cAAc,8BAA8B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/package-manager/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,uBAAuB,CAAC;AACtC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC"}
|
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", {
|
|
3
3
|
value: true
|
|
4
4
|
});
|
|
5
|
+
_export_star(require("./filter-trusted-scripts"), exports);
|
|
5
6
|
_export_star(require("./log-allowed-scripts"), exports);
|
|
6
7
|
_export_star(require("./parse-allow-scripts"), exports);
|
|
7
8
|
_export_star(require("./resolve-allow-scripts"), exports);
|
|
9
|
+
_export_star(require("./resolve-min-release-age"), exports);
|
|
8
10
|
_export_star(require("./uses-startup"), exports);
|
|
9
11
|
_export_star(require("./with-project-allow-scripts"), exports);
|
|
10
12
|
function _export_star(from, to) {
|
|
@@ -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';\nexport * from './with-project-allow-scripts';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA"}
|
|
1
|
+
{"version":3,"sources":["../../../src/package-manager/utils/index.ts"],"sourcesContent":["export * from './filter-trusted-scripts';\nexport * from './log-allowed-scripts';\nexport * from './parse-allow-scripts';\nexport * from './resolve-allow-scripts';\nexport * from './resolve-min-release-age';\nexport * from './uses-startup';\nexport * from './with-project-allow-scripts';\n"],"names":[],"mappings":";;;;qBAAc;qBACA;qBACA;qBACA;qBACA;qBACA;qBACA"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
1
|
import type { AllowScripts } from '../package-manager';
|
|
2
|
-
export declare const DEFAULT_ALLOWED_SCRIPTS: string[];
|
|
3
2
|
export declare function resolveAllowScripts(value: AllowScripts, builtInAllowlist: string[]): AllowScripts;
|
|
4
3
|
//# sourceMappingURL=resolve-allow-scripts.d.ts.map
|