1
+ import { FileSystemUtils } from '../filesystemUtils' ;
2
+ import * as path from 'path' ;
3
+ import * as fs from 'fs' ;
4
+ const fetch = require ( 'node-fetch' ) ;
5
+
6
+ export class PackageJsonToMarkdown {
7
+ public static get commandName ( ) : string { return 'packageJsonToMarkdown' ; }
8
+
9
+ public execute ( ) {
10
+ const fsUtils = new FileSystemUtils ( ) ;
11
+ const directoryPath : string = fsUtils . getWorkspaceFolder ( ) ;
12
+ const excludeDirectories = [ 'bin' , 'obj' , 'node_modules' , 'dist' , 'packages' , '.git' , '.vs' , '.github' ] ;
13
+ const isPackageJson = ( filename : string ) : boolean => filename . toLowerCase ( ) . endsWith ( 'package.json' ) ;
14
+ const files = fsUtils . listFiles ( directoryPath , excludeDirectories , isPackageJson ) ;
15
+ this . writeMarkdownFile ( directoryPath , files ) ;
16
+ }
17
+
18
+ private writeMarkdownFile ( workspaceDirectory : string , packageJsonFiles : string [ ] ) {
19
+ let devDependencies : string [ ] = [ ] ;
20
+ let dependencies : string [ ] = [ ] ;
21
+ let peerDependencies : string [ ] = [ ] ;
22
+ packageJsonFiles . forEach ( packageJsonFile => {
23
+ const contents = fs . readFileSync ( packageJsonFile ) . toString ( 'utf8' ) ;
24
+ const packageJson = JSON . parse ( contents ) ;
25
+ if ( packageJson . devDependencies ) {
26
+ devDependencies = [ ...new Set ( [ ...devDependencies , ...Object . keys ( packageJson . devDependencies ) ] ) ] ;
27
+ }
28
+ if ( packageJson . dependencies ) {
29
+ dependencies = [ ...new Set ( [ ...dependencies , ...Object . keys ( packageJson . dependencies ) ] ) ] ;
30
+ }
31
+ if ( packageJson . peerDependencies ) {
32
+ peerDependencies = [ ...new Set ( [ ...peerDependencies , ...Object . keys ( packageJson . peerDependencies ) ] ) ] ;
33
+ }
34
+ } ) ;
35
+
36
+ let dependenciesMarkdown = '' ;
37
+ let devDependenciesMarkdown = '' ;
38
+ let peerDependenciesMarkdown = '' ;
39
+ const dependenciesRequests : Promise < { name : string , description : string } > [ ] = [ ] ;
40
+ dependencies . sort ( ) . forEach ( pckName => {
41
+ dependenciesRequests . push ( this . makeRequest ( pckName ) ) ;
42
+ } ) ;
43
+ Promise . all ( dependenciesRequests ) . then ( responses => {
44
+ responses . forEach ( response => {
45
+ if ( response ) {
46
+ dependenciesMarkdown += `| ${ response . name } | ${ response . description } |\n` ;
47
+ }
48
+ } ) ;
49
+ } ) . then ( ( ) => {
50
+ const devDependenciesRequests : Promise < { name : string , description : string } > [ ] = [ ] ;
51
+ devDependencies . sort ( ) . forEach ( pckName => {
52
+ devDependenciesRequests . push ( this . makeRequest ( pckName ) ) ;
53
+ } ) ;
54
+ Promise . all ( devDependenciesRequests ) . then ( responses => {
55
+ responses . forEach ( response => {
56
+ if ( response ) {
57
+ devDependenciesMarkdown += `| ${ response . name } | ${ response . description } |\n` ;
58
+ }
59
+ } ) ;
60
+ } ) . then ( ( ) => {
61
+ const peerDependenciesRequests : Promise < { name : string , description : string } > [ ] = [ ] ;
62
+ peerDependencies . sort ( ) . forEach ( pckName => {
63
+ peerDependenciesRequests . push ( this . makeRequest ( pckName ) ) ;
64
+ } ) ;
65
+ Promise . all ( peerDependenciesRequests ) . then ( responses => {
66
+ responses . forEach ( response => {
67
+ if ( response ) {
68
+ peerDependenciesMarkdown += `| ${ response . name } | ${ response . description } |\n` ;
69
+ }
70
+ } ) ;
71
+ } ) . then ( ( ) => {
72
+ const markdownContent =
73
+ '# Package.json\n\n' +
74
+ '## Dependencies\n\n' +
75
+ '| Name | Description|\n' +
76
+ '| ---- |:-----------|\n' +
77
+ dependenciesMarkdown + '\n' +
78
+ '## Dev dependencies\n\n' +
79
+ '| Name | Description|\n' +
80
+ '| ---- |:-----------|\n' +
81
+ devDependenciesMarkdown + '\n' +
82
+ '## Peer dependencies\n\n' +
83
+ '| Name | Description|\n' +
84
+ '| ---- |:-----------|\n' +
85
+ peerDependenciesMarkdown ;
86
+ const fsUtils = new FileSystemUtils ( ) ;
87
+ fsUtils . writeFileAndOpen ( path . join ( workspaceDirectory , 'ReadMe-PackagesJson.md' ) , markdownContent ) ;
88
+ } ) ;
89
+ } ) ;
90
+ } ) ;
91
+ }
92
+
93
+ private makeRequest ( pckName : string ) : Promise < { name : string , description : string } > {
94
+ const uri = 'https://api.npms.io/v2/search?q=' + pckName + '%20not:deprecated,insecure,unstable' ;
95
+ const request = fetch ( uri ) . then ( ( res : any ) => res . json ( ) )
96
+ . then ( ( json : any ) => {
97
+ if ( json . results [ 0 ] && json . results [ 0 ] . package ) {
98
+ let packageName = json . results [ 0 ] . package . name ;
99
+ packageName = packageName ?. replace ( '|' , '|' ) ;
100
+ let packageDescription = json . results [ 0 ] . package . description ;
101
+ packageDescription = packageDescription ?. replace ( '|' , '|' ) ;
102
+ return { name : packageName , description : packageDescription } ;
103
+ } else {
104
+ console . log ( 'Package not found: ' + pckName ) ;
105
+ }
106
+ } ) ;
107
+ return request ;
108
+ }
109
+ }
0 commit comments