importmap-rails 0.3.1 → 0.3.2

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: b87e83df8630c47a117ee7a9a854a8d34bd65112e547c27a5ae9133fb62f3c8a
4
- data.tar.gz: b6c77a31b534440c7a6a3132e1f88d14f658ed350fcd95d446bba9d58df11bc5
3
+ metadata.gz: c4edb628879c46f984d95884b643013077f408a899a1633f7007ef3274393b65
4
+ data.tar.gz: 627f45fe257131d3432d1f2cf210eb0fd133e286c293b101cfaf5b5a77840a47
5
5
  SHA512:
6
- metadata.gz: 40f0955bde9ab6792c5b1e0b5f0fa4eed8701aa09f2b71c69dd1fe1f6b088131d2dd0089e4bd68b14172e4042a49959a7de609adc9f711bbd6e819552ec6fb11
7
- data.tar.gz: 471bc782818dc139c3a46fb8c1896784069b8d8c8ff777cdc2880d462f5efa207021292079d7b9de127af58cd916901153f8a7981944fc52e81ad80b418907fb
6
+ metadata.gz: cd44cdb515fed52817f75d453e274846979e9649e997bd4b2b67689a6761b294c33fdf1b7a9909042da0da2b99d11cbb1ad1a626519a2f528aa4cab5b61869ae
7
+ data.tar.gz: 301873edf08bb1c486dcdbebe65afbe5b3ff2d43fd9a78c51b9791e07152ae0742e93fcfd92fb936e2ce97adacc3e9ff3f6d2b3eacd15683e153e1c8d457997d
@@ -1 +1 @@
1
- //= require ./es-module-shims@0.12.2.js
1
+ //= require ./es-module-shims@0.12.6.js
@@ -1,6 +1,6 @@
1
- /* ES Module Shims 0.12.2 */
1
+ /* ES Module Shims 0.12.6 */
2
2
  (function () {
3
- // Temporary hack around https://github.com/guybedford/es-module-shims/issues/148
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,6 +265,10 @@
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
274
  async function topLevelLoad (url, fetchOpts, source, nativelyLoaded) {
@@ -278,7 +284,7 @@
278
284
  }
279
285
  await importMapPromise;
280
286
  // early analysis opt-out
281
- if (nativelyLoaded && supportsDynamicImport && supportsImportMeta && supportsImportMaps && !importMapSrcOrLazy) {
287
+ if (nativelyLoaded && supportsDynamicImport && supportsImportMeta && supportsImportMaps && supportsJsonAssertions && supportsCssAssertions && !importMapSrcOrLazy) {
282
288
  // dont reexec inline for polyfills -> just return null
283
289
  return source && nativelyLoaded ? null : dynamicImport(source ? createBlob(source) : url);
284
290
  }
@@ -288,7 +294,7 @@
288
294
  await loadAll(load, seen);
289
295
  lastLoad = undefined;
290
296
  resolveDeps(load, seen);
291
- if (source && !nativelyLoaded && !shimMode && !load.n) {
297
+ if (source && !shimMode && !load.n) {
292
298
  const module = dynamicImport(createBlob(source));
293
299
  if (shouldRevokeBlobURLs) revokeObjectURLs(Object.keys(seen));
294
300
  return module;
@@ -323,7 +329,8 @@
323
329
  await featureDetectionPromise;
324
330
  // Make sure all the "in-flight" import maps are loaded and applied.
325
331
  await importMapPromise;
326
- return topLevelLoad(resolve(id, parentUrl).r || throwUnresolved(id, parentUrl), { credentials: 'same-origin' });
332
+ const resolved = await resolve(id, parentUrl);
333
+ return topLevelLoad(resolved.r || throwUnresolved(id, parentUrl), { credentials: 'same-origin' });
327
334
  }
328
335
 
329
336
  self.importShim = importShim;
@@ -334,7 +341,8 @@
334
341
 
335
342
  async function importMetaResolve (id, parentUrl = this.url) {
336
343
  await importMapPromise;
337
- return resolve(id, `${parentUrl}`).r || throwUnresolved(id, parentUrl);
344
+ const resolved = await resolve(id, `${parentUrl}`);
345
+ return resolved.r || throwUnresolved(id, parentUrl);
338
346
  }
339
347
 
340
348
  self._esmsm = meta;
@@ -374,7 +382,7 @@
374
382
  const source = load.S;
375
383
 
376
384
  // 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}';` : '';
385
+ let resolvedSource = edge && lastLoad ? `import '${lastLoad}';` : '';
378
386
 
379
387
  if (!imports.length) {
380
388
  resolvedSource += source;
@@ -449,7 +457,26 @@
449
457
  const cssContentType = /^text\/css(;|$)/;
450
458
  const wasmContentType = /^application\/wasm(;|$)/;
451
459
 
452
- const fetchOptsMap = new Map();
460
+ const cssUrlRegEx = /url\(\s*(?:(["'])((?:\\.|[^\n\\"'])+)\1|((?:\\.|[^\s,"'()\\])+))\s*\)/g;
461
+
462
+ async function doFetch (url, fetchOpts) {
463
+ const res = await fetchHook(url, fetchOpts);
464
+ if (!res.ok)
465
+ throw new Error(`${res.status} ${res.statusText} ${res.url}`);
466
+ const contentType = res.headers.get('content-type');
467
+ if (jsContentType.test(contentType))
468
+ return { r: res.url, s: await res.text(), t: 'js' };
469
+ else if (jsonContentType.test(contentType))
470
+ return { r: res.url, s: `export default ${await res.text()}`, t: 'json' };
471
+ else if (cssContentType.test(contentType))
472
+ return { r: res.url, s: `var s=new CSSStyleSheet();s.replaceSync(${
473
+ JSON.stringify((await res.text()).replace(cssUrlRegEx, (_match, quotes, relUrl1, relUrl2) => `url(${quotes}${resolveUrl(relUrl1 || relUrl2, url)}${quotes})`))
474
+ });export default s;`, t: 'css' };
475
+ else if (wasmContentType.test(contentType))
476
+ throw new Error('WASM modules not yet supported');
477
+ else
478
+ throw new Error(`Unknown Content-Type "${contentType}"`);
479
+ }
453
480
 
454
481
  function getOrCreateLoad (url, fetchOpts, source) {
455
482
  let load = registry[url];
@@ -476,27 +503,18 @@
476
503
  // shellUrl
477
504
  s: undefined,
478
505
  // needsShim
479
- n: false
506
+ n: false,
507
+ // type
508
+ t: null
480
509
  };
481
510
 
482
511
  load.f = (async () => {
483
512
  if (!source) {
484
513
  // preload fetch options override fetch options (race)
485
- const res = await fetchHook(url, fetchOptsMap.get(url) || fetchOpts);
486
- if (!res.ok)
487
- throw new Error(`${res.status} ${res.statusText} ${res.url}`);
488
- load.r = res.url;
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}"`);
514
+ let t;
515
+ ({ r: load.r, s: source, t } = await (fetchCache[url] || doFetch(url, fetchOpts)));
516
+ if (t === 'css' && !supportsCssAssertions || t === 'json' && !supportsJsonAssertions)
517
+ load.n = true;
500
518
  }
501
519
  try {
502
520
  load.a = parse(source, load.u);
@@ -511,13 +529,12 @@
511
529
 
512
530
  load.L = load.f.then(async () => {
513
531
  let childFetchOpts = fetchOpts;
514
- load.d = await Promise.all(load.a[0].map(({ n, d, a }) => {
532
+ load.d = (await Promise.all(load.a[0].map(async ({ n, d, a }) => {
515
533
  if (d >= 0 && !supportsDynamicImport ||
516
- d === 2 && (!supportsImportMeta || source.slice(end, end + 8) === '.resolve') ||
517
- a && !supportsJsonAssertions)
534
+ d === 2 && (!supportsImportMeta || source.slice(end, end + 8) === '.resolve'))
518
535
  load.n = true;
519
536
  if (!n) return;
520
- const { r, m } = resolve(n, load.r || load.u);
537
+ const { r, m } = await resolve(n, load.r || load.u);
521
538
  if (m && (!supportsImportMaps || importMapSrcOrLazy))
522
539
  load.n = true;
523
540
  if (d !== -1) return;
@@ -527,21 +544,12 @@
527
544
  if (childFetchOpts.integrity)
528
545
  childFetchOpts = Object.assign({}, childFetchOpts, { integrity: undefined });
529
546
  return getOrCreateLoad(r, childFetchOpts).f;
530
- }).filter(l => l));
547
+ }))).filter(l => l);
531
548
  });
532
549
 
533
550
  return load;
534
551
  }
535
552
 
536
- let importMap = { imports: {}, scopes: {} };
537
- let importMapSrcOrLazy = false;
538
- let importMapPromise = resolvedPromise;
539
-
540
- if (hasDocument) {
541
- processScripts();
542
- waitingForImportMapsInterval = setInterval(processScripts, 20);
543
- }
544
-
545
553
  async function processScripts () {
546
554
  if (waitingForImportMapsInterval > 0 && document.readyState !== 'loading') {
547
555
  clearTimeout(waitingForImportMapsInterval);
@@ -553,26 +561,6 @@
553
561
  await processScript(script);
554
562
  }
555
563
 
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
564
  function getFetchOpts (script) {
577
565
  const fetchOpts = {};
578
566
  if (script.integrity)
@@ -612,20 +600,49 @@
612
600
  }
613
601
  }
614
602
 
603
+ const fetchCache = {};
615
604
  function processPreload (link) {
616
605
  if (link.ep) // ep marker = processed
617
606
  return;
618
607
  link.ep = true;
619
- // prepopulate the load record
620
- const fetchOpts = getFetchOpts(link);
621
- // save preloaded fetch options for later load
622
- fetchOptsMap.set(link.href, fetchOpts);
623
- fetch(link.href, fetchOpts);
608
+ fetchCache[link.href] = doFetch(link.href, getFetchOpts(link));
609
+ }
610
+
611
+ new MutationObserver(mutations => {
612
+ for (const mutation of mutations) {
613
+ if (mutation.type !== 'childList') continue;
614
+ for (const node of mutation.addedNodes) {
615
+ if (node.tagName === 'SCRIPT' && node.type)
616
+ processScript(node, !firstTopLevelProcess);
617
+ else if (node.tagName === 'LINK' && node.rel === 'modulepreload')
618
+ processPreload(node);
619
+ else if (node.querySelectorAll) {
620
+ for (const script of node.querySelectorAll('script[type="module-shim"],script[type="importmap-shim"],script[type="module"],script[type="importmap"]')) {
621
+ processScript(script, !firstTopLevelProcess);
622
+ }
623
+ for (const link of node.querySelectorAll('link[rel=modulepreload]')) {
624
+ processPreload(link);
625
+ }
626
+ }
627
+ }
628
+ }
629
+ }).observe(document, { childList: true, subtree: true });
630
+
631
+ async function defaultResolve (id, parentUrl) {
632
+ return resolveImportMap(importMap, resolveIfNotPlainOrUrl(id, parentUrl) || id, parentUrl);
624
633
  }
625
634
 
626
- function resolve (id, parentUrl) {
627
- const urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);
628
- const resolved = resolveImportMap(importMap, urlResolved || id, parentUrl);
635
+ async function resolve (id, parentUrl) {
636
+ let urlResolved = resolveIfNotPlainOrUrl(id, parentUrl);
637
+
638
+ let resolved;
639
+ if (esmsInitOptions.resolve) {
640
+ resolved = await esmsInitOptions.resolve(id, parentUrl, defaultResolve);
641
+ }
642
+ else {
643
+ resolved = resolveImportMap(importMap, urlResolved || id, parentUrl);
644
+ }
645
+
629
646
  return { r: resolved, m: urlResolved !== resolved };
630
647
  }
631
648
 
@@ -633,4 +650,9 @@
633
650
  throw Error("Unable to resolve specifier '" + id + (parentUrl ? "' from " + parentUrl : "'"));
634
651
  }
635
652
 
636
- }());
653
+ if (hasDocument) {
654
+ processScripts();
655
+ waitingForImportMapsInterval = setInterval(processScripts, 20);
656
+ }
657
+
658
+ }());
@@ -1,3 +1,3 @@
1
1
  module Importmap
2
- VERSION = "0.3.1"
2
+ VERSION = "0.3.2"
3
3
  end
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.1
4
+ version: 0.3.2
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-22 00:00:00.000000000 Z
11
+ date: 2021-08-23 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.2.js
37
+ - app/assets/javascripts/es-module-shims@0.12.6.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.