UNPKG

1.98 kBJavaScriptView Raw
1'use strict'
2
3var path = require('path')
4var Core = require('css-modules-loader-core')
5var stringHash = require('string-hash')
6var stringifyObject = require('stringify-object')
7
8function escapeCss (css) {
9 return JSON.stringify(css)
10}
11
12function hash (str) {
13 return '_' + stringHash(str).toString(36)
14}
15
16function generateHashName (styleName, fileName) {
17 return hash(fileName + ':' + styleName)
18}
19
20function generateDebugName (styleName, fileName) {
21 var sanitisedPath = fileName
22 .replace(/\.[^\.\/\\]+$/, '')
23 .replace(/[\W_]+/g, '_')
24 .replace(/^_|_$/g, '')
25
26 return '_' + sanitisedPath + '___' + styleName
27}
28
29function 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
52function 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
74module.exports = processCss