1+ var setterSrc = require ( "../../__set__.js" ) . toString ( ) ,
2+ getterSrc = require ( "../../__get__.js" ) . toString ( ) ,
3+ path = require ( "path" ) ,
4+ injectRewire = require ( "../injectRewire.js" ) ,
5+ getRewireRequires = require ( "../getRewireRequires.js" ) ,
6+
7+ rewireIndex = path . resolve ( __dirname , "../../index.js" ) ,
8+ settersAndGettersSrc ;
9+
10+ function browserifyMiddleware ( b ) {
11+ function doInjectRewire ( src , filename ) {
12+ var rewireRequires ;
13+
14+ // Search for all rewire() statements an return the required path.
15+ rewireRequires = getRewireRequires ( src ) ;
16+
17+ // Add all modules that are loaded by rewire() manually to browserify because browserify's
18+ // require-sniffing doesn't work here.
19+ rewireRequires . forEach ( function forEachRewireRequire ( requirePath ) {
20+ // Resolve absolute paths
21+ if ( requirePath . charAt ( 0 ) === "." ) {
22+ requirePath = path . resolve ( path . dirname ( filename ) , requirePath ) ;
23+ }
24+ b . require ( requirePath ) ;
25+ } ) ;
26+
27+ src = injectRewire ( src , filename , settersAndGettersSrc ) ;
28+
29+ return src ;
30+ }
31+
32+ function forwardBrowserifyRewire ( filename ) {
33+ if ( filename === rewireIndex ) {
34+ filename = __dirname + "/browserifyRewire.js" ;
35+ }
36+
37+ return filename ;
38+ }
39+
40+ // Register file handler
41+ b . register ( ".js" , doInjectRewire ) ;
42+ b . register ( "path" , forwardBrowserifyRewire ) ;
43+
44+ return b ;
45+ }
46+
47+ /**
48+ * This string gets injected at the beginning of every module. Its purpose is to
49+ * - register the setters and getters according to the module's filename
50+ * - override the internal require with a require proxy.
51+ *
52+ * @private
53+ * @type {String }
54+ */
55+ settersAndGettersSrc = (
56+ 'var rewire = require("rewire"); ' +
57+ // Registers the setters and getters of every module according to their filename. The setters and getters must be
58+ // injected as string here to gain access to the private scope of the module.
59+ 'rewire.register(__filename, module, ' + setterSrc + ', ' + getterSrc + ');' +
60+ // Overrides the module internal require with a require proxy. This proxy is necessary to call rewire with the
61+ // module's filename at the first parameter to resolve the path. This way rewire() works exactly like require().
62+ 'require = rewire.getProxy(require, __dirname);' +
63+ // Cleaning up
64+ 'rewire = undefined;'
65+ ) . replace ( / \s + / g, " " ) ; // strip out unnecessary spaces to be unobtrusive in the debug view
66+
67+ module . exports = browserifyMiddleware ;
0 commit comments