@jsenv/core 27.0.0-alpha.64 → 27.0.0-alpha.67

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 (151) hide show
  1. package/dist/babel_helpers/AsyncGenerator/AsyncGenerator.js +95 -0
  2. package/dist/babel_helpers/AwaitValue/AwaitValue.js +3 -0
  3. package/dist/babel_helpers/applyDecoratorDescriptor/applyDecoratorDescriptor.js +29 -0
  4. package/dist/babel_helpers/arrayLikeToArray/arrayLikeToArray.js +9 -0
  5. package/dist/babel_helpers/arrayWithHoles/arrayWithHoles.js +4 -0
  6. package/dist/babel_helpers/arrayWithoutHoles/arrayWithoutHoles.js +5 -0
  7. package/dist/babel_helpers/assertThisInitialized/assertThisInitialized.js +8 -0
  8. package/dist/babel_helpers/asyncGeneratorDelegate/asyncGeneratorDelegate.js +52 -0
  9. package/dist/babel_helpers/asyncIterator/asyncIterator.js +78 -0
  10. package/dist/babel_helpers/asyncToGenerator/asyncToGenerator.js +39 -0
  11. package/dist/babel_helpers/awaitAsyncGenerator/awaitAsyncGenerator.js +4 -0
  12. package/dist/babel_helpers/classApplyDescriptorDestructureSet/classApplyDescriptorDestructureSet.js +24 -0
  13. package/dist/babel_helpers/classApplyDescriptorGet/classApplyDescriptorGet.js +7 -0
  14. package/dist/babel_helpers/classApplyDescriptorSet/classApplyDescriptorSet.js +14 -0
  15. package/dist/babel_helpers/classCallCheck/classCallCheck.js +5 -0
  16. package/dist/babel_helpers/classCheckPrivateStaticAccess/classCheckPrivateStaticAccess.js +5 -0
  17. package/dist/babel_helpers/classCheckPrivateStaticFieldDescriptor/classCheckPrivateStaticFieldDescriptor.js +6 -0
  18. package/dist/babel_helpers/classExtractFieldDescriptor/classExtractFieldDescriptor.js +8 -0
  19. package/dist/babel_helpers/classNameTDZError/classNameTDZError.js +4 -0
  20. package/dist/babel_helpers/classPrivateFieldDestructureSet/classPrivateFieldDestructureSet.js +6 -0
  21. package/dist/babel_helpers/classPrivateFieldGet/classPrivateFieldGet.js +6 -0
  22. package/dist/babel_helpers/classPrivateFieldLooseBase/classPrivateFieldLooseBase.js +7 -0
  23. package/dist/babel_helpers/classPrivateFieldLooseKey/classPrivateFieldLooseKey.js +5 -0
  24. package/dist/babel_helpers/classPrivateFieldSet/classPrivateFieldSet.js +7 -0
  25. package/dist/babel_helpers/classPrivateMethodGet/classPrivateMethodGet.js +7 -0
  26. package/dist/babel_helpers/classPrivateMethodSet/classPrivateMethodSet.js +3 -0
  27. package/dist/babel_helpers/classStaticPrivateFieldSpecGet/classStaticPrivateFieldSpecGet.js +8 -0
  28. package/dist/babel_helpers/classStaticPrivateFieldSpecSet/classStaticPrivateFieldSpecSet.js +9 -0
  29. package/dist/babel_helpers/classStaticPrivateMethodGet/classStaticPrivateMethodGet.js +5 -0
  30. package/dist/babel_helpers/classStaticPrivateMethodSet/classStaticPrivateMethodSet.js +3 -0
  31. package/dist/babel_helpers/construct/construct.js +15 -0
  32. package/dist/babel_helpers/createClass/createClass.js +18 -0
  33. package/dist/babel_helpers/createForOfIteratorHelper/createForOfIteratorHelper.js +63 -0
  34. package/dist/babel_helpers/createForOfIteratorHelperLoose/createForOfIteratorHelperLoose.js +22 -0
  35. package/dist/babel_helpers/createRawReactElement/createRawReactElement.js +50 -0
  36. package/dist/babel_helpers/createSuper/createSuper.js +22 -0
  37. package/dist/babel_helpers/decorate/decorate.js +622 -0
  38. package/dist/babel_helpers/defaults/defaults.js +14 -0
  39. package/dist/babel_helpers/defineEnumerableProperties/defineEnumerableProperties.js +26 -0
  40. package/dist/babel_helpers/defineProperty/defineProperty.js +19 -0
  41. package/dist/babel_helpers/extends/extends.js +16 -0
  42. package/dist/babel_helpers/get/get.js +21 -0
  43. package/dist/babel_helpers/getPrototypeOf/getPrototypeOf.js +2 -0
  44. package/dist/babel_helpers/inherits/inherits.js +21 -0
  45. package/dist/babel_helpers/inheritsLoose/inheritsLoose.js +6 -0
  46. package/dist/babel_helpers/initializerDefineProperty/initializerDefineProperty.js +10 -0
  47. package/dist/babel_helpers/initializerWarningHelper/initializerWarningHelper.js +3 -0
  48. package/dist/babel_helpers/instanceof/instanceof.js +7 -0
  49. package/dist/babel_helpers/interopRequireDefault/interopRequireDefault.js +5 -0
  50. package/dist/babel_helpers/interopRequireWildcard/interopRequireWildcard.js +49 -0
  51. package/dist/babel_helpers/isNativeFunction/isNativeFunction.js +4 -0
  52. package/dist/babel_helpers/isNativeReflectConstruct/isNativeReflectConstruct.js +21 -0
  53. package/dist/babel_helpers/iterableToArray/iterableToArray.js +3 -0
  54. package/dist/babel_helpers/iterableToArrayLimit/iterableToArrayLimit.js +38 -0
  55. package/dist/babel_helpers/iterableToArrayLimitLoose/iterableToArrayLimitLoose.js +13 -0
  56. package/dist/babel_helpers/jsx/jsx.js +49 -0
  57. package/dist/babel_helpers/maybeArrayLike/maybeArrayLike.js +10 -0
  58. package/dist/babel_helpers/newArrowCheck/newArrowCheck.js +5 -0
  59. package/dist/babel_helpers/nonIterableRest/nonIterableRest.js +3 -0
  60. package/dist/babel_helpers/nonIterableSpread/nonIterableSpread.js +3 -0
  61. package/dist/babel_helpers/objectDestructuringEmpty/objectDestructuringEmpty.js +3 -0
  62. package/dist/babel_helpers/objectSpread/objectSpread.js +22 -0
  63. package/dist/babel_helpers/objectSpread2/objectSpread2.js +41 -0
  64. package/dist/babel_helpers/objectWithoutProperties/objectWithoutProperties.js +20 -0
  65. package/dist/babel_helpers/objectWithoutPropertiesLoose/objectWithoutPropertiesLoose.js +15 -0
  66. package/dist/babel_helpers/possibleConstructorReturn/possibleConstructorReturn.js +10 -0
  67. package/dist/babel_helpers/readOnlyError/readOnlyError.js +4 -0
  68. package/dist/babel_helpers/readme.md +8 -0
  69. package/dist/babel_helpers/set/set.js +51 -0
  70. package/dist/babel_helpers/setPrototypeOf/setPrototypeOf.js +5 -0
  71. package/dist/babel_helpers/skipFirstGeneratorNext/skipFirstGeneratorNext.js +8 -0
  72. package/dist/babel_helpers/slicedToArray/slicedToArray.js +5 -0
  73. package/dist/babel_helpers/slicedToArrayLoose/slicedToArrayLoose.js +7 -0
  74. package/dist/babel_helpers/superPropBase/superPropBase.js +10 -0
  75. package/dist/babel_helpers/taggedTemplateLiteral/taggedTemplateLiteral.js +11 -0
  76. package/dist/babel_helpers/taggedTemplateLiteralLoose/taggedTemplateLiteralLoose.js +8 -0
  77. package/dist/babel_helpers/tdz/tdz.js +4 -0
  78. package/dist/babel_helpers/temporalRef/temporalRef.js +5 -0
  79. package/dist/babel_helpers/temporalUndefined/temporalUndefined.js +3 -0
  80. package/dist/babel_helpers/toArray/toArray.js +5 -0
  81. package/dist/babel_helpers/toConsumableArray/toConsumableArray.js +5 -0
  82. package/dist/babel_helpers/toPrimitive/toPrimitive.js +14 -0
  83. package/dist/babel_helpers/toPropertyKey/toPropertyKey.js +5 -0
  84. package/dist/babel_helpers/typeof/typeof.js +7 -0
  85. package/dist/babel_helpers/unsupportedIterableToArray/unsupportedIterableToArray.js +10 -0
  86. package/dist/babel_helpers/wrapAsyncGenerator/wrapAsyncGenerator.js +7 -0
  87. package/dist/babel_helpers/wrapNativeSuper/wrapNativeSuper.js +35 -0
  88. package/dist/babel_helpers/wrapRegExp/wrapRegExp.js +67 -0
  89. package/dist/babel_helpers/writeOnlyError/writeOnlyError.js +4 -0
  90. package/dist/html/explorer.html +557 -0
  91. package/dist/js/controllable_file.mjs +227 -0
  92. package/dist/{event_source_client.js → js/event_source_client.js} +19 -244
  93. package/dist/js/global_this.js +32 -0
  94. package/dist/js/html_supervisor_installer.js +522 -0
  95. package/dist/js/html_supervisor_setup.js +79 -0
  96. package/dist/{import_meta_hot.js → js/import_meta_hot.js} +1 -3
  97. package/dist/js/inline_content.js +8 -0
  98. package/dist/js/new_stylesheet.js +409 -0
  99. package/dist/js/regenerator_runtime.js +721 -0
  100. package/dist/js/s.js +429 -0
  101. package/dist/main.js +13450 -0
  102. package/dist/other/jsenv.png +0 -0
  103. package/dist/s.js.map +59 -62
  104. package/package.json +16 -12
  105. package/src/build/build.js +169 -68
  106. package/src/build/build_urls_generator.js +18 -2
  107. package/src/build/inject_service_worker_urls.js +1 -1
  108. package/src/build/resync_ressource_hints.js +56 -9
  109. package/src/dev/plugins/explorer/client/explorer.html +1 -1
  110. package/src/dev/plugins/explorer/jsenv_plugin_explorer.js +1 -1
  111. package/src/dev/start_dev_server.js +17 -3
  112. package/src/execute/execute.js +3 -0
  113. package/src/omega/errors.js +12 -9
  114. package/src/omega/kitchen.js +252 -217
  115. package/src/omega/server/file_service.js +1 -1
  116. package/src/omega/url_graph/url_graph_report.js +2 -2
  117. package/src/omega/url_graph/url_info_transformations.js +10 -5
  118. package/src/omega/url_graph.js +3 -2
  119. package/src/plugins/autoreload/dev_sse/jsenv_plugin_dev_sse_client.js +5 -10
  120. package/src/plugins/autoreload/jsenv_plugin_autoreload.js +1 -3
  121. package/src/plugins/bundling/js_module/bundle_js_module.js +66 -24
  122. package/src/plugins/file_urls/jsenv_plugin_file_urls.js +185 -53
  123. package/src/plugins/html_supervisor/jsenv_plugin_html_supervisor.js +9 -13
  124. package/src/plugins/http_urls/jsenv_plugin_http_urls.js +6 -6
  125. package/src/plugins/import_meta_hot/jsenv_plugin_import_meta_hot.js +5 -10
  126. package/src/plugins/inline/jsenv_plugin_js_inline_content.js +2 -2
  127. package/src/plugins/node_esm_resolution/jsenv_plugin_node_esm_resolution.js +12 -2
  128. package/src/plugins/node_runtime/jsenv_plugin_node_runtime.js +12 -0
  129. package/src/plugins/plugin_controller.js +17 -3
  130. package/src/plugins/plugins.js +16 -19
  131. package/src/plugins/transpilation/as_js_classic/jsenv_plugin_as_js_classic.js +17 -19
  132. package/src/plugins/transpilation/as_js_classic/{jsenv_plugin_script_type_module_as_classic.js → jsenv_plugin_as_js_classic_html.js} +0 -0
  133. package/src/plugins/transpilation/import_assertions/jsenv_plugin_import_assertions.js +9 -4
  134. package/src/plugins/transpilation/jsenv_plugin_transpilation.js +1 -2
  135. package/src/plugins/url_analysis/css/css_urls.js +1 -1
  136. package/src/plugins/url_analysis/html/html_urls.js +4 -1
  137. package/src/plugins/url_analysis/js/js_urls.js +3 -2
  138. package/src/plugins/url_analysis/jsenv_plugin_url_analysis.js +94 -1
  139. package/src/plugins/url_analysis/webmanifest/webmanifest_urls.js +3 -0
  140. package/src/plugins/url_resolution/jsenv_plugin_url_resolution.js +0 -3
  141. package/src/test/execute_plan.js +3 -1
  142. package/dist/event_source_client.js.map +0 -188
  143. package/dist/html_supervisor_installer.js +0 -1236
  144. package/dist/html_supervisor_installer.js.map +0 -337
  145. package/dist/html_supervisor_setup.js +0 -95
  146. package/dist/html_supervisor_setup.js.map +0 -57
  147. package/dist/import_meta_hot.js.map +0 -42
  148. package/src/jsenv_root_directory_url.js +0 -1
  149. package/src/omega/compat/default_runtime_compat.js +0 -11
  150. package/src/plugins/filesystem_magic/jsenv_plugin_filesystem_magic.js +0 -61
  151. package/src/plugins/transpilation/babel/new_stylesheet/client/.eslintrc.cjs +0 -24
@@ -0,0 +1,557 @@
1
+ <!DOCTYPE html><html><head>
2
+ <title>Exploring</title>
3
+ <meta name="viewport" content="width=device-width, initial-scale=1">
4
+ <meta charset="utf-8">
5
+ <link rel="icon" href="virtual:FAVICON_HREF">
6
+ <style>button:focus, a:focus, input:focus, [data-contains-hidden-input] input:focus + * {
7
+ outline-offset: -2px;
8
+ outline-style: none;
9
+ }
10
+
11
+ [data-contains-hidden-input] input:focus + * {
12
+ outline-offset: -2px;
13
+ outline-width: 4px;
14
+ }
15
+
16
+ html[data-last-interaction="keyboard"] button:focus, html[data-last-interaction="keyboard"] a:focus, html[data-last-interaction="keyboard"] input:focus, html[data-last-interaction="keyboard"] [data-contains-hidden-input] input:focus + * {
17
+ outline-style: auto;
18
+ }
19
+
20
+ html[data-last-interaction="keyboard"] [data-contains-hidden-input] input:focus + * {
21
+ outline-color: #0096ff;
22
+ }
23
+
24
+ @-moz-document url-prefix() {
25
+ html[data-last-interaction="keyboard"] button:focus, html[data-last-interaction="keyboard"] a:focus, html[data-last-interaction="keyboard"] input:focus, html[data-last-interaction="keyboard"] [data-input-customized] input:focus + * {
26
+ outline-offset: 0;
27
+ outline: 2px solid #0096ff;
28
+ }
29
+ }
30
+
31
+ ::-moz-focus-inner {
32
+ border: none;
33
+ }
34
+ </style>
35
+ <style>* {
36
+ box-sizing: border-box;
37
+ }
38
+
39
+ [data-force-hide] {
40
+ display: none !important;
41
+ }
42
+
43
+ html, body {
44
+ flex-direction: column;
45
+ flex: 1;
46
+ margin: 0;
47
+ padding: 0;
48
+ display: flex;
49
+ }
50
+
51
+ html {
52
+ height: 100%;
53
+ font-family: arial, sans;
54
+ }
55
+
56
+ main {
57
+ flex-direction: column;
58
+ flex: 1;
59
+ display: flex;
60
+ }
61
+
62
+ main > * {
63
+ min-width: 100%;
64
+ flex: 1;
65
+ }
66
+
67
+ hr {
68
+ color: #000;
69
+ background-color: #000;
70
+ border-color: #000;
71
+ margin: 15px 0;
72
+ }
73
+
74
+ article[data-page="file-list"] {
75
+ color: #97a0a0;
76
+ background-color: #204143;
77
+ }
78
+
79
+ nav, #explorables-message {
80
+ background: #1f262c;
81
+ }
82
+
83
+ #explorables nav {
84
+ overflow: hidden;
85
+ }
86
+
87
+ #explorables-message {
88
+ overflow: auto;
89
+ }
90
+
91
+ article h2 {
92
+ margin: 0;
93
+ display: flex;
94
+ }
95
+
96
+ article h2 svg {
97
+ margin-right: 15px;
98
+ }
99
+
100
+ #main_html_file {
101
+ padding: 25px 25px 0;
102
+ }
103
+
104
+ #main_file_link {
105
+ color: #e7f2f3;
106
+ }
107
+
108
+ h2 {
109
+ color: #24b1b0;
110
+ margin: 20px 0;
111
+ display: inline-block;
112
+ }
113
+
114
+ h4 {
115
+ color: #97a0a0;
116
+ padding: 0 25px;
117
+ font-size: 15px;
118
+ font-weight: normal;
119
+ }
120
+
121
+ #explorables {
122
+ word-break: break-word;
123
+ }
124
+
125
+ #explorables-header {
126
+ width: 100%;
127
+ position: sticky;
128
+ top: 0;
129
+ }
130
+
131
+ #explorables_header_and_menu {
132
+ background-color: #204143;
133
+ padding-top: 25px;
134
+ padding-left: 25px;
135
+ padding-right: 25px;
136
+ }
137
+
138
+ #explorables_header_bottom_spacing {
139
+ height: 20px;
140
+ background: #1f262c;
141
+ }
142
+
143
+ #directory_relative_url {
144
+ color: orange;
145
+ }
146
+
147
+ #explorables ul {
148
+ margin: 0;
149
+ padding: 0 25px 25px;
150
+ }
151
+
152
+ #explorables li {
153
+ margin: 10px 0;
154
+ list-style-type: none;
155
+ }
156
+
157
+ #explorables li:first-child {
158
+ margin-top: 0;
159
+ }
160
+
161
+ #explorables li .execution-link {
162
+ width: 100%;
163
+ word-break: break-all;
164
+ }
165
+
166
+ .execution-link {
167
+ color: #e7f2f3;
168
+ text-decoration: unset;
169
+ background: #204143;
170
+ padding: 6px 12px;
171
+ font-family: monospace;
172
+ font-size: 14px;
173
+ display: inline-block;
174
+ }
175
+
176
+ #main_file_icon {
177
+ fill: #24b1b0;
178
+ }
179
+
180
+ #fileIconSvgConfig {
181
+ width: 25px;
182
+ height: 25px;
183
+ stroke: none;
184
+ fill: #24b1b0;
185
+ }
186
+
187
+ #explorables fieldset {
188
+ border: none;
189
+ margin: 0;
190
+ padding: 0;
191
+ }
192
+
193
+ #explorables fieldset label {
194
+ padding: 0;
195
+ display: inline-block;
196
+ }
197
+
198
+ #explorables fieldset input {
199
+ opacity: 0;
200
+ position: absolute;
201
+ }
202
+
203
+ #explorables fieldset label input + * {
204
+ min-width: 8em;
205
+ text-align: center;
206
+ background-color: #204143;
207
+ border-radius: .1em;
208
+ padding: .7em 1em;
209
+ display: block;
210
+ }
211
+
212
+ #explorables fieldset input:checked + * {
213
+ color: orange;
214
+ background: #1f262c;
215
+ }
216
+
217
+ .menu-wrapper {
218
+ max-width: 100%;
219
+ margin-top: 25px;
220
+ transition: all .3s;
221
+ position: relative;
222
+ overflow: hidden;
223
+ }
224
+
225
+ .menu {
226
+ box-sizing: border-box;
227
+ white-space: nowrap;
228
+ -webkit-overflow-scrolling: touch;
229
+ overflow: auto hidden;
230
+ }
231
+
232
+ .menu .item {
233
+ height: 100%;
234
+ box-sizing: border-box;
235
+ padding: 1em;
236
+ display: inline-block;
237
+ }
238
+
239
+ .paddle {
240
+ height: 36px;
241
+ color: #1f262c;
242
+ background: #24b1b0;
243
+ border: none;
244
+ position: absolute;
245
+ bottom: 0;
246
+ }
247
+
248
+ .left-paddle {
249
+ left: 0;
250
+ }
251
+
252
+ .right-paddle {
253
+ right: 0;
254
+ }
255
+
256
+ .hidden {
257
+ display: none;
258
+ }
259
+ </style>
260
+ </head>
261
+
262
+ <body>
263
+ <main></main>
264
+ <div style="display: none">
265
+ <article data-page="file-list">
266
+ <!--
267
+ <section id="main_html_file">
268
+ <h2>
269
+ <svg id="main_file_icon" viewBox="0 0 16 16" width="25px" height="25px">
270
+ <path
271
+ d="M15.45,7L14,5.551V2c0-0.55-0.45-1-1-1h-1c-0.55,0-1,0.45-1,1v0.553L9,0.555C8.727,0.297,8.477,0,8,0S7.273,0.297,7,0.555 L0.55,7C0.238,7.325,0,7.562,0,8c0,0.563,0.432,1,1,1h1v6c0,0.55,0.45,1,1,1h3v-5c0-0.55,0.45-1,1-1h2c0.55,0,1,0.45,1,1v5h3 c0.55,0,1-0.45,1-1V9h1c0.568,0,1-0.437,1-1C16,7.562,15.762,7.325,15.45,7z"
272
+ />
273
+ </svg>
274
+ <span
275
+ >Main html file:
276
+ <a id="main_file_link" href="javascript:void(0)">${mainFileRelativeUrl}</a></span
277
+ >
278
+ </h2>
279
+ <div>
280
+ <iframe id="main_file_iframe" src="about:blank"></iframe>
281
+ </div>
282
+ </section>
283
+ <hr />
284
+ !-->
285
+ <section id="explorables">
286
+ <div id="explorables-header">
287
+ <div id="explorables_header_and_menu">
288
+ <h2 style="white-space: nowrap">
289
+ <svg id="fileIconSvgConfig" viewBox="0 0 24 24" width="32" height="32">
290
+ <path d="M0 0h24v24H0V0z" fill="none"></path>
291
+ <path d="M8 16h8v2H8zm0-4h8v2H8zm6-10H6c-1.1 0-2 .9-2 2v16c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6zm4 18H6V4h7v5h5v11z"></path>
292
+ </svg>
293
+ <span>File(s) to explore in
294
+ <span id="directory_relative_url" title="${directoryUrl}">${directoryName}</span></span>
295
+ </h2>
296
+ <div class="menu-wrapper">
297
+ <fieldset id="filter-group-set" class="menu"></fieldset>
298
+ </div>
299
+ <div class="paddles">
300
+ <button class="left-paddle paddle hidden">&lt;</button>
301
+ <button class="right-paddle paddle">&gt;</button>
302
+ </div>
303
+ </div>
304
+ <div id="explorables_header_bottom_spacing"></div>
305
+ </div>
306
+ <div>
307
+ <div id="explorables-message">
308
+ <h4 style="margin-top: 0">${message}</h4>
309
+ </div>
310
+ <nav>
311
+ <ul></ul>
312
+ </nav>
313
+ </div>
314
+ </section>
315
+ </article>
316
+ </div>
317
+ <script>
318
+ // eslint-disable-next-line no-undef
319
+ const { rootDirectoryUrl, groups, files } = SERVER_PARAMS
320
+
321
+ const groupPreference = {
322
+ has: () => localStorage.hasOwnProperty("explorer_active_group"),
323
+ get: () =>
324
+ localStorage.hasOwnProperty("explorer_active_group")
325
+ ? JSON.parse(localStorage.getItem("explorer_active_group"))
326
+ : undefined,
327
+ set: (value) =>
328
+ localStorage.setItem("explorer_active_group", JSON.stringify(value)),
329
+ }
330
+ const directoryNameFromUrl = (directoryUrl) => {
331
+ const slashLastIndex = directoryUrl.lastIndexOf(
332
+ "/",
333
+ // ignore last slash
334
+ directoryUrl.length - 2,
335
+ )
336
+ if (slashLastIndex === -1) return ""
337
+ return directoryUrl.slice(slashLastIndex + 1)
338
+ }
339
+ const urlToVisitFromRelativeUrl = (relativeUrl) => {
340
+ return `${window.origin}/${relativeUrl}`
341
+ }
342
+
343
+ const fileListElement = document
344
+ .querySelector(`[data-page="file-list"]`)
345
+ .cloneNode(true)
346
+ const directoryName = directoryNameFromUrl(rootDirectoryUrl)
347
+ const span = fileListElement.querySelector("#directory_relative_url")
348
+ span.title = rootDirectoryUrl
349
+ span.textContent = directoryName
350
+
351
+ const h4 = fileListElement.querySelector("h4")
352
+ const ul = fileListElement.querySelector("ul")
353
+ ul.innerHTML = files
354
+ .map(
355
+ (file) =>
356
+ `<li>
357
+ <a
358
+ class="execution-link"
359
+ data-relative-url=${file.relativeUrl}
360
+ href=${urlToVisitFromRelativeUrl(file.relativeUrl)}
361
+ >
362
+ ${file.relativeUrl}
363
+ </a>
364
+ </li>`,
365
+ )
366
+ .join("")
367
+
368
+ const groupFieldset = fileListElement.querySelector("#filter-group-set")
369
+ const groupNames = Object.keys(groups)
370
+ groupFieldset.innerHTML = groupNames
371
+ .map(
372
+ (key) => `<label data-contains-hidden-input class="item">
373
+ <input type="radio" name="filter-group" value="${key}"/>
374
+ <span>${key}</span>
375
+ </label>`,
376
+ )
377
+ .join("")
378
+
379
+ const groupFromLocalStorage = groupPreference.get()
380
+ const currentGroup =
381
+ groupFromLocalStorage && groupNames.includes(groupFromLocalStorage)
382
+ ? groupFromLocalStorage
383
+ : groupNames[0]
384
+ Array.from(groupFieldset.querySelectorAll("input")).forEach(
385
+ (inputRadio) => {
386
+ inputRadio.checked = inputRadio.value === currentGroup
387
+ inputRadio.onchange = () => {
388
+ if (inputRadio.checked) {
389
+ groupPreference.set(inputRadio.value)
390
+ enableGroup(inputRadio.value)
391
+ }
392
+ }
393
+ },
394
+ )
395
+
396
+ const enableGroup = (groupName) => {
397
+ const arrayOfElementToShow = []
398
+ const arrayOfElementToHide = []
399
+ files.forEach((file) => {
400
+ const fileLink = fileListElement.querySelector(
401
+ `a[data-relative-url="${file.relativeUrl}"]`,
402
+ )
403
+ const fileLi = fileLink.parentNode
404
+ if (file.meta[groupName]) {
405
+ arrayOfElementToShow.push(fileLi)
406
+ } else {
407
+ arrayOfElementToHide.push(fileLi)
408
+ }
409
+ })
410
+ arrayOfElementToShow.forEach((element) => {
411
+ element.removeAttribute("data-force-hide")
412
+ })
413
+ arrayOfElementToHide.forEach((element) => {
414
+ element.setAttribute("data-force-hide", "")
415
+ })
416
+
417
+ h4.innerHTML =
418
+ arrayOfElementToShow.length === 0
419
+ ? `No file found.
420
+ Config for this section: <pre>${JSON.stringify(
421
+ groups[groupName],
422
+ null,
423
+ " ",
424
+ )}</pre>`
425
+ : `${arrayOfElementToShow.length} files found. Click on the one you want to execute`
426
+ }
427
+ enableGroup(currentGroup)
428
+
429
+ document.querySelector("main").appendChild(fileListElement)
430
+ </script>
431
+ <script>
432
+ // make menu scrollable
433
+ const getMenuWrapperSize = () => {
434
+ return document.querySelector(".menu-wrapper").getBoundingClientRect()
435
+ .width
436
+ }
437
+ const getMenuSize = () => {
438
+ return document.querySelector(".menu").getBoundingClientRect().width
439
+ }
440
+ const getMenuPosition = () => {
441
+ return document.querySelector(".menu-wrapper").scrollLeft
442
+ }
443
+
444
+ let menuWrapperSize = getMenuWrapperSize()
445
+ let menuSize = getMenuSize()
446
+ const menuVisibleSize = menuWrapperSize
447
+ let menuInvisibleSize = menuSize - menuVisibleSize
448
+ const scrollDuration = 300
449
+ const leftPaddle = document.querySelector(".left-paddle")
450
+ const rightPaddle = document.querySelector(".right-paddle")
451
+
452
+ const handleMenuScroll = () => {
453
+ menuInvisibleSize = menuSize - menuWrapperSize
454
+ const menuPosition = getMenuPosition()
455
+ const menuEndOffset = menuInvisibleSize
456
+ // show & hide the paddles, depending on scroll position
457
+ if (menuPosition <= 0 && menuEndOffset <= 0) {
458
+ // hide both paddles if the window is large enough to display all tabs
459
+ leftPaddle.classList.add("hidden")
460
+ rightPaddle.classList.add("hidden")
461
+ } else if (menuPosition <= 0) {
462
+ leftPaddle.classList.add("hidden")
463
+ rightPaddle.classList.remove("hidden")
464
+ } else if (menuPosition < Math.floor(menuEndOffset)) {
465
+ // show both paddles in the middle
466
+ leftPaddle.classList.remove("hidden")
467
+ rightPaddle.classList.remove("hidden")
468
+ } else if (menuPosition >= Math.floor(menuEndOffset)) {
469
+ leftPaddle.classList.remove("hidden")
470
+ rightPaddle.classList.add("hidden")
471
+ }
472
+ }
473
+ handleMenuScroll()
474
+
475
+ window.onresize = () => {
476
+ menuWrapperSize = getMenuWrapperSize()
477
+ menuSize = getMenuSize()
478
+ handleMenuScroll()
479
+ }
480
+ // finally, what happens when we are actually scrolling the menu
481
+ document.querySelector(".menu-wrapper").onscroll = () => {
482
+ handleMenuScroll()
483
+ }
484
+
485
+ const startJavaScriptAnimation = ({
486
+ duration = 300,
487
+ timingFunction = (t) => t,
488
+ onProgress = () => {},
489
+ onCancel = () => {},
490
+ onComplete = () => {},
491
+ }) => {
492
+ duration = parseInt(duration, 10)
493
+ const startMs = performance.now()
494
+ let currentRequestAnimationFrameId
495
+ let done = false
496
+ let rawProgress = 0
497
+ let progress = 0
498
+ const handler = () => {
499
+ currentRequestAnimationFrameId = null
500
+ const nowMs = performance.now()
501
+ rawProgress = Math.min((nowMs - startMs) / duration, 1)
502
+ progress = timingFunction(rawProgress)
503
+ done = rawProgress === 1
504
+ onProgress({
505
+ done,
506
+ rawProgress,
507
+ progress,
508
+ })
509
+ if (done) {
510
+ onComplete()
511
+ } else {
512
+ currentRequestAnimationFrameId =
513
+ window.requestAnimationFrame(handler)
514
+ }
515
+ }
516
+ handler()
517
+ const stop = () => {
518
+ if (currentRequestAnimationFrameId) {
519
+ window.cancelAnimationFrame(currentRequestAnimationFrameId)
520
+ currentRequestAnimationFrameId = null
521
+ }
522
+ if (!done) {
523
+ done = true
524
+ onCancel({
525
+ rawProgress,
526
+ progress,
527
+ })
528
+ }
529
+ }
530
+ return stop
531
+ }
532
+ rightPaddle.onclick = () => {
533
+ const scrollStart = document.querySelector(".menu-wrapper").scrollLeft
534
+ const scrollEnd = scrollStart + menuWrapperSize
535
+ startJavaScriptAnimation({
536
+ duration: scrollDuration,
537
+ onProgress: ({ progress }) => {
538
+ document.querySelector(".menu-wrapper").scrollLeft =
539
+ scrollStart + (scrollEnd - scrollStart) * progress
540
+ },
541
+ })
542
+ }
543
+ leftPaddle.onclick = () => {
544
+ const scrollStart = document.querySelector(".menu-wrapper").scrollLeft
545
+ const scrollEnd = scrollStart - menuWrapperSize
546
+ startJavaScriptAnimation({
547
+ duration: scrollDuration,
548
+ onProgress: ({ progress }) => {
549
+ document.querySelector(".menu-wrapper").scrollLeft =
550
+ scrollStart + (scrollEnd - scrollStart) * progress
551
+ },
552
+ })
553
+ }
554
+ </script>
555
+
556
+
557
+ </body></html>