@rushstack/lockfile-explorer 1.4.16 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/lockfile-explorer +1 -1
- package/bin/lockfile-lint +2 -0
- package/lib/assets/lint-init/lockfile-lint-template.json +42 -0
- package/lib/cli/explorer/ExplorerCommandLineParser.d.ts +12 -0
- package/lib/cli/explorer/ExplorerCommandLineParser.d.ts.map +1 -0
- package/lib/cli/explorer/ExplorerCommandLineParser.js +205 -0
- package/lib/cli/explorer/ExplorerCommandLineParser.js.map +1 -0
- package/lib/cli/lint/LintCommandLineParser.d.ts +10 -0
- package/lib/cli/lint/LintCommandLineParser.d.ts.map +1 -0
- package/lib/cli/lint/LintCommandLineParser.js +35 -0
- package/lib/cli/lint/LintCommandLineParser.js.map +1 -0
- package/lib/cli/lint/actions/CheckAction.d.ts +27 -0
- package/lib/cli/lint/actions/CheckAction.d.ts.map +1 -0
- package/lib/cli/lint/actions/CheckAction.js +145 -0
- package/lib/cli/lint/actions/CheckAction.js.map +1 -0
- package/lib/cli/lint/actions/InitAction.d.ts +8 -0
- package/lib/cli/lint/actions/InitAction.d.ts.map +1 -0
- package/lib/cli/lint/actions/InitAction.js +45 -0
- package/lib/cli/lint/actions/InitAction.js.map +1 -0
- package/lib/constants/common.d.ts +3 -0
- package/lib/constants/common.d.ts.map +1 -0
- package/lib/constants/common.js +8 -0
- package/lib/constants/common.js.map +1 -0
- package/lib/schemas/lockfile-lint.schema.json +45 -0
- package/lib/start-explorer.d.ts +2 -0
- package/lib/start-explorer.d.ts.map +1 -0
- package/lib/start-explorer.js +8 -0
- package/lib/start-explorer.js.map +1 -0
- package/lib/start-lint.d.ts +2 -0
- package/lib/start-lint.d.ts.map +1 -0
- package/lib/start-lint.js +8 -0
- package/lib/start-lint.js.map +1 -0
- package/lib/{init.d.ts → utils/init.d.ts} +1 -1
- package/lib/utils/init.d.ts.map +1 -0
- package/lib/{init.js → utils/init.js} +1 -1
- package/lib/utils/init.js.map +1 -0
- package/lib/utils/shrinkwrap.d.ts +11 -0
- package/lib/utils/shrinkwrap.d.ts.map +1 -0
- package/lib/{utils.js → utils/shrinkwrap.js} +37 -2
- package/lib/utils/shrinkwrap.js.map +1 -0
- package/package.json +14 -8
- package/lib/commandLine.d.ts +0 -7
- package/lib/commandLine.d.ts.map +0 -1
- package/lib/commandLine.js +0 -53
- package/lib/commandLine.js.map +0 -1
- package/lib/commandLine.test.d.ts +0 -2
- package/lib/commandLine.test.d.ts.map +0 -1
- package/lib/commandLine.test.js.map +0 -1
- package/lib/init.d.ts.map +0 -1
- package/lib/init.js.map +0 -1
- package/lib/start.d.ts +0 -2
- package/lib/start.d.ts.map +0 -1
- package/lib/start.js +0 -215
- package/lib/start.js.map +0 -1
- package/lib/utils.d.ts +0 -2
- package/lib/utils.d.ts.map +0 -1
- package/lib/utils.js.map +0 -1
package/lib/start.js
DELETED
|
@@ -1,215 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.
|
|
3
|
-
// See LICENSE in the project root for license information.
|
|
4
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
5
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
6
|
-
};
|
|
7
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
const express_1 = __importDefault(require("express"));
|
|
9
|
-
const js_yaml_1 = __importDefault(require("js-yaml"));
|
|
10
|
-
const cors_1 = __importDefault(require("cors"));
|
|
11
|
-
const process_1 = __importDefault(require("process"));
|
|
12
|
-
const open_1 = __importDefault(require("open"));
|
|
13
|
-
const update_notifier_1 = __importDefault(require("update-notifier"));
|
|
14
|
-
const node_core_library_1 = require("@rushstack/node-core-library");
|
|
15
|
-
const node_core_library_2 = require("@rushstack/node-core-library");
|
|
16
|
-
const terminal_1 = require("@rushstack/terminal");
|
|
17
|
-
const utils_1 = require("./utils");
|
|
18
|
-
const init_1 = require("./init");
|
|
19
|
-
const commandLine_1 = require("./commandLine");
|
|
20
|
-
function startApp(debugMode) {
|
|
21
|
-
var _a;
|
|
22
|
-
const lockfileExplorerProjectRoot = node_core_library_2.PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname);
|
|
23
|
-
const lockfileExplorerPackageJson = node_core_library_2.JsonFile.load(`${lockfileExplorerProjectRoot}/package.json`);
|
|
24
|
-
const appVersion = lockfileExplorerPackageJson.version;
|
|
25
|
-
console.log(terminal_1.Colorize.bold(`\nRush Lockfile Explorer ${appVersion}`) + terminal_1.Colorize.cyan(' - https://lfx.rushstack.io/\n'));
|
|
26
|
-
(0, update_notifier_1.default)({
|
|
27
|
-
pkg: lockfileExplorerPackageJson,
|
|
28
|
-
// Normally update-notifier waits a day or so before it starts displaying upgrade notices.
|
|
29
|
-
// In debug mode, show the notice right away.
|
|
30
|
-
updateCheckInterval: debugMode ? 0 : undefined
|
|
31
|
-
}).notify({
|
|
32
|
-
// Make sure it says "-g" in the "npm install" example command line
|
|
33
|
-
isGlobal: true,
|
|
34
|
-
// Show the notice immediately, rather than waiting for process.onExit()
|
|
35
|
-
defer: false
|
|
36
|
-
});
|
|
37
|
-
const PORT = 8091;
|
|
38
|
-
// Must not have a trailing slash
|
|
39
|
-
const SERVICE_URL = `http://localhost:${PORT}`;
|
|
40
|
-
const result = (0, commandLine_1.parseCommandLine)(process_1.default.argv.slice(2));
|
|
41
|
-
if (result.showedHelp) {
|
|
42
|
-
return;
|
|
43
|
-
}
|
|
44
|
-
if (result.error) {
|
|
45
|
-
console.error('\n' + terminal_1.Colorize.red('ERROR: ' + result.error));
|
|
46
|
-
console.error('\nFor help, use: ' + terminal_1.Colorize.yellow('lockfile-explorer --help'));
|
|
47
|
-
process_1.default.exitCode = 1;
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
const subspaceName = (_a = result.subspace) !== null && _a !== void 0 ? _a : 'default';
|
|
51
|
-
const appState = (0, init_1.init)({ lockfileExplorerProjectRoot, appVersion, debugMode, subspaceName });
|
|
52
|
-
// Important: This must happen after init() reads the current working directory
|
|
53
|
-
process_1.default.chdir(appState.lockfileExplorerProjectRoot);
|
|
54
|
-
const distFolderPath = `${appState.lockfileExplorerProjectRoot}/dist`;
|
|
55
|
-
const app = (0, express_1.default)();
|
|
56
|
-
app.use(express_1.default.json());
|
|
57
|
-
app.use((0, cors_1.default)());
|
|
58
|
-
// Variable used to check if the front-end client is still connected
|
|
59
|
-
let awaitingFirstConnect = true;
|
|
60
|
-
let isClientConnected = false;
|
|
61
|
-
let disconnected = false;
|
|
62
|
-
setInterval(() => {
|
|
63
|
-
if (!isClientConnected && !awaitingFirstConnect && !disconnected) {
|
|
64
|
-
console.log(terminal_1.Colorize.red('The client has disconnected!'));
|
|
65
|
-
console.log(`Please open a browser window at http://localhost:${PORT}/app`);
|
|
66
|
-
disconnected = true;
|
|
67
|
-
}
|
|
68
|
-
else if (!awaitingFirstConnect) {
|
|
69
|
-
isClientConnected = false;
|
|
70
|
-
}
|
|
71
|
-
}, 4000);
|
|
72
|
-
// This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.
|
|
73
|
-
app.get('/initappcontext.js', (req, res) => {
|
|
74
|
-
const appContext = {
|
|
75
|
-
serviceUrl: SERVICE_URL,
|
|
76
|
-
appVersion: appState.appVersion,
|
|
77
|
-
debugMode: process_1.default.argv.indexOf('--debug') >= 0
|
|
78
|
-
};
|
|
79
|
-
const sourceCode = [
|
|
80
|
-
`console.log('Loaded initappcontext.js');`,
|
|
81
|
-
`appContext = ${JSON.stringify(appContext)}`
|
|
82
|
-
].join('\n');
|
|
83
|
-
res.type('application/javascript').send(sourceCode);
|
|
84
|
-
});
|
|
85
|
-
app.use('/', express_1.default.static(distFolderPath));
|
|
86
|
-
app.use('/favicon.ico', express_1.default.static(distFolderPath, { index: 'favicon.ico' }));
|
|
87
|
-
app.get('/api/lockfile', async (req, res) => {
|
|
88
|
-
const pnpmLockfileText = await node_core_library_2.FileSystem.readFileAsync(appState.pnpmLockfileLocation);
|
|
89
|
-
const doc = js_yaml_1.default.load(pnpmLockfileText);
|
|
90
|
-
const { packages, lockfileVersion } = doc;
|
|
91
|
-
let shrinkwrapFileMajorVersion;
|
|
92
|
-
if (typeof lockfileVersion === 'string') {
|
|
93
|
-
const isDotIncluded = lockfileVersion.includes('.');
|
|
94
|
-
shrinkwrapFileMajorVersion = parseInt(lockfileVersion.substring(0, isDotIncluded ? lockfileVersion.indexOf('.') : undefined), 10);
|
|
95
|
-
}
|
|
96
|
-
else if (typeof lockfileVersion === 'number') {
|
|
97
|
-
shrinkwrapFileMajorVersion = Math.floor(lockfileVersion);
|
|
98
|
-
}
|
|
99
|
-
else {
|
|
100
|
-
shrinkwrapFileMajorVersion = 0;
|
|
101
|
-
}
|
|
102
|
-
if (shrinkwrapFileMajorVersion < 5 || shrinkwrapFileMajorVersion > 6) {
|
|
103
|
-
throw new Error('The current lockfile version is not supported.');
|
|
104
|
-
}
|
|
105
|
-
if (packages && shrinkwrapFileMajorVersion === 6) {
|
|
106
|
-
const updatedPackages = {};
|
|
107
|
-
for (const [dependencyPath, dependency] of Object.entries(packages)) {
|
|
108
|
-
updatedPackages[(0, utils_1.convertLockfileV6DepPathToV5DepPath)(dependencyPath)] = dependency;
|
|
109
|
-
}
|
|
110
|
-
doc.packages = updatedPackages;
|
|
111
|
-
}
|
|
112
|
-
res.send({
|
|
113
|
-
doc,
|
|
114
|
-
subspaceName
|
|
115
|
-
});
|
|
116
|
-
});
|
|
117
|
-
app.get('/api/health', (req, res) => {
|
|
118
|
-
awaitingFirstConnect = false;
|
|
119
|
-
isClientConnected = true;
|
|
120
|
-
if (disconnected) {
|
|
121
|
-
disconnected = false;
|
|
122
|
-
console.log(terminal_1.Colorize.green('The client has reconnected!'));
|
|
123
|
-
}
|
|
124
|
-
res.status(200).send();
|
|
125
|
-
});
|
|
126
|
-
app.post('/api/package-json', async (req, res) => {
|
|
127
|
-
const { projectPath } = req.body;
|
|
128
|
-
const fileLocation = `${appState.projectRoot}/${projectPath}/package.json`;
|
|
129
|
-
let packageJsonText;
|
|
130
|
-
try {
|
|
131
|
-
packageJsonText = await node_core_library_2.FileSystem.readFileAsync(fileLocation);
|
|
132
|
-
}
|
|
133
|
-
catch (e) {
|
|
134
|
-
if (node_core_library_2.FileSystem.isNotExistError(e)) {
|
|
135
|
-
return res.status(404).send({
|
|
136
|
-
message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,
|
|
137
|
-
error: `No package.json in location: ${projectPath}`
|
|
138
|
-
});
|
|
139
|
-
}
|
|
140
|
-
else {
|
|
141
|
-
throw e;
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
res.send(packageJsonText);
|
|
145
|
-
});
|
|
146
|
-
app.get('/api/pnpmfile', async (req, res) => {
|
|
147
|
-
let pnpmfile;
|
|
148
|
-
try {
|
|
149
|
-
pnpmfile = await node_core_library_2.FileSystem.readFileAsync(appState.pnpmfileLocation);
|
|
150
|
-
}
|
|
151
|
-
catch (e) {
|
|
152
|
-
if (node_core_library_2.FileSystem.isNotExistError(e)) {
|
|
153
|
-
return res.status(404).send({
|
|
154
|
-
message: `Could not load pnpmfile file in this repo.`,
|
|
155
|
-
error: `No .pnpmifile.cjs found.`
|
|
156
|
-
});
|
|
157
|
-
}
|
|
158
|
-
else {
|
|
159
|
-
throw e;
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
res.send(pnpmfile);
|
|
163
|
-
});
|
|
164
|
-
app.post('/api/package-spec', async (req, res) => {
|
|
165
|
-
const { projectPath } = req.body;
|
|
166
|
-
const fileLocation = `${appState.projectRoot}/${projectPath}/package.json`;
|
|
167
|
-
let packageJson;
|
|
168
|
-
try {
|
|
169
|
-
packageJson = await node_core_library_2.JsonFile.loadAsync(fileLocation);
|
|
170
|
-
}
|
|
171
|
-
catch (e) {
|
|
172
|
-
if (node_core_library_2.FileSystem.isNotExistError(e)) {
|
|
173
|
-
return res.status(404).send({
|
|
174
|
-
message: `Could not load package.json file in location: ${projectPath}`
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
else {
|
|
178
|
-
throw e;
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
const { hooks: { readPackage } } = require(appState.pnpmfileLocation);
|
|
182
|
-
const parsedPackage = readPackage(packageJson, {});
|
|
183
|
-
res.send(parsedPackage);
|
|
184
|
-
});
|
|
185
|
-
app.listen(PORT, async () => {
|
|
186
|
-
console.log(`App launched on ${SERVICE_URL}`);
|
|
187
|
-
if (!appState.debugMode) {
|
|
188
|
-
try {
|
|
189
|
-
// Launch the web browser
|
|
190
|
-
await (0, open_1.default)(SERVICE_URL);
|
|
191
|
-
}
|
|
192
|
-
catch (e) {
|
|
193
|
-
console.error('Error launching browser: ' + e.toString());
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
const debugMode = process_1.default.argv.indexOf('--debug') >= 0;
|
|
199
|
-
if (debugMode) {
|
|
200
|
-
// Display the full callstack for errors
|
|
201
|
-
startApp(debugMode);
|
|
202
|
-
}
|
|
203
|
-
else {
|
|
204
|
-
// Catch exceptions and report them nicely
|
|
205
|
-
try {
|
|
206
|
-
startApp(debugMode);
|
|
207
|
-
}
|
|
208
|
-
catch (error) {
|
|
209
|
-
if (!(error instanceof node_core_library_1.AlreadyReportedError)) {
|
|
210
|
-
console.error();
|
|
211
|
-
console.error(terminal_1.Colorize.red('ERROR: ' + error.message));
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
}
|
|
215
|
-
//# sourceMappingURL=start.js.map
|
package/lib/start.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../src/start.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 { AlreadyReportedError } from '@rushstack/node-core-library';\nimport { FileSystem, type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\nimport type { IAppContext } from '@rushstack/lockfile-explorer-web/lib/AppContext';\nimport { Colorize } from '@rushstack/terminal';\nimport type { Lockfile } from '@pnpm/lockfile-types';\n\nimport { convertLockfileV6DepPathToV5DepPath } from './utils';\nimport { init } from './init';\nimport type { IAppState } from './state';\nimport { type ICommandLine, parseCommandLine } from './commandLine';\n\nfunction startApp(debugMode: boolean): 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 console.log(\n Colorize.bold(`\\nRush Lockfile Explorer ${appVersion}`) + 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: debugMode ? 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 result: ICommandLine = parseCommandLine(process.argv.slice(2));\n if (result.showedHelp) {\n return;\n }\n\n if (result.error) {\n console.error('\\n' + Colorize.red('ERROR: ' + result.error));\n console.error('\\nFor help, use: ' + Colorize.yellow('lockfile-explorer --help'));\n process.exitCode = 1;\n return;\n }\n\n const subspaceName: string = result.subspace ?? 'default';\n\n const appState: IAppState = init({ lockfileExplorerProjectRoot, appVersion, debugMode, subspaceName });\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: process.argv.indexOf('--debug') >= 0\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/lockfile', async (req: express.Request, res: express.Response) => {\n const pnpmLockfileText: string = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\n const doc = yaml.load(pnpmLockfileText) as Lockfile;\n const { packages, lockfileVersion } = doc;\n\n let shrinkwrapFileMajorVersion: number;\n if (typeof lockfileVersion === 'string') {\n const isDotIncluded: boolean = lockfileVersion.includes('.');\n shrinkwrapFileMajorVersion = parseInt(\n lockfileVersion.substring(0, isDotIncluded ? lockfileVersion.indexOf('.') : undefined),\n 10\n );\n } else if (typeof lockfileVersion === 'number') {\n shrinkwrapFileMajorVersion = Math.floor(lockfileVersion);\n } else {\n shrinkwrapFileMajorVersion = 0;\n }\n\n if (shrinkwrapFileMajorVersion < 5 || shrinkwrapFileMajorVersion > 6) {\n throw new Error('The current lockfile version is not supported.');\n }\n\n if (packages && shrinkwrapFileMajorVersion === 6) {\n const updatedPackages: Lockfile['packages'] = {};\n for (const [dependencyPath, dependency] of Object.entries(packages)) {\n updatedPackages[convertLockfileV6DepPathToV5DepPath(dependencyPath)] = dependency;\n }\n doc.packages = updatedPackages;\n }\n\n res.send({\n doc,\n subspaceName\n });\n });\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.post(\n '/api/package-json',\n async (req: express.Request<{}, {}, { projectPath: string }, {}>, res: express.Response) => {\n const { projectPath } = req.body;\n const fileLocation = `${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 let pnpmfile: string;\n try {\n pnpmfile = await FileSystem.readFileAsync(appState.pnpmfileLocation);\n } catch (e) {\n if (FileSystem.isNotExistError(e)) {\n return res.status(404).send({\n message: `Could not load pnpmfile file in this repo.`,\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 = `${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 const {\n hooks: { readPackage }\n } = require(appState.pnpmfileLocation);\n const parsedPackage = readPackage(packageJson, {});\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 console.error('Error launching browser: ' + e.toString());\n }\n }\n });\n}\n\nconst debugMode: boolean = process.argv.indexOf('--debug') >= 0;\nif (debugMode) {\n // Display the full callstack for errors\n startApp(debugMode);\n} else {\n // Catch exceptions and report them nicely\n try {\n startApp(debugMode);\n } catch (error) {\n if (!(error instanceof AlreadyReportedError)) {\n console.error();\n console.error(Colorize.red('ERROR: ' + error.message));\n }\n }\n}\n"]}
|
package/lib/utils.d.ts
DELETED
package/lib/utils.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAKA,wBAAgB,mCAAmC,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAK9E"}
|
package/lib/utils.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;;;;;;;;;;;;;;;;;;;;;;;;AAE3D,0DAA4C;AAE5C,SAAgB,mCAAmC,CAAC,UAAkB;IACpE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,UAAU,CAAC;IACtF,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,GAAG,EAAE,CAAC,kBAAkB,CAAC,UAAU,CAAC;QAAE,OAAO,UAAU,CAAC;IAC7F,OAAO,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AALD,kFAKC","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 * as dp from '@pnpm/dependency-path';\n\nexport function convertLockfileV6DepPathToV5DepPath(newDepPath: string): string {\n if (!newDepPath.includes('@', 2) || newDepPath.startsWith('file:')) return newDepPath;\n const index = newDepPath.indexOf('@', newDepPath.indexOf('/@') + 2);\n if (newDepPath.includes('(') && index > dp.indexOfPeersSuffix(newDepPath)) return newDepPath;\n return `${newDepPath.substring(0, index)}/${newDepPath.substring(index + 1)}`;\n}\n"]}
|