@@ -6,16 +6,51 @@ var FileSystemLoader = require('css-modules-loader-core/lib/file-system-loader')
6
6
var assign = require ( 'object-assign' ) ;
7
7
var stringHash = require ( 'string-hash' ) ;
8
8
9
+
10
+ /*
11
+ Custom `generateScopedName` function for `postcss-modules-scope`.
12
+ Short names consisting of source hash and line number.
13
+ */
14
+ function generateShortName ( name , filename , css ) {
15
+ // first occurrence of the name
16
+ // TOOD: better match with regex
17
+ var i = css . indexOf ( '.' + name ) ;
18
+ var numLines = css . substr ( 0 , i ) . split ( / [ \r \n ] / ) . length ;
19
+
20
+ var hash = stringHash ( css ) . toString ( 36 ) . substr ( 0 , 5 ) ;
21
+ return '_' + name + '_' + hash + '_' + numLines ;
22
+ }
23
+
9
24
/*
10
25
Custom `generateScopedName` function for `postcss-modules-scope`.
11
26
Appends a hash of the css source.
12
27
*/
13
- function createScopedNameFunc ( plugin ) {
14
- var orig = plugin . generateScopedName ;
15
- return function ( name , filename , css ) {
16
- var hash = stringHash ( css ) . toString ( 36 ) . substr ( 0 , 5 ) ;
17
- return orig . apply ( plugin , arguments ) + '___' + hash ;
18
- } ;
28
+ function generateLongName ( name , filename , css ) {
29
+ var sanitisedPath = filename . replace ( / \. [ ^ \. \/ \\ ] + $ / , '' )
30
+ . replace ( / [ \W _ ] + / g, '_' )
31
+ . replace ( / ^ _ | _ $ / g, '' ) ;
32
+
33
+ var hash = stringHash ( css ) . toString ( 36 ) . substr ( 0 , 5 ) ;
34
+ return '_' + sanitisedPath + '__' + name + '___' + hash ;
35
+ }
36
+
37
+ /*
38
+ Get the default plugins and apply options.
39
+ */
40
+ function getDefaultPlugins ( options ) {
41
+ var scope = Core . scope ;
42
+ var customNameFunc = options . generateScopedName ;
43
+ var defaultNameFunc = process . env . NODE_ENV === 'production' ?
44
+ generateShortName :
45
+ generateLongName ;
46
+
47
+ scope . generateScopedName = customNameFunc || defaultNameFunc ;
48
+
49
+ return [
50
+ Core . localByDefault
51
+ , Core . extractImports
52
+ , scope
53
+ ] ;
19
54
}
20
55
21
56
/*
@@ -71,7 +106,7 @@ module.exports = function (browserify, options) {
71
106
// PostCSS plugins passed to FileSystemLoader
72
107
var plugins = options . use || options . u ;
73
108
if ( ! plugins ) {
74
- plugins = Core . defaultPlugins ;
109
+ plugins = getDefaultPlugins ( options ) ;
75
110
}
76
111
else {
77
112
if ( typeof plugins === 'string' ) {
@@ -95,7 +130,7 @@ module.exports = function (browserify, options) {
95
130
if ( name === 'postcss-modules-scope' ) {
96
131
options [ name ] = options [ name ] || { } ;
97
132
if ( ! options [ name ] . generateScopedName ) {
98
- options [ name ] . generateScopedName = createScopedNameFunc ( plugin ) ;
133
+ options [ name ] . generateScopedName = generateLongName ;
99
134
}
100
135
}
101
136
@@ -174,3 +209,6 @@ module.exports = function (browserify, options) {
174
209
175
210
return browserify ;
176
211
} ;
212
+
213
+ module . exports . generateShortName = generateShortName ;
214
+ module . exports . generateLongName = generateLongName ;
0 commit comments