phx-click not working at all

I’m following my first tutorial on Phoenix liveview but I can’t get the phx-click to fire at all. Trying to increment a number but the handle_event is not even fired it seems. Thanks

defmodule CounterWeb.CounterLive do
	use Phoenix.LiveView	

	def mount(_params, _session, socket) do
		socket = assign(socket, :count, 0)
		{:ok, socket}
	end

	def render(assigns) do
		~L"""

			<h1>Count: <%= @count %></h1>
			<button phx-click="incr">+</button>
			<button>-</button>
		"""
	end

	def handle_event("incr",_,socket) do
		socket = assign(socket, :count, 100)
		{:noreply, socket}
	end
end

The first thing to see is if LiveView is connected at all. Can you show the complete logs outputted by your app as you start it, then load the page, then click the button? Do you see any errors in the browser?

Your liveview looks OK.
Did you add it to router.ex?

See this gist: Phoenix PageLive v1.6 · GitHub

Please add ``` around your code.

Thanks for your answer. Where do l find the log files?

Thanks, what do you mean by putting ’’’ around my code?

Some code on your first post isn’t wrapped in code (defmodule CounterWeb.CounterLive do…). That’s probably what he meant.

When you start your application in development with mix phx.server, it outputs directly into the console what’s happening, which is what he is asking you to provide. We also need anything outputted in the browser console (using the developer tools of the browser you are using).

Ok thanks! l will check the log info and post it.

The text use markdown… ``` is used to wrap code.

I made the change for You, so You can see the difference.

ok l see, cheers!

If you are just running this locally it is not a file, it’s just printed in the terminal where you run your server.

Below is the output from mix phx.server. I installed the missing inotify-tools but the problem persist. No errors in browser dev-tools apart form missing favicon.

=================================================

[info] Running CounterWeb.Endpoint with cowboy 2.9.0 at 0.0.0.0:4000 (http)
[info] Access CounterWeb.Endpoint at http://localhost:4000

webpack is watching the files…

[hardsource:0f44ee69] Using 1 MB of disk space.
[hardsource:0f44ee69] Tracking node dependencies with: package-lock.json.
[hardsource:0f44ee69] Reading from cache 0f44ee69…
Hash: 46f759d4fa498286c885
Version: webpack 4.46.0
Time: 97ms
Built at: 09/12/2021 8:40:21 PM
Asset Size Chunks Chunk Names
…/css/app.css 10.7 KiB app [emitted] app
…/favicon.ico 1.23 KiB [emitted]
…/images/phoenix.png 13.6 KiB [emitted]
…/robots.txt 202 bytes [emitted]
app.js 13.5 KiB app [emitted] app
Entrypoint app = …/css/app.css app.js
[0] multi ./js/app.js 28 bytes {app} [built]
+ 5 hidden modules
[info] GET /counter
[debug] Processing with Phoenix.LiveView.Plug.Elixir.CounterWeb.CounterLive/2
Parameters: %{}
Pipelines: [:browser]
[info] Sent 200 in 36ms

Router file below
‘’’
defmodule CounterWeb.Router do
use CounterWeb, :router
import Phoenix.LiveView.Router

pipeline :browser do
plug :accepts, [“html”]
plug :fetch_session
plug :fetch_flash
plug :protect_from_forgery
plug :put_secure_browser_headers
end

pipeline :api do
plug :accepts, [“json”]
end

scope “/”, CounterWeb do
pipe_through :browser

get "/", PageController, :index

live "/counter", CounterLive

end

if Mix.env() in [:dev, :test] do
import Phoenix.LiveDashboard.Router

scope "/" do
  pipe_through :browser
  live_dashboard "/dashboard", metrics: CounterWeb.Telemetry
end

end
end
‘’’

Right so, these logs don’t show any connection from live view. I would look in your browser console for errors, it doesn’t look like the live view javascript is able to connect.

1 Like

There are no errors what so ever except that 404 favicon not found. No default css style, nothing happens when I click the plus button just dead. Feels like I have missed something fundamental somewhere.

Btw I created the project with the --live flag if that has anything to do with anything.

You might be missing some of the requirements for LiveView to work. Can we see both your endpoint.ex and app.js files ?

This must be pretty frustrating - I know it drives me nuts when I can’t even get started with something! It’s also odd, as usually the generated phoenix apps work painlessly in my experience.

Given all that, would you feel comfortable throwing your project up on github (or somewhere else)? I’d be happy to take a look, and if I can’t see what’s going on (I’m no expert) I’m sure someone else would be able to.

Oh, and is the live dashboard working (should be at http://localhost:4000/dashboard) ?

1 Like

First of all thank you all for all the help. Live dashboard seems to work.

== endpoint.ex ==
‘’’
defmodule CounterWeb.Endpoint do
use Phoenix.Endpoint, otp_app: :counter

@session_options [
store: :cookie,
key: “_counter_key”,
signing_salt: “RBY9atbw”
]

socket “/socket”, CounterWeb.UserSocket,
websocket: true,
longpoll: false

socket “/live”, Phoenix.LiveView.Socket, websocket: [connect_info: [session: @session_options]]

plug Plug.Static,
at: “/”,
from: :counter,
gzip: false,
only: ~w(css fonts images js favicon.ico robots.txt)

if code_reloading? do
socket “/phoenix/live_reload/socket”, Phoenix.LiveReloader.Socket
plug Phoenix.LiveReloader
plug Phoenix.CodeReloader
end

plug Phoenix.LiveDashboard.RequestLogger,
param_key: “request_logger”,
cookie_key: “request_logger”

plug Plug.RequestId
plug Plug.Telemetry, event_prefix: [:phoenix, :endpoint]

plug Plug.Parsers,
parsers: [:urlencoded, :multipart, :json],
pass: ["/"],
json_decoder: Phoenix.json_library()

plug Plug.MethodOverride
plug Plug.Head
plug Plug.Session, @session_options
plug CounterWeb.Router
end
‘’’

Yes dashboard is working.

== priv/static/js/app.js ==

// (function(modules) { // webpackBootstrap
/
/ // The module cache
// var installedModules = {};
/
/
// // The require function
/
/ function webpack_require(moduleId) {
//
/
/ // Check if module is in cache
// if(installedModules[moduleId]) {
/
/ return installedModules[moduleId].exports;
// }
/
/ // Create a new module (and put it into the cache)
// var module = installedModules[moduleId] = {
/
/ i: moduleId,
// l: false,
/
/ exports: {}
// };
/
/
// // Execute the module function
/
/ modules[moduleId].call(module.exports, module, module.exports, webpack_require);
//
/
/ // Flag the module as loaded
// module.l = true;
/
/
// // Return the exports of the module
/
/ return module.exports;
// }
/
/
//
/
/ // expose the modules object (webpack_modules)
// webpack_require.m = modules;
/
/
// // expose the module cache
/
/ webpack_require.c = installedModules;
//
/
/ // define getter function for harmony exports
// webpack_require.d = function(exports, name, getter) {
/
/ if(!webpack_require.o(exports, name)) {
// Object.defineProperty(exports, name, { enumerable: true, get: getter });
/
/ }
// };
/
/
// // define __esModule on exports
/
/ webpack_require.r = function(exports) {
// if(typeof Symbol !== ‘undefined’ && Symbol.toStringTag) {
/
/ Object.defineProperty(exports, Symbol.toStringTag, { value: ‘Module’ });
// }
/
/ Object.defineProperty(exports, ‘__esModule’, { value: true });
// };
/
/
// // create a fake namespace object
/
/ // mode & 1: value is a module id, require it
// // mode & 2: merge all properties of value into the ns
/
/ // mode & 4: return value when already ns object
// // mode & 8|1: behave like require
/
/ webpack_require.t = function(value, mode) {
// if(mode & 1) value = webpack_require(value);
/
/ if(mode & 8) return value;
// if((mode & 4) && typeof value === ‘object’ && value && value.__esModule) return value;
/
/ var ns = Object.create(null);
// webpack_require.r(ns);
/
/ Object.defineProperty(ns, ‘default’, { enumerable: true, value: value });
// if(mode & 2 && typeof value != ‘string’) for(var key in value) webpack_require.d(ns, key, function(key) { return value[key]; }.bind(null, key));
/
/ return ns;
// };
/
/
// // getDefaultExport function for compatibility with non-harmony modules
/
/ webpack_require.n = function(module) {
// var getter = module && module.__esModule ?
/
/ function getDefault() { return module[‘default’]; } :
// function getModuleExports() { return module; };
/
/ webpack_require.d(getter, ‘a’, getter);
// return getter;
/
/ };
//
/
/ // Object.prototype.hasOwnProperty.call
// webpack_require.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
/
/
// // webpack_public_path
/
/ webpack_require.p = “/js/”;
//
/
/
// // Load entry module and return exports
/
/ return webpack_require(webpack_require.s = 0);
// })
/
************************************************************/
/
/ ({

// “…/deps/phoenix_html/priv/static/phoenix_html.js”:
/
!
****************************************************!
!
…/deps/phoenix_html/priv/static/phoenix_html.js !
*
*************************************************/
/
! no static exports found /
/
/ (function(module, exports, webpack_require) {

“use strict”;
eval("\n\n(function () {\n var PolyfillEvent = eventConstructor();\n\n function eventConstructor() {\n if (typeof window.CustomEvent === “function”) return window.CustomEvent; // IE<=9 Support\n\n function CustomEvent(event, params) {\n params = params || {\n bubbles: false,\n cancelable: false,\n detail: undefined\n };\n var evt = document.createEvent(‘CustomEvent’);\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n CustomEvent.prototype = window.Event.prototype;\n return CustomEvent;\n }\n\n function buildHiddenInput(name, value) {\n var input = document.createElement(“input”);\n input.type = “hidden”;\n input.name = name;\n input.value = value;\n return input;\n }\n\n function handleClick(element) {\n var to = element.getAttribute(“data-to”),\n method = buildHiddenInput("_method", element.getAttribute(“data-method”)),\n csrf = buildHiddenInput("_csrf_token", element.getAttribute(“data-csrf”)),\n form = document.createElement(“form”),\n target = element.getAttribute(“target”);\n form.method = element.getAttribute(“data-method”) === “get” ? “get” : “post”;\n form.action = to;\n form.style.display = “hidden”;\n if (target) form.target = target;\n form.appendChild(csrf);\n form.appendChild(method);\n document.body.appendChild(form);\n form.submit();\n }\n\n window.addEventListener(“click”, function (e) {\n var element = e.target;\n\n while (element && element.getAttribute) {\n var phoenixLinkEvent = new PolyfillEvent(‘phoenix.link.click’, {\n “bubbles”: true,\n “cancelable”: true\n });\n\n if (!element.dispatchEvent(phoenixLinkEvent)) {\n e.preventDefault();\n e.stopImmediatePropagation();\n return false;\n }\n\n if (element.getAttribute(“data-method”)) {\n handleClick(element);\n e.preventDefault();\n return false;\n } else {\n element = element.parentNode;\n }\n }\n }, false);\n window.addEventListener(‘phoenix.link.click’, function (e) {\n var message = e.target.getAttribute(“data-confirm”);\n\n if (message && !window.confirm(message)) {\n e.preventDefault();\n }\n }, false);\n})();//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi4vZGVwcy9waG9lbml4X2h0bWwvcHJpdi9zdGF0aWMvcGhvZW5peF9odG1sLmpzLmpzIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vLy4uL2RlcHMvcGhvZW5peF9odG1sL3ByaXYvc3RhdGljL3Bob2VuaXhfaHRtbC5qcz80N2Q4Il0sInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG4oZnVuY3Rpb24oKSB7XG4gIHZhciBQb2x5ZmlsbEV2ZW50ID0gZXZlbnRDb25zdHJ1Y3RvcigpO1xuXG4gIGZ1bmN0aW9uIGV2ZW50Q29uc3RydWN0b3IoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09IFwiZnVuY3Rpb25cIikgcmV0dXJuIHdpbmRvdy5DdXN0b21FdmVudDtcbiAgICAvLyBJRTw9OSBTdXBwb3J0XG4gICAgZnVuY3Rpb24gQ3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcykge1xuICAgICAgcGFyYW1zID0gcGFyYW1zIHx8IHtidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogZmFsc2UsIGRldGFpbDogdW5kZWZpbmVkfTtcbiAgICAgIHZhciBldnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnQsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSwgcGFyYW1zLmRldGFpbCk7XG4gICAgICByZXR1cm4gZXZ0O1xuICAgIH1cbiAgICBDdXN0b21FdmVudC5wcm90b3R5cGUgPSB3aW5kb3cuRXZlbnQucHJvdG90eXBlO1xuICAgIHJldHVybiBDdXN0b21FdmVudDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGJ1aWxkSGlkZGVuSW5wdXQobmFtZSwgdmFsdWUpIHtcbiAgICB2YXIgaW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiaW5wdXRcIik7XG4gICAgaW5wdXQudHlwZSA9IFwiaGlkZGVuXCI7XG4gICAgaW5wdXQubmFtZSA9IG5hbWU7XG4gICAgaW5wdXQudmFsdWUgPSB2YWx1ZTtcbiAgICByZXR1cm4gaW5wdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVDbGljayhlbGVtZW50KSB7XG4gICAgdmFyIHRvID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRvXCIpLFxuICAgICAgICBtZXRob2QgPSBidWlsZEhpZGRlbklucHV0KFwiX21ldGhvZFwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpKSxcbiAgICAgICAgY3NyZiA9IGJ1aWxkSGlkZGVuSW5wdXQoXCJfY3NyZl90b2tlblwiLCBlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtY3NyZlwiKSksXG4gICAgICAgIGZvcm0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZm9ybVwiKSxcbiAgICAgICAgdGFyZ2V0ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJ0YXJnZXRcIik7XG5cbiAgICBmb3JtLm1ldGhvZCA9IChlbGVtZW50LmdldEF0dHJpYnV0ZShcImRhdGEtbWV0aG9kXCIpID09PSBcImdldFwiKSA/IFwiZ2V0XCIgOiBcInBvc3RcIjtcbiAgICBmb3JtLmFjdGlvbiA9IHRvO1xuICAgIGZvcm0uc3R5bGUuZGlzcGxheSA9IFwiaGlkZGVuXCI7XG5cbiAgICBpZiAodGFyZ2V0KSBmb3JtLnRhcmdldCA9IHRhcmdldDtcblxuICAgIGZvcm0uYXBwZW5kQ2hpbGQoY3NyZik7XG4gICAgZm9ybS5hcHBlbmRDaGlsZChtZXRob2QpO1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZm9ybSk7XG4gICAgZm9ybS5zdWJtaXQoKTtcbiAgfVxuXG4gIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSkge1xuICAgIHZhciBlbGVtZW50ID0gZS50YXJnZXQ7XG5cbiAgICB3aGlsZSAoZWxlbWVudCAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSkge1xuICAgICAgdmFyIHBob2VuaXhMaW5rRXZlbnQgPSBuZXcgUG9seWZpbGxFdmVudCgncGhvZW5peC5saW5rLmNsaWNrJywge1xuICAgICAgICBcImJ1YmJsZXNcIjogdHJ1ZSwgXCJjYW5jZWxhYmxlXCI6IHRydWVcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoIWVsZW1lbnQuZGlzcGF0Y2hFdmVudChwaG9lbml4TGlua0V2ZW50KSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKFwiZGF0YS1tZXRob2RcIikpIHtcbiAgICAgICAgaGFuZGxlQ2xpY2soZWxlbWVudCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIGZhbHNlKTtcblxuICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGhvZW5peC5saW5rLmNsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICB2YXIgbWVzc2FnZSA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZShcImRhdGEtY29uZmlybVwiKTtcbiAgICBpZihtZXNzYWdlICYmICF3aW5kb3cuY29uZmlybShtZXNzYWdlKSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgfSwgZmFsc2UpO1xufSkoKTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFNQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUFBO0FBREE7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///…/deps/phoenix_html/priv/static/phoenix_html.js\n");

/***/ }),

// “./css/app.css”:
/
!
!
!
./css/app.css !
*
*/
/! no static exports found /
/
/ (function(module, exports, webpack_require) {

eval("// extracted by mini-css-extract-plugin//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9jc3MvYXBwLmNzcy5qcyIsInNvdXJjZXMiOlsid2VicGFjazovLy8uL2Nzcy9hcHAuY3NzP2Q3NjciXSwic291cmNlc0NvbnRlbnQiOlsiLy8gZXh0cmFjdGVkIGJ5IG1pbmktY3NzLWV4dHJhY3QtcGx1Z2luIl0sIm1hcHBpbmdzIjoiQUFBQSIsInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./css/app.css\n");

/***/ }),

// “./js/app.js”:
/
!
!
!
./js/app.js !
*
/
/
! no exports provided /
/
*/ (function(module, webpack_exports, webpack_require) {

“use strict”;
eval(“webpack_require.r(webpack_exports);\n/* harmony import / var css_app_css__WEBPACK_IMPORTED_MODULE_0_ = webpack_require(/! …/css/app.css / “./css/app.css”);\n/ harmony import / var _css_app_css__WEBPACK_IMPORTED_MODULE_0___default = /#PURE/webpack_require.n(css_app_css__WEBPACK_IMPORTED_MODULE_0_);\n/ harmony import / var phoenix_html__WEBPACK_IMPORTED_MODULE_1__ = webpack_require(/! phoenix_html / “…/deps/phoenix_html/priv/static/phoenix_html.js”);\n/ harmony import / var phoenix_html__WEBPACK_IMPORTED_MODULE_1___default = /#PURE*/webpack_require.n(phoenix_html__WEBPACK_IMPORTED_MODULE_1__);\n// We need to import the CSS so that webpack will load it.\n// The MiniCssExtractPlugin is used to separate it out into\n// its own CSS file.\n // webpack automatically bundles all modules in your\n// entry points. Those entry points can be configured\n// in “webpack.config.js”.\n//\n// Import deps with the dep name or local files with a relative path, for example:\n//\n// import {Socket} from “phoenix”\n// import socket from “./socket”\n//\n\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9qcy9hcHAuanMuanMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vLi9qcy9hcHAuanM/NzQ3MyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBXZSBuZWVkIHRvIGltcG9ydCB0aGUgQ1NTIHNvIHRoYXQgd2VicGFjayB3aWxsIGxvYWQgaXQuXG4vLyBUaGUgTWluaUNzc0V4dHJhY3RQbHVnaW4gaXMgdXNlZCB0byBzZXBhcmF0ZSBpdCBvdXQgaW50b1xuLy8gaXRzIG93biBDU1MgZmlsZS5cbmltcG9ydCBcIi4uL2Nzcy9hcHAuY3NzXCJcblxuLy8gd2VicGFjayBhdXRvbWF0aWNhbGx5IGJ1bmRsZXMgYWxsIG1vZHVsZXMgaW4geW91clxuLy8gZW50cnkgcG9pbnRzLiBUaG9zZSBlbnRyeSBwb2ludHMgY2FuIGJlIGNvbmZpZ3VyZWRcbi8vIGluIFwid2VicGFjay5jb25maWcuanNcIi5cbi8vXG4vLyBJbXBvcnQgZGVwcyB3aXRoIHRoZSBkZXAgbmFtZSBvciBsb2NhbCBmaWxlcyB3aXRoIGEgcmVsYXRpdmUgcGF0aCwgZm9yIGV4YW1wbGU6XG4vL1xuLy8gICAgIGltcG9ydCB7U29ja2V0fSBmcm9tIFwicGhvZW5peFwiXG4vLyAgICAgaW1wb3J0IHNvY2tldCBmcm9tIFwiLi9zb2NrZXRcIlxuLy9cbmltcG9ydCBcInBob2VuaXhfaHRtbFwiXG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTsiLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///./js/app.js\n”);

/***/ }),

// 0:
/
!
!
!
multi ./js/app.js !
*
/
/
! no static exports found /
/
*/ (function(module, exports, webpack_require) {

module.exports = webpack_require(/*! ./js/app.js */"./js/app.js");

/***/ })

/******/ });

== assets/js/app.js ===

// We need to import the CSS so that webpack will load it.
// The MiniCssExtractPlugin is used to separate it out into
// its own CSS file.
import “…/css/app.css”

// webpack automatically bundles all modules in your
// entry points. Those entry points can be configured
// in “webpack.config.js”.
//
// Import deps with the dep name or local files with a relative path, for example:
//
// import {Socket} from “phoenix”
// import socket from “./socket”
//
import “phoenix_html”