Js-beautify: Новая строка вставлена ​​после импорта/экспорта модуля ES6

Созданный на 9 янв. 2014  ·  54Комментарии  ·  Источник: beautify-web/js-beautify

Привет,

Я использую jsbeautifier для набора модулей Ember.JS ES6 и заметил небольшую проблему с операторами экспорта.

Предположим, у меня есть модуль, который экспортирует, как показано ниже.

export default DS.FixtureAdapter.extend();

jsbeautifier добавит новую строку после экспорта

export
default DS.FixtureAdapter.extend();

Это незначительная проблема, которая касается только нас, поскольку мы принудительно запускаем jsbeautifier до того, как фиксация будет принята. Таким образом, если разработчик удалит новую строку, рассматриваемый файл будет включен в фиксацию, даже если он не имеет ничего общего с фиксируемыми изменениями.

enhancement

Самый полезный комментарий

@the-simian Правильный вариант — "brace_style": "collapse-preserve-inline" в разделе «Стиль скобки», если вы просматриваете настройки Atom. Параметр «preserve_newlines» предназначен для сохранения новых строк во всем файле. Однако вы определенно хотите, чтобы это было правдой. :)

Все 54 Комментарий

Относится к #388.

Я думаю, проблема здесь в том, что мы не обрабатываем экспорт как зарезервированное слово.

Эй, @bitwiseman , именно в этом проблема, но, например, если я напишу что-то вроде

export default moduleName;

Он будет украшен, как

default moduleName;

Что выглядит не очень :)

Кроме того, если я хочу импортировать стиль фигурной скобки

import { mod1, mod2 } from 'filePath';

Он будет украшен, как

import { 
  mod1, 
  mod2 
} from 'filePath';

Что ты об этом думаешь ?

Все это звучит нормально. Ключевые слова module , export и import должны быть добавлены, а код написан для правильного форматирования.

Есть новости о том, насколько близка эта проблема к решению?

Это будет в следующем выпуске. Инфраструктура есть, это должно быть незначительное изменение.

+1 за исправление форматирования операторов экспорта!

+1

+1

+1

+1

+1

+н. Я думаю, это просто вопрос добавления этих ключевых слов в список зарезервированных слов. Это правильно?

редактировать: нет. Я пытался найти, где будут новые правила, но слишком много кода, чтобы рисковать изменением =/

:+1:

Похоже, это важное обязательство сделать это правильно. Извините, ребята, но я должен перенести это на следующий релиз.

Для справки:
http://people.mozilla.org/~jorendorff/es6-draft.html#sec -модули
http://people.mozilla.org/~jorendorff/es6-draft.html#sec — импорт
http://people.mozilla.org/~jorendorff/es6-draft.html#sec — экспорт

Это делает нас всех:

Но мы все должны помнить:

Это точно правильно. :смайлик:

Для этого вы получаете следующее исправление — бессмысленный ввод ниже будет давать идентичный результат от бьютификатора. Большинство сценариев по-прежнему выглядят ужасно, но я чувствовал, что смогу взломать их с минимальной болью.

module "a" {
    import odd from "Odd";
    export default function div(x, y) {}
    export function sum(x, y) {
        return x + y;
    }
    export var pi = 3.141593;
    export default moduleName;
    export *
}

:+1:
Видно какое-нибудь исправление?

В свободное время... :smile:

:+1:

+1

+1

Исходная проблема была исправлена ​​в версии 1.5.2.

@redking , @dred9e , @Aluxian , @simplyianm , @pgilad , @webbushka , @fpauser , @Volox , @naomifeehanmoran , @darlanalves , @thaume -

Мне нужна твоя помощь.

Пожалуйста, предоставьте примеры ввода, фактического вывода и желаемого вывода, чтобы я мог разобраться с этой проблемой. Также укажите, является ли фактический вывод нежелательным или вызывает синтаксические ошибки. Синтаксические ошибки будут иметь приоритет. У меня есть такой далеко от @thaume -

//input
import { mod1, mod2 } from 'filePath';

// actual output - non-breaking 
import { 
  mod1, 
  mod2 
} from 'filePath';

// desired output (unchanged)
import { mod1, mod2 } from 'filePath';

ПРИМЕЧАНИЯ:

  • Пожалуйста, смотрите комментарии друг друга и старайтесь не повторять классы форматирования с небольшими отличиями. Лучшее усилие — это хорошо. :улыбка:
  • Позиционирование брекетов будет ключевой проблемой. В настоящее время у нас есть одна настройка для позиционирования всех типов фигурных скобок — свернуть, развернуть,
  • Поскольку исходная проблема была исправлена, я могу в конечном итоге закрыть эту проблему и открыть новые для различных материалов, которые вы предоставили.

@bitwiseman Приведенный выше пример - это именно то, чего я ожидал. В последнее время я играл с ES6 в редакторе Atom, где у меня нет автоматического форматирования при сохранении, только потому, что импорт испорчен.

Ожидаемый/вход:

import { Bar } from 'lib/Bar';

class Foo {
    constructor() {
        this.bar = new Bar();
    }
}

export { Foo };

Как сейчас:

import {
    Bar
}
from 'lib/Bar';

class Foo {
    constructor() {
        this.bar = new Bar();
    }
}

export {
    Foo
};

Я пока не знаю примера, который сломал бы код при форматировании.

Я знаю, что это не импорт/экспорт, и это связано с jsx, так что, вероятно, это совершенно другой зверь, однако я могу представить, что исправление будет связано:

return <div {...props}></div>;

становится

return <div {...props
    } > < /div>;

Вы установили e4x = true ?

Да, я видел, и я вижу, что на обычном jsx без литералов его соблюдают. Однако наличие литерала типа {...props} в самом внешнем теге сразу нарушает форматирование. Если литерал находится внутри вложенного элемента, он работает немного лучше, но все же ломается на закрывающем теге. Я могу опубликовать больше примеров, если это правильное место/проблема.

@loopmode - Пожалуйста, откройте новую проблему с примером, который у вас есть выше.

+1

:+1: Это также влияет на деструктурирование объектов.

var { type, size } = someObject;

преобразуется в

var {
        type, size
    } = someObject;

:+1: импорт и форматирование jsx не работают у меня также при использовании атома

+1

+1

+1

+1

С js-beautify 1.5.10 я получаю следующее:

Вход:

import { x, y, z } from './other';

Выход:

import {
    x, y, z
}
from './other';

Я определенно не хочу новую строку после закрывающей скобки.

+1

Есть ли планы по поддержке этого?

Это до сих пор не исправлено?

Он все еще открыт. Запросы на вытягивание приветствуются.

+1

Хотя есть обходной путь с использованием:
/* украсить сохранить:старт _/
/_ украсить сохранить:конец */

Это не очень приятно видеть.

+1

+1

+1

Для всех, кто заинтересован, оставшаяся проблема связана с import {x, y} from './other' . Кажется, это частный случай деструктурированных объектов. См. № 511.

Я все еще получаю поведение для импорта, но все заявки закрыты. Как я могу сохранить одну строку в импорте после украшения в Atom? Спасибо!

Понятно, все, что нужно было, это добавить следующий конфиг в .jsbeautifyrc

{
  "preserve_newlines": true,
  "max_preserve_newlines": 2
}

Я все еще испытываю эту проблему с import . Я использую 1.6.3

import { mod1, mod2 } from 'filePath';

становится

import { 
  mod1, 
  mod2 
} from 'filePath';

для тех из вас, кто работает правильно, можете ли вы опубликовать свой файл .rc json с указанием правильных свойств? Я понятия не имею, почему он вообще не работает.

{
  "preserve_newlines": true,
  "max_preserve_newlines": 2
}

это не исправило (как писал выше)

@the-simian Правильный вариант — "brace_style": "collapse-preserve-inline" в разделе «Стиль скобки», если вы просматриваете настройки Atom. Параметр «preserve_newlines» предназначен для сохранения новых строк во всем файле. Однако вы определенно хотите, чтобы это было правдой. :)

@eloquence спасибо за обновление, я попробую это, как только смогу
Редактировать: _Это было так_

Вот контекст, полностью рабочий json в файле .jsbeautifyrc:

{
    "brace_style": "collapse-preserve-inline", //<----that
    "break_chained_methods": false,
    "end_with_newline": false,
    "eol": "\n",
    "eval_code": false,
    "indent_char": "  ",
    "indent_level": 0,
    "indent_size": 1,
    "indent_with_tabs": true,
    "jslint_happy": false,
    "keep_array_indentation": false,
    "keep_function_indentation": false,
    "max_preserve_newlines": 4, //<---this
    "preserve_newlines": true, // <---this too
    "space_after_anon_function": false,
    "space_before_conditional": true,
    "unescape_strings": false,
    "wrap_attributes": "auto",
    "wrap_attributes_indent_size": 2,
    "wrap_line_length": 0
}

@loopmode У меня похожая проблема с collapse-preserve-inline

"brace_style": "collapse-preserve-inline",

Вход:

const _state = { ...state }

Выход:

const _state = {...state }

Хотя collapse-preserve-inline работает, невозможно получить такое же поведение с end-expand или expand . Есть ли способ, которым мы могли бы получить end-expand-preserve-inline и подобное для других опций или, может быть, даже опцию preserve-inline-braces с истинным или ложным?

@ Coburn37 - Пожалуйста, зарегистрируйте новую проблему и / или посмотрите # 1052, чтобы узнать, описывает ли это то, что вы хотите.

+1. Я не любитель развал-сохранения-инлайн. Я хотел бы добавить правило специально для импорта...

Была ли эта страница полезной?
0 / 5 - 0 рейтинги