@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