@servicetitan/install 36.3.0 → 36.3.1
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/package-manager/npm-package-manager.d.ts +4 -0
- package/dist/package-manager/npm-package-manager.d.ts.map +1 -1
- package/dist/package-manager/npm-package-manager.js +16 -6
- package/dist/package-manager/npm-package-manager.js.map +1 -1
- package/dist/package-manager/package-manager.d.ts +8 -0
- package/dist/package-manager/package-manager.d.ts.map +1 -1
- package/dist/package-manager/package-manager.js +29 -0
- package/dist/package-manager/package-manager.js.map +1 -1
- package/dist/package-manager/pnpm-package-manager.d.ts +1 -0
- package/dist/package-manager/pnpm-package-manager.d.ts.map +1 -1
- package/dist/package-manager/pnpm-package-manager.js +10 -3
- package/dist/package-manager/pnpm-package-manager.js.map +1 -1
- package/package.json +2 -2
- package/src/package-manager/npm-package-manager.ts +19 -8
- package/src/package-manager/package-manager.ts +31 -1
- package/src/package-manager/pnpm-package-manager.ts +11 -3
|
@@ -3,6 +3,8 @@ import type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './
|
|
|
3
3
|
import { PackageManager } from './package-manager';
|
|
4
4
|
interface NpmLockFileEntry {
|
|
5
5
|
version?: string;
|
|
6
|
+
resolved?: string;
|
|
7
|
+
link?: boolean;
|
|
6
8
|
dependencies?: Record<string, string>;
|
|
7
9
|
peerDependencies?: Record<string, string>;
|
|
8
10
|
}
|
|
@@ -22,6 +24,8 @@ export declare class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
22
24
|
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
23
25
|
* path from the repo root; the empty string `''` denotes the root
|
|
24
26
|
* workspace package itself, matching npm's own lockfile key convention.
|
|
27
|
+
* Follows link entries to the resolved workspace package, so callers see
|
|
28
|
+
* the workspace package's own metadata rather than the symlink stub.
|
|
25
29
|
*/
|
|
26
30
|
private findEntry;
|
|
27
31
|
private runRebuild;
|
|
@@ -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,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,WAAW;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC;CAC/C;AAED,qBAAa,iBAAkB,SAAQ,cAAc,CAAC,WAAW,CAAC;IAC9D,QAAQ,CAAC,OAAO,SAAS;IACzB,QAAQ,CAAC,YAAY,uBAAuB;IAE5C,UAAU;IAIV,kBAAkB,CAAC,EACf,gBAAgB,EAChB,UAAU,EACV,UAAU,GACb,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAK5C,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAI9F,eAAe,CAAC,IAAI,GAAE,WAAgB,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IA6DlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;
|
|
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;IA6DlF,SAAS,CAAC,aAAa,IAAI,WAAW,GAAG,SAAS;IAYlD;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,qBAAqB;CAOhC"}
|
|
@@ -32,7 +32,7 @@ function _interop_require_default(obj) {
|
|
|
32
32
|
}
|
|
33
33
|
class NpmPackageManager extends _packagemanager.PackageManager {
|
|
34
34
|
clearCache() {
|
|
35
|
-
(0, _utils.runCommand)(
|
|
35
|
+
(0, _utils.runCommand)(this.command, [
|
|
36
36
|
'cache',
|
|
37
37
|
'clear',
|
|
38
38
|
'--force'
|
|
@@ -63,7 +63,7 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
63
63
|
if (!args.quiet) {
|
|
64
64
|
(0, _utils1.logAllowedScripts)(allowScripts);
|
|
65
65
|
}
|
|
66
|
-
(0, _utils.runCommand)(
|
|
66
|
+
(0, _utils.runCommand)(this.command, [
|
|
67
67
|
(0, _utils.isCI)() ? 'ci' : 'i',
|
|
68
68
|
'--audit=false',
|
|
69
69
|
'--fund=false',
|
|
@@ -108,8 +108,12 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
108
108
|
}
|
|
109
109
|
}
|
|
110
110
|
parseLockFile() {
|
|
111
|
+
const lockFilePath = this.findLockFilePath();
|
|
112
|
+
if (!lockFilePath) {
|
|
113
|
+
return undefined;
|
|
114
|
+
}
|
|
111
115
|
try {
|
|
112
|
-
return JSON.parse(_fs.default.readFileSync(
|
|
116
|
+
return JSON.parse(_fs.default.readFileSync(lockFilePath, 'utf-8'));
|
|
113
117
|
} catch (unused) {
|
|
114
118
|
return undefined;
|
|
115
119
|
}
|
|
@@ -119,15 +123,21 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
119
123
|
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
120
124
|
* path from the repo root; the empty string `''` denotes the root
|
|
121
125
|
* workspace package itself, matching npm's own lockfile key convention.
|
|
126
|
+
* Follows link entries to the resolved workspace package, so callers see
|
|
127
|
+
* the workspace package's own metadata rather than the symlink stub.
|
|
122
128
|
*/ findEntry({ workspacePackage, package: packageName }) {
|
|
123
129
|
var _ref;
|
|
124
130
|
var _this_getLockFile;
|
|
125
131
|
const packages = (_this_getLockFile = this.getLockFile()) === null || _this_getLockFile === void 0 ? void 0 : _this_getLockFile.packages;
|
|
126
|
-
|
|
132
|
+
const entry = (_ref = packages === null || packages === void 0 ? void 0 : packages[`${workspacePackage}/node_modules/${packageName}`]) !== null && _ref !== void 0 ? _ref : packages === null || packages === void 0 ? void 0 : packages[`node_modules/${packageName}`];
|
|
133
|
+
if ((entry === null || entry === void 0 ? void 0 : entry.link) && entry.resolved) {
|
|
134
|
+
return packages === null || packages === void 0 ? void 0 : packages[entry.resolved];
|
|
135
|
+
}
|
|
136
|
+
return entry;
|
|
127
137
|
}
|
|
128
138
|
runRebuild(scripts) {
|
|
129
139
|
try {
|
|
130
|
-
(0, _utils.runCommand)(
|
|
140
|
+
(0, _utils.runCommand)(this.command, [
|
|
131
141
|
'rebuild',
|
|
132
142
|
...scripts
|
|
133
143
|
]);
|
|
@@ -138,7 +148,7 @@ class NpmPackageManager extends _packagemanager.PackageManager {
|
|
|
138
148
|
}
|
|
139
149
|
runProjectPostinstall(options) {
|
|
140
150
|
try {
|
|
141
|
-
(0, _utils.runCommand)(
|
|
151
|
+
(0, _utils.runCommand)(this.command, [
|
|
142
152
|
'run',
|
|
143
153
|
'postinstall',
|
|
144
154
|
'--if-present'
|
|
@@ -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 shouldIgnoreScripts,\n} from './utils';\n\ninterface NpmLockFileEntry {\n version?: string;\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface NpmLockFile {\n packages?: Record<string, NpmLockFileEntry>;\n}\n\nexport class NpmPackageManager extends PackageManager<NpmLockFile> {\n readonly command = 'npm';\n readonly lockFileName = 'package-lock.json';\n\n clearCache() {\n runCommand(
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/npm-package-manager.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport fs from 'fs';\nimport { isCI, runCommand, warnUntrustedInstallScripts } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\nimport {\n DEFAULT_ALLOWED_SCRIPTS,\n logAllowedScripts,\n resolveAllowScripts,\n shouldIgnoreScripts,\n} from './utils';\n\ninterface NpmLockFileEntry {\n version?: string;\n 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 /*\n * The `true` fallback allows projects a grace period to identify and\n * allowlist trusted scripts. Remove the fallback when the grace period expires.\n */\n const allowScripts = resolveAllowScripts(args.allowScripts ?? true);\n\n if (!args.quiet) {\n logAllowedScripts(allowScripts);\n }\n\n runCommand(\n this.command,\n [\n isCI() ? 'ci' : 'i',\n '--audit=false',\n '--fund=false',\n '--legacy-peer-deps',\n ...(shouldIgnoreScripts(allowScripts) ? ['--ignore-scripts'] : []),\n ...(args.fix ? ['--package-lock-only', '--prefer-dedupe'] : []),\n ],\n options\n );\n\n try {\n if (args.fix) {\n return;\n }\n /*\n * Rebuild applies when allowScripts is an explicit list:\n * `true` means npm install already ran every script, `false`\n * means the user opted out.\n */\n if (Array.isArray(allowScripts)) {\n this.runRebuild(allowScripts);\n }\n /*\n * Warn against the effective allowlist so teams can see which\n * scripts they should add to --allow-scripts. Skip when the user\n * explicitly opted out (`false`); they made an informed choice.\n */\n if (allowScripts !== false) {\n warnUntrustedInstallScripts(\n Array.isArray(allowScripts) ? allowScripts : DEFAULT_ALLOWED_SCRIPTS,\n this.lockFileName,\n { force: true }\n );\n }\n /*\n * When allowScripts is `true`, npm already ran project postinstall.\n * In other cases, we run it manually. Note, `false` only ignores\n * package scripts, the project postinstall is always trusted.\n */\n if (allowScripts !== true) {\n this.runProjectPostinstall(options);\n }\n } finally {\n this.reset();\n }\n }\n\n protected parseLockFile(): NpmLockFile | undefined {\n const lockFilePath = this.findLockFilePath();\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","allowScripts","resolveAllowScripts","quiet","logAllowedScripts","isCI","shouldIgnoreScripts","fix","Array","isArray","runRebuild","warnUntrustedInstallScripts","DEFAULT_ALLOWED_SCRIPTS","lockFileName","force","runProjectPostinstall","reset","parseLockFile","lockFilePath","findLockFilePath","undefined","JSON","parse","fs","readFileSync","packageName","packages","getLockFile","link","resolved","scripts","console","error","join","process","exitCode"],"mappings":"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"}
|
|
@@ -19,8 +19,16 @@ export declare abstract class PackageManager<LockFile = unknown> {
|
|
|
19
19
|
abstract readonly command: string;
|
|
20
20
|
abstract readonly lockFileName: string;
|
|
21
21
|
hasValidLockFile(): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the lockfile key for a package given its absolute or
|
|
24
|
+
* cwd-relative directory. Both npm and pnpm key their lockfile entries
|
|
25
|
+
* by the package's path relative to the workspace root.
|
|
26
|
+
*/
|
|
27
|
+
getWorkspacePackage(packageDir?: string): string;
|
|
22
28
|
protected getLockFile(): LockFile | undefined;
|
|
23
29
|
protected reset(): void;
|
|
30
|
+
protected findLockFilePath(): string | undefined;
|
|
31
|
+
protected get rootWorkspacePackage(): string;
|
|
24
32
|
abstract clearCache(): void;
|
|
25
33
|
abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;
|
|
26
34
|
abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/package-manager.ts"],"names":[],"mappings":"
|
|
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;IAKvC,gBAAgB,IAAI,OAAO;IAI3B;;;;OAIG;IACH,mBAAmB,CAAC,UAAU,SAAgB,GAAG,MAAM;IAYvD,SAAS,CAAC,WAAW,IAAI,QAAQ,GAAG,SAAS;IAQ7C,SAAS,CAAC,KAAK;IAKf,SAAS,CAAC,gBAAgB,IAAI,MAAM,GAAG,SAAS;IAOhD,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"}
|
|
@@ -8,6 +8,9 @@ Object.defineProperty(exports, "PackageManager", {
|
|
|
8
8
|
return PackageManager;
|
|
9
9
|
}
|
|
10
10
|
});
|
|
11
|
+
const _nodefs = /*#__PURE__*/ _interop_require_default(require("node:fs"));
|
|
12
|
+
const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
|
|
13
|
+
const _utils = require("../utils");
|
|
11
14
|
function _check_private_redeclaration(obj, privateCollection) {
|
|
12
15
|
if (privateCollection.has(obj)) {
|
|
13
16
|
throw new TypeError("Cannot initialize the same private elements twice on an object");
|
|
@@ -48,11 +51,28 @@ function _class_private_field_set(receiver, privateMap, value) {
|
|
|
48
51
|
_class_apply_descriptor_set(receiver, descriptor, value);
|
|
49
52
|
return value;
|
|
50
53
|
}
|
|
54
|
+
function _interop_require_default(obj) {
|
|
55
|
+
return obj && obj.__esModule ? obj : {
|
|
56
|
+
default: obj
|
|
57
|
+
};
|
|
58
|
+
}
|
|
51
59
|
var _lockFile = /*#__PURE__*/ new WeakMap(), _lockFileLoaded = /*#__PURE__*/ new WeakMap();
|
|
52
60
|
class PackageManager {
|
|
53
61
|
hasValidLockFile() {
|
|
54
62
|
return this.getLockFile() !== undefined;
|
|
55
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Returns the lockfile key for a package given its absolute or
|
|
66
|
+
* cwd-relative directory. Both npm and pnpm key their lockfile entries
|
|
67
|
+
* by the package's path relative to the workspace root.
|
|
68
|
+
*/ getWorkspacePackage(packageDir = process.cwd()) {
|
|
69
|
+
const lockFilePath = this.findLockFilePath();
|
|
70
|
+
if (!lockFilePath) {
|
|
71
|
+
return this.rootWorkspacePackage;
|
|
72
|
+
}
|
|
73
|
+
const relative = _nodepath.default.relative(_nodepath.default.dirname(lockFilePath), _nodepath.default.resolve(packageDir)).split(_nodepath.default.sep).join('/');
|
|
74
|
+
return relative === '' ? this.rootWorkspacePackage : relative;
|
|
75
|
+
}
|
|
56
76
|
getLockFile() {
|
|
57
77
|
if (!_class_private_field_get(this, _lockFileLoaded)) {
|
|
58
78
|
_class_private_field_set(this, _lockFile, this.parseLockFile());
|
|
@@ -64,6 +84,15 @@ class PackageManager {
|
|
|
64
84
|
_class_private_field_set(this, _lockFile, undefined);
|
|
65
85
|
_class_private_field_set(this, _lockFileLoaded, false);
|
|
66
86
|
}
|
|
87
|
+
findLockFilePath() {
|
|
88
|
+
return (0, _utils.findUp)((directory)=>{
|
|
89
|
+
const candidate = _nodepath.default.join(directory, this.lockFileName);
|
|
90
|
+
return _nodefs.default.existsSync(candidate) ? candidate : undefined;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
get rootWorkspacePackage() {
|
|
94
|
+
return '';
|
|
95
|
+
}
|
|
67
96
|
constructor(){
|
|
68
97
|
_class_private_field_init(this, _lockFile, {
|
|
69
98
|
writable: true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/package-manager/package-manager.ts"],"sourcesContent":["import { 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\n hasValidLockFile(): boolean {\n return this.getLockFile() !== undefined;\n }\n\n protected getLockFile(): LockFile | undefined {\n if (!this.#lockFileLoaded) {\n this.#lockFile = this.parseLockFile();\n this.#lockFileLoaded = true;\n }\n return this.#lockFile;\n }\n\n protected reset() {\n this.#lockFile = undefined;\n this.#lockFileLoaded = false;\n }\n\n abstract clearCache(): void;\n abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;\n abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;\n abstract installPackages(args?: InstallArgs, options?: Parameters<typeof runCommand>[2]): void;\n\n protected abstract parseLockFile(): LockFile | undefined;\n}\n"],"names":["PackageManager","hasValidLockFile","getLockFile","undefined","parseLockFile","reset"],"mappings":";;;;+
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/package-manager.ts"],"sourcesContent":["import fs from 'node: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\n hasValidLockFile(): boolean {\n return this.getLockFile() !== undefined;\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.findLockFilePath();\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 }\n\n protected findLockFilePath(): string | undefined {\n return findUp(directory => {\n const candidate = path.join(directory, this.lockFileName);\n return fs.existsSync(candidate) ? candidate : undefined;\n });\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","getWorkspacePackage","packageDir","process","cwd","lockFilePath","findLockFilePath","rootWorkspacePackage","relative","path","dirname","resolve","split","sep","join","parseLockFile","reset","findUp","directory","candidate","lockFileName","fs","existsSync"],"mappings":";;;;+BAuBsBA;;;eAAAA;;;+DAvBP;iEACE;uBACkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAyB/B,yCACA;AALG,MAAeA;IAOlBC,mBAA4B;QACxB,OAAO,IAAI,CAACC,WAAW,OAAOC;IAClC;IAEA;;;;KAIC,GACDC,oBAAoBC,aAAaC,QAAQC,GAAG,EAAE,EAAU;QACpD,MAAMC,eAAe,IAAI,CAACC,gBAAgB;QAC1C,IAAI,CAACD,cAAc;YACf,OAAO,IAAI,CAACE,oBAAoB;QACpC;QACA,MAAMC,WAAWC,iBAAI,CAChBD,QAAQ,CAACC,iBAAI,CAACC,OAAO,CAACL,eAAeI,iBAAI,CAACE,OAAO,CAACT,aAClDU,KAAK,CAACH,iBAAI,CAACI,GAAG,EACdC,IAAI,CAAC;QACV,OAAON,aAAa,KAAK,IAAI,CAACD,oBAAoB,GAAGC;IACzD;IAEUT,cAAoC;QAC1C,IAAI,0BAAC,IAAI,EAAC,kBAAiB;2CAClB,WAAY,IAAI,CAACgB,aAAa;2CAC9B,iBAAkB;QAC3B;QACA,gCAAO,IAAI,EAAC;IAChB;IAEUC,QAAQ;uCACT,WAAYhB;uCACZ,iBAAkB;IAC3B;IAEUM,mBAAuC;QAC7C,OAAOW,IAAAA,aAAM,EAACC,CAAAA;YACV,MAAMC,YAAYV,iBAAI,CAACK,IAAI,CAACI,WAAW,IAAI,CAACE,YAAY;YACxD,OAAOC,eAAE,CAACC,UAAU,CAACH,aAAaA,YAAYnB;QAClD;IACJ;IAEA,IAAcO,uBAA+B;QACzC,OAAO;IACX;;QA9CA,gCAAA;;mBAAA,KAAA;;QACA,gCAAA;;mBAAkB;;;AAqDtB"}
|
|
@@ -21,6 +21,7 @@ export interface PnpmLockFile {
|
|
|
21
21
|
export declare class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
22
22
|
readonly command = "pnpm";
|
|
23
23
|
readonly lockFileName = "pnpm-lock.yaml";
|
|
24
|
+
protected get rootWorkspacePackage(): string;
|
|
24
25
|
clearCache(): void;
|
|
25
26
|
getDeclaredVersion({ workspacePackage, declaredBy, dependency, }: DeclaredVersionQuery): string | undefined;
|
|
26
27
|
getResolvedVersion({ workspacePackage, dependency }: ResolvedVersionQuery): string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pnpm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/pnpm-package-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,iBAAiB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC5D;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC5C;AAED,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,YAAY,CAAC;IAChE,QAAQ,CAAC,OAAO,UAAU;IAC1B,QAAQ,CAAC,YAAY,oBAAoB;IAEzC,UAAU;IAIV,kBAAkB,CAAC,EACf,gBAAgB,EAChB,UAAU,EACV,UAAU,GACb,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAS5C,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,EAAE,oBAAoB,GAAG,MAAM,GAAG,SAAS;IAI9F,eAAe,CAAC,IAAI,GAAE,WAAgB,EAAE,OAAO,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;IAgBlF,SAAS,CAAC,aAAa,IAAI,YAAY,GAAG,SAAS;
|
|
1
|
+
{"version":3,"file":"pnpm-package-manager.d.ts","sourceRoot":"","sources":["../../src/package-manager/pnpm-package-manager.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,UAAU,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAEnD,UAAU,iBAAiB;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACjD,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,oBAAoB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;CAC5D;AAED,UAAU,YAAY;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;CAC5C;AAED,qBAAa,kBAAmB,SAAQ,cAAc,CAAC,YAAY,CAAC;IAChE,QAAQ,CAAC,OAAO,UAAU;IAC1B,QAAQ,CAAC,YAAY,oBAAoB;IAEzC,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;IAgBlF,SAAS,CAAC,aAAa,IAAI,YAAY,GAAG,SAAS;IAiBnD,OAAO,CAAC,cAAc;CAQzB"}
|
|
@@ -30,8 +30,11 @@ function _interop_require_default(obj) {
|
|
|
30
30
|
};
|
|
31
31
|
}
|
|
32
32
|
class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
33
|
+
get rootWorkspacePackage() {
|
|
34
|
+
return '.';
|
|
35
|
+
}
|
|
33
36
|
clearCache() {
|
|
34
|
-
(0, _utils.runCommand)(
|
|
37
|
+
(0, _utils.runCommand)(this.command, [
|
|
35
38
|
'store',
|
|
36
39
|
'prune'
|
|
37
40
|
]);
|
|
@@ -51,7 +54,7 @@ class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
|
51
54
|
}
|
|
52
55
|
installPackages(args = {}, options) {
|
|
53
56
|
try {
|
|
54
|
-
(0, _utils.runCommand)(
|
|
57
|
+
(0, _utils.runCommand)(this.command, [
|
|
55
58
|
'install',
|
|
56
59
|
...(0, _utils.isCI)() ? [
|
|
57
60
|
'--frozen-lockfile'
|
|
@@ -65,12 +68,16 @@ class PnpmPackageManager extends _packagemanager.PackageManager {
|
|
|
65
68
|
}
|
|
66
69
|
}
|
|
67
70
|
parseLockFile() {
|
|
71
|
+
const lockFilePath = this.findLockFilePath();
|
|
72
|
+
if (!lockFilePath) {
|
|
73
|
+
return undefined;
|
|
74
|
+
}
|
|
68
75
|
/*
|
|
69
76
|
* js-yaml is an optional peer; let MODULE_NOT_FOUND surface so a caller
|
|
70
77
|
* missing the dep gets a clear error instead of silent `undefined`.
|
|
71
78
|
*/ const yaml = require('js-yaml');
|
|
72
79
|
try {
|
|
73
|
-
return yaml.load(_fs.default.readFileSync(
|
|
80
|
+
return yaml.load(_fs.default.readFileSync(lockFilePath, 'utf-8'));
|
|
74
81
|
} catch (unused) {
|
|
75
82
|
return undefined;
|
|
76
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/package-manager/pnpm-package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport { isCI, runCommand } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\n\ninterface PnpmImporterEntry {\n specifier: string;\n version: string;\n}\n\ninterface PnpmImporter {\n dependencies?: Record<string, PnpmImporterEntry>;\n devDependencies?: Record<string, PnpmImporterEntry>;\n optionalDependencies?: Record<string, PnpmImporterEntry>;\n}\n\ninterface PnpmSnapshot {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface PnpmLockFile {\n importers?: Record<string, PnpmImporter>;\n snapshots?: Record<string, PnpmSnapshot>;\n}\n\nexport class PnpmPackageManager extends PackageManager<PnpmLockFile> {\n readonly command = 'pnpm';\n readonly lockFileName = 'pnpm-lock.yaml';\n\n clearCache() {\n runCommand(
|
|
1
|
+
{"version":3,"sources":["../../src/package-manager/pnpm-package-manager.ts"],"sourcesContent":["import fs from 'fs';\nimport { isCI, runCommand } from '../utils';\nimport type { DeclaredVersionQuery, InstallArgs, ResolvedVersionQuery } from './package-manager';\nimport { PackageManager } from './package-manager';\n\ninterface PnpmImporterEntry {\n specifier: string;\n version: string;\n}\n\ninterface PnpmImporter {\n dependencies?: Record<string, PnpmImporterEntry>;\n devDependencies?: Record<string, PnpmImporterEntry>;\n optionalDependencies?: Record<string, PnpmImporterEntry>;\n}\n\ninterface PnpmSnapshot {\n dependencies?: Record<string, string>;\n peerDependencies?: Record<string, string>;\n}\n\nexport interface PnpmLockFile {\n importers?: Record<string, PnpmImporter>;\n snapshots?: Record<string, PnpmSnapshot>;\n}\n\nexport class PnpmPackageManager extends PackageManager<PnpmLockFile> {\n readonly command = 'pnpm';\n readonly lockFileName = 'pnpm-lock.yaml';\n\n 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 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.findLockFilePath();\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\nfunction stripPeerDependencySuffix(version: string): string {\n // e.g., \"1.2.3(react@18.2.0)(react-dom@18.2.0)\" → \"1.2.3\"\n return version.split('(')[0];\n}\n"],"names":["PnpmPackageManager","PackageManager","rootWorkspacePackage","clearCache","runCommand","command","getDeclaredVersion","workspacePackage","declaredBy","dependency","snapshot","declaredByVersion","resolveVersion","undefined","getLockFile","snapshots","dependencies","peerDependencies","getResolvedVersion","installPackages","args","options","isCI","fix","reset","parseLockFile","lockFilePath","findLockFilePath","yaml","require","load","fs","readFileSync","importer","importers","entry","devDependencies","optionalDependencies","stripPeerDependencySuffix","version","lockFileName","split"],"mappings":";;;;+BA0BaA;;;eAAAA;;;2DA1BE;uBACkB;gCAEF;;;;;;;;;;;;;;;;;;;AAuBxB,MAAMA,2BAA2BC,8BAAc;IAIlD,IAAuBC,uBAA+B;QAClD,OAAO;IACX;IAEAC,aAAa;QACTC,IAAAA,iBAAU,EAAC,IAAI,CAACC,OAAO,EAAE;YAAC;YAAS;SAAQ;IAC/C;IAEAC,mBAAmB,EACfC,gBAAgB,EAChBC,UAAU,EACVC,UAAU,EACS,EAAsB;;YAKxB,6BAAA,mBACVC,wBAAwCA;QAL/C,MAAMC,oBAAoB,IAAI,CAACC,cAAc,CAACL,kBAAkBC;QAChE,IAAI,CAACG,mBAAmB;YACpB,OAAOE;QACX;QACA,MAAMH,YAAW,oBAAA,IAAI,CAACI,WAAW,gBAAhB,yCAAA,8BAAA,kBAAoBC,SAAS,cAA7B,kDAAA,2BAA+B,CAAC,GAAGP,WAAW,CAAC,EAAEG,mBAAmB,CAAC;QACtF,eAAOD,qBAAAA,gCAAAA,yBAAAA,SAAUM,YAAY,cAAtBN,6CAAAA,sBAAwB,CAACD,WAAW,uCAAIC,qBAAAA,gCAAAA,6BAAAA,SAAUO,gBAAgB,cAA1BP,iDAAAA,0BAA4B,CAACD,WAAW;IAC3F;IAEAS,mBAAmB,EAAEX,gBAAgB,EAAEE,UAAU,EAAwB,EAAsB;QAC3F,OAAO,IAAI,CAACG,cAAc,CAACL,kBAAkBE;IACjD;IAEAU,gBAAgBC,OAAoB,CAAC,CAAC,EAAEC,OAA0C,EAAE;QAChF,IAAI;YACAjB,IAAAA,iBAAU,EACN,IAAI,CAACC,OAAO,EACZ;gBACI;mBACIiB,IAAAA,WAAI,MAAK;oBAAC;iBAAoB,GAAG,EAAE;mBACnCF,KAAKG,GAAG,GAAG;oBAAC;iBAAkB,GAAG,EAAE;aAC1C,EACDF;QAER,SAAU;YACN,IAAI,CAACG,KAAK;QACd;IACJ;IAEUC,gBAA0C;QAChD,MAAMC,eAAe,IAAI,CAACC,gBAAgB;QAC1C,IAAI,CAACD,cAAc;YACf,OAAOb;QACX;QACA;;;SAGC,GACD,MAAMe,OAAOC,QAAQ;QACrB,IAAI;YACA,OAAOD,KAAKE,IAAI,CAACC,WAAE,CAACC,YAAY,CAACN,cAAc;QACnD,EAAE,eAAM;YACJ,OAAOb;QACX;IACJ;IAEQD,eAAeL,gBAAwB,EAAEE,UAAkB,EAAsB;YAGjFwB;YAFa,6BAAA,mBAEbA,wBACAA,2BACAA;QAJJ,MAAMA,YAAW,oBAAA,IAAI,CAACnB,WAAW,gBAAhB,yCAAA,8BAAA,kBAAoBoB,SAAS,cAA7B,kDAAA,2BAA+B,CAAC3B,iBAAiB;QAClE,MAAM4B,SACFF,gBAAAA,qBAAAA,gCAAAA,yBAAAA,SAAUjB,YAAY,cAAtBiB,6CAAAA,sBAAwB,CAACxB,WAAW,yCACpCwB,qBAAAA,gCAAAA,4BAAAA,SAAUG,eAAe,cAAzBH,gDAAAA,yBAA2B,CAACxB,WAAW,cADvCwB,kBAAAA,OAEAA,qBAAAA,gCAAAA,iCAAAA,SAAUI,oBAAoB,cAA9BJ,qDAAAA,8BAAgC,CAACxB,WAAW;QAChD,OAAO0B,QAAQG,0BAA0BH,MAAMI,OAAO,IAAI1B;IAC9D;;QArEG,gBACH,uBAASR,WAAU,SACnB,uBAASmC,gBAAe;;AAoE5B;AAEA,SAASF,0BAA0BC,OAAe;IAC9C,0DAA0D;IAC1D,OAAOA,QAAQE,KAAK,CAAC,IAAI,CAAC,EAAE;AAChC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/install",
|
|
3
|
-
"version": "36.3.
|
|
3
|
+
"version": "36.3.1",
|
|
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": {
|
|
@@ -40,5 +40,5 @@
|
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"ts-node": "~10.9.2"
|
|
42
42
|
},
|
|
43
|
-
"gitHead": "
|
|
43
|
+
"gitHead": "93a049ba1e5cb737afb7bc95c06020736bc61a38"
|
|
44
44
|
}
|
|
@@ -12,6 +12,8 @@ import {
|
|
|
12
12
|
|
|
13
13
|
interface NpmLockFileEntry {
|
|
14
14
|
version?: string;
|
|
15
|
+
resolved?: string;
|
|
16
|
+
link?: boolean;
|
|
15
17
|
dependencies?: Record<string, string>;
|
|
16
18
|
peerDependencies?: Record<string, string>;
|
|
17
19
|
}
|
|
@@ -25,7 +27,7 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
25
27
|
readonly lockFileName = 'package-lock.json';
|
|
26
28
|
|
|
27
29
|
clearCache() {
|
|
28
|
-
runCommand(
|
|
30
|
+
runCommand(this.command, ['cache', 'clear', '--force']);
|
|
29
31
|
}
|
|
30
32
|
|
|
31
33
|
getDeclaredVersion({
|
|
@@ -53,7 +55,7 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
53
55
|
}
|
|
54
56
|
|
|
55
57
|
runCommand(
|
|
56
|
-
|
|
58
|
+
this.command,
|
|
57
59
|
[
|
|
58
60
|
isCI() ? 'ci' : 'i',
|
|
59
61
|
'--audit=false',
|
|
@@ -103,8 +105,12 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
103
105
|
}
|
|
104
106
|
|
|
105
107
|
protected parseLockFile(): NpmLockFile | undefined {
|
|
108
|
+
const lockFilePath = this.findLockFilePath();
|
|
109
|
+
if (!lockFilePath) {
|
|
110
|
+
return undefined;
|
|
111
|
+
}
|
|
106
112
|
try {
|
|
107
|
-
return JSON.parse(fs.readFileSync(
|
|
113
|
+
return JSON.parse(fs.readFileSync(lockFilePath, 'utf-8'));
|
|
108
114
|
} catch {
|
|
109
115
|
return undefined;
|
|
110
116
|
}
|
|
@@ -115,6 +121,8 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
115
121
|
* to the hoisted root entry. `workspacePackage` is the package's relative
|
|
116
122
|
* path from the repo root; the empty string `''` denotes the root
|
|
117
123
|
* workspace package itself, matching npm's own lockfile key convention.
|
|
124
|
+
* Follows link entries to the resolved workspace package, so callers see
|
|
125
|
+
* the workspace package's own metadata rather than the symlink stub.
|
|
118
126
|
*/
|
|
119
127
|
private findEntry({
|
|
120
128
|
workspacePackage,
|
|
@@ -124,15 +132,18 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
124
132
|
package: string;
|
|
125
133
|
}): NpmLockFileEntry | undefined {
|
|
126
134
|
const packages = this.getLockFile()?.packages;
|
|
127
|
-
|
|
135
|
+
const entry =
|
|
128
136
|
packages?.[`${workspacePackage}/node_modules/${packageName}`] ??
|
|
129
|
-
packages?.[`node_modules/${packageName}`]
|
|
130
|
-
)
|
|
137
|
+
packages?.[`node_modules/${packageName}`];
|
|
138
|
+
if (entry?.link && entry.resolved) {
|
|
139
|
+
return packages?.[entry.resolved];
|
|
140
|
+
}
|
|
141
|
+
return entry;
|
|
131
142
|
}
|
|
132
143
|
|
|
133
144
|
private runRebuild(scripts: string[]) {
|
|
134
145
|
try {
|
|
135
|
-
runCommand(
|
|
146
|
+
runCommand(this.command, ['rebuild', ...scripts]);
|
|
136
147
|
} catch {
|
|
137
148
|
console.error(`Failed to run allowed scripts: ${scripts.join(', ')}`);
|
|
138
149
|
process.exitCode = 1;
|
|
@@ -141,7 +152,7 @@ export class NpmPackageManager extends PackageManager<NpmLockFile> {
|
|
|
141
152
|
|
|
142
153
|
private runProjectPostinstall(options?: Parameters<typeof runCommand>[2]) {
|
|
143
154
|
try {
|
|
144
|
-
runCommand(
|
|
155
|
+
runCommand(this.command, ['run', 'postinstall', '--if-present'], options);
|
|
145
156
|
} catch {
|
|
146
157
|
process.exitCode = 1;
|
|
147
158
|
}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { findUp, runCommand } from '../utils';
|
|
2
4
|
|
|
3
5
|
export type AllowScripts = true | false | string[];
|
|
4
6
|
|
|
@@ -30,6 +32,23 @@ export abstract class PackageManager<LockFile = unknown> {
|
|
|
30
32
|
return this.getLockFile() !== undefined;
|
|
31
33
|
}
|
|
32
34
|
|
|
35
|
+
/**
|
|
36
|
+
* Returns the lockfile key for a package given its absolute or
|
|
37
|
+
* cwd-relative directory. Both npm and pnpm key their lockfile entries
|
|
38
|
+
* by the package's path relative to the workspace root.
|
|
39
|
+
*/
|
|
40
|
+
getWorkspacePackage(packageDir = process.cwd()): string {
|
|
41
|
+
const lockFilePath = this.findLockFilePath();
|
|
42
|
+
if (!lockFilePath) {
|
|
43
|
+
return this.rootWorkspacePackage;
|
|
44
|
+
}
|
|
45
|
+
const relative = path
|
|
46
|
+
.relative(path.dirname(lockFilePath), path.resolve(packageDir))
|
|
47
|
+
.split(path.sep)
|
|
48
|
+
.join('/');
|
|
49
|
+
return relative === '' ? this.rootWorkspacePackage : relative;
|
|
50
|
+
}
|
|
51
|
+
|
|
33
52
|
protected getLockFile(): LockFile | undefined {
|
|
34
53
|
if (!this.#lockFileLoaded) {
|
|
35
54
|
this.#lockFile = this.parseLockFile();
|
|
@@ -43,6 +62,17 @@ export abstract class PackageManager<LockFile = unknown> {
|
|
|
43
62
|
this.#lockFileLoaded = false;
|
|
44
63
|
}
|
|
45
64
|
|
|
65
|
+
protected findLockFilePath(): string | undefined {
|
|
66
|
+
return findUp(directory => {
|
|
67
|
+
const candidate = path.join(directory, this.lockFileName);
|
|
68
|
+
return fs.existsSync(candidate) ? candidate : undefined;
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
protected get rootWorkspacePackage(): string {
|
|
73
|
+
return '';
|
|
74
|
+
}
|
|
75
|
+
|
|
46
76
|
abstract clearCache(): void;
|
|
47
77
|
abstract getDeclaredVersion(query: DeclaredVersionQuery): string | undefined;
|
|
48
78
|
abstract getResolvedVersion(query: ResolvedVersionQuery): string | undefined;
|
|
@@ -28,8 +28,12 @@ export class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
|
28
28
|
readonly command = 'pnpm';
|
|
29
29
|
readonly lockFileName = 'pnpm-lock.yaml';
|
|
30
30
|
|
|
31
|
+
protected override get rootWorkspacePackage(): string {
|
|
32
|
+
return '.';
|
|
33
|
+
}
|
|
34
|
+
|
|
31
35
|
clearCache() {
|
|
32
|
-
runCommand(
|
|
36
|
+
runCommand(this.command, ['store', 'prune']);
|
|
33
37
|
}
|
|
34
38
|
|
|
35
39
|
getDeclaredVersion({
|
|
@@ -52,7 +56,7 @@ export class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
|
52
56
|
installPackages(args: InstallArgs = {}, options?: Parameters<typeof runCommand>[2]) {
|
|
53
57
|
try {
|
|
54
58
|
runCommand(
|
|
55
|
-
|
|
59
|
+
this.command,
|
|
56
60
|
[
|
|
57
61
|
'install',
|
|
58
62
|
...(isCI() ? ['--frozen-lockfile'] : []),
|
|
@@ -66,13 +70,17 @@ export class PnpmPackageManager extends PackageManager<PnpmLockFile> {
|
|
|
66
70
|
}
|
|
67
71
|
|
|
68
72
|
protected parseLockFile(): PnpmLockFile | undefined {
|
|
73
|
+
const lockFilePath = this.findLockFilePath();
|
|
74
|
+
if (!lockFilePath) {
|
|
75
|
+
return undefined;
|
|
76
|
+
}
|
|
69
77
|
/*
|
|
70
78
|
* js-yaml is an optional peer; let MODULE_NOT_FOUND surface so a caller
|
|
71
79
|
* missing the dep gets a clear error instead of silent `undefined`.
|
|
72
80
|
*/
|
|
73
81
|
const yaml = require('js-yaml');
|
|
74
82
|
try {
|
|
75
|
-
return yaml.load(fs.readFileSync(
|
|
83
|
+
return yaml.load(fs.readFileSync(lockFilePath, 'utf-8'));
|
|
76
84
|
} catch {
|
|
77
85
|
return undefined;
|
|
78
86
|
}
|