# frozen_string_literal: true require "rack/test" require "stringio" RSpec.describe "Assets", :app_integration do include Rack::Test::Methods let(:app) { Hanami.app } let(:root) { make_tmp_directory } before do with_directory(root) do write "config/app.rb", <<~RUBY module TestApp class App < Hanami::App config.logger.stream = StringIO.new end end RUBY write "config/assets.js", <<~JS import * as assets from "hanami-assets"; await assets.run(); JS write "package.json", <<~JSON { "type": "module" } JSON write "app/view.rb", <<~RUBY # auto_register: false require "hanami/view" module TestApp class View < Hanami::View config.layout = nil end end RUBY write "app/views/posts/show.rb", <<~RUBY module TestApp module Views module Posts class Show < TestApp::View end end end end RUBY write "app/templates/posts/show.html.erb", <<~ERB <%= stylesheet_tag("app") %> <%= javascript_tag("app") %> ERB write "app/assets/js/app.ts", <<~TS import "../css/app.css"; console.log("Hello from index.ts"); TS write "app/assets/css/app.css", <<~CSS .btn { background: #f00; } CSS before_prepare if respond_to?(:before_prepare) require "hanami/prepare" end end specify "assets are available in helpers and in `assets` component" do compile_assets! output = Hanami.app["views.posts.show"].call.to_s expect(output).to match(%r{}) expect(output).to match(%r{}) assets = Hanami.app["assets"] expect(assets["app.css"].to_s).to match(%r{/assets/app-[A-Z0-9]{8}.css}) expect(assets["app.js"].to_s).to match(%r{/assets/app-[A-Z0-9]{8}.js}) end describe "slice with assets" do def before_prepare write "slices/main/view.rb", <<~RUBY # auto_register: false module Main class View < TestApp::View end end RUBY write "slices/main/views/posts/show.rb", <<~RUBY module Main module Views module Posts class Show < Main::View end end end end RUBY write "slices/main/templates/posts/show.html.erb", <<~ERB <%= stylesheet_tag("app") %> <%= javascript_tag("app") %> ERB write "slices/main/assets/js/app.ts", <<~TS import "../css/app.css"; console.log("Hello from main slice index.ts"); TS write "slices/main/assets/css/app.css", <<~CSS .btn { background: #f00; } CSS end specify "the slice's assets are available in its own and distinct `assets` component" do compile_assets! output = Main::Slice["views.posts.show"].call.to_s expect(output).to match(%r{}) expect(output).to match(%r{}) assets = Main::Slice["assets"] expect(assets["app.css"].to_s).to match(%r{/assets/main/app-[A-Z0-9]{8}.css}) expect(assets["app.js"].to_s).to match(%r{/assets/main/app-[A-Z0-9]{8}.js}) end end describe "slice without assets" do def before_prepare write "slices/main/.keep", "" end it "does not have an assets component" do expect(Main::Slice.key?("assets")).to be false end end end