@servable/tools
Version:
Servable tools is a utility that builds a protocol's manifest and documents it.
120 lines (100 loc) • 2.94 kB
JavaScript
import classStruct from './classStruct/index.js'
import _ from 'underscore'
import extractClassesProtocol from './extractClassesProtocol.js'
const perform = async ({
protocolFactory,
protocol,
updateProtocolsExcerpt,
instancesPathId = []
}) => {
const defaultResult = [
protocol
]
//#TODO: protocol.loader
if (!(await protocol.loader.isValid())) {
console.log('protocol not valid', protocol.id, protocol.loader.path)
return defaultResult
}
//#TODO: protocol.loader
const classesSchemas = await protocol.loader.classesSchemas()
if (!classesSchemas) {
return defaultResult
}
if (protocol.id === 'app') {
await Servable.engine.formatAppClassesSchemas({ classesSchemas })
}
let adaptedClassesStructs = []
let classesProtocols = []
for (var i in classesSchemas) {
const classSchema = classesSchemas[i]
const adaptedClassStruct = await classStruct({
protocol,
classSchema,
protocolFactory,
instancesPathId: [
...instancesPathId,
{ type: 'class', value: { className: classSchema.className } }
]
})
adaptedClassesStructs = adaptedClassesStructs.concat(adaptedClassStruct)
let { protocolsPayloads } = adaptedClassStruct
if (!protocolsPayloads || !protocolsPayloads.length) {
continue
}
protocolsPayloads = protocolsPayloads.filter(a => (a && a.id !== protocol.id))
//#TODO Move from uniq to cleanprotocols
protocolsPayloads = _.uniq(protocolsPayloads, a => a.id)
const classProtocols = await extractClassesProtocol({
protocolsPayloads,
protocolFactory,
updateProtocolsExcerpt,
instancesPathId: [
...instancesPathId,
{
type: 'class',
value: { className: classSchema.className }
}
],
extractProtocol: perform
})
classesProtocols = classesProtocols.concat(classProtocols)
}
await updateProtocolsExcerpt({ adaptedClassesStructs })
let ownClasses = adaptedClassesStructs.map(i => i.classSchema).filter(a => a)
let jsClasses = adaptedClassesStructs.map(i => i._class).filter(a => a)
classesProtocols = _.uniq(classesProtocols, a => a.id)
if (!classesProtocols.length) {
//#TODO: protocol.schema
protocol.schema = {
...protocol.schema,
classes: {
managed: ownClasses,
all: ownClasses
},
jsClasses
}
return [protocol]
}
//#TODO: protocol.schema
let all = [...ownClasses]
classesProtocols.forEach(element => {
const { classes: { managed: _own = [], all: _all = [] } = {} } = element.schema
all = [...all, ..._all]
all = _.uniq(all, 'className')
})
//#TODO: protocol.schema
protocol.schema = {
...protocol.schema,
classes: {
managed: ownClasses,
all
},
jsClasses
}
protocol.extractionStatus = 2
return [
protocol,
...classesProtocols
]
}
export default perform