forked from vercel/micro
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmicro.js
executable file
·114 lines (97 loc) · 2.47 KB
/
micro.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
#!/usr/bin/env node
// Native
const path = require('path')
const { existsSync } = require('fs')
// Packages
const parseArgs = require('mri')
// Utilities
const serve = require('../lib')
const handle = require('../lib/handler')
const generateHelp = require('../lib/help')
const { version } = require('../package')
const logError = require('../lib/error')
// Check if the user defined any options
const flags = parseArgs(process.argv.slice(2), {
default: {
host: '::',
port: 3000
},
alias: {
p: 'port',
H: 'host',
h: 'help',
v: 'version'
},
unknown(flag) {
console.log(`The option "${flag}" is unknown. Use one of these:`)
console.log(generateHelp())
process.exit(1)
}
})
// When `-h` or `--help` are used, print out
// the usage information
if (flags.help) {
console.log(generateHelp())
process.exit()
}
// Print out the package's version when
// `--version` or `-v` are used
if (flags.version) {
console.log(version)
process.exit()
}
let file = flags._[0]
if (!file) {
try {
// eslint-disable-next-line import/no-dynamic-require
const packageJson = require(path.resolve(process.cwd(), 'package.json'))
file = packageJson.main || 'index.js'
} catch (err) {
if (err.code !== 'MODULE_NOT_FOUND') {
logError(
`Could not read \`package.json\`: ${err.message}`,
'invalid-package-json'
)
process.exit(1)
}
}
}
if (!file) {
logError('Please supply a file!', 'path-missing')
process.exit(1)
}
if (file[0] !== '/') {
file = path.resolve(process.cwd(), file)
}
if (!existsSync(file)) {
logError(
`The file or directory "${path.basename(file)}" doesn't exist!`,
'path-not-existent'
)
process.exit(1)
}
const { isNaN } = Number
const port = Number(flags.port)
if (isNaN(port) || (!isNaN(port) && (port < 1 || port >= 2 ** 16))) {
logError(
`Port option must be a number. Supplied: ${flags.port}`,
'invalid-server-port'
)
process.exit(1)
}
const loadedModule = handle(file)
const server = serve(loadedModule)
server.on('error', err => {
console.error('micro:', err.stack)
process.exit(1)
})
server.listen(flags.port, flags.host, () => {
const details = server.address()
process.on('SIGTERM', () => {
console.log('\nmicro: Gracefully shutting down. Please wait...')
server.close(process.exit)
})
// `micro` is designed to run only in production, so
// this message is perfectly for prod
console.log(`micro: Accepting connections on port ${details.port}`)
})