@jsenv/core 39.10.1 → 39.10.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -27,6 +27,12 @@
27
27
  position: relative;
28
28
  }
29
29
 
30
+ .directory_empty_message {
31
+ color: #bbb;
32
+ margin: 1em;
33
+ padding: .5em;
34
+ }
35
+
30
36
  .directory_content {
31
37
  border-radius: 3px;
32
38
  margin: 10px 15px;
@@ -27,6 +27,12 @@
27
27
  position: relative;
28
28
  }
29
29
 
30
+ .directory_empty_message {
31
+ color: #bbb;
32
+ margin: 1em;
33
+ padding: .5em;
34
+ }
35
+
30
36
  .directory_content {
31
37
  border-radius: 3px;
32
38
  margin: 10px 15px;
@@ -188,7 +194,7 @@
188
194
  No entry on the filesystem for <code>/${fileRelativeUrl}</code> (at
189
195
  ${fileUrl})
190
196
  <br>
191
- Content of the ancestor directory is listed below:
197
+ Content of first ancestor directory is listed below:
192
198
  </span>
193
199
  </p>
194
200
  <h1 class="directory_nav">${ancestorDirectoryNav}</h1>
@@ -12648,9 +12648,9 @@ const createEventEmitter = () => {
12648
12648
  callbackSet.delete(callback);
12649
12649
  };
12650
12650
  const emit = (...args) => {
12651
- callbackSet.forEach((callback) => {
12651
+ for (const callback of callbackSet) {
12652
12652
  callback(...args);
12653
- });
12653
+ }
12654
12654
  };
12655
12655
  return { on, off, emit };
12656
12656
  };
@@ -12817,7 +12817,7 @@ const createDependencies = (ownerUrlInfo) => {
12817
12817
 
12818
12818
  const stopCollecting = () => {
12819
12819
  for (const prevReferenceToOther of prevReferenceToOthersSet) {
12820
- applyDependencyRemovalEffects(prevReferenceToOther);
12820
+ checkForDependencyRemovalEffects(prevReferenceToOther);
12821
12821
  }
12822
12822
  prevReferenceToOthersSet.clear();
12823
12823
  };
@@ -13322,7 +13322,7 @@ ${ownerUrlInfo.url}`,
13322
13322
  implicitRef.remove();
13323
13323
  }
13324
13324
  ownerUrlInfo.referenceToOthersSet.delete(reference);
13325
- return applyDependencyRemovalEffects(reference);
13325
+ return checkForDependencyRemovalEffects(reference);
13326
13326
  };
13327
13327
 
13328
13328
  const canAddOrRemoveReference = (reference) => {
@@ -13351,7 +13351,7 @@ const canAddOrRemoveReference = (reference) => {
13351
13351
  return false;
13352
13352
  };
13353
13353
 
13354
- const applyDependencyRemovalEffects = (reference) => {
13354
+ const checkForDependencyRemovalEffects = (reference) => {
13355
13355
  const { ownerUrlInfo } = reference;
13356
13356
  const { referenceToOthersSet } = ownerUrlInfo;
13357
13357
  if (reference.isImplicit && !reference.isInline) {
@@ -13386,6 +13386,7 @@ const applyDependencyRemovalEffects = (reference) => {
13386
13386
  referencedUrlInfo.referenceFromOthersSet.delete(reference);
13387
13387
 
13388
13388
  let firstReferenceFromOther;
13389
+ let wasInlined;
13389
13390
  for (const referenceFromOther of referencedUrlInfo.referenceFromOthersSet) {
13390
13391
  if (referenceFromOther.urlInfo !== referencedUrlInfo) {
13391
13392
  continue;
@@ -13400,7 +13401,8 @@ const applyDependencyRemovalEffects = (reference) => {
13400
13401
  if (referenceFromOther.type === "http_request") {
13401
13402
  continue;
13402
13403
  }
13403
- if (referenceFromOther.gotInlined()) {
13404
+ wasInlined = referenceFromOther.gotInlined();
13405
+ if (wasInlined) {
13404
13406
  // the url info was inlined, an other reference is required
13405
13407
  // to consider the non-inlined urlInfo as used
13406
13408
  continue;
@@ -13418,6 +13420,9 @@ const applyDependencyRemovalEffects = (reference) => {
13418
13420
  }
13419
13421
  return false;
13420
13422
  }
13423
+ if (wasInlined) {
13424
+ return false;
13425
+ }
13421
13426
  // referencedUrlInfo.firstReference = null;
13422
13427
  // referencedUrlInfo.lastReference = null;
13423
13428
  referencedUrlInfo.onDereferenced(reference);
@@ -19176,6 +19181,7 @@ const jsenvPluginVersionSearchParam = () => {
19176
19181
  };
19177
19182
 
19178
19183
  const jsenvPluginFsRedirection = ({
19184
+ directoryContentMagicName,
19179
19185
  magicExtensions = ["inherit", ".js"],
19180
19186
  magicDirectoryIndex = true,
19181
19187
  preserveSymlinks = false,
@@ -19198,10 +19204,14 @@ const jsenvPluginFsRedirection = ({
19198
19204
  if (reference.subtype === "new_url_second_arg") {
19199
19205
  return `ignore:${reference.url}`;
19200
19206
  }
19201
- if (reference.specifierPathname.endsWith("/...")) {
19207
+ if (
19208
+ reference.specifierPathname.endsWith(`/${directoryContentMagicName}`)
19209
+ ) {
19202
19210
  const { rootDirectoryUrl } = reference.ownerUrlInfo.context;
19203
19211
  const directoryUrl = new URL(
19204
- reference.specifierPathname.replace("/...", "/").slice(1),
19212
+ reference.specifierPathname
19213
+ .replace(`/${directoryContentMagicName}`, "/")
19214
+ .slice(1),
19205
19215
  rootDirectoryUrl,
19206
19216
  ).href;
19207
19217
  return directoryUrl;
@@ -19312,6 +19322,7 @@ const htmlFileUrlForDirectory = new URL(
19312
19322
  "./html/directory.html",
19313
19323
  import.meta.url,
19314
19324
  );
19325
+ const directoryContentMagicName = "...";
19315
19326
 
19316
19327
  const jsenvPluginProtocolFile = ({
19317
19328
  magicExtensions,
@@ -19321,6 +19332,7 @@ const jsenvPluginProtocolFile = ({
19321
19332
  }) => {
19322
19333
  return [
19323
19334
  jsenvPluginFsRedirection({
19335
+ directoryContentMagicName,
19324
19336
  magicExtensions,
19325
19337
  magicDirectoryIndex,
19326
19338
  preserveSymlinks,
@@ -19360,8 +19372,9 @@ const jsenvPluginProtocolFile = ({
19360
19372
  if (reference.original) {
19361
19373
  const originalSpecifierPathname =
19362
19374
  reference.original.specifierPathname;
19363
-
19364
- if (originalSpecifierPathname.endsWith("/...")) {
19375
+ if (
19376
+ originalSpecifierPathname.endsWith(`/${directoryContentMagicName}`)
19377
+ ) {
19365
19378
  return originalSpecifierPathname;
19366
19379
  }
19367
19380
  }
@@ -19526,7 +19539,10 @@ const generateDirectoryNav = (relativeUrl, rootDirectoryUrl) => {
19526
19539
  let i = 0;
19527
19540
  while (i < parts.length) {
19528
19541
  const part = parts[i];
19529
- const href = i === 0 ? "/..." : `/${parts.slice(1, i + 1).join("/")}/`;
19542
+ const href =
19543
+ i === 0
19544
+ ? `/${directoryContentMagicName}`
19545
+ : `/${parts.slice(1, i + 1).join("/")}/`;
19530
19546
  const text = part;
19531
19547
  const isLastPart = i === parts.length - 1;
19532
19548
  items.push({
@@ -19644,7 +19660,7 @@ const generateDirectoryContentItems = (directoryUrl, rootDirectoryUrl) => {
19644
19660
  };
19645
19661
  const generateDirectoryContent = (directoryContentItems) => {
19646
19662
  if (directoryContentItems.length === 0) {
19647
- return `<p>Directory is empty</p>`;
19663
+ return `<p class="directory_empty_message">Directory is empty</p>`;
19648
19664
  }
19649
19665
  let html = `<ul class="directory_content">`;
19650
19666
  for (const directoryContentItem of directoryContentItems) {
@@ -20827,6 +20843,11 @@ const jsenvPluginAutoreloadServer = ({
20827
20843
  // are lost and sourcemap is considered as pruned
20828
20844
  continue;
20829
20845
  }
20846
+ if (lastReferenceFromOther.type === "http_request") {
20847
+ // no need to tell client to reload when a http request is pruned
20848
+ // happens when reloading the current html page for instance
20849
+ continue;
20850
+ }
20830
20851
  const { ownerUrlInfo } = lastReferenceFromOther;
20831
20852
  if (!ownerUrlInfo.isUsed()) {
20832
20853
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "39.10.1",
3
+ "version": "39.10.2",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "author": {
@@ -10,9 +10,9 @@ export const createEventEmitter = () => {
10
10
  callbackSet.delete(callback);
11
11
  };
12
12
  const emit = (...args) => {
13
- callbackSet.forEach((callback) => {
13
+ for (const callback of callbackSet) {
14
14
  callback(...args);
15
- });
15
+ }
16
16
  };
17
17
  return { on, off, emit };
18
18
  };
@@ -22,7 +22,7 @@ export const createDependencies = (ownerUrlInfo) => {
22
22
 
23
23
  const stopCollecting = () => {
24
24
  for (const prevReferenceToOther of prevReferenceToOthersSet) {
25
- applyDependencyRemovalEffects(prevReferenceToOther);
25
+ checkForDependencyRemovalEffects(prevReferenceToOther);
26
26
  }
27
27
  prevReferenceToOthersSet.clear();
28
28
  };
@@ -527,7 +527,7 @@ ${ownerUrlInfo.url}`,
527
527
  implicitRef.remove();
528
528
  }
529
529
  ownerUrlInfo.referenceToOthersSet.delete(reference);
530
- return applyDependencyRemovalEffects(reference);
530
+ return checkForDependencyRemovalEffects(reference);
531
531
  };
532
532
 
533
533
  const canAddOrRemoveReference = (reference) => {
@@ -556,7 +556,7 @@ const canAddOrRemoveReference = (reference) => {
556
556
  return false;
557
557
  };
558
558
 
559
- const applyDependencyRemovalEffects = (reference) => {
559
+ const checkForDependencyRemovalEffects = (reference) => {
560
560
  const { ownerUrlInfo } = reference;
561
561
  const { referenceToOthersSet } = ownerUrlInfo;
562
562
  if (reference.isImplicit && !reference.isInline) {
@@ -591,6 +591,7 @@ const applyDependencyRemovalEffects = (reference) => {
591
591
  referencedUrlInfo.referenceFromOthersSet.delete(reference);
592
592
 
593
593
  let firstReferenceFromOther;
594
+ let wasInlined;
594
595
  for (const referenceFromOther of referencedUrlInfo.referenceFromOthersSet) {
595
596
  if (referenceFromOther.urlInfo !== referencedUrlInfo) {
596
597
  continue;
@@ -605,7 +606,8 @@ const applyDependencyRemovalEffects = (reference) => {
605
606
  if (referenceFromOther.type === "http_request") {
606
607
  continue;
607
608
  }
608
- if (referenceFromOther.gotInlined()) {
609
+ wasInlined = referenceFromOther.gotInlined();
610
+ if (wasInlined) {
609
611
  // the url info was inlined, an other reference is required
610
612
  // to consider the non-inlined urlInfo as used
611
613
  continue;
@@ -623,6 +625,9 @@ const applyDependencyRemovalEffects = (reference) => {
623
625
  }
624
626
  return false;
625
627
  }
628
+ if (wasInlined) {
629
+ return false;
630
+ }
626
631
  // referencedUrlInfo.firstReference = null;
627
632
  // referencedUrlInfo.lastReference = null;
628
633
  referencedUrlInfo.onDereferenced(reference);
@@ -238,6 +238,11 @@ export const jsenvPluginAutoreloadServer = ({
238
238
  // are lost and sourcemap is considered as pruned
239
239
  continue;
240
240
  }
241
+ if (lastReferenceFromOther.type === "http_request") {
242
+ // no need to tell client to reload when a http request is pruned
243
+ // happens when reloading the current html page for instance
244
+ continue;
245
+ }
241
246
  const { ownerUrlInfo } = lastReferenceFromOther;
242
247
  if (!ownerUrlInfo.isUsed()) {
243
248
  continue;
@@ -26,6 +26,11 @@ button {
26
26
  text-decoration: none;
27
27
  position: relative;
28
28
  }
29
+ .directory_empty_message {
30
+ margin: 1em;
31
+ padding: 0.5em;
32
+ color: #bbbbbb;
33
+ }
29
34
  .directory_content {
30
35
  margin: 10px 15px 10px 15px;
31
36
  list-style-type: none;
@@ -45,7 +45,7 @@
45
45
  No entry on the filesystem for <code>/${fileRelativeUrl}</code> (at
46
46
  ${fileUrl})
47
47
  <br />
48
- Content of the ancestor directory is listed below:
48
+ Content of first ancestor directory is listed below:
49
49
  </span>
50
50
  </p>
51
51
  <h1 class="directory_nav">${ancestorDirectoryNav}</h1>
@@ -8,6 +8,7 @@ import { realpathSync } from "node:fs";
8
8
  import { pathToFileURL } from "node:url";
9
9
 
10
10
  export const jsenvPluginFsRedirection = ({
11
+ directoryContentMagicName,
11
12
  magicExtensions = ["inherit", ".js"],
12
13
  magicDirectoryIndex = true,
13
14
  preserveSymlinks = false,
@@ -30,10 +31,14 @@ export const jsenvPluginFsRedirection = ({
30
31
  if (reference.subtype === "new_url_second_arg") {
31
32
  return `ignore:${reference.url}`;
32
33
  }
33
- if (reference.specifierPathname.endsWith("/...")) {
34
+ if (
35
+ reference.specifierPathname.endsWith(`/${directoryContentMagicName}`)
36
+ ) {
34
37
  const { rootDirectoryUrl } = reference.ownerUrlInfo.context;
35
38
  const directoryUrl = new URL(
36
- reference.specifierPathname.replace("/...", "/").slice(1),
39
+ reference.specifierPathname
40
+ .replace(`/${directoryContentMagicName}`, "/")
41
+ .slice(1),
37
42
  rootDirectoryUrl,
38
43
  ).href;
39
44
  return directoryUrl;
@@ -24,6 +24,7 @@ const htmlFileUrlForDirectory = new URL(
24
24
  "./client/directory.html",
25
25
  import.meta.url,
26
26
  );
27
+ const directoryContentMagicName = "...";
27
28
 
28
29
  export const jsenvPluginProtocolFile = ({
29
30
  magicExtensions,
@@ -33,6 +34,7 @@ export const jsenvPluginProtocolFile = ({
33
34
  }) => {
34
35
  return [
35
36
  jsenvPluginFsRedirection({
37
+ directoryContentMagicName,
36
38
  magicExtensions,
37
39
  magicDirectoryIndex,
38
40
  preserveSymlinks,
@@ -72,8 +74,9 @@ export const jsenvPluginProtocolFile = ({
72
74
  if (reference.original) {
73
75
  const originalSpecifierPathname =
74
76
  reference.original.specifierPathname;
75
-
76
- if (originalSpecifierPathname.endsWith("/...")) {
77
+ if (
78
+ originalSpecifierPathname.endsWith(`/${directoryContentMagicName}`)
79
+ ) {
77
80
  return originalSpecifierPathname;
78
81
  }
79
82
  }
@@ -238,7 +241,10 @@ const generateDirectoryNav = (relativeUrl, rootDirectoryUrl) => {
238
241
  let i = 0;
239
242
  while (i < parts.length) {
240
243
  const part = parts[i];
241
- const href = i === 0 ? "/..." : `/${parts.slice(1, i + 1).join("/")}/`;
244
+ const href =
245
+ i === 0
246
+ ? `/${directoryContentMagicName}`
247
+ : `/${parts.slice(1, i + 1).join("/")}/`;
242
248
  const text = part;
243
249
  const isLastPart = i === parts.length - 1;
244
250
  items.push({
@@ -356,7 +362,7 @@ const generateDirectoryContentItems = (directoryUrl, rootDirectoryUrl) => {
356
362
  };
357
363
  const generateDirectoryContent = (directoryContentItems) => {
358
364
  if (directoryContentItems.length === 0) {
359
- return `<p>Directory is empty</p>`;
365
+ return `<p class="directory_empty_message">Directory is empty</p>`;
360
366
  }
361
367
  let html = `<ul class="directory_content">`;
362
368
  for (const directoryContentItem of directoryContentItems) {