-
Notifications
You must be signed in to change notification settings - Fork 37
/
generate-readme.js
116 lines (104 loc) · 3.42 KB
/
generate-readme.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/**
* Generates a README.md for each individual package, based off the template
* README_template.md.
*
* Requires each package to have:
*
* 1. A `package.json` file with:
* - name
* - description
* - dependencies
*
* 2. A `stories.js` file with the following functions defined:
* - `storiesOf('Story/Element', ...`
* - `.add('Button', ...`
*
* Script expects to be called via npm in the root directory:
*
* `npm run docs`
*/
let Twig = require('twig')
let fs = require('fs')
let path = require('path')
let glob = require('glob-fs')({ gitignore: true })
let wrap = require('wordwrap')(80)
let { getImportStatements, getImportStatementFromJS } = require('./get-imports')
function generateTemplate (directory) {
let data = {
packageName: '',
packageDescription: '',
packageDependencies: '',
packageImports: '',
noSsrPackageImports: '',
storybookParams: []
}
// Get imports.
let imports = getImportStatements(directory + 'package.json')
imports.forEach((importStatement, idx) => {
let print = importStatement
if (print.length > 80) {
print = print.replace(/,\s/gi, ',\n ').replace(/{ /gi, '{\n ').replace(/ }/gi, '\n}')
}
data.packageImports += ((idx > 0) ? '\n' : '') + print
})
// Get package data.
let file = fs.readFileSync(directory + 'package.json', 'utf8')
let jsonFile = JSON.parse(file)
data.packageName = wrap(jsonFile.name)
data.packageDescription = wrap(jsonFile.description)
// Get no-ssr imports.
if (fs.existsSync(directory + 'no-ssr/index.js')) {
let nossrImport = fs.readFileSync(directory + 'no-ssr/index.js', 'utf-8')
const nossrImports = getImportStatementFromJS(nossrImport, data.packageName + '/no-ssr')
nossrImports.forEach((importStatement, idx) => {
let print = importStatement
if (print.length > 80) {
print = print.replace(/,\s/gi, ',\n ').replace(/{ /gi, '{\n ').replace(/ }/gi, '\n}')
}
data.noSsrPackageImports += ((idx > 0) ? '\n' : '') + print
})
}
// Get dependencies.
let deps = []
for (let key in jsonFile.dependencies) {
deps.push(key)
}
for (let i = 0; i < deps.length; i++) {
const key = deps[i]
if (i < deps.length - 1) {
data.packageDependencies += '├── ' + key + '\n'
} else {
data.packageDependencies += '└── ' + key
}
}
// Get story parameters.
let story = fs.readFileSync(directory + 'stories.js', 'utf8')
let storiesOf = /(?:storiesOf\(')(.+)(?:',)/g
let storiesOfMatch = storiesOf.exec(story)
let add = /(?:add\([\n\s]*)(?:')(.+)(?:',)/gim
let addMatch = add.exec(story)
while (addMatch !== null) {
data.storybookParams.push({
path: 'Storybook/' + addMatch[1].replace('\\', ''),
params: '?selectedKind=' + encodeURI(storiesOfMatch[1]) + '&selectedStory=' + encodeURI(addMatch[1])
})
addMatch = add.exec(story)
}
// Add check for no-ssr folder.
// Render template.
Twig.renderFile(path.join(__dirname, '/README_template.md'), data, (err, html) => {
if (err) {
console.log(err)
} else {
// Strip comments & write.
html = html.replace(/<!--(.*?)-->\n/gi, '')
fs.writeFileSync(directory + 'README.md', html)
}
})
}
// Get all packages and generate.
let packages = glob.readdirSync('./packages/**/package.json')
packages.forEach(item => {
let packagePath = item.substr(0, (item.lastIndexOf('/') + 1))
generateTemplate('./' + packagePath)
})