Add stylelint dependency

This also adds CC-BY-4.0 to the list of accepted licenses.

DISABLE_THIRD_PARTY_CHECK=update dependencies

Bug: chromium:1083142
Change-Id: I8612de2fba52dae32eeb71af79d5aacfde52142b
Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/2220097
Reviewed-by: Paul Lewis <aerotwist@chromium.org>
Commit-Queue: Mathias Bynens <mathias@chromium.org>
diff --git a/node_modules/stylelint/lib/getPostcssResult.js b/node_modules/stylelint/lib/getPostcssResult.js
new file mode 100644
index 0000000..a4ccf6e
--- /dev/null
+++ b/node_modules/stylelint/lib/getPostcssResult.js
@@ -0,0 +1,148 @@
+'use strict';
+
+const fs = require('fs');
+const LazyResult = require('postcss/lib/lazy-result');
+const postcss = require('postcss');
+const syntaxes = require('./syntaxes');
+
+/** @typedef {import('stylelint').StylelintInternalApi} StylelintInternalApi */
+/** @typedef {{parse: any, stringify: any}} Syntax */
+
+const postcssProcessor = postcss();
+
+/**
+ * @param {StylelintInternalApi} stylelint
+ * @param {import('stylelint').GetPostcssOptions} options
+ *
+ * @returns {Promise<import('postcss').Result>}
+ */
+module.exports = function (stylelint, options = {}) {
+	const cached = options.filePath ? stylelint._postcssResultCache.get(options.filePath) : undefined;
+
+	if (cached) return Promise.resolve(cached);
+
+	/** @type {Promise<string> | undefined} */
+	let getCode;
+
+	if (options.code !== undefined) {
+		getCode = Promise.resolve(options.code);
+	} else if (options.filePath) {
+		getCode = readFile(options.filePath);
+	}
+
+	if (!getCode) {
+		throw new Error('code or filePath required');
+	}
+
+	return getCode
+		.then((code) => {
+			/** @type {Syntax | null} */
+			let syntax = null;
+
+			if (stylelint._options.customSyntax) {
+				try {
+					// TODO TYPES determine which type has customSyntax
+					const customSyntax = /** @type {any} */ require(stylelint._options.customSyntax);
+
+					/*
+					 * PostCSS allows for syntaxes that only contain a parser, however,
+					 * it then expects the syntax to be set as the `parser` option rather than `syntax`.
+					 */
+					if (!customSyntax.parse) {
+						syntax = {
+							parse: customSyntax,
+							stringify: postcss.stringify,
+						};
+					} else {
+						syntax = customSyntax;
+					}
+				} catch (e) {
+					throw new Error(`Cannot resolve custom syntax module ${stylelint._options.customSyntax}`);
+				}
+			} else if (stylelint._options.syntax) {
+				if (stylelint._options.syntax === 'css') {
+					syntax = cssSyntax(stylelint);
+				} else {
+					const keys = Object.keys(syntaxes);
+
+					if (!keys.includes(stylelint._options.syntax)) {
+						throw new Error(
+							`You must use a valid syntax option, either: css, ${keys
+								.slice(0, -1)
+								.join(', ')} or ${keys.slice(-1)}`,
+						);
+					}
+
+					syntax = syntaxes[stylelint._options.syntax];
+				}
+			} else if (!(options.codeProcessors && options.codeProcessors.length)) {
+				const autoSyntax = require('postcss-syntax');
+
+				syntax = autoSyntax({
+					css: cssSyntax(stylelint),
+					jsx: syntaxes['css-in-js'],
+					...syntaxes,
+				});
+			}
+
+			const postcssOptions = {
+				from: options.filePath,
+				syntax,
+			};
+
+			const source = options.code ? options.codeFilename : options.filePath;
+			let preProcessedCode = code;
+
+			if (options.codeProcessors && options.codeProcessors.length) {
+				if (stylelint._options.fix) {
+					// eslint-disable-next-line no-console
+					console.warn(
+						'Autofix is incompatible with processors and will be disabled. Are you sure you need a processor?',
+					);
+					stylelint._options.fix = false;
+				}
+
+				options.codeProcessors.forEach((codeProcessor) => {
+					preProcessedCode = codeProcessor(preProcessedCode, source);
+				});
+			}
+
+			const result = new LazyResult(postcssProcessor, preProcessedCode, postcssOptions);
+
+			return result;
+		})
+		.then((postcssResult) => {
+			if (options.filePath) {
+				stylelint._postcssResultCache.set(options.filePath, postcssResult);
+			}
+
+			return postcssResult;
+		});
+};
+
+/**
+ * @param {string} filePath
+ * @returns {Promise<string>}
+ */
+function readFile(filePath) {
+	return new Promise((resolve, reject) => {
+		fs.readFile(filePath, 'utf8', (err, content) => {
+			if (err) {
+				return reject(err);
+			}
+
+			resolve(content);
+		});
+	});
+}
+
+/**
+ * @param {StylelintInternalApi} stylelint
+ * @returns {Syntax}
+ */
+function cssSyntax(stylelint) {
+	return {
+		parse: stylelint._options.fix ? require('postcss-safe-parser') : postcss.parse,
+		stringify: postcss.stringify,
+	};
+}