Skip to content

Replace uglifier with terser#1852

Merged
schneems merged 1 commit intomainfrom
schneems/fix-assets
Feb 4, 2026
Merged

Replace uglifier with terser#1852
schneems merged 1 commit intomainfrom
schneems/fix-assets

Conversation

@schneems
Copy link
Member

@schneems schneems commented Feb 4, 2026

Before

       D, [2026-02-04T16:21:44.038948 #5680] DEBUG -- sentry: Sentry HTTP Transport will connect to https://sentry.io
       D, [2026-02-04T16:21:44.039009 #5680] DEBUG -- sentry: [Sentry::MetricEventBuffer] Initialized buffer with max_items=1000, flush_interval=5s
       D, [2026-02-04T16:21:44.039129 #5680] DEBUG -- sentry: Initializing the Sentry background worker with 2 threads
       D, [2026-02-04T16:21:44.039195 #5680] DEBUG -- sentry: [Sessions] Sessions won't be captured without a valid release
       D, [2026-02-04T16:21:44.099603 #5680] DEBUG -- : [Judoscale] No reporting since we're in a build process
       W, [2026-02-04T16:21:44.110880 #5680]  WARN -- : Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
       rake aborted!
       Uglifier::Error: Unexpected token: punc (.) (Uglifier::Error)
       --
        11566   };
        11567
        11568   if (window.jQuery) {
        11569     jqueryUjsInit(jQuery);
        11570   } else if (typeof exports === 'object' && typeof module === 'object') {
        11571     module.exports = jqueryUjsInit;
        11572   }
        11573 })();
           => !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LocalTime=e()}(this,(function(){"use strict";const t={config:{},run(){this.getController().processElements()},process(...t){for(const e of t)this.getController().processElement(e);return t.length},getController(){return this.controller?this.controller:this.controller=new t.Controller}};t.config.useFormat24=!1,t.config.i18n={en:{date:{dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbrDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbrMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],yesterday:"yesterday",today:"today",tomorrow:"tomorrow",on:"on {date}",formats:{default:"%b %e, %Y",thisYear:"%b %e"}},time:{am:"am",pm:"pm",singular:"a {time}",singularAn:"an {time}",elapsed:"{time} ago",second:"second",seconds:"seconds",minute:"minute",minutes:"minutes",hour:"hour",hours:"hours",formats:{default:"%l:%M%P",default_24h:"%H:%M"}},datetime:{at:"{date} at {time}",formats:{default:"%B %e, %Y at %l:%M%P %Z",default_24h:"%B %e, %Y at %H:%M %Z"}}}},t.config.locale="en",t.config.defaultLocale="en",t.config.timerInterval=6e4;const e=!isNaN(Date.parse("2011-01-01T12:00:00-05:00"));t.parseDate=t=>(t=t.toString(),e||(t=function(t){const e=t.match(r);if(e){let t;const[r,a,s,n,i,o,c,u]=e;return"Z"!==u&&(t=u.replace(":","")),`${a}/${s}/${n} ${i}:${o}:${c} GMT${[t]}`}}(t)),new Date(Date.parse(t)));const r=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|[-+]?[\d:]+)$/;t.elementMatchesSelector=(()=>{const t=document.documentElement,e=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector;return(t,r)=>{if(t?.nodeType===Node.ELEMENT_NODE)return e.call(t,r)}})();const{config:a}=t,{i18n:s}=a;t.getI18nValue=(e="",r={locale:a.locale})=>{const{locale:n}=r,i=function(t,e){let r=t;for(var a of Array.from(e.split("."))){if(!r[a])return null;r=r[a]}return r}(s[n],e);return i||(n!==a.defaultLocale?t.getI18nValue(e,{locale:a.defaultLocale}):void 0)},t.translate=(e,r={},a)=>{let s=t.getI18nValue(e,a);for(const t in r){const e=r[t];s=s.replace(`{${t}}`,e)}return s};const{getI18nValue:n,translate:i}=t,o="function"==typeof Intl?.DateTimeFormat,c={"Central European Standard Time":"CET","Central European Summer Time":"CEST","China Standard Time":"CST","Israel Daylight Time":"IDT","Israel Standard Time":"IST","Moscow Standard Time":"MSK","Peru Standard Time":"PET","Philippine Standard Time":"PHT","Singapore Standard Time":"SGT","Western Indonesia Time":"WIB"};t.knownEdgeCaseTimeZones=c,t.strftime=(()=>{const t=(a,s)=>{const u=a.getDay(),l=a.getDate(),d=a.getMonth(),m=a.getFullYear(),h=a.getHours(),f=a.getMinutes(),g=a.getSeconds();return s.replace(/%(-?)([%aAbBcdeHIlmMpPSwyYZ])/g,((s,p,y)=>{switch(y){case"%":return"%";case"a":return n("date.abbrDayNames")[u];case"A":return n("date.dayNames")[u];case"b":return n("date.abbrMonthNames")[d];case"B":return n("date.monthNames")[d];case"c":return a.toString();case"d":return e(l,p);case"e":return l;case"H":return e(h,p);case"I":return e(t(a,"%l"),p);case"l":return 0===h||12===h?12:(h+12)%12;case"m":return e(d+1,p);case"M":return e(f,p);case"p":return i("time."+(h>11?"pm":"am")).toUpperCase();case"P":return i("time."+(h>11?"pm":"am"));case"S":return e(g,p);case"w":return u;case"y":return e(m%100,p);case"Y":return m;case"Z":return function(t){let e,a,s;return(a=function(t){return Object.keys(c).find((e=>o?new Date(t).toLocaleString("en-US",{timeZoneName:"long"}).includes(e):t.toString().includes(e)))}(t))?c[a]:(s=r(t,{allowGMT:!1}))||(s=function(t){const e=t.toString();let r;if(null!=(r=e.match(/\(([\w\s]+)\)$/))){const t=r[1];return/\s/.test(t)?t.match(/\b(\w)/g).join(""):t}if(null!=(r=e.match(/(\w{3,4})\s\d{4}$/)))return r[1];if(null!=(r=e.match(/(UTC[\+\-]\d+)/)))return r[1]}(t))?s:(e=r(t,{allowGMT:!0}))?e:""}(a)}}))};function e(t,e){return"-"===e?t:`0${t}`.slice(-2)}function r(t,{allowGMT:e}){if(o){const r=new Date(t).toLocaleString("en-US",{timeZoneName:"short"}).split(" ").pop();if(e||!r.includes("GMT"))return r}}return t})(),t.CalendarDate=class{static fromDate(t){return new this(t.getFullYear(),t.getMonth()+1,t.getDate())}static today(){return this.fromDate(new Date)}constructor(t,e,r){this.date=new Date(Date.UTC(t,e-1)),this.date.setUTCDate(r),this.year=this.date.getUTCFullYear(),this.month=this.date.getUTCMonth()+1,this.day=this.date.getUTCDate(),this.value=this.date.getTime()}equals(t){return t?.value===this.value}is(t){return this.equals(t)}isToday(){return this.is(this.constructor.today())}occursOnSameYearAs(t){return this.year===t?.year}occursThisYear(){return this.occursOnSameYearAs(this.constructor.today())}daysSince(t){if(t)return(this.date-t.date)/864e5}daysPassed(){return this.constructor.today().daysSince(this)}};const{strftime:u,translate:l,getI18nValue:d,config:m}=t;t.RelativeTime=class{constructor(e){this.date=e,this.calendarDate=t.CalendarDate.fromDate(this.date)}toString(){let t,e;return(e=this.toTimeElapsedString())?l("time.elapsed",{time:e}):(t=this.toWeekdayString())?(e=this.toTimeString(),l("datetime.at",{date:t,time:e})):l("date.on",{date:this.toDateString()})}toTimeOrDateString(){return this.calendarDate.isToday()?this.toTimeString():this.toDateString()}toTimeElapsedString(){let t;const e=(new Date).getTime()-this.date.getTime(),r=Math.round(e/1e3),a=Math.round(r/60),s=Math.round(a/60);return e<0?null:r<10?(t=l("time.second"),l("time.singular",{time:t})):r<45?`${r} ${l("time.seconds")}`:r<90?(t=l("time.minute"),l("time.singular",{time:t})):a<45?`${a} ${l("time.minutes")}`:a<90?(t=l("time.hour"),l("time.singularAn",{time:t})):s<24?`${s} ${l("time.hours")}`:""}toWeekdayString(){switch(this.calendarDate.daysPassed()){case 0:return l("date.today");case 1:return l("date.yesterday");case-1:return l("date.tomorrow");case 2:case 3:case 4:case 5:case 6:return u(this.date,"%A");default:return""}}toDateString(){const t=this.calendarDate.occursThisYear()?d("date.formats.thisYear"):d("date.formats.default");return u(this.date,t)}toTimeString(){const t=m.useFormat24?"default_24h":"default";return u(this.date,d(`time.formats.${t}`))}};const{elementMatchesSelector:h}=t;t.PageObserver=class{constructor(t,e){this.selector=t,this.callback=e,this.processMutations=this.processMutations.bind(this),this.processInsertion=this.processInsertion.bind(this)}start(){this.started||(this.observeWithMutationObserver()||this.observeWithMutationEvent(),this.started=!0)}observeWithMutationObserver(){if("undefined"!=typeof MutationObserver&&null!==MutationObserver){return new MutationObserver(this.processMutations).observe(document.documentElement,{childList:!0,subtree:!0}),!0}return!1}observeWithMutationEvent(){return addEventListener("DOMNodeInserted",this.processInsertion,!1),!0}findSignificantElements(t){const e=[];return t?.nodeType===Node.ELEMENT_NODE&&(h(t,this.selector)&&e.push(t),e.push(...Array.from(t.querySelectorAll(this.selector)||[]))),e}processMutations(t){const e=[];for(const r of t)if("childList"===r.type)for(const t of r.addedNodes)e.push(...this.findSignificantElements(t)||[]);this.notify(e)}processInsertion(t){const e=this.findSignificantElements(t.target);this.notify(e)}notify(t){t?.length>0&&"function"==typeof this.callback&&this.callback(t)}};const{parseDate:f,strftime:g,getI18nValue:p,config:y}=t,S="time[data-local]:not([data-localized])",T=t=>t.setAttribute("data-localized",""),b=e=>new t.RelativeTime(e);t.Controller=class{constructor(){this.processElements=this.processElements.bind(this),this.pageObserver=new t.PageObserver(S,this.processElements)}start(){this.started||(this.processElements(),this.startTimer(),this.pageObserver.start(),this.started=!0)}startTimer(){let t;(t=y.timerInterval)&&(this.timer||(this.timer=setInterval(this.processElements,t)))}processElements(t){t||(t=document.querySelectorAll(S));for(const e of Array.from(t))this.processElement(e);return t.length}processElement(t){const e=t.getAttribute("datetime"),r=t.getAttribute("data-local"),a=y.useFormat24&&t.getAttribute("data-format24")||t.getAttribute("data-format"),s=f(e);if(!isNaN(s)){if(!t.hasAttribute("title")){const e=y.useFormat24?"default_24h":"default",r=g(s,p(`datetime.formats.${e}`));t.setAttribute("title",r)}(t=>{t.setAttribute("data-processed-at",(new Date).toISOString())})(t),t.textContent=(()=>{switch(r){case"time":return T(t),g(s,a);case"date":return T(t),b(s).toDateString();case"time-ago":return b(s).toString();case"time-or-date":return b(s).toTimeOrDateString();case"weekday":return b(s).toWeekdayString();case"weekday-or-date":return b(s).toWeekdayString()||b(s).toDateString()}})()}}};let M=!1;function D(){t.getController().start()}return t.start=()=>{var e;M?t.run():(M=!0,"undefined"!=typeof MutationObserver&&null!==MutationObserver||(document.attachEvent?"complete"===document.readyState:"loading"!==document.readyState)?D():(e=D,"function"==typeof requestAnimationFrame?requestAnimationFrame(e):setTimeout(e,17)))},t.processing=()=>t.getController().started,window.LocalTime===t&&t.start(),t}));
        11575 /*!
        11576  * Bootstrap v3.3.7 (http://getbootstrap.com)
        11577  * Copyright 2011-2017 Twitter, Inc.
        11578  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        11579  */
        11580
        11581 /*!
        11582  * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=6eccc3db33edecd9f0615ab607810de7)
       ==
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:291:in 'Uglifier#parse_result'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:221:in 'Uglifier#run_uglifyjs'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:166:in 'Uglifier#compile'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/compressing.rb:84:in 'block in Sprockets::Compressing#js_compressor='
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:84:in 'Sprockets::ProcessorUtils#call_processor'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:66:in 'block in Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Array#reverse_each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:184:in 'Sprockets::Loader#load_from_unloaded'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:59:in 'block in Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:339:in 'Sprockets::Loader#fetch_asset_from_dependency_cache'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:43:in 'Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'block in Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:207:in 'block in Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:187:in 'Concurrent::Map#fetch'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:206:in 'Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:32:in 'block in Sprockets::Bundle.call'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:31:in 'Set#each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:31:in 'Sprockets::Bundle.call'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:84:in 'Sprockets::ProcessorUtils#call_processor'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:66:in 'block in Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Array#reverse_each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:184:in 'Sprockets::Loader#load_from_unloaded'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:59:in 'block in Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:339:in 'Sprockets::Loader#fetch_asset_from_dependency_cache'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:43:in 'Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'block in Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:207:in 'block in Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:187:in 'Concurrent::Map#fetch'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:206:in 'Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/base.rb:81:in 'Sprockets::Base#find_asset'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/base.rb:88:in 'Sprockets::Base#find_all_linked_assets'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'Enumerator#each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'Enumerable#to_a'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'block (2 levels) in Sprockets::Manifest#find'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24:in 'block in Concurrent::SafeTaskExecutor#execute'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'block in Concurrent::Synchronization::MutexLockableObject#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'Thread::Mutex#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'Concurrent::Synchronization::MutexLockableObject#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:22:in 'Concurrent::SafeTaskExecutor#execute'
       /tmp/build_945d

After:

$ SECRET_KEY_BASE=dummy_key_for_asset_precompile_test RAILS_ENV=production bin/rake assets:precompile
$ echo $?
0

Before

```
       D, [2026-02-04T16:21:44.038948 #5680] DEBUG -- sentry: Sentry HTTP Transport will connect to https://sentry.io
       D, [2026-02-04T16:21:44.039009 #5680] DEBUG -- sentry: [Sentry::MetricEventBuffer] Initialized buffer with max_items=1000, flush_interval=5s
       D, [2026-02-04T16:21:44.039129 #5680] DEBUG -- sentry: Initializing the Sentry background worker with 2 threads
       D, [2026-02-04T16:21:44.039195 #5680] DEBUG -- sentry: [Sessions] Sessions won't be captured without a valid release
       D, [2026-02-04T16:21:44.099603 #5680] DEBUG -- : [Judoscale] No reporting since we're in a build process
       W, [2026-02-04T16:21:44.110880 #5680]  WARN -- : Generating image variants require the image_processing gem. Please add `gem "image_processing", "~> 1.2"` to your Gemfile or set `config.active_storage.variant_processor = :disabled`.
       rake aborted!
       Uglifier::Error: Unexpected token: punc (.) (Uglifier::Error)
       --
        11566   };
        11567
        11568   if (window.jQuery) {
        11569     jqueryUjsInit(jQuery);
        11570   } else if (typeof exports === 'object' && typeof module === 'object') {
        11571     module.exports = jqueryUjsInit;
        11572   }
        11573 })();
           => !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).LocalTime=e()}(this,(function(){"use strict";const t={config:{},run(){this.getController().processElements()},process(...t){for(const e of t)this.getController().processElement(e);return t.length},getController(){return this.controller?this.controller:this.controller=new t.Controller}};t.config.useFormat24=!1,t.config.i18n={en:{date:{dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbrDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbrMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],yesterday:"yesterday",today:"today",tomorrow:"tomorrow",on:"on {date}",formats:{default:"%b %e, %Y",thisYear:"%b %e"}},time:{am:"am",pm:"pm",singular:"a {time}",singularAn:"an {time}",elapsed:"{time} ago",second:"second",seconds:"seconds",minute:"minute",minutes:"minutes",hour:"hour",hours:"hours",formats:{default:"%l:%M%P",default_24h:"%H:%M"}},datetime:{at:"{date} at {time}",formats:{default:"%B %e, %Y at %l:%M%P %Z",default_24h:"%B %e, %Y at %H:%M %Z"}}}},t.config.locale="en",t.config.defaultLocale="en",t.config.timerInterval=6e4;const e=!isNaN(Date.parse("2011-01-01T12:00:00-05:00"));t.parseDate=t=>(t=t.toString(),e||(t=function(t){const e=t.match(r);if(e){let t;const[r,a,s,n,i,o,c,u]=e;return"Z"!==u&&(t=u.replace(":","")),`${a}/${s}/${n} ${i}:${o}:${c} GMT${[t]}`}}(t)),new Date(Date.parse(t)));const r=/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})(Z|[-+]?[\d:]+)$/;t.elementMatchesSelector=(()=>{const t=document.documentElement,e=t.matches||t.matchesSelector||t.webkitMatchesSelector||t.mozMatchesSelector||t.msMatchesSelector;return(t,r)=>{if(t?.nodeType===Node.ELEMENT_NODE)return e.call(t,r)}})();const{config:a}=t,{i18n:s}=a;t.getI18nValue=(e="",r={locale:a.locale})=>{const{locale:n}=r,i=function(t,e){let r=t;for(var a of Array.from(e.split("."))){if(!r[a])return null;r=r[a]}return r}(s[n],e);return i||(n!==a.defaultLocale?t.getI18nValue(e,{locale:a.defaultLocale}):void 0)},t.translate=(e,r={},a)=>{let s=t.getI18nValue(e,a);for(const t in r){const e=r[t];s=s.replace(`{${t}}`,e)}return s};const{getI18nValue:n,translate:i}=t,o="function"==typeof Intl?.DateTimeFormat,c={"Central European Standard Time":"CET","Central European Summer Time":"CEST","China Standard Time":"CST","Israel Daylight Time":"IDT","Israel Standard Time":"IST","Moscow Standard Time":"MSK","Peru Standard Time":"PET","Philippine Standard Time":"PHT","Singapore Standard Time":"SGT","Western Indonesia Time":"WIB"};t.knownEdgeCaseTimeZones=c,t.strftime=(()=>{const t=(a,s)=>{const u=a.getDay(),l=a.getDate(),d=a.getMonth(),m=a.getFullYear(),h=a.getHours(),f=a.getMinutes(),g=a.getSeconds();return s.replace(/%(-?)([%aAbBcdeHIlmMpPSwyYZ])/g,((s,p,y)=>{switch(y){case"%":return"%";case"a":return n("date.abbrDayNames")[u];case"A":return n("date.dayNames")[u];case"b":return n("date.abbrMonthNames")[d];case"B":return n("date.monthNames")[d];case"c":return a.toString();case"d":return e(l,p);case"e":return l;case"H":return e(h,p);case"I":return e(t(a,"%l"),p);case"l":return 0===h||12===h?12:(h+12)%12;case"m":return e(d+1,p);case"M":return e(f,p);case"p":return i("time."+(h>11?"pm":"am")).toUpperCase();case"P":return i("time."+(h>11?"pm":"am"));case"S":return e(g,p);case"w":return u;case"y":return e(m%100,p);case"Y":return m;case"Z":return function(t){let e,a,s;return(a=function(t){return Object.keys(c).find((e=>o?new Date(t).toLocaleString("en-US",{timeZoneName:"long"}).includes(e):t.toString().includes(e)))}(t))?c[a]:(s=r(t,{allowGMT:!1}))||(s=function(t){const e=t.toString();let r;if(null!=(r=e.match(/\(([\w\s]+)\)$/))){const t=r[1];return/\s/.test(t)?t.match(/\b(\w)/g).join(""):t}if(null!=(r=e.match(/(\w{3,4})\s\d{4}$/)))return r[1];if(null!=(r=e.match(/(UTC[\+\-]\d+)/)))return r[1]}(t))?s:(e=r(t,{allowGMT:!0}))?e:""}(a)}}))};function e(t,e){return"-"===e?t:`0${t}`.slice(-2)}function r(t,{allowGMT:e}){if(o){const r=new Date(t).toLocaleString("en-US",{timeZoneName:"short"}).split(" ").pop();if(e||!r.includes("GMT"))return r}}return t})(),t.CalendarDate=class{static fromDate(t){return new this(t.getFullYear(),t.getMonth()+1,t.getDate())}static today(){return this.fromDate(new Date)}constructor(t,e,r){this.date=new Date(Date.UTC(t,e-1)),this.date.setUTCDate(r),this.year=this.date.getUTCFullYear(),this.month=this.date.getUTCMonth()+1,this.day=this.date.getUTCDate(),this.value=this.date.getTime()}equals(t){return t?.value===this.value}is(t){return this.equals(t)}isToday(){return this.is(this.constructor.today())}occursOnSameYearAs(t){return this.year===t?.year}occursThisYear(){return this.occursOnSameYearAs(this.constructor.today())}daysSince(t){if(t)return(this.date-t.date)/864e5}daysPassed(){return this.constructor.today().daysSince(this)}};const{strftime:u,translate:l,getI18nValue:d,config:m}=t;t.RelativeTime=class{constructor(e){this.date=e,this.calendarDate=t.CalendarDate.fromDate(this.date)}toString(){let t,e;return(e=this.toTimeElapsedString())?l("time.elapsed",{time:e}):(t=this.toWeekdayString())?(e=this.toTimeString(),l("datetime.at",{date:t,time:e})):l("date.on",{date:this.toDateString()})}toTimeOrDateString(){return this.calendarDate.isToday()?this.toTimeString():this.toDateString()}toTimeElapsedString(){let t;const e=(new Date).getTime()-this.date.getTime(),r=Math.round(e/1e3),a=Math.round(r/60),s=Math.round(a/60);return e<0?null:r<10?(t=l("time.second"),l("time.singular",{time:t})):r<45?`${r} ${l("time.seconds")}`:r<90?(t=l("time.minute"),l("time.singular",{time:t})):a<45?`${a} ${l("time.minutes")}`:a<90?(t=l("time.hour"),l("time.singularAn",{time:t})):s<24?`${s} ${l("time.hours")}`:""}toWeekdayString(){switch(this.calendarDate.daysPassed()){case 0:return l("date.today");case 1:return l("date.yesterday");case-1:return l("date.tomorrow");case 2:case 3:case 4:case 5:case 6:return u(this.date,"%A");default:return""}}toDateString(){const t=this.calendarDate.occursThisYear()?d("date.formats.thisYear"):d("date.formats.default");return u(this.date,t)}toTimeString(){const t=m.useFormat24?"default_24h":"default";return u(this.date,d(`time.formats.${t}`))}};const{elementMatchesSelector:h}=t;t.PageObserver=class{constructor(t,e){this.selector=t,this.callback=e,this.processMutations=this.processMutations.bind(this),this.processInsertion=this.processInsertion.bind(this)}start(){this.started||(this.observeWithMutationObserver()||this.observeWithMutationEvent(),this.started=!0)}observeWithMutationObserver(){if("undefined"!=typeof MutationObserver&&null!==MutationObserver){return new MutationObserver(this.processMutations).observe(document.documentElement,{childList:!0,subtree:!0}),!0}return!1}observeWithMutationEvent(){return addEventListener("DOMNodeInserted",this.processInsertion,!1),!0}findSignificantElements(t){const e=[];return t?.nodeType===Node.ELEMENT_NODE&&(h(t,this.selector)&&e.push(t),e.push(...Array.from(t.querySelectorAll(this.selector)||[]))),e}processMutations(t){const e=[];for(const r of t)if("childList"===r.type)for(const t of r.addedNodes)e.push(...this.findSignificantElements(t)||[]);this.notify(e)}processInsertion(t){const e=this.findSignificantElements(t.target);this.notify(e)}notify(t){t?.length>0&&"function"==typeof this.callback&&this.callback(t)}};const{parseDate:f,strftime:g,getI18nValue:p,config:y}=t,S="time[data-local]:not([data-localized])",T=t=>t.setAttribute("data-localized",""),b=e=>new t.RelativeTime(e);t.Controller=class{constructor(){this.processElements=this.processElements.bind(this),this.pageObserver=new t.PageObserver(S,this.processElements)}start(){this.started||(this.processElements(),this.startTimer(),this.pageObserver.start(),this.started=!0)}startTimer(){let t;(t=y.timerInterval)&&(this.timer||(this.timer=setInterval(this.processElements,t)))}processElements(t){t||(t=document.querySelectorAll(S));for(const e of Array.from(t))this.processElement(e);return t.length}processElement(t){const e=t.getAttribute("datetime"),r=t.getAttribute("data-local"),a=y.useFormat24&&t.getAttribute("data-format24")||t.getAttribute("data-format"),s=f(e);if(!isNaN(s)){if(!t.hasAttribute("title")){const e=y.useFormat24?"default_24h":"default",r=g(s,p(`datetime.formats.${e}`));t.setAttribute("title",r)}(t=>{t.setAttribute("data-processed-at",(new Date).toISOString())})(t),t.textContent=(()=>{switch(r){case"time":return T(t),g(s,a);case"date":return T(t),b(s).toDateString();case"time-ago":return b(s).toString();case"time-or-date":return b(s).toTimeOrDateString();case"weekday":return b(s).toWeekdayString();case"weekday-or-date":return b(s).toWeekdayString()||b(s).toDateString()}})()}}};let M=!1;function D(){t.getController().start()}return t.start=()=>{var e;M?t.run():(M=!0,"undefined"!=typeof MutationObserver&&null!==MutationObserver||(document.attachEvent?"complete"===document.readyState:"loading"!==document.readyState)?D():(e=D,"function"==typeof requestAnimationFrame?requestAnimationFrame(e):setTimeout(e,17)))},t.processing=()=>t.getController().started,window.LocalTime===t&&t.start(),t}));
        11575 /*!
        11576  * Bootstrap v3.3.7 (http://getbootstrap.com)
        11577  * Copyright 2011-2017 Twitter, Inc.
        11578  * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
        11579  */
        11580
        11581 /*!
        11582  * Generated using the Bootstrap Customizer (http://getbootstrap.com/customize/?id=6eccc3db33edecd9f0615ab607810de7)
       ==
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:291:in 'Uglifier#parse_result'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:221:in 'Uglifier#run_uglifyjs'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/uglifier-4.2.1/lib/uglifier.rb:166:in 'Uglifier#compile'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/compressing.rb:84:in 'block in Sprockets::Compressing#js_compressor='
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:84:in 'Sprockets::ProcessorUtils#call_processor'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:66:in 'block in Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Array#reverse_each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:184:in 'Sprockets::Loader#load_from_unloaded'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:59:in 'block in Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:339:in 'Sprockets::Loader#fetch_asset_from_dependency_cache'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:43:in 'Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'block in Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:207:in 'block in Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:187:in 'Concurrent::Map#fetch'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:206:in 'Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:32:in 'block in Sprockets::Bundle.call'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:31:in 'Set#each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/bundle.rb:31:in 'Sprockets::Bundle.call'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:84:in 'Sprockets::ProcessorUtils#call_processor'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:66:in 'block in Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Array#reverse_each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/processor_utils.rb:65:in 'Sprockets::ProcessorUtils#call_processors'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:184:in 'Sprockets::Loader#load_from_unloaded'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:59:in 'block in Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:339:in 'Sprockets::Loader#fetch_asset_from_dependency_cache'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/loader.rb:43:in 'Sprockets::Loader#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'block in Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:207:in 'block in Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:187:in 'Concurrent::Map#fetch'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/map.rb:206:in 'Concurrent::Map#fetch_or_store'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/cached_environment.rb:44:in 'Sprockets::CachedEnvironment#load'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/base.rb:81:in 'Sprockets::Base#find_asset'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/base.rb:88:in 'Sprockets::Base#find_all_linked_assets'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'Enumerator#each'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'Enumerable#to_a'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/sprockets-4.2.2/lib/sprockets/manifest.rb:125:in 'block (2 levels) in Sprockets::Manifest#find'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:24:in 'block in Concurrent::SafeTaskExecutor#execute'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'block in Concurrent::Synchronization::MutexLockableObject#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'Thread::Mutex#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/synchronization/mutex_lockable_object.rb:48:in 'Concurrent::Synchronization::MutexLockableObject#synchronize'
       /tmp/build_945d809a/vendor/bundle/ruby/4.0.0/gems/concurrent-ruby-1.3.6/lib/concurrent-ruby/concurrent/executor/safe_task_executor.rb:22:in 'Concurrent::SafeTaskExecutor#execute'
       /tmp/build_945d
```

After:

```
$ SECRET_KEY_BASE=dummy_key_for_asset_precompile_test RAILS_ENV=production bin/rake assets:precompile
$ echo $?
0
```
@schneems schneems marked this pull request as ready for review February 4, 2026 16:36
@schneems schneems merged commit f0a7268 into main Feb 4, 2026
3 checks passed
@schneems schneems deleted the schneems/fix-assets branch February 4, 2026 16:38
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant