# Copyright 2025 Google LLC # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. require 'uglifier' require 'digest' module Jekyll # Jekyll Generator for concatenating and minifying JS for production site class GeneratorMinifyJS < Generator priority :highest def initialize(_) end def generate(site) return if site.config['rack_env'] == 'development' @site = site @tmp_dir = File.join(site.source, '../tmp/') @js_dir = 'assets/js/' @tmp_js_dir = File.join(@tmp_dir, @js_dir) libs_js = uglify_libs libs_md5 = Digest::MD5.hexdigest(libs_js) @site.data['js']['lib_hash'] = libs_md5 create_libs_js(libs_js, libs_md5) end private def uglify_libs ugly_libs = [] @site.data['js']['libs'].each do |lib| lib_path = File.join(@site.source, 'assets', lib['path']) ugly_libs << Uglifier.compile(File.read(lib_path)) end ugly_libs.join("\n\n") end def create_libs_js(js, md5) FileUtils.mkdir_p(@tmp_js_dir) File.open(File.join(@tmp_js_dir, "libs-#{md5}.js"), 'w') do |f| f.write(js) end @site.static_files << Jekyll::StaticFile.new(@site, @tmp_dir, @js_dir, "libs-#{md5}.js") end end end