-
Notifications
You must be signed in to change notification settings - Fork 51
/
Copy pathindex.js
executable file
·91 lines (79 loc) · 2.59 KB
/
index.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
#!/usr/bin/env node
'use strict'
var hogan = require('hogan.js')
var fs = require('fs')
var path = require('path')
var util = require('util')
var argv = require('yargs')
.usage('Usage: readme path/to/package.json')
.check(function (argv) {
if (!argv._.length) throw new Error('A path to a valid package.json is required')
return true
})
.option('r', {
alias: 'travis',
description: 'display a travis badge'
})
.option('t', {
alias: 'test',
description: 'include test output in readme'
})
.alias('t', 'tests')
.help('help')
.alias('h', 'help')
.argv
var gh = require('github-url-to-object')
var childProcess = require('child_process')
var stripAnsi = require('strip-ansi')
var pkgPath = path.resolve(process.cwd(), argv._[0])
try {
var pkg = require(pkgPath)
} catch (e) {
console.error('Invalid JSON file: %s', pkgPath)
process.exit()
}
pkg.private = pkg.private || pkg.license === 'private' || false
if (argv.travis) {
if (pkg.repository && pkg.repository.url && gh(pkg.repository.url)) {
pkg.travis_url = gh(pkg.repository.url).travis_url
} else {
console.error('`repository.url` must be a GitHub repository URL for Travis to work')
process.exit()
}
}
// Run tests and fetch output
if (argv.tests || argv.test) {
pkg.testOutput = stripAnsi(childProcess.execSync('npm test').stdout)
.replace(/\r/g, '') // remove weird newlines
.replace(/\n+/g, '\n') // remove excess newlines
}
// Look for example.js or example.sh in package.json directory
var extensions = ['js', 'sh']
extensions.forEach(function (language) {
var exampleFile = path.resolve(path.dirname(argv._[0])) + '/example.' + language
if (fs.existsSync(exampleFile)) {
pkg.usage = {
language: language,
content: fs.readFileSync(exampleFile).toString()
}
// replace require('./') statement with the package name
if (language === 'js') {
pkg.usage.content = pkg.usage.content.replace(
/require\(['"]?\.\/['"]?\)/,
util.format('require("%s")', pkg.name)
)
}
}
})
var getDeps = function (deps) {
return Object.keys(deps).map(function (depname) {
var dep = require(path.resolve(path.dirname(argv._[0])) + '/node_modules/' + depname + '/package.json')
dep.repository = 'https://ghub.io/' + depname
return dep
})
}
if (pkg.dependencies) pkg.depDetails = getDeps(pkg.dependencies)
if (pkg.devDependencies) pkg.devDepDetails = getDeps(pkg.devDependencies)
var templatePath = path.join(__dirname, 'template.md')
var template = hogan.compile(fs.readFileSync(templatePath).toString())
process.stdout.write(template.render(pkg))