--- /dev/null
+"use strict";
+Object.defineProperty(exports, "__esModule", { value: true });
+const tslib_1 = require("tslib");
+const coc_nvim_1 = require("coc.nvim");
+const path_1 = tslib_1.__importDefault(require("path"));
+const vscode_languageserver_protocol_1 = require("vscode-languageserver-protocol");
+const errorHandler_1 = require("./errorHandler");
+const requirePkg_1 = require("./requirePkg");
+const utils_1 = require("./utils");
+/**
+ * HOLD style parsers (for stylelint integration)
+ */
+const STYLE_PARSERS = ['postcss', 'css', 'less', 'scss'];
+/**
+ * Resolves the prettierconfig for the given file.
+ *
+ * @param filePath file's path
+ */
+function resolveConfig(filePath, options) {
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
+ try {
+ const localPrettier = (yield requirePkg_1.requireLocalPkg(path_1.default.dirname(filePath), 'prettier', { silent: true, ignoreBundled: true }));
+ let prettierInstance = localPrettier;
+ if (!prettierInstance && !options.onlyUseLocalVersion) {
+ prettierInstance = require('prettier');
+ }
+ const config = yield prettierInstance.resolveConfig(filePath, options);
+ return { config };
+ }
+ catch (error) {
+ return { config: null, error };
+ }
+ });
+}
+/**
+ * Define which config should be used.
+ * If a prettierconfig exists, it returns itself.
+ * It merges prettierconfig into vscode's config (editorconfig).
+ * Priority:
+ * - additionalConfig
+ * - prettierConfig
+ * - vscodeConfig
+ * @param hasPrettierConfig a prettierconfig exists
+ * @param additionalConfig config we really want to see in. (range)
+ * @param prettierConfig prettier's file config
+ * @param vscodeConfig our config
+ */
+function mergeConfig(hasPrettierConfig, additionalConfig, prettierConfig, vscodeConfig) {
+ return hasPrettierConfig
+ ? Object.assign({ parser: vscodeConfig.parser }, // always merge our inferred parser in
+ prettierConfig, additionalConfig)
+ : Object.assign(vscodeConfig, prettierConfig, additionalConfig);
+}
+/**
+ * Format the given text with user's configuration.
+ * @param text Text to format
+ * @param path formatting file's path
+ * @returns {string} formatted text
+ */
+function format(text, { languageId, uri }, customOptions) {
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
+ let u = coc_nvim_1.Uri.parse(uri);
+ const isUntitled = u.scheme == 'untitled';
+ const fileName = u.fsPath;
+ const vscodeConfig = utils_1.getConfig(u);
+ const localOnly = vscodeConfig.onlyUseLocalVersion;
+ const resolvedPrettier = yield utils_1.getPrettierInstance();
+ if (!resolvedPrettier) {
+ errorHandler_1.addToOutput(`Prettier module not found, prettier.onlyUseLocalVersion: ${vscodeConfig.onlyUseLocalVersion}`, 'Error');
+ }
+ let supportedLanguages = utils_1.allLanguages(resolvedPrettier);
+ if (supportedLanguages.indexOf(languageId) == -1) {
+ coc_nvim_1.workspace.showMessage(`${languageId} not supported by prettier`, 'error');
+ return;
+ }
+ const dynamicParsers = utils_1.getParsersFromLanguageId(languageId, resolvedPrettier, isUntitled ? undefined : fileName);
+ let useBundled = false;
+ let parser;
+ if (!dynamicParsers.length) {
+ const bundledParsers = utils_1.getParsersFromLanguageId(languageId, require('prettier'), isUntitled ? undefined : fileName);
+ parser = bundledParsers[0] || 'babylon';
+ useBundled = true;
+ }
+ else if (dynamicParsers.includes(vscodeConfig.parser)) {
+ // handle deprecated parser option (parser: "flow")
+ parser = vscodeConfig.parser;
+ }
+ else {
+ parser = dynamicParsers[0];
+ }
+ const doesParserSupportEslint = [
+ 'javascript',
+ 'javascriptreact',
+ 'typescript',
+ 'typescriptreact',
+ 'vue',
+ ].includes(languageId);
+ const { config: fileOptions, error } = yield resolveConfig(fileName, {
+ editorconfig: true,
+ onlyUseLocalVersion: localOnly,
+ requireConfig: vscodeConfig.requireConfig,
+ });
+ const hasConfig = fileOptions != null;
+ if (!hasConfig && vscodeConfig.requireConfig) {
+ return text;
+ }
+ if (error) {
+ errorHandler_1.addToOutput(`Failed to resolve config for ${fileName}. Falling back to the default config settings.`, 'Error');
+ }
+ const prettierOptions = mergeConfig(hasConfig, customOptions, fileOptions || {}, {
+ printWidth: vscodeConfig.printWidth,
+ tabWidth: vscodeConfig.tabWidth,
+ singleQuote: vscodeConfig.singleQuote,
+ jsxSingleQuote: vscodeConfig.jsxSingleQuote,
+ trailingComma: vscodeConfig.trailingComma,
+ bracketSpacing: vscodeConfig.bracketSpacing,
+ jsxBracketSameLine: vscodeConfig.jsxBracketSameLine,
+ parser,
+ semi: vscodeConfig.semi,
+ useTabs: vscodeConfig.useTabs,
+ proseWrap: vscodeConfig.proseWrap,
+ arrowParens: vscodeConfig.arrowParens,
+ });
+ if (vscodeConfig.tslintIntegration && parser === 'typescript') {
+ return errorHandler_1.safeExecution(() => {
+ const prettierTslint = requirePkg_1.requireLocalPkg(u.fsPath, 'prettier-tslint')
+ .format;
+ // setUsedModule('prettier-tslint', 'Unknown', true)
+ return prettierTslint({
+ text,
+ filePath: fileName,
+ fallbackPrettierOptions: prettierOptions,
+ });
+ }, text, fileName);
+ }
+ if (vscodeConfig.eslintIntegration && doesParserSupportEslint) {
+ return errorHandler_1.safeExecution(() => {
+ const prettierEslint = requirePkg_1.requireLocalPkg(u.fsPath, 'prettier-eslint');
+ // setUsedModule('prettier-eslint', 'Unknown', true)
+ return prettierEslint({
+ text,
+ filePath: fileName,
+ fallbackPrettierOptions: prettierOptions,
+ });
+ }, text, fileName);
+ }
+ if (vscodeConfig.stylelintIntegration && STYLE_PARSERS.includes(parser)) {
+ const prettierStylelint = requirePkg_1.requireLocalPkg(u.fsPath, 'prettier-stylelint');
+ return errorHandler_1.safeExecution(prettierStylelint.format({
+ text,
+ filePath: fileName,
+ prettierOptions,
+ }), text, fileName);
+ }
+ if (!doesParserSupportEslint && useBundled) {
+ let bundledPrettier = require('prettier');
+ return errorHandler_1.safeExecution(() => {
+ const warningMessage = `prettier@${bundledPrettier.version} doesn't support ${languageId}. ` +
+ `Falling back to bundled prettier@${bundledPrettier.version}.`;
+ errorHandler_1.addToOutput(warningMessage, 'Warning');
+ // setUsedModule('prettier', bundledPrettier.version, true)
+ return bundledPrettier.format(text, prettierOptions);
+ }, text, fileName);
+ }
+ // setUsedModule('prettier', localPrettier.version, false)
+ return errorHandler_1.safeExecution(() => resolvedPrettier.format(text, prettierOptions), text, fileName);
+ });
+}
+exports.format = format;
+function fullDocumentRange(document) {
+ const lastLineId = document.lineCount - 1;
+ let doc = coc_nvim_1.workspace.getDocument(document.uri);
+ return vscode_languageserver_protocol_1.Range.create({ character: 0, line: 0 }, { character: doc.getline(lastLineId).length, line: lastLineId });
+}
+exports.fullDocumentRange = fullDocumentRange;
+class PrettierEditProvider {
+ constructor(_fileIsIgnored) {
+ this._fileIsIgnored = _fileIsIgnored;
+ }
+ provideDocumentRangeFormattingEdits(document, range, _options, _token) {
+ return this._provideEdits(document, {
+ rangeStart: document.offsetAt(range.start),
+ rangeEnd: document.offsetAt(range.end),
+ });
+ }
+ provideDocumentFormattingEdits(document, _options, _token) {
+ return this._provideEdits(document, {});
+ }
+ _provideEdits(document, options) {
+ return tslib_1.__awaiter(this, void 0, void 0, function* () {
+ let fileName = coc_nvim_1.Uri.parse(document.uri).fsPath;
+ if (!document.uri.startsWith('untitled') && this._fileIsIgnored(fileName)) {
+ return Promise.resolve([]);
+ }
+ const code = yield format(document.getText(), document, options);
+ const edits = [yield vscode_languageserver_protocol_1.TextEdit.replace(fullDocumentRange(document), code)];
+ const { disableSuccessMessage } = utils_1.getConfig();
+ if (edits && edits.length && !disableSuccessMessage) {
+ coc_nvim_1.workspace.showMessage('Formatted by prettier');
+ }
+ errorHandler_1.addToOutput(`Formatted file: ${document.uri}`);
+ errorHandler_1.addToOutput(`Prettier format edits: ${JSON.stringify(edits, null, 2)}`);
+ return edits;
+ });
+ }
+}
+exports.default = PrettierEditProvider;
+//# sourceMappingURL=PrettierEditProvider.js.map
\ No newline at end of file