Un peu d’interactivitĂ© dans vos outils node

Je vous expliquais il y a peu comment construire ses propres outils en ligne de commande avec node et npm : http://k33g.github.io/2014/05/09/NPM-NODE-CLI.html. Nous allons voir aujourd’hui comment ajoutĂ© un peu d’interactivitĂ© et de couleur Ă  tout ça. Donc, il faut repartir du mĂȘme projet (donc lire l’article).

2 nouveaux modules : prompt et colors.js

Lorsque je parle d’interactivitĂ©, je veux dire, que mon “programme” va “me poser” des questions auxquelles je vais devoir rĂ©pondre. Pour cela je vais utiliser prompt (https://github.com/flatiron/prompt), et pour les couleurs, le bien nommĂ© colors.js (https://github.com/Marak/colors.js). Modifiez donc votre fichier package.json de la maniĂšre suivante :

{
 "name": "bbtools",
 "version": "0.0.0",
 "bin": { "bb": "bb.js"},
 "dependencies": {
   "underscore": "1.6.0",
   "prompt": "0.2.12",
   "colors": "0.6.2"
  }
}

Puis faites moi un petit npm install pour télécharger les 2 nouvelles dépendances.

Modification de bb.js

Maintenant, plutĂŽt que de passer le nom du modĂšle en argument, je souhaite que ce soit l’outil qui demande le nom du modĂšle, je voudrais aussi pouvoir saisir les valeurs par dĂ©faut du modĂšle. Nous allons donc modifier le code du fichier bb.js de la façon suivante :

Ajout des référence à prompt et colors:

# !/usr/bin/env node

var fs = require('fs')
  , _ = require('underscore')
  , prompt = require('prompt')
  , colors = require('colors');

Ici on ne change rien:

require.extensions['.tpl'] = function (module, filename) {
  module.exports = fs.readFileSync(filename, 'utf8');
};

var tpl  = _.template(require("./bb.tpl"));

Ajout d’un “schema” de saisie pour prompt:

var schema = {
  properties: {
    model_name: {
      description: 'Enter model name'.green,
      pattern: /^[a-zA-Z]+$/,
      message: 'Model name must be only letters'.inverse.red,
      required: true
    },
    default_values: {
      description: 'Default values'.blue,
      default: ""
    }
  }
};

Vous notez que vous avez “la main” sur ce que vous pouvez ou n pouvez pas saisir. Ensuite, notez aussi ceci : 'Enter model name'.green ou 'Model name must be only letters'.inverse.red et encore 'Default values'.blue, c’est colors.js qui permet en augmentant les strings de dĂ©finir les couleurs d’affichage des textes dans votre console ou terminal.

Utilisation du “schema” de saisie:

Il suffi de passer à prompt.get() votre schema ainsi que la fonction à exécuter avec comme paramÚtres les erreurs (err) et les données saisies (result). resultest un objet qui a pour propriétés les propriétés de schema.properties donc model_name et default_values

prompt.get(schema, function (err, result) {

  if(err) {
    console.log("Bye!".rainbow);
    process.exit(1);
  } //Ctrl+c to exit

  console.log(JSON.stringify(result).cyan);

  fs.writeFileSync(
      process.cwd() +"/" + result.model_name + ".js"
    , tpl({modelName: result.model_name, defaultValues: result.default_values})
  );

});

Modification du template bb.tpl

Nous modifions le template pour prendre en compte la nouvelle valeur defaultValues: result.default_values :

/*--- <%= modelName %> Model ---*/
var <%= modelName %>Model = Backbone.Model.extend({
  defaults : function (){
    return {<%= defaultValues %>}
  },
  urlRoot : "<%= modelName.toLowerCase() %>s"
});

/*--- <%= modelName %>s Collection ---*/
var <%= modelName %>sCollection = Backbone.Collection.extend({
  url : "<%= modelName.toLowerCase() %>s",
  model: <%= modelName %>Model
});

Utilisation

Dans un terminal, tapez bb et répondez (trompez vous aussi) :

Alt "mytool2.png"

Alt "mytool1.png"

Avec le code généré :

/*--- Human Model ---*/
var HumanModel = Backbone.Model.extend({
  defaults : function (){
    return {firstName:"John", lastName:"Doe"}
  },
  urlRoot : "humans"
});

/*--- Humans Collection ---*/
var HumansCollection = Backbone.Collection.extend({
  url : "humans",
  model: HumanModel
});

C’est tout simple, un peu plus “user friendly”, et bientît vous pourrez refaire Yeoman ;).

Bonne journée!

blog comments powered by Disqus

Related posts