--- /dev/null
+'use strict';
+
+const fs = require('fs');
+const path = require('path');
+const resolveFrom = require('resolve-from');
+const debug = require('debug')('prettier-stylelint:main');
+
+/**
+ * Resolve Config for the given file
+ *
+ * @export
+ * @param {string} file - filepath
+ * @param {Object} options - options
+ * @returns {Promise} -
+ */
+function resolveConfig({
+ filePath,
+ stylelintPath,
+ stylelintConfig,
+ prettierOptions
+}) {
+ const resolve = resolveConfig.resolve;
+ const stylelint = requireRelative(stylelintPath, filePath, 'stylelint');
+ const linterAPI = stylelint.createLinter();
+
+ if (stylelintConfig) {
+ return Promise.resolve(resolve(stylelintConfig, prettierOptions));
+ }
+
+ return linterAPI
+ .getConfigForFile(filePath)
+ .then(({ config }) => resolve(config, prettierOptions));
+}
+
+resolveConfig.resolve = (stylelintConfig, prettierOptions = {}) => {
+ const { rules } = stylelintConfig;
+
+ if (rules['max-line-length']) {
+ const printWidth = rules['max-line-length'][0];
+
+ prettierOptions.printWidth = printWidth;
+ }
+
+ if (rules['string-quotes']) {
+ const quotes = rules['string-quotes'][0];
+
+ if (quotes === 'single') {
+ prettierOptions.singleQuote = true;
+ }
+ }
+
+ if (rules.indentation) {
+ const indentation = rules.indentation[0];
+
+ if (indentation === 'tab') {
+ prettierOptions.useTabs = true;
+ prettierOptions.tabWidth = 2;
+ } else {
+ prettierOptions.useTabs = false;
+ prettierOptions.tabWidth = indentation;
+ }
+ }
+ prettierOptions.parser = 'postcss';
+ debug('prettier %O', prettierOptions);
+ debug('linter %O', stylelintConfig);
+
+ return [prettierOptions, stylelintConfig];
+};
+
+function stylelinter(code, { filePath, stylelintPath }) {
+ const stylelint = requireRelative(stylelintPath, filePath, 'stylelint');
+ const linterAPI = stylelint.createLinter({ fix: true });
+
+ return linterAPI
+ ._lintSource({
+ code,
+ codeFilename: filePath
+ })
+ .then((result) => {
+ const fixed = result.root.toString(result.opts.syntax);
+
+ return fixed;
+ });
+}
+
+function requireRelative(path, filePath, packageName) {
+ try {
+ if (path) {
+ return require(resolveFrom(path, packageName));
+ }
+
+ return require(resolveFrom(filePath, packageName));
+ } catch (err) {
+ return require(packageName);
+ }
+}
+
+function getPrettierConfig(filePath, prettierPath) {
+ const prettier = requireRelative(prettierPath, filePath, 'prettier');
+
+ // NOTE: Backward-compatibility with old prettier versions (<1.7)
+ // that don't have ``resolveConfig.sync` method.
+ return typeof prettier.resolveConfig.sync === 'undefined' ?
+ {} :
+ prettier.resolveConfig.sync(filePath);
+}
+
+function format({
+ filePath = '',
+ text = fs.readFileSync(filePath, 'utf8'),
+ prettierPath,
+ stylelintPath,
+ prettierOptions = getPrettierConfig(filePath, prettierPath),
+ stylelintConfig
+}) {
+ const options = {
+ filePath: path.isAbsolute(filePath) ?
+ filePath :
+ path.resolve(process.cwd(), filePath),
+ text,
+ prettierPath,
+ stylelintPath,
+ stylelintConfig,
+ prettierOptions
+ };
+ const prettier = requireRelative(prettierPath, filePath, 'prettier');
+
+ return resolveConfig(options).then(([prettierConfig]) =>
+ stylelinter(prettier.format(text, prettierConfig), options)
+ );
+}
+
+exports.format = format;
+exports.resolveConfig = resolveConfig;
+exports.getPrettierConfig = getPrettierConfig;