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 +4 -4
- data/README.md +40 -11
- data/app/assets/javascripts/es-module-shims.js +2 -2
- data/app/assets/javascripts/es-module-shims.min.js +1 -0
- data/app/helpers/importmap/importmap_tags_helper.rb +3 -3
- data/lib/importmap/commands.rb +21 -5
- data/lib/importmap/engine.rb +5 -2
- data/lib/importmap/map.rb +2 -2
- data/lib/importmap/packager.rb +82 -9
- data/lib/importmap/version.rb +1 -1
- data/lib/install/config/importmap.rb +2 -5
- data/lib/install/install.rb +2 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5ff9e12c3e3daaf05a7de52415d5147fc030efd2ad0cd170eb60a13c0227bb72
|
4
|
+
data.tar.gz: '09d07386cd7f80d6f34d369e530276125e6a5361577896bc847d7968a9f158a6'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
##
|
113
|
+
## Downloading vendor files from the JavaScript CDN
|
114
114
|
|
115
|
-
|
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
|
-
#
|
119
|
-
pin "
|
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
|
-
|
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,
|
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"
|
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.
|
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`.
|
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
|
+
/* 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.
|
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"
|
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.
|
data/lib/importmap/commands.rb
CHANGED
@@ -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
|
-
|
14
|
-
|
15
|
-
|
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
|
-
|
36
|
-
|
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
|
data/lib/importmap/engine.rb
CHANGED
@@ -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:
|
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:
|
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:
|
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
|
data/lib/importmap/packager.rb
CHANGED
@@ -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
|
data/lib/importmap/version.rb
CHANGED
@@ -1,6 +1,3 @@
|
|
1
|
-
#
|
2
|
-
# pin "@rails/activestorage", to: "activestorage.esm.js"
|
1
|
+
# Pin npm packages by running ./bin/importmap
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
pin "application"
|
3
|
+
pin "application", preload: true
|
data/lib/install/install.rb
CHANGED
@@ -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,
|
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.
|
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-
|
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:
|
65
|
+
version: 2.7.0
|
65
66
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
66
67
|
requirements:
|
67
68
|
- - ">="
|