You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							143 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							143 lines
						
					
					
						
							4.3 KiB
						
					
					
				"use strict"; | 
						|
 | 
						|
Object.defineProperty(exports, "__esModule", { | 
						|
  value: true | 
						|
}); | 
						|
exports.default = loader; | 
						|
 | 
						|
var _loaderUtils = require("loader-utils"); | 
						|
 | 
						|
var _postcss = _interopRequireDefault(require("postcss")); | 
						|
 | 
						|
var _package = _interopRequireDefault(require("postcss/package.json")); | 
						|
 | 
						|
var _schemaUtils = _interopRequireDefault(require("schema-utils")); | 
						|
 | 
						|
var _semver = require("semver"); | 
						|
 | 
						|
var _CssSyntaxError = _interopRequireDefault(require("./CssSyntaxError")); | 
						|
 | 
						|
var _Warning = _interopRequireDefault(require("./Warning")); | 
						|
 | 
						|
var _options = _interopRequireDefault(require("./options.json")); | 
						|
 | 
						|
var _plugins = require("./plugins"); | 
						|
 | 
						|
var _utils = require("./utils"); | 
						|
 | 
						|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | 
						|
 | 
						|
/* | 
						|
  MIT License http://www.opensource.org/licenses/mit-license.php | 
						|
  Author Tobias Koppers @sokra | 
						|
*/ | 
						|
function loader(content, map, meta) { | 
						|
  const options = (0, _loaderUtils.getOptions)(this) || {}; | 
						|
  (0, _schemaUtils.default)(_options.default, options, { | 
						|
    name: 'CSS Loader', | 
						|
    baseDataPath: 'options' | 
						|
  }); | 
						|
  const callback = this.async(); | 
						|
  const sourceMap = options.sourceMap || false; | 
						|
  const plugins = []; | 
						|
 | 
						|
  if ((0, _utils.shouldUseModulesPlugins)(options.modules, this.resourcePath)) { | 
						|
    plugins.push(...(0, _utils.getModulesPlugins)(options, this)); | 
						|
  } | 
						|
 | 
						|
  const exportType = options.onlyLocals ? 'locals' : 'full'; | 
						|
  const preRequester = (0, _utils.getPreRequester)(this); | 
						|
 | 
						|
  const urlHandler = url => (0, _loaderUtils.stringifyRequest)(this, preRequester(options.importLoaders) + url); | 
						|
 | 
						|
  plugins.push((0, _plugins.icssParser)({ | 
						|
    urlHandler | 
						|
  })); | 
						|
 | 
						|
  if (options.import !== false && exportType === 'full') { | 
						|
    plugins.push((0, _plugins.importParser)({ | 
						|
      filter: (0, _utils.getFilter)(options.import, this.resourcePath), | 
						|
      urlHandler | 
						|
    })); | 
						|
  } | 
						|
 | 
						|
  if (options.url !== false && exportType === 'full') { | 
						|
    plugins.push((0, _plugins.urlParser)({ | 
						|
      filter: (0, _utils.getFilter)(options.url, this.resourcePath, value => (0, _loaderUtils.isUrlRequest)(value)), | 
						|
      urlHandler: url => (0, _loaderUtils.stringifyRequest)(this, url) | 
						|
    })); | 
						|
  } // Reuse CSS AST (PostCSS AST e.g 'postcss-loader') to avoid reparsing | 
						|
 | 
						|
 | 
						|
  if (meta) { | 
						|
    const { | 
						|
      ast | 
						|
    } = meta; | 
						|
 | 
						|
    if (ast && ast.type === 'postcss' && (0, _semver.satisfies)(ast.version, `^${_package.default.version}`)) { | 
						|
      // eslint-disable-next-line no-param-reassign | 
						|
      content = ast.root; | 
						|
    } | 
						|
  } | 
						|
 | 
						|
  (0, _postcss.default)(plugins).process(content, { | 
						|
    from: this.resourcePath, | 
						|
    to: this.resourcePath, | 
						|
    map: options.sourceMap ? { | 
						|
      // Some loaders (example `"postcss-loader": "1.x.x"`) always generates source map, we should remove it | 
						|
      prev: sourceMap && map ? (0, _utils.normalizeSourceMap)(map) : null, | 
						|
      inline: false, | 
						|
      annotation: false | 
						|
    } : false | 
						|
  }).then(result => { | 
						|
    for (const warning of result.warnings()) { | 
						|
      this.emitWarning(new _Warning.default(warning)); | 
						|
    } | 
						|
 | 
						|
    const imports = []; | 
						|
    const apiImports = []; | 
						|
    const urlReplacements = []; | 
						|
    const icssReplacements = []; | 
						|
    const exports = []; | 
						|
 | 
						|
    for (const message of result.messages) { | 
						|
      // eslint-disable-next-line default-case | 
						|
      switch (message.type) { | 
						|
        case 'import': | 
						|
          imports.push(message.value); | 
						|
          break; | 
						|
 | 
						|
        case 'api-import': | 
						|
          apiImports.push(message.value); | 
						|
          break; | 
						|
 | 
						|
        case 'url-replacement': | 
						|
          urlReplacements.push(message.value); | 
						|
          break; | 
						|
 | 
						|
        case 'icss-replacement': | 
						|
          icssReplacements.push(message.value); | 
						|
          break; | 
						|
 | 
						|
        case 'export': | 
						|
          exports.push(message.value); | 
						|
          break; | 
						|
      } | 
						|
    } | 
						|
 | 
						|
    const { | 
						|
      localsConvention | 
						|
    } = options; | 
						|
    const esModule = typeof options.esModule !== 'undefined' ? options.esModule : false; | 
						|
    const importCode = (0, _utils.getImportCode)(this, exportType, imports, esModule); | 
						|
    const moduleCode = (0, _utils.getModuleCode)(result, exportType, sourceMap, apiImports, urlReplacements, icssReplacements, esModule); | 
						|
    const exportCode = (0, _utils.getExportCode)(exports, exportType, localsConvention, icssReplacements, esModule); | 
						|
    return callback(null, `${importCode}${moduleCode}${exportCode}`); | 
						|
  }).catch(error => { | 
						|
    if (error.file) { | 
						|
      this.addDependency(error.file); | 
						|
    } | 
						|
 | 
						|
    callback(error.name === 'CssSyntaxError' ? new _CssSyntaxError.default(error) : error); | 
						|
  }); | 
						|
} |