Sha256: 2d7eefe48fc493b31cb45e2ba4525f1bac6d4a6e7a8c38ecb5c03424ac4ce782

Contents?: true

Size: 1.17 KB

Versions: 1

Compression:

Stored size: 1.17 KB

Contents

module Svelte
  class Handler < ActionView::Template::Handlers::Raw
    include ActionView::Helpers::JavaScriptHelper

    def call(template, source)
      file = Tempfile.new
      src = Tempfile.new
      src.write source.b
      src.rewind

      file.write <<-JS
        import { compile } from 'svelte/compiler';

        const src = await Bun.file("#{src.path}").text()
        const result = compile(src, {generate: "dom", name: "Component", css: "injected", sveltePath: "https://esm.sh/svelte"})

        process.stdout.write(JSON.stringify(result))
      JS

      file.rewind

      compiled = JSON.parse(%x(bun run #{file.path})).deep_symbolize_keys

      source = <<-HTML
        <is-land on:visible on:idle>
          <template data-island>
            <div id="svelte-app-client">
            </div>
            
            <script type="module">
              #{compiled.dig(:js, :code)}
              
              new Component({ target: document.getElementById("svelte-app-client") });
            </script>
            
          </template>
        </is-land>
      HTML

      super
    end

    def self.call(template, source)
      new.call(template, source)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
actionview-svelte-handler-0.1.0 lib/svelte/handler.rb