importmap-rails 0.7.6 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d7218dabe6d049d329f32dcb432172a8dbfcb392e300e786001443ad8c1614fb
4
- data.tar.gz: 2411983863b5a6353677ade633a0f85878d7f4eefa82c188d493502ff6a63f21
3
+ metadata.gz: 5ff9e12c3e3daaf05a7de52415d5147fc030efd2ad0cd170eb60a13c0227bb72
4
+ data.tar.gz: '09d07386cd7f80d6f34d369e530276125e6a5361577896bc847d7968a9f158a6'
5
5
  SHA512:
6
- metadata.gz: 85e0cf2e07054028ef9b7ee605b8d08bc88b011bf8afbaab3d050f2cccd667bea164d82d25c208e2a3251c1f351c0679fffee56a50d922a99a8b156bd79f0c74
7
- data.tar.gz: c6ce2f8be78e4816e3111e2666de3ec1cee55ecf40b8efc3a283e7fa5a91fb29f3e4795396b4ee9232f47fec4fd5230305343793e68db67f3d7f4a27e853304e
6
+ metadata.gz: 5be65a22e79a2d7bff6b317d1a162dbdc9be2f0fb05449c7675a6c9583a2b578e2e07265bf9fefa1a404a92053dd02f019d705b5b2793184f5e35f28b48a1235
7
+ data.tar.gz: 32875269eb69d4b1fed15d6d93831dae419354b13e46b2a0edb26b041b403f6e77f4f95169955aa8cda540c8d3d253f49ab0fd2a1a6b8b43e8313a947943ae12
data/README.md CHANGED
@@ -110,28 +110,46 @@ pin "react", to: "https://cdn.skypack.dev/react"
110
110
  ```
111
111
 
112
112
 
113
- ## What if I don't like to use a JavaScript CDN?
113
+ ## Downloading vendor files from the JavaScript CDN
114
114
 
115
- You always have the option to simply download the compiled JavaScript packages from the CDNs, and saving them locally in your application. You can put such files in app/javascript/vendor, and then reference them with local pins, like:
115
+ If you don't want to use a JavaScript CDN in production, you can also download vendored files from the CDN when you're setting up your pins:
116
+
117
+ ```bash
118
+ ./bin/importmap pin react --download
119
+ Pinning "react" to vendor/react.js via download from https://ga.jspm.io/npm:react@17.0.2/index.js
120
+ Pinning "object-assign" to vendor/object-assign.js via download from https://ga.jspm.io/npm:object-assign@4.1.1/index.js
121
+ ```
122
+
123
+ This will produce pins in your `config/importmap.rb` like so:
116
124
 
117
125
  ```ruby
118
- # config/importmap.rb
119
- pin "react", to: "vendor/react@17.0.2.js"
126
+ pin "react", to: "vendor/react.js" # https://ga.jspm.io/npm:react@17.0.2/index.js
127
+ pin "object-assign", to: "vendor/object-assign.js" # https://ga.jspm.io/npm:object-assign@4.1.1/index.js
128
+ ```
129
+
130
+ The packages are downloaded to `app/javascript/vendor`, which you can check into your source control, and they'll be available through your application's own asset pipeline serving.
131
+
132
+ If you later wish to remove a downloaded pin, you again pass `--download`:
133
+
134
+ ```bash
135
+ ./bin/importmap unpin react --download
136
+ Unpinning and removing "react"
137
+ Unpinning and removing "object-assign"
120
138
  ```
121
139
 
122
- But using a JavaScript CDN is fast, secure, and easier to deal with. Start there.
140
+ Just like with a normal pin, you can also update a pin by running the `pin --download` command again.
123
141
 
124
142
 
125
143
  ## Preloading pinned modules
126
144
 
127
- To avoid the waterfall effect where the browser has to load one file after another before it can get to the deepest nested import, we use [modulepreload links](https://developers.google.com/web/updates/2017/12/modulepreload). Pinned modules are preloaded by default, but you can turn this off with `preload: false`.
145
+ To avoid the waterfall effect where the browser has to load one file after another before it can get to the deepest nested import, importmap-rails supports [modulepreload links](https://developers.google.com/web/updates/2017/12/modulepreload). Pinned modules can be preloaded by appending `preload: true` to the pin.
128
146
 
129
147
  Example:
130
148
 
131
149
  ```ruby
132
150
  # config/importmap.rb
133
- pin "@github/hotkey", to: "https://ga.jspm.io/npm:@github/hotkey@1.4.4/dist/index.js"
134
- pin "md5", to: "https://cdn.jsdelivr.net/npm/md5@2.3.0/md5.js", preload: false
151
+ pin "@github/hotkey", to: "https://ga.jspm.io/npm:@github/hotkey@1.4.4/dist/index.js", preload: true
152
+ pin "md5", to: "https://cdn.jsdelivr.net/npm/md5@2.3.0/md5.js"
135
153
 
136
154
  # app/views/layouts/application.html.erb
137
155
  <%= javascript_importmap_tags %>
@@ -153,8 +171,8 @@ You can combine multiple import maps by drawing their definitions onto the `Rail
153
171
  module MyEngine
154
172
  class Engine < ::Rails::Engine
155
173
  # ...
156
- initializer "my-engine.importmap" do |app|
157
- app.config.importmap.draw(Engine.root.join("config/importmap.rb"))
174
+ initializer "my-engine.importmap", after: "importmap" do |app|
175
+ app.importmap.draw(Engine.root.join("config/importmap.rb"))
158
176
  end
159
177
  end
160
178
  end
@@ -182,13 +200,24 @@ end
182
200
 
183
201
  ## Sweeping the cache in development and test
184
202
 
185
- Generating the import map json and modulepreloads may require resolving hundreds of assets. This can take a while, so these operations are cached, but in development and test, we watch for changes to both `config/importmap.rb` and files in `app/javascript` to clear this cache. This feature can be controlled in an environment configuration file via the boolean `config.importmap.sweep_cache`. If you're pinning local files from outside of `app/javascript`, you'll need to restart your development server upon changes to those external files.
203
+ Generating the import map json and modulepreloads may require resolving hundreds of assets. This can take a while, so these operations are cached, but in development and test, we watch for changes to both `config/importmap.rb` and files in `app/javascript` to clear this cache. This feature can be controlled in an environment configuration file via the boolean `config.importmap.sweep_cache`.
204
+
205
+ If you're pinning local files from outside of `app/javascript`, you'll need to add them to the cache sweeper configuration or restart your development server upon changes to those external files. To add them to the configuration to clear the cache on changes, for instance when locally developing an engine, use an initializer like the following sample `config/initializers/importmap-caching.rb`:
186
206
 
207
+ ```ruby
208
+ if Rails.env.development?
209
+ Rails.application.importmap.cache_sweeper watches: [
210
+ Rails.application.root.join("app/javascript"),
211
+ MyEngine::Engine.root.join("app/assets/javascripts"),
212
+ ]
213
+ end
214
+ ```
187
215
 
188
216
  ## Expected errors from using the es-module-shim
189
217
 
190
218
  While import maps are native in Chrome and Edge, they need a shim in other browsers that'll produce a JavaScript console error like `TypeError: Module specifier, 'application' does not start with "/", "./", or "../".`. This error is normal and does not have any user-facing consequences.
191
219
 
220
+ In Firefox. when opening the browser console, the asm.js module lexer build will run in unoptimized mode due to the debugger attaching. This gives a warning message `"asm.js type error: Disabled because no suitable wasm compiler is available"` which is as expected. When the console is closed again, the asm.js optimizations are fully applied, and this can even be verified with the console open by disabling the debugger in `about:config` and reloading the page.
192
221
 
193
222
  ## Turning off the shim
194
223
 
@@ -1,4 +1,4 @@
1
- /* ES Module Shims 1.1.0 */
1
+ /* ES Module Shims 1.2.0 */
2
2
  (function () {
3
3
 
4
4
  const edge = navigator.userAgent.match(/Edge\/\d\d\.\d+$/);
@@ -216,7 +216,7 @@
216
216
 
217
217
  const { revokeBlobURLs, noLoadEventRetriggers } = esmsInitOptions$1;
218
218
 
219
- const fetchHook = esmsInitOptions$1.fetchHook ? globalHook(esmsInitOptions$1.fetchHook) : fetch;
219
+ const fetchHook = esmsInitOptions$1.fetch ? globalHook(esmsInitOptions$1.fetch) : fetch;
220
220
 
221
221
  function globalHook (name) {
222
222
  return typeof name === 'string' ? self[name] : name;
@@ -0,0 +1 @@
1
+ (function(){const e=navigator.userAgent.match(/Edge\/\d\d\.\d+$/);let r;function createBlob(e,r="text/javascript"){return URL.createObjectURL(new Blob([e],{type:r}))}const noop=()=>{};const t=document.querySelector("base[href]");t&&(r=t.href);if(!r&&"undefined"!==typeof location){r=location.href.split("#")[0].split("?")[0];const e=r.lastIndexOf("/");-1!==e&&(r=r.slice(0,e+1))}function isURL(e){try{new URL(e);return true}catch{return false}}const s=/\\/g;function resolveIfNotPlainOrUrl(e,r){r=r&&r.split("#")[0].split("?")[0];-1!==e.indexOf("\\")&&(e=e.replace(s,"/"));if("/"===e[0]&&"/"===e[1])return r.slice(0,r.indexOf(":")+1)+e;if("."===e[0]&&("/"===e[1]||"."===e[1]&&("/"===e[2]||2===e.length&&(e+="/"))||1===e.length&&(e+="/"))||"/"===e[0]){const t=r.slice(0,r.indexOf(":")+1);let s;if("/"===r[t.length+1])if("file:"!==t){s=r.slice(t.length+2);s=s.slice(s.indexOf("/")+1)}else s=r.slice(8);else s=r.slice(t.length+("/"===r[t.length]));if("/"===e[0])return r.slice(0,r.length-s.length-1)+e;const a=s.slice(0,s.lastIndexOf("/")+1)+e;const i=[];let c=-1;for(let e=0;e<a.length;e++)if(-1!==c){if("/"===a[e]){i.push(a.slice(c,e+1));c=-1}}else if("."===a[e])if("."!==a[e+1]||"/"!==a[e+2]&&e+2!==a.length)"/"===a[e+1]||e+1===a.length?e+=1:c=e;else{i.pop();e+=2}else c=e;-1!==c&&i.push(a.slice(c));return r.slice(0,r.length-s.length)+i.join("")}}function resolveUrl(e,r){return resolveIfNotPlainOrUrl(e,r)||(-1!==e.indexOf(":")?e:resolveIfNotPlainOrUrl("./"+e,r))}function resolveAndComposePackages(e,r,t,s){for(let a in e){const i=resolveIfNotPlainOrUrl(a,t)||a;let c=e[a];if("string"!==typeof c)continue;const oe=resolveImportMap(s,resolveIfNotPlainOrUrl(c,t)||c,t);oe?r[i]=oe:targetWarning(a,e[a],"bare specifier did not resolve")}}function resolveAndComposeImportMap(e,r,t){const s={imports:Object.assign({},t.imports),scopes:Object.assign({},t.scopes)};e.imports&&resolveAndComposePackages(e.imports,s.imports,r,t);if(e.scopes)for(let a in e.scopes){const i=resolveUrl(a,r);resolveAndComposePackages(e.scopes[a],s.scopes[i]||(s.scopes[i]={}),r,t)}return s}function getMatch(e,r){if(r[e])return e;let t=e.length;do{const s=e.slice(0,t+1);if(s in r)return s}while(-1!==(t=e.lastIndexOf("/",t-1)))}function applyPackages(e,r){const t=getMatch(e,r);if(t){const s=r[t];if(null===s)return;if(!(e.length>t.length&&"/"!==s[s.length-1]))return s+e.slice(t.length);targetWarning(t,s,"should have a trailing '/'")}}function targetWarning(e,r,t){console.warn("Package target "+t+", resolving target '"+r+"' for "+e)}function resolveImportMap(e,r,t){let s=t&&getMatch(t,e.scopes);while(s){const t=applyPackages(r,e.scopes[s]);if(t)return t;s=getMatch(s.slice(0,s.lastIndexOf("/")),e.scopes)}return applyPackages(r,e.imports)||-1!==r.indexOf(":")&&r}const a=document.querySelector("script[type=esms-options]");const i=a?JSON.parse(a.innerHTML):self.esmsInitOptions?self.esmsInitOptions:{};let c=!!i.shimMode;const oe=globalHook(c&&i.resolve);const le=i.skip?new RegExp(i.skip):null;let de=i.nonce;if(!de){const e=document.querySelector("script[nonce]");e&&(de=e.getAttribute("nonce"))}const pe=globalHook(i.onerror||noop);const he=globalHook(i.onpolyfill||noop);const{revokeBlobURLs:ke,noLoadEventRetriggers:me}=i;const we=i.fetch?globalHook(i.fetch):fetch;function globalHook(e){return"string"===typeof e?self[e]:e}const ve=Array.isArray(i.polyfillEnable)?i.polyfillEnable:[];const ye=ve.includes("css-modules");const ge=ve.includes("json-modules");function setShimMode(){c=true}let $e;window.addEventListener("error",(e=>$e=e));function dynamicImportScript(e,{errUrl:t=e}={}){$e=void 0;const s=createBlob(`import*as m from'${e}';self._esmsi=m`);const a=Object.assign(document.createElement("script"),{type:"module",src:s});a.setAttribute("nonce",de);a.setAttribute("noshim","");const i=new Promise(((e,i)=>{a.addEventListener("error",cb);a.addEventListener("load",cb);function cb(){document.head.removeChild(a);if(self._esmsi){e(self._esmsi,r);self._esmsi=void 0}else{i($e.error||new Error(`Error loading or executing the graph of ${t} (check the console for ${s}).`));$e=void 0}}}));document.head.appendChild(a);return i}let Ae=dynamicImportScript;const Se=dynamicImportScript(createBlob("export default u=>import(u)")).then((e=>{e&&(Ae=e.default);return!!e}),noop);let Ce=false;let Le=false;let Ie=false;let Oe=false;let Ue=false;const xe=Promise.resolve(Se).then((e=>{if(e){Ue=true;return Promise.all([Ae(createBlob("import.meta")).then((()=>Ie=true),noop),ye&&Ae(createBlob('import"data:text/css,{}"assert{type:"css"}')).then((()=>Le=true),noop),ge&&Ae(createBlob('import"data:text/json,{}"assert{type:"json"}')).then((()=>Ce=true),noop),new Promise((e=>{self._$s=t=>{document.head.removeChild(r);t&&(Oe=true);delete self._$s;e()};const r=document.createElement("iframe");r.style.display="none";document.head.appendChild(r);r.contentWindow.document.write(`<script type=importmap nonce="${de}">{"imports":{"x":"data:text/javascript,"}}<\/script><script nonce="${de}">import('x').then(()=>1,()=>0).then(v=>parent._$s(v))<\/script>`)}))])}}));let Pe,Ee,Me,je=4194304;const Re=1===new Uint8Array(new Uint16Array([1]).buffer)[0];let _e,Be;function parse(e,r="@"){if(_e=e,_e.length>je||!Pe){for(;_e.length>je;)je*=2;Ee=new ArrayBuffer(4*je),Pe=function(e,r,t){"use asm";var s=new e.Int8Array(t),a=new e.Int16Array(t),i=new e.Int32Array(t),c=new e.Uint8Array(t),oe=new e.Uint16Array(t),le=816;function u(e){e=e|0;var r=0,t=0,c=0,de=0,pe=0;pe=le;le=le+14336|0;de=pe;s[589]=1;a[291]=0;a[292]=0;a[293]=-1;i[15]=i[2];s[590]=0;i[14]=0;s[588]=0;i[16]=pe+10240;i[17]=pe+2048;s[591]=0;e=(i[3]|0)+-2|0;i[18]=e;r=e+(i[12]<<1)|0;i[19]=r;e:while(1){t=e+2|0;i[18]=t;if(e>>>0>=r>>>0){c=18;break}r:do{switch(a[t>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if((((a[292]|0)==0?T(t)|0:0)?B(e+4|0,120,112,111,114,116)|0:0)?(b(),(s[589]|0)==0):0){c=9;break e}else c=17;break}case 105:{if(T(t)|0?B(e+4|0,109,112,111,114,116)|0:0){k();c=17}else c=17;break}case 59:{c=17;break}case 47:switch(a[e+4>>1]|0){case 47:{H();break r}case 42:{p(1);break r}default:{c=16;break e}}default:{c=16;break e}}}while(0);if((c|0)==17){c=0;i[15]=i[18]}e=i[18]|0;r=i[19]|0}if((c|0)==9){e=i[18]|0;i[15]=e;c=19}else if((c|0)==16){s[589]=0;i[18]=e;c=19}else if((c|0)==18)if(!(s[588]|0)){e=t;c=19}else e=0;do{if((c|0)==19){e:while(1){r=e+2|0;i[18]=r;t=r;if(e>>>0>=(i[19]|0)>>>0){c=75;break}r:do{switch(a[r>>1]|0){case 9:case 10:case 11:case 12:case 13:case 32:break;case 101:{if(((a[292]|0)==0?T(r)|0:0)?B(e+4|0,120,112,111,114,116)|0:0){b();c=74}else c=74;break}case 105:{if(T(r)|0?B(e+4|0,109,112,111,114,116)|0:0){k();c=74}else c=74;break}case 99:{if((T(r)|0?D(e+4|0,108,97,115,115)|0:0)?_(a[e+12>>1]|0)|0:0){s[591]=1;c=74}else c=74;break}case 40:{r=i[15]|0;t=i[17]|0;c=a[292]|0;a[292]=c+1<<16>>16;i[t+((c&65535)<<2)>>2]=r;c=74;break}case 41:{e=a[292]|0;if(!(e<<16>>16)){c=36;break e}c=e+-1<<16>>16;a[292]=c;e=i[11]|0;if((e|0)!=0?(i[e+20>>2]|0)==(i[(i[17]|0)+((c&65535)<<2)>>2]|0):0){r=e+4|0;if(!(i[r>>2]|0))i[r>>2]=t;i[e+12>>2]=t;i[11]=0;c=74}else c=74;break}case 123:{c=i[15]|0;t=i[8]|0;e=c;do{if((a[c>>1]|0)==41&(t|0)!=0?(i[t+4>>2]|0)==(c|0):0){r=i[9]|0;i[8]=r;if(!r){i[4]=0;break}else{i[r+28>>2]=0;break}}}while(0);r=a[292]|0;c=r&65535;s[de+c>>0]=s[591]|0;s[591]=0;t=i[17]|0;a[292]=r+1<<16>>16;i[t+(c<<2)>>2]=e;c=74;break}case 125:{e=a[292]|0;if(!(e<<16>>16)){c=49;break e}t=e+-1<<16>>16;a[292]=t;r=a[293]|0;if(e<<16>>16!=r<<16>>16)if(r<<16>>16!=-1&(t&65535)<(r&65535)){c=53;break e}else{c=74;break r}else{t=i[16]|0;c=(a[291]|0)+-1<<16>>16;a[291]=c;a[293]=a[t+((c&65535)<<1)>>1]|0;h();c=74;break r}}case 39:{d();c=74;break}case 34:{v();c=74;break}case 47:switch(a[e+4>>1]|0){case 47:{H();break r}case 42:{p(1);break r}default:{r=i[15]|0;t=a[r>>1]|0;t:do{if(!(m(t)|0)){switch(t<<16>>16){case 41:if(M(i[(i[17]|0)+(oe[292]<<2)>>2]|0)|0){c=71;break t}else{c=68;break t}case 125:break;default:{c=68;break t}}e=oe[292]|0;if(!(g(i[(i[17]|0)+(e<<2)>>2]|0)|0)?(s[de+e>>0]|0)==0:0)c=68;else c=71}else switch(t<<16>>16){case 46:if(((a[r+-2>>1]|0)+-48&65535)<10){c=68;break t}else{c=71;break t}case 43:if((a[r+-2>>1]|0)==43){c=68;break t}else{c=71;break t}case 45:if((a[r+-2>>1]|0)==45){c=68;break t}else{c=71;break t}default:{c=71;break t}}}while(0);t:do{if((c|0)==68){c=0;if(!(o(r)|0)){switch(t<<16>>16){case 0:{c=71;break t}case 47:break;default:{e=1;break t}}if(!(s[590]|0))e=1;else c=71}else c=71}}while(0);if((c|0)==71){I();e=0}s[590]=e;c=74;break r}}case 96:{h();c=74;break}default:c=74}}while(0);if((c|0)==74){c=0;i[15]=i[18]}e=i[18]|0}if((c|0)==36){Z();e=0;break}else if((c|0)==49){Z();e=0;break}else if((c|0)==53){Z();e=0;break}else if((c|0)==75){e=(a[293]|0)==-1&(a[292]|0)==0&(s[588]|0)==0;break}}}while(0);le=pe;return e|0}function b(){var e=0,r=0,t=0,c=0,oe=0,le=0;oe=i[18]|0;le=oe+12|0;i[18]=le;r=w(1)|0;e=i[18]|0;if(!((e|0)==(le|0)?!(E(r)|0):0))c=3;e:do{if((c|0)==3){r:do{switch(r<<16>>16){case 100:{K(e,e+14|0);break e}case 97:{i[18]=e+10;w(1)|0;e=i[18]|0;c=6;break}case 102:{c=6;break}case 99:{if(D(e+2|0,108,97,115,115)|0?(t=e+10|0,G(a[t>>1]|0)|0):0){i[18]=t;oe=w(1)|0;le=i[18]|0;J(oe)|0;K(le,i[18]|0);i[18]=(i[18]|0)+-2;break e}e=e+4|0;i[18]=e;c=13;break}case 108:case 118:{c=13;break}case 123:{i[18]=e+2;e=w(1)|0;t=i[18]|0;while(1){J(e)|0;e=i[18]|0;w(1)|0;e=$(t,e)|0;if(e<<16>>16==44){i[18]=(i[18]|0)+2;e=w(1)|0}r=t;t=i[18]|0;if(e<<16>>16==125){c=29;break}if((t|0)==(r|0)){c=26;break}if(t>>>0>(i[19]|0)>>>0){c=28;break}}if((c|0)==26){Z();break e}else if((c|0)==28){Z();break e}else if((c|0)==29){i[18]=t+2;c=31;break r}break}case 42:{i[18]=e+2;w(1)|0;c=i[18]|0;$(c,c)|0;c=31;break}default:{}}}while(0);if((c|0)==6){i[18]=e+16;e=w(1)|0;if(e<<16>>16==42){i[18]=(i[18]|0)+2;e=w(1)|0}le=i[18]|0;J(e)|0;K(le,i[18]|0);i[18]=(i[18]|0)+-2;break}else if((c|0)==13){e=e+4|0;i[18]=e;s[589]=0;r:while(1){i[18]=e+2;le=w(1)|0;e=i[18]|0;switch((J(le)|0)<<16>>16){case 91:case 123:{c=15;break r}default:{}}r=i[18]|0;if((r|0)==(e|0))break e;K(e,r);switch((w(1)|0)<<16>>16){case 61:{c=19;break r}case 44:break;default:{c=20;break r}}e=i[18]|0}if((c|0)==15){i[18]=(i[18]|0)+-2;break}else if((c|0)==19){i[18]=(i[18]|0)+-2;break}else if((c|0)==20){i[18]=(i[18]|0)+-2;break}}else if((c|0)==31)r=w(1)|0;e=i[18]|0;if(r<<16>>16==102?L(e+2|0,114,111,109)|0:0){i[18]=e+8;l(oe,w(1)|0);break}i[18]=e+-2}}while(0);return}function k(){var e=0,r=0,t=0,c=0,oe=0;oe=i[18]|0;r=oe+12|0;i[18]=r;e:do{switch((w(1)|0)<<16>>16){case 40:{r=i[17]|0;t=a[292]|0;a[292]=t+1<<16>>16;i[r+((t&65535)<<2)>>2]=oe;if((a[i[15]>>1]|0)!=46){A(oe,(i[18]|0)+2|0,0,oe);i[11]=i[8];i[18]=(i[18]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d();break}case 34:{v();break}default:{i[18]=(i[18]|0)+-2;break e}}i[18]=(i[18]|0)+2;switch((w(1)|0)<<16>>16){case 44:{oe=i[18]|0;i[(i[8]|0)+4>>2]=oe;i[18]=oe+2;w(1)|0;oe=i[18]|0;t=i[8]|0;i[t+16>>2]=oe;s[t+24>>0]=1;i[18]=oe+-2;break e}case 41:{a[292]=(a[292]|0)+-1<<16>>16;t=i[18]|0;oe=i[8]|0;i[oe+4>>2]=t;i[oe+12>>2]=t;s[oe+24>>0]=1;break e}default:{i[18]=(i[18]|0)+-2;break e}}}break}case 46:{i[18]=(i[18]|0)+2;if(((w(1)|0)<<16>>16==109?(e=i[18]|0,L(e+2|0,101,116,97)|0):0)?(a[i[15]>>1]|0)!=46:0)A(oe,oe,e+8|0,2);break}case 42:case 123:case 39:case 34:{c=16;break}default:if((i[18]|0)!=(r|0))c=16}}while(0);do{if((c|0)==16){if(a[292]|0){i[18]=(i[18]|0)+-2;break}e=i[19]|0;r=i[18]|0;e:while(1){if(r>>>0>=e>>>0){c=23;break}t=a[r>>1]|0;switch(t<<16>>16){case 34:case 39:{c=21;break e}default:{}}c=r+2|0;i[18]=c;r=c}if((c|0)==21){l(oe,t);break}else if((c|0)==23){Z();break}}}while(0);return}function l(e,r){e=e|0;r=r|0;var t=0,s=0;t=(i[18]|0)+2|0;switch(r<<16>>16){case 39:{d();s=5;break}case 34:{v();s=5;break}default:Z()}do{if((s|0)==5){A(e,t,i[18]|0,1);i[18]=(i[18]|0)+2;s=(w(0)|0)<<16>>16==97;r=i[18]|0;if(s?B(r+2|0,115,115,101,114,116)|0:0){i[18]=r+12;if((w(1)|0)<<16>>16!=123){i[18]=r;break}e=i[18]|0;t=e;e:while(1){i[18]=t+2;t=w(1)|0;switch(t<<16>>16){case 39:{d();i[18]=(i[18]|0)+2;t=w(1)|0;break}case 34:{v();i[18]=(i[18]|0)+2;t=w(1)|0;break}default:t=J(t)|0}if(t<<16>>16!=58){s=16;break}i[18]=(i[18]|0)+2;switch((w(1)|0)<<16>>16){case 39:{d();break}case 34:{v();break}default:{s=20;break e}}i[18]=(i[18]|0)+2;switch((w(1)|0)<<16>>16){case 125:{s=25;break e}case 44:break;default:{s=24;break e}}i[18]=(i[18]|0)+2;if((w(1)|0)<<16>>16==125){s=25;break}t=i[18]|0}if((s|0)==16){i[18]=r;break}else if((s|0)==20){i[18]=r;break}else if((s|0)==24){i[18]=r;break}else if((s|0)==25){s=i[8]|0;i[s+16>>2]=e;i[s+12>>2]=(i[18]|0)+2;break}}i[18]=r+-2}}while(0);return}function o(e){e=e|0;e:do{switch(a[e>>1]|0){case 100:switch(a[e+-2>>1]|0){case 105:{e=z(e+-4|0,118,111)|0;break e}case 108:{e=q(e+-4|0,121,105,101)|0;break e}default:{e=0;break e}}case 101:{switch(a[e+-2>>1]|0){case 115:break;case 116:{e=P(e+-4|0,100,101,108,101)|0;break e}default:{e=0;break e}}switch(a[e+-4>>1]|0){case 108:{e=F(e+-6|0,101)|0;break e}case 97:{e=F(e+-6|0,99)|0;break e}default:{e=0;break e}}}case 102:{if((a[e+-2>>1]|0)==111?(a[e+-4>>1]|0)==101:0)switch(a[e+-6>>1]|0){case 99:{e=S(e+-8|0,105,110,115,116,97,110)|0;break e}case 112:{e=z(e+-8|0,116,121)|0;break e}default:{e=0;break e}}else e=0;break}case 110:{e=e+-2|0;if(F(e,105)|0)e=1;else e=O(e,114,101,116,117,114)|0;break}case 111:{e=F(e+-2|0,100)|0;break}case 114:{e=U(e+-2|0,100,101,98,117,103,103,101)|0;break}case 116:{e=P(e+-2|0,97,119,97,105)|0;break}case 119:switch(a[e+-2>>1]|0){case 101:{e=F(e+-4|0,110)|0;break e}case 111:{e=q(e+-4|0,116,104,114)|0;break e}default:{e=0;break e}}default:e=0}}while(0);return e|0}function h(){var e=0,r=0,t=0;r=i[19]|0;t=i[18]|0;e:while(1){e=t+2|0;if(t>>>0>=r>>>0){r=8;break}switch(a[e>>1]|0){case 96:{r=9;break e}case 36:{if((a[t+4>>1]|0)==123){r=6;break e}break}case 92:{e=t+4|0;break}default:{}}t=e}if((r|0)==6){i[18]=t+4;e=a[293]|0;r=i[16]|0;t=a[291]|0;a[291]=t+1<<16>>16;a[r+((t&65535)<<1)>>1]=e;t=(a[292]|0)+1<<16>>16;a[292]=t;a[293]=t}else if((r|0)==8){i[18]=e;Z()}else if((r|0)==9)i[18]=e;return}function w(e){e=e|0;var r=0,t=0,s=0;t=i[18]|0;e:do{r=a[t>>1]|0;r:do{if(r<<16>>16!=47)if(e)if(_(r)|0)break;else break e;else if(R(r)|0)break;else break e;else switch(a[t+2>>1]|0){case 47:{H();break r}case 42:{p(e);break r}default:{r=47;break e}}}while(0);s=i[18]|0;t=s+2|0;i[18]=t}while(s>>>0<(i[19]|0)>>>0);return r|0}function d(){var e=0,r=0,t=0,s=0;s=i[19]|0;e=i[18]|0;e:while(1){t=e+2|0;if(e>>>0>=s>>>0){e=8;break}r=a[t>>1]|0;switch(r<<16>>16){case 39:{e=9;break e}case 92:{r=e+4|0;if((a[r>>1]|0)==13){e=e+6|0;e=(a[e>>1]|0)==10?e:r}else e=r;break}default:if(ae(r)|0){e=8;break e}else e=t}}if((e|0)==8){i[18]=t;Z()}else if((e|0)==9)i[18]=t;return}function v(){var e=0,r=0,t=0,s=0;s=i[19]|0;e=i[18]|0;e:while(1){t=e+2|0;if(e>>>0>=s>>>0){e=8;break}r=a[t>>1]|0;switch(r<<16>>16){case 34:{e=9;break e}case 92:{r=e+4|0;if((a[r>>1]|0)==13){e=e+6|0;e=(a[e>>1]|0)==10?e:r}else e=r;break}default:if(ae(r)|0){e=8;break e}else e=t}}if((e|0)==8){i[18]=t;Z()}else if((e|0)==9)i[18]=t;return}function A(e,r,t,a){e=e|0;r=r|0;t=t|0;a=a|0;var c=0,oe=0;c=i[13]|0;i[13]=c+32;oe=i[8]|0;i[((oe|0)==0?16:oe+28|0)>>2]=c;i[9]=oe;i[8]=c;i[c+8>>2]=e;do{if(2!=(a|0))if(1==(a|0)){i[c+12>>2]=t+2;break}else{i[c+12>>2]=i[3];break}else i[c+12>>2]=t}while(0);i[c>>2]=r;i[c+4>>2]=t;i[c+16>>2]=0;i[c+20>>2]=a;s[c+24>>0]=1==(a|0)&1;i[c+28>>2]=0;return}function y(){var e=0,r=0,t=0;t=i[19]|0;r=i[18]|0;e:while(1){e=r+2|0;if(r>>>0>=t>>>0){r=6;break}switch(a[e>>1]|0){case 13:case 10:{r=6;break e}case 93:{r=7;break e}case 92:{e=r+4|0;break}default:{}}r=e}if((r|0)==6){i[18]=e;Z();e=0}else if((r|0)==7){i[18]=e;e=93}return e|0}function C(e,r,t,s,i,c,oe,le){e=e|0;r=r|0;t=t|0;s=s|0;i=i|0;c=c|0;oe=oe|0;le=le|0;if((((((a[e+12>>1]|0)==le<<16>>16?(a[e+10>>1]|0)==oe<<16>>16:0)?(a[e+8>>1]|0)==c<<16>>16:0)?(a[e+6>>1]|0)==i<<16>>16:0)?(a[e+4>>1]|0)==s<<16>>16:0)?(a[e+2>>1]|0)==t<<16>>16:0)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function g(e){e=e|0;switch(a[e>>1]|0){case 62:{e=(a[e+-2>>1]|0)==61;break}case 41:case 59:{e=1;break}case 104:{e=P(e+-2|0,99,97,116,99)|0;break}case 121:{e=S(e+-2|0,102,105,110,97,108,108)|0;break}case 101:{e=q(e+-2|0,101,108,115)|0;break}default:e=0}return e|0}function I(){var e=0,r=0,t=0;e:while(1){e=i[18]|0;r=e+2|0;i[18]=r;if(e>>>0>=(i[19]|0)>>>0){t=7;break}switch(a[r>>1]|0){case 13:case 10:{t=7;break e}case 47:break e;case 91:{y()|0;break}case 92:{i[18]=e+4;break}default:{}}}if((t|0)==7)Z();return}function p(e){e=e|0;var r=0,t=0,s=0,c=0,oe=0;c=(i[18]|0)+2|0;i[18]=c;t=i[19]|0;while(1){r=c+2|0;if(c>>>0>=t>>>0)break;s=a[r>>1]|0;if(!e?ae(s)|0:0)break;if(s<<16>>16==42?(a[c+4>>1]|0)==47:0){oe=8;break}c=r}if((oe|0)==8){i[18]=r;r=c+4|0}i[18]=r;return}function x(e,r,t,s,i,c,oe){e=e|0;r=r|0;t=t|0;s=s|0;i=i|0;c=c|0;oe=oe|0;if(((((a[e+10>>1]|0)==oe<<16>>16?(a[e+8>>1]|0)==c<<16>>16:0)?(a[e+6>>1]|0)==i<<16>>16:0)?(a[e+4>>1]|0)==s<<16>>16:0)?(a[e+2>>1]|0)==t<<16>>16:0)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function U(e,r,t,s,c,oe,le,de){e=e|0;r=r|0;t=t|0;s=s|0;c=c|0;oe=oe|0;le=le|0;de=de|0;var pe=0,he=0;he=e+-12|0;pe=i[3]|0;if(he>>>0>=pe>>>0?C(he,r,t,s,c,oe,le,de)|0:0)if((he|0)==(pe|0))pe=1;else pe=G(a[e+-14>>1]|0)|0;else pe=0;return pe|0}function E(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:{e=1;break}default:if((e&-8)<<16>>16==40|(e+-58&65535)<6)e=1;else{switch(e<<16>>16){case 91:case 93:case 94:{e=1;break e}default:{}}e=(e+-123&65535)<4}}}while(0);return e|0}function m(e){e=e|0;e:do{switch(e<<16>>16){case 38:case 37:case 33:break;default:if(!((e+-58&65535)<6|(e+-40&65535)<7&e<<16>>16!=41)){switch(e<<16>>16){case 91:case 94:break e;default:{}}return e<<16>>16!=125&(e+-123&65535)<4|0}}}while(0);return 1}function S(e,r,t,s,c,oe,le){e=e|0;r=r|0;t=t|0;s=s|0;c=c|0;oe=oe|0;le=le|0;var de=0,pe=0;pe=e+-10|0;de=i[3]|0;if(pe>>>0>=de>>>0?x(pe,r,t,s,c,oe,le)|0:0)if((pe|0)==(de|0))de=1;else de=G(a[e+-12>>1]|0)|0;else de=0;return de|0}function O(e,r,t,s,c,oe){e=e|0;r=r|0;t=t|0;s=s|0;c=c|0;oe=oe|0;var le=0,de=0;de=e+-8|0;le=i[3]|0;if(de>>>0>=le>>>0?B(de,r,t,s,c,oe)|0:0)if((de|0)==(le|0))le=1;else le=G(a[e+-10>>1]|0)|0;else le=0;return le|0}function $(e,r){e=e|0;r=r|0;var t=0,s=0;t=i[18]|0;s=a[t>>1]|0;if(s<<16>>16==97){i[18]=t+4;r=w(1)|0;e=i[18]|0;J(r)|0;r=i[18]|0;s=w(1)|0;t=i[18]|0}if((t|0)!=(e|0))K(e,r);return s|0}function j(e){e=e|0;var r=0,t=0,s=0,c=0;t=le;le=le+16|0;s=t;i[s>>2]=0;i[12]=e;r=i[3]|0;c=r+(e<<1)|0;e=c+2|0;a[c>>1]=0;i[s>>2]=e;i[13]=e;i[4]=0;i[8]=0;i[6]=0;i[5]=0;i[10]=0;i[7]=0;le=t;return r|0}function B(e,r,t,s,i,c){e=e|0;r=r|0;t=t|0;s=s|0;i=i|0;c=c|0;if((((a[e+8>>1]|0)==c<<16>>16?(a[e+6>>1]|0)==i<<16>>16:0)?(a[e+4>>1]|0)==s<<16>>16:0)?(a[e+2>>1]|0)==t<<16>>16:0)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function P(e,r,t,s,c){e=e|0;r=r|0;t=t|0;s=s|0;c=c|0;var oe=0,le=0;le=e+-6|0;oe=i[3]|0;if(le>>>0>=oe>>>0?D(le,r,t,s,c)|0:0)if((le|0)==(oe|0))oe=1;else oe=G(a[e+-8>>1]|0)|0;else oe=0;return oe|0}function q(e,r,t,s){e=e|0;r=r|0;t=t|0;s=s|0;var c=0,oe=0;oe=e+-4|0;c=i[3]|0;if(oe>>>0>=c>>>0?L(oe,r,t,s)|0:0)if((oe|0)==(c|0))c=1;else c=G(a[e+-6>>1]|0)|0;else c=0;return c|0}function z(e,r,t){e=e|0;r=r|0;t=t|0;var s=0,c=0;c=e+-2|0;s=i[3]|0;if(c>>>0>=s>>>0?Q(c,r,t)|0:0)if((c|0)==(s|0))s=1;else s=G(a[e+-4>>1]|0)|0;else s=0;return s|0}function D(e,r,t,s,i){e=e|0;r=r|0;t=t|0;s=s|0;i=i|0;if(((a[e+6>>1]|0)==i<<16>>16?(a[e+4>>1]|0)==s<<16>>16:0)?(a[e+2>>1]|0)==t<<16>>16:0)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function F(e,r){e=e|0;r=r|0;var t=0;t=i[3]|0;if(t>>>0<=e>>>0?(a[e>>1]|0)==r<<16>>16:0)if((t|0)==(e|0))t=1;else t=G(a[e+-2>>1]|0)|0;else t=0;return t|0}function G(e){e=e|0;e:do{if((e+-9&65535)<5)e=1;else{switch(e<<16>>16){case 32:case 160:{e=1;break e}default:{}}e=e<<16>>16!=46&(E(e)|0)}}while(0);return e|0}function H(){var e=0,r=0,t=0;e=i[19]|0;t=i[18]|0;e:while(1){r=t+2|0;if(t>>>0>=e>>>0)break;switch(a[r>>1]|0){case 13:case 10:break e;default:t=r}}i[18]=r;return}function J(e){e=e|0;while(1){if(_(e)|0)break;if(E(e)|0)break;e=(i[18]|0)+2|0;i[18]=e;e=a[e>>1]|0;if(!(e<<16>>16)){e=0;break}}return e|0}function K(e,r){e=e|0;r=r|0;var t=0,s=0;t=i[13]|0;i[13]=t+12;s=i[10]|0;i[((s|0)==0?20:s+8|0)>>2]=t;i[10]=t;i[t>>2]=e;i[t+4>>2]=r;i[t+8>>2]=0;return}function L(e,r,t,s){e=e|0;r=r|0;t=t|0;s=s|0;if((a[e+4>>1]|0)==s<<16>>16?(a[e+2>>1]|0)==t<<16>>16:0)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function M(e){e=e|0;if(!(O(e,119,104,105,108,101)|0)?!(q(e,102,111,114)|0):0)e=z(e,105,102)|0;else e=1;return e|0}function N(){var e=0;e=i[(i[6]|0)+20>>2]|0;switch(e|0){case 1:{e=-1;break}case 2:{e=-2;break}default:e=e-(i[3]|0)>>1}return e|0}function Q(e,r,t){e=e|0;r=r|0;t=t|0;if((a[e+2>>1]|0)==t<<16>>16)r=(a[e>>1]|0)==r<<16>>16;else r=0;return r|0}function R(e){e=e|0;switch(e<<16>>16){case 160:case 32:case 12:case 11:case 9:{e=1;break}default:e=0}return e|0}function T(e){e=e|0;if((i[3]|0)==(e|0))e=1;else e=G(a[e+-2>>1]|0)|0;return e|0}function V(){var e=0;e=i[(i[6]|0)+16>>2]|0;if(!e)e=-1;else e=e-(i[3]|0)>>1;return e|0}function W(){var e=0;e=i[6]|0;e=i[((e|0)==0?16:e+28|0)>>2]|0;i[6]=e;return(e|0)!=0|0}function X(){var e=0;e=i[7]|0;e=i[((e|0)==0?20:e+8|0)>>2]|0;i[7]=e;return(e|0)!=0|0}function Y(e){e=e|0;var r=0;r=le;le=le+e|0;le=le+15&-16;return r|0}function Z(){s[588]=1;i[14]=(i[18]|0)-(i[3]|0)>>1;i[18]=(i[19]|0)+2;return}function _(e){e=e|0;return(e|128)<<16>>16==160|(e+-9&65535)<5|0}function ee(){return(i[(i[6]|0)+12>>2]|0)-(i[3]|0)>>1|0}function re(){return(i[(i[6]|0)+8>>2]|0)-(i[3]|0)>>1|0}function ae(e){e=e|0;return e<<16>>16==13|e<<16>>16==10|0}function se(){return(i[(i[6]|0)+4>>2]|0)-(i[3]|0)>>1|0}function ie(){return(i[(i[7]|0)+4>>2]|0)-(i[3]|0)>>1|0}function te(){return(i[i[6]>>2]|0)-(i[3]|0)>>1|0}function ce(){return(i[i[7]>>2]|0)-(i[3]|0)>>1|0}function fe(){return c[(i[6]|0)+24>>0]|0|0}function ne(e){e=e|0;i[3]=e;return}function ue(){return(s[589]|0)!=0|0}function be(){return i[14]|0}return{ai:V,e:be,ee:ie,es:ce,f:ue,id:N,ie:se,ip:fe,is:te,p:u,re:X,ri:W,sa:j,se:ee,ses:ne,ss:re,sta:Y}}({Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array},{},Ee),Me=Pe.sta(2*je)}const t=_e.length+1;if(Pe.ses(Me),Pe.sa(t-1),(Re?n:f)(_e,new Uint16Array(Ee,Me,t)),!Pe.p())throw Object.assign(new Error(`Parse error ${r}:${_e.slice(0,Pe.e()).split("\n").length}:${Pe.e()-_e.lastIndexOf("\n",Pe.e()-1)}`),{idx:Pe.e()});const s=[],a=[];for(;Pe.ri();){const e=Pe.is(),r=Pe.ie(),t=Pe.ai(),a=Pe.id(),i=Pe.ss(),c=Pe.se();let oe;Pe.ip()&&(oe=u(-1===a?e:e+1,_e.charCodeAt(-1===a?e-1:e))),s.push({n:oe,s:e,e:r,ss:i,se:c,d:a,a:t})}for(;Pe.re();)a.push(_e.slice(Pe.es(),Pe.ee()));return[s,a,!!Pe.f()]}function f(e,r){const t=e.length;let s=0;for(;s<t;){const t=e.charCodeAt(s);r[s++]=(255&t)<<8|t>>>8}}function n(e,r){const t=e.length;let s=0;for(;s<t;)r[s]=e.charCodeAt(s++)}function u(e,r){Be=e;let t="",s=Be;for(;;){Be>=_e.length&&syntaxError();const e=_e.charCodeAt(Be);if(e===r)break;92===e?(t+=_e.slice(s,Be),t+=b(),s=Be):(8232===e||8233===e||l(e)&&syntaxError(),++Be)}return t+=_e.slice(s,Be++),t}function b(){let e=_e.charCodeAt(++Be);switch(++Be,e){case 110:return"\n";case 114:return"\r";case 120:return String.fromCharCode(k(2));case 117:return function(){let e;123===_e.charCodeAt(Be)?(++Be,e=k(_e.indexOf("}",Be)-Be),++Be,e>1114111&&syntaxError()):e=k(4);return e<=65535?String.fromCharCode(e):(e-=65536,String.fromCharCode(55296+(e>>10),56320+(1023&e)))}();case 116:return"\t";case 98:return"\b";case 118:return"\v";case 102:return"\f";case 13:10===_e.charCodeAt(Be)&&++Be;case 10:return"";case 56:case 57:syntaxError();default:if(e>=48&&e<=55){let r=_e.substr(Be-1,3).match(/^[0-7]+/)[0],t=parseInt(r,8);return t>255&&(r=r.slice(0,-1),t=parseInt(r,8)),Be+=r.length-1,e=_e.charCodeAt(Be),"0"===r&&56!==e&&57!==e||syntaxError(),String.fromCharCode(t)}return l(e)?"":String.fromCharCode(e)}}function k(e){const r=Be;let t=0,s=0;for(let r=0;r<e;++r,++Be){let e,a=_e.charCodeAt(Be);if(95!==a){if(a>=97)e=a-97+10;else if(a>=65)e=a-65+10;else{if(!(a>=48&&a<=57))break;e=a-48}if(e>=16)break;s=a,t=16*t+e}else 95!==s&&0!==r||syntaxError(),s=a}return 95!==s&&Be-r===e||syntaxError(),t}function l(e){return 13===e||10===e}async function defaultResolve(e,r){return resolveImportMap(Je,resolveIfNotPlainOrUrl(e,r)||e,r)}async function _resolve(e,r){const t=resolveIfNotPlainOrUrl(e,r);return{r:resolveImportMap(Je,t||e,r),b:!t&&!isURL(e)}}const Fe=oe?async(e,r)=>({r:await esmsInitOptions.resolve(e,r,defaultResolve),b:false}):_resolve;let Ne=0;const qe={};async function loadAll(e,r){if(!e.b&&!r[e.u]){r[e.u]=1;await e.L;await Promise.all(e.d.map((e=>loadAll(e,r))));e.n||(e.n=e.d.some((e=>e.n)))}}let Je={imports:{},scopes:{}};let Te=false;let He;const Ze=xe.then((()=>{if(!c){let e=false;for(const r of document.querySelectorAll('script[type="module-shim"],script[type="importmap-shim"],script[type="module"],script[type="importmap"]')){e||"module"!==r.type||(e=true);if(r.type.endsWith("-shim")){setShimMode();break}if(e&&"importmap"===r.type){Te=true;break}}}He=Ue&&Ie&&Oe&&(!ge||Ce)&&(!ye||Le)&&!Te&&true;He||he();if(!c&&He);else{new MutationObserver((e=>{for(const r of e)if("childList"===r.type)for(const e of r.addedNodes)if("SCRIPT"===e.tagName){(!c&&"module"===e.type||c&&"module-shim"===e.type)&&processScript(e);(!c&&"importmap"===e.type||c&&"importmap-shim"===e.type)&&processImportMap(e)}else"LINK"===e.tagName&&"modulepreload"===e.rel&&processPreload(e)})).observe(document,{childList:true,subtree:true});processImportMaps();processScriptsAndPreloads()}}));let Ge=Ze;let De=true;async function topLevelLoad(e,r,t,s,a){c||(De=false);await Ge;if(!c&&He){if(s)return null;await a;return Ae(t?createBlob(t):e,{errUrl:e||t})}const i=getOrCreateLoad(e,r,t);const oe={};await loadAll(i,oe);Ke=void 0;resolveDeps(i,oe);await a;if(t&&!c&&!i.n&&true){const e=await Ae(createBlob(t),{errUrl:t});ke&&revokeObjectURLs(Object.keys(oe));return e}const le=await Ae(i.b,{errUrl:i.u});i.s&&(await Ae(i.s)).u$_(le);ke&&revokeObjectURLs(Object.keys(oe));return le}function revokeObjectURLs(e){let r=0;const t=e.length;const s=self.requestIdleCallback?self.requestIdleCallback:self.requestAnimationFrame;s(cleanup);function cleanup(){const a=100*r;if(!(a>t)){for(const r of e.slice(a,a+100)){const e=qe[r];e&&URL.revokeObjectURL(e.b)}r++;s(cleanup)}}}async function importShim(e,t=r,s){await Ze;if(De||c||!He){processImportMaps();c||(De=false)}await Ge;return topLevelLoad((await Fe(e,t)).r||throwUnresolved(e,t),{credentials:"same-origin"})}self.importShim=importShim;const We={};async function importMetaResolve(e,r=this.url){return(await Fe(e,`${r}`)).r||throwUnresolved(e,r)}self._esmsm=We;function urlJsString(e){return`'${e.replace(/'/g,"\\'")}'`}let Ke;function resolveDeps(r,t){if(r.b||!t[r.u])return;t[r.u]=0;for(const e of r.d)resolveDeps(e,t);if(!c&&!r.n){r.b=Ke=r.u;r.S=void 0;return}const[s]=r.a;const a=r.S;let i=e&&Ke?`import '${Ke}';`:"";if(s.length){let e=0,t=0;for(const{s:c,se:oe,d:le}of s)if(-1===le){const s=r.d[t++];let le=s.b;if(le){if(s.s){i+=`${a.slice(e,c-1)}/*${a.slice(c-1,oe)}*/${urlJsString(le)};import*as m$_${t} from'${s.b}';import{u$_ as u$_${t}}from'${s.s}';u$_${t}(m$_${t})`;e=oe;s.s=void 0;continue}}else(le=s.s)||(le=s.s=createBlob(`export function u$_(m){${s.a[1].map((e=>"default"===e?"$_default=m.default":`${e}=m.${e}`)).join(",")}}${s.a[1].map((e=>"default"===e?"let $_default;export{$_default as default}":`export let ${e}`)).join(";")}\n//# sourceURL=${s.r}?cycle`));i+=`${a.slice(e,c-1)}/*${a.slice(c-1,oe)}*/${urlJsString(le)}`;e=oe}else if(-2===le){We[r.r]={url:r.r,resolve:importMetaResolve};i+=`${a.slice(e,c)}self._esmsm[${urlJsString(r.r)}]`;e=oe}else{i+=`${a.slice(e,le+6)}Shim(${a.slice(c,oe)}, ${r.r&&urlJsString(r.r)}`;e=oe}i+=a.slice(e)}else i+=a;i=i.replace(/\/\/# sourceMappingURL=(.*)\s*$/,((e,t)=>e.replace(t,(()=>new URL(t,r.r)))));let oe=false;i=i.replace(/\/\/# sourceURL=(.*)\s*$/,((e,t)=>(oe=true,e.replace(t,(()=>new URL(t,r.r))))));oe||(i+="\n//# sourceURL="+r.r);r.b=Ke=createBlob(i);r.S=void 0}const ze=/^(text|application)\/(x-)?javascript(;|$)/;const Qe=/^(text|application)\/json(;|$)/;const Ve=/^(text|application)\/css(;|$)/;const Xe=/^application\/wasm(;|$)/;const Ye=/url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g;let er=[];let rr=0;function pushFetchPool(){if(++rr>100)return new Promise((e=>er.push(e)))}function popFetchPool(){rr--;er.length&&er.shift()()}async function doFetch(e,r){const t=pushFetchPool();t&&await t;try{var s=await we(e,r)}finally{popFetchPool()}if(!s.ok)throw new Error(`${s.status} ${s.statusText} ${s.url}`);const a=s.headers.get("content-type");if(ze.test(a))return{r:s.url,s:await s.text(),t:"js"};if(Qe.test(a))return{r:s.url,s:`export default ${await s.text()}`,t:"json"};if(Ve.test(a))return{r:s.url,s:`var s=new CSSStyleSheet();s.replaceSync(${JSON.stringify((await s.text()).replace(Ye,((r,t,s,a)=>`url(${t}${resolveUrl(s||a,e)}${t})`)))});export default s;`,t:"css"};throw Xe.test(a)?new Error("WASM modules not yet supported"):new Error(`Unknown Content-Type "${a}"`)}function getOrCreateLoad(e,r,t){let s=qe[e];if(s)return s;s=qe[e]={u:e,r:void 0,f:void 0,S:void 0,L:void 0,a:void 0,d:void 0,b:void 0,s:void 0,n:false,t:null};s.f=(async()=>{if(!t){let a;({r:s.r,s:t,t:a}=await(nr[e]||doFetch(e,r)));if(a&&!c){if("css"===a&&!ye||"json"===a&&!ge)throw new Error(`${a}-modules must be enabled to polyfill via: window.esmsInitOptions = { polyfillEnable: ['${a}-modules'] }`);("css"===a&&!Le||"json"===a&&!Ce)&&(s.n=true)}}try{s.a=parse(t,s.u)}catch(e){console.warn(e);s.a=[[],[]]}s.S=t;return s})();s.L=s.f.then((async()=>{let e=r;s.d=(await Promise.all(s.a[0].map((async({n:r,d:t})=>{(t>=0&&!Ue||2===t&&!Ie)&&(s.n=true);if(!r)return;const{r:a,b:i}=await Fe(r,s.r||s.u);!i||Oe&&!Te||(s.n=true);if(-1===t){a||throwUnresolved(r,s.r||s.u);if(le&&le.test(a))return{b:a};e.integrity&&(e=Object.assign({},e,{integrity:void 0}));return getOrCreateLoad(a,e).f}})))).filter((e=>e))}));return s}function processScriptsAndPreloads(){for(const e of document.querySelectorAll(c?'script[type="module-shim"]':'script[type="module"]'))processScript(e);for(const e of document.querySelectorAll('link[rel="modulepreload"]'))processPreload(e)}function processImportMaps(){for(const e of document.querySelectorAll(c?'script[type="importmap-shim"]':'script[type="importmap"]'))processImportMap(e)}function getFetchOpts(e){const r={};e.integrity&&(r.integrity=e.integrity);e.referrerpolicy&&(r.referrerPolicy=e.referrerpolicy);"use-credentials"===e.crossorigin?r.credentials="include":"anonymous"===e.crossorigin?r.credentials="omit":r.credentials="same-origin";return r}let tr=Promise.resolve();let sr=1;function domContentLoadedCheck(){0!==--sr||me||document.dispatchEvent(new Event("DOMContentLoaded"))}document.addEventListener("DOMContentLoaded",(async()=>{await Ze;domContentLoadedCheck();if(c||!He){processImportMaps();processScriptsAndPreloads()}}));let ar=1;"complete"===document.readyState?readyStateCompleteCheck():document.addEventListener("readystatechange",(async()=>{processImportMaps();await Ze;readyStateCompleteCheck()}));function readyStateCompleteCheck(){0!==--ar||me||document.dispatchEvent(new Event("readystatechange"))}function processImportMap(e){if(!e.ep&&(e.src||e.innerHTML)){e.ep=true;if(e.src){if(!c)return;Te=true}if(De){Ge=Ge.then((async()=>{Je=resolveAndComposeImportMap(e.src?await(await we(e.src)).json():JSON.parse(e.innerHTML),e.src||r,Je)}));c||(De=false)}}}function processScript(e){if(e.ep)return;if(null!==e.getAttribute("noshim"))return;if(!e.src&&!e.innerHTML)return;e.ep=true;const t=ar>0;const s=sr>0;t&&ar++;s&&sr++;const a=topLevelLoad(e.src||`${r}?${Ne++}`,getFetchOpts(e),!e.src&&e.innerHTML,!c,t&&tr).catch((e=>{setTimeout((()=>{throw e}));pe(e)}));t&&(tr=a.then(readyStateCompleteCheck));s&&a.then(domContentLoadedCheck)}const nr={};function processPreload(e){if(!e.ep){e.ep=true;nr[e.href]||(nr[e.href]=doFetch(e.href,getFetchOpts(e)))}}function throwUnresolved(e,r){throw Error("Unable to resolve specifier '"+e+(r?"' from "+r:"'"))}})();
@@ -26,9 +26,9 @@ module Importmap::ImportmapTagsHelper
26
26
  end
27
27
 
28
28
  # Include the es-modules-shim needed to make importmaps work in browsers without native support (like Firefox + Safari).
29
- def javascript_importmap_shim_tag
30
- javascript_include_tag "es-module-shims", async: true, "data-turbo-track": "reload",
31
- nonce: content_security_policy_nonce
29
+ def javascript_importmap_shim_tag(minimized: true)
30
+ javascript_include_tag minimized ? "es-module-shims.min.js" : "es-module-shims.js",
31
+ async: true, "data-turbo-track": "reload", nonce: content_security_policy_nonce
32
32
  end
33
33
 
34
34
  # Import a named JavaScript module(s) using a script-module tag.
@@ -3,16 +3,26 @@ require "importmap/packager"
3
3
 
4
4
  class Importmap::Commands < Thor
5
5
  include Thor::Actions
6
+
7
+ def self.exit_on_failure?
8
+ false
9
+ end
6
10
 
7
11
  desc "pin [*PACKAGES]", "Pin new packages"
8
12
  option :env, type: :string, aliases: :e, default: "production"
9
13
  option :from, type: :string, aliases: :f, default: "jspm"
14
+ option :download, type: :boolean, aliases: :d, default: false
10
15
  def pin(*packages)
11
16
  if imports = packager.import(*packages, env: options[:env], from: options[:from])
12
17
  imports.each do |package, url|
13
- puts %(Pinning "#{package}" to #{url})
14
-
15
- pin = packager.pin_for(package, url)
18
+ if options[:download]
19
+ puts %(Pinning "#{package}" to vendor/#{package}.js via download from #{url})
20
+ packager.download(package, url)
21
+ pin = packager.vendored_pin_for(package, url)
22
+ else
23
+ puts %(Pinning "#{package}" to #{url})
24
+ pin = packager.pin_for(package, url)
25
+ end
16
26
 
17
27
  if packager.packaged?(package)
18
28
  gsub_file("config/importmap.rb", /^pin "#{package}".*$/, pin, verbose: false)
@@ -28,12 +38,18 @@ class Importmap::Commands < Thor
28
38
  desc "unpin [*PACKAGES]", "Unpin existing packages"
29
39
  option :env, type: :string, aliases: :e, default: "production"
30
40
  option :from, type: :string, aliases: :f, default: "jspm"
41
+ option :download, type: :boolean, aliases: :d, default: false
31
42
  def unpin(*packages)
32
43
  if imports = packager.import(*packages, env: options[:env], from: options[:from])
33
44
  imports.each do |package, url|
34
45
  if packager.packaged?(package)
35
- puts %(Unpinning "#{package}")
36
- remove_line_from_file "config/importmap.rb", /pin "#{package}"/
46
+ if options[:download]
47
+ puts %(Unpinning and removing "#{package}")
48
+ else
49
+ puts %(Unpinning "#{package}")
50
+ end
51
+
52
+ packager.remove(package)
37
53
  end
38
54
  end
39
55
  else
@@ -26,7 +26,9 @@ module Importmap
26
26
 
27
27
  initializer "importmap.cache_sweeper" do |app|
28
28
  if app.config.importmap.sweep_cache
29
- app.importmap.cache_sweeper watches: app.root.join("app/javascript")
29
+ app.importmap.cache_sweeper watches: [
30
+ app.root.join("app/javascript"), app.root.join("vendor/javascript")
31
+ ]
30
32
 
31
33
  ActiveSupport.on_load(:action_controller_base) do
32
34
  before_action { Rails.application.importmap.cache_sweeper.execute_if_updated }
@@ -36,8 +38,9 @@ module Importmap
36
38
 
37
39
  initializer "importmap.assets" do
38
40
  if Rails.application.config.respond_to?(:assets)
39
- Rails.application.config.assets.precompile += %w( es-module-shims.js )
41
+ Rails.application.config.assets.precompile += %w( es-module-shims.js es-module-shims.min.js )
40
42
  Rails.application.config.assets.paths << Rails.root.join("app/javascript")
43
+ Rails.application.config.assets.paths << Rails.root.join("vendor/javascript")
41
44
  end
42
45
  end
43
46
 
data/lib/importmap/map.rb CHANGED
@@ -22,12 +22,12 @@ class Importmap::Map
22
22
  self
23
23
  end
24
24
 
25
- def pin(name, to: nil, preload: true)
25
+ def pin(name, to: nil, preload: false)
26
26
  clear_cache
27
27
  @packages[name] = MappedFile.new(name: name, path: to || "#{name}.js", preload: preload)
28
28
  end
29
29
 
30
- def pin_all_from(dir, under: nil, to: nil, preload: true)
30
+ def pin_all_from(dir, under: nil, to: nil, preload: false)
31
31
  clear_cache
32
32
  @directories[dir] = MappedDir.new(dir: dir, under: under, path: to, preload: preload)
33
33
  end
@@ -10,8 +10,9 @@ class Importmap::Packager
10
10
  singleton_class.attr_accessor :endpoint
11
11
  self.endpoint = URI("https://api.jspm.io/generate")
12
12
 
13
- def initialize(importmap_path = "config/importmap.rb")
14
- @importmap_path = importmap_path
13
+ def initialize(importmap_path = "config/importmap.rb", vendor_path: "vendor/javascript")
14
+ @importmap_path = Pathname.new(importmap_path)
15
+ @vendor_path = Pathname.new(vendor_path)
15
16
  end
16
17
 
17
18
  def import(*packages, env: "production", from: "jspm")
@@ -33,15 +34,43 @@ class Importmap::Packager
33
34
  %(pin "#{package}", to: "#{url}")
34
35
  end
35
36
 
37
+ def vendored_pin_for(package, url)
38
+ filename = package_filename(package)
39
+ version = extract_package_version_from(url)
40
+
41
+ if "#{package}.js" == filename
42
+ %(pin "#{package}" # #{version})
43
+ else
44
+ %(pin "#{package}", to: "#{filename}" # #{version})
45
+ end
46
+ end
47
+
36
48
  def packaged?(package)
37
49
  importmap.match(/^pin "#{package}".*$/)
38
50
  end
39
51
 
52
+ def download(package, url)
53
+ ensure_vendor_directory_exists
54
+ remove_existing_package_file(package)
55
+ download_package_file(package, url)
56
+ end
57
+
58
+ def remove(package)
59
+ remove_existing_package_file(package)
60
+ remove_package_from_importmap(package)
61
+ end
62
+
40
63
  private
64
+ def post_json(body)
65
+ Net::HTTP.post(self.class.endpoint, body.to_json, "Content-Type" => "application/json")
66
+ rescue => error
67
+ raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
68
+ end
69
+
41
70
  def extract_parsed_imports(response)
42
71
  JSON.parse(response.body).dig("map", "imports")
43
72
  end
44
-
73
+
45
74
  def handle_failure_response(response)
46
75
  if error_message = parse_service_error(response)
47
76
  raise ServiceError, error_message
@@ -56,13 +85,57 @@ class Importmap::Packager
56
85
  nil
57
86
  end
58
87
 
59
- def post_json(body)
60
- Net::HTTP.post(self.class.endpoint, body.to_json, { "Content-Type" => "application/json" })
61
- rescue => error
62
- raise HTTPError, "Unexpected transport error (#{error.class}: #{error.message})"
63
- end
64
-
65
88
  def importmap
66
89
  @importmap ||= File.read(@importmap_path)
67
90
  end
91
+
92
+
93
+ def ensure_vendor_directory_exists
94
+ FileUtils.mkdir_p @vendor_path
95
+ end
96
+
97
+ def remove_existing_package_file(package)
98
+ FileUtils.rm_rf vendored_package_path(package)
99
+ end
100
+
101
+ def remove_package_from_importmap(package)
102
+ all_lines = File.readlines(@importmap_path)
103
+ with_lines_removed = all_lines.select { |line| line !~ /pin "#{package}"/ }
104
+
105
+ File.open(@importmap_path, "w") do |file|
106
+ with_lines_removed.each { |line| file.write(line) }
107
+ end
108
+ end
109
+
110
+ def download_package_file(package, url)
111
+ response = Net::HTTP.get_response(URI(url))
112
+
113
+ if response.code == "200"
114
+ save_vendored_package(package, response.body)
115
+ else
116
+ handle_failure_response(response)
117
+ end
118
+ end
119
+
120
+ def save_vendored_package(package, source)
121
+ File.open(vendored_package_path(package), "w+") do |vendored_package|
122
+ vendored_package.write remove_sourcemap_comment_from(source).force_encoding("UTF-8")
123
+ end
124
+ end
125
+
126
+ def remove_sourcemap_comment_from(source)
127
+ source.gsub(/^\/\/# sourceMappingURL=.*/, "")
128
+ end
129
+
130
+ def vendored_package_path(package)
131
+ @vendor_path.join(package_filename(package))
132
+ end
133
+
134
+ def package_filename(package)
135
+ package.gsub("/", "--") + ".js"
136
+ end
137
+
138
+ def extract_package_version_from(url)
139
+ url.match(/@\d+\.\d+\.\d+/)&.to_a&.first
140
+ end
68
141
  end
@@ -1,3 +1,3 @@
1
1
  module Importmap
2
- VERSION = "0.7.6"
2
+ VERSION = "0.8.0"
3
3
  end
@@ -1,6 +1,3 @@
1
- # Use direct uploads for Active Storage (remember to import "@rails/activestorage" in your application.js)
2
- # pin "@rails/activestorage", to: "activestorage.esm.js"
1
+ # Pin npm packages by running ./bin/importmap
3
2
 
4
- # Use npm packages from a JavaScript CDN by running ./bin/importmap
5
-
6
- pin "application"
3
+ pin "application", preload: true
@@ -16,7 +16,8 @@ end
16
16
 
17
17
  if (sprockets_manifest_path = Rails.root.join("app/assets/config/manifest.js")).exist?
18
18
  say "Ensure JavaScript files are in the Sprocket manifest"
19
- append_to_file sprockets_manifest_path, %(//= link_tree ../../javascript .js\n)
19
+ append_to_file sprockets_manifest_path,
20
+ %(//= link_tree ../../javascript .js\n//= link_tree ../../../vendor/javascript .js\n)
20
21
  end
21
22
 
22
23
  say "Configure importmap paths in config/importmap.rb"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: importmap-rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.6
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Heinemeier Hansson
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-29 00:00:00.000000000 Z
11
+ date: 2021-10-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -34,6 +34,7 @@ files:
34
34
  - README.md
35
35
  - Rakefile
36
36
  - app/assets/javascripts/es-module-shims.js
37
+ - app/assets/javascripts/es-module-shims.min.js
37
38
  - app/helpers/importmap/importmap_tags_helper.rb
38
39
  - lib/importmap-rails.rb
39
40
  - lib/importmap/commands.rb
@@ -61,7 +62,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
61
62
  requirements:
62
63
  - - ">="
63
64
  - !ruby/object:Gem::Version
64
- version: '0'
65
+ version: 2.7.0
65
66
  required_rubygems_version: !ruby/object:Gem::Requirement
66
67
  requirements:
67
68
  - - ">="