cssify
Version:
A simple Browserify transform for adding required styles to the browser.
79 lines (63 loc) • 2.13 kB
JavaScript
var path = require('path')
var Core = require('css-modules-loader-core')
var stringHash = require('string-hash')
var stringifyObject = require('stringify-object')
function escapeCss (css) {
return JSON.stringify(css)
}
function hash (str) {
return '_' + stringHash(str).toString(36)
}
function generateHashName (styleName, fileName) {
return hash(fileName + ':' + styleName)
}
function generateDebugName (styleName, fileName) {
var sanitisedPath = fileName
.replace(/\.[^\.\/\\]+$/, '')
.replace(/[\W_]+/g, '_')
.replace(/^_|_$/g, '')
return '_' + sanitisedPath + '__' + styleName
}
function wrapCss (fileName, css, options, map) {
var escapedCss = escapeCss(css)
var stringifiedMap = stringifyObject(map)
var packagePath = path.join(__dirname, '..')
var dirName = path.dirname(fileName)
var requirePath = path.relative(dirName, packagePath)
// On Windows, path.relative returns unescaped backslashes and
// that causes cssify to not be findable.
requirePath = requirePath.replace(/\\/g, '/')
var moduleSource = options['auto-inject']
? [
'var inject = require(\'./' + requirePath + '\');',
'var css = ' + escapedCss + ';',
'inject(css, undefined, \'' + hash(fileName) + '\');',
options.modules
? 'module.exports = ' + stringifiedMap + ';'
: 'module.exports = css;'
].join('\n') + '\n'
: options.modules
? 'module.exports = { css: ' + escapedCss + ', map: ' + stringifiedMap + ' };\n'
: 'module.exports = ' + escapedCss + ';\n'
return moduleSource
}
function processCss (fileName, source, options) {
if (options.modules) {
Core.scope.generateScopedName = options.debug
? generateDebugName
: generateHashName
var core = new Core()
return core.load(source, path.relative(process.cwd(), fileName))
.then(function (result) {
return wrapCss(
fileName,
result.injectableSource,
options,
result.exportTokens
)
})
}
return Promise.resolve(wrapCss(fileName, source, options))
}
module.exports = processCss