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 ;