@jsenv/core 25.0.0-alpha.1 → 25.0.0

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.
@@ -5,8 +5,8 @@ export const BROWSER_RUNTIME_BUILD_URL = new URL("browser_runtime/browser_runtim
5
5
 
6
6
  export const COMPILE_PROXY_BUILD_URL = new URL("compile_proxy/compile_proxy_7ad5faa6.html", import.meta.url).href
7
7
 
8
- export const EVENT_SOURCE_CLIENT_BUILD_URL = new URL("event_source_client/event_source_client_620fbc2c.js", import.meta.url).href
8
+ export const EVENT_SOURCE_CLIENT_BUILD_URL = new URL("event_source_client/event_source_client_80644aee.js", import.meta.url).href
9
9
 
10
- export const TOOLBAR_BUILD_URL = new URL("toolbar/toolbar_04ba410c.html", import.meta.url).href
10
+ export const TOOLBAR_BUILD_URL = new URL("toolbar/toolbar_f7b8a263.html", import.meta.url).href
11
11
 
12
- export const TOOLBAR_INJECTOR_BUILD_URL = new URL("toolbar_injector/toolbar_injector_4a48bc53.js", import.meta.url).href
12
+ export const TOOLBAR_INJECTOR_BUILD_URL = new URL("toolbar_injector/toolbar_injector_49e4756e.js", import.meta.url).href
@@ -1,4 +1,4 @@
1
1
  {
2
- "compile_proxy_e3b0c442.js.map": "compile_proxy_e3b0c442_809f35f7.js.map",
3
- "compile_proxy.html": "compile_proxy_7ad5faa6.html"
2
+ "compile_proxy.html": "compile_proxy_7ad5faa6.html",
3
+ "compile_proxy_e3b0c442.js.map": "compile_proxy_e3b0c442_809f35f7.js.map"
4
4
  }
@@ -1,4 +1,4 @@
1
1
  {
2
- "event_source_client.js": "event_source_client_620fbc2c.js",
3
- "event_source_client.js.map": "event_source_client_620fbc2c.js.map"
2
+ "event_source_client.js": "event_source_client_80644aee.js",
3
+ "event_source_client.js.map": "event_source_client_80644aee.js.map"
4
4
  }
@@ -215,7 +215,7 @@
215
215
 
216
216
  /* eslint-env browser */
217
217
  var isLivereloadEnabled = function isLivereloadEnabled() {
218
- var value = window.localStorage.hasOwnProperty("livereload");
218
+ var value = window.localStorage.getItem("livereload");
219
219
 
220
220
  if (value === "0") {
221
221
  return false;
@@ -353,4 +353,4 @@
353
353
 
354
354
  })();
355
355
 
356
- //# sourceMappingURL=event_source_client_620fbc2c.js.map
356
+ //# sourceMappingURL=event_source_client_80644aee.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "file": "event_source_client_620fbc2c.js",
3
+ "file": "event_source_client_80644aee.js",
4
4
  "sources": [
5
5
  "../../src/internal/dev_server/event_source_client/event_source_connection.js",
6
6
  "../../src/internal/dev_server/event_source_client/livereload_preference.js",
@@ -9,7 +9,7 @@
9
9
  ],
10
10
  "sourcesContent": [
11
11
  "/* eslint-env browser */\n\nexport const createEventSourceConnection = (\n eventSourceUrl,\n events = {},\n { retryMaxAttempt = Infinity, retryAllocatedMs = Infinity, lastEventId } = {},\n) => {\n const { EventSource } = window\n if (typeof EventSource !== \"function\") {\n return () => {}\n }\n\n const eventSourceOrigin = new URL(eventSourceUrl).origin\n Object.keys(events).forEach((eventName) => {\n const eventCallback = events[eventName]\n events[eventName] = (e) => {\n if (e.origin === eventSourceOrigin) {\n if (e.lastEventId) {\n lastEventId = e.lastEventId\n }\n eventCallback(e)\n }\n }\n })\n\n let connectionStatus = \"default\"\n let connectionStatusChangeCallback = () => {}\n let _disconnect = () => {}\n\n const goToStatus = (newStatus) => {\n if (newStatus !== connectionStatus) {\n connectionStatus = newStatus\n connectionStatusChangeCallback()\n }\n }\n\n const attemptConnection = (url) => {\n const eventSource = new EventSource(url, {\n withCredentials: true,\n })\n _disconnect = () => {\n if (\n connectionStatus !== \"connecting\" &&\n connectionStatus !== \"connected\"\n ) {\n console.warn(\n `disconnect() ignored because connection is ${connectionStatus}`,\n )\n return\n }\n eventSource.onerror = undefined\n eventSource.close()\n Object.keys(events).forEach((eventName) => {\n eventSource.removeEventListener(eventName, events[eventName])\n })\n goToStatus(\"disconnected\")\n }\n let retryCount = 0\n let firstRetryMs = Date.now()\n eventSource.onerror = (errorEvent) => {\n if (errorEvent.target.readyState === EventSource.CONNECTING) {\n if (retryCount > retryMaxAttempt) {\n console.info(`could not connect after ${retryMaxAttempt} attempt`)\n _disconnect()\n return\n }\n\n if (retryCount === 0) {\n firstRetryMs = Date.now()\n } else {\n const allRetryDuration = Date.now() - firstRetryMs\n if (retryAllocatedMs && allRetryDuration > retryAllocatedMs) {\n console.info(\n `could not connect in less than ${retryAllocatedMs} ms`,\n )\n _disconnect()\n return\n }\n }\n\n retryCount++\n goToStatus(\"connecting\")\n return\n }\n\n if (errorEvent.target.readyState === EventSource.CLOSED) {\n _disconnect()\n return\n }\n }\n eventSource.onopen = () => {\n goToStatus(\"connected\")\n }\n Object.keys(events).forEach((eventName) => {\n eventSource.addEventListener(eventName, events[eventName])\n })\n if (!events.hasOwnProperty(\"welcome\")) {\n eventSource.addEventListener(\"welcome\", (e) => {\n if (e.origin === eventSourceOrigin && e.lastEventId) {\n lastEventId = e.lastEventId\n }\n })\n }\n goToStatus(\"connecting\")\n }\n\n let connect = () => {\n attemptConnection(eventSourceUrl)\n connect = () => {\n attemptConnection(\n lastEventId\n ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId)\n : eventSourceUrl,\n )\n }\n }\n\n const removePageUnloadListener = listenPageUnload(() => {\n _disconnect()\n })\n\n const destroy = () => {\n removePageUnloadListener()\n _disconnect()\n }\n\n return {\n getConnectionStatus: () => connectionStatus,\n setConnectionStatusChangeCallback: (callback) => {\n connectionStatusChangeCallback = callback\n },\n connect,\n disconnect: () => _disconnect(),\n destroy,\n }\n}\n\nconst addLastEventIdIntoUrlSearchParams = (url, lastEventId) => {\n if (url.indexOf(\"?\") === -1) {\n url += \"?\"\n } else {\n url += \"&\"\n }\n return `${url}last-event-id=${encodeURIComponent(lastEventId)}`\n}\n\n// const listenPageMightFreeze = (callback) => {\n// const removePageHideListener = listenEvent(window, \"pagehide\", (pageHideEvent) => {\n// if (pageHideEvent.persisted === true) {\n// callback(pageHideEvent)\n// }\n// })\n// return removePageHideListener\n// }\n\n// const listenPageFreeze = (callback) => {\n// const removeFreezeListener = listenEvent(document, \"freeze\", (freezeEvent) => {\n// callback(freezeEvent)\n// })\n// return removeFreezeListener\n// }\n\n// const listenPageIsRestored = (callback) => {\n// const removeResumeListener = listenEvent(document, \"resume\", (resumeEvent) => {\n// removePageshowListener()\n// callback(resumeEvent)\n// })\n// const removePageshowListener = listenEvent(window, \"pageshow\", (pageshowEvent) => {\n// if (pageshowEvent.persisted === true) {\n// removePageshowListener()\n// removeResumeListener()\n// callback(pageshowEvent)\n// }\n// })\n// return () => {\n// removeResumeListener()\n// removePageshowListener()\n// }\n// }\n\nconst listenPageUnload = (callback) => {\n const removePageHideListener = listenEvent(\n window,\n \"pagehide\",\n (pageHideEvent) => {\n if (pageHideEvent.persisted !== true) {\n callback(pageHideEvent)\n }\n },\n )\n return removePageHideListener\n}\n\nconst listenEvent = (emitter, event, callback) => {\n emitter.addEventListener(event, callback)\n return () => {\n emitter.removeEventListener(event, callback)\n }\n}\n",
12
- "/* eslint-env browser */\n\nexport const isLivereloadEnabled = () => {\n const value = window.localStorage.hasOwnProperty(\"livereload\")\n if (value === \"0\") {\n return false\n }\n return true\n}\n\nexport const setLivereloadPreference = (value) => {\n window.localStorage.setItem(\"livereload\", value ? \"1\" : \"0\")\n}\n",
12
+ "/* eslint-env browser */\n\nexport const isLivereloadEnabled = () => {\n const value = window.localStorage.getItem(\"livereload\")\n if (value === \"0\") {\n return false\n }\n return true\n}\n\nexport const setLivereloadPreference = (value) => {\n window.localStorage.setItem(\"livereload\", value ? \"1\" : \"0\")\n}\n",
13
13
  "/* eslint-env browser */\n\nimport { isLivereloadEnabled } from \"./livereload_preference.js\"\n\nlet fileChanges = {}\nlet filechangeCallback = () => {}\n\nexport const getFileChanges = () => fileChanges\n\nexport const addFileChange = ({ file, eventType }) => {\n fileChanges[file] = eventType\n if (isLivereloadEnabled()) {\n reloadIfNeeded()\n } else {\n filechangeCallback()\n }\n}\n\nexport const setFileChangeCallback = (callback) => {\n filechangeCallback = callback\n}\n\nexport const reloadIfNeeded = () => {\n const customReloads = []\n const cssReloads = []\n const fullReloads = []\n\n Object.keys(fileChanges).forEach((key) => {\n const livereloadCallback = window.__jsenv__.livereloadingCallbacks[key]\n if (livereloadCallback) {\n customReloads.push(() => {\n delete fileChanges[key]\n livereloadCallback({\n reloadPage,\n })\n })\n } else if (\n key.endsWith(\".css\") ||\n key.endsWith(\".scss\") ||\n key.endsWith(\".sass\")\n ) {\n cssReloads.push(() => {\n delete fileChanges[key]\n })\n } else {\n fullReloads.push(key)\n }\n })\n\n if (fullReloads.length > 0) {\n reloadPage()\n return\n }\n\n customReloads.forEach((customReload) => {\n customReload()\n })\n\n if (cssReloads.length) {\n reloadAllCss()\n cssReloads.forEach((cssReload) => {\n cssReload()\n })\n }\n\n filechangeCallback()\n}\n\nconst reloadAllCss = () => {\n const links = Array.from(window.parent.document.getElementsByTagName(\"link\"))\n links.forEach((link) => {\n if (link.rel === \"stylesheet\") {\n const url = new URL(link.href)\n url.searchParams.set(\"t\", Date.now())\n link.href = String(url)\n }\n })\n}\n\nconst reloadPage = () => {\n window.parent.location.reload(true)\n}\n",
14
14
  "/* eslint-env browser */\n\nimport { createEventSourceConnection } from \"./event_source_connection.js\"\nimport {\n getFileChanges,\n addFileChange,\n setFileChangeCallback,\n reloadIfNeeded,\n} from \"./file_changes.js\"\nimport {\n isLivereloadEnabled,\n setLivereloadPreference,\n} from \"./livereload_preference.js\"\n\nconst eventsourceConnection = createEventSourceConnection(\n document.location.href,\n {\n \"file-added\": ({ data }) => {\n addFileChange({\n file: data,\n eventType: \"added\",\n })\n },\n \"file-modified\": ({ data }) => {\n addFileChange({\n file: data,\n eventType: \"modified\",\n })\n },\n \"file-removed\": ({ data }) => {\n addFileChange({\n file: data,\n eventType: \"removed\",\n })\n },\n },\n {\n retryMaxAttempt: Infinity,\n retryAllocatedMs: 20 * 1000,\n },\n)\n\nconst {\n connect,\n disconnect,\n setConnectionStatusChangeCallback,\n getConnectionStatus,\n} = eventsourceConnection\n\nconnect()\n\nwindow.__jsenv_event_source_client__ = {\n connect,\n disconnect,\n getConnectionStatus,\n setConnectionStatusChangeCallback,\n getFileChanges,\n addFileChange,\n setFileChangeCallback,\n reloadIfNeeded,\n isLivereloadEnabled,\n setLivereloadPreference,\n}\n"
15
15
  ],
@@ -81,6 +81,7 @@
81
81
  "isLivereloadEnabled",
82
82
  "value",
83
83
  "localStorage",
84
+ "getItem",
84
85
  "setLivereloadPreference",
85
86
  "setItem",
86
87
  "fileChanges",
@@ -123,5 +124,5 @@
123
124
  "data",
124
125
  "__jsenv_event_source_client__"
125
126
  ],
126
- "mappings": "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"
127
+ "mappings": "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"
127
128
  }
@@ -1,13 +1,13 @@
1
1
  {
2
- ".jsenv/build/best/src/internal/dev_server/toolbar/compilation/compilation.css.map": "assets/compilation.css_e37c747b.map",
3
- ".jsenv/build/best/src/internal/dev_server/toolbar/eventsource/eventsource.css.map": "assets/eventsource.css_c0c71e7b.map",
4
- ".jsenv/build/best/src/internal/dev_server/toolbar/execution/execution.css.map": "assets/execution.css_f3377c10.map",
5
- ".jsenv/build/best/src/internal/dev_server/toolbar/focus/focus.css.map": "assets/focus.css_896f3e45.map",
6
- ".jsenv/build/best/src/internal/dev_server/toolbar/responsive/overflow-menu.css.map": "assets/overflow-menu.css_2859d519.map",
7
- ".jsenv/build/best/src/internal/dev_server/toolbar/settings/settings.css.map": "assets/settings.css_61548139.map",
8
- ".jsenv/build/best/src/internal/dev_server/toolbar/theme/light-theme.css.map": "assets/light-theme.css_72a60fa3.map",
9
- ".jsenv/build/best/src/internal/dev_server/toolbar/tooltip/tooltip.css.map": "assets/tooltip.css_a94a8bdd.map",
10
- ".jsenv/build/best/src/internal/dev_server/toolbar/toolbar.main.css.map": "assets/toolbar.main.css_269d7ce2.map",
11
- "toolbar.html": "toolbar_04ba410c.html",
12
- "toolbar.main2.js.map": "toolbar.main2_6c1b3d82.js.map"
2
+ "assets/compilation.css.map": "assets/compilation.css_e37c747b.map",
3
+ "assets/eventsource.css.map": "assets/eventsource.css_c0c71e7b.map",
4
+ "assets/execution.css.map": "assets/execution.css_f3377c10.map",
5
+ "assets/focus.css.map": "assets/focus.css_896f3e45.map",
6
+ "assets/light-theme.css.map": "assets/light-theme.css_72a60fa3.map",
7
+ "assets/overflow-menu.css.map": "assets/overflow-menu.css_2859d519.map",
8
+ "assets/settings.css.map": "assets/settings.css_61548139.map",
9
+ "assets/toolbar.main.css.map": "assets/toolbar.main.css_269d7ce2.map",
10
+ "assets/tooltip.css.map": "assets/tooltip.css_a94a8bdd.map",
11
+ "toolbar.html": "toolbar_f7b8a263.html",
12
+ "toolbar.main.js.map": "toolbar.main_6c1b3d82.js.map"
13
13
  }
@@ -5010,7 +5010,7 @@ html[data-toolbar-visible] #toolbar-trigger {
5010
5010
  };
5011
5011
  });
5012
5012
 
5013
- //# sourceMappingURL=toolbar.main2_6c1b3d82.js.map</script>
5013
+ //# sourceMappingURL=toolbar.main_6c1b3d82.js.map</script>
5014
5014
 
5015
5015
 
5016
5016
  </body></html>
@@ -1,5 +1,5 @@
1
1
  {
2
- ".jsenv/build/best/src/internal/dev_server/toolbar/jsenv-logo.svg": "assets/jsenv-logo_188b9ca6.svg",
3
- "toolbar_injector.js": "toolbar_injector_4a48bc53.js",
4
- "toolbar_injector.js.map": "toolbar_injector_4a48bc53.js.map"
2
+ "assets/jsenv-logo.svg": "assets/jsenv-logo_188b9ca6.svg",
3
+ "toolbar_injector.js": "toolbar_injector_49e4756e.js",
4
+ "toolbar_injector.js.map": "toolbar_injector_49e4756e.js.map"
5
5
  }
@@ -746,7 +746,7 @@
746
746
  return then ? value.then(then) : value;
747
747
  }
748
748
 
749
- var TOOLBAR_BUILD_RELATIVE_URL = "dist/toolbar/toolbar_04ba410c.html";
749
+ var TOOLBAR_BUILD_RELATIVE_URL = "dist/toolbar/toolbar_f7b8a263.html";
750
750
 
751
751
  function _call(body, then, direct) {
752
752
  if (direct) {
@@ -970,4 +970,4 @@
970
970
 
971
971
  })();
972
972
 
973
- //# sourceMappingURL=toolbar_injector_4a48bc53.js.map
973
+ //# sourceMappingURL=toolbar_injector_49e4756e.js.map
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "file": "toolbar_injector_4a48bc53.js",
3
+ "file": "toolbar_injector_49e4756e.js",
4
4
  "sources": [
5
5
  "../../helpers/babel/typeof/typeof.js",
6
6
  "../../helpers/babel/defineProperty/defineProperty.js",
@@ -25,7 +25,7 @@
25
25
  "import { fetchUrl } from \"./fetch-browser.js\"\n\nexport const fetchJson = async (url, options = {}) => {\n const response = await fetchUrl(url, options)\n const object = await response.json()\n return object\n}\n",
26
26
  "import { fetchJson } from \"../../browser_utils/fetchJson.js\"\n\nexport const fetchExploringJson = async ({ signal } = {}) => {\n try {\n const exploringInfo = await fetchJson(\"/.jsenv/exploring.json\", {\n signal,\n })\n return exploringInfo\n } catch (e) {\n if (signal && signal.aborted && e.name === \"AbortError\") {\n throw e\n }\n throw new Error(\n `Cannot communicate with exploring server due to a network error\n--- error stack ---\n${e.stack}`,\n )\n }\n}\n",
27
27
  "export const updateIframeOverflowOnParentWindow = () => {\n if (!window.parent) {\n // can happen while parent iframe reloads\n return\n }\n\n const aTooltipIsOpened =\n document.querySelector(\"[data-tooltip-visible]\") ||\n document.querySelector(\"[data-tooltip-auto-visible]\")\n const settingsAreOpened = document.querySelector(\"#settings[data-active]\")\n\n if (aTooltipIsOpened || settingsAreOpened) {\n enableIframeOverflowOnParentWindow()\n } else {\n disableIframeOverflowOnParentWindow()\n }\n}\n\nlet iframeOverflowEnabled = false\nconst enableIframeOverflowOnParentWindow = () => {\n if (iframeOverflowEnabled) return\n iframeOverflowEnabled = true\n\n const iframe = getToolbarIframe()\n const transitionDuration = iframe.style.transitionDuration\n setStyles(iframe, { \"height\": \"100%\", \"transition-duration\": \"0ms\" })\n if (transitionDuration) {\n setTimeout(() => {\n setStyles(iframe, { \"transition-duration\": transitionDuration })\n })\n }\n}\n\nconst disableIframeOverflowOnParentWindow = () => {\n if (!iframeOverflowEnabled) return\n iframeOverflowEnabled = false\n\n const iframe = getToolbarIframe()\n const transitionDuration = iframe.style.transitionDuration\n setStyles(iframe, { \"height\": \"40px\", \"transition-duration\": \"0ms\" })\n if (transitionDuration) {\n setTimeout(() => {\n setStyles(iframe, { \"transition-duration\": transitionDuration })\n })\n }\n}\n\nexport const getToolbarIframe = () => {\n const iframes = Array.from(window.parent.document.querySelectorAll(\"iframe\"))\n return iframes.find((iframe) => iframe.contentWindow === window)\n}\n\nexport const forceHideElement = (element) => {\n element.setAttribute(\"data-force-hide\", \"\")\n}\n\nexport const removeForceHideElement = (element) => {\n element.removeAttribute(\"data-force-hide\")\n}\n\nexport const setStyles = (element, styles) => {\n const elementStyle = element.style\n const restoreStyles = Object.keys(styles).map((styleName) => {\n let restore\n if (styleName in elementStyle) {\n const currentStyle = elementStyle[styleName]\n restore = () => {\n elementStyle[styleName] = currentStyle\n }\n } else {\n restore = () => {\n delete elementStyle[styleName]\n }\n }\n\n elementStyle[styleName] = styles[styleName]\n\n return restore\n })\n return () => {\n restoreStyles.forEach((restore) => restore())\n }\n}\n\nexport const setAttributes = (element, attributes) => {\n Object.keys(attributes).forEach((name) => {\n element.setAttribute(name, attributes[name])\n })\n}\n\nexport const getDocumentScroll = () => {\n return {\n x: document.documentElement.scrollLeft,\n y: document.documentElement.scrollTop,\n }\n}\n\nexport const toolbarSectionIsActive = (element) => {\n return element.hasAttribute(\"data-active\")\n}\n\nexport const activateToolbarSection = (element) => {\n element.setAttribute(\"data-active\", \"\")\n}\n\nexport const deactivateToolbarSection = (element) => {\n element.removeAttribute(\"data-active\")\n}\n",
28
- "import { fetchExploringJson } from \"@jsenv/core/src/internal/dev_server/exploring/fetchExploringJson.js\"\nimport { setAttributes, setStyles } from \"./util/dom.js\"\n\n// eslint-disable-next-line no-undef\nconst TOOLBAR_BUILD_RELATIVE_URL = \"dist/toolbar/toolbar_04ba410c.html\"\nconst jsenvLogoSvgUrl = new URL(\"./jsenv-logo.svg\", import.meta.url)\n\nconst injectToolbar = async () => {\n await new Promise((resolve) => {\n if (window.requestIdleCallback) {\n window.requestIdleCallback(resolve)\n } else {\n window.requestAnimationFrame(resolve)\n }\n })\n\n const { jsenvDirectoryRelativeUrl } = await fetchExploringJson()\n const jsenvDirectoryServerUrl = resolveUrl(\n jsenvDirectoryRelativeUrl,\n document.location.origin,\n )\n\n const placeholder = getToolbarPlaceholder()\n\n const iframe = document.createElement(\"iframe\")\n setAttributes(iframe, {\n tabindex: -1,\n // sandbox: \"allow-forms allow-modals allow-pointer-lock allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation\",\n // allow: \"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr\",\n allowtransparency: true,\n })\n setStyles(iframe, {\n \"position\": \"fixed\",\n \"zIndex\": 1000,\n \"bottom\": 0,\n \"left\": 0,\n \"width\": \"100%\",\n \"height\": 0,\n /* ensure toolbar children are not focusable when hidden */\n \"visibility\": \"hidden\",\n \"transition-duration\": \"300ms\",\n \"transition-property\": \"height, visibility\",\n \"border\": \"none\",\n })\n const iframeLoadedPromise = iframeToLoadedPromise(iframe)\n const jsenvToolbarHtmlServerUrl = resolveUrl(\n TOOLBAR_BUILD_RELATIVE_URL,\n jsenvDirectoryServerUrl,\n )\n // set iframe src BEFORE putting it into the DOM (prevent firefox adding an history entry)\n iframe.setAttribute(\"src\", jsenvToolbarHtmlServerUrl)\n placeholder.parentNode.replaceChild(iframe, placeholder)\n\n await iframeLoadedPromise\n iframe.removeAttribute(\"tabindex\")\n\n const div = document.createElement(\"div\")\n div.innerHTML = `\n<div id=\"jsenv-toolbar-trigger\">\n <svg id=\"jsenv-toolbar-trigger-icon\">\n <use xlink:href=\"${jsenvLogoSvgUrl}#jsenv-logo\"></use>\n </svg>\n <style>\n #jsenv-toolbar-trigger {\n display: block;\n overflow: hidden;\n position: fixed;\n z-index: 1000;\n bottom: -32px;\n right: 20px;\n height: 40px;\n width: 40px;\n padding: 0;\n margin: 0;\n border-radius: 5px 5px 0 0;\n border: 1px solid rgba(0, 0, 0, 0.33);\n border-bottom: none;\n box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.46);\n background: transparent;\n text-align: center;\n transition: 600ms;\n }\n\n #jsenv-toolbar-trigger:hover {\n cursor: pointer;\n }\n\n #jsenv-toolbar-trigger[data-expanded] {\n bottom: 0;\n }\n\n #jsenv-toolbar-trigger-icon {\n width: 35px;\n height: 35px;\n opacity: 0;\n transition: 600ms;\n }\n\n #jsenv-toolbar-trigger[data-expanded] #jsenv-toolbar-trigger-icon {\n opacity: 1;\n }\n </style>\n</div>`\n const toolbarTrigger = div.firstElementChild\n iframe.parentNode.appendChild(toolbarTrigger)\n\n let timer\n toolbarTrigger.onmouseenter = () => {\n toolbarTrigger.setAttribute(\"data-animate\", \"\")\n timer = setTimeout(expandToolbarTrigger, 500)\n }\n toolbarTrigger.onmouseleave = () => {\n clearTimeout(timer)\n collapseToolbarTrigger()\n }\n toolbarTrigger.onfocus = () => {\n toolbarTrigger.removeAttribute(\"data-animate\")\n expandToolbarTrigger()\n }\n toolbarTrigger.onblur = () => {\n toolbarTrigger.removeAttribute(\"data-animate\")\n clearTimeout(timer)\n collapseToolbarTrigger()\n }\n toolbarTrigger.onclick = () => {\n sendCommandToToolbar(iframe, \"showToolbar\")\n }\n\n const showToolbarTrigger = () => {\n toolbarTrigger.style.display = \"block\"\n }\n\n const hideToolbarTrigger = () => {\n toolbarTrigger.style.display = \"none\"\n }\n\n const expandToolbarTrigger = () => {\n toolbarTrigger.setAttribute(\"data-expanded\", \"\")\n }\n\n const collapseToolbarTrigger = () => {\n toolbarTrigger.removeAttribute(\"data-expanded\", \"\")\n }\n\n hideToolbarTrigger()\n addToolbarEventCallback(iframe, \"toolbar-visibility-change\", (visible) => {\n if (visible) {\n hideToolbarTrigger()\n } else {\n showToolbarTrigger()\n }\n })\n addToolbarEventCallback(iframe, \"toolbar_ready\", () => {\n sendCommandToToolbar(iframe, \"renderToolbar\")\n })\n\n return iframe\n}\n\nconst addToolbarEventCallback = (iframe, eventName, callback) => {\n const messageEventCallback = (messageEvent) => {\n const { data } = messageEvent\n if (typeof data !== \"object\") {\n return\n }\n const { __jsenv__ } = data\n if (!__jsenv__) {\n return\n }\n if (__jsenv__.event !== eventName) {\n return\n }\n callback(__jsenv__.data)\n }\n\n window.addEventListener(\"message\", messageEventCallback, false)\n return () => {\n window.removeEventListener(\"message\", messageEventCallback, false)\n }\n}\n\nconst sendCommandToToolbar = (iframe, command, ...args) => {\n iframe.contentWindow.postMessage(\n {\n __jsenv__: {\n command,\n args,\n },\n },\n window.origin,\n )\n}\n\nconst getToolbarPlaceholder = () => {\n const placeholder = queryPlaceholder()\n if (placeholder) {\n if (document.body.contains(placeholder)) {\n return placeholder\n }\n // otherwise iframe would not be visible because in <head>\n console.warn(\n \"element with [data-jsenv-toolbar-placeholder] must be inside document.body\",\n )\n return createTooolbarPlaceholder()\n }\n return createTooolbarPlaceholder()\n}\n\nconst queryPlaceholder = () => {\n return document.querySelector(\"[data-jsenv-toolbar-placeholder]\")\n}\n\nconst createTooolbarPlaceholder = () => {\n const placeholder = document.createElement(\"span\")\n document.body.appendChild(placeholder)\n return placeholder\n}\n\nconst iframeToLoadedPromise = (iframe) => {\n return new Promise((resolve) => {\n const onload = () => {\n iframe.removeEventListener(\"load\", onload, true)\n resolve()\n }\n iframe.addEventListener(\"load\", onload, true)\n })\n}\n\nconst resolveUrl = (url, baseUrl) => String(new URL(url, baseUrl))\n\nif (document.readyState === \"complete\") {\n injectToolbar()\n} else {\n window.addEventListener(\"load\", injectToolbar)\n}\n"
28
+ "import { fetchExploringJson } from \"@jsenv/core/src/internal/dev_server/exploring/fetchExploringJson.js\"\nimport { setAttributes, setStyles } from \"./util/dom.js\"\n\n// eslint-disable-next-line no-undef\nconst TOOLBAR_BUILD_RELATIVE_URL = \"dist/toolbar/toolbar_f7b8a263.html\"\nconst jsenvLogoSvgUrl = new URL(\"./jsenv-logo.svg\", import.meta.url)\n\nconst injectToolbar = async () => {\n await new Promise((resolve) => {\n if (window.requestIdleCallback) {\n window.requestIdleCallback(resolve)\n } else {\n window.requestAnimationFrame(resolve)\n }\n })\n\n const { jsenvDirectoryRelativeUrl } = await fetchExploringJson()\n const jsenvDirectoryServerUrl = resolveUrl(\n jsenvDirectoryRelativeUrl,\n document.location.origin,\n )\n\n const placeholder = getToolbarPlaceholder()\n\n const iframe = document.createElement(\"iframe\")\n setAttributes(iframe, {\n tabindex: -1,\n // sandbox: \"allow-forms allow-modals allow-pointer-lock allow-popups allow-presentation allow-same-origin allow-scripts allow-top-navigation-by-user-activation\",\n // allow: \"accelerometer; ambient-light-sensor; camera; encrypted-media; geolocation; gyroscope; microphone; midi; payment; vr\",\n allowtransparency: true,\n })\n setStyles(iframe, {\n \"position\": \"fixed\",\n \"zIndex\": 1000,\n \"bottom\": 0,\n \"left\": 0,\n \"width\": \"100%\",\n \"height\": 0,\n /* ensure toolbar children are not focusable when hidden */\n \"visibility\": \"hidden\",\n \"transition-duration\": \"300ms\",\n \"transition-property\": \"height, visibility\",\n \"border\": \"none\",\n })\n const iframeLoadedPromise = iframeToLoadedPromise(iframe)\n const jsenvToolbarHtmlServerUrl = resolveUrl(\n TOOLBAR_BUILD_RELATIVE_URL,\n jsenvDirectoryServerUrl,\n )\n // set iframe src BEFORE putting it into the DOM (prevent firefox adding an history entry)\n iframe.setAttribute(\"src\", jsenvToolbarHtmlServerUrl)\n placeholder.parentNode.replaceChild(iframe, placeholder)\n\n await iframeLoadedPromise\n iframe.removeAttribute(\"tabindex\")\n\n const div = document.createElement(\"div\")\n div.innerHTML = `\n<div id=\"jsenv-toolbar-trigger\">\n <svg id=\"jsenv-toolbar-trigger-icon\">\n <use xlink:href=\"${jsenvLogoSvgUrl}#jsenv-logo\"></use>\n </svg>\n <style>\n #jsenv-toolbar-trigger {\n display: block;\n overflow: hidden;\n position: fixed;\n z-index: 1000;\n bottom: -32px;\n right: 20px;\n height: 40px;\n width: 40px;\n padding: 0;\n margin: 0;\n border-radius: 5px 5px 0 0;\n border: 1px solid rgba(0, 0, 0, 0.33);\n border-bottom: none;\n box-shadow: 0px 0px 6px 2px rgba(0, 0, 0, 0.46);\n background: transparent;\n text-align: center;\n transition: 600ms;\n }\n\n #jsenv-toolbar-trigger:hover {\n cursor: pointer;\n }\n\n #jsenv-toolbar-trigger[data-expanded] {\n bottom: 0;\n }\n\n #jsenv-toolbar-trigger-icon {\n width: 35px;\n height: 35px;\n opacity: 0;\n transition: 600ms;\n }\n\n #jsenv-toolbar-trigger[data-expanded] #jsenv-toolbar-trigger-icon {\n opacity: 1;\n }\n </style>\n</div>`\n const toolbarTrigger = div.firstElementChild\n iframe.parentNode.appendChild(toolbarTrigger)\n\n let timer\n toolbarTrigger.onmouseenter = () => {\n toolbarTrigger.setAttribute(\"data-animate\", \"\")\n timer = setTimeout(expandToolbarTrigger, 500)\n }\n toolbarTrigger.onmouseleave = () => {\n clearTimeout(timer)\n collapseToolbarTrigger()\n }\n toolbarTrigger.onfocus = () => {\n toolbarTrigger.removeAttribute(\"data-animate\")\n expandToolbarTrigger()\n }\n toolbarTrigger.onblur = () => {\n toolbarTrigger.removeAttribute(\"data-animate\")\n clearTimeout(timer)\n collapseToolbarTrigger()\n }\n toolbarTrigger.onclick = () => {\n sendCommandToToolbar(iframe, \"showToolbar\")\n }\n\n const showToolbarTrigger = () => {\n toolbarTrigger.style.display = \"block\"\n }\n\n const hideToolbarTrigger = () => {\n toolbarTrigger.style.display = \"none\"\n }\n\n const expandToolbarTrigger = () => {\n toolbarTrigger.setAttribute(\"data-expanded\", \"\")\n }\n\n const collapseToolbarTrigger = () => {\n toolbarTrigger.removeAttribute(\"data-expanded\", \"\")\n }\n\n hideToolbarTrigger()\n addToolbarEventCallback(iframe, \"toolbar-visibility-change\", (visible) => {\n if (visible) {\n hideToolbarTrigger()\n } else {\n showToolbarTrigger()\n }\n })\n addToolbarEventCallback(iframe, \"toolbar_ready\", () => {\n sendCommandToToolbar(iframe, \"renderToolbar\")\n })\n\n return iframe\n}\n\nconst addToolbarEventCallback = (iframe, eventName, callback) => {\n const messageEventCallback = (messageEvent) => {\n const { data } = messageEvent\n if (typeof data !== \"object\") {\n return\n }\n const { __jsenv__ } = data\n if (!__jsenv__) {\n return\n }\n if (__jsenv__.event !== eventName) {\n return\n }\n callback(__jsenv__.data)\n }\n\n window.addEventListener(\"message\", messageEventCallback, false)\n return () => {\n window.removeEventListener(\"message\", messageEventCallback, false)\n }\n}\n\nconst sendCommandToToolbar = (iframe, command, ...args) => {\n iframe.contentWindow.postMessage(\n {\n __jsenv__: {\n command,\n args,\n },\n },\n window.origin,\n )\n}\n\nconst getToolbarPlaceholder = () => {\n const placeholder = queryPlaceholder()\n if (placeholder) {\n if (document.body.contains(placeholder)) {\n return placeholder\n }\n // otherwise iframe would not be visible because in <head>\n console.warn(\n \"element with [data-jsenv-toolbar-placeholder] must be inside document.body\",\n )\n return createTooolbarPlaceholder()\n }\n return createTooolbarPlaceholder()\n}\n\nconst queryPlaceholder = () => {\n return document.querySelector(\"[data-jsenv-toolbar-placeholder]\")\n}\n\nconst createTooolbarPlaceholder = () => {\n const placeholder = document.createElement(\"span\")\n document.body.appendChild(placeholder)\n return placeholder\n}\n\nconst iframeToLoadedPromise = (iframe) => {\n return new Promise((resolve) => {\n const onload = () => {\n iframe.removeEventListener(\"load\", onload, true)\n resolve()\n }\n iframe.addEventListener(\"load\", onload, true)\n })\n}\n\nconst resolveUrl = (url, baseUrl) => String(new URL(url, baseUrl))\n\nif (document.readyState === \"complete\") {\n injectToolbar()\n} else {\n window.addEventListener(\"load\", injectToolbar)\n}\n"
29
29
  ],
30
30
  "names": [
31
31
  "nativeTypeOf",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsenv/core",
3
- "version": "25.0.0-alpha.1",
3
+ "version": "25.0.0",
4
4
  "description": "Tool to develop, test and build js projects",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -15,6 +15,15 @@ import {
15
15
  jsenvNodeRuntimeSupport,
16
16
  } from "./internal/generateGroupMap/jsenvRuntimeSupport.js"
17
17
 
18
+ /**
19
+ * Generate optimized version of source files into a directory
20
+ * @param {string|url} projectDirectoryUrl Root directory of the project
21
+ * @param {string|url} buildDirectoryRelativeUrl Directory where optimized files are written
22
+ * @param {object} entryPoints Describe entry point paths and control their names in the build directory
23
+ * @param {"esmodule" | "systemjs" | "commonjs" | "global"} format Code generated will use this module format
24
+ * @param {object} runtimeSupport Code generated will be compatible with these runtimes
25
+ * @param {boolean} [minify=false] Minify file content in the build directory (HTML, CSS, JS, JSON, SVG)
26
+ */
18
27
  export const buildProject = async ({
19
28
  signal = new AbortController().signal,
20
29
  handleSIGINT = true,
@@ -19,6 +19,17 @@ import { generateCoverageHtmlDirectory } from "./internal/executing/coverage_rep
19
19
  import { generateCoverageTextLog } from "./internal/executing/coverage_reporter/coverage_reporter_text_log.js"
20
20
  import { jsenvCoverageConfig } from "./jsenvCoverageConfig.js"
21
21
 
22
+ /**
23
+ * Execute a list of files and log how it goes
24
+ * @param {object} testPlan Configure files to execute and their runtimes (browsers/node)
25
+ * @param {string|url} projectDirectoryUrl Root directory of the project
26
+ * @param {number} [maxExecutionsInParallel=1] Maximum amount of execution in parallel
27
+ * @param {number} [defaultMsAllocatedPerExecution=30000] Milliseconds after which execution is aborted and considered as failed by timeout
28
+ * @param {number} [cooldownBetweenExecutions=0] Millisecond to wait between each execution
29
+ * @param {boolean} [logMemoryHeapUsage=false] Add memory heap usage during logs
30
+ * @param {boolean} [coverage=false] Controls if coverage is collected during files executions
31
+ * @param {boolean} [coverageV8ConflictWarning=true] Warn when coverage from 2 executions cannot be merged
32
+ */
22
33
  export const executeTestPlan = async ({
23
34
  signal = new AbortController().signal,
24
35
  handleSIGINT = true,
@@ -182,14 +182,16 @@ export const createRollupPlugins = async ({
182
182
  projectDirectoryUrl,
183
183
  )
184
184
 
185
- // map build relative urls without hash (called "ressourceName") to real build relative urls
186
- let buildManifest = {}
185
+ // Object mapping project relative urls to build relative urls
186
+ let buildMappings = {}
187
+ // Object mapping ressource names to build relative urls
188
+ let ressourceMappings = {}
187
189
 
188
190
  const ressourcesReferencedByJs = []
189
191
  const createImportMapForFilesUsedInJs = () => {
190
192
  const topLevelMappings = {}
191
193
  ressourcesReferencedByJs.sort(comparePathnames).forEach((ressourceName) => {
192
- const buildRelativeUrl = buildManifest[ressourceName]
194
+ const buildRelativeUrl = ressourceMappings[ressourceName]
193
195
  if (
194
196
  ressourceName &&
195
197
  buildRelativeUrl &&
@@ -203,12 +205,6 @@ export const createRollupPlugins = async ({
203
205
  }
204
206
  }
205
207
 
206
- // an object where keys are build relative urls
207
- // and values rollup chunk or asset
208
- // we need this because we sometimes tell rollup
209
- // that a file.fileName is something while it's not really this
210
- // because of remapping
211
- let buildMappings = {}
212
208
  let rollupBuild
213
209
 
214
210
  const EMPTY_CHUNK_URL = resolveUrl("__empty__", projectDirectoryUrl)
@@ -1390,7 +1386,7 @@ export const createRollupPlugins = async ({
1390
1386
  buildMappings[originalProjectRelativeUrl] =
1391
1387
  jsRessource.buildRelativeUrl
1392
1388
  }
1393
- buildManifest[jsRessource.fileName] = jsRessource.buildRelativeUrl
1389
+ ressourceMappings[jsRessource.fileName] = jsRessource.buildRelativeUrl
1394
1390
  })
1395
1391
  // wait for asset build relative urls
1396
1392
  // to ensure the importmap will contain remappings for them
@@ -1402,7 +1398,7 @@ export const createRollupPlugins = async ({
1402
1398
  })
1403
1399
  if (ressource && !ressource.isJsModule) {
1404
1400
  await ressource.getReadyPromise()
1405
- buildManifest[ressourceName] = ressource.buildRelativeUrl
1401
+ ressourceMappings[ressourceName] = ressource.buildRelativeUrl
1406
1402
  }
1407
1403
  }),
1408
1404
  )
@@ -1456,7 +1452,7 @@ export const createRollupPlugins = async ({
1456
1452
  // in case sourcemap is mutated, we must not trust rollup but the asset builder source instead
1457
1453
  rollupFileInfo.source = assetRessource.bufferAfterBuild
1458
1454
  assetBuild[buildRelativeUrl] = rollupFileInfo
1459
- buildManifest[assetRessource.fileName] = buildRelativeUrl
1455
+ ressourceMappings[assetRessource.fileName] = buildRelativeUrl
1460
1456
  if (assetRessource.bufferBeforeBuild) {
1461
1457
  const originalProjectUrl = asOriginalUrl(assetRessource.url)
1462
1458
  const originalProjectRelativeUrl = urlToRelativeUrl(
@@ -1474,8 +1470,8 @@ export const createRollupPlugins = async ({
1474
1470
  }
1475
1471
  rollupBuild = sortObjectByPathnames(rollupBuild)
1476
1472
  // fill "buildFileContents", "buildInlineFilesContents"
1477
- // and update "buildManifest" and "buildMappings" in case some ressource where inlined
1478
- // by ressourceBuilder.rollupBuildEnd
1473
+ // and update "buildMappings"
1474
+ // in case some ressource where inlined by ressourceBuilder.rollupBuildEnd
1479
1475
  Object.keys(rollupBuild).forEach((buildRelativeUrl) => {
1480
1476
  const rollupFileInfo = rollupBuild[buildRelativeUrl]
1481
1477
  const ressource = ressourceBuilder.findRessource((ressource) => {
@@ -1488,7 +1484,6 @@ export const createRollupPlugins = async ({
1488
1484
  return false
1489
1485
  })
1490
1486
  if (ressource.isInline) {
1491
- delete buildManifest[ressource.fileName]
1492
1487
  if (ressource.isJsModule) {
1493
1488
  delete jsModuleBuild[buildRelativeUrl]
1494
1489
  } else {
@@ -1508,19 +1503,18 @@ export const createRollupPlugins = async ({
1508
1503
  }
1509
1504
  })
1510
1505
 
1506
+ ressourceMappings = sortObjectByPathnames(ressourceMappings)
1507
+ buildMappings = sortObjectByPathnames(buildMappings)
1511
1508
  await visitServiceWorkers({
1512
1509
  projectDirectoryUrl,
1513
1510
  serviceWorkerUrls,
1514
1511
  classicServiceWorkerUrls,
1515
1512
  serviceWorkerFinalizer,
1516
1513
  buildMappings,
1517
- buildManifest,
1514
+ ressourceMappings,
1518
1515
  buildFileContents,
1519
1516
  lineBreakNormalization,
1520
1517
  })
1521
-
1522
- buildManifest = sortObjectByPathnames(buildManifest)
1523
- buildMappings = sortObjectByPathnames(buildMappings)
1524
1518
  const buildDuration = Date.now() - buildStartMs
1525
1519
  buildStats = createBuildStats({
1526
1520
  buildFileContents,
@@ -1560,7 +1554,11 @@ export const createRollupPlugins = async ({
1560
1554
  rollupBuild,
1561
1555
  urlResponseBodyMap: urlLoader.getUrlResponseBodyMap(),
1562
1556
  buildMappings,
1563
- buildManifest,
1557
+ ressourceMappings,
1558
+ // Object mapping build relative urls without hash to build relative urls
1559
+ buildManifest: createBuildManifest({
1560
+ buildFileContents,
1561
+ }),
1564
1562
  buildImportMap: createImportMapForFilesUsedInJs(),
1565
1563
  buildFileContents,
1566
1564
  buildInlineFileContents,
@@ -1573,6 +1571,21 @@ export const createRollupPlugins = async ({
1573
1571
  }
1574
1572
  }
1575
1573
 
1574
+ const createBuildManifest = ({ buildFileContents }) => {
1575
+ const buildManifest = {}
1576
+ Object.keys(buildFileContents).forEach((buildRelativeUrl) => {
1577
+ const relativeUrlWithoutHash = asFileNameWithoutHash(buildRelativeUrl)
1578
+ buildManifest[relativeUrlWithoutHash] = buildRelativeUrl
1579
+ })
1580
+ return buildManifest
1581
+ }
1582
+
1583
+ const asFileNameWithoutHash = (fileName) => {
1584
+ return fileName.replace(/_[a-z0-9]{8,}(\..*?)?$/, (_, afterHash = "") => {
1585
+ return afterHash
1586
+ })
1587
+ }
1588
+
1576
1589
  const prepareEntryPoints = async (
1577
1590
  entryPoints,
1578
1591
  {
@@ -1718,7 +1731,6 @@ const visitServiceWorkers = async ({
1718
1731
  classicServiceWorkerUrls,
1719
1732
  serviceWorkerFinalizer,
1720
1733
  buildMappings,
1721
- buildManifest,
1722
1734
  buildFileContents,
1723
1735
  lineBreakNormalization,
1724
1736
  }) => {
@@ -1745,7 +1757,6 @@ const visitServiceWorkers = async ({
1745
1757
  let code = buildFileContents[serviceWorkerBuildRelativeUrl]
1746
1758
  code = await serviceWorkerFinalizer(code, {
1747
1759
  serviceWorkerBuildRelativeUrl,
1748
- buildManifest,
1749
1760
  buildFileContents,
1750
1761
  lineBreakNormalization,
1751
1762
  })
@@ -10,20 +10,7 @@ export const createUrlVersioner = ({
10
10
  asOriginalUrl,
11
11
  lineBreakNormalization,
12
12
  }) => {
13
- const names = []
14
- const getFreeName = (name) => {
15
- let nameCandidate = name
16
- let integer = 1
17
- // eslint-disable-next-line no-constant-condition
18
- while (true) {
19
- if (!names.includes(nameCandidate)) {
20
- names.push(nameCandidate)
21
- return nameCandidate
22
- }
23
- integer++
24
- nameCandidate = `${name}${integer}`
25
- }
26
- }
13
+ const availableNameGenerator = createAvailableNameGenerator()
27
14
 
28
15
  const computeBuildRelativeUrl = (ressource, precomputation) => {
29
16
  const pattern = getFilenamePattern({
@@ -40,7 +27,11 @@ export const createUrlVersioner = ({
40
27
  pattern,
41
28
  getName: precomputation
42
29
  ? () => urlToBasename(ressource.url)
43
- : () => getFreeName(urlToBasename(ressource.url)),
30
+ : () =>
31
+ availableNameGenerator.getAvailableNameForPattern(
32
+ urlToBasename(ressource.url),
33
+ pattern,
34
+ ),
44
35
  contentType: ressource.contentType,
45
36
  lineBreakNormalization,
46
37
  },
@@ -69,6 +60,33 @@ export const createUrlVersioner = ({
69
60
  }
70
61
  }
71
62
 
63
+ const createAvailableNameGenerator = () => {
64
+ const cache = {}
65
+ const getAvailableNameForPattern = (name, pattern) => {
66
+ let names = cache[pattern]
67
+ if (!names) {
68
+ cache[pattern] = []
69
+ names = []
70
+ }
71
+
72
+ let nameCandidate = name
73
+ let integer = 1
74
+ // eslint-disable-next-line no-constant-condition
75
+ while (true) {
76
+ if (!names.includes(nameCandidate)) {
77
+ names.push(nameCandidate)
78
+ return nameCandidate
79
+ }
80
+ integer++
81
+ nameCandidate = `${name}${integer}`
82
+ }
83
+ }
84
+
85
+ return {
86
+ getAvailableNameForPattern,
87
+ }
88
+ }
89
+
72
90
  const getFilenamePattern = ({
73
91
  ressource,
74
92
  entryPointUrls,
@@ -115,7 +133,7 @@ const getFilenamePattern = ({
115
133
  }
116
134
 
117
135
  if (ressource.isJsModule) {
118
- return "[name]_[hash][extname]"
136
+ return "[name]_[hash].js"
119
137
  }
120
138
 
121
139
  return ressource.urlVersioningDisabled
@@ -1,7 +1,7 @@
1
1
  /* eslint-env browser */
2
2
 
3
3
  export const isLivereloadEnabled = () => {
4
- const value = window.localStorage.hasOwnProperty("livereload")
4
+ const value = window.localStorage.getItem("livereload")
5
5
  if (value === "0") {
6
6
  return false
7
7
  }
@@ -4,20 +4,14 @@ import { generateContentHash } from "./internal/building/url_versioning.js"
4
4
 
5
5
  export const jsenvServiceWorkerFinalizer = (
6
6
  code,
7
- {
8
- serviceWorkerBuildRelativeUrl,
9
- buildManifest,
10
- buildFileContents,
11
- lineBreakNormalization,
12
- },
7
+ { serviceWorkerBuildRelativeUrl, buildFileContents, lineBreakNormalization },
13
8
  ) => {
14
9
  const generatedUrlsConfig = {}
15
- Object.keys(buildManifest).forEach((projectRelativeUrl) => {
16
- if (projectRelativeUrl.endsWith(".map")) {
10
+ Object.keys(buildFileContents).forEach((buildRelativeUrl) => {
11
+ if (buildRelativeUrl.endsWith(".map")) {
17
12
  return
18
13
  }
19
14
 
20
- const buildRelativeUrl = buildManifest[projectRelativeUrl]
21
15
  const buildUrl = resolveUrl(buildRelativeUrl, "file://")
22
16
  const serviceWorkerBuildUrl = resolveUrl(
23
17
  serviceWorkerBuildRelativeUrl,