"use strict";

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.default = _default;

var _lodash = _interopRequireDefault(require("lodash"));

var _postcss = _interopRequireDefault(require("postcss"));

var _substituteTailwindAtRules = _interopRequireDefault(require("./lib/substituteTailwindAtRules"));

var _evaluateTailwindFunctions = _interopRequireDefault(require("./lib/evaluateTailwindFunctions"));

var _substituteVariantsAtRules = _interopRequireDefault(require("./lib/substituteVariantsAtRules"));

var _substituteResponsiveAtRules = _interopRequireDefault(require("./lib/substituteResponsiveAtRules"));

var _convertLayerAtRulesToControlComments = _interopRequireDefault(require("./lib/convertLayerAtRulesToControlComments"));

var _substituteScreenAtRules = _interopRequireDefault(require("./lib/substituteScreenAtRules"));

var _substituteClassApplyAtRules = _interopRequireDefault(require("./lib/substituteClassApplyAtRules"));

var _applyImportantConfiguration = _interopRequireDefault(require("./lib/applyImportantConfiguration"));

var _purgeUnusedStyles = _interopRequireDefault(require("./lib/purgeUnusedStyles"));

var _corePlugins = _interopRequireDefault(require("./corePlugins"));

var _processPlugins = _interopRequireDefault(require("./util/processPlugins"));

var _cloneNodes = _interopRequireDefault(require("./util/cloneNodes"));

var _featureFlags = require("./featureFlags.js");

var _hashConfig = _interopRequireDefault(require("./util/hashConfig"));

var _log = _interopRequireDefault(require("./util/log"));

var _disposables = require("./util/disposables");

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

let previousConfig = null;
let processedPlugins = null;
let getProcessedPlugins = null;

function _default(getConfig) {
  return function (css, result) {
    const config = getConfig();
    const configChanged = (0, _hashConfig.default)(previousConfig) !== (0, _hashConfig.default)(config);
    previousConfig = config;

    if (configChanged) {
      _disposables.shared.dispose();

      if (config.target) {
        _log.default.warn(['The `target` feature has been removed in Tailwind CSS v2.0.', 'Please remove this option from your config file to silence this warning.']);
      }

      (0, _featureFlags.issueFlagNotices)(config);
      processedPlugins = (0, _processPlugins.default)([...(0, _corePlugins.default)(config), ..._lodash.default.get(config, 'plugins', [])], config);

      getProcessedPlugins = function () {
        return { ...processedPlugins,
          base: (0, _cloneNodes.default)(processedPlugins.base),
          components: (0, _cloneNodes.default)(processedPlugins.components),
          utilities: (0, _cloneNodes.default)(processedPlugins.utilities)
        };
      };
    }

    function registerDependency(dependency) {
      result.messages.push({
        plugin: 'tailwindcss',
        parent: result.opts.from,
        ...dependency
      });
    }

    return (0, _postcss.default)([(0, _substituteTailwindAtRules.default)(config, getProcessedPlugins()), (0, _evaluateTailwindFunctions.default)({
      tailwindConfig: config
    }), (0, _substituteVariantsAtRules.default)(config, getProcessedPlugins()), (0, _substituteResponsiveAtRules.default)(config), (0, _convertLayerAtRulesToControlComments.default)(config), (0, _substituteScreenAtRules.default)({
      tailwindConfig: config
    }), (0, _substituteClassApplyAtRules.default)(config, getProcessedPlugins, configChanged), (0, _applyImportantConfiguration.default)(config), (0, _purgeUnusedStyles.default)(config, configChanged, registerDependency)]).process(css, {
      from: _lodash.default.get(css, 'source.input.file')
    });
  };
}