hana-cli
Version:
HANA Developer Command Line Interface
323 lines (314 loc) • 11.5 kB
JavaScript
// @ts-check
import * as base from '../utils/base.js'
import * as dbInspect from '../utils/dbInspect.js'
import dbClass from "sap-hdb-promisfied"
import * as conn from "../utils/connections.js"
import cds from '@sap/cds'
global.__xRef = []
export const command = 'inspectView [schema] [view]'
export const aliases = ['iv', 'view', 'insVew', 'inspectview']
export const describe = base.bundle.getText("inspectView")
export const builder = base.getBuilder({
view: {
alias: ['v', 'View'],
type: 'string',
desc: base.bundle.getText("view")
},
schema: {
alias: ['s', 'Schema'],
type: 'string',
default: '**CURRENT_SCHEMA**',
desc: base.bundle.getText("schema")
},
output: {
alias: ['o', 'Output'],
choices: ["tbl", "sql", "sqlite", "cds", "json", "yaml", "cdl", "annos", "edm", "edmx", "swgr", "openapi", "hdbview", "hdbcds", "jsdoc", "graphql", "postgres"],
default: "tbl",
type: 'string',
desc: base.bundle.getText("outputType")
},
useHanaTypes: {
alias: ['hana'],
type: 'boolean',
default: false,
desc: base.bundle.getText("useHanaTypes")
},
useExists: {
alias: ['exists', 'persistence'],
desc: base.bundle.getText("gui.useExists"),
type: 'boolean',
default: true
},
useQuoted: {
alias: ['q', 'quoted', 'quotedIdentifiers'],
desc: base.bundle.getText("gui.useQuoted"),
type: 'boolean',
default: false
},
noColons: {
type: 'boolean',
default: false,
desc: base.bundle.getText("noColons")
}
})
export let inputPrompts = {
view: {
description: base.bundle.getText("view"),
type: 'string',
required: true
},
schema: {
description: base.bundle.getText("schema"),
type: 'string',
required: true
},
output: {
description: base.bundle.getText("outputType"),
type: 'string',
// validator: /t[bl]*|s[ql]*|c[ds]?/,
required: true
},
useHanaTypes: {
description: base.bundle.getText("useHanaTypes"),
type: 'boolean'
},
useExists: {
description: base.bundle.getText("gui.useExists"),
type: 'boolean'
},
useQuoted: {
description: base.bundle.getText("gui.useQuoted"),
type: 'boolean'
},
noColons: {
type: 'boolean',
description: base.bundle.getText("noColons")
}
}
export function handler(argv) {
base.promptHandler(argv, viewInspect, inputPrompts)
}
export async function viewInspect(prompts) {
base.debug('viewInspect')
const [{ highlight }, YAML, { parse, convert }] = await Promise.all([
import('cli-highlight'),
import('json-to-pretty-yaml'),
import('odata2openapi')
])
try {
base.setPrompts(prompts)
let dbConnection = await conn.createConnection(prompts, false)
const db = new dbClass(dbConnection)
let schema = await base.dbClass.schemaCalc(prompts, db)
base.debug(`${base.bundle.getText("schema")}: ${schema}, ${base.bundle.getText("view")}: ${prompts.view}`)
dbInspect.options.useHanaTypes = prompts.useHanaTypes
dbInspect.options.useExists = prompts.useExists
dbInspect.options.noColons = prompts.noColons
dbInspect.options.useQuoted = prompts.useQuoted
let object = await dbInspect.getView(db, schema, prompts.view)
let fields = []
let parameters = []
if (await dbInspect.isCalculationView(db, schema, prompts.view)) {
fields = await dbInspect.getCalcViewFields(db, schema, prompts.view, object[0].VIEW_OID)
parameters = await dbInspect.getCalcViewParameters(db, schema, prompts.view, object[0].VIEW_OID)
} else {
fields = await dbInspect.getViewFields(db, object[0].VIEW_OID)
parameters = await dbInspect.getViewParameters(db, object[0].VIEW_OID)
}
// @ts-ignore
Object.defineProperty(cds.compile.to, 'openapi', { configurable: true, get: () => base.require('@sap/cds-dk/lib/compile/openapi') })
var results = {}
switch (prompts.output) {
case 'tbl':
console.log(object[0])
results.basic = object[0]
console.log("\n")
base.outputTableFancy(fields)
if (parameters && parameters.length > 0){
results.parameters = parameters
base.outputTableFancy(parameters)
}
results.fields = fields
break
case 'sql': {
let definition = await dbInspect.getDef(db, schema, prompts.view)
results.sql = definition
console.log(highlight(definition))
break
}
case 'sqlite': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "hdbview", schema)
cdsSource = `service HanaCli { ${cdsSource} } `
// @ts-ignore
console.log(highlight(cds.compile.to.sql(cds.parse(cdsSource), { as: 'str', dialect: 'sqlite' })))
break
}
case 'postgres': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "hdbview", schema)
cdsSource = `service HanaCli { ${cdsSource} } `
// @ts-ignore
console.log(highlight(cds.compile.to.sql(cds.parse(cdsSource), { as: 'str', dialect: 'postgres' })))
break
}
case 'cds': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
results.cds = cdsSource
console.log(highlight(cdsSource))
break
}
case 'json': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
console.log(highlight(cds.compile.to.json(cds.parse(cdsSource))))
break
}
case 'hdbcds': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "hdbview", schema)
let all = cds.compile.to.hdbcds(cds.parse(cdsSource))
for (let [src] of all)
// @ts-ignore
console.log(highlight(src))
console.log(`\n`)
break
}
case 'hdbview': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "hdbview", schema)
let all = cds.compile.to.hdbtable(cds.parse(cdsSource))
for (let [src] of all) {
results.hdbtable = src
// @ts-ignore
console.log(highlight(src))
}
console.log(`\n`)
break
}
case 'yaml': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
console.log(highlight(cds.compile.to.yaml(cds.parse(cdsSource))))
break
}
case 'cdl': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
// @ts-ignore
console.log(highlight(cds.compile.to.cdl(cds.parse(cdsSource))))
break
}
case 'graphql': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
// @ts-ignore
console.log(highlight(cds.compile.to.gql(cds.parse(cdsSource))))
break
}
case 'edmx': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
let metadata = await cds.compile.to.edmx(cds.parse(cdsSource), {
version: 'v4',
})
// @ts-ignore
console.log(highlight(metadata))
break
}
case 'annos': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
let metadata = await cds.compile.to.edmx(cds.parse(cdsSource), {
// @ts-ignore
annos: 'only'
})
// @ts-ignore
console.log(highlight(metadata))
break
}
case 'edm': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
console.log(highlight(JSON.stringify(cds.compile.to.edm(cds.parse(cdsSource)), null, 4)))
break
}
case 'swgr': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema)
cdsSource = `service HanaCli { ${cdsSource} } `
let metadata = await cds.compile.to.edmx(cds.parse(cdsSource), {
version: 'v4',
})
const odataOptions = { basePath: '/odata/v4/opensap.hana.CatalogService/' }
// @ts-ignore
parse(metadata)
// @ts-ignore
.then(service => convert(service.entitySets, odataOptions, service.version))
.then(swagger => console.log(highlight(JSON.stringify(swagger, null, 2))))
.catch(error => console.error(error))
break
}
case 'openapi': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
try {
// @ts-ignore
let metadata = await cds.compile.to.openapi(cds.parse(cdsSource), {
service: 'HanaCli',
servicePath: '/odata/v4/opensap.hana.CatalogService/',
'openapi:url': '/odata/v4/opensap.hana.CatalogService/',
'openapi:diagram': true,
to: 'openapi'
})
console.log(highlight(JSON.stringify(metadata, null, 2)))
break
}
catch (e) {
if (e.code !== 'MODULE_NOT_FOUND') {
// Re-throw not "Module not found" errors
throw e
}
throw base.bundle.getText("cds-dk")
}
}
case 'jsdoc': {
let cdsSource = await dbInspect.formatCDS(db, object, fields, null, "view", schema, null, parameters)
cdsSource = `service HanaCli { ${cdsSource} } `
try {
// @ts-ignore
let metadata = await cds.compile.to.openapi(cds.parse(cdsSource), {
service: 'HanaCli',
servicePath: '/odata/v4/opensap.hana.CatalogService/',
'openapi:url': '/odata/v4/opensap.hana.CatalogService/',
'openapi:diagram': true,
to: 'openapi'
})
let data = YAML.stringify(metadata)
var lines = data.split('\n')
let output =
'/**\n' +
' * @swagger\n' +
' * \n'
for (let line of lines) {
output += ' * ' + line + '\n'
}
output += ' */ \n'
console.log(highlight(output))
break
}
catch (e) {
if (e.code !== 'MODULE_NOT_FOUND') {
// Re-throw not "Module not found" errors
throw e
}
throw base.bundle.getText("cds-dk")
}
}
default: {
console.error(base.bundle.getText("unsupportedFormat"))
break
}
}
db.destroyClient()
await base.end()
return results
} catch (error) {
base.error(error)
}
}