UNPKG

3.59 kBJavaScriptView Raw
1const fs = require('fs')
2const path = require('path')
3const chalk = require('chalk')
4const tildify = require('tildify')
5const AppError = require('./app-error')
6
7exports.cwd = function (cwd, ...args) {
8 return path.resolve(cwd || process.cwd(), ...args)
9}
10
11exports.ownDir = function (...args) {
12 return path.join(__dirname, '../', ...args)
13}
14
15exports.getConfigFile = function (config) {
16 return exports.cwd(typeof config === 'string' ? config : 'poi.config.js')
17}
18
19exports.getPublicPath = function (mode, homepage) {
20 if (mode === 'production' && homepage) {
21 return /\/$/.test(homepage) ? homepage : (homepage + '/')
22 }
23 return '/'
24}
25
26exports.readPkg = function () {
27 try {
28 return require(exports.cwd('package.json'))
29 } catch (err) {
30 if (err.code === 'MODULE_NOT_FOUND') {
31 return {}
32 }
33 throw new AppError(err.message)
34 }
35}
36
37exports.inferHTML = function (options) {
38 const minimize = exports.inferProductionValue(options.minimize, options.mode)
39
40 const result = {
41 title: 'Poi App',
42 template: exports.ownDir('lib/index.ejs'),
43 minify: {
44 collapseWhitespace: minimize,
45 minifyCSS: minimize,
46 minifyJS: minimize
47 }
48 }
49
50 const pkg = exports.readPkg()
51 result.pkg = pkg
52 result.title = pkg.productName || pkg.name
53 result.description = pkg.description
54
55 const templatePath = path.resolve(options.cwd || process.cwd(), 'index.ejs')
56 if (fs.existsSync(templatePath)) {
57 console.log(`> Using external HTML template file`)
58 console.log(chalk.dim(`> location: "${tildify(templatePath)}"`))
59 result.template = templatePath
60 }
61
62 return result
63}
64
65exports.getFileNames = function (useHash, customFileName) {
66 return Object.assign({
67 js: useHash ? '[name].[chunkhash:8].js' : '[name].js',
68 css: useHash ? '[name].[contenthash:8].css' : '[name].css',
69 static: useHash ? 'static/[name].[hash:8].[ext]' : 'static/[name].[ext]',
70 chunk: useHash ? '[id].[chunkhash:8].chunk.js' : '[id].chunk.js'
71 }, customFileName)
72}
73
74exports.inferProductionValue = function (value, mode) {
75 if (typeof value !== 'undefined') {
76 return value
77 }
78 return mode === 'production'
79}
80
81exports.promisify = function (fn) {
82 return (...args) => {
83 return new Promise((resolve, reject) => {
84 fn(...args, (err, result) => {
85 if (err) return reject(err)
86 resolve(result)
87 })
88 })
89 }
90}
91
92exports.stringifyObject = function (obj) {
93 return Object.keys(obj).reduce((curr, next) => {
94 curr[next] = JSON.stringify(obj[next])
95 return curr
96 }, {})
97}
98
99exports.parsePresets = presets => {
100 const loadPreset = (name, options) => {
101 if (typeof name === 'string') {
102 let preset
103 try {
104 preset = /^(\.|\/)/.test(name) ? name : `poi-preset-${name}`
105 name = require(path.join(process.cwd(), preset))
106 } catch (err) {
107 if (err.code === 'MODULE_NOT_FOUND' && err.message.indexOf(name) > -1) {
108 throw new AppError(`Cannot find module "${preset}" in current working directory!\n\nYou may need to run: yarn add ${preset} --dev`)
109 } else {
110 throw err
111 }
112 }
113 }
114 if (typeof name === 'function') {
115 name = name(options)
116 }
117 return name
118 }
119
120 presets = Array.isArray(presets) ?
121 presets :
122 typeof presets === 'object' ?
123 Object.keys(presets).map(name => [name, presets[name]]) :
124 [presets]
125
126 return presets.map(preset => {
127 if (typeof preset === 'string') {
128 preset = loadPreset(preset)
129 } else if (Array.isArray(preset)) {
130 preset = loadPreset(preset[0], preset[1])
131 }
132
133 return preset
134 })
135}