sardines-compile-time-tools
Version:
sardines.compile-time-tools.js is part of the sardines.io project
228 lines (205 loc) • 7.26 kB
text/typescript
import { utils, RepositoryClient } from 'sardines-core'
import { readSardinesConfigFile } from '../config'
import * as fs from 'fs'
import { GitVersioning } from '../versioning'
import { exit } from 'process'
import * as path from 'path'
export interface PublisherArguments {
// url?: string
// username: string
// password: string
// executableCodeDir?: string
serviceDefinitionFile?: string
sardinesConfigFile?: string
patch?: boolean
minor?: boolean
major?: boolean
version?: string
tag?: string
tagMsg?: string
commit?: string,
remote?: string,
branch?: string,
verbose?: boolean
}
export const loadSardinesCacheByConfig = (config: any) => {
let exeDir = './lib'
if (config && config.exeDir) exeDir = config.exeDir
let sardinesDir = 'sardines'
if (config && config.sardinesDir) sardinesDir = config.sardinesDir
const exefile = path.resolve(`${exeDir}/${sardinesDir}/index.js`)
if (fs.existsSync(exefile)) {
return require(exefile)
}
return null
}
export const getDriverCacheByConfig = (config: any) => {
const sardinesCache = loadSardinesCacheByConfig(config)
if (sardinesCache && sardinesCache.drivers) return sardinesCache.drivers
return null
}
export const publish = async (args: PublisherArguments) => {
let {
// url, username, password, executableCodeDir,
serviceDefinitionFile, sardinesConfigFile,
patch, minor, major, version, tag, tagMsg, commit,
remote, branch, verbose, isPublic
} = Object.assign({
url: 'http://localhost:8080',
executableCodeDir: './lib',
serviceDefinitionFile: './sardines-local-services.json',
sardinesConfigFile: './sardines-config.json',
verbose: false,
patch: true,
minor: false,
major: false,
remote: 'origin',
branch: 'sardines',
isPublic: true,
version: '0.0.1',
tagMsg: 'sardines publisher automatic tag',
commit: 'sardines publisher automatic commit'
}, args)
// Process the service definition file
if (!serviceDefinitionFile) {
throw utils.unifyErrMesg('Can not publish service without its definition')
}
let serviceDefinitions:any = null
try {
serviceDefinitions = JSON.parse(fs.readFileSync(serviceDefinitionFile).toString())
} catch (e) {
throw utils.unifyErrMesg(`ERROR when trying to read service definition file [${serviceDefinitionFile}]`, 'sardines', 'publisher')
}
if (!serviceDefinitions) {
throw utils.unifyErrMesg(`Service definition file [${serviceDefinitionFile}] is empty`, 'sardines', 'publisher')
}
const { application, services } = serviceDefinitions
if (!application || typeof application !== 'string') {
throw utils.unifyErrMesg(`Application name is missing in the service definition file`)
}
if (!services || !Array.isArray(services) || services.length <= 0) {
throw utils.unifyErrMesg(`Services are not found in the service definition file`)
}
// Read the sardines-config file
const sardinesConfig = readSardinesConfigFile(sardinesConfigFile)
RepositoryClient.setupRepositoryEntriesBySardinesConfig(sardinesConfig)
const drivers = getDriverCacheByConfig(sardinesConfig)
if (drivers) {
RepositoryClient.setupDrivers(drivers)
} else {
throw utils.unifyErrMesg('Can not find driver settings in sardines cache', 'sardines', 'publisher')
}
const executableCodeDir = sardinesConfig.exeDir
// Check the executable code dir
if (!executableCodeDir) {
throw utils.unifyErrMesg('Can not publish executable code without its directory path', 'sardines', 'publisher')
}
// Get and set git version
if (verbose) {
console.log('')
console.log('')
console.log('versioning...')
console.log('')
}
const currentVersion = await GitVersioning({
patch, minor, major, version, tag, tagMsg, commit,
remote, branch,
verbose,
doCommit: true
})
if (verbose) {
console.log('')
console.log('versioning finished')
console.log('')
console.log('')
}
if (!currentVersion.isNew) {
console.log('Nothing to do with the source code')
exit(0)
}
// Update application info
// interface Application {
// id?: string
// name?: string
// is_public?: boolean
// owner?: string
// developers?: string[]
// last_access_on?: any
// }
const appInDB = await RepositoryClient.createOrUpdateApplication({name: application})
if (verbose) {
console.log('app:', appInDB)
}
// Create or update source
// enum SourceType {
// git = 'git'
// }
// interface Source {
// id?: string
// type: string
// URL: string
// root: string
// last_access_on?: any
// }
const source: any = {
type: 'git',
root: executableCodeDir,
URL: currentVersion.git
}
let sourceInDB = await RepositoryClient.createOrUpdateSource(source)
if (verbose) {
console.log('source:', sourceInDB)
}
// Create or update services
// interface Service {
// id?: string
// application?: string
// application_id?: string
// module: string
// name: string
// arguments: ServiceArgument[]
// return_type: string
// is_async: boolean
// version?: string
// source_id?: string
// is_public?: boolean
// owner?: string
// developers?: string[]
// provider_settings?: any[]
// init_params?: any
// }
const serviceList = services.map((serv: any) => {
let p = path.resolve(executableCodeDir, './' + serv.filepath)
let extname = path.extname(p)
if (extname === '.ts' && !fs.existsSync(p)) {
p = path.resolve(path.dirname(p), './' + path.basename(p, extname) + '.js')
serv.filepath = path.resolve(path.dirname(serv.filepath), './' + path.basename(serv.filepath, extname) + '.js')
}
if (fs.existsSync(p) && fs.lstatSync(p).isFile()) {
return {
application_id: appInDB.id,
module: serv.module,
name: serv.name,
arguments: serv.arguments,
return_type: serv.returnType,
is_async: serv.isAsync,
version: currentVersion.version,
source_id: sourceInDB.id,
is_public: isPublic,
file_path: serv.filepath
}
} else {
throw utils.unifyErrMesg(`Code file does not exist at [${p}] for service [${application}:${serv.module}/${serv.name}:${currentVersion.version}]`, 'sardines', 'publisher')
}
})
if (verbose) {
console.log('services to upload:')
utils.inspectedLog(serviceList)
}
const res = await RepositoryClient.createOrUpdateService(serviceList)
if (verbose) {
console.log('created or updated services:')
utils.inspectedLog(res)
}
return res
}