importmap-rails 0.3.0 → 0.3.4
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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 29a1e2ec6414bcdbd4b6cd4c9726c838ea2f6b0179797f35c23ed0e9769495c1
|
4
|
+
data.tar.gz: 760b8781cf2c0a60ee4603440f183e6786c3147f537000b5ff0dd653fef3c754
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7a30aba12a32f3399b6d6e1c2853012866ba9720cf49e8ec4306932f3a0835478aac88a014e95bfda052d7415e5f1a37afb34404edbfd8b8df00e0aa6ffcfd1b
|
7
|
+
data.tar.gz: fba823c13bd453195561a892ac36e4855fb4d147b4c5b14099e6ad840b282184927e0496e89506d536e9af56eb93a8e3b267e83a699d46f4f76427230f9c51be
|
@@ -1 +1 @@
|
|
1
|
-
//= require ./es-module-shims@0.12.
|
1
|
+
//= require ./es-module-shims@0.12.8.js
|
@@ -1,6 +1,6 @@
|
|
1
|
-
/* ES Module Shims 0.12.
|
1
|
+
/* ES Module Shims 0.12.8 */
|
2
2
|
(function () {
|
3
|
-
//
|
3
|
+
// Bail on all shimming for Chrome until https://github.com/guybedford/es-module-shims/issues/150
|
4
4
|
if (navigator.userAgent.match("Chrome")) return
|
5
5
|
|
6
6
|
const resolvedPromise = Promise.resolve();
|
@@ -16,6 +16,7 @@
|
|
16
16
|
// support browsers without dynamic import support (eg Firefox 6x)
|
17
17
|
let supportsDynamicImport = false;
|
18
18
|
let supportsJsonAssertions = false;
|
19
|
+
let supportsCssAssertions = false;
|
19
20
|
let dynamicImport;
|
20
21
|
try {
|
21
22
|
dynamicImport = (0, eval)('u=>import(u)');
|
@@ -53,6 +54,7 @@
|
|
53
54
|
let supportsImportMaps = false;
|
54
55
|
|
55
56
|
const featureDetectionPromise = Promise.all([
|
57
|
+
dynamicImport(createBlob('import"data:text/css,{}"assert{type:"css"}')).then(() => supportsCssAssertions = true, () => {}),
|
56
58
|
dynamicImport(createBlob('import"data:text/json,{}"assert{type:"json"}')).then(() => supportsJsonAssertions = true, () => {}),
|
57
59
|
dynamicImport(createBlob('import.meta')).then(() => supportsImportMeta = true, () => {}),
|
58
60
|
supportsDynamicImport && hasDocument && new Promise(resolve => {
|
@@ -263,9 +265,13 @@
|
|
263
265
|
load.n = load.d.some(dep => dep.n);
|
264
266
|
}
|
265
267
|
|
268
|
+
let importMap = { imports: {}, scopes: {} };
|
269
|
+
let importMapSrcOrLazy = false;
|
270
|
+
let importMapPromise = resolvedPromise;
|
271
|
+
|
266
272
|
let waitingForImportMapsInterval;
|
267
273
|
let firstTopLevelProcess = true;
|
268
|
-
async function topLevelLoad (url, fetchOpts, source, nativelyLoaded) {
|
274
|
+
async function topLevelLoad (url, fetchOpts, source, nativelyLoaded, lastStaticLoadPromise) {
|
269
275
|
// no need to even fetch if we have feature support
|
270
276
|
await featureDetectionPromise;
|
271
277
|
if (waitingForImportMapsInterval > 0) {
|
@@ -278,8 +284,8 @@
|
|
278
284
|
}
|
279
285
|
await importMapPromise;
|
280
286
|
// early analysis opt-out
|
281
|
-
if (nativelyLoaded && supportsDynamicImport && supportsImportMeta && supportsImportMaps && !importMapSrcOrLazy) {
|
282
|
-
// dont reexec inline for polyfills -> just return null
|
287
|
+
if (nativelyLoaded && supportsDynamicImport && supportsImportMeta && supportsImportMaps && supportsJsonAssertions && supportsCssAssertions && !importMapSrcOrLazy) {
|
288
|
+
// dont reexec inline for polyfills -> just return null (since no module id for executed inline module scripts)
|
283
289
|
return source && nativelyLoaded ? null : dynamicImport(source ? createBlob(source) : url);
|
284
290
|
}
|
285
291
|
await init;
|
@@ -288,17 +294,30 @@
|
|
288
294
|
await loadAll(load, seen);
|
289
295
|
lastLoad = undefined;
|
290
296
|
resolveDeps(load, seen);
|
291
|
-
|
297
|
+
await lastStaticLoadPromise;
|
298
|
+
if (source && !shimMode && !load.n) {
|
299
|
+
if (lastStaticLoadPromise) {
|
300
|
+
didExecForReadyPromise = true;
|
301
|
+
if (domContentLoaded)
|
302
|
+
didExecForDomContentLoaded = true;
|
303
|
+
}
|
292
304
|
const module = dynamicImport(createBlob(source));
|
293
305
|
if (shouldRevokeBlobURLs) revokeObjectURLs(Object.keys(seen));
|
294
306
|
return module;
|
295
307
|
}
|
296
308
|
const module = await dynamicImport(load.b);
|
309
|
+
if (lastStaticLoadPromise && (!nativelyLoaded || load.b !== load.u)) {
|
310
|
+
didExecForReadyPromise = true;
|
311
|
+
if (domContentLoaded)
|
312
|
+
didExecForDomContentLoaded = true;
|
313
|
+
}
|
297
314
|
// if the top-level load is a shell, run its update function
|
298
315
|
if (load.s) {
|
299
316
|
(await dynamicImport(load.s)).u$_(module);
|
300
317
|
}
|
301
318
|
if (shouldRevokeBlobURLs) revokeObjectURLs(Object.keys(seen));
|
319
|
+
// when tla is supported, this should return the tla promise as an actual handle
|
320
|
+
// so readystate can still correspond to the sync subgraph exec completions
|
302
321
|
return module;
|
303
322
|
}
|
304
323
|
|
@@ -323,7 +342,8 @@
|
|
323
342
|
await featureDetectionPromise;
|
324
343
|
// Make sure all the "in-flight" import maps are loaded and applied.
|
325
344
|
await importMapPromise;
|
326
|
-
|
345
|
+
const resolved = await resolve(id, parentUrl);
|
346
|
+
return topLevelLoad(resolved.r || throwUnresolved(id, parentUrl), { credentials: 'same-origin' });
|
327
347
|
}
|
328
348
|
|
329
349
|
self.importShim = importShim;
|
@@ -334,7 +354,8 @@
|
|
334
354
|
|
335
355
|
async function importMetaResolve (id, parentUrl = this.url) {
|
336
356
|
await importMapPromise;
|
337
|
-
|
357
|
+
const resolved = await resolve(id, `${parentUrl}`);
|
358
|
+
return resolved.r || throwUnresolved(id, parentUrl);
|
338
359
|
}
|
339
360
|
|
340
361
|
self._esmsm = meta;
|
@@ -346,6 +367,7 @@
|
|
346
367
|
const skip = esmsInitOptions.skip || /^https?:\/\/(cdn\.skypack\.dev|jspm\.dev)\//;
|
347
368
|
const onerror = esmsInitOptions.onerror || ((e) => { throw e; });
|
348
369
|
const shouldRevokeBlobURLs = esmsInitOptions.revokeBlobURLs;
|
370
|
+
const noLoadEventRetriggers = esmsInitOptions.noLoadEventRetriggers;
|
349
371
|
|
350
372
|
function urlJsString (url) {
|
351
373
|
return `'${url.replace(/'/g, "\\'")}'`;
|
@@ -374,7 +396,7 @@
|
|
374
396
|
const source = load.S;
|
375
397
|
|
376
398
|
// edge doesnt execute sibling in order, so we fix this up by ensuring all previous executions are explicit dependencies
|
377
|
-
let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';
|
399
|
+
let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';
|
378
400
|
|
379
401
|
if (!imports.length) {
|
380
402
|
resolvedSource += source;
|
@@ -449,7 +471,26 @@
|
|
449
471
|
const cssContentType = /^text\/css(;|$)/;
|
450
472
|
const wasmContentType = /^application\/wasm(;|$)/;
|
451
473
|
|
452
|
-
const
|
474
|
+
const cssUrlRegEx = /url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g;
|
475
|
+
|
476
|
+
async function doFetch (url, fetchOpts) {
|
477
|
+
const res = await fetchHook(url, fetchOpts);
|
478
|
+
if (!res.ok)
|
479
|
+
throw new Error(`${res.status} ${res.statusText} ${res.url}`);
|
480
|
+
const contentType = res.headers.get('content-type');
|
481
|
+
if (jsContentType.test(contentType))
|
482
|
+
return { r: res.url, s: await res.text(), t: 'js' };
|
483
|
+
else if (jsonContentType.test(contentType))
|
484
|
+
return { r: res.url, s: `export default ${await res.text()}`, t: 'json' };
|
485
|
+
else if (cssContentType.test(contentType))
|
486
|
+
return { r: res.url, s: `var s=new CSSStyleSheet();s.replaceSync(${
|
487
|
+
JSON.stringify((await res.text()).replace(cssUrlRegEx, (_match, quotes, relUrl1, relUrl2) => `url(${quotes}${resolveUrl(relUrl1 || relUrl2, url)}${quotes})`))
|
488
|
+
});export default s;`, t: 'css' };
|
489
|
+
else if (wasmContentType.test(contentType))
|
490
|
+
throw new Error('WASM modules not yet supported');
|
491
|
+
else
|
492
|
+
throw new Error(`Unknown Content-Type "${contentType}"`);
|
493
|
+
}
|
453
494
|
|
454
495
|
function getOrCreateLoad (url, fetchOpts, source) {
|
455
496
|
let load = registry[url];
|
@@ -476,27 +517,18 @@
|
|
476
517
|
// shellUrl
|
477
518
|
s: undefined,
|
478
519
|
// needsShim
|
479
|
-
n: false
|
520
|
+
n: false,
|
521
|
+
// type
|
522
|
+
t: null
|
480
523
|
};
|
481
524
|
|
482
525
|
load.f = (async () => {
|
483
526
|
if (!source) {
|
484
527
|
// preload fetch options override fetch options (race)
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
const contentType = res.headers.get('content-type');
|
490
|
-
if (jsContentType.test(contentType))
|
491
|
-
source = await res.text();
|
492
|
-
else if (jsonContentType.test(contentType))
|
493
|
-
source = `export default ${await res.text()}`;
|
494
|
-
else if (cssContentType.test(contentType))
|
495
|
-
throw new Error('CSS modules not yet supported');
|
496
|
-
else if (wasmContentType.test(contentType))
|
497
|
-
throw new Error('WASM modules not yet supported');
|
498
|
-
else
|
499
|
-
throw new Error(`Unknown Content-Type "${contentType}"`);
|
528
|
+
let t;
|
529
|
+
({ r: load.r, s: source, t } = await (fetchCache[url] || doFetch(url, fetchOpts)));
|
530
|
+
if (t === 'css' && !supportsCssAssertions || t === 'json' && !supportsJsonAssertions)
|
531
|
+
load.n = true;
|
500
532
|
}
|
501
533
|
try {
|
502
534
|
load.a = parse(source, load.u);
|
@@ -511,13 +543,12 @@
|
|
511
543
|
|
512
544
|
load.L = load.f.then(async () => {
|
513
545
|
let childFetchOpts = fetchOpts;
|
514
|
-
load.d = await Promise.all(load.a[0].map(({ n, d, a }) => {
|
546
|
+
load.d = (await Promise.all(load.a[0].map(async ({ n, d, a }) => {
|
515
547
|
if (d >= 0 && !supportsDynamicImport ||
|
516
|
-
d === 2 && (!supportsImportMeta || source.slice(end, end + 8) === '.resolve')
|
517
|
-
a && !supportsJsonAssertions)
|
548
|
+
d === 2 && (!supportsImportMeta || source.slice(end, end + 8) === '.resolve'))
|
518
549
|
load.n = true;
|
519
550
|
if (!n) return;
|
520
|
-
const { r, m } = resolve(n, load.r || load.u);
|
551
|
+
const { r, m } = await resolve(n, load.r || load.u);
|
521
552
|
if (m && (!supportsImportMaps || importMapSrcOrLazy))
|
522
553
|
load.n = true;
|
523
554
|
if (d !== -1) return;
|
@@ -527,22 +558,13 @@
|
|
527
558
|
if (childFetchOpts.integrity)
|
528
559
|
childFetchOpts = Object.assign({}, childFetchOpts, { integrity: undefined });
|
529
560
|
return getOrCreateLoad(r, childFetchOpts).f;
|
530
|
-
}).filter(l => l)
|
561
|
+
}))).filter(l => l);
|
531
562
|
});
|
532
563
|
|
533
564
|
return load;
|
534
565
|
}
|
535
566
|
|
536
|
-
|
537
|
-
let importMapSrcOrLazy = false;
|
538
|
-
let importMapPromise = resolvedPromise;
|
539
|
-
|
540
|
-
if (hasDocument) {
|
541
|
-
processScripts();
|
542
|
-
waitingForImportMapsInterval = setInterval(processScripts, 20);
|
543
|
-
}
|
544
|
-
|
545
|
-
async function processScripts () {
|
567
|
+
function processScripts () {
|
546
568
|
if (waitingForImportMapsInterval > 0 && document.readyState !== 'loading') {
|
547
569
|
clearTimeout(waitingForImportMapsInterval);
|
548
570
|
waitingForImportMapsInterval = 0;
|
@@ -550,29 +572,9 @@
|
|
550
572
|
for (const link of document.querySelectorAll('link[rel="modulepreload"]'))
|
551
573
|
processPreload(link);
|
552
574
|
for (const script of document.querySelectorAll('script[type="module-shim"],script[type="importmap-shim"],script[type="module"],script[type="importmap"]'))
|
553
|
-
|
575
|
+
processScript(script);
|
554
576
|
}
|
555
577
|
|
556
|
-
new MutationObserver(mutations => {
|
557
|
-
for (const mutation of mutations) {
|
558
|
-
if (mutation.type !== 'childList') continue;
|
559
|
-
for (const node of mutation.addedNodes) {
|
560
|
-
if (node.tagName === 'SCRIPT' && node.type)
|
561
|
-
processScript(node, !firstTopLevelProcess);
|
562
|
-
else if (node.tagName === 'LINK' && node.rel === 'modulepreload')
|
563
|
-
processPreload(node);
|
564
|
-
else if (node.querySelectorAll) {
|
565
|
-
for (const script of node.querySelectorAll('script[type="module-shim"],script[type="importmap-shim"],script[type="module"],script[type="importmap"]')) {
|
566
|
-
processScript(script, !firstTopLevelProcess);
|
567
|
-
}
|
568
|
-
for (const link of node.querySelectorAll('link[rel=modulepreload]')) {
|
569
|
-
processPreload(link);
|
570
|
-
}
|
571
|
-
}
|
572
|
-
}
|
573
|
-
}
|
574
|
-
}).observe(document, { childList: true, subtree: true });
|
575
|
-
|
576
578
|
function getFetchOpts (script) {
|
577
579
|
const fetchOpts = {};
|
578
580
|
if (script.integrity)
|
@@ -588,12 +590,29 @@
|
|
588
590
|
return fetchOpts;
|
589
591
|
}
|
590
592
|
|
591
|
-
|
593
|
+
let staticLoadCnt = 0;
|
594
|
+
let didExecForReadyPromise = false;
|
595
|
+
let didExecForDomContentLoaded = false;
|
596
|
+
let lastStaticLoadPromise = Promise.resolve();
|
597
|
+
let domContentLoaded = false;
|
598
|
+
document.addEventListener('DOMContentLoaded', () => domContentLoaded = true);
|
599
|
+
function staticLoadCheck () {
|
600
|
+
staticLoadCnt--;
|
601
|
+
if (staticLoadCnt === 0 && !noLoadEventRetriggers) {
|
602
|
+
if (didExecForDomContentLoaded)
|
603
|
+
document.dispatchEvent(new Event('DOMContentLoaded'));
|
604
|
+
if (didExecForReadyPromise && document.readyState === 'complete')
|
605
|
+
document.dispatchEvent(new Event('readystatechange'));
|
606
|
+
}
|
607
|
+
}
|
608
|
+
|
609
|
+
function processScript (script, dynamic) {
|
592
610
|
if (script.ep) // ep marker = script processed
|
593
611
|
return;
|
594
612
|
const shim = script.type.endsWith('-shim');
|
595
613
|
if (shim) shimMode = true;
|
596
|
-
const type =
|
614
|
+
const type = shimMode ? script.type.slice(0, -5) : script.type;
|
615
|
+
// dont process module scripts in shim mode or noshim module scripts in polyfill mode
|
597
616
|
if (!shim && shimMode || script.getAttribute('noshim') !== null)
|
598
617
|
return;
|
599
618
|
// empty inline scripts sometimes show before domready
|
@@ -601,7 +620,14 @@
|
|
601
620
|
return;
|
602
621
|
script.ep = true;
|
603
622
|
if (type === 'module') {
|
604
|
-
|
623
|
+
const isReadyScript = document.readyState !== 'complete';
|
624
|
+
if (isReadyScript) staticLoadCnt++;
|
625
|
+
const p = topLevelLoad(script.src || `${baseUrl}?${id++}`, getFetchOpts(script), !script.src && script.innerHTML, !shimMode, isReadyScript && lastStaticLoadPromise);
|
626
|
+
p.catch(onerror);
|
627
|
+
if (isReadyScript) {
|
628
|
+
lastStaticLoadPromise = p.catch(staticLoadCheck);
|
629
|
+
p.then(staticLoadCheck);
|
630
|
+
}
|
605
631
|
}
|
606
632
|
else if (type === 'importmap') {
|
607
633
|
importMapPromise = importMapPromise.then(async () => {
|
@@ -612,20 +638,51 @@
|
|
612
638
|
}
|
613
639
|
}
|
614
640
|
|
641
|
+
const fetchCache = {};
|
615
642
|
function processPreload (link) {
|
616
643
|
if (link.ep) // ep marker = processed
|
617
644
|
return;
|
618
645
|
link.ep = true;
|
619
|
-
|
620
|
-
|
621
|
-
|
622
|
-
fetchOptsMap.set(link.href, fetchOpts);
|
623
|
-
fetch(link.href, fetchOpts);
|
646
|
+
if (fetchCache[link.href])
|
647
|
+
return;
|
648
|
+
fetchCache[link.href] = doFetch(link.href, getFetchOpts(link));
|
624
649
|
}
|
625
650
|
|
626
|
-
|
627
|
-
const
|
628
|
-
|
651
|
+
new MutationObserver(mutations => {
|
652
|
+
for (const mutation of mutations) {
|
653
|
+
if (mutation.type !== 'childList') continue;
|
654
|
+
for (const node of mutation.addedNodes) {
|
655
|
+
if (node.tagName === 'SCRIPT' && node.type)
|
656
|
+
processScript(node, !firstTopLevelProcess);
|
657
|
+
else if (node.tagName === 'LINK' && node.rel === 'modulepreload')
|
658
|
+
processPreload(node);
|
659
|
+
else if (node.querySelectorAll) {
|
660
|
+
for (const script of node.querySelectorAll('script[type="module-shim"],script[type="importmap-shim"],script[type="module"],script[type="importmap"]')) {
|
661
|
+
processScript(script, !firstTopLevelProcess);
|
662
|
+
}
|
663
|
+
for (const link of node.querySelectorAll('link[rel=modulepreload]')) {
|
664
|
+
processPreload(link);
|
665
|
+
}
|
666
|
+
}
|
667
|
+
}
|
668
|
+
}
|
669
|
+
}).observe(document, { childList: true, subtree: true });
|
670
|
+
|
671
|
+
async function defaultResolve (id, parentUrl) {
|
672
|
+
return resolveImportMap(importMap, resolveIfNotPlainOrUrl(id, parentUrl) || id, parentUrl);
|
673
|
+
}
|
674
|
+
|
675
|
+
async function resolve (id, parentUrl) {
|
676
|
+
let urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);
|
677
|
+
|
678
|
+
let resolved;
|
679
|
+
if (esmsInitOptions.resolve) {
|
680
|
+
resolved = await esmsInitOptions.resolve(id, parentUrl, defaultResolve);
|
681
|
+
}
|
682
|
+
else {
|
683
|
+
resolved = resolveImportMap(importMap, urlResolved || id, parentUrl);
|
684
|
+
}
|
685
|
+
|
629
686
|
return { r: resolved, m: urlResolved !== resolved };
|
630
687
|
}
|
631
688
|
|
@@ -633,4 +690,9 @@
|
|
633
690
|
throw Error("Unable to resolve specifier '" + id + (parentUrl ? "' from " + parentUrl : "'"));
|
634
691
|
}
|
635
692
|
|
693
|
+
if (hasDocument) {
|
694
|
+
processScripts();
|
695
|
+
waitingForImportMapsInterval = setInterval(processScripts, 20);
|
696
|
+
}
|
697
|
+
|
636
698
|
}());
|
data/lib/importmap/map.rb
CHANGED
@@ -76,20 +76,11 @@ class Importmap::Map
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def module_name_from(filename, mapping)
|
79
|
-
|
80
|
-
|
81
|
-
case
|
82
|
-
when filename_without_ext_and_version == "index" && mapping.under
|
83
|
-
mapping.under
|
84
|
-
when mapping.under
|
85
|
-
"#{mapping.under}/#{filename_without_ext_and_version}"
|
86
|
-
else
|
87
|
-
module_name
|
88
|
-
end
|
79
|
+
[ mapping.under, filename.to_s.remove(filename.extname).remove(/\/?index$/).presence ].compact.join("/")
|
89
80
|
end
|
90
81
|
|
91
82
|
def module_path_from(filename, mapping)
|
92
|
-
[ mapping.path || mapping.under, filename.to_s ].join("/")
|
83
|
+
[ mapping.path || mapping.under, filename.to_s ].compact.join("/")
|
93
84
|
end
|
94
85
|
|
95
86
|
def find_javascript_files_in_tree(path)
|
data/lib/importmap/version.rb
CHANGED
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.3.
|
4
|
+
version: 0.3.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Heinemeier Hansson
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-08-
|
11
|
+
date: 2021-08-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -24,7 +24,7 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 6.0.0
|
27
|
-
description:
|
27
|
+
description:
|
28
28
|
email: david@loudthinking.com
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
@@ -34,7 +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@0.12.
|
37
|
+
- app/assets/javascripts/es-module-shims@0.12.8.js
|
38
38
|
- app/helpers/importmap/importmap_tags_helper.rb
|
39
39
|
- lib/importmap-rails.rb
|
40
40
|
- lib/importmap/engine.rb
|
@@ -50,7 +50,7 @@ licenses:
|
|
50
50
|
metadata:
|
51
51
|
homepage_uri: https://github.com/rails/importmap-rails
|
52
52
|
source_code_uri: https://github.com/rails/importmap-rails
|
53
|
-
post_install_message:
|
53
|
+
post_install_message:
|
54
54
|
rdoc_options: []
|
55
55
|
require_paths:
|
56
56
|
- lib
|
@@ -66,7 +66,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
66
66
|
version: '0'
|
67
67
|
requirements: []
|
68
68
|
rubygems_version: 3.1.4
|
69
|
-
signing_key:
|
69
|
+
signing_key:
|
70
70
|
specification_version: 4
|
71
71
|
summary: Use ESM with importmap to manage modern JavaScript in Rails without transpiling
|
72
72
|
or bundling.
|