<commit_before># PantoJS<sup>®</sup>
[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coverage Status][coveralls-image]][coveralls-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Stories in Ready][waffle-image]][waffle-url]

_**[PantoJS<sup>®</sup>](http://pantojs.xyz/)**_ is an ***extremely flexible*** engine transforming files. See <http://pantojs.xyz/> for more details.

It works like [Grunt](http://gruntjs.com) or [Gulp](http://gulpjs.com), but more **efficient**, **powerful** and **flexible**. It can replace [webpack](http://webpack.github.io) easily.

## Topology

![panto topology](panto.png)

## Demo

```js
const panto = require('panto');

panto.setOptions({
    cwd: 'your_project_dir',
    src: 'src',
    output: 'output' // Cannot be same to src
});

/*
 * You need to load transformers first. 
 */
require('load-panto-transformers')(panto);

// Isomorphic JavaScript
const srcJs = panto.pick('**/*.{js,jsx}').tag('js(x)').read();

srcJs.babel(clientBabelOptions).write();

srcJs.babel(serverBabelOptions).write();

// Less
panto.pick('**/*.less').tag('less').read().less().write();

// node_moduels, only once
panto.pick('node_moduels/**/*', true).tag('node_moduels').copy();

// Others
panto.rest().tag('others').ignore().copy();

panto.on('start', buildId => {})// tasks start, for build & watch
    .on('flowstart', ({tag}, flowId) => {})// one task starts, for build & watch
    .on('flowend', ({tag}, flowId) => {})// one task ends, for build & watch
    .on('error', (err, buildId) => {})// any tasks error, for build & watch
    .on('complete', (files, buildId) => {})// tasks runnning complete, for build & watch

panto.build().then(() => {
    panto.watch();<commit_msg>Fix typo<commit_after># PantoJS<sup>®</sup>
[![NPM version][npm-image]][npm-url] [![Downloads][downloads-image]][npm-url] [![Build Status][travis-image]][travis-url] [![Coverage Status][coveralls-image]][coveralls-url] [![Dependency status][david-dm-image]][david-dm-url] [![Dev Dependency status][david-dm-dev-image]][david-dm-dev-url] [![Stories in Ready][waffle-image]][waffle-url]

_**[PantoJS<sup>®</sup>](http://pantojs.xyz/)**_ is an ***extremely flexible*** engine transforming files. See <http://pantojs.xyz/> for more details.

It works like [Grunt](http://gruntjs.com) or [Gulp](http://gulpjs.com), but more **efficient**, **powerful** and **flexible**. It can replace [webpack](http://webpack.github.io) easily.

## Topology

![panto topology](panto.png)

## Demo

```js
const panto = require('panto');

panto.setOptions({
    cwd: 'your_project_dir',
    src: 'src',
    output: 'output' // Cannot be same to src
});

/*
 * You need to load transformers first. 
 */
require('load-panto-transformers')(panto);

// Isomorphic JavaScript
const srcJs = panto.pick('**/*.{js,jsx}').tag('js(x)').read();

srcJs.babel(clientBabelOptions).write();

srcJs.babel(serverBabelOptions).write();

// Less
panto.pick('**/*.less').tag('less').read().less().write();

// node_modules, only once
panto.pick('node_modules/**/*', true).tag('node_modules').copy();

// Others
panto.rest().tag('others').ignore().copy();

panto.on('start', buildId => {})// tasks start, for build & watch
    .on('flowstart', ({tag}, flowId) => {})// one task starts, for build & watch
    .on('flowend', ({tag}, flowId) => {})// one task ends, for build & watch
    .on('error', (err, buildId) => {})// any tasks error, for build & watch
    .on('complete', (files, buildId) => {})// tasks runnning complete, for build & watch

panto.build().then(() => {
    panto.watch();
{'fraction_non_alphanumeric': 0.2318292353417995, 'fraction_numerical': 0.0, 'mean_word_length': 4.784375, 'pattern_counts': {'":': 0, '<': 13, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1130668', 'n_tokens_mistral': 1327, 'n_tokens_neox': 1308, 'n_words': 272}