@rushstack/lockfile-explorer 1.8.1 → 2.0.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.
Files changed (35) hide show
  1. package/CHANGELOG.json +38 -0
  2. package/CHANGELOG.md +17 -1
  3. package/build/lfx-shared/IJsonLfxGraph.d.ts +4 -3
  4. package/build/lfx-shared/IJsonLfxGraph.js.map +1 -1
  5. package/build/lfx-shared/LfxGraph.d.ts +49 -16
  6. package/build/lfx-shared/LfxGraph.js +5 -10
  7. package/build/lfx-shared/LfxGraph.js.map +1 -1
  8. package/build/lfx-shared/lfxGraphSerializer.js +8 -6
  9. package/build/lfx-shared/lfxGraphSerializer.js.map +1 -1
  10. package/dist/{app.22259b754540a899e03d.js → app.9d79482549580f813d48.js} +1 -1
  11. package/dist/index.html +1 -1
  12. package/dist/rush-themed-ui.js +1 -1
  13. package/lib/cli/explorer/ExplorerCommandLineParser.d.ts.map +1 -1
  14. package/lib/cli/explorer/ExplorerCommandLineParser.js +3 -3
  15. package/lib/cli/explorer/ExplorerCommandLineParser.js.map +1 -1
  16. package/lib/cli/lint/LintCommandLineParser.d.ts.map +1 -1
  17. package/lib/cli/lint/LintCommandLineParser.js +1 -1
  18. package/lib/cli/lint/LintCommandLineParser.js.map +1 -1
  19. package/lib/cli/lint/actions/CheckAction.d.ts.map +1 -1
  20. package/lib/cli/lint/actions/CheckAction.js +6 -6
  21. package/lib/cli/lint/actions/CheckAction.js.map +1 -1
  22. package/lib/cli/lint/actions/InitAction.d.ts.map +1 -1
  23. package/lib/cli/lint/actions/InitAction.js +3 -3
  24. package/lib/cli/lint/actions/InitAction.js.map +1 -1
  25. package/lib/graph/PnpmfileRunner.d.ts.map +1 -1
  26. package/lib/graph/PnpmfileRunner.js.map +1 -1
  27. package/lib/graph/lfxGraphLoader.d.ts.map +1 -1
  28. package/lib/graph/lfxGraphLoader.js +201 -114
  29. package/lib/graph/lfxGraphLoader.js.map +1 -1
  30. package/lib/graph/pnpmfileRunnerWorkerThread.d.ts.map +1 -1
  31. package/lib/graph/pnpmfileRunnerWorkerThread.js.map +1 -1
  32. package/lib/utils/init.d.ts.map +1 -1
  33. package/lib/utils/init.js +7 -7
  34. package/lib/utils/init.js.map +1 -1
  35. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"ExplorerCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/explorer/ExplorerCommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport express from 'express';\nimport yaml from 'js-yaml';\nimport cors from 'cors';\nimport process from 'process';\nimport open from 'open';\nimport updateNotifier from 'update-notifier';\nimport * as path from 'node:path';\nimport { FileSystem, type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport {\n type CommandLineFlagParameter,\n CommandLineParser,\n type IRequiredCommandLineStringParameter\n} from '@rushstack/ts-command-line';\n\nimport {\n type LfxGraph,\n lfxGraphSerializer,\n type IAppContext,\n type IJsonLfxGraph,\n type IJsonLfxWorkspace\n} from '../../../build/lfx-shared';\nimport * as lockfilePath from '../../graph/lockfilePath';\n\nimport type { IAppState } from '../../state';\nimport { init } from '../../utils/init';\nimport { PnpmfileRunner } from '../../graph/PnpmfileRunner';\nimport * as lfxGraphLoader from '../../graph/lfxGraphLoader';\n\nconst EXPLORER_TOOL_FILENAME: 'lockfile-explorer' = 'lockfile-explorer';\n\nexport class ExplorerCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n private readonly _debugParameter: CommandLineFlagParameter;\n\n private readonly _subspaceParameter: IRequiredCommandLineStringParameter;\n\n public constructor() {\n super({\n toolFilename: EXPLORER_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Explorer is a desktop app for investigating and solving version conflicts in a PNPM workspace.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._subspaceParameter = this.defineStringParameter({\n parameterLongName: '--subspace',\n argumentName: 'SUBSPACE_NAME',\n description: 'Specifies an individual Rush subspace to check.',\n defaultValue: 'default'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n }\n\n public get isDebug(): boolean {\n return this._debugParameter.value;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Explorer ${appVersion}`) +\n Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n updateNotifier({\n pkg: lockfileExplorerPackageJson,\n // Normally update-notifier waits a day or so before it starts displaying upgrade notices.\n // In debug mode, show the notice right away.\n updateCheckInterval: this.isDebug ? 0 : undefined\n }).notify({\n // Make sure it says \"-g\" in the \"npm install\" example command line\n isGlobal: true,\n // Show the notice immediately, rather than waiting for process.onExit()\n defer: false\n });\n\n const PORT: number = 8091;\n // Must not have a trailing slash\n const SERVICE_URL: string = `http://localhost:${PORT}`;\n\n const appState: IAppState = init({\n lockfileExplorerProjectRoot,\n appVersion,\n debugMode: this.isDebug,\n subspaceName: this._subspaceParameter.value\n });\n\n const lfxWorkspace: IJsonLfxWorkspace = appState.lfxWorkspace;\n\n // Important: This must happen after init() reads the current working directory\n process.chdir(appState.lockfileExplorerProjectRoot);\n\n const distFolderPath: string = `${appState.lockfileExplorerProjectRoot}/dist`;\n const app: express.Application = express();\n app.use(express.json());\n app.use(cors());\n\n // Variable used to check if the front-end client is still connected\n let awaitingFirstConnect: boolean = true;\n let isClientConnected: boolean = false;\n let disconnected: boolean = false;\n setInterval(() => {\n if (!isClientConnected && !awaitingFirstConnect && !disconnected) {\n console.log(Colorize.red('The client has disconnected!'));\n console.log(`Please open a browser window at http://localhost:${PORT}/app`);\n disconnected = true;\n } else if (!awaitingFirstConnect) {\n isClientConnected = false;\n }\n }, 4000);\n\n // This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.\n app.get('/initappcontext.js', (req: express.Request, res: express.Response) => {\n const appContext: IAppContext = {\n serviceUrl: SERVICE_URL,\n appVersion: appState.appVersion,\n debugMode: this.isDebug\n };\n const sourceCode: string = [\n `console.log('Loaded initappcontext.js');`,\n `appContext = ${JSON.stringify(appContext)}`\n ].join('\\n');\n\n res.type('application/javascript').send(sourceCode);\n });\n\n app.use('/', express.static(distFolderPath));\n\n app.use('/favicon.ico', express.static(distFolderPath, { index: 'favicon.ico' }));\n\n app.get('/api/health', (req: express.Request, res: express.Response) => {\n awaitingFirstConnect = false;\n isClientConnected = true;\n if (disconnected) {\n disconnected = false;\n console.log(Colorize.green('The client has reconnected!'));\n }\n res.status(200).send();\n });\n\n app.get('/api/graph', async (req: express.Request, res: express.Response) => {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\n const lockfile: unknown = yaml.load(pnpmLockfileText) as unknown;\n\n const graph: LfxGraph = lfxGraphLoader.generateLockfileGraph(lockfile, lfxWorkspace);\n\n const jsonGraph: IJsonLfxGraph = lfxGraphSerializer.serializeToJson(graph);\n res.type('application/json').send(jsonGraph);\n });\n\n app.post(\n '/api/package-json',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJsonText: string;\n try {\n packageJsonText = await FileSystem.readFileAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,\n error: `No package.json in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n res.send(packageJsonText);\n }\n );\n\n app.get('/api/pnpmfile', async (req: express.Request, res: express.Response) => {\n const pnpmfilePath: string = lockfilePath.join(\n lfxWorkspace.workspaceRootFullPath,\n lfxWorkspace.rushConfig?.rushPnpmfilePath ?? lfxWorkspace.pnpmfilePath\n );\n\n let pnpmfile: string;\n try {\n pnpmfile = await FileSystem.readFileAsync(pnpmfilePath);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load .pnpmfile.cjs file in this repo: \"${pnpmfilePath}\"`,\n error: `No .pnpmifile.cjs found.`\n });\n } else {\n throw e;\n }\n }\n\n res.send(pnpmfile);\n });\n\n app.post(\n '/api/package-spec',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJson: IPackageJson;\n try {\n packageJson = await JsonFile.loadAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n let parsedPackage: IPackageJson = packageJson;\n\n const pnpmfilePath: string = path.join(lfxWorkspace.workspaceRootFullPath, lfxWorkspace.pnpmfilePath);\n if (await FileSystem.existsAsync(pnpmfilePath)) {\n const pnpmFileRunner: PnpmfileRunner = new PnpmfileRunner(pnpmfilePath);\n try {\n parsedPackage = await pnpmFileRunner.transformPackageAsync(packageJson, fileLocation);\n } finally {\n await pnpmFileRunner.disposeAsync();\n }\n }\n\n res.send(parsedPackage);\n }\n );\n\n app.listen(PORT, async () => {\n console.log(`App launched on ${SERVICE_URL}`);\n\n if (!appState.debugMode) {\n try {\n // Launch the web browser\n await open(SERVICE_URL);\n } catch (e) {\n this.globalTerminal.writeError('Error launching browser: ' + e.toString());\n }\n }\n });\n }\n}\n"]}
1
+ {"version":3,"file":"ExplorerCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/explorer/ExplorerCommandLineParser.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport process from 'node:process';\nimport * as path from 'node:path';\n\nimport express from 'express';\nimport yaml from 'js-yaml';\nimport cors from 'cors';\nimport open from 'open';\nimport updateNotifier from 'update-notifier';\n\nimport { FileSystem, type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport {\n type CommandLineFlagParameter,\n CommandLineParser,\n type IRequiredCommandLineStringParameter\n} from '@rushstack/ts-command-line';\n\nimport {\n type LfxGraph,\n lfxGraphSerializer,\n type IAppContext,\n type IJsonLfxGraph,\n type IJsonLfxWorkspace\n} from '../../../build/lfx-shared';\nimport * as lockfilePath from '../../graph/lockfilePath';\nimport type { IAppState } from '../../state';\nimport { init } from '../../utils/init';\nimport { PnpmfileRunner } from '../../graph/PnpmfileRunner';\nimport * as lfxGraphLoader from '../../graph/lfxGraphLoader';\n\nconst EXPLORER_TOOL_FILENAME: 'lockfile-explorer' = 'lockfile-explorer';\n\nexport class ExplorerCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n private readonly _debugParameter: CommandLineFlagParameter;\n\n private readonly _subspaceParameter: IRequiredCommandLineStringParameter;\n\n public constructor() {\n super({\n toolFilename: EXPLORER_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Explorer is a desktop app for investigating and solving version conflicts in a PNPM workspace.'\n });\n\n this._debugParameter = this.defineFlagParameter({\n parameterLongName: '--debug',\n parameterShortName: '-d',\n description: 'Show the full call stack if an error occurs while executing the tool'\n });\n\n this._subspaceParameter = this.defineStringParameter({\n parameterLongName: '--subspace',\n argumentName: 'SUBSPACE_NAME',\n description: 'Specifies an individual Rush subspace to check.',\n defaultValue: 'default'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n }\n\n public get isDebug(): boolean {\n return this._debugParameter.value;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Explorer ${appVersion}`) +\n Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n updateNotifier({\n pkg: lockfileExplorerPackageJson,\n // Normally update-notifier waits a day or so before it starts displaying upgrade notices.\n // In debug mode, show the notice right away.\n updateCheckInterval: this.isDebug ? 0 : undefined\n }).notify({\n // Make sure it says \"-g\" in the \"npm install\" example command line\n isGlobal: true,\n // Show the notice immediately, rather than waiting for process.onExit()\n defer: false\n });\n\n const PORT: number = 8091;\n // Must not have a trailing slash\n const SERVICE_URL: string = `http://localhost:${PORT}`;\n\n const appState: IAppState = init({\n lockfileExplorerProjectRoot,\n appVersion,\n debugMode: this.isDebug,\n subspaceName: this._subspaceParameter.value\n });\n\n const lfxWorkspace: IJsonLfxWorkspace = appState.lfxWorkspace;\n\n // Important: This must happen after init() reads the current working directory\n process.chdir(appState.lockfileExplorerProjectRoot);\n\n const distFolderPath: string = `${appState.lockfileExplorerProjectRoot}/dist`;\n const app: express.Application = express();\n app.use(express.json());\n app.use(cors());\n\n // Variable used to check if the front-end client is still connected\n let awaitingFirstConnect: boolean = true;\n let isClientConnected: boolean = false;\n let disconnected: boolean = false;\n setInterval(() => {\n if (!isClientConnected && !awaitingFirstConnect && !disconnected) {\n console.log(Colorize.red('The client has disconnected!'));\n console.log(`Please open a browser window at http://localhost:${PORT}/app`);\n disconnected = true;\n } else if (!awaitingFirstConnect) {\n isClientConnected = false;\n }\n }, 4000);\n\n // This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.\n app.get('/initappcontext.js', (req: express.Request, res: express.Response) => {\n const appContext: IAppContext = {\n serviceUrl: SERVICE_URL,\n appVersion: appState.appVersion,\n debugMode: this.isDebug\n };\n const sourceCode: string = [\n `console.log('Loaded initappcontext.js');`,\n `appContext = ${JSON.stringify(appContext)}`\n ].join('\\n');\n\n res.type('application/javascript').send(sourceCode);\n });\n\n app.use('/', express.static(distFolderPath));\n\n app.use('/favicon.ico', express.static(distFolderPath, { index: 'favicon.ico' }));\n\n app.get('/api/health', (req: express.Request, res: express.Response) => {\n awaitingFirstConnect = false;\n isClientConnected = true;\n if (disconnected) {\n disconnected = false;\n console.log(Colorize.green('The client has reconnected!'));\n }\n res.status(200).send();\n });\n\n app.get('/api/graph', async (req: express.Request, res: express.Response) => {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\n const lockfile: unknown = yaml.load(pnpmLockfileText) as unknown;\n\n const graph: LfxGraph = lfxGraphLoader.generateLockfileGraph(lockfile, lfxWorkspace);\n\n const jsonGraph: IJsonLfxGraph = lfxGraphSerializer.serializeToJson(graph);\n res.type('application/json').send(jsonGraph);\n });\n\n app.post(\n '/api/package-json',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJsonText: string;\n try {\n packageJsonText = await FileSystem.readFileAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,\n error: `No package.json in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n res.send(packageJsonText);\n }\n );\n\n app.get('/api/pnpmfile', async (req: express.Request, res: express.Response) => {\n const pnpmfilePath: string = lockfilePath.join(\n lfxWorkspace.workspaceRootFullPath,\n lfxWorkspace.rushConfig?.rushPnpmfilePath ?? lfxWorkspace.pnpmfilePath\n );\n\n let pnpmfile: string;\n try {\n pnpmfile = await FileSystem.readFileAsync(pnpmfilePath);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load .pnpmfile.cjs file in this repo: \"${pnpmfilePath}\"`,\n error: `No .pnpmifile.cjs found.`\n });\n } else {\n throw e;\n }\n }\n\n res.send(pnpmfile);\n });\n\n app.post(\n '/api/package-spec',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation: string = `${appState.projectRoot}/${projectPath}/package.json`;\n let packageJson: IPackageJson;\n try {\n packageJson = await JsonFile.loadAsync(fileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load package.json file in location: ${projectPath}`\n });\n } else {\n throw e;\n }\n }\n\n let parsedPackage: IPackageJson = packageJson;\n\n const pnpmfilePath: string = path.join(lfxWorkspace.workspaceRootFullPath, lfxWorkspace.pnpmfilePath);\n if (await FileSystem.existsAsync(pnpmfilePath)) {\n const pnpmFileRunner: PnpmfileRunner = new PnpmfileRunner(pnpmfilePath);\n try {\n parsedPackage = await pnpmFileRunner.transformPackageAsync(packageJson, fileLocation);\n } finally {\n await pnpmFileRunner.disposeAsync();\n }\n }\n\n res.send(parsedPackage);\n }\n );\n\n app.listen(PORT, async () => {\n console.log(`App launched on ${SERVICE_URL}`);\n\n if (!appState.debugMode) {\n try {\n // Launch the web browser\n await open(SERVICE_URL);\n } catch (e) {\n this.globalTerminal.writeError('Error launching browser: ' + e.toString());\n }\n }\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LintCommandLineParser.d.ts","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAO/D,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,SAAgB,cAAc,EAAE,SAAS,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;;cAenC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxD,OAAO,CAAC,gBAAgB;CAIzB"}
1
+ {"version":3,"file":"LintCommandLineParser.d.ts","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":"AAGA,OAAO,EAA2B,KAAK,SAAS,EAAsB,MAAM,qBAAqB,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAQ/D,qBAAa,qBAAsB,SAAQ,iBAAiB;IAC1D,SAAgB,cAAc,EAAE,SAAS,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAA0B;;cAenC,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAcxD,OAAO,CAAC,gBAAgB;CAIzB"}
@@ -5,9 +5,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.LintCommandLineParser = void 0;
6
6
  const terminal_1 = require("@rushstack/terminal");
7
7
  const ts_command_line_1 = require("@rushstack/ts-command-line");
8
+ const node_core_library_1 = require("@rushstack/node-core-library");
8
9
  const InitAction_1 = require("./actions/InitAction");
9
10
  const CheckAction_1 = require("./actions/CheckAction");
10
- const node_core_library_1 = require("@rushstack/node-core-library");
11
11
  const LINT_TOOL_FILENAME = 'lockfile-lint';
12
12
  class LintCommandLineParser extends ts_command_line_1.CommandLineParser {
13
13
  constructor() {
@@ -1 +1 @@
1
- {"version":3,"file":"LintCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,kDAAkG;AAClG,gEAA+D;AAC/D,qDAAkD;AAClD,uDAAoD;AACpD,oEAA8F;AAE9F,MAAM,kBAAkB,GAAoB,eAAe,CAAC;AAE5D,MAAa,qBAAsB,SAAQ,mCAAiB;IAI1D;QACE,KAAK,CAAC;YACJ,YAAY,EAAE,kBAAkB;YAChC,eAAe,EACb,wGAAwG;SAC3G,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,GAAG,IAAI,kCAAuB,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,2BAA2B,GAAW,qCAAiB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAE,CAAC;QAC1G,MAAM,2BAA2B,GAAiB,4BAAQ,CAAC,IAAI,CAC7D,GAAG,2BAA2B,eAAe,CAC9C,CAAC;QACF,MAAM,UAAU,GAAW,2BAA2B,CAAC,OAAO,CAAC;QAE/D,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B,mBAAQ,CAAC,IAAI,CAAC,wBAAwB,UAAU,EAAE,CAAC,GAAG,mBAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CACtG,CAAC;QAEF,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,uBAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;CACF;AAnCD,sDAmCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport { CommandLineParser } from '@rushstack/ts-command-line';\nimport { InitAction } from './actions/InitAction';\nimport { CheckAction } from './actions/CheckAction';\nimport { type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\n\nconst LINT_TOOL_FILENAME: 'lockfile-lint' = 'lockfile-lint';\n\nexport class LintCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n\n public constructor() {\n super({\n toolFilename: LINT_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Lint applies configured policies to find and report dependency issues in your PNPM workspace.'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n\n this._populateActions();\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Lint ${appVersion}`) + Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n await super.onExecuteAsync();\n }\n\n private _populateActions(): void {\n this.addAction(new InitAction(this));\n this.addAction(new CheckAction(this));\n }\n}\n"]}
1
+ {"version":3,"file":"LintCommandLineParser.js","sourceRoot":"","sources":["../../../src/cli/lint/LintCommandLineParser.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,kDAAkG;AAClG,gEAA+D;AAC/D,oEAA8F;AAE9F,qDAAkD;AAClD,uDAAoD;AAEpD,MAAM,kBAAkB,GAAoB,eAAe,CAAC;AAE5D,MAAa,qBAAsB,SAAQ,mCAAiB;IAI1D;QACE,KAAK,CAAC;YACJ,YAAY,EAAE,kBAAkB;YAChC,eAAe,EACb,wGAAwG;SAC3G,CAAC,CAAC;QAEH,IAAI,CAAC,iBAAiB,GAAG,IAAI,kCAAuB,EAAE,CAAC;QACvD,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAE3D,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,2BAA2B,GAAW,qCAAiB,CAAC,QAAQ,CAAC,sBAAsB,CAAC,SAAS,CAAE,CAAC;QAC1G,MAAM,2BAA2B,GAAiB,4BAAQ,CAAC,IAAI,CAC7D,GAAG,2BAA2B,eAAe,CAC9C,CAAC;QACF,MAAM,UAAU,GAAW,2BAA2B,CAAC,OAAO,CAAC;QAE/D,IAAI,CAAC,cAAc,CAAC,SAAS,CAC3B,mBAAQ,CAAC,IAAI,CAAC,wBAAwB,UAAU,EAAE,CAAC,GAAG,mBAAQ,CAAC,IAAI,CAAC,gCAAgC,CAAC,CACtG,CAAC;QAEF,MAAM,KAAK,CAAC,cAAc,EAAE,CAAC;IAC/B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,SAAS,CAAC,IAAI,uBAAU,CAAC,IAAI,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,SAAS,CAAC,IAAI,yBAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACxC,CAAC;CACF;AAnCD,sDAmCC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { ConsoleTerminalProvider, type ITerminal, Terminal, Colorize } from '@rushstack/terminal';\nimport { CommandLineParser } from '@rushstack/ts-command-line';\nimport { type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\n\nimport { InitAction } from './actions/InitAction';\nimport { CheckAction } from './actions/CheckAction';\n\nconst LINT_TOOL_FILENAME: 'lockfile-lint' = 'lockfile-lint';\n\nexport class LintCommandLineParser extends CommandLineParser {\n public readonly globalTerminal: ITerminal;\n private readonly _terminalProvider: ConsoleTerminalProvider;\n\n public constructor() {\n super({\n toolFilename: LINT_TOOL_FILENAME,\n toolDescription:\n 'Lockfile Lint applies configured policies to find and report dependency issues in your PNPM workspace.'\n });\n\n this._terminalProvider = new ConsoleTerminalProvider();\n this.globalTerminal = new Terminal(this._terminalProvider);\n\n this._populateActions();\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const lockfileExplorerPackageJson: IPackageJson = JsonFile.load(\n `${lockfileExplorerProjectRoot}/package.json`\n );\n const appVersion: string = lockfileExplorerPackageJson.version;\n\n this.globalTerminal.writeLine(\n Colorize.bold(`\\nRush Lockfile Lint ${appVersion}`) + Colorize.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n await super.onExecuteAsync();\n }\n\n private _populateActions(): void {\n this.addAction(new InitAction(this));\n this.addAction(new CheckAction(this));\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CheckAction.d.ts","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAW/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAOtE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAY,SAAQ,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,OAAO,CAA4C;gBAExC,MAAM,EAAE,qBAAqB;YAelC,+BAA+B;YAqC/B,mCAAmC;YA4DnC,oCAAoC;cAoBzB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAkEzD"}
1
+ {"version":3,"file":"CheckAction.d.ts","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAM/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAOtE,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,mBAAmB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC1C;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,SAAS,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,qBAAa,WAAY,SAAQ,iBAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IAEtC,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,gBAAgB,CAAgC;IACxD,OAAO,CAAC,OAAO,CAA4C;gBAExC,MAAM,EAAE,qBAAqB;YAelC,+BAA+B;YAqC/B,mCAAmC;YA4DnC,oCAAoC;cAoBzB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CAkEzD"}
@@ -6,12 +6,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.CheckAction = void 0;
9
- const terminal_1 = require("@rushstack/terminal");
10
- const ts_command_line_1 = require("@rushstack/ts-command-line");
11
- const rush_sdk_1 = require("@rushstack/rush-sdk");
12
- const path_1 = __importDefault(require("path"));
9
+ const node_path_1 = __importDefault(require("node:path"));
13
10
  const js_yaml_1 = __importDefault(require("js-yaml"));
14
11
  const semver_1 = __importDefault(require("semver"));
12
+ const rush_sdk_1 = require("@rushstack/rush-sdk");
13
+ const ts_command_line_1 = require("@rushstack/ts-command-line");
14
+ const terminal_1 = require("@rushstack/terminal");
15
15
  const node_core_library_1 = require("@rushstack/node-core-library");
16
16
  const lockfile_lint_schema_json_1 = __importDefault(require("../../../schemas/lockfile-lint.schema.json"));
17
17
  const common_1 = require("../../../constants/common");
@@ -62,7 +62,7 @@ class CheckAction extends ts_command_line_1.CommandLineAction {
62
62
  const checkedDependencyPaths = new Set();
63
63
  await Promise.all(Object.entries(importers).map(async ([relativePath, { dependencies }]) => {
64
64
  var _a;
65
- if (path_1.default.resolve(projectFolder, relativePath) === projectFolder) {
65
+ if (node_path_1.default.resolve(projectFolder, relativePath) === projectFolder) {
66
66
  const dependenciesEntries = Object.entries(dependencies !== null && dependencies !== void 0 ? dependencies : {});
67
67
  for (const [dependencyName, dependencyValue] of dependenciesEntries) {
68
68
  const fullDependencyPath = (0, shrinkwrap_1.splicePackageWithVersion)(shrinkwrapFileMajorVersion, dependencyName, typeof dependencyValue === 'string'
@@ -103,7 +103,7 @@ class CheckAction extends ts_command_line_1.CommandLineAction {
103
103
  throw new Error('The "lockfile-explorer check" must be executed in a folder that is under a Rush workspace folder');
104
104
  }
105
105
  this._rushConfiguration = rushConfiguration;
106
- const lintingFile = path_1.default.resolve(this._rushConfiguration.commonFolder, 'config', common_1.LOCKFILE_EXPLORER_FOLDERNAME, common_1.LOCKFILE_LINT_JSON_FILENAME);
106
+ const lintingFile = node_path_1.default.resolve(this._rushConfiguration.commonFolder, 'config', common_1.LOCKFILE_EXPLORER_FOLDERNAME, common_1.LOCKFILE_LINT_JSON_FILENAME);
107
107
  const { rules } = await node_core_library_1.JsonFile.loadAndValidateAsync(lintingFile, node_core_library_1.JsonSchema.fromLoadedObject(lockfile_lint_schema_json_1.default));
108
108
  const issues = [];
109
109
  await node_core_library_1.Async.forEachAsync(rules, async ({ requiredVersions, project, rule }) => {
@@ -1 +1 @@
1
- {"version":3,"file":"CheckAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,kDAA+D;AAC/D,gEAA+D;AAC/D,kDAAsG;AACtG,gDAAwB;AACxB,sDAA2B;AAC3B,oDAA4B;AAG5B,oEAA6G;AAE7G,2GAA4E;AAC5E,sDAAsG;AAEtG,0DAImC;AAkBnC,MAAa,WAAY,SAAQ,mCAAiB;IAOhD,YAAmB,MAA6B;QAC9C,KAAK,CAAC;YACJ,UAAU,EAAE,OAAO;YACnB,OAAO,EAAE,sDAAsD;YAC/D,aAAa,EACX,2DAA2D;gBAC3D,oCAA2B;gBAC3B,wDAAwD;SAC3D,CAAC,CAAC;QAEH,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;QACvC,IAAI,CAAC,gBAAgB,GAAG,IAAI,GAAG,EAAE,CAAC;QAClC,IAAI,CAAC,OAAO,GAAG,IAAI,GAAG,EAAE,CAAC;IAC3B,CAAC;IAEO,KAAK,CAAC,+BAA+B,CAC3C,0BAAkC,EAClC,QAAoD,EACpD,cAAiC,EACjC,gBAAwC,EACxC,sBAAmC;;QAEnC,IAAI,QAAQ,IAAI,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,CAAC;YACxF,sBAAsB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAC3C,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAA,gCAAmB,EAAC,0BAA0B,EAAE,cAAc,CAAC,CAAC;YAC1F,IAAI,IAAI,IAAI,gBAAgB,IAAI,CAAC,gBAAM,CAAC,SAAS,CAAC,OAAO,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACnF,MAAM,IAAI,KAAK,CACb,mBAAmB,IAAI,mBAAmB,gBAAgB,CAAC,IAAI,CAAC,IAAI;oBAClE,uBAAuB,OAAO,GAAG,CACpC,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,MAAA,QAAQ,CAAC,cAAc,CAAC,CAAC,YAAY,mCAAI,EAAE,CAAC,CAAC,GAAG,CAC7D,KAAK,EAAE,CAAC,qBAAqB,EAAE,wBAAwB,CAAC,EAAE,EAAE;gBAC1D,MAAM,IAAI,CAAC,+BAA+B,CACxC,0BAA0B,EAC1B,QAAQ,EACR,IAAA,qCAAwB,EACtB,0BAA0B,EAC1B,qBAAqB,EACrB,wBAAwB,CACJ,EACtB,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;YACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,mCAAmC,CAC/C,OAAiC,EACjC,gBAAwC;QAExC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,qBAAqB,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC;QAEtE,MAAM,aAAa,GAAW,OAAO,CAAC,aAAa,CAAC;QACpD,MAAM,QAAQ,GAAa,OAAO,CAAC,QAAQ,CAAC;QAC5C,MAAM,kBAAkB,GAAW,QAAQ,CAAC,8BAA8B,EAAE,CAAC;QAC7E,IAAI,GAAiC,CAAC;QACtC,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,EAAE,CAAC;YACzC,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAE,CAAC;QAC9C,CAAC;aAAM,CAAC;YACN,MAAM,gBAAgB,GAAW,MAAM,8BAAU,CAAC,aAAa,CAAC,kBAAkB,CAAC,CAAC;YACpF,GAAG,GAAG,iBAAI,CAAC,IAAI,CAAC,gBAAgB,CAAiC,CAAC;YAClE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,GAAG,CAAC,CAAC;QAC5C,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,GAAG,GAAG,CAAC;QACrD,MAAM,0BAA0B,GAAW,IAAA,0CAA6B,EAAC,eAAe,CAAC,CAAC;QAC1F,MAAM,sBAAsB,GAAgB,IAAI,GAAG,EAAU,CAAC;QAE9D,MAAM,OAAO,CAAC,GAAG,CACf,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE;;YACvE,IAAI,cAAI,CAAC,OAAO,CAAC,aAAa,EAAE,YAAY,CAAC,KAAK,aAAa,EAAE,CAAC;gBAChE,MAAM,mBAAmB,GAAwB,MAAM,CAAC,OAAO,CAAC,YAAY,aAAZ,YAAY,cAAZ,YAAY,GAAI,EAAE,CAAC,CAAC;gBACpF,KAAK,MAAM,CAAC,cAAc,EAAE,eAAe,CAAC,IAAI,mBAAmB,EAAE,CAAC;oBACpE,MAAM,kBAAkB,GAAsB,IAAA,qCAAwB,EACpE,0BAA0B,EAC1B,cAAc,EACd,OAAO,eAAe,KAAK,QAAQ;wBACjC,CAAC,CAAC,eAAe;wBACjB,CAAC,CACG,eAID,CAAC,OAAO,CACO,CAAC;oBACvB,IAAI,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;wBACzC,MAAM,iBAAiB,GACrB,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,cAAc,CAAC,CAAC;wBAC3D,IAAI,iBAAiB,IAAI,CAAC,CAAA,MAAA,IAAI,CAAC,gBAAgB,0CAAE,GAAG,CAAC,iBAAiB,CAAC,CAAA,EAAE,CAAC;4BACxE,IAAI,CAAC,gBAAiB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;4BACpC,MAAM,IAAI,CAAC,mCAAmC,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;wBACtF,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,CAAC,+BAA+B,CACxC,0BAA0B,EAC1B,QAAQ,EACR,kBAAkB,EAClB,gBAAgB,EAChB,sBAAsB,CACvB,CAAC;oBACJ,CAAC;gBACH,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CACH,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,oCAAoC,CAChD,gBAAwC,EACxC,WAAmB;;QAEnB,IAAI,CAAC;YACH,MAAM,OAAO,GACX,MAAA,IAAI,CAAC,kBAAkB,0CAAE,gBAAgB,CAAC,WAAW,CAAC,CAAC;YACzD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,IAAI,KAAK,CACb,sBAAsB,WAAW,uBAAuB,oCAA2B,EAAE,CACtF,CAAC;YACJ,CAAC;YACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACnC,MAAM,IAAI,CAAC,mCAAmC,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;YAC1E,OAAO,SAAS,CAAC;QACnB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO,CAAC,CAAC,OAAO,CAAC;QACnB,CAAC;IACH,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,iBAAiB,GAAkC,4BAAiB,CAAC,0BAA0B,EAAE,CAAC;QACxG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,kBAAkB,GAAG,iBAAkB,CAAC;QAE7C,MAAM,WAAW,GAAW,cAAI,CAAC,OAAO,CACtC,IAAI,CAAC,kBAAkB,CAAC,YAAY,EACpC,QAAQ,EACR,qCAA4B,EAC5B,oCAA2B,CAC5B,CAAC;QACF,MAAM,EAAE,KAAK,EAAE,GAAkB,MAAM,4BAAQ,CAAC,oBAAoB,CAClE,WAAW,EACX,8BAAU,CAAC,gBAAgB,CAAC,mCAAkB,CAAC,CAChD,CAAC;QACF,MAAM,MAAM,GAAiB,EAAE,CAAC;QAChC,MAAM,yBAAK,CAAC,YAAY,CACtB,KAAK,EACL,KAAK,EAAE,EAAE,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE;YAC5C,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,mBAAmB,CAAC,CAAC,CAAC;oBACzB,MAAM,OAAO,GAAuB,MAAM,IAAI,CAAC,oCAAoC,CACjF,gBAAgB,EAChB,OAAO,CACR,CAAC;oBACF,IAAI,OAAO,EAAE,CAAC;wBACZ,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;oBAC1C,CAAC;oBACD,MAAM;gBACR,CAAC;gBAED,OAAO,CAAC,CAAC,CAAC;oBACR,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,IAAI,CAAC,CAAC;gBACpD,CAAC;YACH,CAAC;QACH,CAAC,EACD,EAAE,WAAW,EAAE,EAAE,EAAE,CACpB,CAAC;QACF,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC;YAE3B,sBAAsB;YACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAU,EAAE;gBAC/C,IAAI,IAAI,GAAW,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;gBACtD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBACpC,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC5C,CAAC,CAAC,EAAE,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,SAAS,CACtB,mBAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,GAAG,mBAAQ,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,GAAG,IAAI,CACrF,CAAC;YACJ,CAAC;YAED,MAAM,IAAI,wCAAoB,EAAE,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,oBAAoB,CAAC,CAAC;IAC/E,CAAC;CACF;AA7MD,kCA6MC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { CommandLineAction } from '@rushstack/ts-command-line';\nimport { RushConfiguration, type RushConfigurationProject, type Subspace } from '@rushstack/rush-sdk';\nimport path from 'path';\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport type * as lockfileTypes from '@pnpm/lockfile.types';\nimport type * as pnpmTypes from '@pnpm/types';\nimport { AlreadyReportedError, Async, FileSystem, JsonFile, JsonSchema } from '@rushstack/node-core-library';\n\nimport lockfileLintSchema from '../../../schemas/lockfile-lint.schema.json';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\nimport type { LintCommandLineParser } from '../LintCommandLineParser';\nimport {\n getShrinkwrapFileMajorVersion,\n parseDependencyPath,\n splicePackageWithVersion\n} from '../../../utils/shrinkwrap';\n\nexport interface ILintRule {\n rule: 'restrict-versions';\n project: string;\n requiredVersions: Record<string, string>;\n}\n\nexport interface ILockfileLint {\n rules: ILintRule[];\n}\n\nexport interface ILintIssue {\n project: string;\n rule: string;\n message: string;\n}\n\nexport class CheckAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n private _rushConfiguration!: RushConfiguration;\n private _checkedProjects: Set<RushConfigurationProject>;\n private _docMap: Map<string, lockfileTypes.LockfileObject>;\n\n public constructor(parser: LintCommandLineParser) {\n super({\n actionName: 'check',\n summary: 'Check and report dependency issues in your workspace',\n documentation:\n 'This command applies the policies that are configured in ' +\n LOCKFILE_LINT_JSON_FILENAME +\n ', reporting any problems found in your PNPM workspace.'\n });\n\n this._terminal = parser.globalTerminal;\n this._checkedProjects = new Set();\n this._docMap = new Map();\n }\n\n private async _checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion: number,\n packages: lockfileTypes.PackageSnapshots | undefined,\n dependencyPath: pnpmTypes.DepPath,\n requiredVersions: Record<string, string>,\n checkedDependencyPaths: Set<string>\n ): Promise<void> {\n if (packages && packages[dependencyPath] && !checkedDependencyPaths.has(dependencyPath)) {\n checkedDependencyPaths.add(dependencyPath);\n const { name, version } = parseDependencyPath(shrinkwrapFileMajorVersion, dependencyPath);\n if (name in requiredVersions && !semver.satisfies(version, requiredVersions[name])) {\n throw new Error(\n `The version of \"${name}\" should match \"${requiredVersions[name]}\";` +\n ` actual version is \"${version}\"`\n );\n }\n\n await Promise.all(\n Object.entries(packages[dependencyPath].dependencies ?? {}).map(\n async ([dependencyPackageName, dependencyPackageVersion]) => {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyPackageName,\n dependencyPackageVersion\n ) as pnpmTypes.DepPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n )\n );\n }\n }\n\n private async _searchAndValidateDependenciesAsync(\n project: RushConfigurationProject,\n requiredVersions: Record<string, string>\n ): Promise<void> {\n this._terminal.writeLine(`Checking project \"${project.packageName}\"`);\n\n const projectFolder: string = project.projectFolder;\n const subspace: Subspace = project.subspace;\n const shrinkwrapFilename: string = subspace.getCommittedShrinkwrapFilePath();\n let doc: lockfileTypes.LockfileObject;\n if (this._docMap.has(shrinkwrapFilename)) {\n doc = this._docMap.get(shrinkwrapFilename)!;\n } else {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(shrinkwrapFilename);\n doc = yaml.load(pnpmLockfileText) as lockfileTypes.LockfileObject;\n this._docMap.set(shrinkwrapFilename, doc);\n }\n const { importers, lockfileVersion, packages } = doc;\n const shrinkwrapFileMajorVersion: number = getShrinkwrapFileMajorVersion(lockfileVersion);\n const checkedDependencyPaths: Set<string> = new Set<string>();\n\n await Promise.all(\n Object.entries(importers).map(async ([relativePath, { dependencies }]) => {\n if (path.resolve(projectFolder, relativePath) === projectFolder) {\n const dependenciesEntries: [string, unknown][] = Object.entries(dependencies ?? {});\n for (const [dependencyName, dependencyValue] of dependenciesEntries) {\n const fullDependencyPath: pnpmTypes.DepPath = splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyName,\n typeof dependencyValue === 'string'\n ? dependencyValue\n : (\n dependencyValue as {\n version: string;\n specifier: string;\n }\n ).version\n ) as pnpmTypes.DepPath;\n if (fullDependencyPath.includes('link:')) {\n const dependencyProject: RushConfigurationProject | undefined =\n this._rushConfiguration.getProjectByName(dependencyName);\n if (dependencyProject && !this._checkedProjects?.has(dependencyProject)) {\n this._checkedProjects!.add(project);\n await this._searchAndValidateDependenciesAsync(dependencyProject, requiredVersions);\n }\n } else {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n fullDependencyPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n }\n }\n })\n );\n }\n\n private async _performVersionRestrictionCheckAsync(\n requiredVersions: Record<string, string>,\n projectName: string\n ): Promise<string | undefined> {\n try {\n const project: RushConfigurationProject | undefined =\n this._rushConfiguration?.getProjectByName(projectName);\n if (!project) {\n throw new Error(\n `Specified project \"${projectName}\" does not exist in ${LOCKFILE_LINT_JSON_FILENAME}`\n );\n }\n this._checkedProjects.add(project);\n await this._searchAndValidateDependenciesAsync(project, requiredVersions);\n return undefined;\n } catch (e) {\n return e.message;\n }\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n this._rushConfiguration = rushConfiguration!;\n\n const lintingFile: string = path.resolve(\n this._rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n const { rules }: ILockfileLint = await JsonFile.loadAndValidateAsync(\n lintingFile,\n JsonSchema.fromLoadedObject(lockfileLintSchema)\n );\n const issues: ILintIssue[] = [];\n await Async.forEachAsync(\n rules,\n async ({ requiredVersions, project, rule }) => {\n switch (rule) {\n case 'restrict-versions': {\n const message: string | undefined = await this._performVersionRestrictionCheckAsync(\n requiredVersions,\n project\n );\n if (message) {\n issues.push({ project, rule, message });\n }\n break;\n }\n\n default: {\n throw new Error('Unsupported rule name: ' + rule);\n }\n }\n },\n { concurrency: 50 }\n );\n if (issues.length > 0) {\n this._terminal.writeLine();\n\n // Deterministic order\n for (const issue of issues.sort((a, b): number => {\n let diff: number = a.project.localeCompare(b.project);\n if (diff !== 0) {\n return diff;\n }\n diff = a.rule.localeCompare(b.rule);\n if (diff !== 0) {\n return diff;\n }\n return a.message.localeCompare(b.message);\n })) {\n this._terminal.writeLine(\n Colorize.red('PROBLEM: ') + Colorize.cyan(`[${issue.rule}] `) + issue.message + '\\n'\n );\n }\n\n throw new AlreadyReportedError();\n }\n this._terminal.writeLine(Colorize.green('SUCCESS: ') + 'All checks passed.');\n }\n}\n"]}
1
+ {"version":3,"file":"CheckAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/CheckAction.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport path from 'node:path';\n\nimport yaml from 'js-yaml';\nimport semver from 'semver';\nimport type * as lockfileTypes from '@pnpm/lockfile.types';\nimport type * as pnpmTypes from '@pnpm/types';\n\nimport { RushConfiguration, type RushConfigurationProject, type Subspace } from '@rushstack/rush-sdk';\nimport { CommandLineAction } from '@rushstack/ts-command-line';\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { AlreadyReportedError, Async, FileSystem, JsonFile, JsonSchema } from '@rushstack/node-core-library';\n\nimport lockfileLintSchema from '../../../schemas/lockfile-lint.schema.json';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\nimport type { LintCommandLineParser } from '../LintCommandLineParser';\nimport {\n getShrinkwrapFileMajorVersion,\n parseDependencyPath,\n splicePackageWithVersion\n} from '../../../utils/shrinkwrap';\n\nexport interface ILintRule {\n rule: 'restrict-versions';\n project: string;\n requiredVersions: Record<string, string>;\n}\n\nexport interface ILockfileLint {\n rules: ILintRule[];\n}\n\nexport interface ILintIssue {\n project: string;\n rule: string;\n message: string;\n}\n\nexport class CheckAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n private _rushConfiguration!: RushConfiguration;\n private _checkedProjects: Set<RushConfigurationProject>;\n private _docMap: Map<string, lockfileTypes.LockfileObject>;\n\n public constructor(parser: LintCommandLineParser) {\n super({\n actionName: 'check',\n summary: 'Check and report dependency issues in your workspace',\n documentation:\n 'This command applies the policies that are configured in ' +\n LOCKFILE_LINT_JSON_FILENAME +\n ', reporting any problems found in your PNPM workspace.'\n });\n\n this._terminal = parser.globalTerminal;\n this._checkedProjects = new Set();\n this._docMap = new Map();\n }\n\n private async _checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion: number,\n packages: lockfileTypes.PackageSnapshots | undefined,\n dependencyPath: pnpmTypes.DepPath,\n requiredVersions: Record<string, string>,\n checkedDependencyPaths: Set<string>\n ): Promise<void> {\n if (packages && packages[dependencyPath] && !checkedDependencyPaths.has(dependencyPath)) {\n checkedDependencyPaths.add(dependencyPath);\n const { name, version } = parseDependencyPath(shrinkwrapFileMajorVersion, dependencyPath);\n if (name in requiredVersions && !semver.satisfies(version, requiredVersions[name])) {\n throw new Error(\n `The version of \"${name}\" should match \"${requiredVersions[name]}\";` +\n ` actual version is \"${version}\"`\n );\n }\n\n await Promise.all(\n Object.entries(packages[dependencyPath].dependencies ?? {}).map(\n async ([dependencyPackageName, dependencyPackageVersion]) => {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyPackageName,\n dependencyPackageVersion\n ) as pnpmTypes.DepPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n )\n );\n }\n }\n\n private async _searchAndValidateDependenciesAsync(\n project: RushConfigurationProject,\n requiredVersions: Record<string, string>\n ): Promise<void> {\n this._terminal.writeLine(`Checking project \"${project.packageName}\"`);\n\n const projectFolder: string = project.projectFolder;\n const subspace: Subspace = project.subspace;\n const shrinkwrapFilename: string = subspace.getCommittedShrinkwrapFilePath();\n let doc: lockfileTypes.LockfileObject;\n if (this._docMap.has(shrinkwrapFilename)) {\n doc = this._docMap.get(shrinkwrapFilename)!;\n } else {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(shrinkwrapFilename);\n doc = yaml.load(pnpmLockfileText) as lockfileTypes.LockfileObject;\n this._docMap.set(shrinkwrapFilename, doc);\n }\n const { importers, lockfileVersion, packages } = doc;\n const shrinkwrapFileMajorVersion: number = getShrinkwrapFileMajorVersion(lockfileVersion);\n const checkedDependencyPaths: Set<string> = new Set<string>();\n\n await Promise.all(\n Object.entries(importers).map(async ([relativePath, { dependencies }]) => {\n if (path.resolve(projectFolder, relativePath) === projectFolder) {\n const dependenciesEntries: [string, unknown][] = Object.entries(dependencies ?? {});\n for (const [dependencyName, dependencyValue] of dependenciesEntries) {\n const fullDependencyPath: pnpmTypes.DepPath = splicePackageWithVersion(\n shrinkwrapFileMajorVersion,\n dependencyName,\n typeof dependencyValue === 'string'\n ? dependencyValue\n : (\n dependencyValue as {\n version: string;\n specifier: string;\n }\n ).version\n ) as pnpmTypes.DepPath;\n if (fullDependencyPath.includes('link:')) {\n const dependencyProject: RushConfigurationProject | undefined =\n this._rushConfiguration.getProjectByName(dependencyName);\n if (dependencyProject && !this._checkedProjects?.has(dependencyProject)) {\n this._checkedProjects!.add(project);\n await this._searchAndValidateDependenciesAsync(dependencyProject, requiredVersions);\n }\n } else {\n await this._checkVersionCompatibilityAsync(\n shrinkwrapFileMajorVersion,\n packages,\n fullDependencyPath,\n requiredVersions,\n checkedDependencyPaths\n );\n }\n }\n }\n })\n );\n }\n\n private async _performVersionRestrictionCheckAsync(\n requiredVersions: Record<string, string>,\n projectName: string\n ): Promise<string | undefined> {\n try {\n const project: RushConfigurationProject | undefined =\n this._rushConfiguration?.getProjectByName(projectName);\n if (!project) {\n throw new Error(\n `Specified project \"${projectName}\" does not exist in ${LOCKFILE_LINT_JSON_FILENAME}`\n );\n }\n this._checkedProjects.add(project);\n await this._searchAndValidateDependenciesAsync(project, requiredVersions);\n return undefined;\n } catch (e) {\n return e.message;\n }\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n this._rushConfiguration = rushConfiguration!;\n\n const lintingFile: string = path.resolve(\n this._rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n const { rules }: ILockfileLint = await JsonFile.loadAndValidateAsync(\n lintingFile,\n JsonSchema.fromLoadedObject(lockfileLintSchema)\n );\n const issues: ILintIssue[] = [];\n await Async.forEachAsync(\n rules,\n async ({ requiredVersions, project, rule }) => {\n switch (rule) {\n case 'restrict-versions': {\n const message: string | undefined = await this._performVersionRestrictionCheckAsync(\n requiredVersions,\n project\n );\n if (message) {\n issues.push({ project, rule, message });\n }\n break;\n }\n\n default: {\n throw new Error('Unsupported rule name: ' + rule);\n }\n }\n },\n { concurrency: 50 }\n );\n if (issues.length > 0) {\n this._terminal.writeLine();\n\n // Deterministic order\n for (const issue of issues.sort((a, b): number => {\n let diff: number = a.project.localeCompare(b.project);\n if (diff !== 0) {\n return diff;\n }\n diff = a.rule.localeCompare(b.rule);\n if (diff !== 0) {\n return diff;\n }\n return a.message.localeCompare(b.message);\n })) {\n this._terminal.writeLine(\n Colorize.red('PROBLEM: ') + Colorize.cyan(`[${issue.rule}] `) + issue.message + '\\n'\n );\n }\n\n throw new AlreadyReportedError();\n }\n this._terminal.writeLine(Colorize.green('SUCCESS: ') + 'All checks passed.');\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"InitAction.d.ts","sourceRoot":"","sources":["../../../../src/cli/lint/actions/InitAction.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAO/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGtE,qBAAa,UAAW,SAAQ,iBAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAEnB,MAAM,EAAE,qBAAqB;cAWvB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BzD"}
1
+ {"version":3,"file":"InitAction.d.ts","sourceRoot":"","sources":["../../../../src/cli/lint/actions/InitAction.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAK/D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAGtE,qBAAa,UAAW,SAAQ,iBAAiB;IAC/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;gBAEnB,MAAM,EAAE,qBAAqB;cAWvB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;CA8BzD"}
@@ -6,11 +6,11 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
6
6
  };
7
7
  Object.defineProperty(exports, "__esModule", { value: true });
8
8
  exports.InitAction = void 0;
9
+ const node_path_1 = __importDefault(require("node:path"));
9
10
  const ts_command_line_1 = require("@rushstack/ts-command-line");
10
11
  const terminal_1 = require("@rushstack/terminal");
11
12
  const rush_sdk_1 = require("@rushstack/rush-sdk");
12
13
  const node_core_library_1 = require("@rushstack/node-core-library");
13
- const path_1 = __importDefault(require("path"));
14
14
  const common_1 = require("../../../constants/common");
15
15
  class InitAction extends ts_command_line_1.CommandLineAction {
16
16
  constructor(parser) {
@@ -27,8 +27,8 @@ class InitAction extends ts_command_line_1.CommandLineAction {
27
27
  if (!rushConfiguration) {
28
28
  throw new Error('The "lockfile-explorer check" must be executed in a folder that is under a Rush workspace folder');
29
29
  }
30
- const inputFilePath = path_1.default.resolve(__dirname, '../../../assets/lint-init/lockfile-lint-template.json');
31
- const outputFilePath = path_1.default.resolve(rushConfiguration.commonFolder, 'config', common_1.LOCKFILE_EXPLORER_FOLDERNAME, common_1.LOCKFILE_LINT_JSON_FILENAME);
30
+ const inputFilePath = node_path_1.default.resolve(__dirname, '../../../assets/lint-init/lockfile-lint-template.json');
31
+ const outputFilePath = node_path_1.default.resolve(rushConfiguration.commonFolder, 'config', common_1.LOCKFILE_EXPLORER_FOLDERNAME, common_1.LOCKFILE_LINT_JSON_FILENAME);
32
32
  if (await node_core_library_1.FileSystem.existsAsync(outputFilePath)) {
33
33
  this._terminal.writeError('The output file already exists:');
34
34
  this._terminal.writeLine('\n ' + outputFilePath + '\n');
@@ -1 +1 @@
1
- {"version":3,"file":"InitAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/InitAction.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,gEAA+D;AAE/D,kDAA+D;AAC/D,kDAAwD;AACxD,oEAA0D;AAC1D,gDAAwB;AAGxB,sDAAsG;AAEtG,MAAa,UAAW,SAAQ,mCAAiB;IAG/C,YAAmB,MAA6B;QAC9C,KAAK,CAAC;YACJ,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,gBAAgB,oCAA2B,cAAc;YAClE,aAAa,EACX,kCAAkC,oCAA2B,eAAe;gBAC5E,uFAAuF;SAC1F,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;IACzC,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,iBAAiB,GAAkC,4BAAiB,CAAC,0BAA0B,EAAE,CAAC;QACxG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAW,cAAI,CAAC,OAAO,CACxC,SAAS,EACT,uDAAuD,CACxD,CAAC;QACF,MAAM,cAAc,GAAW,cAAI,CAAC,OAAO,CACzC,iBAAiB,CAAC,YAAY,EAC9B,QAAQ,EACR,qCAA4B,EAC5B,oCAA2B,CAC5B,CAAC;QAEF,IAAI,MAAM,8BAAU,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAAC,CAAC;QAC5E,MAAM,8BAAU,CAAC,aAAa,CAAC;YAC7B,UAAU,EAAE,aAAa;YACzB,eAAe,EAAE,cAAc;SAChC,CAAC,CAAC;IACL,CAAC;CACF;AA5CD,gCA4CC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { CommandLineAction } from '@rushstack/ts-command-line';\n\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { RushConfiguration } from '@rushstack/rush-sdk';\nimport { FileSystem } from '@rushstack/node-core-library';\nimport path from 'path';\n\nimport type { LintCommandLineParser } from '../LintCommandLineParser';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\n\nexport class InitAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n public constructor(parser: LintCommandLineParser) {\n super({\n actionName: 'init',\n summary: `Create a new ${LOCKFILE_LINT_JSON_FILENAME} config file`,\n documentation:\n `This command initializes a new ${LOCKFILE_LINT_JSON_FILENAME} config file.` +\n ` The created template file includes source code comments that document the settings.`\n });\n this._terminal = parser.globalTerminal;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n const inputFilePath: string = path.resolve(\n __dirname,\n '../../../assets/lint-init/lockfile-lint-template.json'\n );\n const outputFilePath: string = path.resolve(\n rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n\n if (await FileSystem.existsAsync(outputFilePath)) {\n this._terminal.writeError('The output file already exists:');\n this._terminal.writeLine('\\n ' + outputFilePath + '\\n');\n throw new Error('Unable to write output file');\n }\n\n this._terminal.writeLine(Colorize.green('Writing file: ') + outputFilePath);\n await FileSystem.copyFileAsync({\n sourcePath: inputFilePath,\n destinationPath: outputFilePath\n });\n }\n}\n"]}
1
+ {"version":3,"file":"InitAction.js","sourceRoot":"","sources":["../../../../src/cli/lint/actions/InitAction.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;AAE3D,0DAA6B;AAE7B,gEAA+D;AAC/D,kDAA+D;AAC/D,kDAAwD;AACxD,oEAA0D;AAG1D,sDAAsG;AAEtG,MAAa,UAAW,SAAQ,mCAAiB;IAG/C,YAAmB,MAA6B;QAC9C,KAAK,CAAC;YACJ,UAAU,EAAE,MAAM;YAClB,OAAO,EAAE,gBAAgB,oCAA2B,cAAc;YAClE,aAAa,EACX,kCAAkC,oCAA2B,eAAe;gBAC5E,uFAAuF;SAC1F,CAAC,CAAC;QACH,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC;IACzC,CAAC;IAEkB,KAAK,CAAC,cAAc;QACrC,MAAM,iBAAiB,GAAkC,4BAAiB,CAAC,0BAA0B,EAAE,CAAC;QACxG,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,MAAM,IAAI,KAAK,CACb,kGAAkG,CACnG,CAAC;QACJ,CAAC;QACD,MAAM,aAAa,GAAW,mBAAI,CAAC,OAAO,CACxC,SAAS,EACT,uDAAuD,CACxD,CAAC;QACF,MAAM,cAAc,GAAW,mBAAI,CAAC,OAAO,CACzC,iBAAiB,CAAC,YAAY,EAC9B,QAAQ,EACR,qCAA4B,EAC5B,oCAA2B,CAC5B,CAAC;QAEF,IAAI,MAAM,8BAAU,CAAC,WAAW,CAAC,cAAc,CAAC,EAAE,CAAC;YACjD,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,iCAAiC,CAAC,CAAC;YAC7D,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,cAAc,GAAG,IAAI,CAAC,CAAC;YACzD,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAQ,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,cAAc,CAAC,CAAC;QAC5E,MAAM,8BAAU,CAAC,aAAa,CAAC;YAC7B,UAAU,EAAE,aAAa;YACzB,eAAe,EAAE,cAAc;SAChC,CAAC,CAAC;IACL,CAAC;CACF;AA5CD,gCA4CC","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport path from 'node:path';\n\nimport { CommandLineAction } from '@rushstack/ts-command-line';\nimport { Colorize, type ITerminal } from '@rushstack/terminal';\nimport { RushConfiguration } from '@rushstack/rush-sdk';\nimport { FileSystem } from '@rushstack/node-core-library';\n\nimport type { LintCommandLineParser } from '../LintCommandLineParser';\nimport { LOCKFILE_EXPLORER_FOLDERNAME, LOCKFILE_LINT_JSON_FILENAME } from '../../../constants/common';\n\nexport class InitAction extends CommandLineAction {\n private readonly _terminal: ITerminal;\n\n public constructor(parser: LintCommandLineParser) {\n super({\n actionName: 'init',\n summary: `Create a new ${LOCKFILE_LINT_JSON_FILENAME} config file`,\n documentation:\n `This command initializes a new ${LOCKFILE_LINT_JSON_FILENAME} config file.` +\n ` The created template file includes source code comments that document the settings.`\n });\n this._terminal = parser.globalTerminal;\n }\n\n protected override async onExecuteAsync(): Promise<void> {\n const rushConfiguration: RushConfiguration | undefined = RushConfiguration.tryLoadFromDefaultLocation();\n if (!rushConfiguration) {\n throw new Error(\n 'The \"lockfile-explorer check\" must be executed in a folder that is under a Rush workspace folder'\n );\n }\n const inputFilePath: string = path.resolve(\n __dirname,\n '../../../assets/lint-init/lockfile-lint-template.json'\n );\n const outputFilePath: string = path.resolve(\n rushConfiguration.commonFolder,\n 'config',\n LOCKFILE_EXPLORER_FOLDERNAME,\n LOCKFILE_LINT_JSON_FILENAME\n );\n\n if (await FileSystem.existsAsync(outputFilePath)) {\n this._terminal.writeError('The output file already exists:');\n this._terminal.writeLine('\\n ' + outputFilePath + '\\n');\n throw new Error('Unable to write output file');\n }\n\n this._terminal.writeLine(Colorize.green('Writing file: ') + outputFilePath);\n await FileSystem.copyFileAsync({\n sourcePath: inputFilePath,\n destinationPath: outputFilePath\n });\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"PnpmfileRunner.d.ts","sourceRoot":"","sources":["../../src/graph/PnpmfileRunner.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AASjE;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,SAAS,CAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAa;gBAEhD,YAAY,EAAE,MAAM;IAmDvC;;OAEG;IACI,qBAAqB,CAC1B,WAAW,EAAE,YAAY,EACzB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,YAAY,CAAC;IAYX,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3C"}
1
+ {"version":3,"file":"PnpmfileRunner.d.ts","sourceRoot":"","sources":["../../src/graph/PnpmfileRunner.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AASjE;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,SAAS,CAAkB;IAE5B,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAa;gBAEhD,YAAY,EAAE,MAAM;IAmDvC;;OAEG;IACI,qBAAqB,CAC1B,WAAW,EAAE,YAAY,EACzB,mBAAmB,EAAE,MAAM,GAC1B,OAAO,CAAC,YAAY,CAAC;IAYX,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;CAW3C"}
@@ -1 +1 @@
1
- {"version":3,"file":"PnpmfileRunner.js","sourceRoot":"","sources":["../../src/graph/PnpmfileRunner.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { Worker } from 'node:worker_threads';\nimport * as path from 'node:path';\nimport type { IPackageJson } from '@rushstack/node-core-library';\n\nimport type { IRequestMessage, ResponseMessage } from './pnpmfileRunnerWorkerThread';\n\ninterface IPromise {\n resolve: (r: IPackageJson) => void;\n reject: (e: Error) => void;\n}\n\n/**\n * Evals `.pnpmfile.cjs` in an isolated thread, so `transformPackageAsync()` can be used to rewrite\n * package.json files. Calling `disposeAsync()` will free the loaded modules.\n */\nexport class PnpmfileRunner {\n private _worker: Worker;\n private _nextId: number = 1000;\n private _promisesById: Map<number, IPromise> = new Map();\n private _disposed: boolean = false;\n\n public logger: ((message: string) => void) | undefined = undefined;\n\n public constructor(pnpmfilePath: string) {\n this._worker = new Worker(path.join(`${__dirname}/pnpmfileRunnerWorkerThread.js`), {\n workerData: { pnpmfilePath }\n });\n\n this._worker.on('message', (message: ResponseMessage) => {\n const id: number = message.id;\n const promise: IPromise | undefined = this._promisesById.get(id);\n if (!promise) {\n return;\n }\n\n if (message.kind === 'return') {\n this._promisesById.delete(id);\n // TODO: Validate the user's readPackage() return value\n const result: IPackageJson = message.result as IPackageJson;\n promise.resolve(result);\n } else if (message.kind === 'log') {\n // No this._promisesById.delete(id) for this case\n if (this.logger) {\n this.logger(message.log);\n } else {\n console.log('.pnpmfile.cjs: ' + message.log);\n }\n } else {\n this._promisesById.delete(id);\n promise.reject(new Error(message.error || 'An unknown error occurred'));\n }\n });\n\n this._worker.on('error', (err) => {\n for (const promise of this._promisesById.values()) {\n promise.reject(err);\n }\n this._promisesById.clear();\n });\n\n this._worker.on('exit', (code) => {\n if (!this._disposed) {\n const error: Error = new Error(\n `PnpmfileRunner worker thread terminated unexpectedly with exit code ${code}`\n );\n console.error(error);\n for (const promise of this._promisesById.values()) {\n promise.reject(error);\n }\n this._promisesById.clear();\n }\n });\n }\n\n /**\n * Invokes the readPackage() hook from .pnpmfile.cjs\n */\n public transformPackageAsync(\n packageJson: IPackageJson,\n packageJsonFullPath: string\n ): Promise<IPackageJson> {\n if (this._disposed) {\n return Promise.reject(new Error('The operation failed because PnpmfileRunner has been disposed'));\n }\n\n const id: number = this._nextId++;\n return new Promise((resolve, reject) => {\n this._promisesById.set(id, { resolve, reject });\n this._worker.postMessage({ id, packageJson, packageJsonFullPath } satisfies IRequestMessage);\n });\n }\n\n public async disposeAsync(): Promise<void> {\n if (this._disposed) {\n return;\n }\n for (const pending of this._promisesById.values()) {\n pending.reject(new Error('Aborted because PnpmfileRunner was disposed'));\n }\n this._promisesById.clear();\n this._disposed = true;\n await this._worker.terminate();\n }\n}\n"]}
1
+ {"version":3,"file":"PnpmfileRunner.js","sourceRoot":"","sources":["../../src/graph/PnpmfileRunner.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nimport { Worker } from 'node:worker_threads';\nimport * as path from 'node:path';\n\nimport type { IPackageJson } from '@rushstack/node-core-library';\n\nimport type { IRequestMessage, ResponseMessage } from './pnpmfileRunnerWorkerThread';\n\ninterface IPromise {\n resolve: (r: IPackageJson) => void;\n reject: (e: Error) => void;\n}\n\n/**\n * Evals `.pnpmfile.cjs` in an isolated thread, so `transformPackageAsync()` can be used to rewrite\n * package.json files. Calling `disposeAsync()` will free the loaded modules.\n */\nexport class PnpmfileRunner {\n private _worker: Worker;\n private _nextId: number = 1000;\n private _promisesById: Map<number, IPromise> = new Map();\n private _disposed: boolean = false;\n\n public logger: ((message: string) => void) | undefined = undefined;\n\n public constructor(pnpmfilePath: string) {\n this._worker = new Worker(path.join(`${__dirname}/pnpmfileRunnerWorkerThread.js`), {\n workerData: { pnpmfilePath }\n });\n\n this._worker.on('message', (message: ResponseMessage) => {\n const id: number = message.id;\n const promise: IPromise | undefined = this._promisesById.get(id);\n if (!promise) {\n return;\n }\n\n if (message.kind === 'return') {\n this._promisesById.delete(id);\n // TODO: Validate the user's readPackage() return value\n const result: IPackageJson = message.result as IPackageJson;\n promise.resolve(result);\n } else if (message.kind === 'log') {\n // No this._promisesById.delete(id) for this case\n if (this.logger) {\n this.logger(message.log);\n } else {\n console.log('.pnpmfile.cjs: ' + message.log);\n }\n } else {\n this._promisesById.delete(id);\n promise.reject(new Error(message.error || 'An unknown error occurred'));\n }\n });\n\n this._worker.on('error', (err) => {\n for (const promise of this._promisesById.values()) {\n promise.reject(err);\n }\n this._promisesById.clear();\n });\n\n this._worker.on('exit', (code) => {\n if (!this._disposed) {\n const error: Error = new Error(\n `PnpmfileRunner worker thread terminated unexpectedly with exit code ${code}`\n );\n console.error(error);\n for (const promise of this._promisesById.values()) {\n promise.reject(error);\n }\n this._promisesById.clear();\n }\n });\n }\n\n /**\n * Invokes the readPackage() hook from .pnpmfile.cjs\n */\n public transformPackageAsync(\n packageJson: IPackageJson,\n packageJsonFullPath: string\n ): Promise<IPackageJson> {\n if (this._disposed) {\n return Promise.reject(new Error('The operation failed because PnpmfileRunner has been disposed'));\n }\n\n const id: number = this._nextId++;\n return new Promise((resolve, reject) => {\n this._promisesById.set(id, { resolve, reject });\n this._worker.postMessage({ id, packageJson, packageJsonFullPath } satisfies IRequestMessage);\n });\n }\n\n public async disposeAsync(): Promise<void> {\n if (this._disposed) {\n return;\n }\n for (const pending of this._promisesById.values()) {\n pending.reject(new Error('Aborted because PnpmfileRunner was disposed'));\n }\n this._promisesById.clear();\n this._disposed = true;\n await this._worker.terminate();\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"lfxGraphLoader.d.ts","sourceRoot":"","sources":["../../src/graph/lfxGraphLoader.ts"],"names":[],"mappings":"AAOA,OAAO,EAGL,QAAQ,EAKR,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AA2VhC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,GAAG,QAAQ,CAkInG"}
1
+ {"version":3,"file":"lfxGraphLoader.d.ts","sourceRoot":"","sources":["../../src/graph/lfxGraphLoader.ts"],"names":[],"mappings":"AAQA,OAAO,EAGL,QAAQ,EAKR,KAAK,iBAAiB,EACvB,MAAM,wBAAwB,CAAC;AAgahC;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,OAAO,EAAE,SAAS,EAAE,iBAAiB,GAAG,QAAQ,CA4KnG"}