phoenixframework / phoenix_live_view

Rich, real-time user experiences with server-rendered HTML

Home Page:https://hex.pm/packages/phoenix_live_view

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

`mix format` adds newlines

m1dnight opened this issue · comments

Environment

  • Elixir version (elixir -v): 1.16.3
  • Phoenix version (mix deps): phoenix 1.7.14
  • Phoenix LiveView version (mix deps): phoenix_live_view 0.20.15
  • Operating system: macOS
  • Browsers you attempted to reproduce this bug on (the more the merrier):
  • Does the problem persist after removing "assets/node_modules" and trying again? Yes/no:

Actual behavior

When formatting a file, newlines are inserted. When the formatter is run again, the newlines are duplicated.

Using the example input:

<div>
  <div>
    <script nonce={@csp_nonce}>
        window.appConfig = window.appConfig || {}
        window.appConfig.clientUpload = window.appConfig.clientUpload || {}
        window.appConfig.clientUpload.flow = "<%= @flow %>"
        <%= if @type == :files_client do %>
        window.appConfig.clientUpload.client = <%= raw(Jason.encode!(JustifiedInternalApi.ClientView.render("client.json", %{client: @client}))) %>
        window.appConfig.clientUpload.existingFiles = <%= raw(Jason.encode!(@existing_client_files)) %>
        <% end %>
    </script>
  </div>
</div>

Formatting once results in:

<div>
  <div>
    <script nonce={@csp_nonce}>
              window.appConfig = window.appConfig || {}
              window.appConfig.clientUpload = window.appConfig.clientUpload || {}
              window.appConfig.clientUpload.flow = "<%= @flow %>"
              <%= if @type == :files_client do %>
        
              window.appConfig.clientUpload.client = <%= raw(Jason.encode!(JustifiedInternalApi.ClientView.render("client.json", %{client: @client}))) %>
              window.appConfig.clientUpload.existingFiles = <%= raw(Jason.encode!(@existing_client_files)) %>
      <% end %>
          
    </script>
  </div>
</div>

Formatting 10 times results in:

<div>
  <div>
    <script nonce={@csp_nonce}>
                                                                    window.appConfig = window.appConfig || {}
                                                                    window.appConfig.clientUpload = window.appConfig.clientUpload || {}
                                                                    window.appConfig.clientUpload.flow = "<%= @flow %>"
                                                                    <%= if @type == :files_client do %>
        
              
                    
                          
                                
                                      
                                            
                                                  
                                                        
                                                              
                                                                    window.appConfig.clientUpload.client = <%= raw(Jason.encode!(JustifiedInternalApi.ClientView.render("client.json", %{client: @client}))) %>
                                                                    window.appConfig.clientUpload.existingFiles = <%= raw(Jason.encode!(@existing_client_files)) %>
      <% end %>
                                                                
                                                          
                                                    
                                              
                                        
                                  
                            
                      
                
          
    </script>
  </div>
</div>

This happened with phoenix_live_view at 0.20.15, but not with 0.20.14.

I think it will be related to these changes: v0.20.14...v0.20.15#diff-463a21df4167ac1fea6a9c66d1cd80e22d32115a2c21b44c90f696bc09c9feb4

I can't really spot the cause right away, though.

I used the following to bisect this:

source.ex

defmodule SomeModule do
  def render(assigns) do
    ~H"""
    <div>
      <div>
        <script nonce={@csp_nonce}>
          window.appConfig = window.appConfig || {}
          window.appConfig.clientUpload = window.appConfig.clientUpload || {}
          window.appConfig.clientUpload.flow = "<%= @flow %>"
          <%= if @type == :files_client do %>
            window.appConfig.clientUpload.client = <%= raw(Jason.encode!(JustifiedInternalApi.ClientView.render("client.json", %{client: @client}))) %>
            window.appConfig.clientUpload.existingFiles = <%= raw(Jason.encode!(@existing_client_files)) %>
          <% end %>
        </script>
      </div>
    </div>
    """
  end
end

script.sh

#!/bin/bash

mix deps.get
mix run -e "{f, _} = Mix.Tasks.Format.formatter_for_file(\"../source.ex\"); if f.(File.read!(\"../source.ex\")) == File.read!(\"../source.ex\"), do: System.halt(0), else: System.halt(1)"

Running git bisect run bash script.sh points to this commit:

ba5d49b