npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

broccoli-destiny

v0.0.4

Published

A broccoli wrapper that enables output to multiple directories

Downloads

11

Readme

broccoli-destiny

broccoli-destiny is a wrapper around broccoli that supports outputting Broccoli sub-trees to multiple target destinations.

broccoli-destiny provides a CLI and a programmatic interface.

CLI Usage

broccoli-destiny supports most of broccoli CLI's command line options. However, broccoli-destiny currently only supports the build command and does not support serve.

Single Output Destination

broccoli-destiny build ./dist

will output the entire Broccoli tree to the ./dist directory. This is essentially equivalent to broccoli build ./dist.

Multiple Output Destinations

Given the following Broccoli tree:

├── a
│   └── a.js
├── b
│   └── b.js
├── c
│   └── c.js
└── root.js
broccoli-destiny build a:./distA b:./distB dist

will output the sub-tree of ./a into ./distA, ./b into ./distB, and everything else into ./dist:

├── distA
│   └── a.js
├── distB
│   └── b.js
├── c
│   └── c.js
└── root.js

Configuration

By default, broccoli-destiny will attempt to load a broccoli-destiny.config.js file, if it exists. You can specify your own file path using the --destiny-path option:

broccoli-destiny build --destiny-path=myCustomDestinyConfig.js

Configuration File

// export a function that accepts incoming Broccoli options
module.exports = (options) => {
  // return the config
  return {
    // outgoing Broccoli options (passed to Brocfile)
    options,
    // custom broccoli-destiny targets go here
    targets: [

    ],
    // plugins (see below)
    plugins: [],
  };
};

Example

Given the following Broccoli tree:

├── a
│   └── a.js
├── b
│   └── b.js
├── c
│   └── c.js
└── root.js

and the following broccoli-destiny.config.js:

const path = require('path');
module.exports = (options) => {
  return {
    options,
    targets: [
      {
        input: 'a',
        output: path.resolve('distA'),
      },
      {
        input: 'b',
        output: path.resolve('distB'),
      },
      {
        input: '.',
        output: path.resolve('dist'),
      },
    ],
  };
};

and the following command:

broccoli-destiny build

will output the sub-tree of ./a into ./distA, ./b into ./distB, and everything else into ./dist:

├── distA
│   └── a.js
├── distB
│   └── b.js
├── c
│   └── c.js
└── root.js

Plugins

Example

// MyDestinyPlugin.js
const path = require('path');
const { BroccoliDestinyPlugin } = require('broccoli-destiny');
const subTreeDir = './my-custom-tree';

module.exports = class MyDestinyPlugin extends BroccoliDestinyPlugin {
  constructor(options) {
    super();
    this.customOptions = options;
  }

  init(destiny, { targets }) {
    // initialize _before_ we load the Brocfile
    const { customOptions } = this;

    // return the new destiny targets
    return {
      // prepend our targets
      targets: [
        // <subTreeDir>/merged gets merged to <appRoot>/merged
        {
          input: path.join(subTreeDir, 'merged'),
          output: path.join(customOptions.appRoot, 'merged'),
          // we want to preserve the existing _codegen directory, so merge our output
          merge: true,
        },

        // everything else in <subTreeDir>/ gets merged to the buildDest
        {
          input: destDir,
          output: customOptions.buildDest,
        },

        // add the rest of the targets _after_ our custom targets
        ...targets,
      ],
    };
  }

  // perform any custom setup actions to be invoked _before_ each build is started (but after Brocfile is loaded)
  setup() {
    super.setup();
    // ...
  }

  // perform any custom cleanup actions to be invoked _after_ each build has finished
  cleanup() {
    super.cleanup();
    // ...
  }
};
// broccoli-destiny.config.js
const MyDestinyPlugin = require('./MyDestinyPlugin');

module.exports = (options) => {
  return {
    options,
    plugins: [
      new MyDestinyPlugin({
        appRoot: __dirname,
        // where `options.environment` is the Broccoli environment
        buildDest: options.environment === 'production' ? path.resolve('./dist') : path.resolve('./tmp/dist')
      })
    ]
  }
};