@rushstack/lockfile-explorer 0.1.8 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/714.039cce649b76617abe19.js +2 -0
- package/dist/{414.f8e7585f91bc428fbe8e.js.LICENSE.txt → 714.039cce649b76617abe19.js.LICENSE.txt} +0 -0
- package/dist/app.631c08041cc6ac4d8695.css +1 -0
- package/dist/app.885644ef8b2a5e4ad56a.js +1 -0
- package/dist/index.html +1 -1
- package/dist/rush-themed-ui.js +2 -0
- package/lib/init.d.ts +5 -1
- package/lib/init.d.ts.map +1 -1
- package/lib/init.js +6 -5
- package/lib/init.js.map +1 -1
- package/lib/start.js +152 -112
- package/lib/start.js.map +1 -1
- package/lib/state/index.d.ts +1 -0
- package/lib/state/index.d.ts.map +1 -1
- package/lib/state/index.js.map +1 -1
- package/package.json +4 -3
- package/dist/414.f8e7585f91bc428fbe8e.js +0 -2
- package/dist/app.1d93099dbf4344c15207.css +0 -1
- package/dist/app.f2224556a037be915214.js +0 -1
package/lib/start.js
CHANGED
|
@@ -15,128 +15,168 @@ const update_notifier_1 = __importDefault(require("update-notifier"));
|
|
|
15
15
|
const node_core_library_1 = require("@rushstack/node-core-library");
|
|
16
16
|
const package_json_1 = __importDefault(require("../package.json"));
|
|
17
17
|
const init_1 = require("./init");
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
18
|
+
const node_core_library_2 = require("@rushstack/node-core-library");
|
|
19
|
+
function startApp(debugMode) {
|
|
20
|
+
const lockfileExplorerProjectRoot = node_core_library_1.PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname);
|
|
21
|
+
const appVersion = node_core_library_1.JsonFile.load(`${lockfileExplorerProjectRoot}/package.json`).version;
|
|
22
|
+
console.log(safe_1.default.bold(`\nRush Lockfile Explorer ${appVersion}`) + safe_1.default.cyan(' - https://lfx.rushstack.io/\n'));
|
|
23
|
+
(0, update_notifier_1.default)({
|
|
24
|
+
pkg: package_json_1.default,
|
|
25
|
+
// Normally update-notifier waits a day or so before it starts displaying upgrade notices.
|
|
26
|
+
// In debug mode, show the notice right away.
|
|
27
|
+
updateCheckInterval: debugMode ? 0 : undefined
|
|
28
|
+
}).notify({
|
|
29
|
+
// Make sure it says "-g" in the "npm install" example command line
|
|
30
|
+
isGlobal: true,
|
|
31
|
+
// Show the notice immediately, rather than waiting for process.onExit()
|
|
32
|
+
defer: false
|
|
33
|
+
});
|
|
34
|
+
const PORT = 8091;
|
|
35
|
+
// Must not have a trailing slash
|
|
36
|
+
const SERVICE_URL = `http://localhost:${PORT}`;
|
|
37
|
+
// TODO: Later if we introduce more CLI parameters, switch to a proper CLI parser
|
|
38
|
+
const args = process_1.default.argv.slice(2);
|
|
39
|
+
if (args.length > 0 && args[0] !== '--debug') {
|
|
40
|
+
console.log('Usage: lockfile-explorer [--debug]\n');
|
|
41
|
+
console.log('The "lfx" command is a shorthand alias for "lockfile-explorer".');
|
|
42
|
+
console.log('See the project website for documentation and support.\n');
|
|
43
|
+
throw new node_core_library_2.AlreadyReportedError();
|
|
37
44
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
app.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
});
|
|
55
|
-
app.use('/', express_1.default.static(distFolderPath));
|
|
56
|
-
app.use('/favicon.ico', express_1.default.static(distFolderPath, { index: 'favicon.ico' }));
|
|
57
|
-
app.get('/api/lockfile', async (req, res) => {
|
|
58
|
-
const pnpmLockfileText = await node_core_library_1.FileSystem.readFileAsync(appState.pnpmLockfileLocation);
|
|
59
|
-
const doc = js_yaml_1.default.load(pnpmLockfileText);
|
|
60
|
-
res.send(doc);
|
|
61
|
-
});
|
|
62
|
-
app.get('/api/health', (req, res) => {
|
|
63
|
-
awaitingFirstConnect = false;
|
|
64
|
-
isClientConnected = true;
|
|
65
|
-
if (disconnected) {
|
|
66
|
-
disconnected = false;
|
|
67
|
-
console.log(safe_1.default.green('The client has reconnected!'));
|
|
68
|
-
}
|
|
69
|
-
res.status(200).send();
|
|
70
|
-
});
|
|
71
|
-
app.post('/api/package-json', async (req, res) => {
|
|
72
|
-
const { projectPath } = req.body;
|
|
73
|
-
const fileLocation = `${appState.projectRoot}/${projectPath}/package.json`;
|
|
74
|
-
let packageJsonText;
|
|
75
|
-
try {
|
|
76
|
-
packageJsonText = await node_core_library_1.FileSystem.readFileAsync(fileLocation);
|
|
77
|
-
}
|
|
78
|
-
catch (e) {
|
|
79
|
-
if (node_core_library_1.FileSystem.isNotExistError(e)) {
|
|
80
|
-
return res.status(404).send({
|
|
81
|
-
message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,
|
|
82
|
-
error: `No package.json in location: ${projectPath}`
|
|
83
|
-
});
|
|
45
|
+
const appState = (0, init_1.init)({ lockfileExplorerProjectRoot, appVersion, debugMode });
|
|
46
|
+
// Important: This must happen after init() reads the current working directory
|
|
47
|
+
process_1.default.chdir(appState.lockfileExplorerProjectRoot);
|
|
48
|
+
const distFolderPath = `${appState.lockfileExplorerProjectRoot}/dist`;
|
|
49
|
+
const app = (0, express_1.default)();
|
|
50
|
+
app.use(express_1.default.json());
|
|
51
|
+
app.use((0, cors_1.default)());
|
|
52
|
+
// Variable used to check if the front-end client is still connected
|
|
53
|
+
let awaitingFirstConnect = true;
|
|
54
|
+
let isClientConnected = false;
|
|
55
|
+
let disconnected = false;
|
|
56
|
+
setInterval(() => {
|
|
57
|
+
if (!isClientConnected && !awaitingFirstConnect && !disconnected) {
|
|
58
|
+
console.log(safe_1.default.red('The client has disconnected!'));
|
|
59
|
+
console.log(`Please open a browser window at http://localhost:${PORT}/app`);
|
|
60
|
+
disconnected = true;
|
|
84
61
|
}
|
|
85
|
-
else {
|
|
86
|
-
|
|
62
|
+
else if (!awaitingFirstConnect) {
|
|
63
|
+
isClientConnected = false;
|
|
87
64
|
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
65
|
+
}, 4000);
|
|
66
|
+
// This takes precedence over the `/app` static route, which also has an `initappcontext.js` file.
|
|
67
|
+
app.get('/initappcontext.js', (req, res) => {
|
|
68
|
+
const appContext = {
|
|
69
|
+
serviceUrl: SERVICE_URL,
|
|
70
|
+
appVersion: appState.appVersion,
|
|
71
|
+
debugMode: process_1.default.argv.indexOf('--debug') >= 0
|
|
72
|
+
};
|
|
73
|
+
const sourceCode = [
|
|
74
|
+
`console.log('Loaded initappcontext.js');`,
|
|
75
|
+
`appContext = ${JSON.stringify(appContext)}`
|
|
76
|
+
].join('\n');
|
|
77
|
+
res.type('application/javascript').send(sourceCode);
|
|
78
|
+
});
|
|
79
|
+
app.use('/', express_1.default.static(distFolderPath));
|
|
80
|
+
app.use('/favicon.ico', express_1.default.static(distFolderPath, { index: 'favicon.ico' }));
|
|
81
|
+
app.get('/api/lockfile', async (req, res) => {
|
|
82
|
+
const pnpmLockfileText = await node_core_library_1.FileSystem.readFileAsync(appState.pnpmLockfileLocation);
|
|
83
|
+
const doc = js_yaml_1.default.load(pnpmLockfileText);
|
|
84
|
+
res.send(doc);
|
|
85
|
+
});
|
|
86
|
+
app.get('/api/health', (req, res) => {
|
|
87
|
+
awaitingFirstConnect = false;
|
|
88
|
+
isClientConnected = true;
|
|
89
|
+
if (disconnected) {
|
|
90
|
+
disconnected = false;
|
|
91
|
+
console.log(safe_1.default.green('The client has reconnected!'));
|
|
102
92
|
}
|
|
103
|
-
|
|
104
|
-
|
|
93
|
+
res.status(200).send();
|
|
94
|
+
});
|
|
95
|
+
app.post('/api/package-json', async (req, res) => {
|
|
96
|
+
const { projectPath } = req.body;
|
|
97
|
+
const fileLocation = `${appState.projectRoot}/${projectPath}/package.json`;
|
|
98
|
+
let packageJsonText;
|
|
99
|
+
try {
|
|
100
|
+
packageJsonText = await node_core_library_1.FileSystem.readFileAsync(fileLocation);
|
|
105
101
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
catch (e) {
|
|
117
|
-
if (node_core_library_1.FileSystem.isNotExistError(e)) {
|
|
118
|
-
return res.status(404).send({
|
|
119
|
-
message: `Could not load package.json file in location: ${projectPath}`
|
|
120
|
-
});
|
|
102
|
+
catch (e) {
|
|
103
|
+
if (node_core_library_1.FileSystem.isNotExistError(e)) {
|
|
104
|
+
return res.status(404).send({
|
|
105
|
+
message: `Could not load package.json file for this package. Have you installed all the dependencies for this workspace?`,
|
|
106
|
+
error: `No package.json in location: ${projectPath}`
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
else {
|
|
110
|
+
throw e;
|
|
111
|
+
}
|
|
121
112
|
}
|
|
122
|
-
|
|
123
|
-
|
|
113
|
+
res.send(packageJsonText);
|
|
114
|
+
});
|
|
115
|
+
app.get('/api/pnpmfile', async (req, res) => {
|
|
116
|
+
let pnpmfile;
|
|
117
|
+
try {
|
|
118
|
+
pnpmfile = await node_core_library_1.FileSystem.readFileAsync(appState.pnpmfileLocation);
|
|
124
119
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
120
|
+
catch (e) {
|
|
121
|
+
if (node_core_library_1.FileSystem.isNotExistError(e)) {
|
|
122
|
+
return res.status(404).send({
|
|
123
|
+
message: `Could not load pnpmfile file in this repo.`,
|
|
124
|
+
error: `No .pnpmifile.cjs found.`
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
throw e;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
res.send(pnpmfile);
|
|
132
|
+
});
|
|
133
|
+
app.post('/api/package-spec', async (req, res) => {
|
|
134
|
+
const { projectPath } = req.body;
|
|
135
|
+
const fileLocation = `${appState.projectRoot}/${projectPath}/package.json`;
|
|
136
|
+
let packageJson;
|
|
133
137
|
try {
|
|
134
|
-
|
|
135
|
-
await (0, open_1.default)(SERVICE_URL);
|
|
138
|
+
packageJson = await node_core_library_1.JsonFile.loadAsync(fileLocation);
|
|
136
139
|
}
|
|
137
140
|
catch (e) {
|
|
138
|
-
|
|
141
|
+
if (node_core_library_1.FileSystem.isNotExistError(e)) {
|
|
142
|
+
return res.status(404).send({
|
|
143
|
+
message: `Could not load package.json file in location: ${projectPath}`
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
throw e;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
const { hooks: { readPackage } } = require(appState.pnpmfileLocation);
|
|
151
|
+
const parsedPackage = readPackage(packageJson);
|
|
152
|
+
res.send(parsedPackage);
|
|
153
|
+
});
|
|
154
|
+
app.listen(PORT, async () => {
|
|
155
|
+
console.log(`App launched on ${SERVICE_URL}`);
|
|
156
|
+
if (!appState.debugMode) {
|
|
157
|
+
try {
|
|
158
|
+
// Launch the web browser
|
|
159
|
+
await (0, open_1.default)(SERVICE_URL);
|
|
160
|
+
}
|
|
161
|
+
catch (e) {
|
|
162
|
+
console.error('Error launching browser: ' + e.toString());
|
|
163
|
+
}
|
|
139
164
|
}
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
const debugMode = process_1.default.argv.indexOf('--debug') >= 0;
|
|
168
|
+
if (debugMode) {
|
|
169
|
+
// Display the full callstack for errors
|
|
170
|
+
startApp(debugMode);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
// Catch exceptions and report them nicely
|
|
174
|
+
try {
|
|
175
|
+
startApp(debugMode);
|
|
176
|
+
}
|
|
177
|
+
catch (e) {
|
|
178
|
+
console.error();
|
|
179
|
+
console.error(safe_1.default.red('ERROR: ' + e.message));
|
|
140
180
|
}
|
|
141
|
-
}
|
|
181
|
+
}
|
|
142
182
|
//# sourceMappingURL=start.js.map
|
package/lib/start.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 colors from 'colors/safe';\nimport open from 'open';\nimport updateNotifier from 'update-notifier';\nimport { FileSystem, type IPackageJson, JsonFile } from '@rushstack/node-core-library';\nimport type { IAppContext } from '@rushstack/lockfile-explorer-web/lib/AppContext';\nimport packageJSON from '../package.json';\nimport { init } from './init';\nimport type { IAppState } from './state';\n\nconst PORT: number = 8091;\n// Must not have a trailing slash\nconst SERVICE_URL: string = `http://localhost:${PORT}`;\n\nupdateNotifier({ pkg: packageJSON }).notify();\n\nconst appState: IAppState = init();\n\nprocess.chdir(appState.lockfileExplorerProjectRoot);\nconst distFolderPath: string = `${appState.lockfileExplorerProjectRoot}/dist`;\nconst app: express.Application = express();\napp.use(express.json());\napp.use(cors());\n\n// Variable used to check if the front-end client is still connected\nlet awaitingFirstConnect: boolean = true;\nlet isClientConnected: boolean = false;\nlet disconnected: boolean = false;\nsetInterval(() => {\n if (!isClientConnected && !awaitingFirstConnect && !disconnected) {\n console.log(colors.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.\napp.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\napp.use('/', express.static(distFolderPath));\n\napp.use('/favicon.ico', express.static(distFolderPath, { index: 'favicon.ico' }));\n\napp.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);\n res.send(doc);\n});\n\napp.get('/api/health', (req: express.Request, res: express.Response) => {\n awaitingFirstConnect = false;\n isClientConnected = true;\n if (disconnected) {\n disconnected = false;\n console.log(colors.green('The client has reconnected!'));\n }\n res.status(200).send();\n});\n\napp.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\napp.get('/api/pnpmfile', async (req: express.Request, res: express.Response) => {\n let pnpmLockfile: string;\n try {\n pnpmLockfile = await FileSystem.readFileAsync(appState.pnpmLockfileLocation);\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(pnpmLockfile);\n});\n\napp.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\napp.listen(PORT, async () => {\n console.log(`Rush Lockfile Explorer ${appState.appVersion} running at ${SERVICE_URL}`);\n\n if (!process.argv.includes('--debug')) {\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"]}
|
|
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 colors from 'colors/safe';\nimport open from 'open';\nimport updateNotifier from 'update-notifier';\nimport { FileSystem, type IPackageJson, JsonFile, PackageJsonLookup } from '@rushstack/node-core-library';\nimport type { IAppContext } from '@rushstack/lockfile-explorer-web/lib/AppContext';\nimport packageJSON from '../package.json';\nimport { init } from './init';\nimport type { IAppState } from './state';\nimport { AlreadyReportedError } from '@rushstack/node-core-library';\n\nfunction startApp(debugMode: boolean): void {\n const lockfileExplorerProjectRoot: string = PackageJsonLookup.instance.tryGetPackageFolderFor(__dirname)!;\n const appVersion: string = JsonFile.load(`${lockfileExplorerProjectRoot}/package.json`).version;\n\n console.log(\n colors.bold(`\\nRush Lockfile Explorer ${appVersion}`) + colors.cyan(' - https://lfx.rushstack.io/\\n')\n );\n\n updateNotifier({\n pkg: packageJSON,\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 // TODO: Later if we introduce more CLI parameters, switch to a proper CLI parser\n const args: string[] = process.argv.slice(2);\n if (args.length > 0 && args[0] !== '--debug') {\n console.log('Usage: lockfile-explorer [--debug]\\n');\n console.log('The \"lfx\" command is a shorthand alias for \"lockfile-explorer\".');\n console.log('See the project website for documentation and support.\\n');\n throw new AlreadyReportedError();\n }\n\n const appState: IAppState = init({ lockfileExplorerProjectRoot, appVersion, debugMode });\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(colors.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);\n res.send(doc);\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(colors.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 (e) {\n console.error();\n console.error(colors.red('ERROR: ' + e.message));\n }\n}\n"]}
|
package/lib/state/index.d.ts
CHANGED
package/lib/state/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAGA,oBAAY,WAAW;IACrB,YAAY,IAAA;IACZ,cAAc,IAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,2BAA2B,EAAE,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;IACtC,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;KAC3D,CAAC;CACH;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC;CACzC;AAED,oBAAY,SAAS,GAAG,aAAa,GAAG,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"AAGA,oBAAY,WAAW;IACrB,YAAY,IAAA;IACZ,cAAc,IAAA;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,2BAA2B,EAAE,MAAM,CAAC;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,aAAc,SAAQ,aAAa;IAClD,WAAW,EAAE,WAAW,CAAC,YAAY,CAAC;IACtC,IAAI,EAAE;QACJ,YAAY,EAAE,MAAM,CAAC;QACrB,uBAAuB,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;KAC3D,CAAC;CACH;AAED,MAAM,WAAW,sBAAuB,SAAQ,aAAa;IAC3D,WAAW,EAAE,WAAW,CAAC,cAAc,CAAC;CACzC;AAED,oBAAY,SAAS,GAAG,aAAa,GAAG,sBAAsB,CAAC"}
|
package/lib/state/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,6DAAY,CAAA;IACZ,iEAAc,CAAA;AAChB,CAAC,EAHW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAGtB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport enum ProjectType {\n RUSH_PROJECT,\n PNPM_WORKSPACE\n}\n\nexport interface IRushProjectDetails {\n projectName: string;\n projectFolder: string;\n}\n\nexport interface IAppStateBase {\n lockfileExplorerProjectRoot: string;\n currDir: string;\n projectRoot: string;\n projectType: ProjectType;\n pnpmLockfileLocation: string;\n pnpmfileLocation: string;\n appVersion: string;\n}\n\nexport interface IRushAppState extends IAppStateBase {\n projectType: ProjectType.RUSH_PROJECT;\n rush: {\n rushJsonPath: string;\n projectsByProjectFolder: Map<string, IRushProjectDetails>;\n };\n}\n\nexport interface IPnpmWorkspaceAppState extends IAppStateBase {\n projectType: ProjectType.PNPM_WORKSPACE;\n}\n\nexport type IAppState = IRushAppState | IPnpmWorkspaceAppState;\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":";AAAA,4FAA4F;AAC5F,2DAA2D;;;AAE3D,IAAY,WAGX;AAHD,WAAY,WAAW;IACrB,6DAAY,CAAA;IACZ,iEAAc,CAAA;AAChB,CAAC,EAHW,WAAW,GAAX,mBAAW,KAAX,mBAAW,QAGtB","sourcesContent":["// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license.\n// See LICENSE in the project root for license information.\n\nexport enum ProjectType {\n RUSH_PROJECT,\n PNPM_WORKSPACE\n}\n\nexport interface IRushProjectDetails {\n projectName: string;\n projectFolder: string;\n}\n\nexport interface IAppStateBase {\n lockfileExplorerProjectRoot: string;\n currDir: string;\n projectRoot: string;\n projectType: ProjectType;\n pnpmLockfileLocation: string;\n pnpmfileLocation: string;\n appVersion: string;\n debugMode: boolean;\n}\n\nexport interface IRushAppState extends IAppStateBase {\n projectType: ProjectType.RUSH_PROJECT;\n rush: {\n rushJsonPath: string;\n projectsByProjectFolder: Map<string, IRushProjectDetails>;\n };\n}\n\nexport interface IPnpmWorkspaceAppState extends IAppStateBase {\n projectType: ProjectType.PNPM_WORKSPACE;\n}\n\nexport type IAppState = IRushAppState | IPnpmWorkspaceAppState;\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rushstack/lockfile-explorer",
|
|
3
|
-
"version": "0.1
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Rush Lockfile Explorer: The UI for solving version conflicts quickly in a large monorepo",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"conflict",
|
|
@@ -25,10 +25,11 @@
|
|
|
25
25
|
"homepage": "https://lfx.rushstack.io/",
|
|
26
26
|
"license": "MIT",
|
|
27
27
|
"bin": {
|
|
28
|
-
"lockfile-explorer": "./bin/lockfile-explorer"
|
|
28
|
+
"lockfile-explorer": "./bin/lockfile-explorer",
|
|
29
|
+
"lfx": "./bin/lockfile-explorer"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
|
-
"@microsoft/rush-lib": "5.88.
|
|
32
|
+
"@microsoft/rush-lib": "5.88.2",
|
|
32
33
|
"@rushstack/eslint-config": "3.1.1",
|
|
33
34
|
"@rushstack/heft-node-rig": "1.11.12",
|
|
34
35
|
"@rushstack/heft": "0.49.1",
|