Refactored everything for 0.9

This commit is contained in:
Tobias Koppers 2013-01-30 18:49:25 +01:00
parent 4e42a40595
commit ee01837d66
155 changed files with 8126 additions and 5639 deletions

713
README.md
View File

@ -1,663 +1,85 @@
[![webpack](http://webpack.github.com/assets/logo.png)](http://webpack.github.com)
As developer you want to reuse existing code.
As with node.js and web all files are already in the same language, but it is extra work to use your code with the node.js module system and the browser.
[documentation](https://github.com/webpack/docs/wiki)
The goal of `webpack` is to bundle CommonJs (and AMD) modules into javascript files which can be loaded by `<script>`-tags.
Simply concatenating all required files has a disadvantage: many code to download (and execute) on page load.
Therefore `webpack` uses the `require.ensure` function ([CommonJs/Modules/Async/A](http://wiki.commonjs.org/wiki/Modules/Async/A)) to split your code automatically into multiple bundles which are loaded on demand.
This happens mostly transparent to the developer.
Dependencies are resolved for you.
The result is a smaller initial code download which results in faster page load.
# Introduction
Another common thing in web development is that some files have to be preprocessed before send to the client (ex. template files).
This introduce more complexity to the compile step.
`webpack` supports loaders which process files before including them.
You as developer can use such files like any other module.
webpack is a bundler for modules. The main purpose is to bundle javascript files for useage in browser.
**TL;DR**
* bundle [CommonJs](/webpack/webpack/tree/master/examples/commonjs/) and/or [AMD](/webpack/webpack/tree/master/examples/mixed/) modules for browser
* reuse server-side code (node.js) on client-side
* create multiple files which are loaded on demand (faster page load in big webapps or on mobile connections)
* dependencies managed for you, on compile time (no resolution on runtime needed)
* loaders can preprocess files
* bundles CommonJs and/or AMD modules. (even combined)
* can create a single bundle or a bunch of chunks loaded on demand, to reduce initial loading time.
* dependencies are resolved while compiling, this makes the runtime very small
* loader can preprocess files while compiling, i. e. coffee-script to javascript
## Quick start guide
``` javascript
var moduleA = require("module/file");
var moduleB = require("./relativeFile");
var moduleC = require("../stuff/cup.coffee");
function getTemplate(name) {
return require("./templates/" + name + ".jade");
}
require("bootstrap/less/bootstrap.less");
```
``` shell
npm install webpack -g
webpack lib/yourEntryModule.js output/bundle.js
```
## Goals
* make node.js and browser development similar
* minimize code size (mobile connection)
* minimize code size on initial download
* download code only on demand
* require minimal configuration, but offer a maximum
* load polyfills for node-specific things if used
* offer replacements for node buildin libraries
Check the [documentation](https://github.com/webpack/docs/wiki) if you want to know more...
# Examples
See [example webapp](http://webpack.github.com/example-app/).
Take a look at the `examples` folder.
More [examples](https://github.com/webpack/webpack/tree/master/examples).
# Features
## Simple Example
* loaders are chainable
* loaders run in node.js and can do a bunch of stuff
* option to name your file with a hash of the content
* watch mode
* plugin system, extend webpack or build a complete different compiler
* interfaces
* CLI with arguments
* CLI with config file, arguments still possible
* usable as library from node.js
* usable as grunt plugin
* browser replacements
* comes with browser replacements for some node.js modules
* see also
* [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware)
* [webpack-dev-server](https://github.com/webpack/webpack-dev-server)
* [enhanced-resolve](https://github.com/webpack/enhanced-resolve) and
* [enhanced-require](https://github.com/webpack/enhanced-require)
## A small example what's possible
``` javascript
// a.js
var b = require("./b");
b.stuff("It works");
// b.js
exports.stuff = function(text) {
console.log(text);
}
```
are compiled to (reformatted)
``` javascript
(/* small webpack header */)
({
0: function(module, exports, require) {
var b = require(1);
b.stuff("It works");
},
1: function(module, exports, require) {
exports.stuff = function(text) {
console.log(text)
}
}
})
```
## Code Splitting
### Example
``` javascript
var a = require("a");
var b = require("b");
require.ensure(["c"], function(require) {
require("b").xyz();
var d = require("d");
var commonjs = require("./commonjs");
define(["amd-module", "./file"], function(amdModule, file) {
require(["big-module/big/file"], function(big) {
// AMD require acts as split point
// and "big-module/big/file" is only downloaded when requested
var stuff = require("../my/stuff");
// dependencies automatically goes in chunk too
});
});
```
```
File 1: web.js
- code of that file
- code of module a and dependencies
- code of module b and dependencies
require("coffee!./cup.coffee");
// The loader syntax allows to proprocess files
// for common stuff you can bind RegExps to loaders
// if you also add ".coffee" to the default extensions
// you can write:
require("./cup");
File 2: 1.web.js
- code of module c and dependencies (but code is not used)
- code of module d and dependencies
```
function loadTemplate(name) {
return require("./templates/" + name ".jade");
// dynamic requires are supported
// while compiling we figure out what can be requested
// here everything in "./templates" that matches /^.*\.jade$/
// (can also be in subdirectories)
}
Initially only `web.js` is included (and loaded) by your application.
`1.web.js` is loaded when the call to `require.ensure` happens.
After the second bundle (`1.web.js`) is loaded, the callback function will be invoked.
require("imports?_=underscore!../loaders/my-ejs-loader!./template.html");
// you can chain loaders
// you can configure loaders with query parameters
// and loaders resolve similar to modules
See [details](/webpack/webpack/tree/master/examples/code-splitting) for exact output.
See [more examples](/webpack/webpack/tree/master/examples).
## Reusing node.js code
`webpack` was built to support most of the code that was coded for node.js environment.
For example this works out of the box:
* `require("./templates/" + templateName);`
* `require(condition ? "moduleA" : condition2 ? "moduleB" : "./localStuff");`
* `function xyz(require) { require("text"); } xyz(function(a) { console.log(a) });`
* `var r = require; r("./file");` with warning
* `function xyz(require) { require("./file"); } xyz(require);` with warning
* `try { require("missingModule"); } catch(e) { console.log("missing") }` with warning
* `var require = function(a) { console.log(a) }; require("text");`
* `if(condition) require("optionalModule")` with warning if missing
## Browser replacements
Somethings it happens that browsers require other code than node.js do.
`webpack` allow module developers to specify replacements which are used in the compile process of `webpack`.
Modules in `web_modules` replace modules in `node_modules`.
`filename.web.js` replaces `filename.js` when required without file extension.
in options: `alias: { "http": "http-browserify" }`
in shell: `--alias http=http-browserify`
## Contexts
If the required module is not known while compile time we get into a problem.
A solution is the method `require.context` which takes a directory as parameter
and returns a function which behaves like the `require` function issued from a file
in this directory (but only if used for files in that directory).
The whole directory is included while compiling, so you have access to all files in it.
### Example
We have a directory full of templates, which are compiled javascript files.
A template should be loaded by template name.
``` javascript
var requireTemplate = require.context("./templates");
function getTemplate(templateName) {
return requireTemplate("./" + templateName);
// ...you can combine everything
function loadTemplateAsync(name, callback) {
require(["bundle?lazy!./templates/" + name + ".jade"], function(templateBundle) {
templateBundle(callback);
});
}
```
In addition to that `webpack` uses the `require.context` function automatically
if you use variables or other not parse-able things in the `require` function.
That means the following code behaves like the above:
``` javascript
function getTemplate(templateName) {
return require("./templates/" + templateName);
}
// is compiled like: return require.context("./templates")("./"+templateName)
// which compiles to: return require(123)("./"+templateName)
```
See [details](/webpack/webpack/tree/master/examples/require.context) for complete example.
When try to store the `require` function in another variable or try to pass it as parameter,
`webpack` convert it to a `require.context(".")` to be compatible.
There is a warning emitted in this case.
*Warning: The complete code in the directory are included. So use it carefully.*
## Loaders
You can use a syntax for loader plugins to preprocess files before emitting javascript code to the bundle.
The following example loads the raw content of a file with the `raw` loader:
``` javascript
var content = require("raw!./file.txt");
```
Multiple loader plugins can be prepended by separating them with `!`.
The loader plugins are resolved like in normal `require` call but with different default extension.
The `raw` loader plugin is looked up at modules `raw-webpack-web-loader`, `raw-webpack-loader`, `raw-web-loader`, `raw-loader`, `raw`
and the following files are looked up: `index.webpack-web-loader.js`, `index.webpack-loader.js`, `index.web-loader.js`, `index.loader.js`, `index`, `index.js`.
Note that the `web-` versions are omitted if loaders are used in node.js.
See [example](/webpack/webpack/tree/master/examples/loader).
The following loaders are included in webpack:
* [`raw`](https://github.com/webpack/raw-loader): Loads raw content of a file (as utf-8)
* [`json`](https://github.com/webpack/json-loader) (default at `.json`): Loads file as JSON
* [`jade`](https://github.com/webpack/jade-loader) (default at `.jade`): Loads jade template and returns a function
* [`coffee`](https://github.com/webpack/coffee-loader) (default at `.coffee`): Loads coffee-script like javascript
* [`css`](https://github.com/webpack/css-loader): Loads css file with resolved imports and returns css code
* [`less`](https://github.com/webpack/less-loader): Loads and compiles a less file and returns css code
* [`val`](https://github.com/webpack/val-loader): Excutes code as module and consider exports as javascript code
* [`bundle`](https://github.com/webpack/bundle-loader): Wraps request in a `require.ensure` block
* [`file`](https://github.com/webpack/file-loader): Emits the file into the output folder and returns the (relative) url (`file/{ext}` for some extensions)
* [`style`](https://github.com/webpack/style-loader): Adds result of javascript execution to DOM
* [`script`](https://github.com/webpack/script-loader): Executes a javascript file once in global context (like in script tag), requires are not parsed. Use this to include a library. ex. `require("script!./jquery.min.js")`. This is synchron, so the `$` variable is available after require.
* (`.css` defaults to `style!css` loader, so all css rules are added to DOM)
* (`.less` defaults to `style!css!val/cacheable!less` loader, so all less rules are added to DOM)
See docs for loader in github repo of the loader.
[Bigger list of loaders](https://github.com/webpack/webpack/wiki/Loaders)
## TL;DR
``` javascript
var a = require("a"); // require modules
var b = require("./b"); // and files
// like in node.js
// polyfill require method to use the new members in node.js too
require = require("enhanced-require")(module);
// create a lazy loaded bundle
require.ensure([], function(require) {
var c = require("c");
// require json
var packageJson = require("../package.json");
// or jade templates, coffee-script, and many more with own loaders
var result = require("./template.jade")(require("./dataFrom.coffee"));
// files are compiled to javascript and packed into the bundle...
});
```
... and compile from the shell with:
```
webpack lib/input.js js/output.js
```
try `--min` to minimize with `uglify-js`.
## Limitations
### `require`-function
* `require` should not be overwritten, except from polyfill
* `require.ensure` should not be overwritten or called indirect
* `require.context` should not be overwritten or called indirect
* the argument to `require.context` should be a literal or addition of multiple literals
* An indirect call of `require` should access a file in current directory: This throws an exception: `var r = require; r("../file");`
The following cases could result in **too much code** in result file if used wrong:
* indirect call of `require`: `var r = require; r("./file");`. It includes the whole directory.
* `require.context`. It includes the whole directory.
* expressions in require arguments: `require(variable)`. It includes the whole directory. (except from `?:`-operator `require(condition ? "a" : "b")`)
* the function passed to `require.ensure` is not inlined in the call. Only requires in inlined function move into the second bundle.
### node.js specific modules
As node.js specific modules like `fs` will not work in browser they are not included (by default) and cause an exception.
You should replace them by own modules if you want to use them.
For some simple modules are replacements included in `webpack`.
Expensive replacements are not needed by everyone, so that are not included by default.
You need to specify `--alias [module]=[replacement]` to use them.
A warning saying that some module is missing is emitted in the case you use it without providing a replacement.
Some credit goes to the browserify contributors, you can use replacements provided by them.
Included simple replacements:
* `assert`: copy of node.js' version, small change
* `buffer`: copy of node-browserify's version
* `buffer_ieee754`: copy of node-browserify's version
* `child_process`: disabled
* `events`: copy of node.js' version
* `path`: copy of node.js' version
* `punycode`: copy of node.js' version, one line removed (http://mths.be/punycode by @mathias)
* `querystring`: copy of node.js' version
* `string_decoder`: copy of node.js' version
* `url`: copy of node.js' version
* `util`: copy of node.js' version
Here is a list of possible useful replacements: (intentionally not by default)
* `http=http-browserify`
* `vm=vm-browserify`
* TODO provide some more replacements
## Usage
### Shell
`webpack` offers a command line interface:
after `npm install webpack -g` you can use the `webpack` command
if invoked without arguments it prints a usage:
```
Usage: webpack <options> <input> <output>
Options:
--min Minimize it with uglifyjs [boolean] [default: false]
--filenames Output Filenames Into File [boolean] [default: false]
--options Options JSON File [string]
--public-prefix Path Prefix For JavaScript Loading [string]
--library Stores the exports into this variable [string]
--colors Output Stats with colors [boolean] [default: false]
--single Disable lazy loading [boolean] [default: false]
--json Output Stats as JSON [boolean] [default: false]
--by-size Sort modules by size in Stats [boolean] [default: false]
--verbose Output dependencies in Stats [boolean] [default: false]
--profile Capture timings for modules [boolean] [default: false]
--alias Set a alias name for a module. ex. http=http-browserify [string]
--debug Prints debug info to output files [boolean] [default: false]
--watch Recompiles on changes (except loaders) [boolean] [default: false]
--watch-delay Timeout to wait for the last change
--workers Use worker processes to be faster (BETA) [boolean] [default: false]
--progress Displays a progress while compiling [boolean] [default: false]
```
### Programmatically Usage
``` javascript
webpack(context, moduleName, options, callback)
webpack(absoluteModulePath, options, callback)
```
#### `options`
You can also save this options object in a JSON file and use it with the shell command.
``` javascript
{
output: "out/file.js", // required
// output file to initial chunk
outputDirectory: "out/dir", // default: extract directory from output
// output directory for file
outputPostfix: ".chunk.js", // default: "." + output
// postfix appended to id of lazy loaded chunks
context: "/home/node/stuff",
// default: [context] parameter if Programmatically Usage
// default: process.cwd() if Shell Usage
// paths in stats and debug sourceUrl are shortened to this base directory
ouputJsonpFunction: "myJsonp", // default: "webpackJsonp"
// jsonp function used for lazy loaded chunks,
// should be unique for all instances of webpack in a page
publicPrefix: "http://static.url.com/asserts/", // default: ""
// path to create the chunks url relative to page
// deprecated name: scriptSrcPrefix
library: "mylib", // default: null
// store the exports of the entrace module in a variable of this name
// use this to create a library from webpack
includeFilenames: true, // default: false
// include the filename of each module as comment before the module
single: false, // default: false
// ignore all Code Splitting and emit only a single file
// all code is included and should work as with Code Splitting
minimize: true, // default: false
// minimize resources for production use
// javascript is minimized with uglify-js2
// loaders will minimize other resources
debug: true, // default: false
// put the source of the modules into annotated eval,
// which cause a nice debug experience in some dev tools
watch: true, // default: false
// recompiles on changes on module and contexts (currently not on loaders)
// unchanged files are cached for greater performance
watchDelay: 1000, // default: 200
// delay in ms before recompile after the last file change
events: new EventEmitter(), // default: new EventEmitter()
// EventEmitter on which events for the compile process are fired
// events:
// -- bundling process --
// "bundle" (stats) the bundle is finished
// "bundle-invalid" () fired when the bundle gets invalid
// [bundle-invalid is only fired in watch mode]
// "start-writing" (hash) fired when webpack starts writing
// "watch-end" () watch ended because of loader change
// -- events for modules --
// "module" (module, filename) after a module is loaded
// "context-enum" (module, dirname) before a context is enumerated
// "context" (module, dirname) after a context is loaded
// -- events for progress --
// "task" (name?) start of a task
// "task-end" (name?) end of a task
noWrite: true, // default: undefined
// if true webpack do not write out any file
parse: {
// options for parsing
overwrites: {
"myglobal": "modulename-of-myglobal"
// defaults: (defaults are also included if you define your own)
// process: "__webpack_process",
// module: "__webpack_module",
// console: "__webpack_console",
// global: "__webpack_global",
// Buffer: "buffer+.Buffer" // -> require("buffer").Buffer
// "__dirname": "__webpack_dirname",
// "__filename": "__webpack_filename"
},
// inject a free variable named "myglobal" which are required as
// require("modulename-of-myglobal")
// to each module which uses "myglobal"
}
resolve: {
// options for resolving
// see https://github.com/webpack/enhanced-resolve for more
paths: ["/my/absolute/dirname"],
// default: (defaults are also included if you define your own)
// [".../buildin",
// ".../buildin/web_modules", ".../buildin/name_modules",
// ".../node_modules"]
// search paths for modules
modulesDirectorys: ["jam", "xyz_modules", "node_modules"],
// default: (defaults are NOT included if you define your own)
// ["web_modules", "node_modules"];
// directories to be searched for modules
alias: {
"old-module": "new-module"
},
// replace a module
extensions: ["", ".www.js", ".js"],
// defaults: (defaults are NOT included if you define your own)
// ["", ".webpack.js", ".web.js", ".js"]
// postfixes for files to try
packageMains: ["abc", "main"]
// defaults: ["webpack", "browserify", "web", "main"]
// lookup fields in package.json
loaderExtensions: [".loader.js", ".www-loader.js", "", ".js"],
// defaults: (defaults are NOT included if you define your own)
// [".webpack-web-loader.js", ".webpack-loader.js",
// ".web-loader.js", ".loader.js", "", ".js"]
// postfixes for loaders to try
loaderPostfixes: ["-loader", "-xyz", ""],
// defaults: (defaults are NOT included if you define your own)
// ["-webpack-web-loader", "-webpack-loader",
// "-web-loader", "-loader", ""]
// postfixes for loader modules to try
loaderPackageMains: ["loader", "main"]
// defaults: ["webpackLoader", "webLoader", "loader", "main"]
// lookup fields for loaders in package.json
loaders: [{
test: /\.generator\.js/,
exclude: /\.no\.generator\.js/,
loader: "val"
}],
// default: (defaults are also included if you define your own)
// [{test: "\\\\.coffee$", loader: "coffee"},
// {test: "\\\\.json$", loader: "json"},
// {test: "\\\\.jade$", loader: "jade"},
// {test: "\\\\.css$", loader: "style!css"},
// {test: "\\\\.less$", loader: "style!css!val/separable?cacheable!less"}]
// automatically use loaders if filename match RegExp
// and no loader is specified.
// you can pass a RegExp as string, or multiple RegExps/strings in an array
postprocess: {
normal: [function(filename, callback) {
// webpack will not find files including ".exclude."
if(/\.exclude\.[^\\\/]*$/.test(filename))
return callback(new Error("File is excluded"));
callback(null, filename);
}],
// defaults: []
// postprocess resolved filenames by all specified async functions
// a postprocessor must call the callback
// You must pass a filename instead of a function if you use workers
// The filename is required in the worker process.
context: [],
// same as postprocess.normal but for contextes
}
}
postLoaders: [{test: /\.export.js$/, loader: "export"}],
// default: []
// syntax like resolve.loaders
// all loaders which matches the file are applied after the
// normal loaders. This cannot be overridden in the require call.
// You must pass a string instead of a RegExp if you use workers
preLoaders: [{test: /\.txt$|\.html$/, loader: "normalizeNLs"}],
// default: []
// syntax like resolve.loaders
// all loaders which matches the file are applied before the
// normal loaders. This cannot be overridden in the require call.
// You must pass a string instead of a RegExp if you use workers
maxChunks: 5, // (experimental)
// default: undefined
// limit the maximum number of chunks.
// chunks are merged until the required number is reached
mergeSizeRatio: 2, // (experimental)
// default: 0.2
// when choosing the merged chunks the maximum of this formular is searched:
// sizeSaveByChunkMerging - mergedChunkSize * mergeSizeRatio
workers: true,
// default: false
// options: true, false, number > 0, object of type webpack/lib/Workers
// Use worker processes to do some work.
// This *can* boost performance, but starting these processes has some
// overhead (~100-200ms). If loaders are used they need to have the
// seperable flag to work in worker process. If they havn't they work in
// the main process.
// Pushing jobs to worker processes has an addititional overhead of ~100ms.
closeWorkers: false,
// default: true
// close the worker processes on webpack exit.
workersNoResolve: true,
// default: false
// workers should not be used in the resolving process
// This may be useful if you want to have your postprocessors in the main process.
workerMinLoaders: 2,
// default: 0
// only process file in seperate process if more or equal loaders applied to the file.
amd: { jQuery: true },
// default: {}
// specify the value of require.amd and define.amd
profile: true,
// default: false
// capture timings for the build.
// they are stored in the stats
}
```
#### `callback`
`function(err, stats)`
`stats` as json:
``` javascript
{
hash: "52bd9213...38d",
startTime: 237467691, // in ms since 1.1.1990
time: 1234, // in ms
chunkCount: 2,
modulesCount: 10,
modulesIncludingDuplicates: 10,
modulesFirstChunk: 3,
fileSizes: {
"output.js": 1234,
"1.output.js": 2345
},
chunkNameFiles: {
"main": "output.js",
"namedChunk": "1.output.js"
}
dependencies: [ "filename", ... ],
loaders: [ "filename of loader", ... ]
contexts: [ "dirname of context", ... ]
warnings: [ "Some warning" ],
errors: [ "Some error" ],
fileModules: {
"output.js": [
{
id: 0,
size: 123,
filename: "/home/.../main.js",
reasons: [ { type: "main" } ],
dependencies: [ "filename", ... ],
loaders: [ "filename of loader", ... ]
},
{ id: 1, size: 234, filename: "...", reasons: [
{ type: "require", // or "context"
async: true,
count: 2,
filename: "/home/.../main.js",
// additionally: dirname: "..." // for type = "context"
}
]},
...
],
"1.output.js": [...]
},
subStats: [...], // stats for embedded webpacks
}
```
### with grunt
see [grunt-webpack](https://github.com/webpack/grunt-webpack).
## Bonus features
### File hash
You can use `[hash]` in `publicPrefix`, `output`, `outputDirectory`, `outputPostfix` and in the shell parameters.
`webpack` will replace it with a hash of your files, when writing.
### From shell
Combine the options `--colors --watch --progress` to get a pretty shell compilation.
### Webpack features in node.js
see [enhanced-require](https://github.com/webpack/enhanced-require).
### More
see [wiki](https://github.com/webpack/webpack/wiki)
## Tests
@ -684,23 +106,24 @@ You are also welcome to correct any spelling mistakes or any language issues, be
## Future plans
see [wiki Ideas](https://github.com/webpack/webpack/wiki/Ideas)
## License
Copyright (c) 2012 Tobias Koppers
Copyright (c) 2012-2013 Tobias Koppers
MIT (http://www.opensource.org/licenses/mit-license.php)
## Dependencies
* [esprima](http://esprima.org/)
* [optimist](https://github.com/substack/node-optimist)
* [enhanced-resolve](https://github.com/webpack/enhanced-resolve)
* [uglify-js](https://github.com/mishoo/UglifyJS)
* [sprintf](https://github.com/maritz/node-sprintf)
* [mocha](https://github.com/visionmedia/mocha)
* [should](https://github.com/visionmedia/should.js)
* [optimist](https://github.com/substack/node-optimist)
* [async](https://github.com/caolan/async)
* [mkdirp](http://esprima.org/)
* [clone](https://github.com/pvorb/node-clone)

View File

@ -1,5 +0,0 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
module.exports = "(require.modules.c||'')";

53
bin/config-optimist.js Normal file
View File

@ -0,0 +1,53 @@
module.exports = function(optimist) {
optimist
.string("config").describe("config")
.string("context").describe("context")
.string("entry").describe("entry")
.string("module-bind").describe("module-bind")
.string("module-bind-post").describe("module-bind-post")
.string("module-bind-pre").describe("module-bind-pre")
.string("output-path").describe("output-path")
.string("output-file").describe("output-file")
.string("output-chunk-file").describe("output-chunk-file")
.string("output-public-path").describe("output-public-path")
.boolean("output-pathinfo").describe("output-pathinfo")
.string("output-library").describe("output-library")
.string("output-library-target").describe("output-library-target")
.boolean("console").describe("console")
.boolean("cache").describe("cache")
.boolean("watch").alias("watch", "w").describe("watch")
.boolean("debug").alias("debug", "d").describe("debug")
.string("devtool").describe("devtool")
.boolean("progress").describe("progress")
.string("resolve-alias").describe("resolve-alias")
.string("resolve-loader-alias").describe("resolve-loader-alias")
.describe("optimize-max-chunks")
.boolean("optimize-minimize").describe("optimize-minimize")
.string("plugin").describe("plugin")
.boolean("bail").describe("bail");
};

256
bin/convert-argv.js Normal file
View File

@ -0,0 +1,256 @@
var path = require("path");
var resolve = require("enhanced-resolve");
module.exports = function(optimist, argv, convertOptions) {
var options = {};
function ifArg(name, fn, init) {
if(Array.isArray(argv[name])) {
if(init) init();
argv[name].forEach(fn);
} else if(typeof argv[name] != "undefined") {
if(init) init();
fn(argv[name], -1);
}
}
function ifArgPair(name, fn, init) {
ifArg(name, function(content, idx) {
var i = content.indexOf("=");
if(i < 0) return fn(null, content, idx);
else return fn(content.substr(0, i), content.substr(i+1), idx);
}, init);
}
function mapArgToBoolean(name, optionName) {
ifArg(name, function(bool) {
options[optionName] = bool;
});
}
function mapArgToPath(name, optionName) {
ifArg(name, function(str) {
options[optionName] = path.resolve(str);
});
}
function loadPlugin(name) {
try {
var path = resolve.sync(process.cwd(), name);
} catch(e) {
console.log("Cannot resolve plugin " + name + ".");
process.exit(-1);
}
try {
var Plugin = require(path);
} catch(e) {
console.log("Cannot load plugin " + name + ". (" + path + ")");
throw e;
}
try {
return new Plugin();
} catch(e) {
console.log("Cannot instantiate plugin " + name + ". (" + path + ")");
throw e;
}
}
function ensureObject(parent, name) {
if(typeof parent[name] != "object" || parent[name] === null)
parent[name] = {};
}
function ensureArray(parent, name) {
if(!Array.isArray(parent[name]))
parent[name] = [];
}
if(argv.config) {
options = require(path.resolve(argv.config));
} else {
try {
options = require(path.resolve("webpack.config.js"));
} catch(e) {
options = {};
}
}
if(typeof options != "object" || options === null) {
console.log("Config did not export a object.");
process.exit(-1);
}
mapArgToPath("context", "context");
if(!options.context) options.context = process.cwd();
ifArgPair("entry", function(name, entry) {
options.entry[name] = entry;
}, function() {
ensureObject(options, "entry");
});
ifArgPair("module-bind", function(name, binding) {
if(name === null) name = binding;
options.module.loaders.push({
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
loader: binding
});
}, function() {
ensureObject(options, "module");
ensureArray(options.module, "loaders");
});
ifArgPair("module-bind-pre", function(name, binding) {
if(name === null) name = binding;
options.module.preLoaders.push({
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
loader: binding
});
}, function() {
ensureObject(options, "module");
ensureArray(options.module, "preLoaders");
});
ifArgPair("module-bind-post", function(name, binding) {
if(name === null) name = binding;
options.module.postLoaders.push({
test: new RegExp("\\." + name.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$"),
loader: binding
});
}, function() {
ensureObject(options, "module");
ensureArray(options.module, "postLoaders");
});
ifArg("output-path", function(value) {
ensureObject(options, "output");
options.output.path = value;
});
ifArg("output-file", function(value) {
ensureObject(options, "output");
options.output.filename = value;
});
ifArg("output-chunk-file", function(value) {
ensureObject(options, "output");
options.output.chunkFilename = value;
});
ifArg("output-named-chunk-file", function(value) {
ensureObject(options, "output");
options.output.namedChunkFilename = value;
});
ifArg("output-public-path", function(value) {
ensureObject(options, "output");
options.output.publicPath = value;
});
ifArg("output-pathinfo", function(bool) {
ensureObject(options, "output");
options.output.pathinfo = bool;
});
ifArg("output-library", function(value) {
ensureObject(options, "output");
options.output.library = value;
});
ifArg("output-library-target", function(value) {
ensureObject(options, "output");
options.output.libraryTarget = value;
});
mapArgToBoolean("console", "console");
mapArgToBoolean("cache", "cache");
mapArgToBoolean("watch", "watch");
ifArg("watch-delay", function(value) {
options.watchDelay = value;
});
mapArgToBoolean("debug", "debug");
ifArg("progress", function(value) {
if(!value) return;
var ProgressPlugin = require("../lib/ProgressPlugin");
ensureArray(options, "plugins");
var chars = 0;
options.plugins.push(new ProgressPlugin(function(percentage, msg) {
if(percentage < 1) {
percentage = Math.floor(percentage * 100);
msg = percentage + "% " + msg;
if(percentage < 100) msg = " " + msg;
if(percentage < 10) msg = " " + msg;
}
for(var i = 0; i < chars; i++)
process.stderr.write("\b");
process.stderr.write(msg);
chars = msg.length;
}));
});
ifArg("devtool", function(value) {
options.devtool = value;
});
ifArgPair("resolve-alias", function(name, value) {
if(!name) throw new Error("--resolve-alias <string>=<string>");
ensureObject(options, "resolve");
ensureObject(options.resolve, "alias");
options.resolve.alias[name] = value;
});
ifArgPair("resolve-loader-alias", function(name, value) {
if(!name) throw new Error("--resolve-loader-alias <string>=<string>");
ensureObject(options, "resolveLoader");
ensureObject(options.resolveLoader, "alias");
options.resolveLoader.alias[name] = value;
});
ifArg("optimize-max-chunks", function(value) {
ensureObject(options, "optimize");
options.optimize.maxChunks = parseInt(value, 10);
});
ifArg("optimize-minimize", function(bool) {
ensureObject(options, "optimize");
options.optimize.minimize = bool;
});
ifArg("plugin", function(value) {
ensureArray(options, "plugins");
options.plugins.push(loadPlugin(value));
});
mapArgToBoolean("bail", "bail");
if(!options.output || !options.output.filename) {
ensureObject(options, "output");
if(convertOptions && convertOptions.outputFilename) {
options.output.path = path.dirname(convertOptions.outputFilename);
options.output.filename = path.basename(convertOptions.outputFilename);
} else if(argv._.length > 0) {
options.output.filename = argv._.pop();
options.output.path = path.dirname(options.output.filename);
options.output.filename = path.basename(options.output.filename);
} else {
optimist.showHelp();
process.exit(-1);
}
}
if(argv._.length > 1) {
ensureObject(options, "entry");
argv._.forEach(function(content) {
var i = content.indexOf("=");
if(i < 0) throw new Error("Each element must be <string>=<string>.");
else return options.entry[content.substr(0, i)] = content.substr(i+1);
});
} else if(argv._.length == 1) {
options.entry = argv._[0];
}
return options;
};

View File

@ -14,233 +14,91 @@ try {
} catch(e) {}
var fs = require("fs");
var util = require("util");
var sprintf = require("sprintf").sprintf;
var argv = require("optimist")
var optimist = require("optimist")
.usage("webpack " + require("../package.json").version + "\n" +
"Usage: $0 <input> <output>")
"Usage: https://github.com/webpack/docs/wiki/webpack-detailed-usage")
require("./config-optimist")(optimist);
.boolean("min")
.describe("min", "Minimize it with uglifyjs")
.default("min", false)
optimist
.boolean("filenames")
.describe("filenames", "Output Filenames Into File")
.default("filenames", false)
.boolean("json").alias("json", "j").describe("json")
.boolean("colors").alias("colors", "c").describe("colors")
.string("options")
.describe("options", "Options JSON File")
.string("sort-modules-by").describe("sort-modules-by")
.string("public-prefix")
.describe("public-prefix", "Path Prefix For JavaScript Loading")
.string("sort-chunks-by").describe("sort-chunks-by")
.string("library")
.describe("library", "Stores the exports into this variable")
.string("sort-assets-by").describe("sort-assets-by")
.boolean("colors")
.describe("colors", "Output Stats with colors")
.default("colors", false)
.boolean("display-chunks").describe("display-chunks")
.boolean("single")
.describe("single", "Disable lazy loading")
.default("single", false)
.boolean("display-reasons").alias("display-reasons", "verbose").alias("display-reasons", "v").describe("display-reasons");
var argv = optimist.argv;
.boolean("json")
.describe("json", "Output Stats as JSON")
.default("json", false)
var options = require("./convert-argv")(optimist, argv);
.boolean("by-size")
.describe("by-size", "Sort modules by size in Stats")
.default("by-size", false)
.boolean("verbose")
.describe("verbose", "Output dependencies in Stats")
.default("verbose", false)
.boolean("profile")
.describe("profile", "Capture timings for modules")
.default("profile", false)
.string("alias")
.describe("alias", "Set a alias name for a module. ex. http=http-browserify")
.boolean("debug")
.describe("debug", "Prints debug info to output files")
.default("debug", false)
.boolean("watch")
.describe("watch", "Recompiles on changes (except loaders)")
.default("watch", false)
.describe("watch-delay", "Timeout to wait for the last change")
.default("watch", false)
.boolean("workers")
.describe("workers", "Use worker processes to be faster (BETA)")
.default("workers", false)
.boolean("progress")
.describe("progress", "Displays a progress while compiling")
.default("progress", false)
.demand(1) // DEPRECATED
.argv;
var input = argv._[0],
output = argv._[1];
var inputFile = input && input.split("!").pop()
if (inputFile && inputFile[0] !== '/' && inputFile[1] !== ':') {
input = input.split("!");
input.pop();
input.push(path.join(process.cwd(), inputFile));
input = input.join("!");
}
var outputFile = output && output.split("!").pop();
if (output && output[0] !== '/' && input[1] !== ':') {
output = output.split("!");
output.pop();
output.push(path.join(process.cwd(), outputFile));
output = output.join("!");
function ifArg(name, fn, init) {
if(Array.isArray(argv[name])) {
if(init) init();
argv[name].forEach(fn);
} else if(typeof argv[name] != "undefined") {
if(init) init();
fn(argv[name], -1);
}
}
var options = {};
if(argv.options) {
options = require(path.join(process.cwd(), argv.options));
}
if(argv["public-prefix"]) {
options.publicPrefix = argv["public-prefix"];
}
var outputOptions = {
modules: true,
chunks: false,
cached: false,
context: options.context
};
if(argv.min) {
options.minimize = true;
}
ifArg("json", function(bool) {
outputOptions.json = bool;
});
if(argv.debug) {
options.debug = true;
}
ifArg("colors", function(bool) {
outputOptions.colors = bool;
});
if(argv.single) {
options.single = true;
}
ifArg("sort-modules-by", function(value) {
outputOptions.modulesSort = value;
});
if(argv.watch) {
options.watch = true;
}
ifArg("sort-chunks-by", function(value) {
outputOptions.chunksSort = value;
});
if(argv.workers) {
options.workers = true;
}
ifArg("sort-assets-by", function(value) {
outputOptions.assetsSort = value;
});
if(argv.profile) {
options.profile = true;
}
ifArg("display-chunks", function(bool) {
outputOptions.modules = !bool;
outputOptions.chunks = bool;
});
if(argv["watch-delay"]) {
options.watchDelay = argv["watch-delay"];
}
if(argv.filenames) {
options.includeFilenames = true;
}
if(argv.library) {
options.library = argv.library;
}
if(argv.alias) {
if(typeof argv.alias === "string")
argv.alias = [argv.alias];
options.resolve = options.resolve || {};
options.resolve.alias = options.resolve.alias || {};
var aliasObj = options.resolve.alias;
argv.alias.forEach(function(alias) {
alias = alias.split("=");
aliasObj[alias[0]] = alias[1];
});
}
ifArg("display-reasons", function(bool) {
outputOptions.reasons = bool;
});
var webpack = require("../lib/webpack.js");
var formatOutput = require("../lib/formatOutput.js");
function c(str) {
return argv.colors ? str : "";
}
output = output || path.join(process.cwd(), "js", "web.js");
if(!options.outputDirectory) options.outputDirectory = path.dirname(output);
if(!options.output) options.output = path.basename(output);
if(!options.outputPostfix) options.outputPostfix = "." + path.basename(output);
if(!options.context) options.context = process.cwd();
// some listeners for the progress display
if(argv.progress) {
if(!options.events) options.events = new (require("events").EventEmitter)();
var events = options.events;
var nextUpdate = 0;
var sum = 0;
var finished = 0;
var chars = 0;
function print(force) {
if(!force && nextUpdate > new Date().getTime()) return;
nextUpdate = new Date().getTime() + 100;
var msg = "";
if(sum > 0) {
var precentage = Math.floor(finished*100/sum);
msg += "compiling... (" + c("\033[1m\033[33m");
msg += sprintf("%4s", finished+"") + "/" + sprintf("%4s", sum+"");
msg += " " + sprintf("%4s", precentage+"%");
msg += c("\033[39m\033[22m") + ")";
for(var i = 0; i < Math.floor(precentage/2); i++)
msg += "#";
}
for(var i = msg.length; i < chars; i++)
msg += " ";
for(var i = 0; i < chars; i++)
process.stderr.write("\b");
process.stderr.write(msg);
chars = msg.length;
}
events.on("task", function(name) {
sum++;
print();
});
events.on("task-end", function(name) {
finished++;
if(name) {
for(var i = 0; i < chars; i++)
process.stderr.write("\b \b");
process.stderr.write(name + " " + c("\033[1m\033[32m") + "done" + c("\033[39m\033[22m") + "\n");
chars = 0;
return print(true);
}
print();
});
events.on("bundle", function(name) {
sum = 0;
finished = 0;
for(var i = 0; i < chars; i++)
process.stderr.write("\b \b");
chars = 0;
});
}
// do the stuff
webpack(input, options, function(err, stats) {
Error.stackTrackLimit = 30;
webpack(options, function(err, stats) {
if(err) {
console.error(err);
console.error(err.stack || err);
return;
}
if(argv.json)
console.log(JSON.stringify(stats, null, 2));
if(outputOptions.json)
console.log(JSON.stringify(stats.toJson(outputOptions), null, 2));
else {
console.log(formatOutput(stats, {
colors: argv.colors,
"by-size": argv["by-size"],
verbose: argv.verbose,
context: options.context
}));
console.log(stats.toString(outputOptions));
}
});

View File

@ -1 +0,0 @@
module.exports = ".";

View File

@ -1 +0,0 @@
module.exports = "./index.js";

View File

@ -1,3 +0,0 @@
(function() {
module.exports = this;
}).call(null);

View File

@ -1,5 +0,0 @@
module.exports = function() {
this.cacheable();
if(!this.options.amd) return "/* empty to return {} */";
return "module.exports = " + JSON.stringify(this.options.amd);
}

View File

@ -1,4 +1,5 @@
var amdRequire = require("./__webpack_amd_require");
module.exports = function() { throw new Error("define cannot be used indirect"); };
/*var amdRequire = require("!!./amd-require.js");
module.exports = function(module) {
function define(id, dependencies, factory) {
if(typeof id != "number") {
@ -17,4 +18,4 @@ module.exports = function(module) {
}
define.amd = amdRequire.amd;
return define;
}
}*///

1
buildin/amd-options.js Normal file
View File

@ -0,0 +1 @@
module.exports = __webpack_amd_options__;

View File

@ -12,6 +12,6 @@ function amdRequire(chunk, requiresFn, fn) {
}
for(var name in req)
amdRequire[name] = req[name];
amdRequire.amd = require("./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js");
amdRequire.amd = __WEBPACK_AMD_OPTIONS__;
amdRequire.config = function() {/* config is ignored, use webpack options */};
module.exports = amdRequire;

View File

@ -0,0 +1 @@
module.exports = function() { return __webpack_require__; };

387
definitions.ts Normal file
View File

@ -0,0 +1,387 @@
// Utilities
class ArrayMap {
get: (key: any) => any;
set: (key: any, value: any) => ArrayMap;
remove: (key: any) => Boolean;
clone: () => ArrayMap;
}
class Tabable {
static mixin: (pt: ClassPrototype) => void;
applyPlugins: (name: String, args...) => void;
applyPluginsAsync: (name: String, args..., callback: (err) => void) => void;
applyPluginsBailResult: (name: String, args...) => void;
addPlugin: (name: String, fn: (...) => any) => void
}
class Plugin {
apply: (tabable: Tabable) => void;
}
// Module and Dependency stuff
class DependenciesBlock {
dependencies: Dependency[];
blocks: AsyncDependenciesBlock[];
variables: Object; // Map<String, String>
addBlock: (block: AsyncDependenciesBlock) => void;
addDependency: (dependency: Dependency) => void;
addVariable: (name: String, expression: String) => void;
updateHash: (hash: crypto.Hash) => void;
}
class Module extends DependenciesBlock {
abstract identifier: () => String;
abstract build: (options: Options, callback: (err) => void) => void;
abstract source: (template: ModuleTemplate) => Source;
abstract size: () => Number;
separable: () => Boolean;
abstract separateBuild: (options: Options, executor: Executor, callback: (err) => void) => void;
context: String;
reasons: ModuleReason[];
addReason: (reason: ModuleReason) => void;
id: String;
chunks: Chunk[];
addChunk(chunk: Chunk) => void;
}
class NormalModule extends Module {
constructor(public request: String, preLoaders: String[], loaders: String[], postLoaders: String[]);
identifier;
build;
source;
size;
}
class ContextModule extends Module {
constructor(
public request: String,
public recursive: Boolean,
public regExp: String
);
identifier;
build;
source;
size;
}
class Dependency {
public module: Module;
public Class: Class;
public loc: { line: int, col: int };
public optional: Boolean;
public isEqualResource: (other: Dependency) => Boolean;
public updateHash: (hash: crypto.Hash) => void;
}
class ModuleDependency {
constructor(public request: String);
isEqualResource;
}
class CommonJsRequireDependency extends ModuleDependency {}
class AMDRequireDependency extends ModuleDependency {}
class AMDDefineDependency extends ModuleDependency {}
class RequireEnsureDependency extends ModuleDependency {}
class RequireResolveDependency extends ModuleDependency {}
class ContextDependency {
constructor(
public request: String,
public recursive: Boolean,
public regExp: String
);
isEqual;
}
class CommonJsExpressionRequireDependency extends ContextDependency {}
class AMDExpressionRequireDependency extends ContextDependency {}
class AMDExpressionDefineDependency extends ContextDependency {}
class ExpressionRequireEnsureDependency extends ContextDependency {}
class ExpressionRequireResolveDependency extends ContextDependency {}
class RequireContextDependency extends ContextDependency {}
class RequireExpressionDependency extends ContextDependency {}
class AsyncDependenciesBlock extends DependenciesBlock {
constructor(public name: String);
public chunk: Chunk;
}
class Chunk {
constructor(public name: String);
public id: Number;
public addModule(module: Module) => Boolean;
public addChunk(chunk: Chunk) => void;
}
// Source stuff
interface Source {
source: () => String;
map: () => String;
origins: () => any; // Map<String, Source>
}
class StringSource implements Source {
constructor(str: String);
source: () => String;
}
// Compilation stuff
class Compilation {
constructor(public options: CompilationOptions);
public dependencyFactories: ArrayMap;
public moduleTemplate: ModuleTemplate;
public chunkTemplate: ChunkTemplate;
public mainTemplate: MainTemplate;
public entry: Module;
public chunks: Chunk[];
public namedChunks: Object; // Map<String, Chunk>
public assets: Object; // Map<String, String | Buffer>
public process: (context: String, entry: Dependency, callback: (err) => void) => void;
public getStats: () => Stats;
protected addModule(module: Module) => Boolean;
protected getModule(module: Module) => Module;
protected buildModule(module: Module, callback: (err) => void) => void;
protected processModuleDependencies(module: Module, callback: (err) => void) => void;
}
interface ModuleFactory {
create: (context: String, dependency: Dependency, callback: (err, Module) => void) => void;
}
class NormalModuleFactory {
constructor(resolver, moduleOptions);
create;
}
class ContextModuleFactory {
constructor(resolver, contextOptions);
create;
}
// Parser stuff
class Parser extends Tabable {
parse: (source: String) => Object;
scope: {
inTry: Boolean;
};
state: Object;
waltStatements: (statements: Statement[]) => void;
walkStatement: (statement: Statement) => void;
walkSwitchCases: (switchCases: SwitchCase[]) => void;
walkCatchClauses: (catchClauses: CatchClause[]) => void;
walkVariableDeclarators: (declarators: Declarator[]) => void;
walkExpressions: (expressions: Expression[]) => void;
walkExpression: (expression: Expression) => void;
inScope: (params: Expression[], fn: () => void) => void;
evaluateExpression: (expression: Expression) => EvaluatedExpression;
// parseStringArray: (expression: Expression) => String[];
// parseString: (expression: Expression) => String;
// parseCalculatedStringArray: (expression: Expression) => CalculatedString[];
// parseCalculatedString: (expression: Expression) => CalculatedString;
tab "call *": (expr) => void; // * = methodName, i.e. "require", "require.ensure"
tab "expression *": (expr) => void; // * =
tab "evaluate *": (expr) => void;
}
interface EvaluatedExpression {
isString: () => Boolean;
isNumber: () => Boolean;
isRegExp: () => Boolean;
isConditional: () => Boolean;
isArray: () => Boolean;
isWrapped: () => Boolean;
range: Number[2];
// isConditional
options: EvaluatedExpression[];
// isArray
items: EvaluatedExpression[];
// isConstant && isString
string: String;
// isConstant && isNumber
number: Number;
// isConstant && isRegExp
regExp: RegExp;
// !isConstant && isWrapped
prefix: EvaluatedExpression;
// !isConstant && isWrapped
postfix: EvaluatedExpression;
}
type CalculatedString {
range: Number[];
value: String;
code: Boolean;
}
// Options stuff
interface CompilationOptions {
context: String;
entry: String;
resolve: ResolveOptions;
module: {
preLoaders: MatchableLoader[];
postLoaders: MatchableLoader[];
loaders: MatchableLoader[];
loader: Object;
parse: ParseOptions;
};
optimize: {
maxChunks: Number;
chunkOverhead: Number;
entryChunkMultiplicator: Number;
};
debug: Boolean;
devtool: false | "eval" | "sourcemap";
minimize: UglifyJs2Options;
separate: {
};
output: {
path: String;
publicPath: String;
filename: String;
chunkFilename: String;
namedChunkFilename: String;
pathinfo: Boolean;
jsonpFunction?: String;
libraryName?: String;
};
}
interface ResolveOptions {
paths: String[];
modulesDirectories: String[];
resourcePaths: String[];
resourceModulesDirectories: String[];
alias: Object; // Map<String, String>
extensions: String[];
packageMains: String[];
loaderPaths: String[];
loaderModulesDirectories: String[];
loaderAlias: Object; // Map<String, String>
loaderPostfixes: String[];
loaderExtensions: String[];
loaderPackageMains: String[];
disableLoaders: Boolean;
disableResourceQuery: Boolean;
disableResourcePureQuery: Boolean;
disableLoaderQuery: Boolean;
}
interface MatchableLoader {
test: StringOrRegExp | StringOrRegExp[];
include?: StringOrRegExp | StringOrRegExp[];
exclude?: StringOrRegExp | StringOrRegExp[];
loader: String;
}
// Compiler stuff
interface Resolver {
resolveModuleRequest: (context: String, request: String, callback: (err, request) => void) => void;
resolveContextRequest: (context: String, request: String, callback: (err, request) => void) => void;
resolveLoader: (context: String, request: String, callback: (err, request) => void) => void;
}
interface Executor {
static availible: () => Boolean;
ready: () => Boolean;
execute: (
module: String;
params: Object[];
callback: (err, results...) => void
) => void;
}
interface CompilationOptimizer {
optimize(compilation: Compilation, callback: (err) => void);
}
interface FileEmitter {
emitFile(name: String, content: Buffer | String, callback: (err) => void) => void;
}
class Compiler {
constructor(options);
resolver: Resolver;
separateExecutor: Executor;
optimizers: CompilationOptimizer[];
dependencyTemplates: ArrayMap; // Dependency Class -> DependencyTemplate
moduleTemplate: ModuleTemplate;
chunkTemplate: ChunkTemplate;
mainTemplate: ChunkTemplate;
fileEmitter: FileEmitter;
plugins: CompilationPlugin[];
run(callback: (err, stats: Stats) => void) => void;
}
// Node specifiy stuff
class NodeSubProcessExecutor implements Executor {
static availible;
constructor(count: Number);
ready;
execute;
}
class NodeFileEmitter implements FileEmitter {
constructor(outputPath: String);
emitFile;
}
class NodeResolver implements Resolver {
constructor(options: ResolveOptions);
resolveModuleRequest;
resolveContextRequest;
resolveLoader;
}
class NodeCompiler {
constructor(options);
resolver: NodeResolver
}

View File

@ -2,52 +2,40 @@
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
require = require("enhanced-require")(module);
var cp = require('child_process');
var tc = require("./template-common");
var formatOutput = require("../lib/formatOutput");
var createFilenameShortener = require("../lib/createFilenameShortener");
var webpackGraph = require("webpack-graph");
var Stats = require("../lib/Stats");
// var webpackGraph = require("webpack-graph");
var fs = require("fs");
var path = require("path");
var extraArgs = "";
if(fs.existsSync(require("path").join(process.cwd(), "webpackOptions.js")))
extraArgs += "--options webpackOptions.js ";
cp.exec("node ../../bin/webpack.js --verbose --min "+extraArgs+" example.js js/output.js", function (error, stdout, stderr) {
cp.exec("node ../../bin/webpack.js --display-reasons --display-chunks --optimize-minimize "+extraArgs+" ./example.js js/output.js", function (error, stdout, stderr) {
if(stderr)
console.log(stderr);
if (error !== null)
console.log(error);
var readme = tc(require("raw!"+require("path").join(process.cwd(), "template.md")), require.context("raw!"+process.cwd()), stdout.replace(/[\r\n]*$/, ""), "min");
cp.exec("node ../../bin/webpack.js --filenames --verbose "+extraArgs+" example.js js/output.js --json", function (error, stdout, stderr) {
clean(require.contentCache);
clean(require.sourceCache);
clean(require.cache);
var readme = tc(fs.readFileSync(require("path").join(process.cwd(), "template.md"), "utf-8"), process.cwd(), stdout.replace(/[\r\n]*$/, ""), "min");
cp.exec("node ../../bin/webpack.js --display-reasons --display-chunks --output-pathinfo "+extraArgs+" ./example.js js/output.js", function (error, stdout, stderr) {
console.log(stdout);
if(stderr)
console.log(stderr);
if (error !== null)
console.log(error);
var stats = JSON.parse(stdout);
var formatedStats = formatOutput(stats, {
context: process.cwd(),
verbose: true
});
var filenameShortener = createFilenameShortener(process.cwd());
readme = tc(readme, require.context("raw!"+process.cwd()), formatedStats.replace(/[\r\n]*$/, ""));
// var stats = JSON.parse(stdout);
// var formatedStats = Stats.jsonToString(stats, {
// context: process.cwd(),
// verbose: true
// });
// var filenameShortener = createFilenameShortener(process.cwd());
readme = tc(readme, process.cwd(), stdout.replace(/[\r\n]*$/, ""));
readme = readme.replace(/\r\n/g, "\n").replace(/\r/g, "\n");
fs.writeFile("README.md", readme, "utf-8", function() {});
fs.writeFile("graph.svg", webpackGraph(stats, {
nameShortener: filenameShortener,
width: 500,
height: 300
}), "utf-8", function() {});
// fs.writeFile("graph.svg", webpackGraph(stats, {
// nameShortener: filenameShortener,
// width: 500,
// height: 300
// }), "utf-8", function() {});
});
});
function clean(obj) {
for(var name in obj) {
delete obj[name];
}
}

View File

@ -17,178 +17,139 @@ getTemplate("b", function(b) {
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require,console) {
function getTemplate(templateName, callback) {
require(1, function() { return [require(/*! ../require.context/templates */4)("./"+templateName)]}, function(tmpl) {
callback(tmpl());
});
}
getTemplate("a", function(a) {
console.log(a);
});
getTemplate("b", function(b) {
console.log(b);
});
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */2),require(/*! __webpack_console */1)))
/******/},
/******/
/******/1: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_console.js !**/
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
/******/},
/******/
/******/2: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_amd_require.js !**/
var req = require.valueOf();
function amdRequire(chunk, requiresFn, fn) {
if(!requiresFn) {
// commonjs
return req(chunk);
function getTemplate(templateName, callback) {
require.e/* require */(1, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [require(/*! ../require.context/templates */ 1)("./"+templateName)]; (function(tmpl) {
callback(tmpl());
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
}
req.e(chunk, function() {
var modules = requiresFn();
if(fn)
return fn.apply(null, modules);
getTemplate("a", function(a) {
console.log(a);
});
getTemplate("b", function(b) {
console.log(b);
});
}
for(var name in req)
amdRequire[name] = req[name];
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */3);
amdRequire.config = function() {/* config is ignored, use webpack options */};
module.exports = amdRequire;
/***/ }
/******/ })
/******/},
/******/
/******/3: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
/* empty to return {} */
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/4: function(module, exports, require) {
webpackJsonp(1, {
/**! (webpack)\examples\require.context\templates !**/
/***/ 1:
/*!********************************************!*\
!*** ./require.context/templates ^\.\/.*$ ***!
\********************************************/
/***/ function(module, exports, require) {
/***/ var map = {"./a.js":5,"./b.js":6,"./c.js":7};
/***/ exports = module.exports = function(name) {
/***/ return require(exports.id(name) || name)
/***/ };
/***/ exports.id = function(name) {
/***/ return map[name] || map[name+".js"];
/***/ };
/***/ exports.keys = function() {
/***/ return Object.keys(map);
/***/ };
var map = {
"./a.js": 2,
"./a": 2,
"./b.js": 3,
"./b": 3,
"./c.js": 4,
"./c": 4
};
module.exports = function webpackContext(req) {
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
};
module.exports.keys = function webpackContextKeys() {
return Object.keys(map);
};
/******/},
/******/
/******/5: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\a.js !**/
/***/ 2:
/*!****************************************!*\
!*** ./require.context/templates/a.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template A";
}
module.exports = function() {
return "This text was generated by template A";
}
/******/},
/******/
/******/6: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\b.js !**/
/***/ 3:
/*!****************************************!*\
!*** ./require.context/templates/b.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template B";
}
module.exports = function() {
return "This text was generated by template B";
}
/******/},
/******/
/******/7: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\c.js !**/
/***/ 4:
/*!****************************************!*\
!*** ./require.context/templates/c.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template C";
}
module.exports = function() {
return "This text was generated by template C";
}
/******/}
/******/})
/***/ }
})
```
# Info
@ -196,69 +157,49 @@ module.exports = function() {
## Uncompressed
```
Hash: bf0ce807e0d159bd6a3739abefcc2e57
Compile Time: 45ms
Chunks: 2
Modules: 8
Modules including duplicates: 8
Modules first chunk: 4
main output.js: 3870 chars/bytes
1.output.js: 1110 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 295 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
2 502 (webpack)\buildin\__webpack_amd_require.js
require (1x) from .\example.js
3 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
1.output.js
4 322 [context] (webpack)\examples\require.context\templates
async context from .\example.js
5 80 (webpack)\examples\require.context\templates\a.js
async context from .\example.js
6 80 (webpack)\examples\require.context\templates\b.js
async context from .\example.js
7 80 (webpack)\examples\require.context\templates\c.js
async context from .\example.js
Hash: f1fb37f49e400b26b20b56805a789ef3
Time: 47ms
Asset Size Chunks Chunk Names
output.js 2403 0 main
1.output.js 1427 1
chunk {0} output.js (main) 251
[0] ./example.js 251 [built] {0}
chunk {1} 1.output.js 457 {0}
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
amd require context ../require.context/templates [0] ./example.js 2:1-4:3
[2] ./require.context/templates/a.js 80 [built] {1}
context element ./a [1] ./require.context/templates ^\.\/.*$
context element ./a.js [1] ./require.context/templates ^\.\/.*$
[3] ./require.context/templates/b.js 80 [built] {1}
context element ./b [1] ./require.context/templates ^\.\/.*$
context element ./b.js [1] ./require.context/templates ^\.\/.*$
[4] ./require.context/templates/c.js 80 [built] {1}
context element ./c [1] ./require.context/templates ^\.\/.*$
context element ./c.js [1] ./require.context/templates ^\.\/.*$
```
## Minimized (uglify-js, no zip)
```
Hash: 1340b9e7d018a9c04cbe2e165e1d6f22
Compile Time: 288ms
Chunks: 2
Modules: 8
Modules including duplicates: 8
Modules first chunk: 4
main output.js: 1405 chars/bytes
1.output.js: 456 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 186 .\example.js
main
1 403 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
2 271 (webpack)\buildin\__webpack_amd_require.js
require (1x) from .\example.js
3 0 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
1.output.js
4 213 [context] (webpack)\examples\require.context\templates
async context from .\example.js
5 73 (webpack)\examples\require.context\templates\a.js
async context from .\example.js
6 73 (webpack)\examples\require.context\templates\b.js
async context from .\example.js
7 73 (webpack)\examples\require.context\templates\c.js
async context from .\example.js
Hash: f1fb37f49e400b26b20b56805a789ef3
Time: 122ms
Asset Size Chunks Chunk Names
output.js 855 0 main
1.output.js 494 1
chunk {0} output.js (main) 251
[0] ./example.js 251 [built] {0}
chunk {1} 1.output.js 457 {0}
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
amd require context ../require.context/templates [0] ./example.js 2:1-4:3
[2] ./require.context/templates/a.js 80 [built] {1}
context element ./a [1] ./require.context/templates ^\.\/.*$
context element ./a.js [1] ./require.context/templates ^\.\/.*$
[3] ./require.context/templates/b.js 80 [built] {1}
context element ./b [1] ./require.context/templates ^\.\/.*$
context element ./b.js [1] ./require.context/templates ^\.\/.*$
[4] ./require.context/templates/c.js 80 [built] {1}
context element ./c [1] ./require.context/templates ^\.\/.*$
context element ./c.js [1] ./require.context/templates ^\.\/.*$
```
## Graph

View File

@ -17,145 +17,139 @@ getTemplate("b", function(b) {
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
function getTemplate(templateName, callback) {
require.e(1, function(require) {
callback(require(/*! ../require.context/templates */2)("./"+templateName)());
function getTemplate(templateName, callback) {
require.e/*nsure*/(1, function(require) {
callback(require(/*! ../require.context/templates */ 1)("./"+templateName)());
});
}
getTemplate("a", function(a) {
console.log(a);
});
getTemplate("b", function(b) {
console.log(b);
});
}
getTemplate("a", function(a) {
console.log(a);
});
getTemplate("b", function(b) {
console.log(b);
});
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ }
/******/ })
/**! (webpack)\buildin\__webpack_console.js !**/
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/2: function(module, exports, require) {
webpackJsonp(1, {
/**! (webpack)\examples\require.context\templates !**/
/***/ 1:
/*!********************************************!*\
!*** ./require.context/templates ^\.\/.*$ ***!
\********************************************/
/***/ function(module, exports, require) {
/***/ var map = {"./a.js":3,"./b.js":4,"./c.js":5};
/***/ exports = module.exports = function(name) {
/***/ return require(exports.id(name) || name)
/***/ };
/***/ exports.id = function(name) {
/***/ return map[name] || map[name+".js"];
/***/ };
/***/ exports.keys = function() {
/***/ return Object.keys(map);
/***/ };
var map = {
"./a.js": 2,
"./a": 2,
"./b.js": 3,
"./b": 3,
"./c.js": 4,
"./c": 4
};
module.exports = function webpackContext(req) {
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
};
module.exports.keys = function webpackContextKeys() {
return Object.keys(map);
};
/******/},
/******/
/******/3: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\a.js !**/
/***/ 2:
/*!****************************************!*\
!*** ./require.context/templates/a.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template A";
}
module.exports = function() {
return "This text was generated by template A";
}
/******/},
/******/
/******/4: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\b.js !**/
/***/ 3:
/*!****************************************!*\
!*** ./require.context/templates/b.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template B";
}
module.exports = function() {
return "This text was generated by template B";
}
/******/},
/******/
/******/5: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\c.js !**/
/***/ 4:
/*!****************************************!*\
!*** ./require.context/templates/c.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template C";
}
module.exports = function() {
return "This text was generated by template C";
}
/******/}
/******/})
/***/ }
})
```
# Info
@ -163,61 +157,49 @@ module.exports = function() {
## Uncompressed
```
Hash: 559a2edfadb9eaf3802f27ba76f9acac
Compile Time: 38ms
Chunks: 2
Modules: 6
Modules including duplicates: 6
Modules first chunk: 2
main output.js: 2966 chars/bytes
1.output.js: 1110 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 271 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
1.output.js
2 322 [context] (webpack)\examples\require.context\templates
async context from .\example.js
3 80 (webpack)\examples\require.context\templates\a.js
async context from .\example.js
4 80 (webpack)\examples\require.context\templates\b.js
async context from .\example.js
5 80 (webpack)\examples\require.context\templates\c.js
async context from .\example.js
Hash: 8001dd58ca639f6177eeb7302f24a770
Time: 38ms
Asset Size Chunks Chunk Names
output.js 2291 0 main
1.output.js 1427 1
chunk {0} output.js (main) 266
[0] ./example.js 266 [built] {0}
chunk {1} 1.output.js 457 {0}
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
cjs require context ../require.context/templates [0] ./example.js 3:11-64
[2] ./require.context/templates/a.js 80 [built] {1}
context element ./a [1] ./require.context/templates ^\.\/.*$
context element ./a.js [1] ./require.context/templates ^\.\/.*$
[3] ./require.context/templates/b.js 80 [built] {1}
context element ./b [1] ./require.context/templates ^\.\/.*$
context element ./b.js [1] ./require.context/templates ^\.\/.*$
[4] ./require.context/templates/c.js 80 [built] {1}
context element ./c [1] ./require.context/templates ^\.\/.*$
context element ./c.js [1] ./require.context/templates ^\.\/.*$
```
## Minimized (uglify-js, no zip)
```
Hash: fb0c194fd339c5e291b48da7893f9db5
Compile Time: 267ms
Chunks: 2
Modules: 6
Modules including duplicates: 6
Modules first chunk: 2
main output.js: 1154 chars/bytes
1.output.js: 456 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 160 .\example.js
main
1 403 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
1.output.js
2 213 [context] (webpack)\examples\require.context\templates
async context from .\example.js
3 73 (webpack)\examples\require.context\templates\a.js
async context from .\example.js
4 73 (webpack)\examples\require.context\templates\b.js
async context from .\example.js
5 73 (webpack)\examples\require.context\templates\c.js
async context from .\example.js
Hash: 8001dd58ca639f6177eeb7302f24a770
Time: 121ms
Asset Size Chunks Chunk Names
output.js 816 0 main
1.output.js 494 1
chunk {0} output.js (main) 266
[0] ./example.js 266 [built] {0}
chunk {1} 1.output.js 457 {0}
[1] ./require.context/templates ^\.\/.*$ 217 [built] {1}
cjs require context ../require.context/templates [0] ./example.js 3:11-64
[2] ./require.context/templates/a.js 80 [built] {1}
context element ./a [1] ./require.context/templates ^\.\/.*$
context element ./a.js [1] ./require.context/templates ^\.\/.*$
[3] ./require.context/templates/b.js 80 [built] {1}
context element ./b [1] ./require.context/templates ^\.\/.*$
context element ./b.js [1] ./require.context/templates ^\.\/.*$
[4] ./require.context/templates/c.js 80 [built] {1}
context element ./c [1] ./require.context/templates ^\.\/.*$
context element ./c.js [1] ./require.context/templates ^\.\/.*$
```
## Graph

View File

@ -16,119 +16,104 @@ module.exports = "It works";
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
require(/*! bundle!./file.js */2)(function(fileJsExports) {
console.log(fileJsExports);
});
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
require(/*! bundle!./file.js */ 1)(function(fileJsExports) {
console.log(fileJsExports);
});
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ },
/**! (webpack)\buildin\__webpack_console.js !**/
/***/ 1:
/*!***********************************************************************************************************!*\
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js ***!
\***********************************************************************************************************/
/***/ function(module, exports, require) {
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
/******/},
/******/
/******/2: function(module, exports, require) {
/**! (webpack)\~\bundle-loader!.\file.js !**/
var cbs = [],
data;
module.exports = function(cb) {
if(cbs) cbs.push(cb);
else cb(data);
}
require.e(1, function(require) {
data = require(/*! !.\file.js */3);
var callbacks = cbs;
cbs = null;
for(var i = 0, l = callbacks.length; i < l; i++) {
callbacks[i](data);
var cbs = [],
data;
module.exports = function(cb) {
if(cbs) cbs.push(cb);
else cb(data);
}
});
require.e/*nsure*/(1, function(require) {
data = require(/*! !./file.js */ 2);
var callbacks = cbs;
cbs = null;
for(var i = 0, l = callbacks.length; i < l; i++) {
callbacks[i](data);
}
});
/***/ }
/******/ })
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/3: function(module, exports, require) {
webpackJsonp(1, {
/**! .\file.js !**/
/***/ 2:
/*!*****************!*\
!*** ./file.js ***!
\*****************/
/***/ function(module, exports, require) {
module.exports = "It works";
module.exports = "It works";
/******/}
/******/})
/***/ }
})
```
# Info
@ -136,53 +121,35 @@ module.exports = "It works";
## Uncompressed
```
Hash: 578af2d2eeef37e82cc9e8248511201d
Compile Time: 53ms
Chunks: 2
Modules: 4
Modules including duplicates: 4
Modules first chunk: 3
main output.js: 3303 chars/bytes
1.output.js: 145 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 92 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (1x) from .\example.js
2 398 (webpack)\~\bundle-loader!.\file.js
require (1x) from .\example.js
1.output.js
3 28 .\file.js
async require (1x) from .\file.js
Hash: cc24cfb25787184810a9e9dd0e4c4999
Time: 56ms
Asset Size Chunks Chunk Names
output.js 2802 0 main
1.output.js 182 1
chunk {0} output.js (main) 508
[0] ./example.js 86 [built] {0}
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 422 [built] {0}
cjs require bundle!./file.js [0] ./example.js 1:0-27
chunk {1} 1.output.js 28 {0}
[2] ./file.js 28 [built] {1}
cjs require !!.\file.js [1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 8:8-171
```
## Minimized (uglify-js, no zip)
```
Hash: 5e7ee4f471c7ea9d20a78d163e3645da
Compile Time: 254ms
Chunks: 2
Modules: 4
Modules including duplicates: 4
Modules first chunk: 3
main output.js: 1221 chars/bytes
1.output.js: 54 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 40 .\example.js
main
1 403 (webpack)\buildin\__webpack_console.js
require (1x) from .\example.js
2 165 (webpack)\~\bundle-loader!.\file.js
require (1x) from .\example.js
1.output.js
3 26 .\file.js
async require (1x) from .\file.js
Hash: cc24cfb25787184810a9e9dd0e4c4999
Time: 127ms
Asset Size Chunks Chunk Names
output.js 877 0 main
1.output.js 54 1
chunk {0} output.js (main) 508
[0] ./example.js 86 [built] {0}
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 422 [built] {0}
cjs require bundle!./file.js [0] ./example.js 1:0-27
chunk {1} 1.output.js 28 {0}
[2] ./file.js 28 [built] {1}
cjs require !!.\file.js [1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/bundle-loader!./file.js 8:8-171
```
## Graph

View File

@ -13,101 +13,114 @@ require.ensure(["c"], function(require) {
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
var a = require(/*! a */2);
var b = require(/*! b */1);
require.e(1, function(require) {
require(/*! b */1).xyz();
var d = require(/*! d */4);
});
var a = require(/*! a */ 2);
var b = require(/*! b */ 1);
require.e/*nsure*/(1, function(require) {
require(/*! b */ 1).xyz();
var d = require(/*! d */ 4);
});
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ },
/**! .\~\b.js !**/
/***/ 1:
/*!****************!*\
!*** ./~/b.js ***!
\****************/
/***/ function(module, exports, require) {
// module b
// module b
/******/},
/******/
/******/2: function(module, exports, require) {
/***/ },
/**! .\~\a.js !**/
/***/ 2:
/*!****************!*\
!*** ./~/a.js ***!
\****************/
/***/ function(module, exports, require) {
// module a
// module a
/***/ }
/******/ })
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/3: function(module, exports, require) {
webpackJsonp(1, {
/**! .\~\c.js !**/
/***/ 3:
/*!****************!*\
!*** ./~/c.js ***!
\****************/
/***/ function(module, exports, require) {
// module c
// module c
/******/},
/******/
/******/4: function(module, exports, require) {
/***/ },
/**! .\~\d.js !**/
/***/ 4:
/*!****************!*\
!*** ./~/d.js ***!
\****************/
/***/ function(module, exports, require) {
// module d
// module d
/******/}
/******/})
/***/ }
})
```
Minimized
@ -121,57 +134,45 @@ webpackJsonp(1,{3:function(){},4:function(){}});
## Uncompressed
```
Hash: f9f9457a3d5544cebb5ce4117187a471
Compile Time: 47ms
Chunks: 2
Modules: 5
Modules including duplicates: 5
Modules first chunk: 3
main output.js: 2286 chars/bytes
1.output.js: 229 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 154 .\example.js
main
1 11 .\~\b.js
require (2x) from .\example.js
2 11 .\~\a.js
require (1x) from .\example.js
1.output.js
3 11 .\~\c.js
async require (1x) from .\example.js
4 11 .\~\d.js
async require (1x) from .\example.js
Hash: e3da5eef20b37553da43a1d3e38f42f5
Time: 39ms
Asset Size Chunks Chunk Names
output.js 2456 0 main
1.output.js 304 1
chunk {0} output.js (main) 161
[0] ./example.js 139 [built] {0}
[1] ./~/b.js 11 [built] {0}
cjs require b [0] ./example.js 2:8-20
cjs require b [0] ./example.js 4:4-16
[2] ./~/a.js 11 [built] {0}
cjs require a [0] ./example.js 1:8-20
chunk {1} 1.output.js 22 {0}
[3] ./~/c.js 11 [built] {1}
require.ensure item c [0] ./example.js 3:0-6:2
[4] ./~/d.js 11 [built] {1}
cjs require d [0] ./example.js 5:12-24
```
## Minimized (uglify-js, no zip)
```
Hash: b4b348db91689f6fb88a039e9d987a96
Compile Time: 203ms
Chunks: 2
Modules: 5
Modules including duplicates: 5
Modules first chunk: 3
main output.js: 759 chars/bytes
1.output.js: 48 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 72 .\example.js
main
1 0 .\~\b.js
require (2x) from .\example.js
2 0 .\~\a.js
require (1x) from .\example.js
1.output.js
3 0 .\~\c.js
async require (1x) from .\example.js
4 0 .\~\d.js
async require (1x) from .\example.js
Hash: e3da5eef20b37553da43a1d3e38f42f5
Time: 107ms
Asset Size Chunks Chunk Names
output.js 768 0 main
1.output.js 48 1
chunk {0} output.js (main) 161
[0] ./example.js 139 [built] {0}
[1] ./~/b.js 11 [built] {0}
cjs require b [0] ./example.js 2:8-20
cjs require b [0] ./example.js 4:4-16
[2] ./~/a.js 11 [built] {0}
cjs require a [0] ./example.js 1:8-20
chunk {1} 1.output.js 22 {0}
[3] ./~/c.js 11 [built] {1}
require.ensure item c [0] ./example.js 3:0-6:2
[4] ./~/d.js 11 [built] {1}
cjs require d [0] ./example.js 5:12-24
```
## Graph

View File

@ -26,96 +26,41 @@ module.exports = 42
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
console.log(require(/*! ./cup1.coffee */3));
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
console.log(require((function webpackMissingModule() { throw new Error("Cannot find module \"./cup1.coffee\""); }())));
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ }
/******/ })
/**! (webpack)\buildin\__webpack_console.js !**/
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
/******/},
/******/
/******/2: function(module, exports, require) {
/**! (webpack)\~\coffee-loader!.\cup2.coffee !**/
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
(function() {
console.log("yeah coffee-script");
module.exports = 42;
}).call(this);
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
/******/},
/******/
/******/3: function(module, exports, require) {
/**! (webpack)\~\coffee-loader!.\cup1.coffee !**/
(function() {
module.exports = {
cool: "stuff",
answer: 42,
external: require(/*! ./cup2.coffee */2),
again: require(/*! ./cup2.coffee */2)
};
}).call(this);
/******/}
/******/})
```
# Info
@ -123,49 +68,39 @@ console.timeEnd = function() {
## Uncompressed
```
Hash: 9dcd6efedf6b645ea544a56aa1edd41e
Compile Time: 141ms
Chunks: 1
Modules: 4
Modules including duplicates: 4
Modules first chunk: 4
main output.js: 2366 chars/bytes
Hash: a64a4902a56f0ef88c27e073807e4374
Time: 19ms
Asset Size Chunks Chunk Names
output.js 1150 0 main
chunk {0} output.js (main) 38
[0] ./example.js 38 [built] {0}
<id> <size> <filename>
<reason> from <filename>
output.js
0 44 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (1x) from .\example.js
require (1x) from .\cup2.coffee
2 92 (webpack)\~\coffee-loader!.\cup2.coffee
require (2x) from .\cup1.coffee
3 180 (webpack)\~\coffee-loader!.\cup1.coffee
require (1x) from .\example.js
ERROR in .\cup1.coffee
Module parse failed: .\cup1.coffee Line 2: Unexpected token :
module.exports =
cool: "stuff"
answer: 42
external: require "./cup2.coffee"
again: require "./cup2.coffee"
@ ./example.js 1:12-36
```
## Minimized (uglify-js, no zip)
```
Hash: f87b323b005d7bd0a92f3f7cde2344aa
Compile Time: 328ms
Chunks: 1
Modules: 4
Modules including duplicates: 4
Modules first chunk: 4
main output.js: 884 chars/bytes
Hash: a64a4902a56f0ef88c27e073807e4374
Time: 54ms
Asset Size Chunks Chunk Names
output.js 403 0 main
chunk {0} output.js (main) 38
[0] ./example.js 38 [built] {0}
<id> <size> <filename>
<reason> from <filename>
output.js
0 24 .\example.js
main
1 403 (webpack)\buildin\__webpack_console.js
require (1x) from .\example.js
require (1x) from .\cup2.coffee
2 77 (webpack)\~\coffee-loader!.\cup2.coffee
require (2x) from .\cup1.coffee
3 102 (webpack)\~\coffee-loader!.\cup1.coffee
require (1x) from .\example.js
ERROR in .\cup1.coffee
Module parse failed: .\cup1.coffee Line 2: Unexpected token :
module.exports =
cool: "stuff"
answer: 42
external: require "./cup2.coffee"
again: require "./cup2.coffee"
@ ./example.js 1:12-36
```

View File

@ -31,64 +31,72 @@ exports.add = function() {
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
var inc = require(/*! ./increment */1).increment;
var a = 1;
inc(a); // 2
var inc = require(/*! ./increment */ 1).increment;
var a = 1;
inc(a); // 2
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ },
/**! .\increment.js !**/
/***/ 1:
/*!**********************!*\
!*** ./increment.js ***!
\**********************/
/***/ function(module, exports, require) {
var add = require(/*! ./math */2).add;
exports.increment = function(val) {
return add(val, 1);
};
var add = require(/*! ./math */ 2).add;
exports.increment = function(val) {
return add(val, 1);
};
/******/},
/******/
/******/2: function(module, exports, require) {
/***/ },
/**! .\math.js !**/
/***/ 2:
/*!*****************!*\
!*** ./math.js ***!
\*****************/
/***/ function(module, exports, require) {
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
exports.add = function() {
var sum = 0, i = 0, args = arguments, l = args.length;
while (i < l) {
sum += args[i++];
}
return sum;
};
/***/ }
/******/ })
/******/}
/******/})
```
# Info
@ -96,43 +104,29 @@ exports.add = function() {
## Uncompressed
```
Hash: 6db0166b9d91e61d78ba00dd6df13b79
Compile Time: 22ms
Chunks: 1
Modules: 3
Modules including duplicates: 3
Modules first chunk: 3
main output.js: 1414 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 73 .\example.js
main
1 101 .\increment.js
require (1x) from .\example.js
2 156 .\math.js
require (1x) from .\increment.js
Hash: ed0d146781bfd63a8c38eb49000feb94
Time: 31ms
Asset Size Chunks Chunk Names
output.js 1657 0 main
chunk {0} output.js (main) 318
[0] ./example.js 67 [built] {0}
[1] ./increment.js 95 [built] {0}
cjs require ./increment [0] ./example.js 1:10-32
[2] ./math.js 156 [built] {0}
cjs require ./math [1] ./increment.js 1:10-27
```
## Minimized (uglify-js, no zip)
```
Hash: 5bb0d64ae4ed4d0462683c11c6455963
Compile Time: 170ms
Chunks: 1
Modules: 3
Modules including duplicates: 3
Modules first chunk: 3
main output.js: 504 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 40 .\example.js
main
1 70 .\increment.js
require (1x) from .\example.js
2 87 .\math.js
require (1x) from .\increment.js
Hash: ed0d146781bfd63a8c38eb49000feb94
Time: 77ms
Asset Size Chunks Chunk Names
output.js 524 0 main
chunk {0} output.js (main) 318
[0] ./example.js 67 [built] {0}
[1] ./increment.js 95 [built] {0}
cjs require ./increment [0] ./example.js 1:10-32
[2] ./math.js 156 [built] {0}
cjs require ./math [1] ./increment.js 1:10-27
```

View File

@ -37,153 +37,103 @@ module.exports = function(content) {
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(module,console) {
// Polyfill require for node.js usage of loaders
require = require(/*! enhanced-require */7)(module);
/* WEBPACK VAR INJECTION */(function(module) {// Polyfill require for node.js usage of loaders
require = require(/*! enhanced-require */ 3)(module);
// use our loader
console.dir(require(/*! ./loader!./file */ 4));
// use buildin json loader
console.dir(require((function webpackMissingModule() { throw new Error("Cannot find module \"./test.json\""); }()))); // default by extension
console.dir(require(/*! json!./test.json */ 1)); // manual
/* WEBPACK VAR INJECTION */}(require(/*! (webpack)/buildin/module.js */ 2)(module)))
// use our loader
console.dir(require(/*! ./loader!./file */6));
/***/ },
// use buildin json loader
console.dir(require(/*! ./test.json */2)); // default by extension
console.dir(require(/*! json!./test.json */2)); // manual
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_module */4)(module),require(/*! __webpack_console */1)))
/***/ 1:
/*!***********************************************************************************************************!*\
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/json-loader!./test.json ***!
\***********************************************************************************************************/
/***/ function(module, exports, require) {
/******/},
/******/
/******/1: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_console.js !**/
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
/******/},
/******/
/******/2: function(module, exports, require) {
/**! (webpack)\~\json-loader!.\test.json !**/
module.exports = {
"foobar": 1234
}
/******/},
/******/
/******/3: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_amd_require.js !**/
var req = require.valueOf();
function amdRequire(chunk, requiresFn, fn) {
if(!requiresFn) {
// commonjs
return req(chunk);
module.exports = {
"foobar": 1234
}
req.e(chunk, function() {
var modules = requiresFn();
if(fn)
return fn.apply(null, modules);
});
}
for(var name in req)
amdRequire[name] = req[name];
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */5);
amdRequire.config = function() {/* config is ignored, use webpack options */};
module.exports = amdRequire;
/***/ },
/******/},
/******/
/******/4: function(module, exports, require) {
/***/ 2:
/*!***********************************!*\
!*** (webpack)/buildin/module.js ***!
\***********************************/
/***/ function(module, exports, require) {
/**! (webpack)\buildin\__webpack_module.js !**/
module.exports = function(module) {
if(!module.webpackPolyfill) {
module.deprecate = function() {};
module.paths = [];
// module.parent = undefined by default
module.children = [];
module.webpackPolyfill = 1;
module.exports = function(module) {
if(!module.webpackPolyfill) {
module.deprecate = function() {};
module.paths = [];
// module.parent = undefined by default
module.children = [];
module.webpackPolyfill = 1;
}
return module;
}
return module;
}
/***/ },
/******/},
/******/
/******/5: function(module, exports, require) {
/***/ 3:
/*!*******************************************!*\
!*** (webpack)/buildin/return-require.js ***!
\*******************************************/
/***/ function(module, exports, require) {
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
module.exports = function() { return require; };
/* empty to return {} */
/***/ },
/******/},
/******/
/******/6: function(module, exports, require) {
/***/ 4:
/*!*****************************!*\
!*** ./loader.js!./file.js ***!
\*****************************/
/***/ function(module, exports, require) {
/**! .\loader.js!.\file.js !**/
exports.answer = 42;
exports.foo = "bar";
exports.answer = 42;
exports.foo = "bar";
/***/ }
/******/ })
/******/},
/******/
/******/7: function(module, exports, require) {
/**! (webpack)\~\enhanced-require\lib\require.webpack.js !**/
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
module.exports = function() {
return require(/*! __webpack_amd_require */3);
}
/******/}
/******/})
```
# Console output
@ -201,32 +151,25 @@ Prints in node.js (`node example.js`) and in browser:
## Uncompressed
```
Hash: ca21531724184f0e1ca4cf691ca027d1
Compile Time: 68ms
Chunks: 1
Modules: 8
Modules including duplicates: 8
Modules first chunk: 8
main output.js: 3837 chars/bytes
Hash: be1bfb66ba06ce71b31bcddbcf2f9965
Time: 58ms
Asset Size Chunks Chunk Names
output.js 2922 0 main
chunk {0} output.js (main) 674
[0] ./example.js 296 [built] {0}
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/json-loader!./test.json 36 [built] {0}
cjs require json!./test.json [0] ./example.js 9:12-39
[2] (webpack)/buildin/module.js 241 [built] {0}
cjs require module [0] ./example.js 1:0-132
[3] (webpack)/buildin/return-require.js 60 [built] {0}
cjs require enhanced-require [0] ./example.js 2:10-37
[4] ./loader.js!./file.js 41 [not cacheable] [built] {0}
cjs require ./loader!./file [0] ./example.js 5:12-38
<id> <size> <filename>
<reason> from <filename>
output.js
0 320 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (3x) from .\example.js
2 36 (webpack)\~\json-loader!.\test.json
require (1x) from .\example.js
require (1x) from .\example.js
3 502 (webpack)\buildin\__webpack_amd_require.js
require (1x) from (webpack)\~\enhanced-require\lib\require.webpack.js
4 241 (webpack)\buildin\__webpack_module.js
require (1x) from .\example.js
5 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
6 41 .\loader.js!.\file.js
require (1x) from .\example.js
7 179 (webpack)\~\enhanced-require\lib\require.webpack.js
require (1x) from .\example.js
ERROR in .\test.json
Module parse failed: .\test.json Line 2: Unexpected token :
{
"foobar": 1234
}
@ ./example.js 8:12-34
```

View File

@ -51,224 +51,168 @@ require(
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require) {
// CommonJs-style requires
var commonjs1 = require(/*! ./commonjs */2);
var amd1 = require(/*! ./amd */1);
// CommonJs-style requires
var commonjs1 = require(/*! ./commonjs */ 2);
var amd1 = require(/*! ./amd */ 1);
// AMD-style requires (with all webpack features)
require.e/* require */(1, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [
(require(/*! ./commonjs */ 2)), (require(/*! ./amd */ 1)),
require(/*! ../require.context/templates */ 3)("./"+amd1+".js"),
Math.random() < 0.5 ? (require(/*! ./commonjs */ 2)) : (require(/*! ./amd */ 1))]; (function(commonjs2, amd2, template, randModule) {
// Do something with it...
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
// AMD-style requires (with all webpack features)
require(1, function() { return [
require(/*! ./commonjs */2), require(/*! ./amd */1),
require(/*! ../require.context/templates */6)("./"+amd1+".js"),
Math.random() < 0.5 ? require(/*! ./commonjs */2) : require(/*! ./amd */1)]},
function(commonjs2, amd2, template, randModule) {
// Do something with it...
}
);
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */3)))
/***/ },
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ 1:
/*!****************!*\
!*** ./amd.js ***!
\****************/
/***/ function(module, exports, require) {
/**! .\amd.js !**/
// AMD Module Format
{var __WEBPACK_AMD_DEFINE_ARRAY__ = [(require(/*! ./commonjs */ 2))]; var __WEBPACK_AMD_DEFINE_RESULT__ = (function(commonjs1) {
// but you can use CommonJs-style requires:
var commonjs2 = require(/*! ./commonjs */ 2);
// Do something...
return 456;
}.apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;};
/******/ /* WEBPACK FREE VAR INJECTION */ (function(define) {
// AMD Module Format
define(
/*! app/amd */0,
[require(/*! ./commonjs */2)],
function(commonjs1) {
// but you can use CommonJs-style requires:
var commonjs2 = require(/*! ./commonjs */2);
// Do something...
return 456;
}
);
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_define */4)(module)))
/***/ },
/******/},
/******/
/******/2: function(module, exports, require) {
/***/ 2:
/*!*********************!*\
!*** ./commonjs.js ***!
\*********************/
/***/ function(module, exports, require) {
/**! .\commonjs.js !**/
// CommonJs Module Format
module.exports = 123;
// but you can use amd.style requires
require.e/* require */(0/* empty */, function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = [(require(/*! ./amd */ 1))]; (function(amd1) {
var amd2 = require(/*! ./amd */ 1);
}.apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));});
/******/ /* WEBPACK FREE VAR INJECTION */ (function(require) {
// CommonJs Module Format
module.exports = 123;
/***/ }
/******/ })
// but you can use amd.style requires
require(
0, function() { return [require(/*! ./amd */1)]},
function(amd1) {
var amd2 = require(/*! ./amd */1);
}
);
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_amd_require */3)))
/******/},
/******/
/******/3: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_amd_require.js !**/
var req = require.valueOf();
function amdRequire(chunk, requiresFn, fn) {
if(!requiresFn) {
// commonjs
return req(chunk);
}
req.e(chunk, function() {
var modules = requiresFn();
if(fn)
return fn.apply(null, modules);
});
}
for(var name in req)
amdRequire[name] = req[name];
amdRequire.amd = require(/*! ./__webpack_options_amd.loader.js!./__webpack_options_amd.loader.js */5);
amdRequire.config = function() {/* config is ignored, use webpack options */};
module.exports = amdRequire;
/******/},
/******/
/******/4: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_amd_define.js !**/
var amdRequire = require(/*! ./__webpack_amd_require */3);
module.exports = function(module) {
function define(id, dependencies, factory) {
if(typeof id != "number") {
factory = dependencies;
dependencies = id;
id = null;
}
if(!factory) {
factory = dependencies;
dependencies = [amdRequire, module.exports, module];
}
var result = typeof factory == "function" ? factory.apply(null, dependencies) : factory;
if(result !== undefined)
module.exports = result;
return module.exports;
}
define.amd = amdRequire.amd;
return define;
}
/******/},
/******/
/******/5: function(module, exports, require) {
/**! (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js !**/
/* empty to return {} */
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/6: function(module, exports, require) {
webpackJsonp(1, {
/**! (webpack)\examples\require.context\templates !**/
/***/ 3:
/*!************************************************!*\
!*** ./require.context/templates ^\.\/.*\.js$ ***!
\************************************************/
/***/ function(module, exports, require) {
/***/ var map = {"./a.js":7,"./b.js":8,"./c.js":9};
/***/ exports = module.exports = function(name) {
/***/ return require(exports.id(name) || name)
/***/ };
/***/ exports.id = function(name) {
/***/ return map[name] || map[name+".js"];
/***/ };
/***/ exports.keys = function() {
/***/ return Object.keys(map);
/***/ };
var map = {
"./a.js": 4,
"./b.js": 5,
"./c.js": 6
};
module.exports = function webpackContext(req) {
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
};
module.exports.keys = function webpackContextKeys() {
return Object.keys(map);
};
/******/},
/******/
/******/7: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\a.js !**/
/***/ 4:
/*!****************************************!*\
!*** ./require.context/templates/a.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template A";
}
module.exports = function() {
return "This text was generated by template A";
}
/******/},
/******/
/******/8: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\b.js !**/
/***/ 5:
/*!****************************************!*\
!*** ./require.context/templates/b.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template B";
}
module.exports = function() {
return "This text was generated by template B";
}
/******/},
/******/
/******/9: function(module, exports, require) {
/***/ },
/**! (webpack)\examples\require.context\templates\c.js !**/
/***/ 6:
/*!****************************************!*\
!*** ./require.context/templates/c.js ***!
\****************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template C";
}
module.exports = function() {
return "This text was generated by template C";
}
/******/}
/******/})
/***/ }
})
```
# Info
@ -276,43 +220,34 @@ module.exports = function() {
## Uncompressed
```
Hash: 2f3233c2358d4ea85d495d5649412ac0
Compile Time: 165ms
Chunks: 2
Modules: 10
Modules including duplicates: 10
Modules first chunk: 6
main output.js: 5001 chars/bytes
1.output.js: 1110 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 474 .\example.js
main
1 235 .\amd.js
require (3x) from .\example.js
async require (2x) from .\commonjs.js
2 207 .\commonjs.js
require (3x) from .\example.js
require (2x) from .\amd.js
3 502 (webpack)\buildin\__webpack_amd_require.js
require (1x) from .\example.js
require (1x) from .\commonjs.js
require (1x) from (webpack)\buildin\__webpack_amd_define.js
4 563 (webpack)\buildin\__webpack_amd_define.js
require (1x) from .\amd.js
5 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
1.output.js
6 322 [context] (webpack)\examples\require.context\templates
async context from .\example.js
7 80 (webpack)\examples\require.context\templates\a.js
async context from .\example.js
8 80 (webpack)\examples\require.context\templates\b.js
async context from .\example.js
9 80 (webpack)\examples\require.context\templates\c.js
async context from .\example.js
Hash: 578635659acd728459ebbd30abf93f14
Time: 49ms
Asset Size Chunks Chunk Names
output.js 3621 0 main
1.output.js 1403 1
chunk {0} output.js (main) 728
[0] ./example.js 358 [built] {0}
[1] ./amd.js 208 [built] {0}
amd require ./amd [2] ./commonjs.js 5:0-10:1
cjs require ./amd [2] ./commonjs.js 8:13-29
cjs require ./amd [0] ./example.js 3:11-27
amd require ./amd [0] ./example.js 6:0-13:1
amd require ./amd [0] ./example.js 6:0-13:1
[2] ./commonjs.js 162 [built] {0}
cjs require ./commonjs [0] ./example.js 2:16-37
amd require ./commonjs [0] ./example.js 6:0-13:1
amd require ./commonjs [0] ./example.js 6:0-13:1
amd require ./commonjs [1] ./amd.js 2:0-11:1
cjs require ./commonjs [1] ./amd.js 7:18-39
chunk {1} 1.output.js 433 {0}
[3] ./require.context/templates ^\.\/.*\.js$ 193 [built] {1}
amd require context ../require.context/templates [0] ./example.js 6:0-13:1
[4] ./require.context/templates/a.js 80 [built] {1}
context element ./a.js [3] ./require.context/templates ^\.\/.*\.js$
[5] ./require.context/templates/b.js 80 [built] {1}
context element ./b.js [3] ./require.context/templates ^\.\/.*\.js$
[6] ./require.context/templates/c.js 80 [built] {1}
context element ./c.js [3] ./require.context/templates ^\.\/.*\.js$
```
## Graph

View File

@ -27,137 +27,146 @@ require.ensure(["b"], function(require) {
# js/output.js
``` javascript
/******/(function(document, undefined) {
/******/ return function(modules) {
/******/ var installedModules = {}, installedChunks = {0:1};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback(require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+chunkId+modules.a;
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ window[modules.b] = function(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i](require);
/******/ };
/******/ return require(0);
/******/ }
/******/})(document)
/******/({a:".output.js",b:"webpackJsonp",c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ if(installedChunks[chunkId] === 1) return callback.call(null, require);
/******/ if(installedChunks[chunkId] !== undefined)
/******/ installedChunks[chunkId].push(callback);
/******/ else {
/******/ installedChunks[chunkId] = [callback];
/******/ var head = document.getElementsByTagName('head')[0];
/******/ var script = document.createElement('script');
/******/ script.type = 'text/javascript';
/******/ script.charset = 'utf-8';
/******/ script.src = modules.c+""+chunkId+".output.js";
/******/ head.appendChild(script);
/******/ }
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ var installedChunks = {0:1};
/******/ window["webpackJsonp"] = function webpackJsonpCallback(chunkId, moreModules) {
/******/ for(var moduleId in moreModules)
/******/ modules[moduleId] = moreModules[moduleId];
/******/ var callbacks = installedChunks[chunkId];
/******/ installedChunks[chunkId] = 1;
/******/ for(var i = 0; i < callbacks.length; i++)
/******/ callbacks[i].call(null, require);
/******/ };
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
var a = require(/*! a */1);
var a = require(/*! a */ 3);
require.e/*nsure*/(2, function(require) {
// a named chuck
var c = require(/*! c */ 4);
}, /*! my own chuck */ 0);
require.e/*nsure*/(1, function(require) {
// another chuck with the same name
var d = require(/*! d */ 2);
}, /*! my own chuck */ 0);
require.e/*nsure*/(0/* empty */, function(require) {
// the same again
}, /*! my own chuck */ 0);
require.e/*nsure*/(1/* duplicate */, function(require) {
// chuck without name
var d = require(/*! d */ 2);
});
require.e(2, function(require) {
// a named chuck
var c = require(/*! c */4);
}, /*! my own chuck */0);
/***/ },
require.e(2, function(require) {
// another chuck with the same name
var d = require(/*! d */3);
}, /*! my own chuck */0);
/***/ 3:
/*!****************!*\
!*** ./~/a.js ***!
\****************/
/***/ function(module, exports, require) {
require.e(2, function(require) {
// the same again
}, /*! my own chuck */0);
// module a
require.e(1, function(require) {
// chuck without name
var d = require(/*! d */3);
});
/***/ }
/******/ })
/******/},
/******/
/******/1: function(module, exports, require) {
/**! .\~\a.js !**/
// module a
/******/}
/******/})
```
# js/1.output.js
``` javascript
/******/webpackJsonp(1,{
/******/2: function(module, exports, require) {
webpackJsonp(1, {
/**! .\~\b.js !**/
/***/ 1:
/*!****************!*\
!*** ./~/b.js ***!
\****************/
/***/ function(module, exports, require) {
// module b
// module b
/******/},
/******/
/******/3: function(module, exports, require) {
/***/ },
/**! .\~\d.js !**/
/***/ 2:
/*!****************!*\
!*** ./~/d.js ***!
\****************/
/***/ function(module, exports, require) {
// module d
// module d
/******/}
/******/})
/***/ }
})
```
# js/2.output.js
``` javascript
/******/webpackJsonp(2,{
/******/2: function(module, exports, require) {
webpackJsonp(2, {
/**! .\~\b.js !**/
/***/ 1:
/*!****************!*\
!*** ./~/b.js ***!
\****************/
/***/ function(module, exports, require) {
// module b
// module b
/******/},
/******/
/******/3: function(module, exports, require) {
/***/ },
/**! .\~\d.js !**/
/***/ 4:
/*!****************!*\
!*** ./~/c.js ***!
\****************/
/***/ function(module, exports, require) {
// module d
// module c
/******/},
/******/
/******/4: function(module, exports, require) {
/***/ }
/**! .\~\c.js !**/
// module c
/******/}
/******/})
})
```
# Info
@ -165,33 +174,29 @@ require.e(1, function(require) {
## Uncompressed
```
Hash: 28f68bf80483c70750a9e7d6fa895c7d
Compile Time: 54ms
Chunks: 3
Modules: 5
Modules including duplicates: 7
Modules first chunk: 2
main output.js: 2459 chars/bytes
1.output.js: 229 chars/bytes
my own chuck 2.output.js: 331 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 429 .\example.js
main
1 11 .\~\a.js
require (1x) from .\example.js
1.output.js
2 11 .\~\b.js
async require (3x) from .\example.js
3 11 .\~\d.js
async require (2x) from .\example.js
2.output.js
2 11 .\~\b.js
async require (3x) from .\example.js
3 11 .\~\d.js
async require (2x) from .\example.js
4 11 .\~\c.js
async require (1x) from .\example.js
Hash: 7ac2e7d0ae14244993a1334d177f915d
Time: 57ms
Asset Size Chunks Chunk Names
output.js 2659 0 main
1.output.js 304 1 my own chuck
2.output.js 304 2 my own chuck
chunk {0} output.js (main) 431
[0] ./example.js 420 [built] {0}
[3] ./~/a.js 11 [built] {0}
cjs require a [0] ./example.js 1:8-20
chunk {1} 1.output.js (my own chuck) 22 {0}
[1] ./~/b.js 11 [built] {1} {2}
require.ensure item b [0] ./example.js 3:0-6:18
require.ensure item b [0] ./example.js 8:0-11:18
require.ensure item b [0] ./example.js 17:0-20:2
[2] ./~/d.js 11 [built] {1}
cjs require d [0] ./example.js 10:9-21
cjs require d [0] ./example.js 19:9-21
chunk {2} 2.output.js (my own chuck) 22 {0}
[1] ./~/b.js 11 [built] {1} {2}
require.ensure item b [0] ./example.js 3:0-6:18
require.ensure item b [0] ./example.js 8:0-11:18
require.ensure item b [0] ./example.js 17:0-20:2
[4] ./~/c.js 11 [built] {2}
cjs require c [0] ./example.js 5:9-21
```

View File

@ -25,112 +25,105 @@ module.exports = function() {
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
/******/ /* WEBPACK FREE VAR INJECTION */ (function(console) {
function getTemplate(templateName) {
return require(/*! ./templates */2)("./"+templateName);
}
console.log(getTemplate("a"));
console.log(getTemplate("b"));
/******/ /* WEBPACK FREE VAR INJECTION */ }(require(/*! __webpack_console */1)))
function getTemplate(templateName) {
return require(/*! ./templates */ 4)("./"+templateName);
}
console.log(getTemplate("a"));
console.log(getTemplate("b"));
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ },
/**! (webpack)\buildin\__webpack_console.js !**/
/***/ 1:
/*!************************!*\
!*** ./templates/a.js ***!
\************************/
/***/ function(module, exports, require) {
var console = (function() { return this["console"] || (this["window"] && this["window"].console) || {} }());
module.exports = console;
for(var name in {log:1, info:1, error:1, warn:1, dir:1, trace:1, assert:1})
if(!console[name])
console[name] = function() {};
var times = {};
if(!console.time)
console.time = function(label) {
times[label] = Date.now();
};
if(!console.timeEnd)
console.timeEnd = function() {
var duration = Date.now() - times[label];
console.log('%s: %dms', label, duration);
};
module.exports = function() {
return "This text was generated by template A";
}
/******/},
/******/
/******/2: function(module, exports, require) {
/***/ },
/**! .\templates !**/
/***/ 2:
/*!************************!*\
!*** ./templates/b.js ***!
\************************/
/***/ function(module, exports, require) {
/***/ var map = {"./a.js":3,"./b.js":4,"./c.js":5};
/***/ exports = module.exports = function(name) {
/***/ return require(exports.id(name) || name)
/***/ };
/***/ exports.id = function(name) {
/***/ return map[name] || map[name+".js"];
/***/ };
/***/ exports.keys = function() {
/***/ return Object.keys(map);
/***/ };
module.exports = function() {
return "This text was generated by template B";
}
/******/},
/******/
/******/3: function(module, exports, require) {
/***/ },
/**! .\templates\a.js !**/
/***/ 3:
/*!************************!*\
!*** ./templates/c.js ***!
\************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template A";
}
module.exports = function() {
return "This text was generated by template C";
}
/******/},
/******/
/******/4: function(module, exports, require) {
/***/ },
/**! .\templates\b.js !**/
/***/ 4:
/*!****************************!*\
!*** ./templates ^\.\/.*$ ***!
\****************************/
/***/ function(module, exports, require) {
module.exports = function() {
return "This text was generated by template B";
}
var map = {
"./a.js": 1,
"./a": 1,
"./b.js": 2,
"./b": 2,
"./c.js": 3,
"./c": 3
};
module.exports = function webpackContext(req) {
return require(map[req] || (function() { throw new Error("Cannot find module " + req + ".") }()));
};
module.exports.keys = function webpackContextKeys() {
return Object.keys(map);
};
/******/},
/******/
/******/5: function(module, exports, require) {
/***/ }
/******/ })
/**! .\templates\c.js !**/
module.exports = function() {
return "This text was generated by template C";
}
/******/}
/******/})
```
# Info
@ -138,57 +131,45 @@ module.exports = function() {
## Uncompressed
```
Hash: f37d726cac8a8a4caa9c51bfa3479bc0
Compile Time: 31ms
Chunks: 1
Modules: 6
Modules including duplicates: 6
Modules first chunk: 6
main output.js: 2772 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 157 .\example.js
main
1 502 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
2 322 [context] .\templates
context from .\example.js
3 80 .\templates\a.js
context from .\example.js
4 80 .\templates\b.js
context from .\example.js
5 80 .\templates\c.js
context from .\example.js
Hash: 1fe0d041cafa3e29d3084946180e73a8
Time: 32ms
Asset Size Chunks Chunk Names
output.js 2408 0 main
chunk {0} output.js (main) 603
[0] ./example.js 146 [built] {0}
[1] ./templates/a.js 80 [built] {0}
context element ./a [4] ./templates ^\.\/.*$
context element ./a.js [4] ./templates ^\.\/.*$
[2] ./templates/b.js 80 [built] {0}
context element ./b [4] ./templates ^\.\/.*$
context element ./b.js [4] ./templates ^\.\/.*$
[3] ./templates/c.js 80 [built] {0}
context element ./c [4] ./templates ^\.\/.*$
context element ./c.js [4] ./templates ^\.\/.*$
[4] ./templates ^\.\/.*$ 217 [built] {0}
cjs require context ./templates [0] ./example.js 2:8-44
```
## Minimized (uglify-js, no zip)
```
Hash: 12af6de63ffb3550246208db321a2c56
Compile Time: 239ms
Chunks: 1
Modules: 6
Modules including duplicates: 6
Modules first chunk: 6
main output.js: 1162 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 110 .\example.js
main
1 403 (webpack)\buildin\__webpack_console.js
require (2x) from .\example.js
2 213 [context] .\templates
context from .\example.js
3 73 .\templates\a.js
context from .\example.js
4 73 .\templates\b.js
context from .\example.js
5 73 .\templates\c.js
context from .\example.js
Hash: 1fe0d041cafa3e29d3084946180e73a8
Time: 84ms
Asset Size Chunks Chunk Names
output.js 873 0 main
chunk {0} output.js (main) 603
[0] ./example.js 146 [built] {0}
[1] ./templates/a.js 80 [built] {0}
context element ./a [4] ./templates ^\.\/.*$
context element ./a.js [4] ./templates ^\.\/.*$
[2] ./templates/b.js 80 [built] {0}
context element ./b [4] ./templates ^\.\/.*$
context element ./b.js [4] ./templates ^\.\/.*$
[3] ./templates/c.js 80 [built] {0}
context element ./c [4] ./templates ^\.\/.*$
context element ./c.js [4] ./templates ^\.\/.*$
[4] ./templates ^\.\/.*$ 217 [built] {0}
cjs require context ./templates [0] ./example.js 2:8-44
```
## Graph

View File

@ -26,57 +26,63 @@ module.exports = Math.random();
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
var a = require(/*! ./a */1);
var a = require(/*! ./a */ 1);
// get module id
var aId = /*require.resolve*/(/*! ./a.js */ 1);
// clear module in require.cache
delete require.cache[aId];
// require module again, it should be reexecuted
var a2 = require(/*! ./a */ 1);
// vertify it
if(a == a2) throw new Error("Cache clear failed :(");
// get module id
var aId = (/*! ./a.js */1);
/***/ },
// clear module in require.cache
delete require.cache[aId];
/***/ 1:
/*!**************!*\
!*** ./a.js ***!
\**************/
/***/ function(module, exports, require) {
// require module again, it should be reexecuted
var a2 = require(/*! ./a */1);
module.exports = Math.random();
// vertify it
if(a == a2) throw new Error("Cache clear failed :(");
/***/ }
/******/ })
/******/},
/******/
/******/1: function(module, exports, require) {
/**! .\a.js !**/
module.exports = Math.random();
/******/}
/******/})
```
# Info
@ -84,41 +90,29 @@ module.exports = Math.random();
## Uncompressed
```
Hash: df30902a418a948159ac2acfb6d7aad0
Compile Time: 21ms
Chunks: 1
Modules: 2
Modules including duplicates: 2
Modules first chunk: 2
main output.js: 1301 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 286 .\example.js
main
1 31 .\a.js
require (2x) from .\example.js
require (1x) from .\example.js
Hash: 36093810c3120b88e12bd57e8b271458
Time: 28ms
Asset Size Chunks Chunk Names
output.js 1507 0 main
chunk {0} output.js (main) 314
[0] ./example.js 283 [built] {0}
[1] ./a.js 31 [built] {0}
require.resolve ./a.js [0] ./example.js 4:10-35
cjs require ./a [0] ./example.js 1:8-22
cjs require ./a [0] ./example.js 10:9-23
```
## Minimized (uglify-js, no zip)
```
Hash: 3e7997ad1d37f38ab08fa290b9b2f638
Compile Time: 157ms
Chunks: 1
Modules: 2
Modules including duplicates: 2
Modules first chunk: 2
main output.js: 431 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 113 .\example.js
main
1 29 .\a.js
require (2x) from .\example.js
require (1x) from .\example.js
Hash: 36093810c3120b88e12bd57e8b271458
Time: 71ms
Asset Size Chunks Chunk Names
output.js 451 0 main
chunk {0} output.js (main) 314
[0] ./example.js 283 [built] {0}
[1] ./a.js 31 [built] {0}
require.resolve ./a.js [0] ./example.js 4:10-35
cjs require ./a [0] ./example.js 1:8-22
cjs require ./a [0] ./example.js 10:9-23
```

View File

@ -2,11 +2,10 @@
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
require = require("enhanced-require")(module);
var fs = require("fs");
var path = require("path");
module.exports = function(template, filesReq, stdout, prefix) {
module.exports = function(template, baseDir, stdout, prefix) {
var regexp = new RegExp("\\{\\{" + (prefix ? prefix+":" : "") + "([^:\\}]+)\\}\\}", "g")
var cwd = process.cwd();
@ -17,7 +16,7 @@ module.exports = function(template, filesReq, stdout, prefix) {
match = match.substr(2 + (prefix ? prefix.length+1 : 0), match.length - 4 - (prefix ? prefix.length+1 : 0));
if(match === "stdout")
return stdout;
return filesReq("./" + match);
return fs.readFileSync(path.join(baseDir, match), "utf-8");
}).replace(cwd, ".");
}

View File

@ -25,52 +25,58 @@ onmessage = function(event) {
# js/output.js
``` javascript
/******/(function(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId](module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function(chunkId, callback) {
/******/ callback(require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/})
/******/({c:"",
/******/0: function(module, exports, require) {
/******/ (function webpackBootstrap(modules) {
/******/ var installedModules = {};
/******/ function require(moduleId) {
/******/ if(typeof moduleId !== "number") throw new Error("Cannot find module '"+moduleId+"'");
/******/ if(installedModules[moduleId])
/******/ return installedModules[moduleId].exports;
/******/ var module = installedModules[moduleId] = {
/******/ exports: {},
/******/ id: moduleId,
/******/ loaded: false
/******/ };
/******/ modules[moduleId].call(null, module, module.exports, require);
/******/ module.loaded = true;
/******/ return module.exports;
/******/ }
/******/ require.e = function requireEnsure(chunkId, callback) {
/******/ callback.call(null, require);
/******/ };
/******/ require.modules = modules;
/******/ require.cache = installedModules;
/******/ return require(0);
/******/ })({
/******/ c: "",
/**! .\example.js !**/
/***/ 0:
/*!********************!*\
!*** ./example.js ***!
\********************/
/***/ function(module, exports, require) {
var Worker = require(/*! worker!./worker */1);
var worker = new Worker;
worker.postMessage("b");
worker.onmessage = function(event) {
var templateB = event.data; // "This text was generated by template B"
}
var Worker = require(/*! worker!./worker */ 1);
var worker = new Worker;
worker.postMessage("b");
worker.onmessage = function(event) {
var templateB = event.data; // "This text was generated by template B"
}
/******/},
/******/
/******/1: function(module, exports, require) {
/***/ },
/**! (webpack)\~\worker-loader!.\worker.js !**/
/***/ 1:
/*!*************************************************************************************************************!*\
!*** C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js ***!
\*************************************************************************************************************/
/***/ function(module, exports, require) {
module.exports = function() {
return new Worker((require.modules.c||'') + "hash.worker.js");
}
module.exports = function() {
return new Worker(require.modules.c + "ee96caf8cd75d7dfea98abc0dabcc23d.worker.js");
};
/***/ }
/******/ })
/******/}
/******/})
```
# js/[hash].worker.js
@ -162,97 +168,43 @@ module.exports = amdRequire;
## Uncompressed
```
Hash: a017658b60f538eb1b15676e358061da
Compile Time: 70ms
Chunks: 1
Modules: 2
Modules including duplicates: 2
Modules first chunk: 2
main output.js: 1318 chars/bytes
1.hash.worker.js: 1110 chars/bytes
hash.worker.js: 2496 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 207 .\example.js
main
1 96 (webpack)\~\worker-loader!.\worker.js
require (1x) from .\example.js
Embedded Stats
.\worker.js
Hash: 5287351eed0ecaf472b73b4bca2c6807
Compile Time: 28ms
Chunks: 2
Modules: 7
Modules including duplicates: 7
Modules first chunk: 3
<id> <size> <filename>
<reason> from <filename>
hash.worker.js
0 206 .\worker.js
main
1 502 (webpack)\buildin\__webpack_amd_require.js
require (1x) from .\worker.js
2 24 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
1.hash.worker.js
3 322 [context] (webpack)\examples\require.context\templates
async context from .\worker.js
4 80 (webpack)\examples\require.context\templates\a.js
async context from .\worker.js
5 80 (webpack)\examples\require.context\templates\b.js
async context from .\worker.js
6 80 (webpack)\examples\require.context\templates\c.js
async context from .\worker.js
Hash: 1cc98da1fc32c4cce0b59747baf7d03e
Time: 72ms
Asset Size Chunks Chunk Names
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1701
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1424
output.js 1774 0 main
chunk {0} output.js (main) 325
[0] ./example.js 201 [built] {0}
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js 124 [not cacheable] [built] {0}
cjs require worker!./worker [0] ./example.js 1:13-39
Child worker:
Hash: ee96caf8cd75d7dfea98abc0dabcc23d
Asset Size Chunks Chunk Names
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1701 0 main
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 1424 1
chunk {0} ee96caf8cd75d7dfea98abc0dabcc23d.worker.js (main) 162
chunk {1} [i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 457 {0}
```
## Minimized (uglify-js, no zip)
```
Hash: b00ed9ef0ffbad2cdb698fc88413d6c7
Compile Time: 310ms
Chunks: 1
Modules: 2
Modules including duplicates: 2
Modules first chunk: 2
main output.js: 468 chars/bytes
1.hash.worker.js: 456 chars/bytes
hash.worker.js: 804 chars/bytes
<id> <size> <filename>
<reason> from <filename>
output.js
0 101 .\example.js
main
1 87 (webpack)\~\worker-loader!.\worker.js
require (1x) from .\example.js
Embedded Stats
.\worker.js
Hash: 59734387e963771414968c9e4f9bcbeb
Compile Time: 233ms
Chunks: 2
Modules: 7
Modules including duplicates: 7
Modules first chunk: 3
<id> <size> <filename>
<reason> from <filename>
hash.worker.js
0 115 .\worker.js
main
1 271 (webpack)\buildin\__webpack_amd_require.js
require (1x) from .\worker.js
2 0 (webpack)\buildin\__webpack_options_amd.loader.js!(webpack)\buildin\__webpack_options_amd.loader.js
require (1x) from (webpack)\buildin\__webpack_amd_require.js
1.hash.worker.js
3 213 [context] (webpack)\examples\require.context\templates
async context from .\worker.js
4 73 (webpack)\examples\require.context\templates\a.js
async context from .\worker.js
5 73 (webpack)\examples\require.context\templates\b.js
async context from .\worker.js
6 73 (webpack)\examples\require.context\templates\c.js
async context from .\worker.js
Hash: 1cc98da1fc32c4cce0b59747baf7d03e
Time: 168ms
Asset Size Chunks Chunk Names
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 586
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 492
output.js 510 0 main
chunk {0} output.js (main) 325
[0] ./example.js 201 [built] {0}
[1] C:/Documents and Settings/kopperts/My Documents/repos/webpack-development/~/worker-loader!./worker.js 124 [not cacheable] [built] {0}
cjs require worker!./worker [0] ./example.js 1:13-39
Child worker:
Hash: ee96caf8cd75d7dfea98abc0dabcc23d
Asset Size Chunks Chunk Names
ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 586 0 main
[i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 492 1
chunk {0} ee96caf8cd75d7dfea98abc0dabcc23d.worker.js (main) 162
chunk {1} [i].ee96caf8cd75d7dfea98abc0dabcc23d.worker.js 457 {0}
```

34
lib/APIPlugin.js Normal file
View File

@ -0,0 +1,34 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ConstDependency = require("./dependencies/ConstDependency");
function APIPlugin() {
}
module.exports = APIPlugin;
var REPLACEMENTS = {
__webpack_public_path__: "require.modules.c",
__webpack_require__: "require",
__webpack_modules__: "require.modules",
__webpack_chunk_load__: "require.e",
};
var IGNORES = [
"call require.valueOf",
];
APIPlugin.prototype.apply = function(compiler) {
Object.keys(REPLACEMENTS).forEach(function(key) {
compiler.parser.plugin("expression "+key, function(expr) {
var dep = new ConstDependency(REPLACEMENTS[key], expr.range);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
});
});
IGNORES.forEach(function(key) {
compiler.parser.plugin(key, function(expr) {
return true;
});
});
};

22
lib/AbstractPlugin.js Normal file
View File

@ -0,0 +1,22 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function AbstractPlugin(plugins) {
this._plugins = plugins || {};
}
module.exports = AbstractPlugin;
AbstractPlugin.create = function(plugins) {
function Plugin() {
AbstractPlugin.call(this, plugins)
}
Plugin.prototype = Object.create(AbstractPlugin.prototype);
return Plugin;
}
AbstractPlugin.prototype.apply = function(object) {
for(var name in this._plugins) {
object.plugin(name, this._plugins[name]);
}
};

50
lib/ArrayMap.js Normal file
View File

@ -0,0 +1,50 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function ArrayMap() {
this.keys = [];
this.values = [];
}
module.exports = ArrayMap;
ArrayMap.prototype.get = function(key) {
for(var i = 0; i < this.keys.length; i++) {
if(this.keys[i] === key) {
return this.values[i];
}
}
return;
};
ArrayMap.prototype.set = function(key, value) {
for(var i = 0; i < this.keys.length; i++) {
if(this.keys[i] === key) {
this.values[i] = value;
return this;
}
}
this.keys.push(key);
this.values.push(value);
return this;
};
ArrayMap.prototype.remove = function(key, value) {
for(var i = 0; i < this.keys.length; i++) {
if(this.keys[i] === key) {
this.keys.splice(i, 1);
this.values.splice(i, 1);
return true;
}
}
return false;
};
ArrayMap.prototype.clone = function() {
var newMap = new ArrayMap();
for(var i = 0; i < this.keys.length; i++) {
newMap.keys.push(this.keys[i]);
newMap.values.push(this.values[i]);
}
return newMap;
}

View File

@ -0,0 +1,24 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var DependenciesBlock = require("./DependenciesBlock");
function AsyncDependenciesBlock(name) {
DependenciesBlock.call(this);
this.name = name;
this.chunk = null;
}
module.exports = AsyncDependenciesBlock;
AsyncDependenciesBlock.prototype = Object.create(DependenciesBlock.prototype);
AsyncDependenciesBlock.prototype.updateHash = function updateHash(hash) {
hash.update(this.name || "");
DependenciesBlock.prototype.updateHash.call(this, hash);
};
AsyncDependenciesBlock.prototype.disconnect = function() {
this.chunk = null;
DependenciesBlock.prototype.disconnect.call(this);
};

View File

@ -0,0 +1,96 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function BasicEvaluatedExpression() {
this.range = null;
}
module.exports = BasicEvaluatedExpression;
BasicEvaluatedExpression.prototype.isString = function() {
return Object.prototype.hasOwnProperty.call(this, "string");
};
BasicEvaluatedExpression.prototype.isNumber = function() {
return Object.prototype.hasOwnProperty.call(this, "number");
};
BasicEvaluatedExpression.prototype.isBoolean = function() {
return Object.prototype.hasOwnProperty.call(this, "bool");
};
BasicEvaluatedExpression.prototype.isRegExp = function() {
return Object.prototype.hasOwnProperty.call(this, "regExp");
};
BasicEvaluatedExpression.prototype.isConditional = function() {
return Object.prototype.hasOwnProperty.call(this, "options");
};
BasicEvaluatedExpression.prototype.isArray = function() {
return Object.prototype.hasOwnProperty.call(this, "items");
};
BasicEvaluatedExpression.prototype.isWrapped = function() {
return Object.prototype.hasOwnProperty.call(this, "prefix");
};
BasicEvaluatedExpression.prototype.setString = function(str) {
if(str === null)
delete this.string;
else
this.string = str;
return this;
};
BasicEvaluatedExpression.prototype.setNumber = function(num) {
if(num === null)
delete this.number;
else
this.number = num;
return this;
};
BasicEvaluatedExpression.prototype.setBoolean = function(bool) {
if(bool === null)
delete this.bool;
else
this.bool = bool;
return this;
};
BasicEvaluatedExpression.prototype.setRegExp = function(regExp) {
if(regExp === null)
delete this.regExp;
else
this.regExp = regExp;
return this;
};
BasicEvaluatedExpression.prototype.setWrapped = function(prefix, postfix) {
this.prefix = prefix;
this.postfix = postfix;
return this;
};
BasicEvaluatedExpression.prototype.unsetWrapped = function() {
delete this.prefix;
delete this.postfix;
return this;
};
BasicEvaluatedExpression.prototype.setOptions = function(options) {
if(options === null)
delete this.options;
else
this.options = options;
return this;
};
BasicEvaluatedExpression.prototype.setItems = function(items) {
if(items === null)
delete this.items;
else
this.items = items;
return this;
};
BasicEvaluatedExpression.prototype.addOptions = function(options) {
if(!this.options) this.options = [];
options.forEach(function(item) {
this.options.push(item);
}, this);
return this;
};
BasicEvaluatedExpression.prototype.setRange = function(range) {
this.range = range;
return this;
};

34
lib/CachePlugin.js Normal file
View File

@ -0,0 +1,34 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var async = require("async");
function CachePlugin(cache) {
this.cache = cache || {};
}
module.exports = CachePlugin;
CachePlugin.prototype.apply = function(compiler) {
compiler.plugin("compilation", function(compilation) {
compilation.cache = this.cache;
}.bind(this));
compiler.plugin("run", function(compiler, callback) {
if(!compiler._lastCompilationFileDependencies) return callback();
var fs = compiler.inputFileSystem;
fileTs = compiler.fileTimestamps = {};
async.forEach(compiler._lastCompilationFileDependencies, function(file, callback) {
fs.stat(file, function(err, stat) {
if(err) return callback(err);
fileTs[file] = stat.mtime || Infinity;
callback();
});
}, callback);
}.bind(this));
compiler.plugin("after-compile", function(compilation, callback) {
compilation.compiler._lastCompilationFileDependencies = compilation.fileDependencies;
compilation.compiler._lastCompilationContextDependencies = compilation.contextDependencies;
callback();
}.bind(this));
};

136
lib/Chunk.js Normal file
View File

@ -0,0 +1,136 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function Chunk(name) {
this.id = null;
this.name = name;
this.modules = [];
this.chunks = [];
this.parents = [];
this.blocks = [];
}
module.exports = Chunk;
Chunk.prototype.addModule = function(module) {
if(this.modules.indexOf(module) >= 0) return false;
this.modules.push(module);
return true;
};
Chunk.prototype.removeModule = function(module) {
var idx = this.modules.indexOf(module);
if(idx >= 0) {
this.modules.splice(idx, 1);
module.removeChunk(this);
}
};
Chunk.prototype.addChunk = function(chunk) {
if(this.chunks.indexOf(chunk) >= 0) return false;
this.chunks.push(chunk);
return true;
};
Chunk.prototype.removeChunk = function(chunk) {
var idx = this.chunks.indexOf(chunk);
if(idx >= 0) {
this.chunks.splice(idx, 1);
chunk.removeParent(this);
}
};
Chunk.prototype.addParent = function(chunk) {
if(this.parents.indexOf(chunk) >= 0) return false;
this.parents.push(chunk);
return true;
};
Chunk.prototype.removeParent = function(chunk) {
var idx = this.parents.indexOf(chunk);
if(idx >= 0) {
this.parents.splice(idx, 1);
chunk.removeChunk(this);
}
};
Chunk.prototype.addBlock = function(block) {
if(this.blocks.indexOf(block) >= 0) return false;
this.blocks.push(block);
return true;
};
Chunk.prototype.remove = function(reason) {
// console.log("remove " + this.toString());
this.modules.slice().forEach(function(m) {
m.removeChunk(this);
}, this);
this.parents.forEach(function(c) {
var idx = c.chunks.indexOf(this);
if(idx >= 0)
c.chunks.splice(idx, 1);
this.chunks.forEach(function(cc) {
cc.addParent(c);
});
}, this);
this.chunks.forEach(function(c) {
var idx = c.parents.indexOf(this);
if(idx >= 0)
c.parents.splice(idx, 1);
this.parents.forEach(function(cc) {
cc.addChunk(c);
});
}, this);
this.blocks.forEach(function(b) {
b.chunk = null;
b.chunkReason = reason;
}, this);
};
Chunk.prototype.integrate = function(other, reason) {
// console.log("integrate " + other.toString() + " into " + this.toString());
var otherModules = other.modules.slice();
otherModules.forEach(function(m) {
m.removeChunk(other);
m.addChunk(this);
this.addModule(m);
}, this);
other.modules.length = 0;
other.parents.forEach(function(c) {
var idx = c.chunks.indexOf(other);
if(idx >= 0)
c.chunks.splice(idx, 1);
if(c !== this && this.addParent(c))
c.addChunk(this);
}, this);
other.parents.length = 0;
other.chunks.forEach(function(c) {
var idx = c.parents.indexOf(other);
if(idx >= 0)
c.parents.splice(idx, 1);
if(c !== this && this.addChunk(c))
c.addParent(this);
}, this);
other.chunks.length = 0;
other.blocks.forEach(function(b) {
b.chunk = this;
b.chunkReason = reason;
this.addBlock(b);
}, this);
other.blocks.length = 0;
};
Chunk.prototype.isEmpty = function() {
return (this.modules.length == 0);
};
Chunk.prototype.updateHash = function(hash) {
hash.update(this.id + "");
this.modules.forEach(function(m) {
m.updateHash(hash);
});
};
Chunk.prototype.toString = function() {
return "Chunk[" + this.modules.join() + "]";
};

View File

@ -0,0 +1,20 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var WrapSource = require("./WrapSource");
var RawSource = require("webpack-core/lib/RawSource");
function CommonJsMainTemplateDecorator(mainTemplate) {
this.mainTemplate = mainTemplate;
}
module.exports = CommonJsMainTemplateDecorator;
CommonJsMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates);
var prefix = "module.exports =\n";
return new WrapSource(new RawSource(prefix), source, new RawSource(""));
};
CommonJsMainTemplateDecorator.prototype.updateHash = function(hash) {
hash.update("common-js");
this.mainTemplate.updateHash(hash);
};

View File

@ -0,0 +1,19 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var path = require("path");
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
function CompatibilityPlugin() {
}
module.exports = CompatibilityPlugin;
CompatibilityPlugin.prototype.apply = function(compiler) {
compiler.resolvers.normal.apply(
new ModuleAliasPlugin({
"enhanced-require": path.join(__dirname, "..", "buildin", "return-require.js")
})
);
};

490
lib/Compilation.js Normal file
View File

@ -0,0 +1,490 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var async = require("async");
var Tapable = require("tapable");
var Parser = require("./Parser");
var Dependency = require("./Dependency");
var EntryModuleNotFoundError = require("./EntryModuleNotFoundError");
var ModuleNotFoundError = require("./ModuleNotFoundError");
var Module = require("./Module");
var ArrayMap = require("./ArrayMap");
var Chunk = require("./Chunk");
var Stats = require("./Stats");
function Compilation(compiler) {
Tapable.call(this);
this.compiler = compiler;
this.mainTemplate = compiler.mainTemplate;
this.chunkTemplate = compiler.chunkTemplate;
this.moduleTemplate = compiler.moduleTemplate;
this.options = compiler.options;
this.resolvers = compiler.resolvers;
this.inputFileSystem = compiler.inputFileSystem;
var options = compiler.options;
this.outputOptions = options && options.output;
this.bail = options && options.bail;
this.entries = [];
this.chunks = [];
this.namedChunks = {};
this.modules = [];
this._modules = {};
this.cache = null;
this.assets = {};
this.errors = [];
this.warnings = [];
this.children = [];
this.dependencyFactories = new ArrayMap();
this.dependencyTemplates = new ArrayMap();
}
module.exports = Compilation;
Compilation.prototype = Object.create(Tapable.prototype);
Compilation.prototype.addModule = function(module) {
var identifier = module.identifier();
if(this._modules[identifier]) return false;
if(this.cache && this.cache[identifier]) {
var cacheModule = this.cache[identifier];
var rebuild = true;
if(!cacheModule.error && cacheModule.cacheable && this.fileTimestamps && this.contextTimestamps) {
rebuild = cacheModule.needRebuild(this.fileTimestamps, this.contextTimestamps);
}
if(!rebuild) {
cacheModule.disconnect();
this._modules[identifier] = cacheModule;
this.modules.push(cacheModule);
return cacheModule;
}
}
this._modules[identifier] = module;
if(this.cache) this.cache[identifier] = module;
this.modules.push(module);
return true;
};
Compilation.prototype.getModule = function(module) {
var identifier = module.identifier();
return this._modules[identifier];
};
Compilation.prototype.buildModule = function(module, callback) {
this.applyPlugins("build-module", module);
module.build(this.options, this, this.resolvers.normal, this.inputFileSystem, function(err) {
if(err) {
this.applyPlugins("failed-module", module);
return callback(err);
}
this.applyPlugins("succeed-module", module);
return callback();
}.bind(this));
};
Compilation.prototype.processModuleDependencies = function(module, callback) {
var errorAndCallback = this.bail ? function errorAndCallback(err) {
callback(err);
} : function errorAndCallback(err) {
this.errors.push(err);
callback();
}.bind(this);
var dependencies = [];
function addDependency(dep) {
for(var i = 0; i < dependencies.length; i++) {
if(dep.isEqualResource(dependencies[i][0]))
return dependencies[i].push(dep);
}
dependencies.push([dep]);
}
function addDependenciesBlock(block) {
block.dependencies.forEach(addDependency);
block.blocks.forEach(addDependenciesBlock);
block.variables.forEach(function(v) {
v.dependencies.forEach(addDependency);
});
}
addDependenciesBlock(module);
var factories = [];
for(var i = 0; i < dependencies.length; i++) {
var factory = this.dependencyFactories.get(dependencies[i][0].Class);
if(!factory)
return callback(new Error("No module factory availible for dependency type: " + dependencies[i][0].Class.name));
factories[i] = [factory, dependencies[i]];
}
async.forEach(factories, function(item, callback) {
var dependencies = item[1];
var errorAndCallback = function errorAndCallback(err) {
err.dependencies = dependencies;
err.origin = module;
this.errors.push(err);
callback();
}.bind(this);
var warningAndCallback = function warningAndCallback(err) {
err.dependencies = dependencies;
err.origin = module;
this.warnings.push(err);
callback();
}.bind(this);
var factory = item[0];
factory.create(module.context, dependencies[0], function(err, dependantModule) {
function isOptional() {
return dependencies.filter(function(d) { return !d.optional }).length > 0;
}
function errorOrWarningAndCallback(err) {
if(isOptional())
return errorAndCallback(err);
else
return warningAndCallback(err);
}
if(err) return errorOrWarningAndCallback(new ModuleNotFoundError(module, err));
if(!dependantModule) return callback();
var newModule = this.addModule(dependantModule);
if(!newModule) {
dependantModule = this.getModule(dependantModule);
dependencies.forEach(function(dep) {
dep.module = dependantModule;
dependantModule.addReason(module, dep);
});
return callback();
}
if(newModule instanceof Module) { // from cache
dependantModule = newModule;
dependencies.forEach(function(dep) {
dep.module = dependantModule;
dependantModule.addReason(module, dep);
});
return this.processModuleDependencies(dependantModule, callback);
}
this.buildModule(dependantModule, function(err) {
if(err) return errorOrWarningAndCallback(err);
dependencies.forEach(function(dep) {
dep.module = dependantModule;
dependantModule.addReason(module, dep);
});
this.processModuleDependencies(dependantModule, callback);
}.bind(this));
}.bind(this));
}.bind(this), function(err) {
if(err) callback(err);
return callback();
});
};
Compilation.prototype.addEntry = function process(context, entry, name, callback) {
var errorAndCallback = this.bail ? function errorAndCallback(err) {
callback(err);
} : function errorAndCallback(err) {
err.dependencies = [entry];
this.errors.push(err);
callback();
}.bind(this);
if(!(entry instanceof Dependency))
return callback(new Error("Parameter 'entry' must be a Dependency"));
var moduleFactory = this.dependencyFactories.get(entry.Class);
if(!moduleFactory)
return callback(new Error("No dependency factory availible for this entry dependency type: " + entry.Class.name));
moduleFactory.create(context, entry, function(err, module) {
if(err) return errorAndCallback(new EntryModuleNotFoundError(err));
var result = this.addModule(module);
if(!result) {
return callback(new Error("Entry module is already added"));
}
if(result instanceof Module) {
module = result;
}
this.entries.push(module);
module.id = 0;
if(result instanceof Module) {
entryReady.call(this);
} else {
this.buildModule(module, function(err) {
if(err) return errorAndCallback(err);
entryReady.call(this);
}.bind(this));
}
function entryReady() {
this.processModuleDependencies(module, function(err) {
if(err) return callback(err);
var chunk = this.addChunk(name);
chunk.id = 0;
chunk.entry = true;
chunk.addModule(module);
module.addChunk(chunk);
this.processDependenciesBlockForChunk(module, chunk);
return callback();
}.bind(this));
}
}.bind(this));
};
Compilation.prototype.seal = function seal(callback) {
this.applyPlugins("seal");
this.applyPlugins("optimize");
this.applyPlugins("optimize-modules", this.modules);
this.applyPlugins("after-optimize-modules", this.modules);
this.applyPlugins("optimize-chunks", this.chunks);
this.applyPlugins("after-optimize-chunks", this.chunks);
this.applyModuleIds();
this.applyChunkIds();
this.sortItems();
this.createChunkAssets();
this.summarizeDependencies();
this.applyPluginsAsync("optimize-chunk-assets", this.chunks, function(err) {
if(err) return callback(err);
this.applyPluginsAsync("optimize-assets", this.assets, function(err) {
if(err) return callback(err);
this.applyPlugins("after-optimize-assets", this.assets);
return callback();
}.bind(this));
}.bind(this));
};
Compilation.prototype.addChunk = function addChunk(name) {
if(name) {
if(Object.prototype.hasOwnProperty(this.namedChunks, name))
return this.namedChunks[name];
}
var chunk = new Chunk(name);
this.chunks.push(chunk);
if(name) {
this.namedChunks[name] = chunk;
}
return chunk;
};
Compilation.prototype.processDependenciesBlockForChunk = function processDependenciesBlockForChunk(block, chunk) {
block.blocks.forEach(function(b) {
var c;
if(!b.chunk) {
c = this.addChunk(b.chunkName);
b.chunk = c;
c.addBlock(b);
} else {
c = b.chunk;
}
chunk.addChunk(c);
c.addParent(chunk);
this.processDependenciesBlockForChunk(b, c);
}, this);
function iteratorDependency(d) {
if(!d.module) return;
if(d.module.error) {
d.module = null;
return;
}
if(chunk.addModule(d.module)) {
d.module.addChunk(chunk);
this.processDependenciesBlockForChunk(d.module, chunk);
}
}
block.dependencies.forEach(iteratorDependency, this);
block.variables.forEach(function(v) {
v.dependencies.forEach(iteratorDependency, this);
}, this);
};
Compilation.prototype.applyModuleIds = function applyModuleIds() {
var i = 0;
function entryChunks(m) {
return m.chunks.filter(function(c) {
return c.entry;
}).length;
}
function occursInEntry(m) {
return m.reasons.map(function(r) {
if(!r.module) return 0;
return entryChunks(r.module);
}).reduce(function(a, b) { return a+b; }, 0) + entryChunks(m);
}
function occurs(m) {
return m.reasons.map(function(r) {
if(!r.module) return 0;
return r.module.chunks.length;
}).reduce(function(a, b) { return a+b; }, 0) + m.chunks.length;
}
this.modules.sort(function(a, b) {
var aEntryOccurs = occursInEntry(a);
var bEntryOccurs = occursInEntry(b);
if(aEntryOccurs > bEntryOccurs) return -1;
if(aEntryOccurs < bEntryOccurs) return 1;
var aOccurs = occurs(a);
var bOccurs = occurs(b);
if(aOccurs > bOccurs) return -1;
if(aOccurs < bOccurs) return 1;
if(a.identifier() > b.identifier()) return 1;
if(a.identifier() < b.identifier()) return -1;
return 0;
});
this.modules.forEach(function(module) {
if(module.id === null)
module.id = ++i;
});
};
Compilation.prototype.applyChunkIds = function applyChunkIds() {
var i = 0;
function occursInEntry(c) {
return c.parents.filter(function(p) {
return p.entry;
}).length;
}
function occurs(c) {
return c.blocks.length;
}
this.chunks.forEach(function(c) {
c.modules.sort(function(a, b) {
if(a.identifier() > b.identifier()) return 1;
if(a.identifier() < b.identifier()) return -1;
return 0;
});
});
this.chunks.sort(function(a, b) {
var aEntryOccurs = occursInEntry(a);
var bEntryOccurs = occursInEntry(b);
if(aEntryOccurs > bEntryOccurs) return -1;
if(aEntryOccurs < bEntryOccurs) return 1;
var aOccurs = occurs(a);
var bOccurs = occurs(b);
if(aOccurs > bOccurs) return -1;
if(aOccurs < bOccurs) return 1;
if(a.modules.length > b.modules.length) return -1;
if(a.modules.length < b.modules.length) return 1;
for(var i = 0; i < a.modules.length; i++) {
if(a.modules[i].identifier() > b.modules[i].identifier()) return -1;
if(a.modules[i].identifier() < b.modules[i].identifier()) return 1;
}
return 0;
});
this.chunks.forEach(function(chunk) {
if(chunk.id === null)
chunk.id = ++i;
});
};
Compilation.prototype.sortItems = function sortItems() {
function byId(a, b) {
return a.id - b.id;
}
this.chunks.sort(byId);
this.modules.sort(byId);
this.modules.forEach(function(module) {
module.chunks.sort(byId);
});
this.chunks.forEach(function(chunk) {
chunk.modules.sort(byId);
});
};
Compilation.prototype.summarizeDependencies = function summarizeDependencies() {
function filterDups(array) {
var newArray = [];
for(var i = 0; i < array.length; i++) {
if(i == 0 || array[i-1] != array[i])
newArray.push(array[i]);
}
return newArray;
}
this.fileDependencies = [];
this.contextDependencies = [];
this.children.forEach(function(child) {
this.fileDependencies = this.fileDependencies.concat(child.fileDependencies);
this.contextDependencies = this.contextDependencies.concat(child.contextDependencies);
}.bind(this));
this.modules.forEach(function(module) {
if(module.fileDependencies) {
module.fileDependencies.forEach(function(item) {
this.fileDependencies.push(item);
}, this);
}
if(module.contextDependencies) {
module.contextDependencies.forEach(function(item) {
this.contextDependencies.push(item);
}, this);
}
}, this);
this.fileDependencies.sort();
this.fileDependencies = filterDups(this.fileDependencies);
this.contextDependencies.sort();
this.contextDependencies = filterDups(this.contextDependencies);
};
var REGEXP_ID = /\[id\]/g;
var REGEXP_NAME = /\[name\]/g;
var REGEXP_HASH = /\[hash\]/g;
Compilation.prototype.createChunkAssets = function createChunkAssets() {
var outputOptions = this.outputOptions || {};
var filename = outputOptions.filename || "bundle.js";
var chunkFilename = outputOptions.chunkFilename || "[id]." + filename.replace(REGEXP_NAME, "");
var namedChunkFilename = outputOptions.namedChunkFilename || null;
var hash = new (require("crypto").Hash)("md5");
this.mainTemplate.updateHash(hash);
this.chunkTemplate.updateHash(hash);
this.moduleTemplate.updateHash(hash);
var i, chunk;
for(i = 0; i < this.modules.length; i++) {
var module = this.modules[i];
if(module.assets) {
Object.keys(module.assets).forEach(function(name) {
this.assets[name] = module.assets[name];
}, this);
}
}
for(i = 0; i < this.chunks.length; i++) {
var chunk = this.chunks[i];
chunk.updateHash(hash);
}
this.hash = hash = hash.digest("hex");
for(i = 0; i < this.chunks.length; i++) {
chunk = this.chunks[i];
chunk.files = [];
var source;
var file;
if(chunk.entry) {
source = this.mainTemplate.render(hash, chunk, this.moduleTemplate, this.dependencyTemplates);
this.assets[file = filename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id).replace(REGEXP_NAME, chunk.name || "")] = source;
chunk.files.push(file);
} else {
source = this.chunkTemplate.render(chunk, this.moduleTemplate, this.dependencyTemplates);
this.assets[file = chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id)] = source;
chunk.files.push(file);
}
if(namedChunkFilename && chunk.name) {
this.assets[file = namedChunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_ID, chunk.id).replace(REGEXP_NAME, chunk.name || "")] = source;
chunk.files.push(file);
}
}
};
Compilation.prototype.getStats = function() {
return new Stats(this);
};
Compilation.prototype.createChildCompiler = function(name, outputOptions) {
return this.compiler.createChildCompiler(this, name, outputOptions);
};

282
lib/Compiler.js Normal file
View File

@ -0,0 +1,282 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var clone = require("clone");
var Tapable = require("tapable");
var Cache = require("./Cache");
var Compilation = require("./Compilation");
var Parser = require("./Parser");
var Resolver = require("enhanced-resolve/lib/Resolver");
var NormalModuleFactory = require("./NormalModuleFactory");
var ContextModuleFactory = require("./ContextModuleFactory");
var NullFactory = require("./NullFactory");
var ModuleDependency = require("./dependencies/ModuleDependency");
var SingleEntryDependency = require("./dependencies/SingleEntryDependency");
var CommonJsRequireDependency = require("./dependencies/CommonJsRequireDependency");
var RequireResolveDependency = require("./dependencies/RequireResolveDependency");
var RequireResolveHeaderDependency = require("./dependencies/RequireResolveHeaderDependency");
var RequireEnsureDependency = require("./dependencies/RequireEnsureDependency");
var RequireEnsureItemDependency = require("./dependencies/RequireEnsureItemDependency");
function Watching(compiler, handler, watchDelay) {
this.startTime = null;
this.running = false;
this.invalid = false;
this.error = null;
this.stats = null;
this.handler = handler;
this.watchDelay = watchDelay;
this.compiler = compiler;
this._go();
}
Watching.prototype._go = function() {
this.startTime = new Date().getTime();
this.running = true;
this.invalid = false;
this.compiler.applyPluginsAsync("watch-run", this, function(err) {
this.compiler.compile(function(err, compilation) {
if(err) return this._done(err);
if(this.invalid) return this._done();
this.compiler.emitAssets(compilation, function(err) {
if(err) return this._done(err);
return this._done(null, compilation);
}.bind(this));
}.bind(this));
}.bind(this));
};
Watching.prototype._done = function(err, compilation) {
this.running = false;
if(this.invalid) return this._go();
this.error = err || null;
this.stats = compilation ? compilation.getStats() : null;
if(this.stats) {
this.stats.startTime = this.startTime;
this.stats.endTime = new Date().getTime();
}
if(this.stats)
this.compiler.applyPlugins("done", this.stats);
else
this.compiler.applyPlugins("failed", this.error);
this.handler(this.error, this.stats);
if(!this.error)
this.watch(compilation.fileDependencies, compilation.contextDependencies);
};
Watching.prototype.watch = function(files, dirs) {
this.watcher = this.compiler.watchFileSystem.watch(files, dirs, this.startTime, this.watchDelay, function(err, modified, fileTimestamps, contextTimestamps) {
this.watcher = null;
if(err) return this.handler(err);
this.compiler.fileTimestamps = fileTimestamps;
this.compiler.contextTimestamps = contextTimestamps;
this.invalidate();
}.bind(this), function() {
this.compiler.applyPlugins("invalid");
}.bind(this));
};
Watching.prototype.invalidate = function() {
if(this.watcher) this.watcher.close();
if(this.running) {
this.invalid = true;
return false;
} else {
this._go();
}
};
function Compiler() {
Tapable.call(this);
this.mainTemplate = this.chunkTemplate = this.moduleTemplate = null;
this.outputPath = "";
this.outputFileSystem = null;
this.inputFileSystem = null;
this.separateExecutor = null;
this.fileTimestamps = {};
this.contextTimestamps = {};
this.resolvers = {
normal: new Resolver(null),
loader: new Resolver(null),
context: new Resolver(null)
};
this.parser = new Parser();
this.options = {};
}
module.exports = Compiler;
Compiler.prototype = Object.create(Tapable.prototype);
Compiler.Watching = Watching;
Compiler.prototype.watch = function(watchDelay, handler) {
this.fileTimestamps = {};
this.contextTimestamps = {};
var watching = new Watching(this, handler, watchDelay || 0);
return watching;
};
Compiler.prototype.run = function(callback) {
var startTime = new Date().getTime();
this.applyPluginsAsync("run", this, function(err) {
if(err) return callback(err);
this.compile(function(err, compilation) {
if(err) return callback(err);
this.emitAssets(compilation, function(err) {
if(err) return callback(err);
var stats = compilation.getStats();
stats.startTime = startTime;
stats.endTime = new Date().getTime();
this.applyPlugins("done", stats);
return callback(null, stats);
}.bind(this));
}.bind(this));
}.bind(this));
};
Compiler.prototype.runAsChild = function(callback) {
this.compile(function(err, compilation) {
if(err) return callback(err);
this.parentCompilation.children.push(compilation);
Object.keys(compilation.assets).forEach(function(name) {
this.parentCompilation.assets[name] = compilation.assets[name];
}.bind(this));
var entries = compilation.chunks.filter(function(chunk) {
return chunk.entry;
});
return callback(null, entries, compilation);
}.bind(this));
};
Compiler.prototype.emitAssets = function(compilation, callback) {
this.applyPluginsAsync("emit", compilation, function(err) {
this.outputFileSystem.mkdirp(this.outputPath, emitFiles.bind(this));
}.bind(this));
function emitFiles(err) {
if(err) return callback(err);
require("async").forEach(Object.keys(compilation.assets), function(file, callback) {
if(file.indexOf("/")) {
var idx = file.lastIndexOf("/");
var dir = file.substr(0, idx);
this.outputFileSystem.mkdirp(this.outputFileSystem.join(this.outputPath, dir), writeOut.bind(this));
} else writeOut.call(this);
function writeOut(err) {
if(err) return callback(err);
var content = compilation.assets[file].source();
if(!Buffer.isBuffer(content))
content = new Buffer(content, "utf-8");
this.outputFileSystem.writeFile(this.outputFileSystem.join(this.outputPath, file), content, callback);
};
}.bind(this), function(err) {
if(err) return callback(err);
afterEmit.call(this);
}.bind(this));
}
function afterEmit() {
this.applyPluginsAsync("after-emit", compilation, function(err) {
if(err) return callback(err);
return callback();
});
}
};
Compiler.prototype.createChildCompiler = function(compilation, compilerName, outputOptions) {
var childCompiler = new Compiler();
for(var name in this._plugins) {
if(["make", "compile", "emit", "after-emit", "done"].indexOf(name) < 0)
childCompiler._plugins[name] = this._plugins[name].slice();
}
childCompiler.name = compilerName;
childCompiler.mainTemplate = this.mainTemplate;
childCompiler.chunkTemplate = this.chunkTemplate;
childCompiler.moduleTemplate = this.moduleTemplate;
childCompiler.outputPath = this.outputPath;
childCompiler.inputFileSystem = this.inputFileSystem;
childCompiler.outputFileSystem = null;
childCompiler.resolvers = this.resolvers;
childCompiler.parser = this.parser;
childCompiler.fileTimestamps = this.fileTimestamps;
childCompiler.contextTimestamps = this.contextTimestamps;
childCompiler.options = clone(this.options);
for(var name in outputOptions) {
childCompiler.options.output[name] = outputOptions[name];
}
childCompiler.parentCompilation = compilation;
return childCompiler;
};
Compiler.prototype.createCompilation = function() {
return new Compilation(this);
};
Compiler.prototype.newCompilation = function(params) {
var compilation = this.createCompilation();
compilation.fileTimestamps = this.fileTimestamps;
compilation.contextTimestamps = this.contextTimestamps;
compilation.name = this.name;
this.applyPlugins("compilation", compilation, params);
return compilation;
};
Compiler.prototype.createNormalModuleFactory = function() {
var normalModuleFactory = new NormalModuleFactory(this.resolvers, this.parser, this.options.module || {});
this.applyPlugins("normal-module-factory", normalModuleFactory);
return normalModuleFactory;
};
Compiler.prototype.createContextModuleFactory = function() {
var contextModuleFactory = new ContextModuleFactory(this.resolvers, this.inputFileSystem);
this.applyPlugins("context-module-factory", contextModuleFactory);
return contextModuleFactory;
};
Compiler.prototype.newCompilationParams = function() {
var params = {
normalModuleFactory: this.createNormalModuleFactory(),
contextModuleFactory: this.createContextModuleFactory()
};
return params;
}
Compiler.prototype.compile = function(callback) {
var params = this.newCompilationParams();
this.applyPlugins("compile", params);
var compilation = this.newCompilation(params);
this.applyPluginsAsync("make", compilation, function(err) {
compilation.seal(function(err) {
if(err) return callback(err);
this.applyPluginsAsync("after-compile", compilation, function(err) {
if(err) return callback(err);
return callback(null, compilation);
});
}.bind(this));
}.bind(this));
};

26
lib/ConsolePlugin.js Normal file
View File

@ -0,0 +1,26 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var path = require("path");
function ConsolePlugin() {
}
module.exports = ConsolePlugin;
ConsolePlugin.prototype.apply = function(compiler) {
function addParsedVariable(name, expression) {
if(!this.state.current.addVariable) return false;
var deps = [];
this.parse(expression, {current: {
addDependency: function(dep) {
deps.push(dep);
}
}});
this.state.current.addVariable(name, expression, deps);
return true;
}
function ignore() { return true; }
compiler.parser.plugin("expression console", function(expr) {
return addParsedVariable.call(this, "console", "require(" + JSON.stringify(path.join(__dirname, "..", "..", "buildin", "console.js")) + ")");
});
};

25
lib/ConstPlugin.js Normal file
View File

@ -0,0 +1,25 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ConstDependency = require("./dependencies/ConstDependency");
var NullFactory = require("./NullFactory");
function ConstPlugin() {
}
module.exports = ConstPlugin;
ConstPlugin.prototype.apply = function(compiler) {
compiler.plugin("compilation", function(compilation, params) {
compilation.dependencyFactories.set(ConstDependency, new NullFactory());
compilation.dependencyTemplates.set(ConstDependency, new ConstDependency.Template());
});
compiler.parser.plugin("statement if", function(statement) {
var param = this.evaluateExpression(statement.test);
if(param.isBoolean()) {
this.state.current.addDependency(new ConstDependency(param.bool + "", param.range));
return param.bool;
}
});
};

94
lib/ContextModule.js Normal file
View File

@ -0,0 +1,94 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Module = require("./Module");
var RawSource = require("webpack-core/lib/RawSource");
function ContextModule(resolveDependencies, context, recursive, regExp, addon) {
Module.call(this);
this.resolveDependencies = resolveDependencies;
this.context = context;
this.recursive = recursive;
this.regExp = regExp;
this.addon = addon;
this.cacheable = true;
this.contextDependencies = [context];
this.built = false;
}
module.exports = ContextModule;
ContextModule.prototype = Object.create(Module.prototype);
ContextModule.prototype.identifier = function() {
var identifier = "";
identifier += this.context + " ";
if(!this.recursive)
identifier += "nonrecursive ";
if(this.addon)
identifier += this.addon;
if(this.regExp)
identifier += this.regExp;
return identifier.replace(/ $/, "");
};
function prettyRegExp(str) {
return str.substring(1, str.length - 1);
}
ContextModule.prototype.readableIdentifier = function(requestShortener) {
var identifier = "";
identifier += requestShortener.shorten(this.context) + " ";
if(!this.recursive)
identifier += "nonrecursive ";
if(this.addon)
identifier += this.addon;
if(this.regExp)
identifier += prettyRegExp(this.regExp + "");
return identifier.replace(/ $/, "");
};
ContextModule.prototype.needRebuild = function(fileTimestamps, contextTimestamps) {
var ts = contextTimestamps[this.context];
if(!ts) return true;
return ts > this.builtTime;
};
ContextModule.prototype.build = function(options, compilation, resolver, fs, callback) {
this.built = true;
this.builtTime = new Date().getTime();
var addon = this.addon;
this.resolveDependencies(fs, this.context, this.recursive, this.regExp, function(err, dependencies) {
if(err) return callback(err);
dependencies.forEach(function(dep) {
dep.userRequest = dep.request;
dep.request = addon + dep.userRequest;
});
this.dependencies = dependencies;
callback();
}.bind(this));
};
ContextModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) {
var map = {};
this.dependencies.forEach(function(dep) {
if(dep.module)
map[dep.userRequest] = dep.module.id
});
var str = [
"var map = ", JSON.stringify(map, null, "\t"), ";\n",
"module.exports = function webpackContext(req) {\n",
"\treturn require(map[req] || (function() { throw new Error(\"Cannot find module \" + req + \".\") }()));\n",
"};\n",
"module.exports.keys = function webpackContextKeys() {\n",
"\treturn Object.keys(map);\n",
"};\n",
];
return new RawSource(str.join(""));
};
ContextModule.prototype.size = function() {
return this.dependencies.map(function(dep) {
return dep.userRequest.length + 5;
}).reduce(function(a, b) { return a+b; }, 160);
};

107
lib/ContextModuleFactory.js Normal file
View File

@ -0,0 +1,107 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var async = require("async");
var path = require("path");
var Tapable = require("tapable");
var ContextModule = require("./ContextModule");
var ContextElementDependency = require("./dependencies/ContextElementDependency");
function ContextModuleFactory(resolvers) {
Tapable.call(this);
this.resolvers = resolvers;
}
module.exports = ContextModuleFactory;
ContextModuleFactory.prototype = Object.create(Tapable.prototype);
ContextModuleFactory.prototype.create = function(context, dependency, callback) {
this.applyPluginsAsyncWaterfall("before-resolve", {
context: context,
request: dependency.request,
recursive: dependency.recursive,
regExp: dependency.regExp
}, function(err, result) {
if(err) return callback(err);
var context = result.context;
var request = result.request;
var recursive = result.recursive;
var regExp = result.regExp;
var loaders, resource;
var idx = request.lastIndexOf("!");
if(idx >= 0) {
loaders = request.substr(0, idx+1);
resource = request.substr(idx+1);
} else {
loaders = "";
resource = request;
}
this.resolvers.context.resolve(context, resource, function(err, resource) {
if(err) return callback(err);
this.applyPluginsAsyncWaterfall("after-resolve", {
loaders: loaders,
resource: resource,
recursive: recursive,
regExp: regExp
}, function(err, result) {
if(err) return callback(err);
return callback(null, new ContextModule(this.resolveDependencies.bind(this), result.resource, result.recursive, result.regExp, result.loaders));
}.bind(this));
}.bind(this));
}.bind(this));
};
ContextModuleFactory.prototype.resolveDependencies = function resolveDependencies(fs, resource, recursive, regExp, callback) {
(function addDirectory(directory, callback) {
fs.readdir(directory, function(err, files) {
if(!files || files.length == 0) return callback();
async.map(files, function(seqment, callback) {
var subResource = path.join(directory, seqment)
fs.stat(subResource, function(err, stat) {
if(err) return callback(err);
if(stat.isDirectory()) {
if(!recursive) return callback();
addDirectory.call(this, subResource, callback);
} else if(stat.isFile()) {
var obj = {
context: resource,
request: "." + subResource.substr(resource.length).replace(/\\/g, "/")
};
this.applyPluginsAsyncWaterfall("alternatives", [obj], function(err, alternatives) {
alternatives = alternatives.filter(function(obj) {
return regExp.test(obj.request);
}).map(function(obj) {
var dep = new ContextElementDependency(obj.request);
dep.optional = true;
return dep;
});
callback(null, alternatives);
});
} else callback();
}.bind(this));
}.bind(this), function(err, result) {
if(err) return callback(err);
if(!result) return callback();
callback(null, result.filter(function(i) { return !!i; }).reduce(function(a, i) {
return a.concat(i);
}, []));
});
}.bind(this));
}.call(this, resource, callback));
};

49
lib/DependenciesBlock.js Normal file
View File

@ -0,0 +1,49 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var DependenciesBlockVariable = require("./DependenciesBlockVariable");
function DependenciesBlock() {
this.dependencies = [];
this.blocks = [];
this.variables = [];
}
module.exports = DependenciesBlock;
DependenciesBlock.prototype.addBlock = function(block) {
this.blocks.push(block);
}
DependenciesBlock.prototype.addVariable = function(name, expression, dependencies) {
for(var i = 0; i < this.variables.length; i++) {
var v = this.variables[i];
if(v.name == name && v.expression == expression) return;
}
this.variables.push(new DependenciesBlockVariable(name, expression, dependencies));
}
DependenciesBlock.prototype.addDependency = function(dependency) {
this.dependencies.push(dependency);
}
DependenciesBlock.prototype.updateHash = function(hash) {
this.dependencies.forEach(function(d) {
d.updateHash(hash);
});
this.blocks.forEach(function(b) {
b.updateHash(hash);
});
this.variables.forEach(function(v) {
v.updateHash(hash);
});
};
DependenciesBlock.prototype.disconnect = function() {
function disconnect(i) {
i.disconnect();
}
this.dependencies.forEach(disconnect);
this.blocks.forEach(disconnect);
this.variables.forEach(disconnect);
};

View File

@ -0,0 +1,37 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ReplaceSource = require("./ReplaceSource");
var StringSource = require("webpack-core/lib/RawSource");
function DependenciesBlockVariable(name, expression, dependencies) {
this.name = name;
this.expression = expression;
this.dependencies = dependencies || [];
}
module.exports = DependenciesBlockVariable;
DependenciesBlockVariable.prototype.updateHash = function(hash) {
hash.update(this.name);
hash.update(this.expression);
this.dependencies.forEach(function(d) {
d.updateHash(hash);
});
};
DependenciesBlockVariable.prototype.expressionSource = function(dependencyTemplates, outputOptions, requestShortener) {
var source = new ReplaceSource(new StringSource(this.expression));
this.dependencies.forEach(function(dep) {
var template = dependencyTemplates.get(dep.Class);
if(!template) throw new Error("No template for dependency: " + dep.Class.name);
template.apply(dep, source, outputOptions, requestShortener);
});
return source;
};
DependenciesBlockVariable.prototype.disconnect = function() {
this.dependencies.forEach(function(d) {
d.disconnect();
});
};

21
lib/Dependency.js Normal file
View File

@ -0,0 +1,21 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function Dependency() {
this.module = null;
this.Class = Dependency;
}
module.exports = Dependency;
Dependency.prototype.isEqualResource = function(other) {
return false;
};
Dependency.prototype.updateHash = function(hash) {
hash.update((this.module && this.module.id) + "");
};
Dependency.prototype.disconnect = function() {
this.module = null;
};

View File

@ -0,0 +1,14 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function EntryModuleNotFoundError(err) {
Error.call(this);
Error.captureStackTrace(this, EntryModuleNotFoundError);
this.name = "EntryModuleNotFoundError";
this.message = "Entry module not found: " + err;
this.error = err;
}
module.exports = EntryModuleNotFoundError;
EntryModuleNotFoundError.prototype = Object.create(Error.prototype);

View File

@ -0,0 +1,15 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var EvalDevToolModuleTemplateDecorator = require("./EvalDevToolModuleTemplateDecorator");
function EvalDevToolModulePlugin() {
}
module.exports = EvalDevToolModulePlugin;
EvalDevToolModulePlugin.prototype.apply = function(compiler) {
compiler.plugin("compilation", function(compilation) {
console.log("eval tool");
compilation.moduleTemplate = new EvalDevToolModuleTemplateDecorator(compilation.moduleTemplate);
});
};

View File

@ -0,0 +1,34 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RawSource = require("webpack-core/lib/RawSource");
function EvalDevToolModuleTemplateDecorator(moduleTemplate) {
this.moduleTemplate = moduleTemplate;
}
module.exports = EvalDevToolModuleTemplateDecorator;
EvalDevToolModuleTemplateDecorator.prototype.render = function(module, dependencyTemplates) {
var fakeModule = {
source: function(dependencyTemplates, outputOptions, requestShortener) {
var source = module.source(dependencyTemplates, outputOptions, requestShortener);
var content = source.source();
var footer = ["\n",
"// WEBPACK FOOTER",
"// module.id = " + module.id,
"// module.readableIdentifier = " + module.readableIdentifier(requestShortener),
"//@ sourceURL=webpack-module:///" + encodeURI(module.readableIdentifier(requestShortener) + "(" + module.id + ")").replace(/%2F/g, "/").replace(/%20/g, "_").replace(/%5E/g, "^").replace(/%5C/g, "\\").replace(/\?/, "%3F").replace(/^\//, "")
].join("\n");
return new RawSource("eval(" + JSON.stringify(content + footer) + ");" );
},
identifier: function() { return module.identifier() },
readableIdentifier: function(rs) { return module.readableIdentifier(rs) },
id: module.id
};
return this.moduleTemplate.render(fakeModule, dependencyTemplates);
};
EvalDevToolModuleTemplateDecorator.prototype.updateHash = function(hash) {
hash.update("1");
};

View File

@ -0,0 +1,15 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var FunctionModuleTemplate = require("./FunctionModuleTemplate");
var RequestShortener = require("./RequestShortener");
function FunctionModulePlugin(context, options) {
this.context = context;
this.options = options;
}
module.exports = FunctionModulePlugin;
FunctionModulePlugin.prototype.apply = function(compiler) {
compiler.moduleTemplate = new FunctionModuleTemplate(this.options, new RequestShortener(this.context));
};

View File

@ -0,0 +1,30 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RawSource = require("webpack-core/lib/RawSource");
function FunctionModuleTemplate(outputOptions, requestShortener) {
this.outputOptions = outputOptions || {};
this.requestShortener = requestShortener;
}
module.exports = FunctionModuleTemplate;
FunctionModuleTemplate.prototype.render = function(module, dependencyTemplates) {
var buf = [];
if(this.outputOptions.pathinfo) {
var req = module.readableIdentifier(this.requestShortener);
buf.push("/*!****" + req.replace(/./g, "*") + "****!*\\\n");
buf.push(" !*** " + req.replace(/\*\//g, "*_/") + " ***!\n");
buf.push(" \\****" + req.replace(/./g, "*") + "****/\n");
}
buf.push("/***/ function(module, exports, require) {\n\n");
var source = module.source(dependencyTemplates, this.outputOptions, this.requestShortener);
buf.push("\t" + source.source().replace(/\r?\n/g, "\n\t"));
buf.push("\n\n/***/ }");
return new RawSource(buf.join(""));
};
FunctionModuleTemplate.prototype.updateHash = function(hash) {
hash.update("1");
};

31
lib/JsonpChunkTemplate.js Normal file
View File

@ -0,0 +1,31 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RawSource = require("webpack-core/lib/RawSource");
function JsonpChunkTemplate(outputOptions) {
this.outputOptions = outputOptions || {};
}
module.exports = JsonpChunkTemplate;
JsonpChunkTemplate.prototype.render = function(chunk, moduleTemplate, dependencyTemplates) {
var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || ""));
var buf = [];
buf.push(jsonpFunction + "(" + chunk.id + ", {\n");
chunk.modules.forEach(function(module, idx) {
if(idx != 0) buf.push(",\n");
buf.push("\n/***/ " + module.id + ":\n");
var source = moduleTemplate.render(module, dependencyTemplates);
buf.push(source.source());
});
buf.push("\n\n})");
return new RawSource(buf.join(""));
};
JsonpChunkTemplate.prototype.updateHash = function(hash) {
hash.update("jsonp");
hash.update("1");
hash.update(this.outputOptions.jsonpFunction + "");
hash.update(this.outputOptions.library + "");
};

98
lib/JsonpMainTemplate.js Normal file
View File

@ -0,0 +1,98 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var StringSource = require("webpack-core/lib/RawSource");
function JsonpMainTemplate(outputOptions) {
this.outputOptions = outputOptions || {};
}
module.exports = JsonpMainTemplate;
var REGEXP_HASH = /\[hash\]/i;
var REGEXP_NAME = /\[name\]/g;
var REGEXP_ID = /\[id\]/i;
JsonpMainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
var jsonpFunction = this.outputOptions.jsonpFunction || ("webpackJsonp" + (this.outputOptions.library || ""));
var publicPath = this.outputOptions.publicPath || "";
var filename = this.outputOptions.filename || "bundle.js";
var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename;
var buf = [];
function addLine(indent, line) {
buf.push("/******/ ");
for(var i = 0; i < indent; i++)
buf.push("\t");
buf.push(line);
buf.push("\n");
}
function addRequireFunc(i) {
addLine(i+0, "function require(moduleId) {");
addLine(i+1, "if(typeof moduleId !== \"number\") throw new Error(\"Cannot find module '\"+moduleId+\"'\");");
addLine(i+1, "if(installedModules[moduleId])");
addLine(i+2, "return installedModules[moduleId].exports;");
addLine(i+1, "var module = installedModules[moduleId] = {");
addLine(i+2, "exports: {},");
addLine(i+2, "id: moduleId,");
addLine(i+2, "loaded: false");
addLine(i+1, "};");
addLine(i+1, "modules[moduleId].call(null, module, module.exports, require);");
addLine(i+1, "module.loaded = true;");
addLine(i+1, "return module.exports;");
addLine(i+0, "}");
}
addLine(0, "(function webpackBootstrap(modules) {");
addLine(1, "var installedModules = {};");
addRequireFunc(1);
addLine(1, "require.e = function requireEnsure(chunkId, callback) {");
if(chunk.chunks.length == 0) {
addLine(2, "callback.call(null, require);");
} else {
addLine(2, "if(installedChunks[chunkId] === 1) return callback.call(null, require);");
addLine(2, "if(installedChunks[chunkId] !== undefined)");
addLine(3, "installedChunks[chunkId].push(callback);");
addLine(2, "else {");
addLine(3, "installedChunks[chunkId] = [callback];");
addLine(3, "var head = document.getElementsByTagName('head')[0];");
addLine(3, "var script = document.createElement('script');");
addLine(3, "script.type = 'text/javascript';");
addLine(3, "script.charset = 'utf-8';");
addLine(3, "script.src = modules.c+" + JSON.stringify(chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_NAME, "")).replace(REGEXP_ID, "\"+chunkId+\"") + ";");
addLine(3, "head.appendChild(script);");
addLine(2, "}");
}
addLine(1, "};");
addLine(1, "require.modules = modules;");
addLine(1, "require.cache = installedModules;");
if(chunk.chunks.length > 0) {
addLine(1, "var installedChunks = {0:1};");
addLine(1, "window[" + JSON.stringify(jsonpFunction) + "] = function webpackJsonpCallback(chunkId, moreModules) {");
addLine(2, "for(var moduleId in moreModules)");
addLine(3, "modules[moduleId] = moreModules[moduleId];");
addLine(2, "var callbacks = installedChunks[chunkId];");
addLine(2, "installedChunks[chunkId] = 1;");
addLine(2, "for(var i = 0; i < callbacks.length; i++)");
addLine(3, "callbacks[i].call(null, require);");
addLine(1, "};");
}
addLine(1, "return require(0);");
addLine(0, "})({");
addLine(0, "c: " + JSON.stringify(publicPath.replace(REGEXP_HASH, hash)) + ",");
chunk.modules.forEach(function(module, idx) {
if(idx != 0) buf.push(",\n");
buf.push("\n/***/ " + module.id + ":\n");
var source = moduleTemplate.render(module, dependencyTemplates);
buf.push(source.source());
});
buf.push("\n");
addLine(0, "})");
return new StringSource(buf.join(""));
};
JsonpMainTemplate.prototype.updateHash = function(hash) {
hash.update("jsonp");
hash.update("1");
hash.update(this.outputOptions.publicPath + "");
hash.update(this.outputOptions.filename + "");
hash.update(this.outputOptions.chunkFilename + "");
hash.update(this.outputOptions.jsonpFunction + "");
};

View File

@ -0,0 +1,21 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var JsonpMainTemplate = require("./JsonpMainTemplate");
var JsonpChunkTemplate = require("./JsonpChunkTemplate");
function JsonpTemplatePlugin(options) {
this.options = options;
}
module.exports = JsonpTemplatePlugin;
JsonpTemplatePlugin.prototype.apply = function(compiler) {
var options = this.options;
compiler.mainTemplate = new JsonpMainTemplate(options);
compiler.chunkTemplate = new JsonpChunkTemplate(options);
compiler.plugin("compilation", function(compilation) {
compilation.plugin("normal-module-loader", function(loaderContext) {
loaderContext.target = "web";
});
});
};

View File

@ -0,0 +1,33 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var SetVarMainTemplateDecorator = require("./SetVarMainTemplateDecorator");
var CommonJsMainTemplateDecorator = require("./CommonJsMainTemplateDecorator");
function LibraryTemplatePlugin(name, target) {
this.name = name;
this.target = target;
}
module.exports = LibraryTemplatePlugin;
LibraryTemplatePlugin.prototype.apply = function(compiler) {
switch(this.target) {
case "var":
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "var " + this.name);
break;
case "this":
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "this[" + JSON.stringify(this.name) + "]");
break;
case "window":
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "window[" + JSON.stringify(this.name) + "]");
break;
case "commonjs":
compiler.mainTemplate = new SetVarMainTemplateDecorator(compiler.mainTemplate, "exports[" + JSON.stringify(this.name) + "]");
break;
case "commonjs2":
compiler.mainTemplate = new CommonJsMainTemplateDecorator(compiler.mainTemplate);
break;
default:
throw new Error(this.target + " is not a valid Library target");
}
};

View File

@ -0,0 +1,98 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function MemoryOutputFileSystem(data) {
this.data = data || {};
}
module.exports = MemoryOutputFileSystem;
function isDir(item) {
if(typeof item != "object") return false;
return item[""] === true;
}
function isFile(item) {
if(typeof item == "string") return true;
if(typeof item != "object") return false;
return !item[""];
}
MemoryOutputFileSystem.prototype.mkdirp = function(path, callback) {
if(path == "/") return callback();
path = path.split("/");
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
var current = this.data;
for(var i = 1; i < path.length; i++) {
if(isFile(current[path[i]]))
return callback(new Error("Path is a file " + path.join("/")));
else if(!isDir(current[path[i]]))
current[path[i]] = {"":true};
current = current[path[i]];
}
return callback();
};
MemoryOutputFileSystem.prototype.mkdir = function(path, callback) {
path = path.split("/");
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
var current = this.data;
for(var i = 1; i < path.length - 1; i++) {
if(!isDir(current[path[i]]))
return callback(new Error("Path doesn't exists " + path.join("/")));
current = current[path[i]];
}
if(isDir(current[path[i]]))
return callback(new Error("Directory already exist " + path.join("/")));
else if(isFile(current[path[i]]))
return callback(new Error("Cannot mkdir on file " + path.join("/")));
current[path[i]] = {"":true};
return callback();
};
MemoryOutputFileSystem.prototype.rmdir = function(path, callback) {
path = path.split("/");
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
var current = this.data;
for(var i = 1; i < path.length - 1; i++) {
if(!isDir(current[path[i]]))
return callback(new Error("Path doesn't exists " + path.join("/")));
current = current[path[i]];
}
if(!isDir(current[path[i]]))
return callback(new Error("Directory doesn't exist " + path.join("/")));
delete current[path[i]];
return callback();
};
MemoryOutputFileSystem.prototype.unlink = function(path, callback) {
path = path.split("/");
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
var current = this.data;
for(var i = 1; i < path.length - 1; i++) {
if(!isDir(current[path[i]]))
return callback(new Error("Path doesn't exists " + path.join("/")));
current = current[path[i]];
}
if(!isFile(current[path[i]]))
return callback(new Error("File doesn't exist " + path.join("/")));
delete current[path[i]];
return callback();
};
MemoryOutputFileSystem.prototype.writeFile = function(path, content, callback) {
if(!content) return callback(new Error("No content"));
path = path.split("/");
if(path[0] != "") return callback(new Error("Invalid path " + path.join("/")));
var current = this.data;
for(var i = 1; i < path.length - 1; i++) {
if(!isDir(current[path[i]]))
return callback(new Error("Path doesn't exists " + path.join("/")));
current = current[path[i]];
}
if(isDir(current[path[i]]))
return callback(new Error("Cannot writeFile on directory " + path.join("/")));
current[path[i]] = content;
return callback();
};
MemoryOutputFileSystem.prototype.join = function(a, b) {
if(a == "/") return "/" + b;
return a + "/" + b;
};

64
lib/Module.js Normal file
View File

@ -0,0 +1,64 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var DependenciesBlock = require("./DependenciesBlock");
var ModuleReason = require("./ModuleReason");
var debugId = 1000;
function Module() {
DependenciesBlock.call(this);
this.context = null;
this.reasons = [];
this.debugId = debugId++;
this.id = null;
this.chunks = [];
this.warnings = [];
this.errors = [];
}
module.exports = Module;
Module.prototype = Object.create(DependenciesBlock.prototype);
Module.prototype.separable = function(callback) {
callback(false);
};
Module.prototype.disconnect = function() {
this.reasons.length = 0;
this.id = null;
this.chunks.length = 0;
DependenciesBlock.prototype.disconnect.call(this);
};
Module.prototype.addChunk = function(chunk) {
var idx = this.chunks.indexOf(chunk);
if(idx < 0)
this.chunks.push(chunk);
};
Module.prototype.removeChunk = function(chunk) {
var idx = this.chunks.indexOf(chunk);
if(idx >= 0) {
this.chunks.splice(idx, 1);
chunk.removeModule(this);
}
};
Module.prototype.addReason = function(module, dependency) {
this.reasons.push(new ModuleReason(module, dependency));
};
Module.prototype.toString = function() {
return "Module[" + (this.id || this.debugId) + "]";
};
Module.prototype.needRebuild = function(fileTimestamps, contextTimestamps) {
return true;
};
Module.prototype.identifier = null;
Module.prototype.readableIdentifier = null;
Module.prototype.build = null;
Module.prototype.source = null;
Module.prototype.size = null;

View File

@ -0,0 +1,15 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function ModuleNotFoundError(module, err) {
Error.call(this);
Error.captureStackTrace(this, ModuleNotFoundError);
this.name = "ModuleNotFoundError";
this.message = "Module not found: " + err;
this.module = module;
this.error = err;
}
module.exports = ModuleNotFoundError;
ModuleNotFoundError.prototype = Object.create(Error.prototype);

19
lib/ModuleParseError.js Normal file
View File

@ -0,0 +1,19 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function ModuleParseError(module, source, err) {
Error.call(this);
Error.captureStackTrace(this, ModuleParseError);
this.name = "ModuleParseError";
this.message = "Module parse failed: " + module.request + " " + err.message;
if(typeof err.lineNumber === "number") {
source = source.split("\n");
this.message += "\n" + source.slice(err.lineNumber - 2, 5).join("\n");
}
this.module = module;
this.error = err;
}
module.exports = ModuleParseError;
ModuleParseError.prototype = Object.create(Error.prototype);

9
lib/ModuleReason.js Normal file
View File

@ -0,0 +1,9 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function ModuleReason(module, dependency) {
this.module = module;
this.dependency = dependency;
}
module.exports = ModuleReason;

142
lib/NormalModule.js Normal file
View File

@ -0,0 +1,142 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Module = require("./Module");
var NormalModuleMixin = require("webpack-core/lib/NormalModuleMixin");
var RawSource = require("webpack-core/lib/RawSource");
var ReplaceSource = require("./ReplaceSource");
var ModuleParseError = require("./ModuleParseError");
var path = require("path");
function NormalModule(request, userRequest, rawRequest, loaders, resource, parser) {
Module.call(this);
this.request = request;
this.userRequest = userRequest;
this.rawRequest = rawRequest;
this.parser = parser;
NormalModuleMixin.call(this, loaders, resource);
this.assets = {};
this.built = false;
}
module.exports = NormalModule;
NormalModule.prototype = Object.create(Module.prototype);
NormalModuleMixin.mixin(NormalModule.prototype);
NormalModule.prototype.identifier = function() {
return this.request;
};
NormalModule.prototype.readableIdentifier = function(requestShortener) {
return requestShortener.shorten(this.userRequest);
};
NormalModule.prototype.fillLoaderContext = function fillLoaderContext(loaderContext, options, compilation) {
loaderContext.webpack = true;
compilation.applyPlugins("normal-module-loader", loaderContext);
loaderContext.emitFile = function(name, content) {
this.assets[name] = new RawSource(content);
}.bind(this);
loaderContext.minimize = options.minimize;
loaderContext._compilation = compilation;
loaderContext._compiler = compilation.compiler;
};
NormalModule.prototype.disconnect = function disconnect() {
this.built = false;
Module.prototype.disconnect.call(this);
};
NormalModule.prototype.build = function build(options, compilation, resolver, fs, callback) {
this.buildTimestamp = new Date().getTime();
this.built = true;
return this.doBuild(options, compilation, resolver, fs, function(err) {
if(err) return callback(err);
try {
this.parser.parse(this._source.source(), {current: this});
} catch(e) {
var source = this._source.source();
this._source = null;
return callback(new ModuleParseError(this, source, e));
}
return callback();
}.bind(this));
};
NormalModule.prototype.source = function(dependencyTemplates, outputOptions, requestShortener) {
var _source = this._source;
if(!_source) return new RawSource("throw new Error('No source availible');");
var source = new ReplaceSource(_source);
function doDep(dep) {
var template = dependencyTemplates.get(dep.Class);
if(!template) throw new Error("No template for dependency: " + dep.Class.name);
template.apply(dep, source, outputOptions, requestShortener);
}
function doVariable(vars, variable) {
var name = variable.name;
var expr = variable.expressionSource(dependencyTemplates, outputOptions, requestShortener);
vars.push({name: name, expression: expr});
}
function doBlock(block) {
block.dependencies.forEach(doDep);
block.blocks.forEach(doBlock);
if(block.variables.length > 0) {
var vars = [];
block.variables.forEach(doVariable.bind(null, vars));
var varNames = [];
var varExpressions = [];
var varStartCode = "";
var varEndCode = "";
function emitFunction() {
if(varNames.length == 0) return;
varStartCode += "/* WEBPACK VAR INJECTION */(function(" + varNames.join(", ") + ") {";
varEndCode = "}(" + varExpressions.map(function(e) {return e.source()}).join(", ") + "))" + varEndCode;
varNames.length = 0;
varExpressions.length = 0;
}
vars.forEach(function(v) {
if(varNames.indexOf(v.name) >= 0) emitFunction();
varNames.push(v.name);
varExpressions.push(v.expression);
});
emitFunction();
var start = block.range ? block.range[0] : 0;
var end = block.range ? block.range[1] : _source.size();
if(varStartCode) source.insert(start, varStartCode);
if(varEndCode) source.insert(end, "\n/* WEBPACK VAR INJECTION */" + varEndCode);
}
}
doBlock(this);
return source;
};
NormalModule.prototype.needRebuild = function needRebuild(fileTimestamps, contextTimestamps) {
var timestamp = 0;
this.fileDependencies.forEach(function(file) {
var ts = fileTimestamps[file];
if(!ts) timestamp = Infinity;
if(ts > timestamp) timestamp = ts;
});
this.contextDependencies.forEach(function(context) {
var ts = contextTimestamps[context];
if(!ts) timestamp = Infinity;
if(ts > timestamp) timestamp = ts;
});
return timestamp > this.buildTimestamp;
};
NormalModule.prototype.size = function() {
return this._source ? this._source.size() : -1;
};
NormalModule.prototype.updateHash = function(hash) {
if(this._source) {
hash.update("source");
this._source.updateHash(hash);
} else
hash.update("null");
Module.prototype.updateHash.call(this, hash);
};

111
lib/NormalModuleFactory.js Normal file
View File

@ -0,0 +1,111 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var async = require("async");
var Tapable = require("tapable");
var NormalModule = require("./NormalModule");
var LoadersList = require("webpack-core/lib/LoadersList");
function NormalModuleFactory(resolvers, parser, options) {
Tapable.call(this);
this.resolvers = resolvers;
this.parser = parser;
this.loaders = new LoadersList(options.loaders);
this.preLoaders = new LoadersList(options.preLoaders);
this.postLoaders = new LoadersList(options.postLoaders);
this.context = options.context || "";
}
module.exports = NormalModuleFactory;
NormalModuleFactory.prototype = Object.create(Tapable.prototype);
NormalModuleFactory.prototype.create = function(context, dependency, callback) {
context = context || this.context;
var request = dependency.request;
this.applyPluginsAsyncWaterfall("before-resolve", {
context: context,
request: request
}, function(err, result) {
if(err) return callback(err);
context = result.context;
request = result.request;
var noAutoLoaders = /^!/.test(request);
var noPrePostAutoLoaders = /^!!/.test(request);
var elements = request.replace(/^!+/, "").replace(/!!+/g, "!").split("!");
var resource = elements.pop();
async.parallel([
function(callback) {
this.resolveRequestArray(context, elements, this.resolvers.loader, callback);
}.bind(this),
function(callback) {
if(resource == "" || resource[0] == "?")
return callback(null, resource);
this.resolvers.normal.resolve(context, resource, callback);
}.bind(this)
], function(err, results) {
if(err) return callback(err);
var loaders = results[0];
resource = results[1];
var userRequest = loaders.concat([resource]).join("!");
if(noPrePostAutoLoaders)
return onDoneResolving.call(this);
if(noAutoLoaders) {
async.parallel([
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
], function(err, results) {
if(err) return callback(err);
loaders = results[0].concat(loaders).concat(results[1]);
onDoneResolving.call(this);
}.bind(this));
} else {
async.parallel([
this.resolveRequestArray.bind(this, context, this.postLoaders.match(resource), this.resolvers.loader),
this.resolveRequestArray.bind(this, context, this.loaders.match(resource), this.resolvers.loader),
this.resolveRequestArray.bind(this, context, this.preLoaders.match(resource), this.resolvers.loader)
], function(err, results) {
if(err) return callback(err);
loaders = results[0].concat(results[1]).concat(loaders).concat(results[2]);
onDoneResolving.call(this);
}.bind(this));
}
function onDoneResolving() {
this.applyPluginsAsyncWaterfall("after-resolve", {
request: loaders.concat([resource]).join("!"),
userRequest: userRequest,
rawRequest: request,
loaders: loaders,
resource: resource,
parser: this.parser
}, function(err, result) {
if(err) return callback(err);
return callback(null,
new NormalModule(
result.request,
result.userRequest,
result.rawRequest,
result.loaders,
result.resource,
result.parser
)
);
}.bind(this));
}
}.bind(this));
}.bind(this));
};
NormalModuleFactory.prototype.resolveRequestArray = function resolveRequestArray(context, array, resolver, callback) {
if(array.length === 0) return callback(null, []);
async.map(array, function(item, callback) {
if(item == "" || item[0] == "?")
return callback(null, item);
resolver.resolve(context, item, callback);
}, callback);
};

11
lib/NullFactory.js Normal file
View File

@ -0,0 +1,11 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function NullFactory() {
}
module.exports = NullFactory;
NullFactory.prototype.create = function(context, dependency, callback) {
return callback();
}

11
lib/OptionsApply.js Normal file
View File

@ -0,0 +1,11 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function OptionsApply() {
}
module.exports = OptionsApply;
OptionsApply.prototype.process = function(options, compiler) {
};

70
lib/OptionsDefaulter.js Normal file
View File

@ -0,0 +1,70 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function OptionsDefaulter() {
this.defaults = {};
this.config = {};
}
module.exports = OptionsDefaulter;
function getProperty(obj, name) {
name = name.split(".");
for(var i = 0; i < name.length - 1; i++) {
obj = obj[name[i]];
if(typeof obj != "object" || !obj) return;
}
return obj[name.pop()];
}
function setProperty(obj, name, value) {
name = name.split(".");
for(var i = 0; i < name.length - 1; i++) {
if(typeof (obj[name[i]]) !== "object" || !obj[name[i]]) obj[name[i]] = {};
obj = obj[name[i]];
}
obj[name.pop()] = value;
}
function hasProperty(obj, name, value) {
name = name.split(".");
for(var i = 0; i < name.length - 1; i++) {
obj = obj[name[i]];
if(typeof obj != "object" || !obj) return false;
}
return Object.prototype.hasOwnProperty.call(obj, name.pop());
}
OptionsDefaulter.prototype.process = function(options) {
for(var name in this.defaults) {
switch(this.config[name]) {
case undefined:
if(getProperty(options, name) === undefined)
setProperty(options, name, this.defaults[name]);
break;
case "call":
setProperty(options, name, this.defaults[name].call(this, getProperty(options, name)), options);
break;
case "append":
var oldValue = getProperty(options, name);
if(!Array.isArray(oldValue)) oldValue = [];
this.defaults[name].forEach(function(item) {
oldValue.push(item);
});
setProperty(options, name, oldValue);
break;
default:
throw new Error("OptionsDefaulter cannot process " + this.config[name]);
}
}
};
OptionsDefaulter.prototype.set = function(name, config, def) {
if(arguments.length === 3) {
this.defaults[name] = def;
this.config[name] = config;
} else {
this.defaults[name] = config;
delete this.config[name];
}
}

511
lib/Parser.js Normal file
View File

@ -0,0 +1,511 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var esprima = require("esprima");
var Tapable = require("tapable");
var BasicEvaluatedExpression = require("./BasicEvaluatedExpression");
function Parser(options) {
Tapable.call(this);
this.options = options;
this.initializeEvaluating();
}
module.exports = Parser;
// Syntax: https://developer.mozilla.org/en/SpiderMonkey/Parser_API
Parser.prototype = Object.create(Tapable.prototype);
Parser.prototype.initializeEvaluating = function() {
function joinRanges(startRange, endRange) {
if(!endRange) return startRange;
if(!startRange) return endRange;
return [startRange[0], endRange[1]];
}
this.plugin("evaluate Literal", function(expr) {
switch(typeof expr.value) {
case "number":
return new BasicEvaluatedExpression().setNumber(expr.value).setRange(expr.range);
case "string":
return new BasicEvaluatedExpression().setString(expr.value).setRange(expr.range);
case "boolean":
return new BasicEvaluatedExpression().setBoolean(expr.value).setRange(expr.range);
}
});
this.plugin("evaluate BinaryExpression", function(expr) {
if(expr.operator == "+") {
var left = this.evaluateExpression(expr.left);
var right = this.evaluateExpression(expr.right);
if(!left || !right) return;
var res = new BasicEvaluatedExpression()
if(left.isString()) {
if(right.isString()) {
res.setString(left.string + right.string);
} else if(right.isNumber()) {
res.setString(left.string + right.number);
} else if(right.isWrapped() && right.prefix.isString()) {
res.setWrapped(
new BasicEvaluatedExpression()
.setString(left.string + right.prefix.string)
.setRange(joinRanges(left.range, right.prefix.range)),
right.postfix);
} else {
res.setWrapped(left, new BasicEvaluatedExpression().setString(""))
}
} else if(left.isNumber()) {
if(right.isString()) {
res.setString(left.number + right.string);
} else if(right.isNumber()) {
res.setNumber(left.number + right.number);
}
} else if(left.isWrapped() && left.postfix.isString()) {
if(right.isString()) {
res.setWrapped(left.prefix,
new BasicEvaluatedExpression()
.setString(left.postfix.string + right.string)
.setRange(joinRanges(left.postfix.range, right.range))
);
} else if(right.isNumber()) {
res.setWrapped(left.prefix,
new BasicEvaluatedExpression()
.setString(left.postfix.string + right.number)
.setRange(joinRanges(left.postfix.range, right.range))
);
}
} else {
if(right.isString()) {
res.setWrapped(new BasicEvaluatedExpression().setString(""), right);
}
}
res.setRange(expr.range);
return res;
} else if(expr.operator == "==" || expr.operator == "===") {
var left = this.evaluateExpression(expr.left);
var right = this.evaluateExpression(expr.right);
if(!left || !right) return;
var res = new BasicEvaluatedExpression();
res.setRange(expr.range);
if(left.isString() && right.isString()) {
return res.setBoolean(left.string === right.string);
} else if(left.isNumber() && right.isNumber()) {
return res.setBoolean(left.number === right.number);
} else if(left.isBoolean() && right.isBoolean()) {
return res.setBoolean(left.bool === right.bool);
}
} else if(expr.operator == "!=" || expr.operator == "!==") {
var left = this.evaluateExpression(expr.left);
var right = this.evaluateExpression(expr.right);
if(!left || !right) return;
var res = new BasicEvaluatedExpression();
res.setRange(expr.range);
if(left.isString() && right.isString()) {
return res.setBoolean(left.string !== right.string);
} else if(left.isNumber() && right.isNumber()) {
return res.setBoolean(left.number !== right.number);
} else if(left.isBoolean() && right.isBoolean()) {
return res.setBoolean(left.bool !== right.bool);
}
}
});
this.plugin("evaluate UnaryExpression", function(expr) {
if(expr.operator == "typeof" && expr.argument.type == "Identifier") {
return this.applyPluginsBailResult("evaluate typeof " + expr.argument.name, expr);
}
});
this.plugin("evaluate Identifier", function(expr) {
return this.applyPluginsBailResult("evaluate Identifier " + expr.name, expr);
});
this.plugin("evaluate ConditionalExpression", function(expr) {
var consequent = this.evaluateExpression(expr.consequent);
var alternate = this.evaluateExpression(expr.alternate);
if(!consequent || !alternate) return;
var res = new BasicEvaluatedExpression();
if(consequent.isConditional())
res.setOptions(consequent.options);
else
res.setOptions([consequent]);
if(alternate.isConditional())
res.addOptions(alternate.options);
else
res.addOptions([alternate]);
res.setRange(expr.range);
return res;
});
this.plugin("evaluate ArrayExpression", function(expr) {
var items = expr.elements.map(function(element) {
return this.evaluateExpression(element);
}, this);
if(items.filter(function(i) { return !i; }).length > 0) return;
return new BasicEvaluatedExpression().setItems(items).setRange(expr.range);
});
}
Parser.prototype.walkStatements = function walkStatements(statements) {
statements.forEach(function(statement) {
this.walkStatement(statement);
}, this);
}
Parser.prototype.walkStatement = function walkStatement(statement) {
switch(statement.type) {
// Real Statements
case "BlockStatement":
this.walkStatements(statement.body);
break;
case "ExpressionStatement":
this.walkExpression(statement.expression);
break;
case "IfStatement":
var result = this.applyPluginsBailResult("statement if", statement);
if(result === undefined) {
this.walkExpression(statement.test);
this.walkStatement(statement.consequent);
if(statement.alternate)
this.walkStatement(statement.alternate);
} else {
if(result)
this.walkStatement(statement.consequent);
else if(statement.alternate)
this.walkStatement(statement.alternate);
}
break;
case "LabeledStatement":
this.walkStatement(statement.body);
break;
case "WithStatement":
this.walkExpression(statement.object);
this.walkStatement(statement.body);
break;
case "SwitchStatement":
this.walkExpression(statement.discriminant);
this.walkSwitchCases(statement.cases);
break;
case "ReturnStatement":
case "ThrowStatement":
if(statement.argument)
this.walkExpression(statement.argument);
break;
case "TryStatement":
if(this.scope.inTry) {
this.walkStatement(statement.block);
} else {
this.scope.inTry = true;
this.walkStatement(statement.block);
this.scope.inTry = false;
}
this.walkCatchClauses(statement.handlers);
if(statement.finalizer)
this.walkStatement(statement.finalizer);
break;
case "WhileStatement":
case "DoWhileStatement":
this.walkExpression(statement.test);
this.walkStatement(statement.body);
break;
case "ForStatement":
if(statement.init) {
if(statement.init.type === "VariableDeclaration")
this.walkStatement(statement.init);
else
this.walkExpression(statement.init);
}
if(statement.test)
this.walkExpression(statement.test);
if(statement.update)
this.walkExpression(statement.update);
this.walkStatement(statement.body);
break;
case "ForInStatement":
if(statement.left.type === "VariableDeclaration")
this.walkStatement(statement.left);
else
this.walkExpression(statement.left);
this.walkExpression(statement.right);
this.walkStatement(statement.body);
break;
// Declarations
case "FunctionDeclaration":
this.scope.definitions.push(statement.id.name);
this.inScope(statement.params, function() {
if(statement.body.type === "BlockStatement")
this.walkStatement(statement.body);
else
this.walkExpression(statement.body);
}.bind(this));
break;
case "VariableDeclaration":
if(statement.declarations)
this.walkVariableDeclarators(statement.declarations);
break;
}
}
Parser.prototype.walkSwitchCases = function walkSwitchCases(switchCases) {
switchCases.forEach(function(switchCase) {
if(switchCase.test)
this.walkExpression(switchCase.test);
this.walkStatements(switchCase.consequent);
}, this);
}
Parser.prototype.walkCatchClauses = function walkCatchClauses(catchClauses) {
catchClauses.forEach(function(catchClause) {
if(catchClause.guard)
this.walkExpression(catchClause.guard);
this.inScope([catchClause.param], function() {
this.walkStatement(catchClause.body);
}.bind(this));
}, this);
}
Parser.prototype.walkVariableDeclarators = function walkVariableDeclarators(declarators) {
declarators.forEach(function(declarator) {
switch(declarator.type) {
case "VariableDeclarator":
if(declarator.id.type === "Identifier") {
this.scope.definitions.push(declarator.id.name);
}
if(declarator.init)
this.walkExpression(declarator.init);
break;
}
}, this);
}
Parser.prototype.walkExpressions = function walkExpressions(expressions) {
expressions.forEach(function(expression) {
this.walkExpression(expression);
}, this);
}
Parser.prototype.walkExpression = function walkExpression(expression) {
switch(expression.type) {
case "ArrayExpression":
if(expression.elements)
this.walkExpressions(expression.elements);
break;
case "ObjectExpression":
expression.properties.forEach(function(prop) {
this.walkExpression(prop.value);
}, this);
break;
case "FunctionExpression":
this.inScope(expression.params, function() {
if(expression.body.type === "BlockStatement")
this.walkStatement(expression.body);
else
this.walkExpression(expression.body);
}.bind(this));
break;
case "SequenceExpression":
if(expression.expressions)
this.walkExpressions(expression.expressions);
break;
case "UpdateExpression":
this.walkExpression(expression.argument);
break;
case "UnaryExpression":
if(expression.operator === "typeof") {
var expr = expression.argument;
var exprName = [];
while(expr.type == "MemberExpression" && expr.property.type == "Identifier") {
exprName.unshift(expr.property.name);
expr = expr.object;
}
if(expr.type == "Identifier" && this.scope.definitions.indexOf(expr.name) == -1) {
exprName.unshift(expr.name);
exprName = exprName.join(".");
var result = this.applyPluginsBailResult("typeof " + exprName, expression);
if(result === true)
break;
}
}
this.walkExpression(expression.argument);
break;
case "BinaryExpression":
case "LogicalExpression":
this.walkExpression(expression.left);
this.walkExpression(expression.right);
break;
case "AssignmentExpression":
if(expression.left.type !== "Identifier" ||
expression.left.name !== "require")
this.walkExpression(expression.left);
this.walkExpression(expression.right);
break;
case "ConditionalExpression":
this.walkExpression(expression.test);
this.walkExpression(expression.alternate);
this.walkExpression(expression.consequent);
break;
case "NewExpression":
this.walkExpression(expression.callee);
if(expression.arguments)
this.walkExpressions(expression.arguments);
break;
case "CallExpression":
var callee = expression.callee;
var calleeName = [];
while(callee.type == "MemberExpression" && callee.property.type == "Identifier") {
calleeName.unshift(callee.property.name);
callee = callee.object;
}
if(callee.type == "Identifier" && this.scope.definitions.indexOf(callee.name) == -1) {
calleeName.unshift(callee.name);
calleeName = calleeName.join(".");
var result = this.applyPluginsBailResult("call " + calleeName, expression);
if(result === true)
break;
}
if(expression.callee)
this.walkExpression(expression.callee);
if(expression.arguments)
this.walkExpressions(expression.arguments);
break;
case "MemberExpression":
var expr = expression;
var exprName = [];
while(expr.type == "MemberExpression" && expr.property.type == "Identifier") {
exprName.unshift(expr.property.name);
expr = expr.object;
}
if(expr.type == "Identifier" && this.scope.definitions.indexOf(expr.name) == -1) {
exprName.unshift(expr.name);
exprName = exprName.join(".");
var result = this.applyPluginsBailResult("expression " + exprName, expression);
if(result === true)
break;
}
this.walkExpression(expression.object);
if(expression.property.type !== "Identifier")
this.walkExpression(expression.property);
break;
case "Identifier":
if(this.scope.definitions.indexOf(expression.name) == -1) {
var result = this.applyPluginsBailResult("expression " + expression.name, expression);
if(result === true)
break;
}
break;
}
}
Parser.prototype.inScope = function inScope(params, fn) {
var oldScope = this.scope;
this.scope = {
inTry: false,
definitions: oldScope.definitions.slice()
};
params.forEach(function(param) {
if(typeof param !== "string") {
if(param.type !== "Identifier")
return;
param = param.name;
}
this.scope.definitions.push(param);
}, this);
fn();
this.scope = oldScope;
}
Parser.prototype.evaluateExpression = function evaluateExpression(expression) {
var result = this.applyPluginsBailResult("evaluate " + expression.type, expression);
if(result !== undefined)
return result;
return new BasicEvaluatedExpression().setRange(expression.range);
}
Parser.prototype.parseString = function parseString(expression) {
switch(expression.type) {
case "BinaryExpression":
if(expression.operator == "+")
return this.parseString(expression.left) + this.parseString(expression.right);
break;
case "Literal":
return expression.value+"";
}
throw new Error(expression.type + " is not supported as parameter for require");
}
Parser.prototype.parseCalculatedString = function parseCalculatedString(expression) {
switch(expression.type) {
case "BinaryExpression":
if(expression.operator == "+") {
var left = this.parseCalculatedString(expression.left);
var right = this.parseCalculatedString(expression.right);
if(left.code) {
return {range: left.range, value: left.value, code: true};
} else if(right.code) {
return {range: [left.range[0], right.range ? right.range[1] : left.range[1]], value: left.value + right.value, code: true};
} else {
return {range: [left.range[0], right.range[1]], value: left.value + right.value};
}
}
break;
case "ConditionalExpression":
var consequent = this.parseCalculatedString(expression.consequent);
var alternate = this.parseCalculatedString(expression.alternate);
var items = [];
if(consequent.conditional)
Array.prototype.push.apply(items, consequent.conditional);
else if(!consequent.code)
items.push(consequent);
else break;
if(alternate.conditional)
Array.prototype.push.apply(items, alternate.conditional);
else if(!alternate.code)
items.push(alternate);
else break;
return {value: "", code: true, conditional: items};
case "Literal":
return {range: expression.range, value: expression.value+""};
break;
}
return {value: "", code: true};
}
Parser.prototype.parseStringArray = function parseStringArray(expression) {
switch(expression.type) {
case "ArrayExpression":
var arr = [];
if(expression.elements)
expression.elements.forEach(function(expr) {
arr.push(this.parseString(expr));
}, this);
return arr;
}
return [this.parseString(expression)];
}
Parser.prototype.parseCalculatedStringArray = function parseCalculatedStringArray(expression) {
switch(expression.type) {
case "ArrayExpression":
var arr = [];
if(expression.elements)
expression.elements.forEach(function(expr) {
arr.push(this.parseCalculatedString(expr));
}, this);
return arr;
}
return [this.parseCalculatedString(expression)];
}
Parser.prototype.parse = function parse(source, initialState) {
var ast = esprima.parse(source, {range: true, loc: true, raw: true});
if(!ast || typeof ast != "object")
throw new Error("Source couldn't be parsed");
var oldScope = this.scope;
var oldState = this.state;
this.scope = {
inTry: false,
definitions: []
};
var state = this.state = initialState || {};
this.walkStatements(ast.body);
this.scope = oldScope;
this.state = oldState;
return state;
}

50
lib/ProgressPlugin.js Normal file
View File

@ -0,0 +1,50 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
function ProgressPlugin(handler) {
this.handler = handler;
}
module.exports = ProgressPlugin;
ProgressPlugin.prototype.apply = function(compiler) {
var lastModulesCount = 0;
var moduleCount = 1;
var doneModules = 0;
var handler = this.handler;
function update() {
handler(0.1 + (doneModules / Math.max(lastModulesCount, moduleCount)) * 0.6, doneModules + "/" + moduleCount + " build modules");
}
compiler.plugin("compilation", function(compilation) {
lastModulesCount = moduleCount;
moduleCount = 0;
doneModules = 0;
handler(0, "compile");
compilation.plugin("build-module", function(module) {
moduleCount++;
update();
});
compilation.plugin("succeed-module", function(module) {
doneModules++;
update();
});
compilation.plugin("optimize", function() {
handler(0.75, "optimize");
});
compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
handler(0.8, "optimize chunk assets");
callback();
});
compilation.plugin("optimize-assets", function(assets, callback) {
handler(0.9, "optimize assets");
callback();
});
});
compiler.plugin("emit", function(compilation, callback) {
handler(0.95, "emit");
callback();
});
compiler.plugin("done", function(stats) {
handler(1, "");
});
};

41
lib/ReplaceSource.js Normal file
View File

@ -0,0 +1,41 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Source = require("webpack-core/lib/Source");
function ReplaceSource(source) {
Source.call(this);
this._source = source;
this.replacements = [];
}
module.exports = ReplaceSource;
ReplaceSource.prototype = Object.create(Source.prototype);
ReplaceSource.prototype.replace = function(start, end, newValue) {
this.replacements.push([start, end, newValue]);
};
ReplaceSource.prototype.insert = function(pos, newValue) {
this.replacements.push([pos, pos-1, newValue]);
};
ReplaceSource.prototype._bake = function() {
this.replacements.sort(function(a, b) {
return b[0] - a[0];
});
var result = [this._source.source()];
this.replacements.forEach(function(repl) {
var remSource = result.pop();
result.push(
remSource.substr(repl[1]+1),
repl[2],
remSource.substr(0, repl[0])
);
});
result = result.reverse().join("");
return {
source: result
}
};

40
lib/RequestShortener.js Normal file
View File

@ -0,0 +1,40 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var path = require("path");
function RequestShortener(directory) {
var parentDirectory = path.dirname(directory);
var buildins = path.join(__dirname, "..");
var currentDirectoryRegExp = directory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
currentDirectoryRegExp = new RegExp("^" + currentDirectoryRegExp + "|(!)" + currentDirectoryRegExp, "g");
var buildinsAsModule = currentDirectoryRegExp.test(buildins);
var parentDirectoryRegExp = parentDirectory.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
parentDirectoryRegExp = new RegExp("^" + parentDirectoryRegExp + "|(!)" + parentDirectoryRegExp, "g");
var buildinsRegExp = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
buildinsRegExp = new RegExp("^" + buildinsRegExp + "|(!)" + buildinsRegExp, "g");
this.buildinsAsModule = buildinsAsModule;
this.currentDirectoryRegExp = currentDirectoryRegExp;
this.parentDirectoryRegExp = parentDirectoryRegExp;
this.buildinsRegExp = buildinsRegExp;
this.node_modulesRegExp = /\/node_modules\//g;
this.index_jsRegExp = /\/index.js!/g;
}
module.exports = RequestShortener;
RequestShortener.prototype.shorten = function(request) {
if(!request)
return request;
if(this.buildinsAsModule)
request = request.replace(this.buildinsRegExp, "!(webpack)");
request = request.replace(this.currentDirectoryRegExp, "!.");
request = request.replace(this.parentDirectoryRegExp, "!.");
if(!this.buildinsAsModule)
request = request.replace(this.buildinsRegExp, "!(webpack)");
request = request.replace(/\\/g, "/");
request = request.replace(this.node_modulesRegExp, "/~/");
request = request.replace(this.index_jsRegExp, "!");
return request.replace(/^!|!$/, "");
};

View File

@ -0,0 +1,22 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var WrapSource = require("./WrapSource");
var RawSource = require("webpack-core/lib/RawSource");
function CommonJsMainTemplateDecorator(mainTemplate, varExpression) {
this.mainTemplate = mainTemplate;
this.varExpression = varExpression;
}
module.exports = CommonJsMainTemplateDecorator;
CommonJsMainTemplateDecorator.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
var source = this.mainTemplate.render(hash, chunk, moduleTemplate, dependencyTemplates);
var prefix = this.varExpression + " =\n";
return new WrapSource(new RawSource(prefix), source, new RawSource(""));
};
CommonJsMainTemplateDecorator.prototype.updateHash = function(hash) {
hash.update("set var");
hash.update(this.varExpression);
this.mainTemplate.updateHash(hash);
};

22
lib/SingleEntryPlugin.js Normal file
View File

@ -0,0 +1,22 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var SingleEntryDependency = require("./dependencies/SingleEntryDependency");
function SingleEntryPlugin(context, entry, name) {
this.context = context;
this.entry = entry;
this.name = name;
}
module.exports = SingleEntryPlugin;
SingleEntryPlugin.prototype.apply = function(compiler) {
compiler.plugin("compilation", function(compilation, params) {
var normalModuleFactory = params.normalModuleFactory;
compilation.dependencyFactories.set(SingleEntryDependency, normalModuleFactory);
});
compiler.plugin("make", function(compilation, callback) {
compilation.addEntry(this.context, new SingleEntryDependency(this.entry), this.name, callback);
}.bind(this));
};

422
lib/Stats.js Normal file
View File

@ -0,0 +1,422 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RequestShortener = require("./RequestShortener");
function Stats(compilation) {
this.compilation = compilation;
}
module.exports = Stats;
Stats.prototype.hasWarnings = function() {
return this.compilation.warnings.length > 0;
};
Stats.prototype.hasErrors = function() {
return this.compilation.errors.length > 0;
};
Stats.prototype.toJson = function toJson(options, forToString) {
if(!options) options = {};
function d(v, d) { return v === undefined ? d : v }
var compilation = this.compilation;
var requestShortener = new RequestShortener(d(options.context, process.cwd()));
var showHash = d(options.hash, true);
var showTimings = d(options.timings, true);
var showAssets = d(options.assets, true);
var showChunks = d(options.chunks, true);
var showChunkModules = d(options.chunkModules, !!forToString);
var showModules = d(options.modules, !forToString);
var showCachedModules = d(options.cached, true);
var showReasons = d(options.reasons, !forToString);
var showChildren = d(options.children, true);
var sortModules = d(options.modulesSort, "id");
var sortChunks = d(options.chunksSort, "id");
var sortAssets = d(options.assetsSort, "");
function sortByField(field) {
if(!field) return function() { return 0; }
if(field[0] == "!") {
field = field.substr(1);
return function(a, b) {
if(a[field] == b[field]) return 0;
return (a[field] < b[field]) ? 1 : -1;
}
}
return function(a, b) {
if(a[field] == b[field]) return 0;
return (a[field] < b[field]) ? -1 : 1;
}
}
function formatError(e) {
var text = "";
if(e.module) {
// text += e.module.readableIdentifier(requestShortener) + "\n";
text += e.module.identifier() + "\n";
} else if(e.file) {
text += e.file + "\n";
}
text += e.message;
if(e.dependencies && e.origin) {
text += "\n @ " + e.origin.readableIdentifier(requestShortener);
e.dependencies.forEach(function(dep) {
if(!dep.loc) return;
if(!dep.loc.start) return;
if(!dep.loc.end) return;
text += " " + dep.loc.start.line + ":" + dep.loc.start.column + "-" +
(dep.loc.start.line != dep.loc.end.line ? dep.loc.end.line + ":" : "") + dep.loc.end.column;
});
}
return text;
}
var obj = {
errors: compilation.errors.map(formatError),
warnings: compilation.warnings.map(formatError)
};
if(showHash) obj.hash = compilation.hash;
if(showTimings && this.startTime && this.endTime) {
obj.time = this.endTime - this.startTime;
}
if(showAssets) {
var assetsByFile = {};
obj.assets = Object.keys(compilation.assets).map(function(asset) {
var obj = {
name: asset,
size: compilation.assets[asset].size(),
chunks: [],
chunkNames: []
};
assetsByFile[asset] = obj;
return obj;
});
compilation.chunks.forEach(function(chunk) {
chunk.files.forEach(function(asset) {
if(assetsByFile[asset]) {
assetsByFile[asset].chunks.push(chunk.id);
if(chunk.name)
assetsByFile[asset].chunkNames.push(chunk.name);
}
});
});
obj.assets.sort(sortByField(sortAssets));
}
function fnModule(module) {
var obj = {
id: module.id,
identifier: module.identifier(),
name: module.readableIdentifier(requestShortener),
size: module.size(),
cacheable: !!module.cacheable,
built: !!module.built,
chunks: module.chunks.map(function(chunk) {
return chunk.id;
})
};
if(showReasons) {
obj.reasons = module.reasons.filter(function(reason) {
return reason.dependency && reason.dependency.module && reason.module;
}).map(function(reason) {
var obj = {
moduleId: reason.module.id,
module: reason.module.readableIdentifier(requestShortener),
type: reason.dependency.type,
userRequest: reason.dependency.userRequest
}
var dep = reason.dependency;
if(dep.loc) obj.loc = dep.loc.start.line + ":" + dep.loc.start.column + "-" +
(dep.loc.start.line != dep.loc.end.line ? dep.loc.end.line + ":" : "") + dep.loc.end.column
return obj;
});
}
return obj;
}
if(showChunks) {
obj.chunks = compilation.chunks.map(function(chunk) {
var obj = {
id: chunk.id,
size: chunk.modules.reduce(function(size, module) { return size + module.size(); }, 0),
names: chunk.name ? [chunk.name] : [],
files: chunk.files.slice(),
parents: chunk.parents.map(function(c) {
return c.id;
})
};
if(showChunkModules) {
obj.modules = chunk.modules.map(fnModule);
if(!showCachedModules) {
obj.modules = obj.modules.filter(function(m) {
return m.built;
});
}
obj.modules.sort(sortByField(sortModules));
}
return obj;
});
obj.chunks.sort(sortByField(sortChunks));
}
if(showModules) {
obj.modules = compilation.modules.map(fnModule);
if(!showCachedModules) {
obj.modules = obj.modules.filter(function(m) {
return m.built;
});
}
obj.modules.sort(sortByField(sortModules));
}
if(showChildren) {
obj.children = compilation.children.map(function(child) {
var obj = new Stats(child).toJson(options);
obj.name = child.name;
return obj;
});
}
return obj;
};
Stats.prototype.toString = function toString(options) {
function d(v, d) { return v === undefined ? d : v }
var useColors = d(options.colors, false);
var obj = this.toJson(options, true);
return Stats.jsonToString(obj, useColors);
};
Stats.jsonToString = function jsonToString(obj, useColors) {
var buf = [];
function normal(str) {
buf.push(str);
}
function bold(str) {
if(useColors) buf.push("\033[1m");
buf.push(str);
if(useColors) buf.push("\033[22m");
}
function yellow(str) {
if(useColors) buf.push("\033[1m\033[33m");
buf.push(str);
if(useColors) buf.push("\033[39m\033[22m");
}
function red(str) {
if(useColors) buf.push("\033[1m\033[31m");
buf.push(str);
if(useColors) buf.push("\033[39m\033[22m");
}
function green(str) {
if(useColors) buf.push("\033[1m\033[32m");
buf.push(str);
if(useColors) buf.push("\033[39m\033[22m");
}
function cyan(str) {
if(useColors) buf.push("\033[1m\033[36m");
buf.push(str);
if(useColors) buf.push("\033[39m\033[22m");
}
function magenta(str) {
if(useColors) buf.push("\033[1m\033[35m");
buf.push(str);
if(useColors) buf.push("\033[39m\033[22m");
}
function newline() {
buf.push("\n");
}
function table(array, formats, align, splitter) {
var rows = array.length;
var cols = array[0].length;
var colSizes = new Array(cols);
for(var col = 0; col < cols; col++)
colSizes[col] = 3;
for(var row = 0; row < rows; row++) {
for(var col = 0; col < cols; col++) {
var value = array[row][col] + "";
if(value.length > colSizes[col]) {
colSizes[col] = value.length;
}
}
}
for(var row = 0; row < rows; row++) {
for(var col = 0; col < cols; col++) {
var format = row == 0 ? bold : formats[col];
var value = array[row][col] + "";
var l = value.length;
if(align[col] == "l")
format(value);
for(; l < colSizes[col]; l++)
normal(" ");
if(align[col] == "r")
format(value);
if(col + 1 < cols)
normal(splitter || " ");
}
newline();
}
}
if(obj.hash) {
normal("Hash: ");
bold(obj.hash);
newline();
}
if(obj.time) {
normal("Time: ");
bold(obj.time);
normal("ms");
newline();
}
if(obj.assets) {
var t = [["Asset", "Size", "Chunks", "Chunk Names"]]
obj.assets.forEach(function(asset) {
t.push([
asset.name,
asset.size,
asset.chunks.join(", "),
asset.chunkNames.join(", ")
])
});
table(t, [green, normal, bold, normal], "rrrl");
}
if(obj.chunks) {
obj.chunks.forEach(function(chunk) {
normal("chunk ");
if(chunk.id < 1000) normal(" ");
if(chunk.id < 100) normal(" ");
if(chunk.id < 10) normal(" ");
normal("{");
yellow(chunk.id);
normal("} ");
green(chunk.files.join(", "));
if(chunk.names && chunk.names.length > 0) {
normal(" (");
normal(chunk.names.join(", "));
normal(")");
}
normal(" ");
normal(chunk.size);
chunk.parents.forEach(function(id) {
normal(" ");
normal("{");
yellow(id);
normal("} ");
});
newline();
if(chunk.modules) {
chunk.modules.forEach(function(module) {
normal(" ");
if(module.id < 1000) normal(" ");
if(module.id < 100) normal(" ");
if(module.id < 10) normal(" ");
normal("[");
normal(module.id);
normal("] ");
bold(module.name);
normal(" ");
normal(module.size);
if(!module.cacheable) {
red(" [not cacheable]");
}
if(module.built) {
green(" [built]");
}
if(module.chunks) {
module.chunks.forEach(function(chunk) {
normal(" {");
yellow(chunk);
normal("}");
});
}
newline();
if(module.reasons) {
module.reasons.forEach(function(reason) {
normal(" ");
normal(reason.type);
normal(" ");
cyan(reason.userRequest);
normal(" [");
normal(reason.moduleId);
normal("] ");
magenta(reason.module);
if(reason.loc) {
normal(" ");
normal(reason.loc)
}
newline();
});
}
});
}
});
}
if(obj.modules) {
obj.modules.forEach(function(module) {
if(module.id < 1000) normal(" ");
if(module.id < 100) normal(" ");
if(module.id < 10) normal(" ");
normal("[");
normal(module.id);
normal("] ");
(module.size >= 0 ? bold : normal)(module.name);
normal(" ");
normal(module.size);
if(!module.cacheable) {
red(" [not cacheable]");
}
if(module.built) {
green(" [built]");
}
if(module.chunks) {
module.chunks.forEach(function(chunk) {
normal(" {");
yellow(chunk);
normal("}");
});
}
newline();
if(module.reasons) {
module.reasons.forEach(function(reason) {
normal(" ");
normal(reason.type);
normal(" ");
cyan(reason.userRequest);
normal(" [");
normal(reason.moduleId);
normal("] ");
magenta(reason.module);
if(reason.loc) {
normal(" ");
normal(reason.loc)
}
newline();
});
}
});
}
if(obj.warnings) {
obj.warnings.forEach(function(warning) {
newline();
yellow("WARNING in " + warning);
newline();
});
}
if(obj.errors) {
obj.errors.forEach(function(error) {
newline();
red("ERROR in " + error);
newline();
});
}
if(obj.children) {
obj.children.forEach(function(child) {
normal("Child ");
bold(child.name);
normal(":");
newline();
buf.push(" ");
buf.push(Stats.jsonToString(child, useColors).replace(/\n/g, "\n "));
});
}
while(buf[buf.length-1] === "\n") buf.pop();
return buf.join("");
};

55
lib/UglifyJsPlugin.js Normal file
View File

@ -0,0 +1,55 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RawSource = require("webpack-core/lib/RawSource");
var uglify = require("uglify-js");
function UglifyJsPlugin(options) {
if(typeof options != "object") options = {};
if(typeof options.compressor == "undefined") {
options.compressor = {
warnings: false
}
}
this.options = options;
}
module.exports = UglifyJsPlugin;
UglifyJsPlugin.prototype.apply = function(compiler) {
var options = this.options;
compiler.plugin("compilation", function(compilation) {
compilation.plugin("optimize-chunk-assets", function(chunks, callback) {
var files = [];
chunks.forEach(function(chunk) {
chunk.files.forEach(function(file) {
files.push(file);
});
});
files.forEach(function(file) {
try {
var input = compilation.assets[file].source();
var ast = uglify.parse(input, {
filename: file
});
ast.figure_out_scope()
if(options.compressor !== false) {
var compressor = uglify.Compressor(options.compressor);
ast = ast.transform(compressor);
ast.figure_out_scope();
ast.compute_char_frequency(options.mangle || {});
ast.mangle_names(options.mangle || {});
}
var source = ast.print_to_string({
comments: options.comments || /^\**!|@preserve|@license/,
beautify: options.beautify
});
compilation.assets[file] = new RawSource(source);
} catch(err) {
err.file = file;
compilation.warnings.push(err);
}
});
callback();
});
});
};

View File

@ -0,0 +1,31 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var RawSource = require("webpack-core/lib/RawSource");
function WebWorkerChunkTemplate(outputOptions) {
this.outputOptions = outputOptions || {};
}
module.exports = WebWorkerChunkTemplate;
WebWorkerChunkTemplate.prototype.render = function(chunk, moduleTemplate, dependencyTemplates) {
var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || ""));
var buf = [];
buf.push(chunkCallbackName + "({\n");
chunk.modules.forEach(function(module, idx) {
if(idx != 0) buf.push(",\n");
buf.push("\n/***/ " + module.id + ":\n");
var source = moduleTemplate.render(module, dependencyTemplates);
buf.push(source.source());
});
buf.push("\n\n})");
return new RawSource(buf.join(""));
};
WebWorkerChunkTemplate.prototype.updateHash = function(hash) {
hash.update("webworker");
hash.update("1");
hash.update(this.outputOptions.chunkCallbackName + "");
hash.update(this.outputOptions.library + "");
};

View File

@ -0,0 +1,85 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var StringSource = require("webpack-core/lib/RawSource");
function WebWorkerMainTemplate(outputOptions) {
this.outputOptions = outputOptions || {};
}
module.exports = WebWorkerMainTemplate;
var REGEXP_HASH = /\[hash\]/i;
var REGEXP_NAME = /\[name\]/g;
var REGEXP_ID = /\[id\]/i;
WebWorkerMainTemplate.prototype.render = function(hash, chunk, moduleTemplate, dependencyTemplates) {
var chunkCallbackName = this.outputOptions.chunkCallbackName || ("webpackChunk" + (this.outputOptions.library || ""));
var publicPath = this.outputOptions.publicPath || "";
var filename = this.outputOptions.filename || "bundle.js";
var chunkFilename = this.outputOptions.chunkFilename || "[id]." + filename;
var buf = [];
function addLine(indent, line) {
buf.push("/******/ ");
for(var i = 0; i < indent; i++)
buf.push("\t");
buf.push(line);
buf.push("\n");
}
function addRequireFunc(i) {
addLine(i+0, "function require(moduleId) {");
addLine(i+1, "if(typeof moduleId !== \"number\") throw new Error(\"Cannot find module '\"+moduleId+\"'\");");
addLine(i+1, "if(installedModules[moduleId])");
addLine(i+2, "return installedModules[moduleId].exports;");
addLine(i+1, "var module = installedModules[moduleId] = {");
addLine(i+2, "exports: {},");
addLine(i+2, "id: moduleId,");
addLine(i+2, "loaded: false");
addLine(i+1, "};");
addLine(i+1, "modules[moduleId].call(null, module, module.exports, require);");
addLine(i+1, "module.loaded = true;");
addLine(i+1, "return module.exports;");
addLine(i+0, "}");
}
addLine(0, "(function webpackBootstrap(modules) {");
addLine(1, "var installedModules = {};");
addRequireFunc(1);
addLine(1, "require.e = function requireEnsure(chunkId, callback) {");
if(chunk.chunks.length == 0) {
addLine(2, "callback.call(null, require);");
} else {
addLine(2, "if(installedChunks[chunkId] === 1) return callback.call(null, require);");
addLine(2, "importScripts(" + JSON.stringify(chunkFilename.replace(REGEXP_HASH, hash).replace(REGEXP_NAME, "")).replace(REGEXP_ID, "\"+chunkId+\"") + ");");
addLine(2, "callback.call(null, require);");
}
addLine(1, "};");
addLine(1, "require.modules = modules;");
addLine(1, "require.cache = installedModules;");
if(chunk.chunks.length > 0) {
addLine(1, "var installedChunks = {0:1};");
addLine(1, "this[" + JSON.stringify(chunkCallbackName) + "] = function webpackChunkCallback(moreModules) {");
addLine(2, "for(var moduleId in moreModules)");
addLine(3, "modules[moduleId] = moreModules[moduleId];");
addLine(1, "};");
}
addLine(1, "return require(0);");
addLine(0, "})({");
addLine(0, "c: " + JSON.stringify(publicPath.replace(REGEXP_HASH, hash)) + ",");
chunk.modules.forEach(function(module, idx) {
if(idx != 0) buf.push(",\n");
buf.push("\n/***/ " + module.id + ":\n");
var source = moduleTemplate.render(module, dependencyTemplates);
buf.push(source.source());
});
buf.push("\n");
addLine(0, "})");
return new StringSource(buf.join(""));
};
WebWorkerMainTemplate.prototype.updateHash = function(hash) {
hash.update("webworker");
hash.update("1");
hash.update(this.outputOptions.publicPath + "");
hash.update(this.outputOptions.filename + "");
hash.update(this.outputOptions.chunkFilename + "");
hash.update(this.outputOptions.chunkCallbackName + "");
};

View File

@ -0,0 +1,21 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var WebWorkerMainTemplate = require("./WebWorkerMainTemplate");
var WebWorkerChunkTemplate = require("./WebWorkerChunkTemplate");
function WebWorkerTemplatePlugin(options) {
this.options = options;
}
module.exports = WebWorkerTemplatePlugin;
WebWorkerTemplatePlugin.prototype.apply = function(compiler) {
var options = this.options;
compiler.mainTemplate = new WebWorkerMainTemplate(options);
compiler.chunkTemplate = new WebWorkerChunkTemplate(options);
compiler.plugin("compilation", function(compilation) {
compilation.plugin("normal-module-loader", function(loaderContext) {
loaderContext.target = "webworker";
});
});
};

126
lib/WebpackOptionsApply.js Normal file
View File

@ -0,0 +1,126 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var OptionsApply = require("./OptionsApply");
var FunctionModulePlugin = require("./FunctionModulePlugin");
var JsonpTemplatePlugin = require("./JsonpTemplatePlugin");
var EvalDevToolModulePlugin = require("./EvalDevToolModulePlugin");
var LibraryTemplatePlugin = require("./LibraryTemplatePlugin");
var SingleEntryPlugin = require("./SingleEntryPlugin");
var CachePlugin = require("./CachePlugin");
var UglifyJsPlugin = require("./UglifyJsPlugin");
var ConsolePlugin = require("./ConsolePlugin");
var APIPlugin = require("./APIPlugin");
var ConstPlugin = require("./ConstPlugin");
var CompatibilityPlugin = require("./CompatibilityPlugin");
var CommonJsPlugin = require("./dependencies/CommonJsPlugin");
var AMDPlugin = require("./dependencies/AMDPlugin");
var RequireContextPlugin = require("./dependencies/RequireContextPlugin");
var RequireEnsurePlugin = require("./dependencies/RequireEnsurePlugin");
var LimitChunkCountPlugin = require("./optimize/LimitChunkCountPlugin");
var RemoveParentModulesPlugin = require("./optimize/RemoveParentModulesPlugin");
var RemoveEmptyChunksPlugin = require("./optimize/RemoveEmptyChunksPlugin");
var MergeDuplicateChunksPlugin = require("./optimize/MergeDuplicateChunksPlugin");
var ModulesInDirectoriesPlugin = require("enhanced-resolve/lib/ModulesInDirectoriesPlugin");
var ModuleTemplatesPlugin = require("enhanced-resolve/lib/ModuleTemplatesPlugin");
var ModuleAsFilePlugin = require("enhanced-resolve/lib/ModuleAsFilePlugin");
var ModuleAsDirectoryPlugin = require("enhanced-resolve/lib/ModuleAsDirectoryPlugin");
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
var DirectoryDefaultFilePlugin = require("enhanced-resolve/lib/DirectoryDefaultFilePlugin");
var DirectoryDescriptionFilePlugin = require("enhanced-resolve/lib/DirectoryDescriptionFilePlugin");
var FileAppendPlugin = require("enhanced-resolve/lib/FileAppendPlugin");
var DirectoryResultPlugin = require("enhanced-resolve/lib/DirectoryResultPlugin");
function WebpackOptionsApply() {
OptionsApply.call(this);
}
module.exports = WebpackOptionsApply;
WebpackOptionsApply.prototype = Object.create(OptionsApply.prototype);
WebpackOptionsApply.prototype.process = function(options, compiler) {
if(options.plugins && Array.isArray(options.plugins)) {
compiler.apply.apply(compiler, options.plugins);
}
compiler.outputPath = options.output.path;
compiler.apply(
new JsonpTemplatePlugin(options.output),
new FunctionModulePlugin(options.context, options.output)
);
if(options.output.library || options.output.libraryTarget != "var")
compiler.apply(new LibraryTemplatePlugin(options.output.library, options.output.libraryTarget));
if(options.devtool == "eval")
compiler.apply(new EvalDevToolModulePlugin());
if(typeof options.entry == "string") {
compiler.apply(new SingleEntryPlugin(options.context, options.entry, "main"));
} else if(typeof options.entry == "object") {
Object.keys(options.entry).forEach(function(name) {
compiler.apply(new SingleEntryPlugin(options.context, options.entry[name], name));
});
}
compiler.apply(
new CompatibilityPlugin(),
new APIPlugin(),
new ConstPlugin(),
new RequireEnsurePlugin(),
new RequireContextPlugin(options.resolve.modulesDirectories, options.resolve.extensions),
new AMDPlugin(options.amd || {}),
new CommonJsPlugin()
);
if(options.console)
compiler.apply(new ConsolePlugin());
compiler.apply(
new RemoveParentModulesPlugin(),
new RemoveEmptyChunksPlugin(),
new MergeDuplicateChunksPlugin()
);
if(options.optimize && options.optimize.maxChunks)
compiler.apply(new LimitChunkCountPlugin(options.optimize));
if(options.optimize.minimize === true)
compiler.apply(new UglifyJsPlugin());
else if(options.optimize.minimize)
compiler.apply(new UglifyJsPlugin(options.optimize.minimize));
if(options.cache === undefined ? options.watch : options.cache)
compiler.apply(new CachePlugin(typeof options.cache == "object" ? options.cache : null));
compiler.applyPlugins("after-plugins", compiler);
compiler.resolvers.normal.apply(
new ModuleAliasPlugin(options.resolve.alias),
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryDescriptionFilePlugin("package.json", ["webpack", "browserify", "web", ["jam", "main"], "main"]),
new DirectoryDefaultFilePlugin(["index"]),
new FileAppendPlugin(options.resolve.extensions)
);
compiler.resolvers.context.apply(
new ModuleAliasPlugin(options.resolve.alias),
new ModulesInDirectoriesPlugin("module", options.resolve.modulesDirectories),
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryResultPlugin()
);
compiler.resolvers.loader.apply(
new ModuleAliasPlugin(options.resolveLoader.alias),
new ModulesInDirectoriesPlugin("loader-module", options.resolveLoader.modulesDirectories),
new ModuleTemplatesPlugin("loader-module", options.resolveLoader.moduleTemplates, "module"),
new ModuleAsFilePlugin("module"),
new ModuleAsDirectoryPlugin("module"),
new DirectoryDescriptionFilePlugin("package.json", ["webpackLoader", "webLoader", "loader", "main"]),
new DirectoryDefaultFilePlugin(["index"]),
new FileAppendPlugin(options.resolveLoader.extensions)
);
compiler.applyPlugins("after-resolvers", compiler);
return options;
}

View File

@ -0,0 +1,44 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var OptionsDefaulter = require("./OptionsDefaulter");
var path = require("path");
function WebpackOptionsDefaulter(str) {
OptionsDefaulter.call(this);
this.set("debug", false);
this.set("devtool", false);
this.set("minimize", true);
this.set("context", process.cwd());
this.set("output", {});
this.set("optimize", {});
this.set("resolve", {});
this.set("resolveLoader", {});
this.set("output.libraryTarget", "var");
this.set("output.path", "");
this.set("resolve.modulesDirectories", ["web_modules", "node_modules"]);
this.set("resolveLoader.modulesDirectories", ["web_loaders", "web_modules", "node_loaders", "node_modules"]);
this.set("resolveLoader.moduleTemplates", ["*-webpack-loader", "*-web-loader", "*-loader", "*"]);
this.set("resolve.alias", {});
this.set("resolveLoader.alias", {});
this.set("resolve.extensions", ["", ".webpack.js", ".web.js", ".js"]);
this.set("resolveLoader.extensions", ["", ".webpack-loader.js", ".web-loader.js", ".loader.js", ".js"]);
this.set("resolve.resourceModulesDirectories", ["web_modules", "node_modules"]);
this.set("resolve.packageMains", ["webpack", "main"]);
this.set("resolve.loaderModulesDirectories", ["web_loaders", "web_modules", "node_modules"]);
this.set("resolve.loaderPostfixes", ["-webpack-web-loader", "-webpack-loader", "-web-loader", "-loader", ""]);
this.set("resolve.loaderExtensions", [".webpack-web-loader.js", ".webpack-loader.js", ".web-loader.js", ".loader.js", "", ".js"]);
this.set("resolve.loaderPackageMains", ["webpackLoader", "webLoader", "loader", "main"]);
}
module.exports = WebpackOptionsDefaulter;
WebpackOptionsDefaulter.prototype = Object.create(OptionsDefaulter.prototype);

24
lib/WrapSource.js Normal file
View File

@ -0,0 +1,24 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Source = require("webpack-core/lib/Source");
function WrapSource(prefix, source, postfix) {
Source.call(this);
this.prefix = prefix;
this._source = source;
this.postfix = postfix;
}
module.exports = WrapSource;
WrapSource.prototype = Object.create(Source.prototype);
WrapSource.prototype._bake = function() {
var prefix = this.prefix.source();
var source = this._source.source();
var postfix = this.postfix.source();
return {
source: prefix + source + postfix
}
};

View File

@ -1,852 +0,0 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var resolve = require("enhanced-resolve");
var execLoaders = require("enhanced-require/lib/execLoaders");
var matchRegExpObject = require("enhanced-resolve/lib/matchRegExpObject");
var buildModule = require("./buildModule");
var fs = require("fs");
var path = require("path");
var assert = require("assert");
/**
* @param context: current directory
* @param mainModule: the entrance module
* @param options: options
* @param callback: function(err, result)
*/
module.exports = function buildDeps(context, mainModule, options, callback) {
if(!callback) {
callback = options;
options = {};
}
// options.events mock for tests
if(!options) options = {};
if(!options.events) options.events = { emit: function() {} };
// create data structure
var depTree = {
warnings: [],
errors: [],
modules: {},
modulesById: {},
chunks: {},
chunkCount: 0,
nextModuleId: 0,
nextChunkId: 1,
chunkModules: {} // used by checkObsolete
}
// some progress info
options.events.emit("task", "build modules");
options.events.emit("task", "build chunks");
options.events.emit("task", "optimize");
options.events.emit("task", "cleanup");
// add the entrance file as module
// all other stuff is added recursivly
addModule(depTree, context, mainModule, options, {type: "main"}, function(err, id) {
if(err) {
if(depTree.modulesById[0]) {
depTree.errors.push("Entry module failed!\n " + err +
"\n @ " + mainModule);
id = 0;
} else {
return callback(err);
}
}
buildTree(id);
});
// enhance the tree
function buildTree(mainModuleId) {
options.events.emit("task-end", "build modules");
// split the modules into chunks
depTree.modulesById[mainModuleId].name = "main";
addChunk(depTree, depTree.modulesById[mainModuleId], options);
// rename the module ids after a defined sheme
createRealIds(depTree, options);
options.events.emit("task-end", "build chunks");
for(var chunkId in depTree.chunks) {
// remove modules which are included in parent chunk
removeParentsModules(depTree, depTree.chunks[chunkId]);
// remove duplicate and empty chunks
checkObsolete(depTree, depTree.chunks[chunkId]);
}
if(options.maxChunks) {
while(depTree.chunkCount > options.maxChunks) {
if(!removeOneChunk(depTree, options, true))
break;
}
}
createRealChunkIds(depTree, options);
options.events.emit("task-end", "optimize");
// cleanup temporary stuff
delete depTree.chunkModules;
depTree.modulesByFile = depTree.modules;
depTree.modules = depTree.modulesById;
delete depTree.modulesById;
delete depTree.nextModuleId;
delete depTree.nextChunkId;
// return
options.events.emit("task-end", "cleanup");
callback(null, depTree);
}
}
function addModule(depTree, context, modu, options, reason, finalCallback) {
var profile = options.profile && {
start: new Date()
};
options.events.emit("task");
function callback(err, result) {
options.events.emit("task-end");
if(profile && profile.module) {
profile.end = new Date();
if(profile.buildModule) {
profile.module.profile = {
time: profile.end - profile.start,
timeResolve: profile.resolveEnd - profile.start,
timeResolvePrePostLoaders: profile.resolvePrePostLoadersEnd - profile.resolveEnd,
timeLoadersCheck: profile.loadersCheckEnd - profile.resolvePrePostLoadersEnd,
timeBuildWaiting: (profile.buildModuleEnd - profile.loadersCheckEnd) - (profile.buildModule.end - profile.buildModule.start),
timeBuildModule: profile.buildModule.end - profile.buildModule.start,
timeBuildModuleRead: profile.buildModule.readEnd - profile.buildModule.start,
timeBuildModulePreLoaders: profile.buildModule.preLoadersEnd - profile.buildModule.readEnd,
timeBuildModuleLoaders: profile.buildModule.loadersEnd - profile.buildModule.preLoadersEnd,
timeBuildModulePostLoaders: profile.buildModule.postLoadersEnd - profile.buildModule.loadersEnd,
timeBuildModuleParse: profile.buildModule.end - profile.buildModule.postLoadersEnd,
timeChildren: profile.end - profile.buildModuleEnd
}
}
}
finalCallback(err, result);
}
// resolve the filename of the required module
var resolveFunc = !options.workersNoResolve && options.workers && options.workers.ready() ?
separateResolve :
resolve;
resolveFunc(context = context || path.dirname(modu), modu, options.resolve, resolved);
function resolved(err, request) {
if(err) {
callback(err);
return;
}
// check if the module is already included
if(depTree.modules[request]) {
depTree.modules[request].reasons.push(reason);
callback(null, depTree.modules[request].id);
} else {
profile && (profile.resolveEnd = new Date());
// create a new module
var modu = depTree.modules[request] = {
id: depTree.nextModuleId++,
request: request,
reasons: [reason]
};
depTree.modulesById[modu.id] = modu;
profile && (profile.module = modu);
var requestObj = resolve.parse(request);
if(options.cache) {
options.cache.get(request, function(err, cachedData) {
if(err) return readFile();
if(profile) {
profile.buildModuleEnd = profile.loadersCheckEnd = profile.resolvePrePostLoadersEnd = new Date()
}
modu.fromCache = true;
cachedData = JSON.parse(cachedData);
modu.dependencies = cachedData.dependencies;
modu.loaders = cachedData.loaders;
processParsedJs(cachedData.source, cachedData.deps);
});
} else
readFile();
// Read the file and process it with loaders
// [this step is cached]
function readFile() {
// match pre and post loaders from resource
var preLoaders = options.preLoaders && requestObj.resource && requestObj.resource.path ? matchLoadersList(options.preLoaders) : "";
var postLoaders = options.postLoaders && requestObj.resource && requestObj.resource.path ? matchLoadersList(options.postLoaders) : "";
// get the current function for loader resolving
var resolveLoadersFunc = !options.workersNoResolve && options.workers && options.workers.ready() ?
separateResolveLoaders :
resolve.loaders;
// resolve preLoaders
if(preLoaders) resolveLoadersFunc(context, preLoaders, options.resolve, onPreLoadersResolved);
else onPreLoadersResolved(null, []);
function onPreLoadersResolved(err, preLoaders) {
if(err) return callback(err);
// resolve postLoaders
if(postLoaders) resolveLoadersFunc(context, postLoaders, options.resolve, onPostLoadersResolved);
else onPostLoadersResolved(null, []);
function onPostLoadersResolved(err, postLoaders) {
if(err) return callback(err);
profile && (profile.resolvePrePostLoadersEnd = new Date());
// put all loaders in a list
var allLoaders = [];
if(preLoaders.length > 0)
allLoaders.push.apply(allLoaders, preLoaders = preLoaders.map(resolve.parse.part));
if(requestObj.loaders && requestObj.loaders.length > 0)
allLoaders.push.apply(allLoaders, requestObj.loaders);
if(postLoaders.length > 0)
allLoaders.push.apply(allLoaders, postLoaders = postLoaders.map(resolve.parse.part));
// store the list in the module
modu.loaders = allLoaders.map(function(l) { return l.path; });
// and put premature dependencies into module (in case of loader error)
modu.dependencies = requestObj.resource &&
requestObj.resource.path &&
[requestObj.resource.path] ||
[];
// check if it is possible to separate the process
var separate = !!(options.workers &&
options.workers.ready() &&
allLoaders.length >= (options.workerMinLoaders || 0));
try {
for(var i = 0; i < allLoaders.length && separate; i++) {
var loaderFilename = allLoaders[i].path;
var loader = require(loaderFilename);
if(!(loader.separable || loader.seperable) &&
(!(loader.separableIfResolve || loader.seperableIfResolve) || options.workersNoResolve))
separate = false;
}
} catch(e) {
// Syntax error in loader
return callback(e);
}
modu.separate = separate;
var buildModuleStart = new Date();
profile && (profile.loadersCheckEnd = buildModuleStart);
(separate ? separateBuildModule : buildModule)(
context, request,
preLoaders, requestObj.loaders || [], postLoaders,
requestObj,
options, function(err, extraResults, source, deps) {
var dependencyInfo = extraResults && extraResults.dependencyInfo;
if(dependencyInfo) modu.dependencies = dependencyInfo.files; // It my be also supplied if err is set.
if(extraResults && extraResults.warnings && extraResults.warnings.length > 0) {
extraResults.warnings.forEach(function(w) {
depTree.warnings.push(w + "\n @ loader @ " + request);
});
modu.warnings = extraResults.warnings;
}
if(extraResults && extraResults.errors && extraResults.errors.length > 0) {
extraResults.errors.forEach(function(e) {
depTree.errors.push(e + "\n @ loader @ " + request);
});
modu.errors = extraResults.errors;
}
if(err) {
modu.error = err;
return callback(err);
}
if(profile) {
profile.buildModule = extraResults.profile;
profile.buildModuleEnd = new Date();
}
if(dependencyInfo.cacheable && options.cache) {
modu.toCache = true;
options.cache.store(request, dependencyInfo.files, buildModuleStart, JSON.stringify({
deps: deps,
source: source,
dependencies: dependencyInfo.files,
loaders: allLoaders.map(function(l) { return l.path; })
}));
}
return processParsedJs(source, deps);
});
}
}
}
function matchLoadersList(list) {
return list.filter(function(item) {
return matchRegExpObject(item, requestObj.resource.path);
}).map(function(item) {
return item.loader || item.loaders.join("!");
}).join("!");
}
// process the final parsed javascript code
function processParsedJs(source, deps) {
modu.requires = deps.requires || [];
modu.asyncs = deps.asyncs || [];
modu.contexts = deps.contexts || [];
modu.source = source;
var requires = {}, directRequire = {};
var contexts = [], directContexts = {};
function add(r) {
if(!r.name) return;
requires[r.name] = requires[r.name] || [];
requires[r.name].push(r);
}
function addContext(m) {
return function(c) {
contexts.push({context: c, module: m});
}
}
if(modu.requires) {
modu.requires.forEach(add);
modu.requires.forEach(function(r) {
if(!r.name) return;
directRequire[r.name] = true;
});
}
if(modu.contexts) {
modu.contexts.forEach(addContext(modu));
modu.contexts.forEach(function(c) {
directContexts[c.name] = true;
});
}
if(modu.asyncs)
modu.asyncs.forEach(function addAsync(c) {
if(c.requires)
c.requires.forEach(add);
if(c.asyncs)
c.asyncs.forEach(addAsync);
if(c.contexts)
c.contexts.forEach(addContext(c));
});
var requiresNames = Object.keys(requires);
var count = requiresNames.length + contexts.length + 1;
var errors = [];
var requireContext = requestObj.resource &&
requestObj.resource.path &&
path.dirname(requestObj.resource.path) ||
context;
if(requiresNames.length)
requiresNames.forEach(function(moduleName) {
var reason = {
type: "require",
async: !directRequire[moduleName] || undefined,
count: requires[moduleName].length,
request: request,
filename: requestObj.resource && requestObj.resource.path
};
// create or get the module for each require
addModule(depTree, requireContext, moduleName, options, reason, function(err, moduleId) {
if(err) {
var error = false;
requires[moduleName].forEach(function(requireItem) {
if(!requireItem.inTry)
error = true;
});
(error ? depTree.errors : depTree.warnings).push("Cannot find module '" + moduleName + "'\n " + err +
"\n @ " + request + " (line " + requires[moduleName][0].line + ", column " + requires[moduleName][0].column + ")");
} else {
requires[moduleName].forEach(function(requireItem) {
requireItem.id = moduleId;
});
}
endOne();
});
});
if(contexts) {
contexts.forEach(function(contextObj) {
var context = contextObj.context;
var module = contextObj.module;
var reason = {
type: "context",
async: !directContexts[context.name] || undefined,
request: request,
filename: requestObj.resource && requestObj.resource.path
};
// create of get the context module for each require.context
addContextModule(depTree, requireContext, context.name, options, reason, function(err, contextModuleId) {
if(err) {
depTree.errors.push("Cannot find context '"+context.name+"'\n " + err +
"\n @ " + request + " (line " + context.line + ", column " + context.column + ")");
} else {
context.id = contextModuleId;
module.requires.push({id: context.id});
}
endOne();
});
if(context.warn) {
depTree.warnings.push(request + " (line " + context.line + ", column " + context.column + "): " +
"implicit use of require.context(\".\") is not recommended.");
}
});
}
endOne();
function endOne() {
count--;
assert(count >= 0);
if(count === 0) {
if(errors.length) {
callback(errors.join("\n"));
} else {
options.events.emit("module", modu, requestObj.resource && requestObj.resource.path);
callback(null, modu.id);
}
}
}
}
}
}
function separateBuildModule(context, requestObj,
preLoaders, loaders, postLoaders,
filename, options, callback) {
var opt = {};
Object.keys(options).forEach(function(name) {
if(name == "internal") return;
if(name == "events") return;
if(name == "workers") return;
opt[name] = options[name];
});
options.workers.run("buildModule", context, requestObj,
preLoaders, loaders, postLoaders,
filename, opt, function(err, extraResults, source, deps) {
if(err) err = {
message: err.message,
stack: err.stack,
_toString: err._toString,
toString: function() {
return this._toString
}
}
callback(err, extraResults, source, deps);
});
}
function separateResolve() {
var args = Array.prototype.slice.call(arguments, 0);
args.unshift("resolve");
var callback = args.pop();
args.push(function(err, filename) {
if(err) err = {
message: err.message,
stack: err.stack,
_toString: err._toString,
toString: function() {
return this._toString
}
}
callback(err, filename);
});
options.workers.run.apply(options.workers, args);
}
function separateResolveLoaders() {
var args = Array.prototype.slice.call(arguments, 0);
args.unshift("resolve.loaders");
var callback = args.pop();
args.push(function(err, loaders) {
if(err) err = {
message: err.message,
stack: err.stack,
_toString: err._toString,
toString: function() {
return this._toString
}
}
callback(err, loaders);
});
options.workers.run.apply(options.workers, args);
}
}
function addContextModule(depTree, context, contextModuleName, options, reason, finalCallback) {
options.events.emit("task");
function callback(err, result) {
options.events.emit("task-end");
finalCallback(err, result);
}
// resolve the filename of the required context
resolve.context(context, contextModuleName, options.resolve, resolved);
function resolved(err, dirname) {
if(err) {
callback(err);
return;
}
// check if the context is already included
if(depTree.modules[dirname]) {
depTree.modules[dirname].reasons.push(reason);
callback(null, depTree.modules[dirname].id);
} else {
// create a new context
var contextModule = depTree.modules[dirname] = {
name: contextModuleName,
dirname: dirname,
id: depTree.nextModuleId++,
requireMap: {},
requires: [],
reasons: [reason]
};
depTree.modulesById[contextModule.id] = contextModule;
// split the loaders from the require
var contextModuleNameWithLoaders = dirname;
var loaders = dirname.split(/!/g);
dirname = loaders.pop();
options.events.emit("context-enum", contextModule, dirname);
var prependLoaders = loaders.length === 0 ? "" : loaders.join("!") + "!";
var extensions = (options.resolve && options.resolve.extensions) || [""];
// iterate all files in directory
function doDir(dirname, moduleName, done) {
fs.readdir(dirname, function(err, list) {
if(err) {
done(err);
} else {
var count = list.length + 1;
var errors = [];
function endOne(err) {
if(err) {
errors.push(err);
}
count--;
assert(count >= 0);
if(count == 0) {
if(errors.length > 0)
done(errors.join("\n"));
else
done();
}
}
list.forEach(function(file) {
var filename = path.join(dirname, file);
fs.stat(filename, function(err, stat) {
if(err) {
errors.push(err);
endOne();
} else {
if(stat.isDirectory()) {
// modules directories are excluded
if(options.resolve.modulesDirectories.indexOf(file) >= 0)
endOne();
else
doDir(filename, moduleName + "/" + file, endOne);
} else {
var match = false;
if(loaders.length === 0)
extensions.forEach(function(ext) {
if(file.substr(file.length - ext.length) === ext)
match = true;
});
if(!match && loaders.length === 0) {
endOne();
return;
}
var modulereason = {
type: "context",
async: reason.async,
dirname: contextModuleNameWithLoaders,
filename: reason.filename
};
// add each file as module
addModule(depTree, dirname, prependLoaders + filename, options, modulereason, function(err, moduleId) {
if(err) {
depTree.warnings.push("A file in context was excluded because of error: " + err);
endOne();
} else {
contextModule.requires.push({id: moduleId});
// store the module id in a require map
// when generating the source it is included
contextModule.requireMap[moduleName + "/" + file] = moduleId;
endOne();
}
});
}
}
});
});
endOne();
}
});
}
doDir(dirname, ".", function(err) {
if(err) {
callback(err);
return;
}
options.events.emit("context", contextModule, dirname);
callback(null, contextModule.id);
});
}
}
}
// rename the module ids after a defined sheme
function createRealIds(depTree, options) {
var sortedModules = [];
for(var id in depTree.modulesById) {
if(""+id === "0") continue;
var modu = depTree.modulesById[id];
var usages = 1;
modu.reasons.forEach(function(reason) {
usages += reason.count ? reason.count : 1;
});
modu.usages = usages;
sortedModules.push(modu);
}
depTree.modulesById[0].realId = 0;
sortedModules.sort(function(a, b) {
if(a.chunks && b.chunks &&
(a.chunks.indexOf("main") !== -1 || b.chunks.indexOf("main") !== -1)) {
if(a.chunks.indexOf("main") === -1)
return 1;
if(b.chunks.indexOf("main") === -1)
return -1;
}
var diff = b.usages - a.usages;
if(diff !== 0) return diff;
if(typeof a.request === "string" || typeof b.request === "string") {
if(typeof a.request !== "string")
return -1;
if(typeof b.request !== "string")
return 1;
if(a.request === b.request)
return 0;
return (a.request < b.request) ? -1 : 1;
}
if(a.dirname === b.dirname)
return 0;
return (a.dirname < b.dirname) ? -1 : 1;
});
sortedModules.forEach(function(modu, idx) {
modu.realId = idx + 1;
});
}
// add a chunk
function addChunk(depTree, chunkStartpoint, options) {
var chunk;
if(chunkStartpoint && chunkStartpoint.name) {
chunk = depTree.chunks[chunkStartpoint.name];
if(chunk) {
chunk.usages++;
chunk.contexts.push(chunkStartpoint);
}
}
if(!chunk) {
chunk = {
id: (chunkStartpoint && chunkStartpoint.name) || depTree.nextChunkId++,
modules: {},
contexts: chunkStartpoint ? [chunkStartpoint] : [],
usages: 1
};
depTree.chunks[chunk.id] = chunk;
depTree.chunkCount++;
}
if(chunkStartpoint) {
chunkStartpoint.chunkId = chunk.id;
addModuleToChunk(depTree, chunkStartpoint, chunk.id, options);
}
return chunk;
}
function addModuleToChunk(depTree, context, chunkId, options) {
context.chunks = context.chunks || [];
if(context.chunks.indexOf(chunkId) === -1) {
context.chunks.push(chunkId);
if(context.id !== undefined)
depTree.chunks[chunkId].modules[context.id] = "include";
if(context.requires) {
context.requires.forEach(function(requireItem) {
if(requireItem.id)
addModuleToChunk(depTree, depTree.modulesById[requireItem.id], chunkId, options);
});
}
if(context.asyncs) {
context.asyncs.forEach(function(context) {
if(options.single) {
addModuleToChunk(depTree, context, chunkId, options);
} else {
var subChunk;
if(context.chunkId) {
subChunk = depTree.chunks[context.chunkId];
subChunk.usages++;
} else {
subChunk = addChunk(depTree, context, options);
}
subChunk.parents = subChunk.parents || [];
subChunk.parents.push(chunkId);
}
});
}
}
}
function removeParentsModules(depTree, chunk) {
if(!chunk.parents) return;
for(var moduleId in chunk.modules) {
var inParent = true;
var checkedParents = {};
chunk.parents.forEach(function checkParent(parentId) {
if(!inParent) return;
if(checkedParents[parentId]) return;
checkedParents[parentId] = true;
if(!depTree.chunks[parentId].modules[moduleId]) {
var parents = depTree.chunks[parentId].parents;
if(parents && parents.length > 0)
parents.forEach(checkParent);
else
inParent = false;
}
});
if(inParent) {
chunk.modules[moduleId] = "in-parent";
}
}
}
function checkObsolete(depTree, chunk) {
var modules = [];
for(var moduleId in chunk.modules) {
if(chunk.modules[moduleId] === "include") {
modules.push(moduleId);
}
}
if(modules.length === 0) {
chunk.contexts.forEach(function(c) { c.chunkId = null; });
chunk.empty = true;
depTree.chunkCount--;
return;
}
modules.sort();
var moduleString = modules.join(" ");
if(depTree.chunkModules[moduleString]) {
chunk.equals = depTree.chunkModules[moduleString];
chunk.contexts.forEach(function(c) {
c.chunkId = chunk.equals;
});
depTree.chunkCount--;
} else
depTree.chunkModules[moduleString] = chunk.id;
}
function moduleSize(depTree, moduleId) {
return depTree.modulesById[moduleId].source && depTree.modulesById[moduleId].source.length || 0;
}
function removeOneChunk(depTree, options, force) {
var chunks = [];
for(var chunkId in depTree.chunks) {
var chunk = depTree.chunks[chunkId];
if(!chunk.empty && !chunk.equals && chunk.id != "main") {
chunks.push(chunk);
}
}
var best = null;
chunks.forEach(function(chunkA, idxA) {
chunks.forEach(function(chunkB, idxB) {
if(idxB <= idxA) return;
var sizeSum = 60, sizeMerged = 30;
for(var moduleId in chunkA.modules) {
if(chunkA.modules[moduleId] === "include") {
var size = moduleSize(depTree, moduleId);
sizeSum += size + 10;
sizeMerged += size + 10;
}
}
for(var moduleId in chunkB.modules) {
if(chunkB.modules[moduleId] === "include") {
var size = moduleSize(depTree, moduleId);
sizeSum += size + 10;
if(chunkA.modules[moduleId] !== "include")
sizeMerged += size + 10;
}
}
var value = sizeSum - sizeMerged * (options.mergeSizeRatio === undefined ? 1.2 : options.mergeSizeRatio + 1);
if(best == null || best[0] < value)
best = [value, chunkA.id, chunkB.id];
});
});
if(!best) return false;
if(force || best[0] > 0) {
var chunk = depTree.chunks[best[1]];
chunk.equals = best[2];
chunk.contexts.forEach(function(c) {
c.chunkId = chunk.equals;
});
chunks.forEach(function(chunk) {
if(chunk.equals == best[1]) {
chunk.equals = best[2];
chunk.contexts.forEach(function(c) {
c.chunkId = chunk.equals;
});
}
});
var otherChunk = depTree.chunks[best[2]];
for(var moduleId in chunk.modules) {
if(chunk.modules[moduleId] === "include") {
otherChunk.modules[moduleId] = "include";
}
}
depTree.chunkCount--;
return true;
}
}
// rename the chunk ids after a defined sheme
function createRealChunkIds(depTree, options) {
var sortedChunks = [];
for(var id in depTree.chunks) {
if(id === "main") continue;
var chunk = depTree.chunks[id];
if(chunk.empty) continue;
if(chunk.equals !== undefined) continue;
sortedChunks.push(chunk);
}
depTree.chunks["main"].realId = 0;
sortedChunks.sort(function(a, b) {
if(a.usages < b.usages)
return -1;
if(a.usages > b.usages)
return 1;
var aCount = Object.keys(a.modules).length;
var bCount = Object.keys(b.modules).length;
if(aCount != bCount)
return aCount - bCount;
function genModulesString(modules) {
var moduleIds = [];
for(var id in modules) {
if(modules[id] === "include") {
var m = depTree.modulesById[id];
moduleIds.push(m.realId);
}
}
return moduleIds.sort().join("-");
}
var aModules = genModulesString(a.modules);
var bModules = genModulesString(b.modules);
if(aModules == bModules)
return 0;
return aModules < bModules ? -1 : 1;
});
sortedChunks.forEach(function(chunk, idx) {
chunk.realId = idx + 1;
});
}

View File

@ -1,96 +0,0 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var fs = require("fs");
var parse = require("./parse");
var resolve = require("enhanced-resolve");
var execLoaders = require("enhanced-require/lib/execLoaders");
function buildModule(context, request,
preLoaders, loaders, postLoaders,
requestObj,
options, callback) {
if(options.profile) var profile = {
start: new Date().getTime()
}
var files = requestObj.resource && requestObj.resource.path && [requestObj.resource.path] || []
var dependencyInfo = {
cacheable: true,
files: files.slice(0)
};
var extraResults = {
dependencyInfo: dependencyInfo,
profile: profile,
warnings: [],
errors: []
}
if(requestObj.resource && requestObj.resource.path)
fs.readFile(requestObj.resource.path, onFileRead);
else
onFileRead(null, null);
function onFileRead(err, content) {
if(err) return callback(err, extraResults);
profile && (profile.readEnd = new Date().getTime());
var loaderContext = {
loaders: loaders.map(resolve.stringify.part),
preLoaders: preLoaders.map(resolve.stringify.part),
postLoaders: postLoaders.map(resolve.stringify.part),
loaderType: null,
web: true,
emitWarning: function(warning) {
extraResults.warnings.push(warning);
},
emitError: function(error) {
extraResults.errors.push(error);
}
};
if(requestObj.resource)
loaderContext.resourceQuery = requestObj.resource.query;
loaderContext.loaderType = "preLoader";
execLoaders(context, request, preLoaders, files, [content], loaderContext, dependencyInfo, options,
function(err, result) {
if(err) return callback(err, extraResults);
profile && (profile.preLoadersEnd = new Date().getTime());
loaderContext.loaderType = "loader";
execLoaders(context, request, loaders, files, result, loaderContext, dependencyInfo, options,
function(err, result) {
if(err) return callback(err, extraResults);
profile && (profile.loadersEnd = new Date().getTime());
loaderContext.loaderType = "postLoader";
execLoaders(context, request, postLoaders, files, result, loaderContext, dependencyInfo, options,
function(err, result) {
if(err) return callback(err, extraResults);
profile && (profile.postLoadersEnd = new Date().getTime());
return processJs(result)
});
});
});
}
// process the result delivered from loaders or direct from file
// for inclusion into the result
// (static code analysis for requires and other stuff)
// [this step is cached]
function processJs(resultBuffers) {
var source = resultBuffers[0].toString("utf-8");
var deps;
try {
deps = parse(source, options.parse);
} catch(e) {
callback(new Error("File \"" + request + "\" parsing failed: " + e), extraResults);
return;
}
profile && (profile.end = new Date().getTime());
return callback(null, extraResults, source, deps);
}
}
module.exports = buildModule;

View File

@ -1,35 +0,0 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var path = require("path");
module.exports = function(cwd) {
var cwd = cwd;
var cwdParent = path.dirname(cwd);
var buildins = path.join(__dirname, "..");
cwd = cwd.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
cwd = new RegExp("^" + cwd + "|(!)" + cwd, "g");
var buildinsAsModule = cwd.test(buildins);
cwdParent = cwdParent.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
cwdParent = new RegExp("^" + cwdParent + "|(!)" + cwdParent, "g");
buildins = buildins.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
buildins = new RegExp("^" + buildins + "|(!)" + buildins, "g");
var node_modulesRegExpA = /\/node_modules\//g;
var node_modulesRegExpB = /\\node_modules\\/g;
var index_jsRegExp = /[\\\/]index.js!/g;
function compressFilename(filename) {
if(!filename)
return filename;
if(buildinsAsModule)
filename = filename.replace(buildins, "!(webpack)");
filename = filename.replace(cwd, "!.");
if(!buildinsAsModule)
filename = filename.replace(buildins, "!(webpack)");
filename = filename.replace(node_modulesRegExpA, "/~/");
filename = filename.replace(node_modulesRegExpB, "\\~\\");
filename = filename.replace(index_jsRegExp, "!");
return filename.replace(/^!|!$/, "");
}
return compressFilename;
}

View File

@ -0,0 +1,36 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var NullDependency = require("./NullDependency");
function AMDDefineDependency(range, arrayRange, functionRange) {
NullDependency.call(this);
this.Class = AMDDefineDependency;
this.range = range;
this.arrayRange = arrayRange;
this.functionRange = functionRange;
}
module.exports = AMDDefineDependency;
AMDDefineDependency.prototype = Object.create(NullDependency.prototype);
AMDDefineDependency.prototype.type = "amd define";
AMDDefineDependency.Template = function AMDRequireDependencyTemplate() {};
AMDDefineDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
if(dep.arrayRange && !dep.functionRange) {
source.replace(dep.range[0], dep.arrayRange[0]-1,
"module.exports = ");
source.replace(dep.arrayRange[1], dep.range[1]-1, ";");
} else if(!dep.arrayRange && dep.functionRange) {
source.replace(dep.range[0], dep.functionRange[0]-1,
"{var __WEBPACK_AMD_DEFINE_RESULT__ = (");
source.replace(dep.functionRange[1], dep.range[1]-1, "(require, exports, module)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;}");
} else if(dep.arrayRange && dep.functionRange) {
source.replace(dep.range[0], dep.arrayRange[0]-1,
"{var __WEBPACK_AMD_DEFINE_ARRAY__ = ");
source.replace(dep.arrayRange[1], dep.functionRange[0]-1, "; var __WEBPACK_AMD_DEFINE_RESULT__ = (");
source.replace(dep.functionRange[1], dep.range[1]-1, ".apply(null, __WEBPACK_AMD_DEFINE_ARRAY__)); if(__WEBPACK_AMD_DEFINE_RESULT__ !== undefined) module.exports = __WEBPACK_AMD_DEFINE_RESULT__;}");
}
};

View File

@ -0,0 +1,98 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var AbstractPlugin = require("../AbstractPlugin");
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
var ConstDependency = require("./ConstDependency");
var AMDDefineDependency = require("./AMDDefineDependency");
module.exports = AbstractPlugin.create({
"call define": function(expr) {
var array, fn;
switch(expr.arguments.length) {
case 1:
if(expr.arguments[0].type == "FunctionExpression") {
fn = expr.arguments[0];
} else {
var dep = new AMDDefineDependency(expr.range, expr.arguments[0].range);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
}
break;
case 2:
if(expr.arguments[0].type == "ArrayExpression" && expr.arguments[1].type == "FunctionExpression") {
array = expr.arguments[0];
fn = expr.arguments[1];
} else if(expr.arguments[0].type == "Literal" && expr.arguments[1].type == "FunctionExpression") {
fn = expr.arguments[1];
} else if(expr.arguments[0].type == "Literal" && expr.arguments[1].type == "ArrayExpression") {
array = expr.arguments[1];
} else if(expr.arguments[0].type == "Literal") {
var dep = new AMDDefineDependency(expr.range, expr.arguments[1].range);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
}
break;
case 3:
if(expr.arguments[0].type == "Literal" &&
expr.arguments[1].type == "ArrayExpression" &&
expr.arguments[2].type == "FunctionExpression") {
array = expr.arguments[1];
fn = expr.arguments[2];
}
break;
}
if(!array && !fn) return;
if(array) {
var param = this.evaluateExpression(array);
param.items.forEach(function(param) {
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
if(result === undefined) {
// TODO: context
}
}, this);
}
if(fn) {
var inTry = this.scope.inTry;
this.inScope(fn.params.filter(function(i) {
return ["require", "module", "exports"].indexOf(i.name) < 0;
}), function() {
this.scope.inTry = inTry;
if(fn.body.type === "BlockStatement")
this.walkStatement(fn.body);
else
this.walkExpression(fn.body);
}.bind(this));
}
var dep = new AMDDefineDependency(expr.range, array ? array.range : null, fn ? fn.range : null);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
},
"call define:amd:item": function(expr, param) {
if(param.isConditional()) {
param.options.forEach(function(param) {
var result = this.applyPluginsBailResult("call define:amd:item", expr, param);
if(result === undefined) {
// TODO: context
}
}, this);
return true;
} else if(param.isString()) {
var dep;
if(["require","exports","module"].indexOf(param.string) >= 0) {
dep = new ConstDependency(param.string, param.range);
} else {
dep = new AMDRequireItemDependency(param.string, param.range);
}
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
}
}
});

View File

@ -0,0 +1,93 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var path = require("path");
var AMDRequireDependency = require("./AMDRequireDependency");
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
var AMDDefineDependency = require("./AMDDefineDependency");
var ConstDependency = require("./ConstDependency");
var NullFactory = require("../NullFactory");
var AMDRequireDependenciesBlockParserPlugin = require("./AMDRequireDependenciesBlockParserPlugin");
var AMDDefineDependencyParserPlugin = require("./AMDDefineDependencyParserPlugin");
var ModuleAliasPlugin = require("enhanced-resolve/lib/ModuleAliasPlugin");
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
function AMDPlugin(options) {
this.options = options;
}
module.exports = AMDPlugin;
AMDPlugin.prototype.apply = function(compiler) {
var options = this.options;
compiler.plugin("compilation", function(compilation, params) {
var normalModuleFactory = params.normalModuleFactory;
var contextModuleFactory = params.contextModuleFactory;
compilation.dependencyFactories.set(AMDRequireDependency, new NullFactory());
compilation.dependencyTemplates.set(AMDRequireDependency, new AMDRequireDependency.Template());
compilation.dependencyFactories.set(AMDRequireItemDependency, normalModuleFactory);
compilation.dependencyTemplates.set(AMDRequireItemDependency, new AMDRequireItemDependency.Template());
compilation.dependencyFactories.set(AMDRequireContextDependency, contextModuleFactory);
compilation.dependencyTemplates.set(AMDRequireContextDependency, new AMDRequireContextDependency.Template());
compilation.dependencyFactories.set(AMDDefineDependency, new NullFactory());
compilation.dependencyTemplates.set(AMDDefineDependency, new AMDDefineDependency.Template());
});
new AMDRequireDependenciesBlockParserPlugin().apply(compiler.parser);
new AMDDefineDependencyParserPlugin().apply(compiler.parser);
compiler.parser.plugin("expression require.amd", function(expr) {
var dep = new AMDRequireItemDependency("!!webpack amd options", expr.range);
dep.userRequest = "require.amd";
this.state.current.addDependency(dep);
return true;
});
compiler.parser.plugin("expression define.amd", function(expr) {
var dep = new AMDRequireItemDependency("!!webpack amd options", expr.range);
dep.userRequest = "define.amd";
this.state.current.addDependency(dep);
return true;
});
compiler.parser.plugin("expression define", function(expr) {
var dep = new AMDRequireItemDependency("!!webpack amd define", expr.range);
dep.userRequest = "define";
this.state.current.addDependency(dep);
return true;
});
compiler.parser.plugin("expression __webpack_amd_options__", function(expr) {
return this.state.current.addVariable("__webpack_amd_options__", JSON.stringify(options));
});
compiler.parser.plugin("evaluate typeof define", function(expr) {
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
});
compiler.parser.plugin("typeof define", function(expr) {
var dep = new ConstDependency("'function'", expr.range);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
});
compiler.parser.plugin("evaluate typeof require", function(expr) {
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
});
compiler.parser.plugin("typeof require", function(expr) {
var dep = new ConstDependency("'function'", expr.range);
dep.loc = expr.loc;
this.state.current.addDependency(dep);
return true;
});
compiler.resolvers.normal.apply(
new ModuleAliasPlugin({
"amdefine": path.join(__dirname, "..", "..", "buildin", "amd-define.js"),
"webpack amd options": path.join(__dirname, "..", "..", "buildin", "amd-options.js"),
"webpack amd define": path.join(__dirname, "..", "..", "buildin", "amd-define.js"),
// "webpack amd require": path.join(__dirname, "..", "..", "buildin", "amd-require.js")
})
);
};

View File

@ -0,0 +1,18 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ContextDependency = require("./ContextDependency");
function AMDRequireContextDependency(request, recursive, regExp, range, valueRange) {
ContextDependency.call(this, request, recursive, regExp);
this.range = range;
this.valueRange = valueRange;
this.Class = AMDRequireContextDependency;
}
module.exports = AMDRequireContextDependency;
AMDRequireContextDependency.prototype = Object.create(ContextDependency.prototype);
AMDRequireContextDependency.prototype.type = "amd require context";
AMDRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");

View File

@ -0,0 +1,19 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var AsyncDependenciesBlock = require("../AsyncDependenciesBlock");
var AMDRequireDependency = require("./AMDRequireDependency");
function AMDRequireDependenciesBlock(expr, arrayRange, functionRange) {
AsyncDependenciesBlock.call(this, null);
this.expr = expr;
this.range = expr.range;
this.arrayRange = arrayRange;
this.functionRange = functionRange;
this.addDependency(new AMDRequireDependency(this));
}
module.exports = AMDRequireDependenciesBlock;
AMDRequireDependenciesBlock.prototype = Object.create(AsyncDependenciesBlock.prototype);

View File

@ -0,0 +1,122 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var AbstractPlugin = require("../AbstractPlugin");
var AMDRequireItemDependency = require("./AMDRequireItemDependency");
var AMDRequireContextDependency = require("./AMDRequireContextDependency");
var AMDRequireDependenciesBlock = require("./AMDRequireDependenciesBlock");
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
module.exports = AbstractPlugin.create({
"call require": function(expr) {
switch(expr.arguments.length) {
case 1:
if(expr.arguments[0].type == "FunctionExpression") {
var dep = new AMDRequireDependenciesBlock(expr, param.range, null, expr.arguments[0].range);
dep.loc = expr.loc;
var old = this.state.current;
this.state.current = dep;
this.inScope([], function() {
param.items.forEach(function(param) {
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
if(result === undefined) {
this.applyPluginsBailResult("call require:amd:context", expr, param);
}
}, this);
}.bind(this));
this.inScope(expr.arguments[0].params.filter(function(i) {
return ["require", "module", "exports"].indexOf(i.name) < 0;
}), function() {
if(expr.arguments[0].body.type === "BlockStatement")
this.walkStatement(expr.arguments[0].body);
else
this.walkExpression(expr.arguments[0].body);
}.bind(this));
this.state.current = old;
this.state.current.addBlock(dep);
return true;
}
var param = this.evaluateExpression(expr.arguments[0]);
if(param.isArray()) {
var dep = new AMDRequireDependenciesBlock(expr, param.range);
dep.loc = expr.loc;
var old = this.state.current;
this.state.current = dep;
this.inScope([], function() {
param.items.forEach(function(param) {
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
if(result === undefined) {
this.applyPluginsBailResult("call require:amd:context", expr, param);
}
}, this);
}.bind(this));
this.state.current = old;
this.state.current.addBlock(dep);
return true;
}
return;
case 2:
var param = this.evaluateExpression(expr.arguments[0]);
if(!param.isArray()) return;
if(expr.arguments[1].type !== "FunctionExpression") return;
var dep = new AMDRequireDependenciesBlock(expr, param.range, expr.arguments[1].range);
dep.loc = expr.loc;
var old = this.state.current;
this.state.current = dep;
try {
this.inScope([], function() {
param.items.forEach(function(param) {
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
if(result === undefined) {
this.applyPluginsBailResult("call require:amd:context", expr, param);
}
}, this);
}.bind(this));
this.inScope(expr.arguments[1].params.filter(function(i) {
return ["require", "module", "exports"].indexOf(i.name) < 0;
}), function() {
if(expr.arguments[1].body.type === "BlockStatement")
this.walkStatement(expr.arguments[1].body);
else
this.walkExpression(expr.arguments[1].body);
}.bind(this));
} finally {
this.state.current = old;
this.state.current.addBlock(dep);
}
return true;
}
},
"call require:amd:item": function(expr, param) {
if(param.isConditional()) {
param.options.forEach(function(param) {
var result = this.applyPluginsBailResult("call require:amd:item", expr, param);
if(result === undefined) {
// TODO: context
}
}, this);
return true;
} else if(param.isString()) {
var dep;
if(["require","exports","module"].indexOf(param.string) >= 0) {
dep = new ConstDependency(param.string, param.range);
} else {
dep = new AMDRequireItemDependency(param.string, param.range);
}
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
}
},
"call require:amd:context": function(expr, param) {
var dep = ContextDependencyHelpers.create(AMDRequireContextDependency, param.range, param);
if(!dep) return;
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
}
});

View File

@ -0,0 +1,39 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var NullDependency = require("./NullDependency");
function AMDRequireDependency(block) {
NullDependency.call(this);
this.Class = AMDRequireDependency;
this.block = block;
}
module.exports = AMDRequireDependency;
AMDRequireDependency.prototype = Object.create(NullDependency.prototype);
AMDRequireDependency.Template = function AMDRequireDependencyTemplate() {};
AMDRequireDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
var depBlock = dep.block;
if(depBlock.arrayRange && !depBlock.functionRange) {
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) {");
source.replace(depBlock.arrayRange[1], depBlock.range[1]-1, ";})");
} else if(!depBlock.arrayRange && depBlock.functionRange) {
source.replace(depBlock.range[0], depBlock.functionRange[0]-1,
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) {(");
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, "(require, exports, module));})");
} else if(depBlock.arrayRange && depBlock.functionRange) {
source.replace(depBlock.range[0], depBlock.arrayRange[0]-1,
"require.e/* require */(" + (depBlock.chunk && depBlock.chunk.id || 0) + asComment(depBlock.chunkReason) + ", function(require) { var __WEBPACK_AMD_REQUIRE_ARRAY__ = ");
source.replace(depBlock.arrayRange[1], depBlock.functionRange[0]-1, "; (");
source.replace(depBlock.functionRange[1], depBlock.range[1]-1, ".apply(null, __WEBPACK_AMD_REQUIRE_ARRAY__));})");
}
}
function asComment(str) {
if(!str) return "";
return "/* " + str + " */";
}

View File

@ -0,0 +1,17 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ModuleDependency = require("./ModuleDependency");
function AMDRequireItemDependency(request, range) {
ModuleDependency.call(this, request);
this.Class = AMDRequireItemDependency;
this.range = range;
}
module.exports = AMDRequireItemDependency;
AMDRequireItemDependency.prototype = Object.create(ModuleDependency.prototype);
AMDRequireItemDependency.prototype.type = "amd require";
AMDRequireItemDependency.Template = require("./ModuleDependencyTemplateAsRequireId");

View File

@ -0,0 +1,45 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
var RequireResolveDependency = require("./RequireResolveDependency");
var RequireResolveHeaderDependency = require("./RequireResolveHeaderDependency");
var NullFactory = require("../NullFactory");
var RequireResolveDependencyParserPlugin = require("./RequireResolveDependencyParserPlugin");
var CommonJsRequireDependencyParserPlugin = require("./CommonJsRequireDependencyParserPlugin");
var BasicEvaluatedExpression = require("../BasicEvaluatedExpression");
function CommonJsPlugin() {
}
module.exports = CommonJsPlugin;
CommonJsPlugin.prototype.apply = function(compiler) {
compiler.plugin("compilation", function(compilation, params) {
var normalModuleFactory = params.normalModuleFactory;
var contextModuleFactory = params.contextModuleFactory;
compilation.dependencyFactories.set(CommonJsRequireDependency, normalModuleFactory);
compilation.dependencyTemplates.set(CommonJsRequireDependency, new CommonJsRequireDependency.Template());
compilation.dependencyFactories.set(CommonJsRequireContextDependency, contextModuleFactory);
compilation.dependencyTemplates.set(CommonJsRequireContextDependency, new CommonJsRequireContextDependency.Template());
compilation.dependencyFactories.set(RequireResolveDependency, normalModuleFactory);
compilation.dependencyTemplates.set(RequireResolveDependency, new RequireResolveDependency.Template());
compilation.dependencyFactories.set(RequireResolveHeaderDependency, new NullFactory());
compilation.dependencyTemplates.set(RequireResolveHeaderDependency, new RequireResolveHeaderDependency.Template());
});
compiler.parser.plugin("evaluate typeof require", function(expr) {
return new BasicEvaluatedExpression().setString("function").setRange(expr.range);
});
compiler.parser.apply(
new CommonJsRequireDependencyParserPlugin(),
new RequireResolveDependencyParserPlugin()
);
};

View File

@ -0,0 +1,18 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ContextDependency = require("./ContextDependency");
function CommonJsRequireContextDependency(request, recursive, regExp, range, valueRange) {
ContextDependency.call(this, request, recursive, regExp);
this.range = range;
this.valueRange = valueRange;
this.Class = CommonJsRequireContextDependency;
}
module.exports = CommonJsRequireContextDependency;
CommonJsRequireContextDependency.prototype = Object.create(ContextDependency.prototype);
CommonJsRequireContextDependency.prototype.type = "cjs require context";
CommonJsRequireContextDependency.Template = require("./ContextDependencyTemplateAsRequireCall");

View File

@ -0,0 +1,17 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ModuleDependency = require("./ModuleDependency");
function CommonJsRequireDependency(request, range) {
ModuleDependency.call(this, request);
this.Class = CommonJsRequireDependency;
this.range = range;
}
module.exports = CommonJsRequireDependency;
CommonJsRequireDependency.prototype = Object.create(ModuleDependency.prototype);
CommonJsRequireDependency.prototype.type = "cjs require";
CommonJsRequireDependency.Template = require("./ModuleDependencyTemplateAsId");

View File

@ -0,0 +1,61 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var AbstractPlugin = require("../AbstractPlugin");
var ConstDependency = require("./ConstDependency");
var CommonJsRequireDependency = require("./CommonJsRequireDependency");
var CommonJsRequireContextDependency = require("./CommonJsRequireContextDependency");
var ContextDependencyHelpers = require("./ContextDependencyHelpers");
module.exports = AbstractPlugin.create({
"expression require.cache": function(expr) {
return true;
},
"expression require": function(expr) {
var dep = new CommonJsRequireContextDependency(".", true, /^\.\/.*$/, expr.range);
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
},
"call require": function(expr) {
if(expr.arguments.length !== 1) return;
var param = this.evaluateExpression(expr.arguments[0]);
if(param.isConditional()) {
param.options.forEach(function(param) {
var result = this.applyPluginsBailResult("call require:commonjs:item", expr, param);
if(result === undefined) {
this.applyPluginsBailResult("call require:commonjs:context", expr, param);
}
}, this);
return true;
} else {
var result = this.applyPluginsBailResult("call require:commonjs:item", expr, param);
if(result === undefined) {
this.applyPluginsBailResult("call require:commonjs:context", expr, param);
}
return true;
}
},
"call require:commonjs:item": function(expr, param) {
if(param.isString()) {
var dep = new CommonJsRequireDependency(param.string, param.range);
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
} else {
return this.applyPluginsBailResult("call require:commonjs:context", expr, param);
}
},
"call require:commonjs:context": function(expr, param) {
var dep = ContextDependencyHelpers.create(CommonJsRequireContextDependency, expr.range, param);
if(!dep) return;
dep.loc = expr.loc;
dep.optional = !!this.scope.inTry;
this.state.current.addDependency(dep);
return true;
}
});

View File

@ -0,0 +1,21 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var NullDependency = require("./NullDependency");
function ConstDependency(expression, range) {
NullDependency.call(this);
this.Class = ConstDependency;
this.expression = expression;
this.range = range;
}
module.exports = ConstDependency;
ConstDependency.prototype = Object.create(NullDependency.prototype);
ConstDependency.Template = function ConstDependencyTemplate() {};
ConstDependency.Template.prototype.apply = function(dep, source, outputOptions, requestShortener) {
source.replace(dep.range[0], dep.range[1]-1, dep.expression);
}

View File

@ -0,0 +1,24 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var Dependency = require("../Dependency");
function ContextDependency(request, recursive, regExp) {
Dependency.call(this);
this.request = request;
this.userRequest = request;
this.recursive = recursive;
this.regExp = regExp;
this.Class = ContextDependency;
}
module.exports = ContextDependency;
ContextDependency.prototype = Object.create(Dependency.prototype);
ContextDependency.prototype.isEqualResource = function(other) {
if(!(other instanceof ContextDependency))
return false;
return this.request == other.request &&
this.recursive == other.recursive &&
this.regExp == other.regExp;
};

View File

@ -0,0 +1,29 @@
/*
MIT License http://www.opensource.org/licenses/mit-license.php
Author Tobias Koppers @sokra
*/
var ContextDependencyHelpers = exports;
ContextDependencyHelpers.create = function(Dep, range, param) {
if(param.isWrapped() && param.prefix.isString()) {
var prefix = param.prefix.string;
var postfix = param.postfix.isString() ? param.postfix.string : "";
var prefixRange = param.prefix.range;
var valueRange = [prefixRange[1], param.range[1]];
var idx = prefix.lastIndexOf("/");
var context = ".";
if(idx >= 0) {
context = prefix.substr(0, idx);
prefix = "." + prefix.substr(idx);
}
var regExp = new RegExp("^" +
prefix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") +
".*" +
postfix.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&") + "$");
var dep = new Dep(context, true, regExp, range, valueRange);
dep.prepend = prefix;
return dep;
} else {
return new Dep(".", true, /^\.\/.*$/, range, param.range);
}
};

Some files were not shown because too many files have changed in this diff Show More