0.1.3 • Public • Published

    Grunt SF Jedi

    This is a set of grunt tasks for the sf-jedi package. if you are not familiar with grunt then you can take a look through the provided link

    The tasks basically expose functionality from the Salesforce metadata api via JSforce. See the linked repo for more details

    Note: Currently this is not maintained as I am not working on any Salesforce system. Also there is a really nice project called dmc which I found out about later after implementing this and it is aiming to do a lot of what I wanted so you should check it out


    If you dont have grunt install the grunt-cli via

    npm install -g grunt-cli

    Install these grunt tasks and add to dev dependencies with

    npm install grunt-sf-jedi --save-dev


    You need a Gruntfile.js in your project root so here is a very simple example one:

    'use strict';
    // I use this to load a .env file with the SF_* vars, it is optional
    // This is an example file of some Gruntfile.js
    module.exports = function(grunt) {
        // Set the base force object
        force: {
          // Set some global options
          options: {
            // All of these are set in my .env in the project root folder and
            // I am using 'dotenv' package to load them
            // username: process.env.SF_USERNAME,
            // password: process.env.SF_PASSWORD,
            // token: process.env.SF_TOKEN,
            // host: process.env.SF_HOST,
          // Define all the tasks with NO options
          init: {}, pull: {}, push: {}, reset:{}
      // Load the tasks from the npm package
      // Default tasks? these run on 'grunt' with no command

    To then run any of these tasks, from the project root run grunt force:<task>. For example, to initialize the project folder you would run grunt force:init.


    As shown in the example above you can set options on the force.options object. However, every task can have an options object as well and they will all be mixed into one full options definition.

    For each example I will provide just the object, with the options. You should just use the options not the whole snippet as it obviously wont be complete. Here are some global options (though, all options can be set globally)

    force: {
      options: {
        pollTimeout:60000, // Time in ms for jsforce retrieve / deploy
        pollInterval:1000, // Time between polls in ms for jsforce
        logging: {
          level: 'debug' // Set log output level


    The force:init task will initialize the project folder by creating a .force folder.

    Here are some options you might want to set on init. Usually the 'src' is set but if you want you can set any of these, even changing the package.xml here.

    init: {
      options: {
        project: {
          src: './src', // Where the files will go (do not leave a trailing /)
          pullOnInit: false, // Set this true if you want to pull after initialising
          createMetaXml: true, // True if you want missing -meta.xml to be created
          deleteSrcOnReset: true, // Set to false if you dont want the src folder to be reset
          // You can set the whole package.xml, this is the default(which is set for you)
          package: {
            types: [
              { members: '*', name: 'ApexClass' },
              { members: '*', name: 'ApexComponent' },
              { members: '*', name: 'ApexPage' },
              { members: '*', name: 'ApexTrigger' },
              { members: '*', name: 'StaticResource' }
            version: '34.0' // if you change THIS version it will be used


    The force:pull task will pull all the metadata down based off the package definition.

    You might find inconsistencies if you are setting the package as above in init but then you change the retrieved package.xml. In a later sf-jedi version that wont be a problem but take note of that for now.

    Here is an example with some options

    pull: {
      options: {
        // You can set these per Pull, Push or globaly
        pollTimeout: 120000, // Same as the global
        pollInterval: 1000   // Same as the global

    This will override local changes in this version so be careful. In the future that will not be the case.


    The force:push task will push all the meta data up to the org based again off the package definition.

    Here is an example for push, note that there are a lot of options that you can set if you look at the salesforce reference you can provide all of those

    push: {
      options: {
        pollTimeout: 240000, // Yes you can set these again
        // A random selection from salesforce docs
        allowMissingFiles: true,

    It will push ALL files until a later sf-jedi version


    The force:reset task will obliterate the entire .force/ folder and potentially the src folder unless configured with an option. Here is an example

      options: {
        deleteSrcOnReset: false, // Set to false if you dont want the src folder to be reset

    Planned Features

    The planned features are discussed at the sf-jedi repo. However, key features coming to list here are:

    • Correct file tracking to push or pull in desired changes only
    • Watch functionality to auto push saved files
    • Clearer messages and configurable options.



    npm i grunt-sf-jedi

    DownloadsWeekly Downloads






    Last publish


    • lessonteacher