lib/ckeditor5/rails/assets/webcomponent_bundle.rb



# frozen_string_literal: true

require 'singleton'
require 'terser'

module CKEditor5::Rails::Assets
  class WebComponentBundle
    include ActionView::Helpers::TagHelper
    include Singleton

    WEBCOMPONENTS_PATH = File.join(__dir__, 'webcomponents')
    WEBCOMPONENTS_MODULES = [
      'utils.mjs',
      'components/editable.mjs',
      'components/ui-part.mjs',
      'components/editor.mjs',
      'components/context.mjs'
    ].freeze

    def source
      @source ||= compress_source(raw_source)
    end

    def to_html(nonce: nil)
      tag.script(source, type: 'module', nonce: nonce)
    end

    private

    def raw_source
      @raw_source ||= WEBCOMPONENTS_MODULES.map do |file|
        File.read(File.join(WEBCOMPONENTS_PATH, file))
      end.join("\n")
    end

    def compress_source(code)
      Terser.new(compress: true, mangle: true).compile(code).html_safe
    end
  end
end