@jsenv/core 24.0.2 → 24.2.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.
Files changed (69) hide show
  1. package/dist/jsenv_event_source_client.js +338 -0
  2. package/dist/jsenv_event_source_client.js.map +126 -0
  3. package/dist/jsenv_exploring_index.js.map +7 -7
  4. package/dist/jsenv_redirector.js +1388 -0
  5. package/dist/jsenv_redirector.js.map +384 -0
  6. package/dist/jsenv_toolbar.js +37 -504
  7. package/dist/jsenv_toolbar.js.map +37 -112
  8. package/dist/jsenv_toolbar_injector.js +31 -126
  9. package/dist/jsenv_toolbar_injector.js.map +11 -30
  10. package/{LICENSE → license} +0 -0
  11. package/package.json +2 -3
  12. package/src/buildProject.js +2 -0
  13. package/src/dev_server.js +108 -57
  14. package/src/internal/compiling/compile-directory/getOrGenerateCompiledFile.js +1 -2
  15. package/src/internal/compiling/compileFile.js +51 -23
  16. package/src/internal/compiling/createCompiledFileService.js +8 -0
  17. package/src/internal/compiling/html_source_file_service.js +43 -9
  18. package/src/internal/compiling/jsenvCompilerForHtml.js +146 -107
  19. package/src/internal/compiling/startCompileServer.js +10 -1
  20. package/src/internal/dev_server/event_source_client/event_source_client.js +63 -0
  21. package/src/internal/dev_server/event_source_client/event_source_client_file_info.js +17 -0
  22. package/src/internal/{toolbar/eventsource/connectEventSource.js → dev_server/event_source_client/event_source_connection.js} +47 -78
  23. package/src/internal/dev_server/event_source_client/file_changes.js +82 -0
  24. package/src/internal/dev_server/event_source_client/livereload_preference.js +13 -0
  25. package/src/internal/{exploring → dev_server/exploring}/exploring.css +0 -0
  26. package/src/internal/{exploring → dev_server/exploring}/exploring.html +1 -1
  27. package/src/internal/{exploring → dev_server/exploring}/exploring.js +0 -0
  28. package/src/internal/dev_server/exploring/exploring_file_info.js +21 -0
  29. package/src/internal/{exploring → dev_server/exploring}/fetchExploringJson.js +1 -1
  30. package/src/internal/{exploring/exploring.redirector.html → dev_server/redirector/redirector.html} +1 -1
  31. package/src/internal/{exploring/exploring.redirector.js → dev_server/redirector/redirector.js} +4 -2
  32. package/src/internal/dev_server/redirector/redirector_file_info.js +24 -0
  33. package/src/internal/{toolbar → dev_server/toolbar}/animation/toolbar.animation.js +0 -0
  34. package/src/internal/{toolbar → dev_server/toolbar}/backtolist/toolbar.backtolist.js +0 -0
  35. package/src/internal/{toolbar → dev_server/toolbar}/compilation/compilation.css +0 -0
  36. package/src/internal/{toolbar → dev_server/toolbar}/compilation/toolbar.compilation.js +1 -1
  37. package/src/internal/{toolbar → dev_server/toolbar}/eventsource/eventsource.css +0 -0
  38. package/src/internal/dev_server/toolbar/eventsource/toolbar.eventsource.js +83 -0
  39. package/src/internal/{toolbar → dev_server/toolbar}/execution/execution.css +0 -0
  40. package/src/internal/{toolbar → dev_server/toolbar}/execution/toolbar.execution.js +0 -0
  41. package/src/internal/{toolbar → dev_server/toolbar}/focus/focus.css +0 -0
  42. package/src/internal/{toolbar → dev_server/toolbar}/focus/toolbar.focus.js +0 -0
  43. package/src/internal/{toolbar → dev_server/toolbar}/jsenv-logo.svg +0 -0
  44. package/src/internal/{toolbar → dev_server/toolbar}/notification/toolbar.notification.js +0 -0
  45. package/src/internal/{toolbar → dev_server/toolbar}/responsive/overflow-menu.css +0 -0
  46. package/src/internal/{toolbar → dev_server/toolbar}/responsive/toolbar.responsive.js +0 -0
  47. package/src/internal/{toolbar → dev_server/toolbar}/settings/settings.css +0 -0
  48. package/src/internal/{toolbar → dev_server/toolbar}/settings/toolbar.settings.js +0 -0
  49. package/src/internal/{toolbar → dev_server/toolbar}/theme/jsenv-theme.css +0 -0
  50. package/src/internal/{toolbar → dev_server/toolbar}/theme/light-theme.css +0 -0
  51. package/src/internal/{toolbar → dev_server/toolbar}/theme/toolbar.theme.js +0 -0
  52. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.html +4 -37
  53. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.injector.js +3 -92
  54. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.css +0 -0
  55. package/src/internal/{toolbar → dev_server/toolbar}/toolbar.main.js +0 -0
  56. package/src/internal/dev_server/toolbar/toolbar_file_info.js +37 -0
  57. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.css +0 -0
  58. package/src/internal/{toolbar → dev_server/toolbar}/tooltip/tooltip.js +0 -0
  59. package/src/internal/{toolbar → dev_server/toolbar}/util/animation.js +0 -0
  60. package/src/internal/{toolbar → dev_server/toolbar}/util/dom.js +0 -0
  61. package/src/internal/{toolbar → dev_server/toolbar}/util/fetching.js +2 -2
  62. package/src/internal/{toolbar → dev_server/toolbar}/util/jsenvLogger.js +0 -0
  63. package/src/internal/{toolbar → dev_server/toolbar}/util/preferences.js +0 -0
  64. package/src/internal/{toolbar → dev_server/toolbar}/util/responsive.js +0 -0
  65. package/src/internal/{toolbar → dev_server/toolbar}/util/util.js +0 -0
  66. package/src/internal/{toolbar → dev_server/toolbar}/variant/variant.js +0 -0
  67. package/src/internal/jsenvInternalFiles.js +0 -58
  68. package/src/internal/toolbar/eventsource/connectCompileServerEventSource.js +0 -74
  69. package/src/internal/toolbar/eventsource/toolbar.eventsource.js +0 -239
@@ -0,0 +1,338 @@
1
+ (function () {
2
+ 'use strict';
3
+
4
+ /* eslint-env browser */
5
+ var createEventSourceConnection = function createEventSourceConnection(eventSourceUrl) {
6
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7
+
8
+ var _ref = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {},
9
+ _ref$retryMaxAttempt = _ref.retryMaxAttempt,
10
+ retryMaxAttempt = _ref$retryMaxAttempt === void 0 ? Infinity : _ref$retryMaxAttempt,
11
+ _ref$retryAllocatedMs = _ref.retryAllocatedMs,
12
+ retryAllocatedMs = _ref$retryAllocatedMs === void 0 ? Infinity : _ref$retryAllocatedMs,
13
+ lastEventId = _ref.lastEventId;
14
+
15
+ var _window = window,
16
+ EventSource = _window.EventSource;
17
+
18
+ if (typeof EventSource !== "function") {
19
+ return function () {};
20
+ }
21
+
22
+ var eventSourceOrigin = new URL(eventSourceUrl).origin;
23
+ var connectionStatus = "default";
24
+
25
+ var connectionStatusChangeCallback = function connectionStatusChangeCallback() {};
26
+
27
+ var disconnect = function disconnect() {};
28
+
29
+ var goToStatus = function goToStatus(newStatus) {
30
+ connectionStatus = newStatus;
31
+ connectionStatusChangeCallback();
32
+ };
33
+
34
+ var attemptConnection = function attemptConnection(url) {
35
+ var eventSource = new EventSource(url, {
36
+ withCredentials: true
37
+ });
38
+
39
+ disconnect = function disconnect() {
40
+ if (connectionStatus !== "connecting" && connectionStatus !== "connected") {
41
+ console.warn("disconnect() ignored because connection is ".concat(connectionStatus));
42
+ return;
43
+ }
44
+
45
+ eventSource.onerror = undefined;
46
+ eventSource.close();
47
+ goToStatus("disconnected");
48
+ };
49
+
50
+ var retryCount = 0;
51
+ var firstRetryMs = Date.now();
52
+
53
+ eventSource.onerror = function (errorEvent) {
54
+ if (errorEvent.target.readyState === EventSource.CONNECTING) {
55
+ if (retryCount > retryMaxAttempt) {
56
+ console.info("could not connect after ".concat(retryMaxAttempt, " attempt"));
57
+ disconnect();
58
+ return;
59
+ }
60
+
61
+ if (retryCount === 0) {
62
+ firstRetryMs = Date.now();
63
+ } else {
64
+ var allRetryDuration = Date.now() - firstRetryMs;
65
+
66
+ if (retryAllocatedMs && allRetryDuration > retryAllocatedMs) {
67
+ console.info("could not connect in less than ".concat(retryAllocatedMs, " ms"));
68
+ disconnect();
69
+ return;
70
+ }
71
+ }
72
+
73
+ retryCount++;
74
+ goToStatus("connecting");
75
+ return;
76
+ }
77
+
78
+ if (errorEvent.target.readyState === EventSource.CLOSED) {
79
+ disconnect();
80
+ return;
81
+ }
82
+ };
83
+
84
+ eventSource.onopen = function () {
85
+ goToStatus("connected");
86
+ };
87
+
88
+ Object.keys(events).forEach(function (eventName) {
89
+ eventSource.addEventListener(eventName, function (e) {
90
+ if (e.origin === eventSourceOrigin) {
91
+ if (e.lastEventId) {
92
+ lastEventId = e.lastEventId;
93
+ }
94
+
95
+ events[eventName](e);
96
+ }
97
+ });
98
+ });
99
+
100
+ if (!events.hasOwnProperty("welcome")) {
101
+ eventSource.addEventListener("welcome", function (e) {
102
+ if (e.origin === eventSourceOrigin && e.lastEventId) {
103
+ lastEventId = e.lastEventId;
104
+ }
105
+ });
106
+ }
107
+
108
+ goToStatus("connecting");
109
+ };
110
+
111
+ var _connect = function connect() {
112
+ attemptConnection(eventSourceUrl);
113
+
114
+ _connect = function connect() {
115
+ attemptConnection(lastEventId ? addLastEventIdIntoUrlSearchParams(eventSourceUrl, lastEventId) : eventSourceUrl);
116
+ };
117
+ };
118
+
119
+ var removePageUnloadListener = listenPageUnload(function () {
120
+ disconnect();
121
+ });
122
+
123
+ var destroy = function destroy() {
124
+ removePageUnloadListener();
125
+ disconnect();
126
+ };
127
+
128
+ return {
129
+ getConnectionStatus: function getConnectionStatus() {
130
+ return connectionStatus;
131
+ },
132
+ setConnectionStatusCallback: function setConnectionStatusCallback(callback) {
133
+ connectionStatusChangeCallback = callback;
134
+ },
135
+ connect: _connect,
136
+ disconnect: disconnect,
137
+ destroy: destroy
138
+ };
139
+ };
140
+
141
+ var addLastEventIdIntoUrlSearchParams = function addLastEventIdIntoUrlSearchParams(url, lastEventId) {
142
+ if (url.indexOf("?") === -1) {
143
+ url += "?";
144
+ } else {
145
+ url += "&";
146
+ }
147
+
148
+ return "".concat(url, "last-event-id=").concat(encodeURIComponent(lastEventId));
149
+ }; // const listenPageMightFreeze = (callback) => {
150
+ // const removePageHideListener = listenEvent(window, "pagehide", (pageHideEvent) => {
151
+ // if (pageHideEvent.persisted === true) {
152
+ // callback(pageHideEvent)
153
+ // }
154
+ // })
155
+ // return removePageHideListener
156
+ // }
157
+ // const listenPageFreeze = (callback) => {
158
+ // const removeFreezeListener = listenEvent(document, "freeze", (freezeEvent) => {
159
+ // callback(freezeEvent)
160
+ // })
161
+ // return removeFreezeListener
162
+ // }
163
+ // const listenPageIsRestored = (callback) => {
164
+ // const removeResumeListener = listenEvent(document, "resume", (resumeEvent) => {
165
+ // removePageshowListener()
166
+ // callback(resumeEvent)
167
+ // })
168
+ // const removePageshowListener = listenEvent(window, "pageshow", (pageshowEvent) => {
169
+ // if (pageshowEvent.persisted === true) {
170
+ // removePageshowListener()
171
+ // removeResumeListener()
172
+ // callback(pageshowEvent)
173
+ // }
174
+ // })
175
+ // return () => {
176
+ // removeResumeListener()
177
+ // removePageshowListener()
178
+ // }
179
+ // }
180
+
181
+
182
+ var listenPageUnload = function listenPageUnload(callback) {
183
+ var removePageHideListener = listenEvent(window, "pagehide", function (pageHideEvent) {
184
+ if (pageHideEvent.persisted !== true) {
185
+ callback(pageHideEvent);
186
+ }
187
+ });
188
+ return removePageHideListener;
189
+ };
190
+
191
+ var listenEvent = function listenEvent(emitter, event, callback) {
192
+ emitter.addEventListener(event, callback);
193
+ return function () {
194
+ emitter.removeEventListener(event, callback);
195
+ };
196
+ };
197
+
198
+ /* eslint-env browser */
199
+ var isLivereloadEnabled = function isLivereloadEnabled() {
200
+ var value = window.localStorage.hasOwnProperty("livereload");
201
+
202
+ if (value === "0") {
203
+ return false;
204
+ }
205
+
206
+ return true;
207
+ };
208
+ var setLivereloadPreference = function setLivereloadPreference(value) {
209
+ window.localStorage.setItem("livereload", value ? "1" : "0");
210
+ };
211
+
212
+ /* eslint-env browser */
213
+ var fileChanges = {};
214
+
215
+ var filechangeCallback = function filechangeCallback() {};
216
+
217
+ var getFileChanges = function getFileChanges() {
218
+ return fileChanges;
219
+ };
220
+ var addFileChange = function addFileChange(_ref) {
221
+ var file = _ref.file,
222
+ eventType = _ref.eventType;
223
+ fileChanges[file] = eventType;
224
+
225
+ if (isLivereloadEnabled()) {
226
+ reloadIfNeeded();
227
+ } else {
228
+ filechangeCallback();
229
+ }
230
+ };
231
+ var setFileChangeCallback = function setFileChangeCallback(callback) {
232
+ filechangeCallback = callback;
233
+ };
234
+ var reloadIfNeeded = function reloadIfNeeded() {
235
+ var customReloads = [];
236
+ var cssReloads = [];
237
+ var fullReloads = [];
238
+ Object.keys(fileChanges).forEach(function (key) {
239
+ var livereloadCallback = window.__jsenv__.livereloadingCallbacks[key];
240
+
241
+ if (livereloadCallback) {
242
+ customReloads.push(function () {
243
+ delete fileChanges[key];
244
+ livereloadCallback({
245
+ reloadPage: reloadPage
246
+ });
247
+ });
248
+ } else if (key.endsWith(".css") || key.endsWith(".scss") || key.endsWith(".sass")) {
249
+ cssReloads.push(function () {
250
+ delete fileChanges[key];
251
+ });
252
+ } else {
253
+ fullReloads.push(key);
254
+ }
255
+ });
256
+
257
+ if (fullReloads.length > 0) {
258
+ reloadPage();
259
+ return;
260
+ }
261
+
262
+ customReloads.forEach(function (customReload) {
263
+ customReload();
264
+ });
265
+
266
+ if (cssReloads.length) {
267
+ reloadAllCss();
268
+ cssReloads.forEach(function (cssReload) {
269
+ cssReload();
270
+ });
271
+ }
272
+
273
+ filechangeCallback();
274
+ };
275
+
276
+ var reloadAllCss = function reloadAllCss() {
277
+ var links = Array.from(window.parent.document.getElementsByTagName("link"));
278
+ links.forEach(function (link) {
279
+ if (link.rel === "stylesheet") {
280
+ var url = new URL(link.href);
281
+ url.searchParams.set("t", Date.now());
282
+ link.href = String(url);
283
+ }
284
+ });
285
+ };
286
+
287
+ var reloadPage = function reloadPage() {
288
+ window.parent.location.reload(true);
289
+ };
290
+
291
+ /* eslint-env browser */
292
+ var eventsourceConnection = createEventSourceConnection(document.location.href, {
293
+ "file-added": function fileAdded(_ref) {
294
+ var data = _ref.data;
295
+ addFileChange({
296
+ file: data,
297
+ eventType: "added"
298
+ });
299
+ },
300
+ "file-modified": function fileModified(_ref2) {
301
+ var data = _ref2.data;
302
+ addFileChange({
303
+ file: data,
304
+ eventType: "modified"
305
+ });
306
+ },
307
+ "file-removed": function fileRemoved(_ref3) {
308
+ var data = _ref3.data;
309
+ addFileChange({
310
+ file: data,
311
+ eventType: "removed"
312
+ });
313
+ }
314
+ }, {
315
+ retryMaxAttempt: Infinity,
316
+ retryAllocatedMs: 20 * 1000
317
+ });
318
+ var connect = eventsourceConnection.connect,
319
+ disconnect = eventsourceConnection.disconnect,
320
+ setConnectionStatusChangeCallback = eventsourceConnection.setConnectionStatusChangeCallback,
321
+ getConnectionStatus = eventsourceConnection.getConnectionStatus;
322
+ connect();
323
+ window.__jsenv_event_source_client__ = {
324
+ connect: connect,
325
+ disconnect: disconnect,
326
+ getConnectionStatus: getConnectionStatus,
327
+ setConnectionStatusChangeCallback: setConnectionStatusChangeCallback,
328
+ getFileChanges: getFileChanges,
329
+ addFileChange: addFileChange,
330
+ setFileChangeCallback: setFileChangeCallback,
331
+ reloadIfNeeded: reloadIfNeeded,
332
+ isLivereloadEnabled: isLivereloadEnabled,
333
+ setLivereloadPreference: setLivereloadPreference
334
+ };
335
+
336
+ })();
337
+
338
+ //# sourceMappingURL=jsenv_event_source_client.js.map
@@ -0,0 +1,126 @@
1
+ {
2
+ "version": 3,
3
+ "file": "jsenv_event_source_client.js",
4
+ "sources": [
5
+ "../src/internal/dev_server/event_source_client/event_source_connection.js",
6
+ "../src/internal/dev_server/event_source_client/livereload_preference.js",
7
+ "../src/internal/dev_server/event_source_client/file_changes.js",
8
+ "../src/internal/dev_server/event_source_client/event_source_client.js"
9
+ ],
10
+ "sourcesContent": [
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\n let connectionStatus = \"default\"\n let connectionStatusChangeCallback = () => {}\n let disconnect = () => {}\n\n const goToStatus = (newStatus) => {\n connectionStatus = newStatus\n connectionStatusChangeCallback()\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 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, (e) => {\n if (e.origin === eventSourceOrigin) {\n if (e.lastEventId) {\n lastEventId = e.lastEventId\n }\n events[eventName](e)\n }\n })\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 setConnectionStatusCallback: (callback) => {\n connectionStatusChangeCallback = callback\n },\n connect,\n 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",
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
+ "/* 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
+ ],
16
+ "names": [
17
+ "createEventSourceConnection",
18
+ "eventSourceUrl",
19
+ "events",
20
+ "retryMaxAttempt",
21
+ "Infinity",
22
+ "retryAllocatedMs",
23
+ "lastEventId",
24
+ "window",
25
+ "EventSource",
26
+ "eventSourceOrigin",
27
+ "URL",
28
+ "origin",
29
+ "connectionStatus",
30
+ "connectionStatusChangeCallback",
31
+ "disconnect",
32
+ "goToStatus",
33
+ "newStatus",
34
+ "attemptConnection",
35
+ "url",
36
+ "eventSource",
37
+ "withCredentials",
38
+ "console",
39
+ "warn",
40
+ "onerror",
41
+ "undefined",
42
+ "close",
43
+ "retryCount",
44
+ "firstRetryMs",
45
+ "Date",
46
+ "now",
47
+ "errorEvent",
48
+ "target",
49
+ "readyState",
50
+ "CONNECTING",
51
+ "info",
52
+ "allRetryDuration",
53
+ "CLOSED",
54
+ "onopen",
55
+ "Object",
56
+ "keys",
57
+ "forEach",
58
+ "eventName",
59
+ "addEventListener",
60
+ "e",
61
+ "hasOwnProperty",
62
+ "connect",
63
+ "addLastEventIdIntoUrlSearchParams",
64
+ "removePageUnloadListener",
65
+ "listenPageUnload",
66
+ "destroy",
67
+ "getConnectionStatus",
68
+ "setConnectionStatusCallback",
69
+ "callback",
70
+ "indexOf",
71
+ "encodeURIComponent",
72
+ "removePageHideListener",
73
+ "listenEvent",
74
+ "pageHideEvent",
75
+ "persisted",
76
+ "emitter",
77
+ "event",
78
+ "removeEventListener",
79
+ "isLivereloadEnabled",
80
+ "value",
81
+ "localStorage",
82
+ "setLivereloadPreference",
83
+ "setItem",
84
+ "fileChanges",
85
+ "filechangeCallback",
86
+ "getFileChanges",
87
+ "addFileChange",
88
+ "file",
89
+ "eventType",
90
+ "reloadIfNeeded",
91
+ "setFileChangeCallback",
92
+ "customReloads",
93
+ "cssReloads",
94
+ "fullReloads",
95
+ "key",
96
+ "livereloadCallback",
97
+ "__jsenv__",
98
+ "livereloadingCallbacks",
99
+ "push",
100
+ "reloadPage",
101
+ "endsWith",
102
+ "length",
103
+ "customReload",
104
+ "reloadAllCss",
105
+ "cssReload",
106
+ "links",
107
+ "Array",
108
+ "from",
109
+ "parent",
110
+ "document",
111
+ "getElementsByTagName",
112
+ "link",
113
+ "rel",
114
+ "href",
115
+ "searchParams",
116
+ "set",
117
+ "String",
118
+ "location",
119
+ "reload",
120
+ "eventsourceConnection",
121
+ "data",
122
+ "setConnectionStatusChangeCallback",
123
+ "__jsenv_event_source_client__"
124
+ ],
125
+ "mappings": "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"
126
+ }
@@ -3,11 +3,11 @@
3
3
  "file": "jsenv_exploring_index.js",
4
4
  "sources": [
5
5
  "../src/internal/memoize.js",
6
- "../src/internal/toolbar/util/fetching.js",
7
- "../src/internal/toolbar/util/preferences.js",
6
+ "../src/internal/dev_server/toolbar/util/fetching.js",
7
+ "../src/internal/dev_server/toolbar/util/preferences.js",
8
8
  "../helpers/babel/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js",
9
9
  "../helpers/babel/objectWithoutProperties/objectWithoutProperties.js",
10
- "../src/internal/toolbar/util/animation.js",
10
+ "../src/internal/dev_server/toolbar/util/animation.js",
11
11
  "../helpers/babel/defineProperty/defineProperty.js",
12
12
  "../node_modules/@jsenv/logger/src/createDetailedMessage.js",
13
13
  "../helpers/babel/objectSpread2/objectSpread2.js",
@@ -15,12 +15,12 @@
15
15
  "../src/internal/browser-utils/fetchUsingXHR.js",
16
16
  "../src/internal/browser-utils/fetch-browser.js",
17
17
  "../src/internal/browser-utils/fetchJson.js",
18
- "../src/internal/exploring/fetchExploringJson.js",
19
- "../src/internal/exploring/exploring.js"
18
+ "../src/internal/dev_server/exploring/fetchExploringJson.js",
19
+ "../src/internal/dev_server/exploring/exploring.js"
20
20
  ],
21
21
  "sourcesContent": [
22
22
  "export const memoize = (compute) => {\n let memoized = false\n let memoizedValue\n\n const fnWithMemoization = (...args) => {\n if (memoized) {\n return memoizedValue\n }\n // if compute is recursive wait for it to be fully done before storing the lockValue\n // so set locked later\n memoizedValue = compute(...args)\n memoized = true\n return memoizedValue\n }\n\n fnWithMemoization.forget = () => {\n const value = memoizedValue\n memoized = false\n memoizedValue = undefined\n return value\n }\n\n return fnWithMemoization\n}\n",
23
- "import { memoize } from \"../../memoize.js\"\n\nconst fetchPolyfill = async (...args) => {\n const { fetchUsingXHR } = await loadPolyfill()\n return fetchUsingXHR(...args)\n}\n\nconst loadPolyfill = memoize(() =>\n import(\"../../browser-utils/fetchUsingXHR.js\"),\n)\n\nexport const fetchUrl =\n typeof window.fetch === \"function\" &&\n typeof window.AbortController === \"function\"\n ? window.fetch\n : fetchPolyfill\n",
23
+ "import { memoize } from \"../../../memoize.js\"\n\nconst fetchPolyfill = async (...args) => {\n const { fetchUsingXHR } = await loadPolyfill()\n return fetchUsingXHR(...args)\n}\n\nconst loadPolyfill = memoize(() =>\n import(\"../../../browser-utils/fetchUsingXHR.js\"),\n)\n\nexport const fetchUrl =\n typeof window.fetch === \"function\" &&\n typeof window.AbortController === \"function\"\n ? window.fetch\n : fetchPolyfill\n",
24
24
  "export const createPreference = (name) => {\n return {\n has: () => localStorage.hasOwnProperty(name),\n get: () =>\n localStorage.hasOwnProperty(name)\n ? JSON.parse(localStorage.getItem(name))\n : undefined,\n set: (value) => localStorage.setItem(name, JSON.stringify(value)),\n }\n}\n",
25
25
  "export default (source, excluded) => {\n if (source === null) return {}\n var target = {}\n var sourceKeys = Object.keys(source)\n var key\n var i\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i]\n if (excluded.indexOf(key) >= 0) continue\n target[key] = source[key]\n }\n return target\n}\n",
26
26
  "import objectWithoutPropertiesLoose from \"../objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js\"\n\nexport default (source, excluded) => {\n if (source === null) return {}\n\n var target = objectWithoutPropertiesLoose(source, excluded)\n var key\n var i\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source)\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i]\n if (excluded.indexOf(key) >= 0) continue\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue\n target[key] = source[key]\n }\n }\n return target\n}\n",
@@ -32,7 +32,7 @@
32
32
  "import { createDetailedMessage } from \"@jsenv/logger\"\n\nexport const fetchUsingXHR = async (\n url,\n {\n signal,\n method = \"GET\",\n credentials = \"same-origin\",\n headers = {},\n body = null,\n } = {},\n) => {\n const headersPromise = createPromiseAndHooks()\n const bodyPromise = createPromiseAndHooks()\n\n const xhr = new XMLHttpRequest()\n\n const failure = (error) => {\n // if it was already resolved, we must reject the body promise\n if (headersPromise.settled) {\n bodyPromise.reject(error)\n } else {\n headersPromise.reject(error)\n }\n }\n\n const cleanup = () => {\n xhr.ontimeout = null\n xhr.onerror = null\n xhr.onload = null\n xhr.onreadystatechange = null\n }\n\n xhr.ontimeout = () => {\n cleanup()\n failure(new Error(`xhr request timeout on ${url}.`))\n }\n\n xhr.onerror = (error) => {\n cleanup()\n // unfortunately with have no clue why it fails\n // might be cors for instance\n failure(createRequestError(error, { url }))\n }\n\n xhr.onload = () => {\n cleanup()\n bodyPromise.resolve()\n }\n\n signal.addEventListener(\"abort\", () => {\n xhr.abort()\n const abortError = new Error(\"aborted\")\n abortError.name = \"AbortError\"\n failure(abortError)\n })\n\n xhr.onreadystatechange = () => {\n // https://developer.mozilla.org/fr/docs/Web/API/XMLHttpRequest/readyState\n const { readyState } = xhr\n\n if (readyState === 2) {\n headersPromise.resolve()\n } else if (readyState === 4) {\n cleanup()\n bodyPromise.resolve()\n }\n }\n\n xhr.open(method, url, true)\n Object.keys(headers).forEach((key) => {\n xhr.setRequestHeader(key, headers[key])\n })\n xhr.withCredentials = computeWithCredentials({ credentials, url })\n if (\"responseType\" in xhr && hasBlob) {\n xhr.responseType = \"blob\"\n }\n xhr.send(body)\n\n await headersPromise\n\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/responseURL\n const responseUrl =\n \"responseURL\" in xhr ? xhr.responseURL : headers[\"x-request-url\"]\n let responseStatus = xhr.status\n const responseStatusText = xhr.statusText\n const responseHeaders = getHeadersFromXHR(xhr)\n\n const readBody = async () => {\n await bodyPromise\n\n const { status } = xhr\n // in Chrome on file:/// URLs, status is 0\n if (status === 0) {\n responseStatus = 200\n }\n\n const body = \"response\" in xhr ? xhr.response : xhr.responseText\n\n return {\n responseBody: body,\n responseBodyType: detectBodyType(body),\n }\n }\n\n const text = async () => {\n const { responseBody, responseBodyType } = await readBody()\n\n if (responseBodyType === \"blob\") {\n return blobToText(responseBody)\n }\n if (responseBodyType === \"formData\") {\n throw new Error(\"could not read FormData body as text\")\n }\n if (responseBodyType === \"dataView\") {\n return arrayBufferToText(responseBody.buffer)\n }\n if (responseBodyType === \"arrayBuffer\") {\n return arrayBufferToText(responseBody)\n }\n // if (responseBodyType === \"text\" || responseBodyType === 'searchParams') {\n // return body\n // }\n return String(responseBody)\n }\n\n const json = async () => {\n const responseText = await text()\n return JSON.parse(responseText)\n }\n\n const blob = async () => {\n if (!hasBlob) {\n throw new Error(`blob not supported`)\n }\n\n const { responseBody, responseBodyType } = await readBody()\n\n if (responseBodyType === \"blob\") {\n return responseBody\n }\n if (responseBodyType === \"dataView\") {\n return new Blob([cloneBuffer(responseBody.buffer)])\n }\n if (responseBodyType === \"arrayBuffer\") {\n return new Blob([cloneBuffer(responseBody)])\n }\n if (responseBodyType === \"formData\") {\n throw new Error(\"could not read FormData body as blob\")\n }\n return new Blob([String(responseBody)])\n }\n\n const arrayBuffer = async () => {\n const { responseBody, responseBodyType } = await readBody()\n\n if (responseBodyType === \"arrayBuffer\") {\n return cloneBuffer(responseBody)\n }\n const responseBlob = await blob()\n return blobToArrayBuffer(responseBlob)\n }\n\n const formData = async () => {\n if (!hasFormData) {\n throw new Error(`formData not supported`)\n }\n const responseText = await text()\n return textToFormData(responseText)\n }\n\n return {\n url: responseUrl,\n status: responseStatus,\n statusText: responseStatusText,\n headers: responseHeaders,\n text,\n json,\n blob,\n arrayBuffer,\n formData,\n }\n}\n\nconst canUseBlob = () => {\n if (typeof window.FileReader !== \"function\") return false\n\n if (typeof window.Blob !== \"function\") return false\n\n try {\n // eslint-disable-next-line no-new\n new Blob()\n return true\n } catch (e) {\n return false\n }\n}\n\nconst hasBlob = canUseBlob()\n\nconst hasFormData = typeof window.FormData === \"function\"\n\nconst hasArrayBuffer = typeof window.ArrayBuffer === \"function\"\n\nconst hasSearchParams = typeof window.URLSearchParams === \"function\"\n\nconst createRequestError = (error, { url }) => {\n return new Error(\n createDetailedMessage(`error during xhr request on ${url}.`, {\n [\"error stack\"]: error.stack,\n }),\n )\n}\n\nconst createPromiseAndHooks = () => {\n let resolve\n let reject\n const promise = new Promise((res, rej) => {\n resolve = (value) => {\n promise.settled = true\n res(value)\n }\n reject = (value) => {\n promise.settled = true\n rej(value)\n }\n })\n promise.resolve = resolve\n promise.reject = reject\n return promise\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch\nconst computeWithCredentials = ({ credentials, url }) => {\n if (credentials === \"same-origin\") {\n return originSameAsGlobalOrigin(url)\n }\n return credentials === \"include\"\n}\n\nconst originSameAsGlobalOrigin = (url) => {\n // if we cannot read globalOrigin from window.location.origin, let's consider it's ok\n if (typeof window !== \"object\") return true\n if (typeof window.location !== \"object\") return true\n const globalOrigin = window.location.origin\n if (globalOrigin === \"null\") return true\n return hrefToOrigin(url) === globalOrigin\n}\n\nconst detectBodyType = (body) => {\n if (!body) {\n return \"\"\n }\n if (typeof body === \"string\") {\n return \"text\"\n }\n if (hasBlob && Blob.prototype.isPrototypeOf(body)) {\n return \"blob\"\n }\n if (hasFormData && FormData.prototype.isPrototypeOf(body)) {\n return \"formData\"\n }\n if (hasArrayBuffer) {\n if (hasBlob && isDataView(body)) {\n return `dataView`\n }\n if (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body)) {\n return `arrayBuffer`\n }\n }\n if (hasSearchParams && URLSearchParams.prototype.isPrototypeOf(body)) {\n return \"searchParams\"\n }\n return \"\"\n}\n\n// https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getAllResponseHeaders#Example\nconst getHeadersFromXHR = (xhr) => {\n const headerMap = {}\n\n const headersString = xhr.getAllResponseHeaders()\n if (headersString === \"\") return headerMap\n\n const lines = headersString.trim().split(/[\\r\\n]+/)\n lines.forEach((line) => {\n const parts = line.split(\": \")\n const name = parts.shift()\n const value = parts.join(\": \")\n headerMap[name.toLowerCase()] = value\n })\n\n return headerMap\n}\n\nconst hrefToOrigin = (href) => {\n const scheme = hrefToScheme(href)\n\n if (scheme === \"file\") {\n return \"file://\"\n }\n\n if (scheme === \"http\" || scheme === \"https\") {\n const secondProtocolSlashIndex = scheme.length + \"://\".length\n const pathnameSlashIndex = href.indexOf(\"/\", secondProtocolSlashIndex)\n\n if (pathnameSlashIndex === -1) return href\n return href.slice(0, pathnameSlashIndex)\n }\n\n return href.slice(0, scheme.length + 1)\n}\n\nconst hrefToScheme = (href) => {\n const colonIndex = href.indexOf(\":\")\n if (colonIndex === -1) return \"\"\n return href.slice(0, colonIndex)\n}\n\nconst isDataView = (obj) => {\n return obj && DataView.prototype.isPrototypeOf(obj)\n}\n\nconst isArrayBufferView =\n ArrayBuffer.isView ||\n (() => {\n const viewClasses = [\n \"[object Int8Array]\",\n \"[object Uint8Array]\",\n \"[object Uint8ClampedArray]\",\n \"[object Int16Array]\",\n \"[object Uint16Array]\",\n \"[object Int32Array]\",\n \"[object Uint32Array]\",\n \"[object Float32Array]\",\n \"[object Float64Array]\",\n ]\n\n return (value) => {\n return (\n value && viewClasses.includes(Object.prototype.toString.call(value))\n )\n }\n })()\n\nconst textToFormData = (text) => {\n const form = new FormData()\n text\n .trim()\n .split(\"&\")\n .forEach(function (bytes) {\n if (bytes) {\n const split = bytes.split(\"=\")\n const name = split.shift().replace(/\\+/g, \" \")\n const value = split.join(\"=\").replace(/\\+/g, \" \")\n form.append(decodeURIComponent(name), decodeURIComponent(value))\n }\n })\n return form\n}\n\nconst blobToArrayBuffer = async (blob) => {\n const reader = new FileReader()\n const promise = fileReaderReady(reader)\n reader.readAsArrayBuffer(blob)\n return promise\n}\n\nconst blobToText = (blob) => {\n const reader = new FileReader()\n const promise = fileReaderReady(reader)\n reader.readAsText(blob)\n return promise\n}\n\nconst arrayBufferToText = (arrayBuffer) => {\n const view = new Uint8Array(arrayBuffer)\n const chars = new Array(view.length)\n let i = 0\n while (i < view.length) {\n chars[i] = String.fromCharCode(view[i])\n\n i++\n }\n return chars.join(\"\")\n}\n\nconst fileReaderReady = (reader) => {\n return new Promise(function (resolve, reject) {\n reader.onload = function () {\n resolve(reader.result)\n }\n reader.onerror = function () {\n reject(reader.error)\n }\n })\n}\n\nconst cloneBuffer = (buffer) => {\n if (buffer.slice) {\n return buffer.slice(0)\n }\n const view = new Uint8Array(buffer.byteLength)\n view.set(new Uint8Array(buffer))\n return view.buffer\n}\n",
33
33
  "import { fetchUsingXHR } from \"./fetchUsingXHR.js\"\n\nconst fetchNative = async (url, { mode = \"cors\", ...options } = {}) => {\n const response = await window.fetch(url, {\n mode,\n ...options,\n })\n\n return {\n url: response.url,\n status: response.status,\n statusText: \"\",\n headers: responseToHeaders(response),\n text: () => response.text(),\n json: () => response.json(),\n blob: () => response.blob(),\n arrayBuffer: () => response.arrayBuffer(),\n formData: () => response.formData(),\n }\n}\n\nconst responseToHeaders = (response) => {\n const headers = {}\n response.headers.forEach((value, name) => {\n headers[name] = value\n })\n return headers\n}\n\nexport const fetchUrl =\n typeof window.fetch === \"function\" &&\n typeof window.AbortController === \"function\"\n ? fetchNative\n : fetchUsingXHR\n",
34
34
  "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",
35
- "import { createDetailedMessage } from \"@jsenv/logger\"\n\nimport { 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 createDetailedMessage(\n `Cannot communicate with exploring server due to a network error`,\n {\n [\"error stack\"]: e.stack,\n },\n ),\n )\n }\n}\n",
35
+ "import { createDetailedMessage } from \"@jsenv/logger\"\n\nimport { 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 createDetailedMessage(\n `Cannot communicate with exploring server due to a network error`,\n {\n [\"error stack\"]: e.stack,\n },\n ),\n )\n }\n}\n",
36
36
  "import { fetchUrl } from \"../toolbar/util/fetching.js\"\nimport { createPreference } from \"../toolbar/util/preferences.js\"\nimport { startJavaScriptAnimation } from \"../toolbar/util/animation.js\"\nimport { fetchExploringJson } from \"./fetchExploringJson.js\"\n\nconst fetchJSON = async (url, options) => {\n const response = await fetchUrl(url, options)\n const json = await response.json()\n return json\n}\n\nconst groupPreference = createPreference(\"group\")\n\nconst run = async () => {\n const { projectDirectoryUrl, explorableConfig, outDirectoryRelativeUrl } =\n await fetchExploringJson()\n\n const files = await fetchJSON(`/.jsenv/explorables.json`, {\n method: \"GET\",\n })\n\n const compileServerOrigin = document.location.origin\n const outDirectoryUrl = String(\n new URL(outDirectoryRelativeUrl, compileServerOrigin),\n )\n const documentUrl = document.location.href\n let compileId\n\n const outDirectoryIndex = documentUrl.indexOf(outDirectoryUrl)\n if (outDirectoryIndex === 0) {\n const afterOutDirectory = documentUrl.slice(outDirectoryUrl.length)\n compileId = afterOutDirectory.split(\"/\")[0]\n } else {\n compileId = null\n }\n\n const renderHtml = () => {\n // const mainHtmlFileRelativeUrl = \"index.html\"\n // const mainFileLink = document.querySelector(\"#main_file_link\")\n // const mainFileUrl = urlToVisitFromRelativeUrl(mainHtmlFileRelativeUrl)\n // mainFileLink.href = mainFileUrl\n // mainFileLink.textContent = `${mainHtmlFileRelativeUrl}`\n // const mainFileIframe = document.querySelector(`#main_file_iframe`)\n // mainFileIframe.src = mainFileUrl\n\n const fileListElement = document\n .querySelector(`[data-page=\"file-list\"]`)\n .cloneNode(true)\n const directoryName = directoryUrlToDirectoryName(projectDirectoryUrl)\n const span = fileListElement.querySelector(\"#directory_relative_url\")\n span.title = projectDirectoryUrl\n span.textContent = directoryName\n\n const h4 = fileListElement.querySelector(\"h4\")\n\n const ul = fileListElement.querySelector(\"ul\")\n ul.innerHTML = files\n .map(\n (file) =>\n `<li>\n <a\n class=\"execution-link\"\n data-relative-url=${file.relativeUrl}\n href=${urlToVisitFromRelativeUrl(file.relativeUrl)}\n >\n ${file.relativeUrl}\n </a>\n </li>`,\n )\n .join(\"\")\n\n const groupFieldset = fileListElement.querySelector(\"#filter-group-set\")\n const groupNames = Object.keys(explorableConfig)\n groupFieldset.innerHTML = groupNames\n .map(\n (key) => `<label data-contains-hidden-input class=\"item\">\n <input type=\"radio\" name=\"filter-group\" value=\"${key}\"/>\n <span>${key}</span>\n</label>`,\n )\n .join(\"\")\n\n const currentGroup = groupPreference.has()\n ? groupPreference.get()\n : groupNames[0]\n Array.from(groupFieldset.querySelectorAll(\"input\")).forEach(\n (inputRadio) => {\n inputRadio.checked = inputRadio.value === currentGroup\n inputRadio.onchange = () => {\n if (inputRadio.checked) {\n groupPreference.set(inputRadio.value)\n enableGroup(inputRadio.value)\n }\n }\n },\n )\n\n const enableGroup = (groupName) => {\n const arrayOfElementToShow = []\n const arrayOfElementToHide = []\n files.forEach((file) => {\n const fileLink = fileListElement.querySelector(\n `a[data-relative-url=\"${file.relativeUrl}\"]`,\n )\n const fileLi = fileLink.parentNode\n if (file.meta[groupName]) {\n arrayOfElementToShow.push(fileLi)\n } else {\n arrayOfElementToHide.push(fileLi)\n }\n })\n arrayOfElementToShow.forEach((element) => {\n element.removeAttribute(\"data-force-hide\")\n })\n arrayOfElementToHide.forEach((element) => {\n element.setAttribute(\"data-force-hide\", \"\")\n })\n\n h4.innerHTML =\n arrayOfElementToShow.length === 0\n ? `No file found.\n Config for this section: <pre>${JSON.stringify(\n explorableConfig[groupName],\n null,\n \" \",\n )}</pre>`\n : `${arrayOfElementToShow.length} files found. Click on the one you want to execute`\n }\n enableGroup(currentGroup)\n\n document.querySelector(\"main\").appendChild(fileListElement)\n makeMenuScrollable()\n }\n\n const urlToVisitFromRelativeUrl = (relativeUrl) => {\n if (compileId) {\n return `${compileServerOrigin}/${outDirectoryRelativeUrl}${compileId}/${relativeUrl}`\n }\n return `${compileServerOrigin}/${relativeUrl}`\n }\n\n const makeMenuScrollable = () => {\n const getMenuWrapperSize = () => {\n return document.querySelector(\".menu-wrapper\").getBoundingClientRect()\n .width\n }\n let menuWrapperSize = getMenuWrapperSize()\n\n const getMenuSize = () => {\n return document.querySelector(\".menu\").getBoundingClientRect().width\n }\n let menuSize = getMenuSize()\n\n const menuVisibleSize = menuWrapperSize\n let menuInvisibleSize = menuSize - menuVisibleSize\n\n const getMenuPosition = () => {\n return document.querySelector(\".menu-wrapper\").scrollLeft\n }\n\n const scrollDuration = 300\n const leftPaddle = document.querySelector(\".left-paddle\")\n const rightPaddle = document.querySelector(\".right-paddle\")\n\n const handleMenuScroll = () => {\n menuInvisibleSize = menuSize - menuWrapperSize\n const menuPosition = getMenuPosition()\n const menuEndOffset = menuInvisibleSize\n\n // show & hide the paddles, depending on scroll position\n if (menuPosition <= 0 && menuEndOffset <= 0) {\n // hide both paddles if the window is large enough to display all tabs\n leftPaddle.classList.add(\"hidden\")\n rightPaddle.classList.add(\"hidden\")\n } else if (menuPosition <= 0) {\n leftPaddle.classList.add(\"hidden\")\n rightPaddle.classList.remove(\"hidden\")\n } else if (menuPosition < Math.floor(menuEndOffset)) {\n // show both paddles in the middle\n leftPaddle.classList.remove(\"hidden\")\n rightPaddle.classList.remove(\"hidden\")\n } else if (menuPosition >= Math.floor(menuEndOffset)) {\n leftPaddle.classList.remove(\"hidden\")\n rightPaddle.classList.add(\"hidden\")\n }\n }\n handleMenuScroll()\n\n window.onresize = () => {\n menuWrapperSize = getMenuWrapperSize()\n menuSize = getMenuSize()\n handleMenuScroll()\n }\n\n // finally, what happens when we are actually scrolling the menu\n document.querySelector(\".menu-wrapper\").onscroll = () => {\n handleMenuScroll()\n }\n\n // scroll to left\n rightPaddle.onclick = () => {\n const scrollStart = document.querySelector(\".menu-wrapper\").scrollLeft\n const scrollEnd = scrollStart + menuWrapperSize\n startJavaScriptAnimation({\n duration: scrollDuration,\n onProgress: ({ progress }) => {\n document.querySelector(\".menu-wrapper\").scrollLeft =\n scrollStart + (scrollEnd - scrollStart) * progress\n },\n })\n }\n\n // scroll to right\n leftPaddle.onclick = () => {\n const scrollStart = document.querySelector(\".menu-wrapper\").scrollLeft\n const scrollEnd = scrollStart - menuWrapperSize\n startJavaScriptAnimation({\n duration: scrollDuration,\n onProgress: ({ progress }) => {\n document.querySelector(\".menu-wrapper\").scrollLeft =\n scrollStart + (scrollEnd - scrollStart) * progress\n },\n })\n }\n }\n\n const directoryUrlToDirectoryName = (directoryUrl) => {\n const slashLastIndex = directoryUrl.lastIndexOf(\n \"/\",\n // ignore last slash\n directoryUrl.length - 2,\n )\n if (slashLastIndex === -1) return \"\"\n\n return directoryUrl.slice(slashLastIndex + 1)\n }\n\n renderHtml()\n}\n\nrun()\n"
37
37
  ],
38
38
  "names": [