Skip to content

Commit d8b6728

Browse files
committed
Added command packageJsonToMarkdown to generate a markdown page that lists alle package used in the workspace.
1 parent b02d99d commit d8b6728

File tree

3 files changed

+126
-33
lines changed

3 files changed

+126
-33
lines changed

package-lock.json

Lines changed: 7 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,25 @@
1010
"Other"
1111
],
1212
"activationEvents": [
13-
"onCommand:angulartools.listAllImports",
14-
"onCommand:angulartools.projectDirectoryStructure"
13+
"onCommand:angulartools.listAllImports",
14+
"onCommand:angulartools.projectDirectoryStructure",
15+
"onCommand:angulartools.packageJsonToMarkdown"
1516
],
1617
"main": "./out/extension.js",
1718
"contributes": {
1819
"commands": [
1920
{
2021
"command": "angulartools.listAllImports",
2122
"title": "AngularTools: List all imports"
22-
},
23-
{
23+
},
24+
{
2425
"command": "angulartools.projectDirectoryStructure",
2526
"title": "AngularTools: Show the project directory structure"
27+
},
28+
{
29+
"command": "angulartools.packageJsonToMarkdown",
30+
"title": "AngularTools: Generate Markdown file from package.json files in the workspace."
2631
}
27-
2832
]
2933
},
3034
"scripts": {
@@ -49,5 +53,6 @@
4953
"vscode-test": "^1.4.0"
5054
},
5155
"dependencies": {
56+
"node-fetch": "^2.6.1"
5257
}
5358
}

src/extension.ts

Lines changed: 109 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,17 @@
33
import * as vscode from 'vscode';
44
import * as fs from 'fs';
55
import * as path from 'path';
6+
const fetch = require('node-fetch');
67

78
export function activate(context: vscode.ExtensionContext) {
8-
99
// Implementation of the commands that has been defined in the package.json file
1010
const listAllImportsDisposable = vscode.commands.registerCommand('angulartools.listAllImports', () => {
1111
// The code you place here will be executed every time your command is executed
1212
var directoryPath: string = getWorkspaceFolder();
1313
const excludeDirectories = ['bin', 'obj', 'node_modules', 'dist', 'packages', '.git', '.vs', '.github'];
1414
const isTypescriptFile = (filename: string): boolean => filename.endsWith('.ts') && !filename.endsWith('index.ts');
1515
const files = listFiles(directoryPath, excludeDirectories, isTypescriptFile);
16-
writeResult('ReadMe-Imports.md', files);
16+
writeResult(files);
1717
});
1818
context.subscriptions.push(listAllImportsDisposable);
1919

@@ -24,6 +24,15 @@ export function activate(context: vscode.ExtensionContext) {
2424
writeDirectoryStructure(workspaceDirectory, 'ReadMe-ProjectDirectoryStructure.md', directories);
2525
});
2626
context.subscriptions.push(projectDirectoryStructureDisposable);
27+
28+
const packageJsonToMarkdownDisposable = vscode.commands.registerCommand('angulartools.packageJsonToMarkdown', () => {
29+
var directoryPath: string = getWorkspaceFolder();
30+
const excludeDirectories = ['bin', 'obj', 'node_modules', 'dist', 'packages', '.git', '.vs', '.github'];
31+
const isPackageJson = (filename: string): boolean => filename.toLowerCase().endsWith('package.json');
32+
const files = listFiles(directoryPath, excludeDirectories, isPackageJson);
33+
writeMarkdownFile(files);
34+
});
35+
context.subscriptions.push(packageJsonToMarkdownDisposable);
2736
}
2837

2938
function getWorkspaceFolder(): string {
@@ -36,7 +45,7 @@ function getWorkspaceFolder(): string {
3645
}
3746

3847
const imports: { [module: string]: number } = {};
39-
function writeResult(filename: string, results: string[]) {
48+
function writeResult(results: string[]) {
4049
if (!results) { return; }
4150
for (let i = 0; i < results.length; i++) {
4251
var file = results[i];
@@ -69,15 +78,16 @@ function writeResult(filename: string, results: string[]) {
6978
function listFiles(
7079
dir: string,
7180
excludeDirectories: string[],
72-
isTypescriptFile: (filename: string) => boolean
81+
isMatchingFile: (filename: string) => boolean
7382
): string[] {
7483
const directories = listDirectories(dir, excludeDirectories);
84+
directories.push(dir);
7585
let files: string[] = [];
7686
directories.forEach(directory => {
7787
const filesInDirectory = fs.readdirSync(directory)
7888
.map(name => path.join(directory, name))
7989
.filter((name: any) => fs.lstatSync(name).isFile())
80-
.filter((name: string) => isTypescriptFile(name));
90+
.filter((name: string) => isMatchingFile(name));
8191
files = files.concat(filesInDirectory);
8292
});
8393
return files;
@@ -94,15 +104,6 @@ function writeDirectoryStructure(workSpaceDirectory: string, filename: string, d
94104
angularToolsOutput.appendLine(directoryName);
95105
});
96106
angularToolsOutput.show();
97-
98-
// var output: string = `# Project Directory Structure\n\nWorkspace directory: ${workSpaceDirectory}\n\n## Directories\n\n` + "```text\n";
99-
// directories?.forEach(directoryFullPath => {
100-
// var directoryName = directoryFullPath.replace(workSpaceDirectory, '.');
101-
// output = output + directoryName + '\n';
102-
// });
103-
// output = output + "```\n";
104-
// var directoryPath: string = getWorkspaceFolder();
105-
// writeFileAndOpen(path.join(directoryPath, filename), output);
106107
}
107108

108109
const isDirectory = (directoryName: any) => fs.lstatSync(directoryName).isDirectory();
@@ -129,6 +130,100 @@ function listDirectories(
129130
return result;
130131
};
131132

133+
function writeMarkdownFile(packageJsonFiles: string[]) {
134+
let devDependencies: string[] = [];
135+
let dependencies: string[] = [];
136+
let peerDependencies: string[] = [];
137+
packageJsonFiles.forEach(packageJsonFile => {
138+
// console.log('Package file: ' + packageJsonFile);
139+
const contents = fs.readFileSync(packageJsonFile).toString('utf8');
140+
const packageJson = JSON.parse(contents);
141+
if (packageJson.devDependencies) {
142+
devDependencies = [...new Set([...devDependencies, ...Object.keys(packageJson.devDependencies)])]
143+
}
144+
if (packageJson.dependencies) {
145+
dependencies = [...new Set([...dependencies, ...Object.keys(packageJson.dependencies)])]
146+
}
147+
if (packageJson.peerDependencies) {
148+
peerDependencies = [...new Set([...peerDependencies, ...Object.keys(packageJson.peerDependencies)])]
149+
}
150+
});
151+
// console.log('Dependencies: ' + dependencies.length);
152+
// console.log('Dev dependencies: ' + devDependencies.length);
153+
// console.log('Peer dependencies: ' + peerDependencies.length);
154+
155+
let dependenciesMarkdown = '';
156+
let devDependenciesMarkdown = '';
157+
let peerDependenciesMarkdown = '';
158+
const dependenciesRequests: Promise<{ name: string, description: string }>[] = [];
159+
dependencies.sort().forEach(pckName => {
160+
dependenciesRequests.push(makeRequest(pckName));
161+
});
162+
Promise.all(dependenciesRequests).then(responses => {
163+
responses.forEach(response => {
164+
if (response) {
165+
dependenciesMarkdown += `| ${response.name} | ${response.description} |\n`;
166+
}
167+
});
168+
}).then(() => {
169+
const devDependenciesRequests: Promise<{ name: string, description: string }>[] = [];
170+
devDependencies.sort().forEach(pckName => {
171+
devDependenciesRequests.push(makeRequest(pckName));
172+
});
173+
Promise.all(devDependenciesRequests).then(responses => {
174+
responses.forEach(response => {
175+
if (response) {
176+
devDependenciesMarkdown += `| ${response.name} | ${response.description} |\n`;
177+
}
178+
});
179+
}).then(() => {
180+
const peerDependenciesRequests: Promise<{ name: string, description: string }>[] = [];
181+
peerDependencies.sort().forEach(pckName => {
182+
peerDependenciesRequests.push(makeRequest(pckName));
183+
});
184+
Promise.all(peerDependenciesRequests).then(responses => {
185+
responses.forEach(response => {
186+
if (response) {
187+
peerDependenciesMarkdown += `| ${response.name} | ${response.description} |\n`;
188+
}
189+
});
190+
}).then(() => {
191+
const markdownContent =
192+
'# Package.json\n\n' +
193+
'## Dependencies\n\n' +
194+
'| Name | Description|\n' +
195+
'| ---- |:-----------|\n' +
196+
dependenciesMarkdown + '\n' +
197+
'## Dev dependencies\n\n' +
198+
'| Name | Description|\n' +
199+
'| ---- |:-----------|\n' +
200+
devDependenciesMarkdown + '\n' +
201+
'## Peer dependencies\n\n' +
202+
'| Name | Description|\n' +
203+
'| ---- |:-----------|\n' +
204+
peerDependenciesMarkdown
205+
const workspaceFolder: string = getWorkspaceFolder();
206+
writeFileAndOpen(path.join(workspaceFolder, 'ReadMe-PackagesJson.md'), markdownContent);
207+
});
208+
});
209+
});
210+
}
211+
212+
function makeRequest(pckName: string): Promise<{ name: string, description: string }> {
213+
const uri = 'https://api.npms.io/v2/search?q=' + pckName + '%20not:deprecated,insecure,unstable';
214+
const request = fetch(uri).then((res: any) => res.json())
215+
.then((json: any) => {
216+
if (json.results[0] && json.results[0].package) {
217+
const packageName = json.results[0].package.name;
218+
const packageDescription = json.results[0].package.description;
219+
return { name: packageName, description: packageDescription };
220+
} else {
221+
console.log('Package not found: ' + pckName);
222+
}
223+
});
224+
return request;
225+
}
226+
132227
function writeFileAndOpen(filename: string, content: string) {
133228
fs.writeFile(filename, content, function (err) {
134229
if (err) {

0 commit comments

Comments
 (0)