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 | var moduleSource = options['auto-inject']
|
37 | ? [
|
38 | 'var inject = require(\'' + requirePath + '\');',
|
39 | 'var css = ' + escapedCss + ';',
|
40 | 'inject(css, undefined, \'' + hash(fileName) + '\');',
|
41 | options.modules
|
42 | ? 'module.exports = ' + stringifiedMap + ';'
|
43 | : 'module.exports = css;'
|
44 | ].join('\n') + '\n'
|
45 | : options.modules
|
46 | ? 'module.exports = { css: ' + escapedCss + ', map: ' + stringifiedMap + ' };\n'
|
47 | : 'module.exports = ' + escapedCss + ';\n'
|
48 |
|
49 | return moduleSource
|
50 | }
|
51 |
|
52 | function processCss (fileName, source, options) {
|
53 | if (options.modules) {
|
54 | Core.scope.generateScopedName = options._flags.debug
|
55 | ? generateDebugName
|
56 | : generateHashName
|
57 |
|
58 | var core = new Core()
|
59 |
|
60 | return core.load(source, path.relative(process.cwd(), fileName))
|
61 | .then(function (result) {
|
62 | return wrapCss(
|
63 | fileName,
|
64 | result.injectableSource,
|
65 | options,
|
66 | result.exportTokens
|
67 | )
|
68 | })
|
69 | }
|
70 |
|
71 | return Promise.resolve(wrapCss(fileName, source, options))
|
72 | }
|
73 |
|
74 | module.exports = processCss
|