1 | 'use strict'
|
2 |
|
3 | var path = require('path')
|
4 | var Core = require('css-modules-loader-core')
|
5 | var stringHash = require('string-hash')
|
6 | var stringifyObject = require('stringify-object')
|
7 |
|
8 | function escapeCss (css) {
|
9 | return JSON.stringify(css)
|
10 | }
|
11 |
|
12 | function hash (str) {
|
13 | return '_' + stringHash(str).toString(36)
|
14 | }
|
15 |
|
16 | function generateHashName (styleName, fileName) {
|
17 | return hash(fileName + ':' + styleName)
|
18 | }
|
19 |
|
20 | function generateDebugName (styleName, fileName) {
|
21 | var sanitisedPath = fileName
|
22 | .replace(/\.[^\.\/\\]+$/, '')
|
23 | .replace(/[\W_]+/g, '_')
|
24 | .replace(/^_|_$/g, '')
|
25 |
|
26 | return '_' + sanitisedPath + '__' + styleName
|
27 | }
|
28 |
|
29 | function wrapCss (fileName, css, options, map) {
|
30 | var escapedCss = escapeCss(css)
|
31 | var stringifiedMap = stringifyObject(map)
|
32 | var packagePath = path.join(__dirname, '..')
|
33 | var dirName = path.dirname(fileName)
|
34 | var requirePath = path.relative(dirName, packagePath)
|
35 |
|
36 |
|
37 |
|
38 | requirePath = requirePath.replace(/\\/g, '/')
|
39 |
|
40 | var moduleSource = options['auto-inject']
|
41 | ? [
|
42 | 'var inject = require(\'./' + requirePath + '\');',
|
43 | 'var css = ' + escapedCss + ';',
|
44 | 'inject(css, undefined, \'' + hash(fileName) + '\');',
|
45 | options.modules
|
46 | ? 'module.exports = ' + stringifiedMap + ';'
|
47 | : 'module.exports = css;'
|
48 | ].join('\n') + '\n'
|
49 | : options.modules
|
50 | ? 'module.exports = { css: ' + escapedCss + ', map: ' + stringifiedMap + ' };\n'
|
51 | : 'module.exports = ' + escapedCss + ';\n'
|
52 |
|
53 | return moduleSource
|
54 | }
|
55 |
|
56 | function processCss (fileName, source, options) {
|
57 | if (options.modules) {
|
58 | Core.scope.generateScopedName = options.debug
|
59 | ? generateDebugName
|
60 | : generateHashName
|
61 |
|
62 | var core = new Core()
|
63 |
|
64 | return core.load(source, path.relative(process.cwd(), fileName))
|
65 | .then(function (result) {
|
66 | return wrapCss(
|
67 | fileName,
|
68 | result.injectableSource,
|
69 | options,
|
70 | result.exportTokens
|
71 | )
|
72 | })
|
73 | }
|
74 |
|
75 | return Promise.resolve(wrapCss(fileName, source, options))
|
76 | }
|
77 |
|
78 | module.exports = processCss
|