@berun/sparky
Version:
Sparky task runner for @berun
249 lines (236 loc) • 5.64 kB
text/typescript
import { spawn } from 'child_process'
import * as fs from 'fs'
import { ensureAbsolutePath } from './Utils'
export type Libs =
| 'ES5'
| 'ES6'
| 'ES2015'
| 'ES7'
| 'es2017'
| 'ES2017'
| 'ESNext'
| 'DOM'
| 'DOM.Iterable'
| 'WebWorker'
| 'ScriptHost'
| 'ES2015.Core'
| 'ES2015.Collection'
| 'ES2015.Generator'
| 'ES2015.Iterable'
| 'ES2015.Promise'
| 'ES2015.Proxy'
| 'ES2015.Reflect'
| 'ES2015.Symbol'
| 'ES2015.Symbol.WellKnown'
| 'es2017.Array.Include'
| 'ES2017.object'
| 'ES2017.SharedMemory'
| 'ES2017.TypedArrays'
| 'esnext.asynciterable'
export interface TscOptions {
allowJs?: boolean
allowSyntheticDefaultImports?: boolean
allowUnreachableCode?: boolean
allowUnusedLabels?: boolean
alwaysStrict?: boolean
baseUrl?: string
charset?: string
checkJs?: boolean
declaration?: boolean
declarationDir?: string
diagnostics?: boolean
disableSizeLimit?: boolean
downlevelIteration?: boolean
emitBOM?: boolean
emitDecoratorMetadata?: boolean
experimentalDecorators?: boolean
forceConsistentCasingInFileNames?: boolean
importHelpers?: boolean
inlineSourceMap?: boolean
inlineSources?: boolean
init?: boolean
isolatedModules?: boolean
jsx?: 'Preserve' | 'React'
jsxFactory?: string
lib?: Array<Libs>
listEmittedFiles?: boolean
listFiles?: boolean
locale?:
| 'en'
| 'cs'
| 'de'
| 'es'
| 'fr'
| 'it'
| 'ja'
| 'ko'
| 'pl'
| 'pt-BR'
| 'ru'
| 'tr'
| 'zh-CN'
| 'zh-TW'
mapRoot?: string
maxNodeModuleJsDepth?: number
module?:
| 'None'
| 'CommonJS'
| 'AMD'
| 'System'
| 'UMD'
| 'ES6'
| 'ES2015'
| 'ESNext'
moduleResolution?: 'Node' | 'Classic'
newLine?: 'crlf' | 'lf'
noEmit?: boolean
noEmitHelpers?: boolean
noEmitOnError?: boolean
noFallthroughCasesInSwitch?: boolean
noImplicitAny?: boolean
noImplicitReturns?: boolean
noImplicitThis?: boolean
noImplicitUseStrict?: boolean
noLib?: boolean
noResolve?: boolean
noStrictGenericChecks?: boolean
noUnusedLocals?: boolean
noUnusedParameters?: boolean
outDir?: string
outFile?: string
preserveConstEnums?: boolean
preserveSymlinks?: boolean
pretty?: boolean
project?: string
reactNamespace?: string
removeComments?: boolean
rootDir?: string
skipDefaultLibCheck?: boolean
skipLibCheck?: boolean
sourceMap?: boolean
sourceRoot?: boolean
strict?: boolean
strictFunctionTypes?: boolean
strictNullChecks?: boolean
stripInternal?: boolean
suppressExcessPropertyErrors?: boolean
suppressImplicitAnyIndexErrors?: boolean
target?: 'ES3' | 'ES5' | 'ES6' | 'ES2015' | 'es2017' | 'ES2017' | 'ESNext'
traceResolution?: boolean
types?: string[]
typeRoots?: string[]
watch?: boolean
}
export async function tsc(root: string, opts?: TscOptions) {
const tscOptions: any = []
root = ensureAbsolutePath(root)
opts.project = root
Object.keys(opts).forEach(key => {
if (opts[key] !== undefined) {
if (key === 'watch') {
tscOptions.push(`--${key}`)
} else {
tscOptions.push(`--${key}`, String(opts[key]))
}
}
})
return new Promise((resolve, reject) => {
const proc = spawn(
`tsc${/^win/.test(process.platform) ? '.cmd' : ''}`,
tscOptions,
{
stdio: 'inherit'
}
)
proc.on('close', code => {
if (code === 8) {
reject(new Error('Error detected'))
} else {
resolve()
}
})
})
}
export async function npmPublish(opts: { path: string; tag?: string }) {
opts.tag = opts.tag || 'latest'
return new Promise((resolve, reject) => {
const publish = spawn('npm', ['publish', '--tag', opts.tag], {
stdio: 'inherit',
cwd: ensureAbsolutePath(opts.path)
})
publish.on('close', code => {
if (code === 8) {
reject(new Error('Error detected, waiting for changes...'))
} else {
resolve()
}
})
})
}
export function bumpVersion(
packageJSONPath: string,
opts: {
userJson?: { version: string }
type: 'minor' | 'major' | 'patch' | 'next' | 'alpha' | 'beta' | 'rc' | 'dev'
}
) {
let filePath
let json
if (!opts.userJson) {
filePath = ensureAbsolutePath(packageJSONPath)
if (!fs.existsSync(filePath)) {
throw new Error(`${filePath} was not found`)
}
try {
json = JSON.parse(fs.readFileSync(filePath).toString())
} catch (ex) {
console.error(`SparkyUtil Error parsing ${filePath} ${ex.message}`)
process.exit(1)
}
} else {
json = opts.userJson
}
const version = json.version || '1.0.0'
const { type } = opts
const matched = version.match(
/(\d{1,}).(\d{1,})\.(\d{1,})(-(\w{1,})\.(\d{1,}))?/i
)
let major = matched[1] * 1
let minor = matched[2] * 1
let patch = matched[3] * 1
let addonName = matched[5]
let addonNumber = matched[6]
const resetAddon = () => {
addonName = undefined
addonNumber = undefined
}
if (type === 'patch') {
resetAddon()
patch++
} else if (type === 'minor') {
minor++
patch = 0
resetAddon()
} else if (type === 'major') {
patch = 0
minor = 0
resetAddon()
major++
} else if (addonName === type && addonNumber > -1) {
addonNumber++
} else {
addonName = type
addonNumber = 1
}
const base = [`${major}.${minor}.${patch}`]
if (addonName) {
base.push(`-${addonName}.${addonNumber}`)
}
const finalVersion = base.join('')
json.version = finalVersion
if (opts.userJson) {
return json
}
fs.writeFileSync(filePath, JSON.stringify(json, null, 2))
return json
}