Source: cli.js

#!/usr/bin/env node

'use strict'

/**
 * Pour appeler le cli avec une autre config que celle par défaut, passer par l'environnement :
 * `env SESATHEQUE_CONF=xxx app/cli.js …` pour utiliser la config _private/xxx.js
 */

const glob = require('glob')
const anLog = require('an-log')
const anLogLevels = require('an-log/source/lib/levels.js')
const boot = require('./boot')
const config = require('./config')

function beforeBootsrap (lassi, mainComponent, allComponents) {
  // on ajoute toutes les tasks AVANT le bootstrap
  const commands = {}
  let nbCommands = 0
  // eslint-disable-next-line node/no-path-concat
  glob.sync(`${__dirname}/cli/*.js`).concat(glob.sync(`${__dirname}/tasks/**/index.js`)).forEach(function (fichier) {
    // chaque module peut déclarer un service lassi *-cli et ne rien exporter, ou exporter
    // un objet dont chaque propriété sera une fonction avec une méthode help,
    // cette fonction deviendra alors une commande du nom de la propriété (les autres propriétés seront ignorées)
    // console.log('ajout du module', fichier)
    const module = require(fichier)
    const names = Object.keys(module)
    names.forEach((name) => {
      const fn = module[name]
      if (typeof fn === 'function' && typeof fn.help === 'function') {
        // console.log('ajout de la commande ', name)
        commands[name] = fn
        nbCommands++
      }
    })
    if (nbCommands) {
      // console.log('aj service $sesatheque-cli')
      mainComponent.service('$sesatheque-cli', function () {
        // un service est une fct, et un service *-cli doit retourner une fct
        // qui doit retourner un objet avec une propriété commands qui doit être un fct
        // qui doit retourner un objet dont chaque propriété est une commande…
        // C'est lassi qui l'a dit…
        return function () {
          return {
            commands: () => commands
          }
        }
      })
    }
  })
}

try {
  ;[config.application.name, '$auth', '$cache', 'EntityDefinition', 'lassi'].forEach(channel => anLog(channel).setLogLevel(anLogLevels.ERROR))
  // {cli: true} évite de lancer le serveur http et charge les services *.cli
  boot(beforeBootsrap, { cli: true }, () => {
    lassi.service('$cli').run()
  })
} catch (error) {
  console.error(error)
}