Browser compilation library – an asset pipeline for applications that run in the browser

Related tags

Build Tools broccoli
Overview

Broccoli

Build Status

A fast, reliable asset pipeline, supporting constant-time rebuilds and compact build definitions. Comparable to the Rails asset pipeline in scope, though it runs on Node and is backend-agnostic.

For more information and guides/documentation, checkout broccoli.build

For background and architecture, see the introductory blog post.

For the command line interface, see broccoli-cli.

Installation

npm install --save-dev broccoli
npm install --global broccoli-cli

Brocfile.js

A Brocfile.js file in the project root contains the build specification. It should export a function that returns a tree. Note: the Brocfile historically could export a tree/string directly, however this is now deprecated in favor of a function that can receive options

A tree can be any string representing a directory path, like 'app' or 'src'. Or a tree can be an object conforming to the Plugin API Specification. A Brocfile.js will usually directly work with only directory paths, and then use the plugins in the Plugins section to generate transformed trees.

The following simple Brocfile.js would export the app/ subdirectory as a tree:

export default () => 'app';

With that Brocfile, the build result would equal the contents of the app tree in your project folder. For example, say your project contains these files:

app
├─ main.js
└─ helper.js
Brocfile.js
package.json
…

Running broccoli build the-output (a command provided by broccoli-cli) would generate the following folder within your project folder:

the-output
├─ main.js
└─ helper.js

Options

The function that is exported from module.exports is passed an options hash by Broccoli that can be used when assembling the build.

The options hash is populated by the CLI environment when running broccoli build or broccoli serve. It currently only accepts a single option --environment, which is passed as env in the options hash.

Additionally --prod and --dev are available aliases to --environment=production and --environment=development respectively.

  • options:
    • env: Defaults to development, and can be overridden with the CLI argument --environment=X

For example:

export default (options) => {
    // tree = ... assemble tree

    // In production environment, minify the files
    if (options.env === 'production') {
        tree = minify(tree);
    }

    return tree;
}

TypeScript Support

A Brocfile.ts can be used in place of a Brocfile.js and Broccoli will automatically parse this through ts-node to provide TypeScript support. This allows developers to leverage type information when assembling a build pipeline. By default, Broccoli provides type information for the options object passed to the build function.

import { BrocfileOptions } from 'broccoli';

export default (options: BrocfileOptions) => {
  // tree = ... assemble tree

  // In production environment, minify the files
  if (options.env === 'production') {
    tree = minify(tree);
  }

  return tree;
};

Typescript by default only allows the ES6 modules import/export syntax to work when importing ES6 modules. In order to import a CommonJS module (one that uses require() or module.exports, you must use the following syntax:

import foo = require('foo');

export = 'bar';

You'll note the syntax is slightly different from the ESM syntax, but reads fairly well.

Using plugins in a Brocfile.js

The following Brocfile.js exports the app/ subdirectory as appkit/:

// Brocfile.js
import Funnel from 'broccoli-funnel';

export default () => new Funnel('app', {
  destDir: 'appkit'
})

Broccoli supports ES6 modules via esm for Brocfile.js. Note, TypeScript requires the use of a different syntax, see the TypeScript section above.

You can also use regular CommonJS require and module.exports if you prefer, however ESM is the future of Node, and the recommended syntax to use.

That example uses the plugin broccoli-funnel. In order for the import call to work, you must first put the plugin in your devDependencies and install it, with

npm install --save-dev broccoli-funnel

With the above Brocfile.js and the file tree from the previous example, running broccoli build the-output would generate the following folder:

the-output
└─ appkit
   ├─ main.js
   └─ helper.js

Plugins

You can find plugins under the broccoli-plugin keyword on npm.

Using Broccoli Programmatically

In addition to using Broccoli via the combination of broccoli-cli and a Brocfile.js, you can also use Broccoli programmatically to construct your own build output via the Builder class. The Builder is one of the core APIs in Broccoli, and is responsible for taking a graph of Broccoli nodes and producing an actual build artifact (i.e. the output usually found in your dist directory after you run broccoli build). The output of a Builder's build method is a Promise that resolves when all the operations in the graph are complete. You can use this promise to chain together additional operations (such as error handling or cleanup) that will execute once the build step is complete.

By way of example, let's assume we have a graph of Broccoli nodes constructed via a combination of Funnel and MergeTrees:

// non Brocfile.js, regular commonjs
const Funnel = require('broccoli-funnel');
const MergeTrees = require('broccoli-merge-trees');

const html = new Funnel(appRoot, {
  files: ['index.html'],
  annotation: 'Index file'
})

const js = new Funnel(appRoot, {
  files: ['app.js'],
  destDir: '/assets',
  annotation: 'JS Files'
});

const css = new Funnel(appRoot, {
  srcDir: 'styles',
  files: ['app.css'],
  destDir: '/assets',
  annotation: 'CSS Files'
});

const public = new Funnel(appRoot, {
  annotation: 'Public Files'
});

const tree = new MergeTrees([html, js, css, public]);

At this point, tree is a graph of nodes, each of which can represent either an input or a transformation that we want to perform. In other words, tree is an abstract set of operations, not a concrete set of output files.

In order to perform all the operations described in tree, we need to do the following:

  • construct a Builder instance, passing in the graph we constructed before
  • call the build method, which will traverse the graph, performing each operation and eventually writing the output to a temporary folder indicated by builder.outputPath

Since we typically want do more than write to a temporary folder, we'll also use a library called TreeSync to sync the contents of the temp file with our desired output directory. Finally, we'll clean up the temporary folder once all our operations are complete:

const { Builder } = require('broccoli');
const TreeSync = require('tree-sync');
const MergeTrees = require('broccoli-merge-trees');
// ...snip...
const tree = new MergeTrees([html, js, css, public]);

const builder = new Builder(tree);

const outputDir = 'dist';
const outputTree = new TreeSync(builder.outputPath, outputDir);

builder.build()
  .then(() => {
    // Calling `sync` will synchronize the contents of the builder's `outPath` with our output directory.
    return outputTree.sync();
  })
  .then(() => {
    // Now that we're done with the build, clean up any temporary files were created
    return builder.cleanup();
  })
  .catch(err => {
    // In case something in this process fails, we still want to ensure that we clean up the temp files
    console.log(err);
    return builder.cleanup();
  });

Running Broccoli, Directly or Through Other Tools

Helpers

Shared code for writing plugins.

Plugin API Specification

See docs/node-api.md.

Also see docs/broccoli-1-0-plugin-api.md on how to upgrade from Broccoli 0.x to the Broccoli 1.x API.

Security

  • Do not run broccoli serve on a production server. While this is theoretically safe, it exposes a needlessly large amount of attack surface just for serving static assets. Instead, use broccoli build to precompile your assets, and serve the static files from a web server of your choice.

Get Help

  • IRC: #broccolijs on Freenode. Ask your question and stick around for a few hours. Someone will see your message eventually.
  • Twitter: mention @jo_liss with your question
  • GitHub: Open an issue on a specific plugin repository, or on this repository for general questions.

License

Broccoli was originally written by Jo Liss and is licensed under the MIT license.

The Broccoli logo was created by Samantha Penner (Miric) and is licensed under CC0 1.0.

Comments
  • Symlink refactoring

    Symlink refactoring

    Scratchpad to keep track of things. @rwjblue, please edit freely :)

    Things to do:

    Part 1

    • [x] ~~add .brocignore functionality to deal with Emacs lockfiles and such~~ (@joliss and @rwjblue decided to make this a plugin concern)
    • [x] hashTree has murky edge cases, could likely just be rewritten (and extracted) - fixed in https://github.com/broccolijs/broccoli-kitchen-sink-helpers/pull/24 and we'll likely phase this function out in the future
    • [x] though deprecated, perhaps we can simply change copyRecursivelySync and copyPreserveSync to use stat instead of lstat - https://github.com/broccolijs/broccoli-kitchen-sink-helpers/commit/02276ba63153d39db5c7473364dcd3727881d86b
    • [x] broccoli-concat (probably simply lstat to stat) - https://github.com/rlivsey/broccoli-concat/pull/15
    • [x] broccoli-file-mover & remover - double-check symlink resolution; also, are we sure rimraf cannot delete source files now that path components can be symlinks?
    • [x] ~~add symlink behavior to spec in README,~~ and make a document to describe this change and how it affects compatibility - docs/symlink-change.md (work in progress)

    Part 2 - Symlink Consumption

    Release updated package versions:

    • [x] node-walk-sync
    • [x] broccoli-kitchen-sink-helpers (https://github.com/broccolijs/broccoli-kitchen-sink-helpers/pull/24)
    • [x] broccoli-file-mover & remover
    • [x] broccoli-concat
    • [x] broccoli-filter (it gets the new hashTree through a floating dependency)
    • [x] broccoli

    Part 3 - Symlink Optimization

    Release updated package versions:

    • [x] broccoli-static-compiler (v0.2.0)
    • [ ] broccoli-filter (https://github.com/broccolijs/broccoli-filter/pull/14 -- emit symlinks)
    • [x] broccoli-merge-trees (v0.2.0)

    Part 4

    • [ ] Windows performance: we can probably use symlinks when we have rights to, or junctions (not sure if that will lead to correct behavior), instead of always copying
    • [ ] broccoli-caching-writer can use symlinking instead of hardlinking now
    • [ ] allow for passing in existing stats and lstats objects into node-symlink-or-copy and node-copy-dereference
    • [ ] there are more uses of deprecated helper functions like copyRecursivelySync across GitHub - https://github.com/tildeio/htmlbars/pull/76
    opened by joliss 65
  • Left-over tmp files

    Left-over tmp files

    Not sure if this should be in the ember-cli repo, but it seems to be related to builds.

    Using Windows 7, ember-cli v. 40, broccoli-merge-trees v. 0.1.4.

    Just yesterday, in trying to get my ember server build times lower than 100 seconds, I just removed everything in my /tmp directory, and even though I only have a couple dependencies and very few new files, there were over 6GB in that directory.

    I'm guessing it's because every time I save a change I get an ENOENT error for something in /tmp, either "directory not empty" or "no such file or directory" so I have to just Ctrl+c and then restart the server.

    There may be a number of separate issues here, and I'm perfectly open to the possibility that it may just be me since I'm fairly new to all this.

    $ ember server
    version: 0.0.40
    ENOENT, no such file or directory 'c:\dev\star\tmp\tree_merger-tmp_dest_dir-gpm3q43C.tmp\fontawesome\src\cheatsheet.html
    '
    Error: ENOENT, no such file or directory 'c:\dev\star\tmp\tree_merger-tmp_dest_dir-gpm3q43C.tmp\fontawesome\src\cheatshe
    et.html'
        at Object.fs.lstatSync (fs.js:679:18)
        at copyRecursivelySync (c:\dev\star\node_modules\ember-cli\node_modules\broccoli-static-compiler\node_modules\broccoli-kitchen-sink-helpers\index.js:142:21)
        at copyRecursivelySync (c:\dev\star\node_modules\ember-cli\node_modules\broccoli-static-compiler\node_modules\broccoli-kitchen-sink-helpers\index.js:148:7)
        at copyRecursivelySync (c:\dev\star\node_modules\ember-cli\node_modules\broccoli-static-compiler\node_modules\broccoli-kitchen-sink-helpers\index.js:148:7)
        at Object.copyRecursivelySync (c:\dev\star\node_modules\ember-cli\node_modules\broccoli-static-compiler\node_modules\broccoli-kitchen-sink-helpers\index.js:148:7)
        at c:\dev\star\node_modules\ember-cli\node_modules\broccoli-static-compiler\index.js:20:15
        at $$$internal$$tryCatch (c:\dev\star\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:470:16)
        at $$$internal$$invokeCallback (c:\dev\star\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:482:17)
        at $$$internal$$publish (c:\dev\star\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:453:11)
        at $$rsvp$asap$$flush (c:\dev\star\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:1531:9)
    Livereload server on port 35729
    Serving on http://0.0.0.0:4200
    
    opened by jdhines 35
  • Refactor Watcher to not poll?

    Refactor Watcher to not poll?

    I've been noticing that the Broccoli Watcher task is taking up a constant 4% CPU on a medium-sized project. I think Watcher should not poll by default, but instead preform a check every time its then() method is called.

    If someone wants the Watcher to poll, then they could easily setup a setInterval(watcher.check, 100). This would also ensure that when the middleware/server receives a request for a file, it will always be built and up to date.

    @joliss Thoughts? If this seems good to you, I'd be happy to issue a PR for this change.

    opened by ericf 34
  • Broccolijs.com

    Broccolijs.com

    I had some free time and noticed broccoli doesn't have an official website so I made http://broccolijs.com. If it's something you'd like to use, I'm happy to turn over the repo and registration to the broccoli project.

    screen shot 2014-12-02 at 21 36 58

    opened by folz 28
  • Add CORS header

    Add CORS header

    When developing with Broccoli, sometimes one might want to serve up font files from the Broccoli server. However, certain browsers restrict access to font files based on CORS rules. This makes it impossible to have broccoli serve up font files to another application running on a separate port. This simply adds a CORS header which allows access to these files.

    opened by jnicklas 24
  • Speed up with multi-threading?

    Speed up with multi-threading?

    Hi there, I've got a pretty large app I'm working on, and I'm getting pretty long build times (~7000ms at times). I was wondering if you thought it might be practical to use child_process.fork() or the cluster module to split the build process up among a computer's full processor.

    This blog post is a pretty good introduction to the methods, I'm not adverse to trying to implement this myself, but I'd like some help grasping the broccoli architecture to help me do it.

    Where, for example, is the individual file processing assigned?

    opened by danfinlay 21
  • Data loss on OS X in conjunction with hardlinks+symlinks

    Data loss on OS X in conjunction with hardlinks+symlinks

    @thomasboyt suggests rm -rf tmp on OS X might cause files to be deleted outside of the tmp directory, due to the way some Broccoli plugins use hardlinks combined with idiosyncracies in hardlink & symlink handling on OS X.

    https://gist.github.com/thomasboyt/9935811

    This clearly warrants further investigation.

    opened by joliss 21
  • Refactor + Hooks to support Visualizing the tree nodes.

    Refactor + Hooks to support Visualizing the tree nodes.

    • formalize Node into a first class entity
    • extract and name large callbacks in then chains
    • remove semi-colon
    • rename self -> builder so it is clear when reading
    • RSVP.resolve -> Promise.resolve
    • upgrade RSVP
    • add scripts/graph.js which converts the broccoli-tree.json into dot for graphviz to consume

    all this provide the hooks to produce the following visualization: (https://github.com/stefanpenner/broccoli-viz will provide the rest)

    1. name of named trees
    2. id un-named of tree
    3. self time of each tree

    graph

    opened by stefanpenner 20
  • ensure `builder.cleanup()` waits on pending work

    ensure `builder.cleanup()` waits on pending work

    Prior to this, if cleanup was invoked while the build was cancelling, it would begin to do cleanup prior to the current step completing. Which would typically result in "missing directory" or "missing file" errors, which would then result in the build crashing and not completing it cleanup rather then exiting cleanly.

    • [x] debug OOM which becomes apparent during mid-build cancellations (issue with: aggregateTime)
    • [x] confirm
    • [x] test
    opened by stefanpenner 19
  • Windows 7 almost everytime on change file - ENOTEMPTY, directory not empty '

    Windows 7 almost everytime on change file - ENOTEMPTY, directory not empty '

    Hi! I'm trying to work with Ember-CLI and when I execute

    "ember server"

    in my console using "Run As Administrator". It execute correct, but when I change any file, during watch operation it throws error:

    "file changed templates\application.hbs ENOTEMPTY, directory not empty '{path}\tmp\funnel-dest_T8wFIP.tmp' Error: ENOTEMPTY, directory not empty '{path}\tmp\funnel-dest_T8wFIP.tmp' at Object.fs.rmdirSync (fs.js:612:18) at rmkidsSync ({path}\node_modules\ember-cli\node_modules\rimraf\rimraf.js:247:11) at rmdirSync ({path}\node_modules\ember-cli\node_modules\rimraf\rimraf.js:237:7) at fixWinEPERMSync ({path}\node_modules\ember-cli\node_modules\rimraf\rimraf.js:150:5) at Function.rimrafSync [as sync]({path}node_modulesember-clinode_modulesrimrafrimraf.js:216 :26) at Funnel.cleanup ({path}\node_modules\ember-cli\node_modules\broccoli-funnel\index.js:96:19) at $$$internal$$tryCatch ({path}\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:490:16) at $$$internal$$invokeCallback ({path}\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:502: 17) at {path}\node_modules\ember-cli\node_modules\rsvp\dist\rsvp.js:1096:13 at Object.$$rsvp$asap$$flush [as _onImmediate]({path}node_modulesember-clinode_modulesrsvpd istrsvp.js:1581:9)"

    I've turned off Index Options, Windows Defender and nothing changed. What could happened?

    Thank you!

    P.S. I'm using last ember-cli package version - 0.1.7

    opened by denieler 18
  • Proposal: Centralize Temp Directory Assignment

    Proposal: Centralize Temp Directory Assignment

    Currently, each plugin is choosing its own temp directory (generally hard-coding to ./tmp in quick-temp here). We need to be able to centralize this location, to allow usage of the system temp directory (or whatever option is passed).

    I see a couple of possible ways forward (in order of my personal preference):

    1. Set a property named tmpRoot on each tree before calling the read function. This would still easily allow utilities like quick-temp or the plugins themselves to handle the generation / deletion of actual directories to be used, but allows Broccoli to control the root location of the temp dirs.
    2. Add logic to the Broccoli builder itself to create and manage the temp directories for each tree providing the generated paths to the tree itself. This allows Broccoli to manager the exact location of each temp directory.
    3. Set process.env.BROCCOLI_TMP_ROOT inside the builder, and let all plugins read that environment variable.
    4. ????
    opened by rwjblue 18
  • Bump decode-uri-component from 0.2.0 to 0.2.2

    Bump decode-uri-component from 0.2.0 to 0.2.2

    Bumps decode-uri-component from 0.2.0 to 0.2.2.

    Release notes

    Sourced from decode-uri-component's releases.

    v0.2.2

    • Prevent overwriting previously decoded tokens 980e0bf

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.1...v0.2.2

    v0.2.1

    • Switch to GitHub workflows 76abc93
    • Fix issue where decode throws - fixes #6 746ca5d
    • Update license (#1) 486d7e2
    • Tidelift tasks a650457
    • Meta tweaks 66e1c28

    https://github.com/SamVerschueren/decode-uri-component/compare/v0.2.0...v0.2.1

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump got from 9.6.0 to 11.8.5

    Bump got from 9.6.0 to 11.8.5

    Bumps got from 9.6.0 to 11.8.5.

    Release notes

    Sourced from got's releases.

    v11.8.5

    https://github.com/sindresorhus/got/compare/v11.8.4...v11.8.5

    v11.8.3

    • Bump cacheable-request dependency (#1921) 9463bb6
    • Fix HTTPError missing .code property (#1739) 0e167b8

    https://github.com/sindresorhus/got/compare/v11.8.2...v11.8.3

    v11.8.2

    • Make the dnsCache option lazy (#1529) 3bd245f This slightly improves Got startup performance and fixes an issue with Jest.

    https://github.com/sindresorhus/got/compare/v11.8.1...v11.8.2

    v11.8.1

    • Do not throw on custom stack traces (#1491) 4c815c3a609eb74d0eb139414d9996b4f65dc3c0

    v11.8.0

    • Fix for sending files with size 0 on stat (#1488) 7acd380
    • beforeRetry allows stream body if different from original (#1501) 3dd2273
    • Set default value for an options object (#1495) 390b145

    https://github.com/sindresorhus/got/compare/v11.7.0...v11.8.0

    v11.7.0

    Improvements

    • Add pfx HTTPS option (#1364) c33df7f
    • Update body after beforeRequest (#1453) e1c1844
    • Don't allocate buffer twice (#1403) 7bc69d9

    Fixes

    • Fix a regression where body was sent after redirect 88b32ea
    • Fix destructure error on promise.json() c97ce7c
    • Do not ignore userinfo on a redirect to the same origin 52de13b

    https://github.com/sindresorhus/got/compare/v11.6.2...v11.7.0

    v11.6.2

    Bug fixes

    • Inherit the prefixUrl option from parent if it's undefined (#1448) a3da70a78aeb7f44dd3e0d0fa47cebe9541eb91e
    • Prepare a fix for hanging promise on Node.js 14.10.x 29d4e325b110ccf7571d4265d40760be4175f7ff
    • Prepare for Node.js 15.0.0 c126ff19c4e893975cbf6c2c8bebce6ed7631276

    Docs

    ... (truncated)

    Commits

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Conditionally use `esm` package

    Conditionally use `esm` package

    Resolves: https://github.com/broccolijs/broccoli/issues/498

    Tested on: https://stackblitz.com/github/nullvoxpopuli/broccoli/tree/remove-esm (for which the esm package does not work at all)

    opened by NullVoxPopuli 1
  • Remove `esm` package

    Remove `esm` package

    the esm package is the last thing preventing ember from running in webcontainers.

    See:

    • https://github.com/stackblitz/core/issues/647#issuecomment-1144044823
    • https://github.com/stackblitz/webcontainer-core/issues/354
    opened by NullVoxPopuli 2
  • Bump async from 2.6.3 to 2.6.4

    Bump async from 2.6.3 to 2.6.4

    Bumps async from 2.6.3 to 2.6.4.

    Changelog

    Sourced from async's changelog.

    v2.6.4

    • Fix potential prototype pollution exploit (#1828)
    Commits
    Maintainer changes

    This version was pushed to npm by hargasinski, a new releaser for async since your current version.


    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
Releases(v3.5.2)
  • v3.5.2(May 3, 2021)

  • v3.5.0(Dec 7, 2020)

  • 3.2.0(Aug 15, 2019)

    • Add input node change tracking (#419)
    • Initial typescript conversion (#422)
    • Fixup cli usage information (#421)
    • Use a more appropriate data structure for nodeWrappers (#418)
    • Support serving over HTTPS (#417)
    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(May 20, 2019)

    • Add rebuild memoization support behind feature flag (#396)
      • BROCCOLI_ENABLED_MEMOIZE=true to turn on
    • Add more watcher events (#398)
    • Drop support for unsupported Node versions (#400)
      • Drop Node 6 support.
    • Bump broccoli-node-info to v2.0.0
    • Pass watchedNodes to Watcher/WatcherAdapter (#403)
      • Require watchedNodes arguments to Watcher/WatcherAdapter (#405)
    Source code(tar.gz)
    Source code(zip)
  • v2.3.0(Mar 20, 2019)

    The future is here, today!

    Broccoli now supports a Brocfile.ts, and will auto compile this through ts-node 🎉

    By default, ts-node uses TypeScript defaults for the compiler options. If you wish to add your own compiler options to make things stricter, you can add a tsconfig.json of your own and Broccoli should auto pick this up.

    So now:

    import merge = require('broccoli-merge-trees');
    import uglify = require('broccoli-uglify-sourcemap');
    import { BrocfileOptions } from 'broccoli';
    
    export default (options: BrocfileOptions) => {
      let js = 'src/a';
    
      if (options.env === 'production') {
        js = uglify(js);
      }
    
      return merge([js, 'src/b']);
    }
    

    Should work, and your editor should get access to the types it can find. Over time, we will push for plugin developers to define at least a type definition, and provide documentation for how to convert a plugin to TypeScript

    Thanks to everyone who helped in reviewing this.

    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Mar 7, 2019)

    This release adds support for several new features.

    ES Modules syntax

    PR: https://github.com/broccolijs/broccoli/pull/385 ES modules syntax is now supported in Broccoli using the esm npm package. You're now free to use this syntax for your Brocfile.js https://github.com/broccolijs/broccoli#using-plugins-in-a-brocfilejs Welcome to the future!

    import merge from 'broccoli-merge-trees';
    
    export default merge(['a', 'b']);
    

    Export function

    PR: https://github.com/broccolijs/broccoli/pull/386 Broccoli now supports exporting a function from the Brocfile.js, in the same way that Ember-CLI does https://github.com/broccolijs/broccoli#brocfilejs which paves the way for future enhancements to supply build parameters to the pipeline

    import merge from 'broccoli-merge-trees';
    
    export default () => {
      return merge(['a', 'b']);
    }
    

    Environment

    PR: https://github.com/broccolijs/broccoli/pull/387 Broccoli now supports --environment,-e,--prod,--dev CLI arguments similar to Ember-CLI. The environment flag is passed to the Brocfile in the options hash { env: ENVIRONMENT } and defaults to development. Similar to the legacy BROCCOLI_CLI environment variable, this allows a build pipeline to be altered based on the destined environment, for example by minifying files for production.

    import merge from 'broccoli-merge-trees';
    import uglify from 'broccoli-uglify-js';
    
    export default (options) => {
      let tree = merge(['a', 'b']);
      if (options.environment === 'production') {
        tree = uglify(tree);
      }
      return tree;
    }
    
    Source code(tar.gz)
    Source code(zip)
Owner
Broccoli
The Broccoli build tool
Broccoli
:fork_and_knife: Web applications made easy. Since 2011.

Brunch Web applications made easy. Since 2011. Fast front-end web app build tool with simple declarative config and seamless incremental compilation f

Brunch 6.8k Jan 2, 2023
Build node packages into deployable applications

strong-build Build a node application package, preparing it for deploy to production. It is useful standalone, but is commonly used to build applicati

StrongLoop and IBM API Connect 47 Mar 3, 2022
browser-side require() the node.js way

browserify require('modules') in the browser Use a node-style require() to organize your browser code and load modules installed by npm. browserify wi

null 14.3k Dec 29, 2022
⚡️The Fullstack React Framework — built on Next.js

The Fullstack React Framework "Zero-API" Data Layer — Built on Next.js — Inspired by Ruby on Rails Read the Documentation “Zero-API” data layer lets y

⚡️Blitz 12.5k Jan 4, 2023
Grupprojekt för kurserna 'Javascript med Ramverk' och 'Agil Utveckling'

JavaScript-med-Ramverk-Laboration-3 Grupprojektet för kurserna Javascript med Ramverk och Agil Utveckling. Utvecklingsguide För information om hur utv

Svante Jonsson IT-Högskolan 3 May 18, 2022
Hemsida för personer i Sverige som kan och vill erbjuda boende till människor på flykt

Getting Started with Create React App This project was bootstrapped with Create React App. Available Scripts In the project directory, you can run: np

null 4 May 3, 2022
Kurs-repo för kursen Webbserver och Databaser

Webbserver och databaser This repository is meant for CME students to access exercises and codealongs that happen throughout the course. I hope you wi

null 14 Jan 3, 2023
A lightweight IDE that supports verilog simulation and Risc-V code compilation

EveIDE_LIGHT 使用手册 当前版本 : v0.0.2-beta (支持windows7以上版本 64位操作系统) 作者 : Adancurusul 版本说明 版本部分特性 概述 什么是EveIDE_LIGHT 使用介绍 选择工作区 进入主界面 左侧模组区 工程视图 编译设置 仿真设置 右侧

Chen Yuheng 43 Aug 29, 2022
Manage your asset portfolio. Be rich.

Be Rich Manage your assets online using "Asset Portfolio" Frontend (Javascript) React.js Canvas.js Zustand Material UI Axios React-Cookie Backend (Typ

Kim Junho 16 Nov 7, 2022
Boilerplate starter template for a new TON blockchain project - FunC contracts, JS tests, compilation and deployment scripts

TON Starter Template - Contracts Starter template for a new TON project - FunC contracts, JS tests, compilation and deployment scripts Overview This p

TON DeFi Ecosystem 44 Dec 17, 2022
This project is an educational asset demonstrating the use of AWS amplify, Graphql API, Appsync, Material UI and amazon cognito. T

This project is an educational asset demonstrating the use of AWS amplify, Graphql API, Appsync, Material UI and amazon cognito. This project belongs to Black bird and this repo will remain dormant until final decision.

Shikhar 7 Oct 12, 2022
Minimalistic configuration for TS to only extend JS with types. No TS features, no bundling. Readable maintainable code after compilation.

ts-guideline Minimalistic configuration for TS to only extend JS with types. No TS-scpecific features, no bundling. Readable maintainable code after c

Georg Oldenburger 41 Dec 22, 2022
A compilation of Google Tag Manager (GTM) adapters written for measuring interactions with embedded content.

Google Tag Manager (GTM) Custom HTML Adapters for Measuring Embedded Content Interactions This repository contains adapters for sending interaction da

Derek Cavaliero 7 Oct 3, 2022
TODA files: an open source cryptographic asset structure

TODA Cryptographic Asset System TODA is a system for creating digital assets, based on a unique crypographic distributed data structure and supporting

TODAQ Open Source 12 Dec 12, 2022
Example-browserstack-reporting - This repository contains an example of running Selenium tests and reporting BrowserStack test results, including full CI pipeline integration.

BrowserStack reporting and Selenium test result example This repository contains an example of running Selenium tests and reporting BrowserStack test

Testmo 1 Jan 1, 2022
Use pipeline to prettier code.

js-pipy Use pipeline to prettier code. Installation guide clone this repo locally npm i @htibor/js-pipy --save Usage const {pipy} = require('@htibor/j

Tibor Hegedűs 1 Feb 12, 2022
A sample CICD Deployment Pipeline for your Alexa Skills, using AWS CDK, CodeBuild and CodePipeline

Alexa Skils - CI/CD CDK Pipeline This repository will help you setting up a CI/CD pipeline for your Alexa Skills. This pipeline is powered by AWS Clou

null 5 Nov 23, 2022
A data pipeline to generate stats from logs.

Logs Data Pipeline This project consists of implementing a data pipeline. The goal of our pipeline is to bring insights from the logs of deployed micr

Amine Haj Ali 10 May 21, 2022