UNPKG

2.13 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 // On Windows, path.relative returns unescaped backslashes and
37 // that causes cssify to not be findable.
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
56function 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
78module.exports = processCss