unexample
Version:
convert .env.example to .env (and some)
87 lines (65 loc) • 2.54 kB
text/typescript
import * as path from 'path'
import * as fs from 'fs'
import _ from 'underscore'
class ExampleCopy {
constructor(
input: string,
output: string,
force: boolean,
silent: boolean
) {
try {
_.each({ input, output, force, silent }, (obj, key) => {
if (typeof obj === 'object') {
throw new Error(`No duplicated entries allowed for "--${key}" argument or option`)
}
})
this.process(input, output, force)
} catch (err) {
!silent ? console.log(err.message) : ''
}
}
process(inputFile: string, outputFile: string, force: boolean) {
const input = path.resolve(inputFile)
let output = ''
if (outputFile === '.env') { // default outputFile name
output = path.resolve(path.dirname(input), outputFile)
} else {
output = path.resolve(outputFile)
}
if (!fs.existsSync(input)) {
throw new Error(`No example file exist at: ${input}`)
}
if (!fs.existsSync(output)) {
return this.copy(input, output, force)
}
if (fs.existsSync(output) && force) {
return this.copy(input, output, force)
}
if (fs.existsSync(output) && !force) {
console.warn(`Did not overwrite ${output} use --force to ignore this safety check`)
}
}
copy(inputFile: string, outputFile: string, force: boolean): void {
let lines: string[] = []
lines = (fs.readFileSync(inputFile, 'utf8') || '')
.split(/\r?\n|\r/)
.filter(line => /\s*=\s*/i.test(line))
.map(line => line.replace('exports ', ''))
let envLines: string[] = []
_.each(lines, line => {
if (!/^\s*\#/i.test(line)) {
let keyValue = line.match(/^([^=]+)\s*=\s*(.*)$/)
if (keyValue && keyValue.length !== 0) {
let mergedValue = process.env[keyValue[1]] || keyValue[2]
envLines.push(`${keyValue[1]}=${mergedValue}`)
}
}
})
const finalEnv = envLines.join("\r\n") || ''
fs.writeFileSync(outputFile, finalEnv)
console.log(`Copied ${envLines.length} variable(s) and removed ${lines.length - envLines.length} comment(s)`)
console.log(`From ${path.basename(inputFile)} to ${path.basename(outputFile)} file`)
}
}
export default ExampleCopy