@epic-web/workshop-app 4.5.0 → 4.5.1

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 (309) hide show
  1. package/build/client/assets/{_-CGn-2XfF.js → _-COWH0sBh.js} +2 -2
  2. package/build/client/assets/{_-CGn-2XfF.js.map → _-COWH0sBh.js.map} +1 -1
  3. package/build/client/assets/{_exerciseNumber-D6YNCQoj.js → _exerciseNumber-jTT5JRgC.js} +2 -2
  4. package/build/client/assets/_exerciseNumber-jTT5JRgC.js.map +1 -0
  5. package/build/client/assets/{_exerciseNumber_._stepNumber-D00x64Vg.js → _exerciseNumber_._stepNumber-C37pli7_.js} +2 -2
  6. package/build/client/assets/{_exerciseNumber_._stepNumber-D00x64Vg.js.map → _exerciseNumber_._stepNumber-C37pli7_.js.map} +1 -1
  7. package/build/client/assets/{_exerciseNumber_.finished-DR3gQ1pK.js → _exerciseNumber_.finished-zgJKkJ7I.js} +2 -2
  8. package/build/client/assets/_exerciseNumber_.finished-zgJKkJ7I.js.map +1 -0
  9. package/build/client/assets/{_layout-DXegGcTM.js → _layout-CGUp6BkS.js} +2 -2
  10. package/build/client/assets/_layout-CGUp6BkS.js.map +1 -0
  11. package/build/client/assets/{_layout-Caqk73Ed.js → _layout-CNgYirUN.js} +2 -2
  12. package/build/client/assets/{_layout-Caqk73Ed.js.map → _layout-CNgYirUN.js.map} +1 -1
  13. package/build/client/assets/{_layout-MFX35ekR.js → _layout-D0zbQZjf.js} +2 -2
  14. package/build/client/assets/_layout-D0zbQZjf.js.map +1 -0
  15. package/build/client/assets/{account-Cp6A7SfU.js → account-DesvwOeg.js} +2 -2
  16. package/build/client/assets/{account-Cp6A7SfU.js.map → account-DesvwOeg.js.map} +1 -1
  17. package/build/client/assets/{diff-Ddyuc0-s.js → diff-DZFtsH-a.js} +2 -2
  18. package/build/client/assets/{diff-Ddyuc0-s.js.map → diff-DZFtsH-a.js.map} +1 -1
  19. package/build/client/assets/diff-tDYfSlOc.js +42 -0
  20. package/build/client/assets/diff-tDYfSlOc.js.map +1 -0
  21. package/build/client/assets/{discord-DZWTKMPn.js → discord-0kv66Q6F.js} +2 -2
  22. package/build/client/assets/{discord-DZWTKMPn.js.map → discord-0kv66Q6F.js.map} +1 -1
  23. package/build/client/assets/discord-Xp0X4-Fl.js +2 -0
  24. package/build/client/assets/discord-Xp0X4-Fl.js.map +1 -0
  25. package/build/client/assets/epic-video-BwtXsHGU.js +2988 -0
  26. package/build/client/assets/epic-video-BwtXsHGU.js.map +1 -0
  27. package/build/client/assets/{error-boundary-BUV7xD2e.js → error-boundary-Bcric_4t.js} +2 -2
  28. package/build/client/assets/{error-boundary-BUV7xD2e.js.map → error-boundary-Bcric_4t.js.map} +1 -1
  29. package/build/client/assets/{finished-gQ-B3k8j.js → finished-BSWdtBA4.js} +2 -2
  30. package/build/client/assets/finished-BSWdtBA4.js.map +1 -0
  31. package/build/client/assets/{index-CVJowtf6.js → index-BQRtqn3g.js} +2 -2
  32. package/build/client/assets/{index-CVJowtf6.js.map → index-BQRtqn3g.js.map} +1 -1
  33. package/build/client/assets/index-Bg9MMnnf.js +2 -0
  34. package/build/client/assets/index-Bg9MMnnf.js.map +1 -0
  35. package/build/client/assets/{login-BCM4kJTm.js → login-D8zyjBAb.js} +2 -2
  36. package/build/client/assets/{login-BCM4kJTm.js.map → login-D8zyjBAb.js.map} +1 -1
  37. package/build/client/assets/{manifest-0b01450d.js → manifest-03cfc48d.js} +1 -1
  38. package/build/client/assets/{mdx-BVZ4sNxQ.js → mdx-BYvGbvEr.js} +2 -2
  39. package/build/client/assets/{mdx-BVZ4sNxQ.js.map → mdx-BYvGbvEr.js.map} +1 -1
  40. package/build/client/assets/{misc-DBBsMyAP.js → misc-DNgC2Frq.js} +2 -2
  41. package/build/client/assets/{misc-DBBsMyAP.js.map → misc-DNgC2Frq.js.map} +1 -1
  42. package/build/client/assets/{nav-chevrons-DnG58Hov.js → nav-chevrons-DOYtx9XE.js} +2 -2
  43. package/build/client/assets/{nav-chevrons-DnG58Hov.js.map → nav-chevrons-DOYtx9XE.js.map} +1 -1
  44. package/build/client/assets/{onboarding-oSo74A5L.js → onboarding-euWyXpCL.js} +2 -2
  45. package/build/client/assets/{onboarding-oSo74A5L.js.map → onboarding-euWyXpCL.js.map} +1 -1
  46. package/build/client/assets/presence-BJPzwbUy.js.map +1 -1
  47. package/build/client/assets/progress-CF9Xwfxf.js +2 -0
  48. package/build/client/assets/progress-CF9Xwfxf.js.map +1 -0
  49. package/build/client/assets/{progress-bar-TRgQ8YZ8.js → progress-bar-7LK87ZMh.js} +2 -2
  50. package/build/client/assets/{progress-bar-TRgQ8YZ8.js.map → progress-bar-7LK87ZMh.js.map} +1 -1
  51. package/build/client/assets/{root-CxuwYUpK.js → root-BJrmef-V.js} +2 -2
  52. package/build/client/assets/{root-CxuwYUpK.js.map → root-BJrmef-V.js.map} +1 -1
  53. package/build/client/assets/support-DUAHYT3r.js.map +1 -1
  54. package/build/client/assets/tooltip-Kw0lYWBI.js +2 -0
  55. package/build/client/assets/tooltip-Kw0lYWBI.js.map +1 -0
  56. package/build/server/index.js +1016 -1037
  57. package/build/server/index.js.map +1 -1
  58. package/dist/server/index.js +0 -2
  59. package/node_modules/@babel/runtime/helpers/AwaitValue.js +2 -2
  60. package/node_modules/@babel/runtime/helpers/OverloadYield.js +2 -2
  61. package/node_modules/@babel/runtime/helpers/applyDecoratedDescriptor.js +7 -22
  62. package/node_modules/@babel/runtime/helpers/applyDecs2311.js +9 -9
  63. package/node_modules/@babel/runtime/helpers/arrayLikeToArray.js +4 -4
  64. package/node_modules/@babel/runtime/helpers/arrayWithHoles.js +2 -2
  65. package/node_modules/@babel/runtime/helpers/arrayWithoutHoles.js +2 -2
  66. package/node_modules/@babel/runtime/helpers/assertThisInitialized.js +3 -5
  67. package/node_modules/@babel/runtime/helpers/asyncToGenerator.js +16 -21
  68. package/node_modules/@babel/runtime/helpers/checkPrivateRedeclaration.js +2 -4
  69. package/node_modules/@babel/runtime/helpers/classApplyDescriptorDestructureSet.js +7 -15
  70. package/node_modules/@babel/runtime/helpers/classApplyDescriptorGet.js +2 -5
  71. package/node_modules/@babel/runtime/helpers/classApplyDescriptorSet.js +4 -8
  72. package/node_modules/@babel/runtime/helpers/classCallCheck.js +2 -4
  73. package/node_modules/@babel/runtime/helpers/classCheckPrivateStaticAccess.js +2 -2
  74. package/node_modules/@babel/runtime/helpers/classCheckPrivateStaticFieldDescriptor.js +2 -4
  75. package/node_modules/@babel/runtime/helpers/classExtractFieldDescriptor.js +2 -2
  76. package/node_modules/@babel/runtime/helpers/classNameTDZError.js +2 -2
  77. package/node_modules/@babel/runtime/helpers/classPrivateFieldDestructureSet.js +3 -3
  78. package/node_modules/@babel/runtime/helpers/classPrivateFieldGet.js +3 -3
  79. package/node_modules/@babel/runtime/helpers/classPrivateFieldInitSpec.js +2 -3
  80. package/node_modules/@babel/runtime/helpers/classPrivateFieldLooseBase.js +3 -5
  81. package/node_modules/@babel/runtime/helpers/classPrivateFieldLooseKey.js +2 -2
  82. package/node_modules/@babel/runtime/helpers/classPrivateFieldSet.js +3 -4
  83. package/node_modules/@babel/runtime/helpers/classPrivateMethodGet.js +2 -3
  84. package/node_modules/@babel/runtime/helpers/classPrivateMethodInitSpec.js +2 -3
  85. package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldDestructureSet.js +2 -4
  86. package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecGet.js +2 -4
  87. package/node_modules/@babel/runtime/helpers/classStaticPrivateFieldSpecSet.js +2 -5
  88. package/node_modules/@babel/runtime/helpers/classStaticPrivateMethodGet.js +2 -3
  89. package/node_modules/@babel/runtime/helpers/construct.js +1 -1
  90. package/node_modules/@babel/runtime/helpers/createClass.js +8 -14
  91. package/node_modules/@babel/runtime/helpers/createForOfIteratorHelper.js +24 -27
  92. package/node_modules/@babel/runtime/helpers/createForOfIteratorHelperLoose.js +11 -12
  93. package/node_modules/@babel/runtime/helpers/createSuper.js +10 -12
  94. package/node_modules/@babel/runtime/helpers/decorate.js +185 -278
  95. package/node_modules/@babel/runtime/helpers/defaults.js +6 -9
  96. package/node_modules/@babel/runtime/helpers/defineEnumerableProperties.js +8 -16
  97. package/node_modules/@babel/runtime/helpers/defineProperty.js +7 -13
  98. package/node_modules/@babel/runtime/helpers/esm/AsyncGenerator.js +3 -2
  99. package/node_modules/@babel/runtime/helpers/esm/AwaitValue.js +4 -3
  100. package/node_modules/@babel/runtime/helpers/esm/OverloadYield.js +4 -3
  101. package/node_modules/@babel/runtime/helpers/esm/applyDecoratedDescriptor.js +9 -23
  102. package/node_modules/@babel/runtime/helpers/esm/applyDecs.js +3 -2
  103. package/node_modules/@babel/runtime/helpers/esm/applyDecs2203.js +3 -2
  104. package/node_modules/@babel/runtime/helpers/esm/applyDecs2203R.js +3 -2
  105. package/node_modules/@babel/runtime/helpers/esm/applyDecs2301.js +3 -2
  106. package/node_modules/@babel/runtime/helpers/esm/applyDecs2305.js +3 -2
  107. package/node_modules/@babel/runtime/helpers/esm/applyDecs2311.js +12 -11
  108. package/node_modules/@babel/runtime/helpers/esm/arrayLikeToArray.js +6 -5
  109. package/node_modules/@babel/runtime/helpers/esm/arrayWithHoles.js +4 -3
  110. package/node_modules/@babel/runtime/helpers/esm/arrayWithoutHoles.js +4 -3
  111. package/node_modules/@babel/runtime/helpers/esm/assertClassBrand.js +3 -2
  112. package/node_modules/@babel/runtime/helpers/esm/assertThisInitialized.js +5 -6
  113. package/node_modules/@babel/runtime/helpers/esm/asyncGeneratorDelegate.js +3 -2
  114. package/node_modules/@babel/runtime/helpers/esm/asyncIterator.js +3 -2
  115. package/node_modules/@babel/runtime/helpers/esm/asyncToGenerator.js +18 -22
  116. package/node_modules/@babel/runtime/helpers/esm/awaitAsyncGenerator.js +3 -2
  117. package/node_modules/@babel/runtime/helpers/esm/callSuper.js +3 -2
  118. package/node_modules/@babel/runtime/helpers/esm/checkInRHS.js +3 -2
  119. package/node_modules/@babel/runtime/helpers/esm/checkPrivateRedeclaration.js +4 -5
  120. package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorDestructureSet.js +9 -16
  121. package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorGet.js +4 -6
  122. package/node_modules/@babel/runtime/helpers/esm/classApplyDescriptorSet.js +6 -9
  123. package/node_modules/@babel/runtime/helpers/esm/classCallCheck.js +4 -5
  124. package/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticAccess.js +4 -3
  125. package/node_modules/@babel/runtime/helpers/esm/classCheckPrivateStaticFieldDescriptor.js +4 -5
  126. package/node_modules/@babel/runtime/helpers/esm/classExtractFieldDescriptor.js +4 -3
  127. package/node_modules/@babel/runtime/helpers/esm/classNameTDZError.js +4 -3
  128. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldDestructureSet.js +5 -4
  129. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet.js +5 -4
  130. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldGet2.js +3 -2
  131. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldInitSpec.js +4 -4
  132. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseBase.js +5 -6
  133. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldLooseKey.js +4 -3
  134. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet.js +5 -5
  135. package/node_modules/@babel/runtime/helpers/esm/classPrivateFieldSet2.js +3 -2
  136. package/node_modules/@babel/runtime/helpers/esm/classPrivateGetter.js +3 -2
  137. package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodGet.js +4 -4
  138. package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodInitSpec.js +4 -4
  139. package/node_modules/@babel/runtime/helpers/esm/classPrivateMethodSet.js +3 -2
  140. package/node_modules/@babel/runtime/helpers/esm/classPrivateSetter.js +3 -2
  141. package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldDestructureSet.js +4 -5
  142. package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecGet.js +4 -5
  143. package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateFieldSpecSet.js +4 -6
  144. package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodGet.js +4 -4
  145. package/node_modules/@babel/runtime/helpers/esm/classStaticPrivateMethodSet.js +3 -2
  146. package/node_modules/@babel/runtime/helpers/esm/construct.js +4 -3
  147. package/node_modules/@babel/runtime/helpers/esm/createClass.js +10 -15
  148. package/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelper.js +26 -28
  149. package/node_modules/@babel/runtime/helpers/esm/createForOfIteratorHelperLoose.js +13 -13
  150. package/node_modules/@babel/runtime/helpers/esm/createSuper.js +12 -13
  151. package/node_modules/@babel/runtime/helpers/esm/decorate.js +187 -279
  152. package/node_modules/@babel/runtime/helpers/esm/defaults.js +8 -10
  153. package/node_modules/@babel/runtime/helpers/esm/defineAccessor.js +3 -2
  154. package/node_modules/@babel/runtime/helpers/esm/defineEnumerableProperties.js +10 -17
  155. package/node_modules/@babel/runtime/helpers/esm/defineProperty.js +9 -14
  156. package/node_modules/@babel/runtime/helpers/esm/dispose.js +3 -2
  157. package/node_modules/@babel/runtime/helpers/esm/extends.js +9 -13
  158. package/node_modules/@babel/runtime/helpers/esm/get.js +10 -16
  159. package/node_modules/@babel/runtime/helpers/esm/getPrototypeOf.js +6 -6
  160. package/node_modules/@babel/runtime/helpers/esm/identity.js +4 -3
  161. package/node_modules/@babel/runtime/helpers/esm/importDeferProxy.js +3 -2
  162. package/node_modules/@babel/runtime/helpers/esm/inherits.js +11 -14
  163. package/node_modules/@babel/runtime/helpers/esm/inheritsLoose.js +4 -5
  164. package/node_modules/@babel/runtime/helpers/esm/initializerDefineProperty.js +8 -8
  165. package/node_modules/@babel/runtime/helpers/esm/initializerWarningHelper.js +4 -3
  166. package/node_modules/@babel/runtime/helpers/esm/instanceof.js +4 -7
  167. package/node_modules/@babel/runtime/helpers/esm/interopRequireDefault.js +5 -4
  168. package/node_modules/@babel/runtime/helpers/esm/interopRequireWildcard.js +3 -2
  169. package/node_modules/@babel/runtime/helpers/esm/isNativeFunction.js +6 -5
  170. package/node_modules/@babel/runtime/helpers/esm/isNativeReflectConstruct.js +3 -2
  171. package/node_modules/@babel/runtime/helpers/esm/iterableToArray.js +4 -3
  172. package/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimit.js +3 -2
  173. package/node_modules/@babel/runtime/helpers/esm/iterableToArrayLimitLoose.js +3 -2
  174. package/node_modules/@babel/runtime/helpers/esm/jsx.js +3 -2
  175. package/node_modules/@babel/runtime/helpers/esm/maybeArrayLike.js +7 -6
  176. package/node_modules/@babel/runtime/helpers/esm/newArrowCheck.js +4 -5
  177. package/node_modules/@babel/runtime/helpers/esm/nonIterableRest.js +3 -2
  178. package/node_modules/@babel/runtime/helpers/esm/nonIterableSpread.js +3 -2
  179. package/node_modules/@babel/runtime/helpers/esm/nullishReceiverError.js +3 -2
  180. package/node_modules/@babel/runtime/helpers/esm/objectDestructuringEmpty.js +4 -3
  181. package/node_modules/@babel/runtime/helpers/esm/objectSpread.js +11 -13
  182. package/node_modules/@babel/runtime/helpers/esm/objectSpread2.js +3 -2
  183. package/node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js +10 -13
  184. package/node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js +9 -10
  185. package/node_modules/@babel/runtime/helpers/esm/possibleConstructorReturn.js +6 -8
  186. package/node_modules/@babel/runtime/helpers/esm/readOnlyError.js +4 -3
  187. package/node_modules/@babel/runtime/helpers/esm/regeneratorRuntime.js +3 -2
  188. package/node_modules/@babel/runtime/helpers/esm/set.js +19 -37
  189. package/node_modules/@babel/runtime/helpers/esm/setFunctionName.js +3 -2
  190. package/node_modules/@babel/runtime/helpers/esm/setPrototypeOf.js +6 -7
  191. package/node_modules/@babel/runtime/helpers/esm/skipFirstGeneratorNext.js +5 -5
  192. package/node_modules/@babel/runtime/helpers/esm/slicedToArray.js +4 -3
  193. package/node_modules/@babel/runtime/helpers/esm/slicedToArrayLoose.js +4 -3
  194. package/node_modules/@babel/runtime/helpers/esm/superPropBase.js +5 -7
  195. package/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteral.js +5 -7
  196. package/node_modules/@babel/runtime/helpers/esm/taggedTemplateLiteralLoose.js +4 -7
  197. package/node_modules/@babel/runtime/helpers/esm/tdz.js +4 -3
  198. package/node_modules/@babel/runtime/helpers/esm/temporalRef.js +6 -5
  199. package/node_modules/@babel/runtime/helpers/esm/temporalUndefined.js +2 -1
  200. package/node_modules/@babel/runtime/helpers/esm/toArray.js +4 -3
  201. package/node_modules/@babel/runtime/helpers/esm/toConsumableArray.js +4 -3
  202. package/node_modules/@babel/runtime/helpers/esm/toPrimitive.js +3 -2
  203. package/node_modules/@babel/runtime/helpers/esm/toPropertyKey.js +3 -2
  204. package/node_modules/@babel/runtime/helpers/esm/toSetter.js +3 -2
  205. package/node_modules/@babel/runtime/helpers/esm/typeof.js +3 -2
  206. package/node_modules/@babel/runtime/helpers/esm/unsupportedIterableToArray.js +8 -8
  207. package/node_modules/@babel/runtime/helpers/esm/using.js +3 -2
  208. package/node_modules/@babel/runtime/helpers/esm/usingCtx.js +3 -2
  209. package/node_modules/@babel/runtime/helpers/esm/wrapAsyncGenerator.js +4 -3
  210. package/node_modules/@babel/runtime/helpers/esm/wrapNativeSuper.js +17 -20
  211. package/node_modules/@babel/runtime/helpers/esm/wrapRegExp.js +3 -2
  212. package/node_modules/@babel/runtime/helpers/esm/writeOnlyError.js +4 -3
  213. package/node_modules/@babel/runtime/helpers/extends.js +6 -11
  214. package/node_modules/@babel/runtime/helpers/get.js +7 -14
  215. package/node_modules/@babel/runtime/helpers/getPrototypeOf.js +4 -5
  216. package/node_modules/@babel/runtime/helpers/identity.js +2 -2
  217. package/node_modules/@babel/runtime/helpers/inherits.js +9 -13
  218. package/node_modules/@babel/runtime/helpers/inheritsLoose.js +2 -4
  219. package/node_modules/@babel/runtime/helpers/initializerDefineProperty.js +6 -7
  220. package/node_modules/@babel/runtime/helpers/initializerWarningHelper.js +2 -2
  221. package/node_modules/@babel/runtime/helpers/instanceof.js +2 -6
  222. package/node_modules/@babel/runtime/helpers/interopRequireDefault.js +3 -3
  223. package/node_modules/@babel/runtime/helpers/isNativeFunction.js +4 -4
  224. package/node_modules/@babel/runtime/helpers/iterableToArray.js +2 -2
  225. package/node_modules/@babel/runtime/helpers/maybeArrayLike.js +5 -5
  226. package/node_modules/@babel/runtime/helpers/newArrowCheck.js +2 -4
  227. package/node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js +2 -2
  228. package/node_modules/@babel/runtime/helpers/objectSpread.js +9 -12
  229. package/node_modules/@babel/runtime/helpers/objectWithoutProperties.js +8 -12
  230. package/node_modules/@babel/runtime/helpers/objectWithoutPropertiesLoose.js +7 -9
  231. package/node_modules/@babel/runtime/helpers/possibleConstructorReturn.js +4 -7
  232. package/node_modules/@babel/runtime/helpers/readOnlyError.js +2 -2
  233. package/node_modules/@babel/runtime/helpers/set.js +17 -36
  234. package/node_modules/@babel/runtime/helpers/setPrototypeOf.js +4 -6
  235. package/node_modules/@babel/runtime/helpers/skipFirstGeneratorNext.js +3 -4
  236. package/node_modules/@babel/runtime/helpers/slicedToArray.js +2 -2
  237. package/node_modules/@babel/runtime/helpers/slicedToArrayLoose.js +2 -2
  238. package/node_modules/@babel/runtime/helpers/superPropBase.js +3 -6
  239. package/node_modules/@babel/runtime/helpers/taggedTemplateLiteral.js +3 -6
  240. package/node_modules/@babel/runtime/helpers/taggedTemplateLiteralLoose.js +2 -6
  241. package/node_modules/@babel/runtime/helpers/tdz.js +2 -2
  242. package/node_modules/@babel/runtime/helpers/temporalRef.js +2 -2
  243. package/node_modules/@babel/runtime/helpers/toArray.js +2 -2
  244. package/node_modules/@babel/runtime/helpers/toConsumableArray.js +2 -2
  245. package/node_modules/@babel/runtime/helpers/unsupportedIterableToArray.js +6 -7
  246. package/node_modules/@babel/runtime/helpers/wrapAsyncGenerator.js +2 -2
  247. package/node_modules/@babel/runtime/helpers/wrapNativeSuper.js +15 -19
  248. package/node_modules/@babel/runtime/helpers/writeOnlyError.js +2 -2
  249. package/node_modules/@babel/runtime/package.json +587 -587
  250. package/node_modules/@conform-to/dom/form.js +1 -1
  251. package/node_modules/@conform-to/dom/form.mjs +1 -1
  252. package/node_modules/@conform-to/dom/formdata.d.ts +2 -2
  253. package/node_modules/@conform-to/dom/formdata.js +12 -34
  254. package/node_modules/@conform-to/dom/formdata.mjs +12 -34
  255. package/node_modules/@conform-to/dom/intent.d.ts +82 -0
  256. package/node_modules/@conform-to/dom/intent.js +136 -0
  257. package/node_modules/@conform-to/dom/intent.mjs +126 -0
  258. package/node_modules/@conform-to/dom/package.json +58 -59
  259. package/node_modules/@conform-to/dom/parse.d.ts +30 -0
  260. package/node_modules/@conform-to/dom/parse.js +43 -0
  261. package/node_modules/@conform-to/dom/parse.mjs +37 -0
  262. package/node_modules/@conform-to/dom/submission.d.ts +2 -2
  263. package/node_modules/@conform-to/dom/submission.js +23 -21
  264. package/node_modules/@conform-to/dom/submission.mjs +23 -21
  265. package/node_modules/@conform-to/dom/types.d.ts +20 -0
  266. package/node_modules/@conform-to/react/helpers.js +1 -1
  267. package/node_modules/@conform-to/react/helpers.mjs +1 -1
  268. package/node_modules/@conform-to/react/package.json +68 -69
  269. package/node_modules/@conform-to/zod/package.json +60 -61
  270. package/node_modules/framer-motion/dist/cjs/{dom-entry-fJy-kji5.js → dom-entry-DSxBucW4.js} +115 -107
  271. package/node_modules/framer-motion/dist/cjs/dom-entry.js +1 -1
  272. package/node_modules/framer-motion/dist/cjs/index.js +43 -10
  273. package/node_modules/framer-motion/dist/dom-entry.d.ts +1 -1
  274. package/node_modules/framer-motion/dist/dom.js +1 -1
  275. package/node_modules/framer-motion/dist/es/animation/GroupPlaybackControls.mjs +2 -3
  276. package/node_modules/framer-motion/dist/es/animation/interfaces/motion-value.mjs +4 -1
  277. package/node_modules/framer-motion/dist/es/animation/interfaces/visual-element-target.mjs +2 -3
  278. package/node_modules/framer-motion/dist/es/animation/optimized-appear/get-appear-id.mjs +7 -0
  279. package/node_modules/framer-motion/dist/es/projection/node/create-projection-node.mjs +43 -9
  280. package/node_modules/framer-motion/dist/es/render/dom/DOMKeyframesResolver.mjs +11 -8
  281. package/node_modules/framer-motion/dist/es/render/utils/motion-values.mjs +1 -1
  282. package/node_modules/framer-motion/dist/es/value/index.mjs +1 -1
  283. package/node_modules/framer-motion/dist/framer-motion.dev.js +156 -116
  284. package/node_modules/framer-motion/dist/framer-motion.js +1 -1
  285. package/node_modules/framer-motion/dist/index.d.ts +2 -1
  286. package/node_modules/framer-motion/dist/projection.dev.js +163 -20
  287. package/node_modules/framer-motion/dist/three-entry.d.ts +1 -0
  288. package/node_modules/framer-motion/package.json +8 -8
  289. package/node_modules/remix-utils/node_modules/type-fest/package.json +1 -1
  290. package/node_modules/remix-utils/node_modules/type-fest/source/conditional-keys.d.ts +5 -3
  291. package/package.json +7 -6
  292. package/start.js +4 -2
  293. package/build/client/assets/_exerciseNumber-D6YNCQoj.js.map +0 -1
  294. package/build/client/assets/_exerciseNumber_.finished-DR3gQ1pK.js.map +0 -1
  295. package/build/client/assets/_layout-DXegGcTM.js.map +0 -1
  296. package/build/client/assets/_layout-MFX35ekR.js.map +0 -1
  297. package/build/client/assets/diff-ZJmYghvh.js +0 -42
  298. package/build/client/assets/diff-ZJmYghvh.js.map +0 -1
  299. package/build/client/assets/discord-fsySDDKv.js +0 -2
  300. package/build/client/assets/discord-fsySDDKv.js.map +0 -1
  301. package/build/client/assets/epic-video-BKzHxm70.js +0 -2985
  302. package/build/client/assets/epic-video-BKzHxm70.js.map +0 -1
  303. package/build/client/assets/finished-gQ-B3k8j.js.map +0 -1
  304. package/build/client/assets/index-Drecz7hr.js +0 -2
  305. package/build/client/assets/index-Drecz7hr.js.map +0 -1
  306. package/build/client/assets/progress-HmjERaPh.js +0 -2
  307. package/build/client/assets/progress-HmjERaPh.js.map +0 -1
  308. package/build/client/assets/tooltip-BdTNdCYE.js +0 -2
  309. package/build/client/assets/tooltip-BdTNdCYE.js.map +0 -1
@@ -1,10 +1,10 @@
1
1
  var _a, _b;
2
2
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
3
3
  import { PassThrough } from "stream";
4
- import "@total-typescript/ts-reset";
5
- import fs$1 from "fs";
6
- import path from "path";
4
+ import fs from "node:fs";
5
+ import path$1 from "node:path";
7
6
  import { remember } from "@epic-web/remember";
7
+ import "@total-typescript/ts-reset";
8
8
  import { execaCommand, execa } from "execa";
9
9
  import fsExtra from "fs-extra";
10
10
  import { glob } from "glob";
@@ -12,12 +12,14 @@ import { isGitIgnored, globby } from "globby";
12
12
  import * as z from "zod";
13
13
  import { z as z$1 } from "zod";
14
14
  import os from "os";
15
+ import path from "path";
15
16
  import * as C from "@epic-web/cachified";
16
17
  import { verboseReporter, cachified as cachified$1 } from "@epic-web/cachified";
17
18
  import { LRUCache } from "lru-cache";
18
19
  import md5 from "md5-hex";
19
20
  import chokidar from "chokidar";
20
21
  import closeWithGrace from "close-with-grace";
22
+ import fs$1 from "fs";
21
23
  import { remarkCodeBlocksShiki } from "@kentcdodds/md-temp";
22
24
  import { bundleMDX } from "mdx-bundler";
23
25
  import PQueue from "p-queue";
@@ -25,8 +27,6 @@ import remarkAutolinkHeadings from "remark-autolink-headings";
25
27
  import emoji from "remark-emoji";
26
28
  import gfm from "remark-gfm";
27
29
  import { visit } from "unist-util-visit";
28
- import fs from "node:fs";
29
- import path$1 from "node:path";
30
30
  import { createProcessor } from "@mdx-js/mdx";
31
31
  import { removePosition } from "unist-util-remove-position";
32
32
  import child_process, { spawn } from "child_process";
@@ -35,12 +35,12 @@ import chalk from "chalk";
35
35
  import fkill from "fkill";
36
36
  import { promises } from "node:dns";
37
37
  import { createReadableStreamFromReadable, redirect, json, createCookieSessionStorage, defer } from "@remix-run/node";
38
- import { RemixServer, Link, useRouteError, useParams, isRouteErrorResponse, useNavigation, useFetchers, useRouteLoaderData, useRevalidator, useFetcher, useLoaderData, Outlet, Meta, Links, ScrollRestoration, Scripts, useLocation, NavLink, Await, useSearchParams, Form, useSubmit, useNavigate } from "@remix-run/react";
38
+ import { RemixServer, Link, useRouteError, useParams, isRouteErrorResponse, useNavigation, useFetchers, useRouteLoaderData, useRevalidator, useFetcher, useLoaderData, Outlet, Meta, Links, ScrollRestoration, Scripts, useLocation, NavLink, Await, useSubmit, useSearchParams, Form, useNavigate } from "@remix-run/react";
39
39
  import { isbot } from "isbot";
40
40
  import { renderToPipeableStream } from "react-dom/server";
41
41
  import { cssBundleHref } from "@remix-run/css-bundle";
42
42
  import * as React from "react";
43
- import React__default, { useRef, useEffect, useMemo, useState, createContext, useContext, forwardRef, useImperativeHandle, useReducer, Suspense } from "react";
43
+ import React__default, { useRef, useEffect, useMemo, useState, createContext, useContext, Suspense, forwardRef, useImperativeHandle, useReducer } from "react";
44
44
  import { useSpinDelay } from "spin-delay";
45
45
  import { Index as Index$1 } from "confetti-react";
46
46
  import { ClientOnly } from "remix-utils/client-only";
@@ -52,11 +52,11 @@ import * as TooltipPrimitive from "@radix-ui/react-tooltip";
52
52
  import { useForm, getFormProps } from "@conform-to/react";
53
53
  import { parseWithZod } from "@conform-to/zod";
54
54
  import { safeRedirect } from "remix-utils/safe-redirect";
55
- import * as cookie from "cookie";
56
55
  import { getHintUtils } from "@epic-web/client-hints";
57
56
  import { clientHint, subscribeToSchemeChange } from "@epic-web/client-hints/color-scheme";
58
57
  import { clientHint as clientHint$2, subscribeToMotionChange } from "@epic-web/client-hints/reduced-motion";
59
58
  import { clientHint as clientHint$1 } from "@epic-web/client-hints/time-zone";
59
+ import * as cookie from "cookie";
60
60
  import { createId } from "@paralleldrive/cuid2";
61
61
  import { usePartySocket } from "partysocket/react";
62
62
  import { motion, useAnimationControls } from "framer-motion";
@@ -66,15 +66,15 @@ import RealMuxPlayer from "@mux/mux-player-react";
66
66
  import shellQuote from "shell-quote";
67
67
  import * as mdxBundler from "mdx-bundler/client/index.js";
68
68
  import * as Tabs from "@radix-ui/react-tabs";
69
- import dayjs from "dayjs";
70
- import "dayjs/plugin/relativeTime.js";
71
- import "dayjs/plugin/timezone.js";
72
- import "dayjs/plugin/utc.js";
69
+ import * as Accordion from "@radix-ui/react-accordion";
73
70
  import * as Select from "@radix-ui/react-select";
74
71
  import ignore from "ignore";
75
72
  import parseGitDiff from "parse-git-diff";
76
73
  import { bundledLanguagesInfo } from "shiki/langs";
77
- import * as Accordion from "@radix-ui/react-accordion";
74
+ import dayjs from "dayjs";
75
+ import "dayjs/plugin/relativeTime.js";
76
+ import "dayjs/plugin/timezone.js";
77
+ import "dayjs/plugin/utc.js";
78
78
  import AnsiToHTML from "ansi-to-html";
79
79
  import escapeHtml from "lodash.escape";
80
80
  import { useEventSource } from "remix-utils/sse/react";
@@ -353,7 +353,7 @@ async function getFileContent(filePath) {
353
353
  const fileContent = content.split("\n");
354
354
  fileContentCache.set(filePath, fileContent);
355
355
  return fileContent;
356
- } catch (error) {
356
+ } catch {
357
357
  console.warn(
358
358
  `@epic-web/workshop-app - invalid CodeFile.
359
359
  Could not read file: ${filePath}
@@ -869,7 +869,7 @@ async function getEmbeddedFilesCache() {
869
869
  await fs$1.promises.readFile(embeddedFilesLocation, "utf-8")
870
870
  );
871
871
  }
872
- } catch (error) {
872
+ } catch {
873
873
  console.error(`Unable to read 'embeddedFiles.json' from: `, cacheDir);
874
874
  }
875
875
  return void 0;
@@ -1193,7 +1193,7 @@ async function getPkgProp(fullPath, prop, defaultValue) {
1193
1193
  }
1194
1194
  (_b = process.env).NODE_ENV ?? (_b.NODE_ENV = "development");
1195
1195
  const workshopRoot = getWorkshopRoot();
1196
- const playgroundAppNameInfoPath = path.join(
1196
+ const playgroundAppNameInfoPath = path$1.join(
1197
1197
  getWorkshopRoot(),
1198
1198
  "node_modules",
1199
1199
  ".cache",
@@ -1308,7 +1308,7 @@ function isExerciseStepApp(app) {
1308
1308
  return isProblemApp(app) || isSolutionApp(app);
1309
1309
  }
1310
1310
  function exists(file) {
1311
- return fs$1.promises.access(file, fs$1.constants.F_OK).then(
1311
+ return fs.promises.access(file, fs.constants.F_OK).then(
1312
1312
  () => true,
1313
1313
  () => false
1314
1314
  );
@@ -1348,7 +1348,7 @@ function setModifiedTimesForDir(dir) {
1348
1348
  modifiedTimes.set(dir, Date.now());
1349
1349
  }
1350
1350
  function getForceFreshForDir(dir, cacheEntry) {
1351
- if (!path.isAbsolute(dir)) {
1351
+ if (!path$1.isAbsolute(dir)) {
1352
1352
  throw new Error(`Trying to get force fresh for non-absolute path: ${dir}`);
1353
1353
  }
1354
1354
  if (!cacheEntry)
@@ -1360,7 +1360,7 @@ function getForceFreshForDir(dir, cacheEntry) {
1360
1360
  }
1361
1361
  async function readDir(dir) {
1362
1362
  if (await exists(dir)) {
1363
- return fs$1.promises.readdir(dir);
1363
+ return fs.promises.readdir(dir);
1364
1364
  }
1365
1365
  return [];
1366
1366
  }
@@ -1409,18 +1409,18 @@ async function getExercises({
1409
1409
  request
1410
1410
  } = {}) {
1411
1411
  const apps = await getApps({ request, timings });
1412
- const exerciseDirs = await readDir(path.join(workshopRoot, "exercises"));
1412
+ const exerciseDirs = await readDir(path$1.join(workshopRoot, "exercises"));
1413
1413
  const exercises = [];
1414
1414
  for (const dirName of exerciseDirs) {
1415
1415
  const exerciseNumber = extractExerciseNumber(dirName);
1416
1416
  if (!exerciseNumber)
1417
1417
  continue;
1418
1418
  const compiledReadme = await compileMdxIfExists(
1419
- path.join(workshopRoot, "exercises", dirName, "README.mdx"),
1419
+ path$1.join(workshopRoot, "exercises", dirName, "README.mdx"),
1420
1420
  { request }
1421
1421
  );
1422
1422
  const compiledFinished = await compileMdxIfExists(
1423
- path.join(workshopRoot, "exercises", dirName, "FINISHED.mdx"),
1423
+ path$1.join(workshopRoot, "exercises", dirName, "FINISHED.mdx"),
1424
1424
  { request }
1425
1425
  );
1426
1426
  const steps = [];
@@ -1528,12 +1528,12 @@ const AppIdInfoSchema = z$1.object({
1528
1528
  function extractNumbersAndTypeFromAppNameOrPath(fullPathOrAppName) {
1529
1529
  var _a2;
1530
1530
  const info = {};
1531
- if (fullPathOrAppName.includes(path.sep)) {
1531
+ if (fullPathOrAppName.includes(path$1.sep)) {
1532
1532
  const relativePath = fullPathOrAppName.replace(
1533
- path.join(workshopRoot, "exercises", path.sep),
1533
+ path$1.join(workshopRoot, "exercises", path$1.sep),
1534
1534
  ""
1535
1535
  );
1536
- const [exerciseNumberPart, stepNumberPart] = relativePath.split(path.sep);
1536
+ const [exerciseNumberPart, stepNumberPart] = relativePath.split(path$1.sep);
1537
1537
  if (!exerciseNumberPart || !stepNumberPart)
1538
1538
  return null;
1539
1539
  const exerciseNumber = exerciseNumberPart.split(".")[0];
@@ -1554,19 +1554,19 @@ function extractNumbersAndTypeFromAppNameOrPath(fullPathOrAppName) {
1554
1554
  return null;
1555
1555
  }
1556
1556
  async function getProblemDirs() {
1557
- const exercisesDir = path.join(workshopRoot, "exercises");
1557
+ const exercisesDir = path$1.join(workshopRoot, "exercises");
1558
1558
  const problemDirs = (await glob("**/*.problem*", {
1559
1559
  cwd: exercisesDir,
1560
1560
  ignore: "node_modules/**"
1561
- })).map((p) => path.join(exercisesDir, p));
1561
+ })).map((p) => path$1.join(exercisesDir, p));
1562
1562
  return problemDirs;
1563
1563
  }
1564
1564
  async function getSolutionDirs() {
1565
- const exercisesDir = path.join(workshopRoot, "exercises");
1565
+ const exercisesDir = path$1.join(workshopRoot, "exercises");
1566
1566
  const solutionDirs = (await glob("**/*.solution*", {
1567
1567
  cwd: exercisesDir,
1568
1568
  ignore: "node_modules/**"
1569
- })).map((p) => path.join(exercisesDir, p));
1569
+ })).map((p) => path$1.join(exercisesDir, p));
1570
1570
  return solutionDirs;
1571
1571
  }
1572
1572
  function getPathname(fullPath) {
@@ -1578,30 +1578,30 @@ function getAppName(fullPath) {
1578
1578
  return "playground";
1579
1579
  if (/examples\/.+\/?$/.test(fullPath)) {
1580
1580
  const restOfPath = fullPath.replace(
1581
- `${getWorkshopRoot()}${path.sep}examples${path.sep}`,
1581
+ `${getWorkshopRoot()}${path$1.sep}examples${path$1.sep}`,
1582
1582
  ""
1583
1583
  );
1584
- return `example.${restOfPath.split(path.sep).join("__sep__")}`;
1584
+ return `example.${restOfPath.split(path$1.sep).join("__sep__")}`;
1585
1585
  }
1586
1586
  const appIdInfo = extractNumbersAndTypeFromAppNameOrPath(fullPath);
1587
1587
  if (appIdInfo) {
1588
1588
  const { exerciseNumber, stepNumber, type } = appIdInfo;
1589
1589
  return `${exerciseNumber}.${stepNumber}.${type}`;
1590
1590
  } else {
1591
- const relativePath = fullPath.replace(`${workshopRoot}${path.sep}`, "");
1592
- return relativePath.split(path.sep).join("__sep__");
1591
+ const relativePath = fullPath.replace(`${workshopRoot}${path$1.sep}`, "");
1592
+ return relativePath.split(path$1.sep).join("__sep__");
1593
1593
  }
1594
1594
  }
1595
1595
  async function getFullPathFromAppName(appName) {
1596
1596
  if (appName === "playground")
1597
- return path.join(workshopRoot, "playground");
1597
+ return path$1.join(workshopRoot, "playground");
1598
1598
  if (appName.startsWith(".example")) {
1599
- const relativePath = appName.replace(".example", "").split("__sep__").join(path.sep);
1600
- return path.join(workshopRoot, "examples", relativePath);
1599
+ const relativePath = appName.replace(".example", "").split("__sep__").join(path$1.sep);
1600
+ return path$1.join(workshopRoot, "examples", relativePath);
1601
1601
  }
1602
1602
  if (appName.includes("__sep__")) {
1603
- const relativePath = appName.replaceAll("__sep__", path.sep);
1604
- return path.join(workshopRoot, relativePath);
1603
+ const relativePath = appName.replaceAll("__sep__", path$1.sep);
1604
+ return path$1.join(workshopRoot, relativePath);
1605
1605
  }
1606
1606
  const [exerciseNumber, stepNumber, type] = appName.split(".");
1607
1607
  const appDirs = type === "problem" ? await getProblemDirs() : type === "solution" ? await getSolutionDirs() : [];
@@ -1616,20 +1616,20 @@ async function getFullPathFromAppName(appName) {
1616
1616
  async function findSolutionDir({
1617
1617
  fullPath
1618
1618
  }) {
1619
- const dirName = path.basename(fullPath);
1619
+ const dirName = path$1.basename(fullPath);
1620
1620
  if (dirName.includes(".problem")) {
1621
1621
  const info = getAppDirInfo(dirName);
1622
1622
  if (!info)
1623
1623
  return null;
1624
1624
  const { stepNumber } = info;
1625
1625
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1626
- const parentDir = path.dirname(fullPath);
1627
- const siblingDirs = await fs$1.promises.readdir(parentDir);
1626
+ const parentDir = path$1.dirname(fullPath);
1627
+ const siblingDirs = await fs.promises.readdir(parentDir);
1628
1628
  const solutionDir = siblingDirs.find(
1629
1629
  (dir) => dir.startsWith(`${paddedStepNumber}.solution`)
1630
1630
  );
1631
1631
  if (solutionDir) {
1632
- return path.join(parentDir, solutionDir);
1632
+ return path$1.join(parentDir, solutionDir);
1633
1633
  }
1634
1634
  } else if (fullPath.endsWith("playground")) {
1635
1635
  const appName = await getPlaygroundAppName();
@@ -1644,20 +1644,20 @@ async function findSolutionDir({
1644
1644
  async function findProblemDir({
1645
1645
  fullPath
1646
1646
  }) {
1647
- const dirName = path.basename(fullPath);
1647
+ const dirName = path$1.basename(fullPath);
1648
1648
  if (dirName.includes(".solution")) {
1649
1649
  const info = getAppDirInfo(dirName);
1650
1650
  if (!info)
1651
1651
  return null;
1652
1652
  const { stepNumber } = info;
1653
1653
  const paddedStepNumber = stepNumber.toString().padStart(2, "0");
1654
- const parentDir = path.dirname(fullPath);
1655
- const siblingDirs = await fs$1.promises.readdir(parentDir);
1654
+ const parentDir = path$1.dirname(fullPath);
1655
+ const siblingDirs = await fs.promises.readdir(parentDir);
1656
1656
  const problemDir = siblingDirs.find(
1657
1657
  (dir) => dir.endsWith("problem") && dir.includes(paddedStepNumber)
1658
1658
  );
1659
1659
  if (problemDir) {
1660
- return path.join(parentDir, problemDir);
1660
+ return path$1.join(parentDir, problemDir);
1661
1661
  }
1662
1662
  } else if (fullPath.endsWith("playground")) {
1663
1663
  const appName = await getPlaygroundAppName();
@@ -1670,13 +1670,13 @@ async function findProblemDir({
1670
1670
  async function getTestInfo({
1671
1671
  fullPath
1672
1672
  }) {
1673
- const hasPkgJson = await exists(path.join(fullPath, "package.json"));
1673
+ const hasPkgJson = await exists(path$1.join(fullPath, "package.json"));
1674
1674
  const testScript = hasPkgJson ? await getPkgProp(fullPath, "epicshop.scripts.test", "") : null;
1675
1675
  if (testScript) {
1676
1676
  return { type: "script", script: testScript };
1677
1677
  }
1678
1678
  const testAppFullPath = await findSolutionDir({ fullPath }) ?? fullPath;
1679
- const dirList = await fs$1.promises.readdir(testAppFullPath);
1679
+ const dirList = await fs.promises.readdir(testAppFullPath);
1680
1680
  const testFiles = dirList.filter((item) => item.includes(".test."));
1681
1681
  if (testFiles.length) {
1682
1682
  return {
@@ -1691,7 +1691,7 @@ async function getDevInfo({
1691
1691
  fullPath,
1692
1692
  portNumber
1693
1693
  }) {
1694
- const hasPkgJson = await exists(path.join(fullPath, "package.json"));
1694
+ const hasPkgJson = await exists(path$1.join(fullPath, "package.json"));
1695
1695
  const hasDevScript = hasPkgJson ? Boolean(await getPkgProp(fullPath, "scripts.dev", "")) : false;
1696
1696
  if (hasDevScript) {
1697
1697
  const initialRoute = (hasPkgJson ? await getPkgProp(fullPath, "epicshop.initialRoute", "") : "") || await getPkgProp(workshopRoot, "epicshop.initialRoute", "/");
@@ -1710,7 +1710,7 @@ async function getPlaygroundApp({
1710
1710
  timings,
1711
1711
  request
1712
1712
  } = {}) {
1713
- const playgroundDir = path.join(workshopRoot, "playground");
1713
+ const playgroundDir = path$1.join(workshopRoot, "playground");
1714
1714
  const baseAppName = await getPlaygroundAppName();
1715
1715
  const key = `playground-${baseAppName}`;
1716
1716
  const baseAppFullPath = baseAppName ? await getFullPathFromAppName(baseAppName) : null;
@@ -1722,7 +1722,7 @@ async function getPlaygroundApp({
1722
1722
  cache: playgroundAppCache,
1723
1723
  ttl: 1e3 * 60 * 60 * 24,
1724
1724
  timings,
1725
- timingKey: playgroundDir.replace(`${playgroundDir}${path.sep}`, ""),
1725
+ timingKey: playgroundDir.replace(`${playgroundDir}${path$1.sep}`, ""),
1726
1726
  request,
1727
1727
  forceFresh: forceFreshPlaygroundDir || forceFreshBaseApp,
1728
1728
  getFreshValue: async () => {
@@ -1730,11 +1730,11 @@ async function getPlaygroundApp({
1730
1730
  return null;
1731
1731
  if (!baseAppName)
1732
1732
  return null;
1733
- const dirName = path.basename(playgroundDir);
1733
+ const dirName = path$1.basename(playgroundDir);
1734
1734
  const name = getAppName(playgroundDir);
1735
1735
  const portNumber = 4e3;
1736
1736
  const [compiledReadme, test, dev] = await Promise.all([
1737
- compileMdxIfExists(path.join(playgroundDir, "README.mdx"), { request }),
1737
+ compileMdxIfExists(path$1.join(playgroundDir, "README.mdx"), { request }),
1738
1738
  getTestInfo({ fullPath: playgroundDir }),
1739
1739
  getDevInfo({ fullPath: playgroundDir, portNumber })
1740
1740
  ]);
@@ -1749,7 +1749,7 @@ async function getPlaygroundApp({
1749
1749
  isUpToDate: appModifiedTime <= playgroundAppModifiedTime,
1750
1750
  fullPath: playgroundDir,
1751
1751
  relativePath: playgroundDir.replace(
1752
- `${getWorkshopRoot()}${path.sep}`,
1752
+ `${getWorkshopRoot()}${path$1.sep}`,
1753
1753
  ""
1754
1754
  ),
1755
1755
  title: (compiledReadme == null ? void 0 : compiledReadme.title) ?? name,
@@ -1766,9 +1766,9 @@ async function getPlaygroundApp({
1766
1766
  });
1767
1767
  }
1768
1768
  async function getExampleAppFromPath(fullPath, index, request) {
1769
- const dirName = path.basename(fullPath);
1769
+ const dirName = path$1.basename(fullPath);
1770
1770
  const compiledReadme = await compileMdxIfExists(
1771
- path.join(fullPath, "README.mdx"),
1771
+ path$1.join(fullPath, "README.mdx"),
1772
1772
  { request }
1773
1773
  );
1774
1774
  const name = getAppName(fullPath);
@@ -1777,7 +1777,7 @@ async function getExampleAppFromPath(fullPath, index, request) {
1777
1777
  name,
1778
1778
  type: "example",
1779
1779
  fullPath,
1780
- relativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ""),
1780
+ relativePath: fullPath.replace(`${getWorkshopRoot()}${path$1.sep}`, ""),
1781
1781
  title: (compiledReadme == null ? void 0 : compiledReadme.title) ?? name,
1782
1782
  epicVideoEmbeds: compiledReadme == null ? void 0 : compiledReadme.epicVideoEmbeds,
1783
1783
  dirName,
@@ -1790,8 +1790,8 @@ async function getExampleApps({
1790
1790
  timings,
1791
1791
  request
1792
1792
  } = {}) {
1793
- const examplesDir = path.join(workshopRoot, "examples");
1794
- const exampleDirs = (await glob("*", { cwd: examplesDir, ignore: "node_modules/**" })).map((p) => path.join(examplesDir, p));
1793
+ const examplesDir = path$1.join(workshopRoot, "examples");
1794
+ const exampleDirs = (await glob("*", { cwd: examplesDir, ignore: "node_modules/**" })).map((p) => path$1.join(examplesDir, p));
1795
1795
  const exampleApps = [];
1796
1796
  for (const exampleDir of exampleDirs) {
1797
1797
  const index = exampleDirs.indexOf(exampleDir);
@@ -1801,7 +1801,7 @@ async function getExampleApps({
1801
1801
  cache: exampleAppCache,
1802
1802
  ttl: 1e3 * 60 * 60 * 24,
1803
1803
  timings,
1804
- timingKey: exampleDir.replace(`${examplesDir}${path.sep}`, ""),
1804
+ timingKey: exampleDir.replace(`${examplesDir}${path$1.sep}`, ""),
1805
1805
  request,
1806
1806
  forceFresh: getForceFreshForDir(exampleDir, exampleAppCache.get(key)),
1807
1807
  getFreshValue: () => getExampleAppFromPath(exampleDir, index, request).catch((error) => {
@@ -1815,8 +1815,8 @@ async function getExampleApps({
1815
1815
  return exampleApps;
1816
1816
  }
1817
1817
  async function getSolutionAppFromPath(fullPath, request) {
1818
- const dirName = path.basename(fullPath);
1819
- const parentDirName = path.basename(path.dirname(fullPath));
1818
+ const dirName = path$1.basename(fullPath);
1819
+ const parentDirName = path$1.basename(path$1.dirname(fullPath));
1820
1820
  const exerciseNumber = extractExerciseNumber(parentDirName);
1821
1821
  if (!exerciseNumber)
1822
1822
  return null;
@@ -1827,7 +1827,7 @@ async function getSolutionAppFromPath(fullPath, request) {
1827
1827
  const { stepNumber } = info;
1828
1828
  const portNumber = 7e3 + (exerciseNumber - 1) * 10 + stepNumber;
1829
1829
  const compiledReadme = await compileMdxIfExists(
1830
- path.join(fullPath, "README.mdx"),
1830
+ path$1.join(fullPath, "README.mdx"),
1831
1831
  { request }
1832
1832
  );
1833
1833
  const problemDir = await findProblemDir({
@@ -1848,7 +1848,7 @@ async function getSolutionAppFromPath(fullPath, request) {
1848
1848
  stepNumber,
1849
1849
  dirName,
1850
1850
  fullPath,
1851
- relativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ""),
1851
+ relativePath: fullPath.replace(`${getWorkshopRoot()}${path$1.sep}`, ""),
1852
1852
  instructionsCode: compiledReadme == null ? void 0 : compiledReadme.code,
1853
1853
  test,
1854
1854
  dev
@@ -1858,7 +1858,7 @@ async function getSolutionApps({
1858
1858
  timings,
1859
1859
  request
1860
1860
  } = {}) {
1861
- const exercisesDir = path.join(workshopRoot, "exercises");
1861
+ const exercisesDir = path$1.join(workshopRoot, "exercises");
1862
1862
  const solutionDirs = await getSolutionDirs();
1863
1863
  const solutionApps = [];
1864
1864
  for (const solutionDir of solutionDirs) {
@@ -1866,7 +1866,7 @@ async function getSolutionApps({
1866
1866
  key: solutionDir,
1867
1867
  cache: solutionAppCache,
1868
1868
  timings,
1869
- timingKey: solutionDir.replace(`${exercisesDir}${path.sep}`, ""),
1869
+ timingKey: solutionDir.replace(`${exercisesDir}${path$1.sep}`, ""),
1870
1870
  request,
1871
1871
  ttl: 1e3 * 60 * 60 * 24,
1872
1872
  forceFresh: getForceFreshForDir(
@@ -1884,8 +1884,8 @@ async function getSolutionApps({
1884
1884
  return solutionApps;
1885
1885
  }
1886
1886
  async function getProblemAppFromPath(fullPath, request) {
1887
- const dirName = path.basename(fullPath);
1888
- const parentDirName = path.basename(path.dirname(fullPath));
1887
+ const dirName = path$1.basename(fullPath);
1888
+ const parentDirName = path$1.basename(path$1.dirname(fullPath));
1889
1889
  const exerciseNumber = extractExerciseNumber(parentDirName);
1890
1890
  if (!exerciseNumber)
1891
1891
  return null;
@@ -1896,7 +1896,7 @@ async function getProblemAppFromPath(fullPath, request) {
1896
1896
  const { stepNumber } = info;
1897
1897
  const portNumber = 6e3 + (exerciseNumber - 1) * 10 + stepNumber;
1898
1898
  const compiledReadme = await compileMdxIfExists(
1899
- path.join(fullPath, "README.mdx"),
1899
+ path$1.join(fullPath, "README.mdx"),
1900
1900
  { request }
1901
1901
  );
1902
1902
  const solutionDir = await findSolutionDir({
@@ -1917,7 +1917,7 @@ async function getProblemAppFromPath(fullPath, request) {
1917
1917
  stepNumber,
1918
1918
  dirName,
1919
1919
  fullPath,
1920
- relativePath: fullPath.replace(`${getWorkshopRoot()}${path.sep}`, ""),
1920
+ relativePath: fullPath.replace(`${getWorkshopRoot()}${path$1.sep}`, ""),
1921
1921
  instructionsCode: compiledReadme == null ? void 0 : compiledReadme.code,
1922
1922
  test,
1923
1923
  dev
@@ -1927,7 +1927,7 @@ async function getProblemApps({
1927
1927
  timings,
1928
1928
  request
1929
1929
  } = {}) {
1930
- const exercisesDir = path.join(workshopRoot, "exercises");
1930
+ const exercisesDir = path$1.join(workshopRoot, "exercises");
1931
1931
  const problemDirs = await getProblemDirs();
1932
1932
  const problemApps = [];
1933
1933
  for (const problemDir of problemDirs) {
@@ -1935,7 +1935,7 @@ async function getProblemApps({
1935
1935
  key: problemDir,
1936
1936
  cache: problemAppCache,
1937
1937
  timings,
1938
- timingKey: problemDir.replace(`${exercisesDir}${path.sep}`, ""),
1938
+ timingKey: problemDir.replace(`${exercisesDir}${path$1.sep}`, ""),
1939
1939
  request,
1940
1940
  ttl: 1e3 * 60 * 60 * 24,
1941
1941
  forceFresh: getForceFreshForDir(
@@ -2030,8 +2030,8 @@ async function setPlayground(srcDir, { reset } = {}) {
2030
2030
  var _a2, _b2;
2031
2031
  const isIgnored = await isGitIgnored({ cwd: srcDir });
2032
2032
  const workshopRoot2 = getWorkshopRoot();
2033
- const destDir = path.join(workshopRoot2, "playground");
2034
- const playgroundFiles = path.join(destDir, "**");
2033
+ const destDir = path$1.join(workshopRoot2, "playground");
2034
+ const playgroundFiles = path$1.join(destDir, "**");
2035
2035
  (_a2 = getOptionalWatcher()) == null ? void 0 : _a2.unwatch(playgroundFiles);
2036
2036
  const playgroundApp = await getAppByName("playground");
2037
2037
  const playgroundWasRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
@@ -2041,14 +2041,13 @@ async function setPlayground(srcDir, { reset } = {}) {
2041
2041
  }
2042
2042
  const setPlaygroundTimestamp = Date.now();
2043
2043
  const preSetPlaygroundPath = await firstToExist(
2044
- path.join(srcDir, "epicshop", "pre-set-playground.js"),
2045
- path.join(workshopRoot2, "epicshop", "pre-set-playground.js")
2044
+ path$1.join(srcDir, "epicshop", "pre-set-playground.js"),
2045
+ path$1.join(workshopRoot2, "epicshop", "pre-set-playground.js")
2046
2046
  );
2047
2047
  if (preSetPlaygroundPath) {
2048
2048
  await execa("node", [preSetPlaygroundPath], {
2049
2049
  cwd: workshopRoot2,
2050
2050
  stdio: "inherit",
2051
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2052
2051
  env: {
2053
2052
  EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2054
2053
  EPICSHOP_PLAYGROUND_DEST_DIR: destDir,
@@ -2057,11 +2056,11 @@ async function setPlayground(srcDir, { reset } = {}) {
2057
2056
  }
2058
2057
  });
2059
2058
  }
2060
- const basename2 = path.basename(srcDir);
2061
- await fsExtra.remove(path.join(destDir, "node_modules"));
2059
+ const basename2 = path$1.basename(srcDir);
2060
+ await fsExtra.remove(path$1.join(destDir, "node_modules"));
2062
2061
  await fsExtra.copy(srcDir, destDir, {
2063
2062
  filter: async (srcFile, destFile) => {
2064
- if (srcFile.includes(`${basename2}${path.sep}build`) || srcFile.includes(`${basename2}${path.sep}public${path.sep}build`)) {
2063
+ if (srcFile.includes(`${basename2}${path$1.sep}build`) || srcFile.includes(`${basename2}${path$1.sep}public${path$1.sep}build`)) {
2065
2064
  return false;
2066
2065
  }
2067
2066
  if (srcFile === srcDir)
@@ -2103,22 +2102,21 @@ async function setPlayground(srcDir, { reset } = {}) {
2103
2102
  (fileName) => !srcFiles.includes(fileName)
2104
2103
  );
2105
2104
  for (const fileToDelete of filesToDelete) {
2106
- await fsExtra.remove(path.join(destDir, fileToDelete));
2105
+ await fsExtra.remove(path$1.join(destDir, fileToDelete));
2107
2106
  }
2108
2107
  const appName = getAppName(srcDir);
2109
- await fsExtra.ensureDir(path.dirname(playgroundAppNameInfoPath));
2108
+ await fsExtra.ensureDir(path$1.dirname(playgroundAppNameInfoPath));
2110
2109
  await fsExtra.writeJSON(playgroundAppNameInfoPath, { appName });
2111
2110
  const playgroundIsStillRunning = playgroundApp ? isAppRunning(playgroundApp) : false;
2112
2111
  const restartPlayground = playgroundWasRunning && !playgroundIsStillRunning;
2113
2112
  const postSetPlaygroundPath = await firstToExist(
2114
- path.join(srcDir, "epicshop", "post-set-playground.js"),
2115
- path.join(workshopRoot2, "epicshop", "post-set-playground.js")
2113
+ path$1.join(srcDir, "epicshop", "post-set-playground.js"),
2114
+ path$1.join(workshopRoot2, "epicshop", "post-set-playground.js")
2116
2115
  );
2117
2116
  if (postSetPlaygroundPath) {
2118
2117
  await execa("node", [postSetPlaygroundPath], {
2119
2118
  cwd: workshopRoot2,
2120
2119
  stdio: "inherit",
2121
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2122
2120
  env: {
2123
2121
  EPICSHOP_PLAYGROUND_TIMESTAMP: setPlaygroundTimestamp.toString(),
2124
2122
  EPICSHOP_PLAYGROUND_SRC_DIR: srcDir,
@@ -2141,7 +2139,7 @@ async function getPlaygroundAppName() {
2141
2139
  return null;
2142
2140
  }
2143
2141
  try {
2144
- const jsonString = await fs$1.promises.readFile(
2142
+ const jsonString = await fs.promises.readFile(
2145
2143
  playgroundAppNameInfoPath,
2146
2144
  "utf8"
2147
2145
  );
@@ -2155,17 +2153,17 @@ async function getPlaygroundAppName() {
2155
2153
  }
2156
2154
  async function getDirModifiedTime(dir) {
2157
2155
  const isIgnored = await isGitIgnored({ cwd: dir });
2158
- const files = await fs$1.promises.readdir(dir, { withFileTypes: true });
2156
+ const files = await fs.promises.readdir(dir, { withFileTypes: true });
2159
2157
  const modifiedTimes2 = await Promise.all(
2160
2158
  files.map(async (file) => {
2161
2159
  if (isIgnored(file.name))
2162
2160
  return 0;
2163
- const filePath = path.join(dir, file.name);
2161
+ const filePath = path$1.join(dir, file.name);
2164
2162
  if (file.isDirectory()) {
2165
2163
  return getDirModifiedTime(filePath);
2166
2164
  } else {
2167
2165
  try {
2168
- const { mtimeMs } = await fs$1.promises.stat(filePath);
2166
+ const { mtimeMs } = await fs.promises.stat(filePath);
2169
2167
  return mtimeMs;
2170
2168
  } catch {
2171
2169
  return 0;
@@ -2218,7 +2216,7 @@ function getWorkshopRoot() {
2218
2216
  async function getWorkshopInstructions({
2219
2217
  request
2220
2218
  } = {}) {
2221
- const readmeFilepath = path.join(workshopRoot, "exercises", "README.mdx");
2219
+ const readmeFilepath = path$1.join(workshopRoot, "exercises", "README.mdx");
2222
2220
  const compiled = await compileMdx(readmeFilepath, { request }).then(
2223
2221
  (r) => ({ ...r, status: "success" }),
2224
2222
  (e) => {
@@ -2235,7 +2233,7 @@ async function getWorkshopInstructions({
2235
2233
  async function getWorkshopFinished({
2236
2234
  request
2237
2235
  } = {}) {
2238
- const finishedFilepath = path.join(workshopRoot, "exercises", "FINISHED.mdx");
2236
+ const finishedFilepath = path$1.join(workshopRoot, "exercises", "FINISHED.mdx");
2239
2237
  const compiled = await compileMdx(finishedFilepath, { request }).then(
2240
2238
  (r) => ({ ...r, status: "success" }),
2241
2239
  (e) => {
@@ -2253,10 +2251,10 @@ async function getWorkshopFinished({
2253
2251
  relativePath: "exercises/finished.mdx"
2254
2252
  };
2255
2253
  }
2256
- const exercisesPath = path.join(workshopRoot, "exercises/");
2257
- const playgroundPath = path.join(workshopRoot, "playground/");
2254
+ const exercisesPath = path$1.join(workshopRoot, "exercises/");
2255
+ const playgroundPath = path$1.join(workshopRoot, "playground/");
2258
2256
  function getRelativePath$1(filePath) {
2259
- return path.normalize(filePath).replace(playgroundPath, `playground${path.sep}`).replace(exercisesPath, "");
2257
+ return path$1.normalize(filePath).replace(playgroundPath, `playground${path$1.sep}`).replace(exercisesPath, "");
2260
2258
  }
2261
2259
  z$1.object({
2262
2260
  NODE_ENV: z$1.enum(["production", "development", "test"]).default("development"),
@@ -2588,6 +2586,83 @@ function Confetti({ id }) {
2588
2586
  id
2589
2587
  ) });
2590
2588
  }
2589
+ function AnimatedBars({
2590
+ title,
2591
+ size = 16,
2592
+ ...props
2593
+ }) {
2594
+ return /* @__PURE__ */ jsxs(
2595
+ "svg",
2596
+ {
2597
+ width: size,
2598
+ height: size,
2599
+ viewBox: "0 0 16 16",
2600
+ "aria-hidden": !title,
2601
+ ...props,
2602
+ children: [
2603
+ title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
2604
+ /* @__PURE__ */ jsxs("g", { fill: "currentColor", children: [
2605
+ /* @__PURE__ */ jsxs("g", { className: "nc-loop-dots-16-icon-f", children: [
2606
+ /* @__PURE__ */ jsx("circle", { cx: "3", cy: "8", fill: "currentColor", r: "2" }),
2607
+ /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "2" }),
2608
+ /* @__PURE__ */ jsx("circle", { cx: "13", cy: "8", fill: "currentColor", r: "2" })
2609
+ ] }),
2610
+ /* @__PURE__ */ jsx("style", { children: `.nc-loop-dots-16-icon-f{--animation-duration:1s}.nc-loop-dots-16-icon-f *{opacity:.4;transform:scale(.7)}.nc-loop-dots-16-icon-f :nth-child(1),.nc-loop-dots-16-icon-f :nth-child(3){animation:nc-loop-dots-anim-2b var(--animation-duration) infinite linear}.nc-loop-dots-16-icon-f :nth-child(1){transform-origin:3px 8px}.nc-loop-dots-16-icon-f :nth-child(2){animation:nc-loop-dots-anim-1b calc(var(--animation-duration)/2) infinite linear;animation-delay:calc(var(--animation-duration)/4);transform-origin:8px 8px}.nc-loop-dots-16-icon-f :nth-child(3){animation-delay:calc(var(--animation-duration)/2);transform-origin:13px 8px}@keyframes nc-loop-dots-anim-1b{0%,100%{opacity:.4;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@keyframes nc-loop-dots-anim-2b{0%,100%,66%{opacity:.4;transform:scale(.7)}33%{opacity:1;transform:scale(1)}}` })
2611
+ ] })
2612
+ ]
2613
+ }
2614
+ );
2615
+ }
2616
+ const sizeClassName = {
2617
+ font: "w-[1em] h-[1em]",
2618
+ xs: "w-3 h-3",
2619
+ sm: "w-4 h-4",
2620
+ md: "w-5 h-5",
2621
+ lg: "w-6 h-6",
2622
+ xl: "w-7 h-7",
2623
+ "2xl": "w-8 h-8"
2624
+ };
2625
+ const childrenSizeClassName = {
2626
+ font: "gap-1.5",
2627
+ xs: "gap-1.5",
2628
+ sm: "gap-1.5",
2629
+ md: "gap-2",
2630
+ lg: "gap-2",
2631
+ xl: "gap-3",
2632
+ "2xl": "gap-4"
2633
+ };
2634
+ function Icon({
2635
+ name,
2636
+ size = "font",
2637
+ title,
2638
+ className,
2639
+ children,
2640
+ ...props
2641
+ }) {
2642
+ if (children) {
2643
+ return /* @__PURE__ */ jsxs(
2644
+ "span",
2645
+ {
2646
+ className: `inline-flex items-center ${childrenSizeClassName[size]}`,
2647
+ children: [
2648
+ /* @__PURE__ */ jsx(Icon, { name, size, className, ...props }),
2649
+ children
2650
+ ]
2651
+ }
2652
+ );
2653
+ }
2654
+ return /* @__PURE__ */ jsxs(
2655
+ "svg",
2656
+ {
2657
+ ...props,
2658
+ className: cn(sizeClassName[size], "inline self-center", className),
2659
+ children: [
2660
+ title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
2661
+ /* @__PURE__ */ jsx("use", { href: `/icons.svg#${name}`, fill: "transparent" })
2662
+ ]
2663
+ }
2664
+ );
2665
+ }
2591
2666
  const removeProseMargin = {
2592
2667
  "> ul > li > *:first-child": {
2593
2668
  marginTop: "unset"
@@ -2730,89 +2805,11 @@ const extendedTheme = {
2730
2805
  "accordion-up": "accordion-up 0.2s ease-out"
2731
2806
  }
2732
2807
  };
2733
- function AnimatedBars({
2734
- title,
2735
- size = 16,
2736
- ...props
2737
- }) {
2738
- return /* @__PURE__ */ jsxs(
2739
- "svg",
2740
- {
2741
- width: size,
2742
- height: size,
2743
- viewBox: "0 0 16 16",
2744
- "aria-hidden": !title,
2745
- ...props,
2746
- children: [
2747
- title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
2748
- /* @__PURE__ */ jsxs("g", { fill: "currentColor", children: [
2749
- /* @__PURE__ */ jsxs("g", { className: "nc-loop-dots-16-icon-f", children: [
2750
- /* @__PURE__ */ jsx("circle", { cx: "3", cy: "8", fill: "currentColor", r: "2" }),
2751
- /* @__PURE__ */ jsx("circle", { cx: "8", cy: "8", r: "2" }),
2752
- /* @__PURE__ */ jsx("circle", { cx: "13", cy: "8", fill: "currentColor", r: "2" })
2753
- ] }),
2754
- /* @__PURE__ */ jsx("style", { children: `.nc-loop-dots-16-icon-f{--animation-duration:1s}.nc-loop-dots-16-icon-f *{opacity:.4;transform:scale(.7)}.nc-loop-dots-16-icon-f :nth-child(1),.nc-loop-dots-16-icon-f :nth-child(3){animation:nc-loop-dots-anim-2b var(--animation-duration) infinite linear}.nc-loop-dots-16-icon-f :nth-child(1){transform-origin:3px 8px}.nc-loop-dots-16-icon-f :nth-child(2){animation:nc-loop-dots-anim-1b calc(var(--animation-duration)/2) infinite linear;animation-delay:calc(var(--animation-duration)/4);transform-origin:8px 8px}.nc-loop-dots-16-icon-f :nth-child(3){animation-delay:calc(var(--animation-duration)/2);transform-origin:13px 8px}@keyframes nc-loop-dots-anim-1b{0%,100%{opacity:.4;transform:scale(.7)}50%{opacity:1;transform:scale(1)}}@keyframes nc-loop-dots-anim-2b{0%,100%,66%{opacity:.4;transform:scale(.7)}33%{opacity:1;transform:scale(1)}}` })
2755
- ] })
2756
- ]
2757
- }
2758
- );
2759
- }
2760
- const sizeClassName = {
2761
- font: "w-[1em] h-[1em]",
2762
- xs: "w-3 h-3",
2763
- sm: "w-4 h-4",
2764
- md: "w-5 h-5",
2765
- lg: "w-6 h-6",
2766
- xl: "w-7 h-7",
2767
- "2xl": "w-8 h-8"
2768
- };
2769
- const childrenSizeClassName = {
2770
- font: "gap-1.5",
2771
- xs: "gap-1.5",
2772
- sm: "gap-1.5",
2773
- md: "gap-2",
2774
- lg: "gap-2",
2775
- xl: "gap-3",
2776
- "2xl": "gap-4"
2777
- };
2778
- function Icon({
2779
- name,
2780
- size = "font",
2781
- title,
2782
- className,
2783
- children,
2784
- ...props
2785
- }) {
2786
- if (children) {
2787
- return /* @__PURE__ */ jsxs(
2788
- "span",
2789
- {
2790
- className: `inline-flex items-center ${childrenSizeClassName[size]}`,
2791
- children: [
2792
- /* @__PURE__ */ jsx(Icon, { name, size, className, ...props }),
2793
- children
2794
- ]
2795
- }
2796
- );
2797
- }
2798
- return /* @__PURE__ */ jsxs(
2799
- "svg",
2800
- {
2801
- ...props,
2802
- className: cn(sizeClassName[size], "inline self-center", className),
2803
- children: [
2804
- title ? /* @__PURE__ */ jsx("title", { children: title }) : null,
2805
- /* @__PURE__ */ jsx("use", { href: `/icons.svg#${name}`, fill: "transparent" })
2806
- ]
2807
- }
2808
- );
2809
- }
2810
2808
  const AnchorOrLink = React.forwardRef(function AnchorOrLink2(props, ref) {
2811
2809
  var _a2;
2812
2810
  const {
2813
2811
  to,
2814
2812
  href,
2815
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2816
2813
  download,
2817
2814
  reload = false,
2818
2815
  prefetch,
@@ -2833,10 +2830,7 @@ const AnchorOrLink = React.forwardRef(function AnchorOrLink2(props, ref) {
2833
2830
  shouldUserRegularAnchor = Boolean((_a2 = to.pathname) == null ? void 0 : _a2.includes(":"));
2834
2831
  }
2835
2832
  if (shouldUserRegularAnchor) {
2836
- return (
2837
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2838
- /* @__PURE__ */ jsx("a", { ...rest, download, href: href ?? toUrl, ref, children })
2839
- );
2833
+ return /* @__PURE__ */ jsx("a", { ...rest, download, href: href ?? toUrl, ref, children });
2840
2834
  } else {
2841
2835
  return /* @__PURE__ */ jsx(Link, { prefetch, to: to ?? href ?? "", ...rest, ref, children });
2842
2836
  }
@@ -3091,20 +3085,6 @@ function SimpleTooltip({
3091
3085
  /* @__PURE__ */ jsx(TooltipContent, { children: content })
3092
3086
  ] });
3093
3087
  }
3094
- const cookieName$1 = "EpicShop_theme";
3095
- function getTheme(request) {
3096
- const cookieHeader = request.headers.get("cookie");
3097
- const parsed = cookieHeader ? cookie.parse(cookieHeader)[cookieName$1] : null;
3098
- if (parsed === "light" || parsed === "dark")
3099
- return parsed;
3100
- return null;
3101
- }
3102
- function setTheme(theme) {
3103
- return cookie.serialize(cookieName$1, theme, {
3104
- path: "/",
3105
- maxAge: theme === "system" ? 0 : 60 * 60 * 365 * 100
3106
- });
3107
- }
3108
3088
  function useRequestInfo() {
3109
3089
  const data = useRouteLoaderData("root");
3110
3090
  return data.requestInfo;
@@ -3159,6 +3139,20 @@ function ErrorList({
3159
3139
  return null;
3160
3140
  return /* @__PURE__ */ jsx("ul", { id, className: "space-y-1", children: errorsToRender.map((e) => /* @__PURE__ */ jsx("li", { className: "text-danger text-[10px]", children: e }, e)) });
3161
3141
  }
3142
+ const cookieName$1 = "EpicShop_theme";
3143
+ function getTheme(request) {
3144
+ const cookieHeader = request.headers.get("cookie");
3145
+ const parsed = cookieHeader ? cookie.parse(cookieHeader)[cookieName$1] : null;
3146
+ if (parsed === "light" || parsed === "dark")
3147
+ return parsed;
3148
+ return null;
3149
+ }
3150
+ function setTheme(theme) {
3151
+ return cookie.serialize(cookieName$1, theme, {
3152
+ path: "/",
3153
+ maxAge: theme === "system" ? 0 : 60 * 60 * 365 * 100
3154
+ });
3155
+ }
3162
3156
  const ROUTE_PATH = "/theme";
3163
3157
  const ThemeFormSchema = z$1.object({
3164
3158
  redirectTo: z$1.string().optional(),
@@ -4040,6 +4034,23 @@ const route1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
4040
4034
  default: NotFound,
4041
4035
  loader: loader$q
4042
4036
  }, Symbol.toStringTag, { value: "Module" }));
4037
+ function useOptionalUser() {
4038
+ const data = useRouteLoaderData("root");
4039
+ return data == null ? void 0 : data.user;
4040
+ }
4041
+ function useUser() {
4042
+ const user = useOptionalUser();
4043
+ if (!user) {
4044
+ throw new Error(
4045
+ "useUser requires a user. If the user is optional, use useOptionalUser instead."
4046
+ );
4047
+ }
4048
+ return user;
4049
+ }
4050
+ function useOptionalDiscordMember() {
4051
+ const data = useRouteLoaderData("root");
4052
+ return data == null ? void 0 : data.discordMember;
4053
+ }
4043
4054
  function useEpicProgress() {
4044
4055
  const data = useRouteLoaderData("root");
4045
4056
  const progressFetcher = useFetchers().find(
@@ -4342,23 +4353,6 @@ const route30 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
4342
4353
  useProgressItemClassName,
4343
4354
  useRequireEpicProgress
4344
4355
  }, Symbol.toStringTag, { value: "Module" }));
4345
- function useOptionalUser() {
4346
- const data = useRouteLoaderData("root");
4347
- return data == null ? void 0 : data.user;
4348
- }
4349
- function useUser() {
4350
- const user = useOptionalUser();
4351
- if (!user) {
4352
- throw new Error(
4353
- "useUser requires a user. If the user is optional, use useOptionalUser instead."
4354
- );
4355
- }
4356
- return user;
4357
- }
4358
- function useOptionalDiscordMember() {
4359
- const data = useRouteLoaderData("root");
4360
- return data == null ? void 0 : data.discordMember;
4361
- }
4362
4356
  async function loader$p({ request }) {
4363
4357
  var _a2;
4364
4358
  const timings = makeTimings("stepLoader");
@@ -5066,56 +5060,6 @@ const route3 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
5066
5060
  __proto__: null,
5067
5061
  default: ExercisesLayout
5068
5062
  }, Symbol.toStringTag, { value: "Module" }));
5069
- function Loading({
5070
- children = "Loading"
5071
- }) {
5072
- const { reducedMotion } = useHints();
5073
- if (reducedMotion === "reduce") {
5074
- return /* @__PURE__ */ jsx("div", { className: "animate-pulse", children });
5075
- }
5076
- return /* @__PURE__ */ jsxs(
5077
- "div",
5078
- {
5079
- className: "flex items-center gap-2 font-mono text-sm font-medium uppercase",
5080
- role: "status",
5081
- children: [
5082
- /* @__PURE__ */ jsx("div", { "aria-hidden": "true", children: /* @__PURE__ */ jsx(Characters, {}) }),
5083
- children,
5084
- /* @__PURE__ */ jsx("div", { "aria-hidden": "true", children: /* @__PURE__ */ jsx(Characters, {}) })
5085
- ]
5086
- }
5087
- );
5088
- }
5089
- const characters = "█<▓█ ▒░/▒░ █░>▒▓/ █▒▒ ▓▒▓/█<░▒ ▓/░>";
5090
- const randomCharacter = () => characters[Math.floor(Math.random() * characters.length)];
5091
- function Characters() {
5092
- const [char1, setChar1] = useState(characters[0]);
5093
- const [char2, setChar2] = useState(characters[1]);
5094
- useInterval(() => {
5095
- setChar1(randomCharacter());
5096
- setChar2(randomCharacter());
5097
- }, 80);
5098
- return /* @__PURE__ */ jsxs("span", { children: [
5099
- char1,
5100
- char2
5101
- ] });
5102
- }
5103
- function useInterval(callback, delay = 1e3) {
5104
- const savedCallback = useRef(null);
5105
- useEffect(() => {
5106
- savedCallback.current = callback;
5107
- }, [callback]);
5108
- useEffect(() => {
5109
- function tick() {
5110
- var _a2;
5111
- (_a2 = savedCallback.current) == null ? void 0 : _a2.call(savedCallback);
5112
- }
5113
- if (delay !== null) {
5114
- const id = setInterval(tick, delay);
5115
- return () => clearInterval(id);
5116
- }
5117
- }, [delay]);
5118
- }
5119
5063
  const PlaybackTimeSchema = z$1.object({
5120
5064
  time: z$1.number(),
5121
5065
  expiresAt: z$1.string()
@@ -5327,6 +5271,56 @@ const route36 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
5327
5271
  action: action$a,
5328
5272
  usePlayerPreferences
5329
5273
  }, Symbol.toStringTag, { value: "Module" }));
5274
+ function Loading({
5275
+ children = "Loading"
5276
+ }) {
5277
+ const { reducedMotion } = useHints();
5278
+ if (reducedMotion === "reduce") {
5279
+ return /* @__PURE__ */ jsx("div", { className: "animate-pulse", children });
5280
+ }
5281
+ return /* @__PURE__ */ jsxs(
5282
+ "div",
5283
+ {
5284
+ className: "flex items-center gap-2 font-mono text-sm font-medium uppercase",
5285
+ role: "status",
5286
+ children: [
5287
+ /* @__PURE__ */ jsx("div", { "aria-hidden": "true", children: /* @__PURE__ */ jsx(Characters, {}) }),
5288
+ children,
5289
+ /* @__PURE__ */ jsx("div", { "aria-hidden": "true", children: /* @__PURE__ */ jsx(Characters, {}) })
5290
+ ]
5291
+ }
5292
+ );
5293
+ }
5294
+ const characters = "█<▓█ ▒░/▒░ █░>▒▓/ █▒▒ ▓▒▓/█<░▒ ▓/░>";
5295
+ const randomCharacter = () => characters[Math.floor(Math.random() * characters.length)];
5296
+ function Characters() {
5297
+ const [char1, setChar1] = useState(characters[0]);
5298
+ const [char2, setChar2] = useState(characters[1]);
5299
+ useInterval(() => {
5300
+ setChar1(randomCharacter());
5301
+ setChar2(randomCharacter());
5302
+ }, 80);
5303
+ return /* @__PURE__ */ jsxs("span", { children: [
5304
+ char1,
5305
+ char2
5306
+ ] });
5307
+ }
5308
+ function useInterval(callback, delay = 1e3) {
5309
+ const savedCallback = useRef(null);
5310
+ useEffect(() => {
5311
+ savedCallback.current = callback;
5312
+ }, [callback]);
5313
+ useEffect(() => {
5314
+ function tick() {
5315
+ var _a2;
5316
+ (_a2 = savedCallback.current) == null ? void 0 : _a2.call(savedCallback);
5317
+ }
5318
+ if (delay !== null) {
5319
+ const id = setInterval(tick, delay);
5320
+ return () => clearInterval(id);
5321
+ }
5322
+ }, [delay]);
5323
+ }
5330
5324
  const EpicVideoInfoContext = React.createContext(null);
5331
5325
  function EpicVideoInfoProvider({
5332
5326
  children,
@@ -5953,7 +5947,7 @@ function guessEditor() {
5953
5947
  }
5954
5948
  }
5955
5949
  }
5956
- } catch (error) {
5950
+ } catch {
5957
5951
  }
5958
5952
  if (process.env.VISUAL) {
5959
5953
  return [process.env.VISUAL];
@@ -6463,7 +6457,6 @@ function PreWithButtons({ children, ...props }) {
6463
6457
  ...props,
6464
6458
  className: clsx(
6465
6459
  "scrollbar-thin scrollbar-thumb-scrollbar",
6466
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
6467
6460
  props.className ?? ""
6468
6461
  ),
6469
6462
  ...updateFilename(),
@@ -6489,7 +6482,6 @@ const mdxComponents$5 = {
6489
6482
  ...props,
6490
6483
  className: clsx(
6491
6484
  "scrollbar-thin scrollbar-thumb-scrollbar",
6492
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
6493
6485
  props.className ?? ""
6494
6486
  )
6495
6487
  }
@@ -6756,98 +6748,344 @@ const route5 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
6756
6748
  headers: headers$5,
6757
6749
  loader: loader$n
6758
6750
  }, Symbol.toStringTag, { value: "Module" }));
6759
- const EmojiDataSchema = z$1.union([
6760
- z$1.object({
6761
- emojiName: z$1.never().optional(),
6762
- emojiUrl: z$1.string()
6763
- }),
6764
- z$1.object({
6765
- emojiName: z$1.string(),
6766
- emojiUrl: z$1.never().optional()
6767
- }),
6768
- z$1.object({
6769
- emojiName: z$1.never().optional(),
6770
- emojiUrl: z$1.never().optional()
6771
- })
6772
- ]);
6773
- const ThreadItemSchema = z$1.object({
6774
- id: z$1.string(),
6775
- tags: z$1.array(
6776
- z$1.object({
6777
- name: z$1.string()
6778
- }).and(EmojiDataSchema)
6779
- ),
6780
- name: z$1.string(),
6781
- link: z$1.string(),
6782
- authorDisplayName: z$1.string(),
6783
- authorHexAccentColor: z$1.string().nullable().optional(),
6784
- authorAvatarUrl: z$1.string().nullable(),
6785
- messagePreview: z$1.string(),
6786
- messageCount: z$1.number(),
6787
- lastUpdated: z$1.string(),
6788
- previewImageUrl: z$1.string().nullable(),
6789
- reactions: z$1.array(
6790
- z$1.object({
6791
- count: z$1.number()
6792
- }).and(EmojiDataSchema)
6751
+ const AccordionComponent = ({
6752
+ title,
6753
+ children,
6754
+ variant,
6755
+ icon,
6756
+ forceMount = false
6757
+ }) => {
6758
+ const getVariantIcon = () => {
6759
+ switch (variant) {
6760
+ case "changed":
6761
+ return /* @__PURE__ */ jsx(
6762
+ Icon,
6763
+ {
6764
+ name: "Modified",
6765
+ "aria-label": "Modified",
6766
+ className: "text-[#fb923c]"
6767
+ }
6768
+ );
6769
+ case "renamed":
6770
+ return /* @__PURE__ */ jsx(
6771
+ Icon,
6772
+ {
6773
+ name: "Renamed",
6774
+ "aria-label": "Renamed",
6775
+ className: "text-[#fb923c]"
6776
+ }
6777
+ );
6778
+ case "added":
6779
+ return /* @__PURE__ */ jsx(Icon, { name: "Added", "aria-label": "Added", className: "text-[#10b981]" });
6780
+ case "deleted":
6781
+ return /* @__PURE__ */ jsx(
6782
+ Icon,
6783
+ {
6784
+ name: "Deleted",
6785
+ "aria-label": "Deleted",
6786
+ className: "text-[#ef4444]"
6787
+ }
6788
+ );
6789
+ default:
6790
+ return /* @__PURE__ */ jsx(
6791
+ Icon,
6792
+ {
6793
+ name: "Modified",
6794
+ "aria-label": "Modified",
6795
+ className: "text-[#fb923c]"
6796
+ }
6797
+ );
6798
+ }
6799
+ };
6800
+ const getVariantLabel = () => {
6801
+ switch (variant) {
6802
+ case "changed":
6803
+ return "modified";
6804
+ default:
6805
+ return variant;
6806
+ }
6807
+ };
6808
+ const fixedTitle = title.replace(/\\\\/g, "\\");
6809
+ return /* @__PURE__ */ jsxs(Accordion.Item, { value: title, children: [
6810
+ /* @__PURE__ */ jsxs(AccordionTrigger, { variant: getVariantLabel(), children: [
6811
+ icon ? icon : getVariantIcon(),
6812
+ " ",
6813
+ fixedTitle
6814
+ ] }),
6815
+ /* @__PURE__ */ jsx(
6816
+ AccordionContent,
6817
+ {
6818
+ forceMount,
6819
+ className: clsx(
6820
+ "prose max-w-none whitespace-pre-wrap dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none",
6821
+ {
6822
+ "radix-state-closed:hidden": forceMount
6823
+ }
6824
+ ),
6825
+ children
6826
+ }
6827
+ )
6828
+ ] });
6829
+ };
6830
+ const AccordionTrigger = React.forwardRef(
6831
+ ({ children, className, variant, ...props }, forwardedRef) => /* @__PURE__ */ jsx(Accordion.Header, { className: "flex", asChild: true, children: /* @__PURE__ */ jsxs(
6832
+ Accordion.Trigger,
6833
+ {
6834
+ className: clsx(
6835
+ "group flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm font-medium leading-none hover:bg-foreground/20",
6836
+ className
6837
+ ),
6838
+ ...props,
6839
+ ref: forwardedRef,
6840
+ children: [
6841
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children }),
6842
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
6843
+ /* @__PURE__ */ jsx("span", { className: "font-mono text-xs font-normal uppercase text-muted-foreground", children: variant }),
6844
+ /* @__PURE__ */ jsx(
6845
+ Icon,
6846
+ {
6847
+ name: "TriangleDownSmall",
6848
+ className: "transition group-radix-state-open:rotate-180",
6849
+ "aria-hidden": true
6850
+ }
6851
+ )
6852
+ ] })
6853
+ ]
6854
+ }
6855
+ ) })
6856
+ );
6857
+ const AccordionContent = React.forwardRef(
6858
+ ({ children, className, ...props }, forwardedRef) => /* @__PURE__ */ jsx(
6859
+ Accordion.Content,
6860
+ {
6861
+ className: clsx("", className),
6862
+ ...props,
6863
+ ref: forwardedRef,
6864
+ children: /* @__PURE__ */ jsx("div", { children })
6865
+ }
6793
6866
  )
6794
- });
6795
- const ThreadDataSchema = z$1.array(ThreadItemSchema);
6796
- const EpicForumResponseSchema = z$1.object({
6797
- status: z$1.literal("error"),
6798
- error: z$1.string()
6799
- }).or(
6800
- z$1.object({
6801
- status: z$1.literal("success"),
6802
- threadData: ThreadDataSchema
6803
- })
6804
6867
  );
6805
- async function fetchDiscordPosts({ request }) {
6806
- return cachified({
6807
- key: "fetchDiscordPosts",
6808
- request,
6809
- cache: fsCache,
6810
- ttl: 1e3 * 60 * 2,
6811
- swr: 1e3 * 60 * 60 * 24 * 7,
6812
- checkValue: ThreadDataSchema,
6813
- async getFreshValue() {
6814
- const forceFresh = await shouldForceFresh({ request });
6815
- const searchParams = new URLSearchParams(
6816
- forceFresh ? { fresh: "true" } : {}
6817
- );
6818
- const result = await fetch(
6819
- // `http://localhost:3000/resources/epic-web-forum?${searchParams}`,
6820
- `https://kcd-discord-bot-v2.fly.dev/resources/epic-web-forum?${searchParams}`,
6868
+ const pre = (props) => /* @__PURE__ */ jsx("pre", { ...props });
6869
+ const mdxComponents$3 = {
6870
+ Accordion: AccordionComponent,
6871
+ // override the pre-with-buttons
6872
+ pre
6873
+ };
6874
+ function Diff({
6875
+ diff,
6876
+ allApps
6877
+ }) {
6878
+ const submit = useSubmit();
6879
+ const [params] = useSearchParams();
6880
+ const paramsWithForcedRefresh = new URLSearchParams(params);
6881
+ paramsWithForcedRefresh.set("forceFresh", "diff");
6882
+ const navigation = useNavigation();
6883
+ const spinnerNavigating = useSpinDelay(navigation.state !== "idle", {
6884
+ delay: 0,
6885
+ minDuration: 1e3
6886
+ });
6887
+ const hiddenInputs = [];
6888
+ for (const [key, value] of params.entries()) {
6889
+ if (key === "app1" || key === "app2")
6890
+ continue;
6891
+ hiddenInputs.push(
6892
+ /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
6893
+ );
6894
+ }
6895
+ return /* @__PURE__ */ jsx(
6896
+ Suspense,
6897
+ {
6898
+ fallback: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "Loading diff", children: /* @__PURE__ */ jsx(Icon, { name: "Refresh", className: "animate-spin" }) }) }),
6899
+ children: /* @__PURE__ */ jsx(
6900
+ Await,
6821
6901
  {
6822
- method: "POST",
6823
- headers: { "content-type": "application/json" }
6824
- }
6825
- );
6826
- if (!result.ok) {
6827
- console.error(`There was an error communicating with discord`);
6828
- try {
6829
- console.error(await result.text());
6830
- } catch {
6902
+ resolve: diff,
6903
+ errorElement: /* @__PURE__ */ jsx("p", { className: "p-6 text-foreground-danger", children: "There was an error calculating the diff. Sorry." }),
6904
+ children: (diff2) => /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col", children: [
6905
+ /* @__PURE__ */ jsxs("div", { className: "flex h-14 min-h-14 w-full overflow-x-hidden border-b", children: [
6906
+ /* @__PURE__ */ jsx("div", { className: "border-r", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "Reload diff", children: /* @__PURE__ */ jsx(
6907
+ Link,
6908
+ {
6909
+ to: `.?${paramsWithForcedRefresh}`,
6910
+ className: "flex h-full w-14 items-center justify-center",
6911
+ children: /* @__PURE__ */ jsx(
6912
+ Icon,
6913
+ {
6914
+ name: "Refresh",
6915
+ className: cn({ "animate-spin": spinnerNavigating })
6916
+ }
6917
+ )
6918
+ }
6919
+ ) }) }),
6920
+ /* @__PURE__ */ jsxs(
6921
+ Form,
6922
+ {
6923
+ onChange: (e) => submit(e.currentTarget),
6924
+ className: "flex h-full flex-1 items-center overflow-x-auto scrollbar-thin scrollbar-thumb-scrollbar",
6925
+ children: [
6926
+ hiddenInputs,
6927
+ /* @__PURE__ */ jsx(
6928
+ SelectFileToDiff,
6929
+ {
6930
+ name: "app1",
6931
+ label: "App 1",
6932
+ className: "border-r",
6933
+ allApps,
6934
+ defaultValue: diff2.app1
6935
+ }
6936
+ ),
6937
+ /* @__PURE__ */ jsx(
6938
+ SelectFileToDiff,
6939
+ {
6940
+ name: "app2",
6941
+ label: "App 2",
6942
+ allApps,
6943
+ defaultValue: diff2.app2
6944
+ }
6945
+ )
6946
+ ]
6947
+ },
6948
+ `${diff2.app1}${diff2.app2}`
6949
+ )
6950
+ ] }),
6951
+ /* @__PURE__ */ jsx("div", { className: "flex-grow overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar", children: diff2.diffCode ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Accordion.Root, { className: "w-full", type: "multiple", children: /* @__PURE__ */ jsx(Mdx, { code: diff2.diffCode, components: mdxComponents$3 }) }) }) : diff2.app1 && diff2.app2 ? /* @__PURE__ */ jsx("p", { className: "m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background", children: "There was a problem generating the diff" }) : /* @__PURE__ */ jsx("p", { className: "m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background", children: "Select two apps to compare" }) })
6952
+ ] })
6831
6953
  }
6832
- return [];
6954
+ )
6955
+ }
6956
+ );
6957
+ }
6958
+ function SelectFileToDiff({
6959
+ name,
6960
+ label,
6961
+ className,
6962
+ allApps,
6963
+ defaultValue
6964
+ }) {
6965
+ return /* @__PURE__ */ jsxs(Select.Root, { name, defaultValue, children: [
6966
+ /* @__PURE__ */ jsxs(
6967
+ Select.Trigger,
6968
+ {
6969
+ className: clsx(
6970
+ "flex h-full w-full max-w-[50%] items-center justify-between px-3 text-left radix-placeholder:text-gray-500 focus-visible:outline-none",
6971
+ className
6972
+ ),
6973
+ "aria-label": `Select ${label} for git Diff`,
6974
+ children: [
6975
+ /* @__PURE__ */ jsxs("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: [
6976
+ label,
6977
+ ": ",
6978
+ " ",
6979
+ /* @__PURE__ */ jsx(
6980
+ SelectValue,
6981
+ {
6982
+ placeholder: `Select ${label}`,
6983
+ className: "inline-block w-40 text-ellipsis"
6984
+ }
6985
+ )
6986
+ ] }),
6987
+ /* @__PURE__ */ jsx(Select.Icon, { className: "", children: /* @__PURE__ */ jsx(Icon, { name: "TriangleDownSmall" }) })
6988
+ ]
6833
6989
  }
6834
- const jsonResult = await result.json();
6835
- const epicForumResponseResult = EpicForumResponseSchema.safeParse(jsonResult);
6836
- if (epicForumResponseResult.success) {
6837
- if (epicForumResponseResult.data.status === "error") {
6838
- console.error(`There was an error communicating with discord`);
6839
- console.error(epicForumResponseResult.data.error);
6840
- return [];
6841
- } else {
6842
- return epicForumResponseResult.data.threadData;
6843
- }
6844
- } else {
6845
- console.error(`There was an error parsing the discord response`);
6846
- console.error(epicForumResponseResult.error.flatten());
6847
- return [];
6990
+ ),
6991
+ /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(
6992
+ Select.Content,
6993
+ {
6994
+ position: "popper",
6995
+ align: "start",
6996
+ className: "z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",
6997
+ children: [
6998
+ /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
6999
+ /* @__PURE__ */ jsx(Select.Viewport, { className: "p-3", children: /* @__PURE__ */ jsxs(Select.Group, { children: [
7000
+ /* @__PURE__ */ jsx(Select.Label, { className: "px-5 pb-3 font-mono uppercase", children: label }),
7001
+ allApps.map((app) => {
7002
+ return /* @__PURE__ */ jsx(SelectItem$1, { value: app.name, children: app.displayName }, app.name);
7003
+ })
7004
+ ] }) }),
7005
+ /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
7006
+ ]
6848
7007
  }
6849
- }
6850
- });
7008
+ ) })
7009
+ ] });
7010
+ }
7011
+ const SelectItem$1 = React__default.forwardRef(
7012
+ ({ children, className, ...props }, forwardedRef) => {
7013
+ return /* @__PURE__ */ jsxs(
7014
+ Select.Item,
7015
+ {
7016
+ className: clsx(
7017
+ "relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",
7018
+ className
7019
+ ),
7020
+ ...props,
7021
+ ref: forwardedRef,
7022
+ children: [
7023
+ /* @__PURE__ */ jsx(Select.ItemText, { children }),
7024
+ /* @__PURE__ */ jsx(Select.ItemIndicator, { className: "absolute left-0 inline-flex w-[25px] items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "CheckSmall" }) })
7025
+ ]
7026
+ }
7027
+ );
7028
+ }
7029
+ );
7030
+ const SelectValue = React__default.forwardRef(
7031
+ ({ children, className, ...props }, forwardedRef) => {
7032
+ return /* @__PURE__ */ jsx(Select.Value, { ...props, ref: forwardedRef, children: props.value });
7033
+ }
7034
+ );
7035
+ function NavChevrons({
7036
+ prev,
7037
+ next
7038
+ }) {
7039
+ return /* @__PURE__ */ jsxs("div", { className: "relative flex h-full overflow-hidden", children: [
7040
+ prev ? /* @__PURE__ */ jsx(
7041
+ Link,
7042
+ {
7043
+ prefetch: "intent",
7044
+ ...prev,
7045
+ className: "group flex h-full items-center justify-center border-l px-7",
7046
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
7047
+ /* @__PURE__ */ jsx(
7048
+ Icon,
7049
+ {
7050
+ name: "ChevronLeft",
7051
+ className: "absolute opacity-100 transition duration-300 ease-in-out group-hover:translate-y-10 group-hover:opacity-0"
7052
+ }
7053
+ ),
7054
+ /* @__PURE__ */ jsx(
7055
+ Icon,
7056
+ {
7057
+ name: "ChevronLeft",
7058
+ className: "absolute -translate-y-10 opacity-0 transition duration-300 ease-in-out group-hover:translate-y-0 group-hover:opacity-100"
7059
+ }
7060
+ )
7061
+ ] })
7062
+ }
7063
+ ) : null,
7064
+ next ? /* @__PURE__ */ jsx(
7065
+ Link,
7066
+ {
7067
+ prefetch: "intent",
7068
+ ...next,
7069
+ className: "group flex h-full items-center justify-center border-l px-7",
7070
+ children: /* @__PURE__ */ jsxs(Fragment, { children: [
7071
+ /* @__PURE__ */ jsx(
7072
+ Icon,
7073
+ {
7074
+ name: "ChevronRight",
7075
+ className: "absolute opacity-100 transition duration-300 ease-in-out group-hover:translate-y-10 group-hover:opacity-0"
7076
+ }
7077
+ ),
7078
+ /* @__PURE__ */ jsx(
7079
+ Icon,
7080
+ {
7081
+ name: "ChevronRight",
7082
+ className: "absolute -translate-y-10 opacity-0 transition duration-300 ease-in-out group-hover:translate-y-0 group-hover:opacity-100"
7083
+ }
7084
+ )
7085
+ ] })
7086
+ }
7087
+ ) : null
7088
+ ] });
6851
7089
  }
6852
7090
  const port = process.env.PORT || "5639";
6853
7091
  const scope = "guilds.join identify messages.read";
@@ -6929,253 +7167,6 @@ const route24 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
6929
7167
  getDiscordAuthURL,
6930
7168
  loader: loader$m
6931
7169
  }, Symbol.toStringTag, { value: "Module" }));
6932
- async function loader$l() {
6933
- return json({ discordAuthUrl: getDiscordAuthURL() });
6934
- }
6935
- function useDiscordCTALink({
6936
- discordAuthUrl
6937
- }) {
6938
- const user = useOptionalUser();
6939
- const discordMember = useOptionalDiscordMember();
6940
- if (!user) {
6941
- return "/login";
6942
- }
6943
- if (!discordMember) {
6944
- return discordAuthUrl;
6945
- }
6946
- return "https://discord.com/channels/715220730605731931/1161045224907341972";
6947
- }
6948
- function DiscordCTA({ discordAuthUrl }) {
6949
- const user = useOptionalUser();
6950
- const discordMember = useOptionalDiscordMember();
6951
- if (!user) {
6952
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
6953
- /* @__PURE__ */ jsxs(Link, { to: "/login", className: "inline-flex items-center gap-2 underline", children: [
6954
- /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
6955
- "Login"
6956
- ] }),
6957
- " ",
6958
- /* @__PURE__ */ jsxs("span", { children: [
6959
- "to get access to the exclusive",
6960
- " ",
6961
- /* @__PURE__ */ jsx(Link, { to: "/discord", className: "underline", children: "discord channel" }),
6962
- "."
6963
- ] })
6964
- ] });
6965
- }
6966
- if (!discordMember) {
6967
- return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
6968
- /* @__PURE__ */ jsxs(Link, { to: discordAuthUrl, className: "flex items-center gap-2 underline", children: [
6969
- /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
6970
- "Connect Discord"
6971
- ] }),
6972
- " ",
6973
- /* @__PURE__ */ jsxs("span", { children: [
6974
- "to get access to the exclusive",
6975
- " ",
6976
- /* @__PURE__ */ jsx(Link, { to: "/discord", className: "underline", children: "discord channel" }),
6977
- "."
6978
- ] })
6979
- ] });
6980
- }
6981
- return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2 text-xl underline", children: [
6982
- /* @__PURE__ */ jsx(Link, { to: "discord://discord.com/channels/715220730605731931/1161045224907341972", children: /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }) }),
6983
- /* @__PURE__ */ jsx(
6984
- Link,
6985
- {
6986
- to: "https://discord.com/channels/715220730605731931/1161045224907341972",
6987
- target: "_blank",
6988
- rel: "noreferrer noopener",
6989
- children: "Open Discord"
6990
- }
6991
- )
6992
- ] });
6993
- }
6994
- function DiscordRoute() {
6995
- const data = useLoaderData();
6996
- return /* @__PURE__ */ jsxs("div", { className: "container flex h-full max-w-3xl flex-col items-center justify-center gap-4 p-12", children: [
6997
- /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }),
6998
- /* @__PURE__ */ jsxs("p", { children: [
6999
- "The",
7000
- " ",
7001
- /* @__PURE__ */ jsx(
7002
- Link,
7003
- {
7004
- target: "_blank",
7005
- rel: "noreferrer noopener",
7006
- className: "underline",
7007
- to: "https://kentcdodds.com/discord",
7008
- children: "Epic Web Community on Discord"
7009
- }
7010
- ),
7011
- " ",
7012
- "is a great place to hang out with other developers who are working through this workshop. You can ask questions, get help, and solidify what you're learning by helping others."
7013
- ] }),
7014
- /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsxs("small", { className: "text-sm", children: [
7015
- "If you've not joined the Epic Web Community on Discord yet, you'll be required to go through a short onboarding process first. A friendly bot will explain the process when you",
7016
- " ",
7017
- /* @__PURE__ */ jsx(
7018
- Link,
7019
- {
7020
- to: "https://kcd.im/discord",
7021
- target: "_blank",
7022
- rel: "noreferrer noopener",
7023
- className: "underline",
7024
- children: "join"
7025
- }
7026
- ),
7027
- "."
7028
- ] }) })
7029
- ] });
7030
- }
7031
- const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7032
- __proto__: null,
7033
- DiscordCTA,
7034
- default: DiscordRoute,
7035
- loader: loader$l,
7036
- useDiscordCTALink
7037
- }, Symbol.toStringTag, { value: "Module" }));
7038
- function DiscordChat() {
7039
- const data = useLoaderData();
7040
- return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col gap-4 pt-4", children: [
7041
- /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }) }),
7042
- /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar", children: /* @__PURE__ */ jsx(DiscordPosts, {}) })
7043
- ] });
7044
- }
7045
- function DiscordPosts() {
7046
- const data = useLoaderData();
7047
- const ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl });
7048
- const altDown = useAltDown();
7049
- return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-between", children: [
7050
- /* @__PURE__ */ jsx(
7051
- React.Suspense,
7052
- {
7053
- fallback: /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col items-center justify-center", children: /* @__PURE__ */ jsx(Loading, { children: "Loading Discord Posts" }) }),
7054
- children: /* @__PURE__ */ jsx(
7055
- Await,
7056
- {
7057
- resolve: data.discordPostsPromise,
7058
- errorElement: /* @__PURE__ */ jsx("div", { className: "text-red-500", children: "There was a problem loading the discord posts" }),
7059
- children: (posts) => /* @__PURE__ */ jsx("ul", { className: "flex w-full flex-col gap-4 p-3 xl:p-12", children: posts.map((post) => /* @__PURE__ */ jsx(
7060
- "li",
7061
- {
7062
- className: "rounded-xl border bg-background transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg",
7063
- children: /* @__PURE__ */ jsx(DiscordPost, { thread: post })
7064
- },
7065
- post.id
7066
- )) })
7067
- }
7068
- )
7069
- }
7070
- ),
7071
- /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(
7072
- Link,
7073
- {
7074
- to: altDown && !ctaLink.includes("oauth") ? ctaLink.replace(/^https/, "discord") : ctaLink,
7075
- target: ctaLink.includes("oauth") ? void 0 : "_blank",
7076
- rel: "noreferrer noopener",
7077
- onClick: altDown ? (e) => {
7078
- e.preventDefault();
7079
- window.open(
7080
- e.currentTarget.href,
7081
- "_blank",
7082
- "noreferrer noopener"
7083
- );
7084
- } : void 0,
7085
- className: "flex items-center gap-2 p-2 text-xl hover:underline",
7086
- children: [
7087
- "Create Post ",
7088
- /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" })
7089
- ]
7090
- }
7091
- ) })
7092
- ] });
7093
- }
7094
- function DiscordPost({ thread }) {
7095
- const reactionsWithCounts = thread.reactions.filter((r) => r.count);
7096
- const hints = useHints();
7097
- return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 p-4", children: [
7098
- /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
7099
- /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
7100
- thread.tags.length ? /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: thread.tags.map((t) => /* @__PURE__ */ jsxs(
7101
- "div",
7102
- {
7103
- className: "flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm",
7104
- children: [
7105
- /* @__PURE__ */ jsx("span", { className: "h-3 w-3 leading-3", children: /* @__PURE__ */ jsx(Emoji, { name: t.emojiName, url: t.emojiUrl }) }),
7106
- /* @__PURE__ */ jsx("span", { children: t.name })
7107
- ]
7108
- },
7109
- t.name
7110
- )) }) : null,
7111
- /* @__PURE__ */ jsx("strong", { className: "text-xl font-bold", children: thread.name }),
7112
- /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1", children: [
7113
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
7114
- thread.authorAvatarUrl ? /* @__PURE__ */ jsx(
7115
- "img",
7116
- {
7117
- src: thread.authorAvatarUrl,
7118
- alt: "",
7119
- className: "h-6 w-6 rounded-full"
7120
- }
7121
- ) : null,
7122
- /* @__PURE__ */ jsxs("span", { children: [
7123
- /* @__PURE__ */ jsx(
7124
- "span",
7125
- {
7126
- className: "font-bold",
7127
- style: thread.authorHexAccentColor ? { color: thread.authorHexAccentColor } : {},
7128
- children: thread.authorDisplayName
7129
- }
7130
- ),
7131
- ":",
7132
- " "
7133
- ] })
7134
- ] }),
7135
- /* @__PURE__ */ jsx("span", { className: "flex-1 overflow-ellipsis text-muted-foreground", children: thread.messagePreview })
7136
- ] })
7137
- ] }),
7138
- thread.previewImageUrl ? /* @__PURE__ */ jsx(
7139
- "img",
7140
- {
7141
- src: thread.previewImageUrl,
7142
- alt: "",
7143
- className: "h-28 w-28 rounded-lg object-cover"
7144
- }
7145
- ) : null
7146
- ] }),
7147
- /* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
7148
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
7149
- /* @__PURE__ */ jsx("span", { children: reactionsWithCounts.length ? /* @__PURE__ */ jsx("ul", { className: "flex items-center gap-2", children: reactionsWithCounts.map((r, i) => /* @__PURE__ */ jsxs(
7150
- "li",
7151
- {
7152
- className: "flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm",
7153
- children: [
7154
- /* @__PURE__ */ jsx("span", { className: "h-3 w-3 leading-3", children: /* @__PURE__ */ jsx(Emoji, { name: r.emojiName, url: r.emojiUrl }) }),
7155
- /* @__PURE__ */ jsx("span", { children: r.count })
7156
- ]
7157
- },
7158
- i
7159
- )) }) : null }),
7160
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
7161
- /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
7162
- /* @__PURE__ */ jsx(Icon, { name: "Chat" }),
7163
- " ",
7164
- thread.messageCount
7165
- ] }),
7166
- ` · ${dayjs(thread.lastUpdated).tz(hints.timeZone).fromNow()}`
7167
- ] })
7168
- ] }),
7169
- /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-4", children: [
7170
- /* @__PURE__ */ jsx("a", { href: thread.link.replace(/^https/, "discord"), children: /* @__PURE__ */ jsx(Icon, { name: "Discord" }) }),
7171
- /* @__PURE__ */ jsx("a", { href: thread.link, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" }) })
7172
- ] })
7173
- ] })
7174
- ] }) });
7175
- }
7176
- function Emoji({ name, url }) {
7177
- return url ? /* @__PURE__ */ jsx("img", { src: url, alt: name, className: "h-full w-full" }) : name ? name : null;
7178
- }
7179
7170
  const epicshopTempDir = path.join(os.tmpdir(), "epicshop");
7180
7171
  const isDeployed = ENV.EPICSHOP_DEPLOYED;
7181
7172
  const diffTmpDir = path.join(epicshopTempDir, "diff");
@@ -7235,10 +7226,7 @@ function getFileCodeblocks(file, filePathApp1, filePathApp2, type) {
7235
7226
  type === "AddedFile" ? `Binary file added` : type === "DeletedFile" ? "Binary file deleted" : "Binary file changed"
7236
7227
  );
7237
7228
  } else {
7238
- startLine = chunk.type === "Chunk" ? chunk.fromFileRange.start : (
7239
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
7240
- chunk.type === "CombinedChunk" ? chunk.fromFileRangeA.start : 1
7241
- );
7229
+ startLine = chunk.type === "Chunk" ? chunk.fromFileRange.start : chunk.type === "CombinedChunk" ? chunk.fromFileRangeA.start : 1;
7242
7230
  toStartLine = chunk.toFileRange.start;
7243
7231
  for (let lineNumber = 0; lineNumber < chunk.changes.length; lineNumber++) {
7244
7232
  const change = chunk.changes[lineNumber];
@@ -7442,7 +7430,6 @@ async function getDiffFilesImpl(app1, app2) {
7442
7430
  };
7443
7431
  return parsed.files.map((file) => ({
7444
7432
  // prettier-ignore
7445
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
7446
7433
  status: typesMap[file.type] ?? "unknown",
7447
7434
  path: diffPathToRelative(
7448
7435
  file.type === "RenamedFile" ? file.pathBefore : file.path
@@ -7680,75 +7667,415 @@ function PlaygroundChooser({
7680
7667
  /* @__PURE__ */ jsx("span", { className: "w-80 flex-1 overflow-hidden text-ellipsis whitespace-nowrap scrollbar-thin scrollbar-thumb-scrollbar", children: /* @__PURE__ */ jsx(
7681
7668
  Select.Value,
7682
7669
  {
7683
- placeholder: "Select current app",
7684
- className: "inline-block w-40 text-ellipsis"
7670
+ placeholder: "Select current app",
7671
+ className: "inline-block w-40 text-ellipsis"
7672
+ }
7673
+ ) }),
7674
+ /* @__PURE__ */ jsx(Select.Icon, { children: /* @__PURE__ */ jsx(Icon, { name: "TriangleDownSmall" }) })
7675
+ ]
7676
+ }
7677
+ ),
7678
+ /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(
7679
+ Select.Content,
7680
+ {
7681
+ position: "popper",
7682
+ align: "start",
7683
+ className: "z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",
7684
+ children: [
7685
+ /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
7686
+ /* @__PURE__ */ jsx(Select.Viewport, { className: "p-3", children: /* @__PURE__ */ jsxs(Select.Group, { children: [
7687
+ /* @__PURE__ */ jsx(Select.Label, { className: "px-5 pb-3 font-mono uppercase", children: "App" }),
7688
+ allApps.filter((app) => app.name !== "playground").map((app) => {
7689
+ return /* @__PURE__ */ jsx(SelectItem, { value: app.name, children: app.displayName }, app.name);
7690
+ })
7691
+ ] }) }),
7692
+ /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
7693
+ ]
7694
+ }
7695
+ ) })
7696
+ ]
7697
+ }
7698
+ );
7699
+ }
7700
+ function SelectItem({
7701
+ value,
7702
+ children
7703
+ }) {
7704
+ return /* @__PURE__ */ jsxs(
7705
+ Select.Item,
7706
+ {
7707
+ value,
7708
+ className: "relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",
7709
+ children: [
7710
+ /* @__PURE__ */ jsx(Select.ItemText, { children }),
7711
+ /* @__PURE__ */ jsx(Select.ItemIndicator, { className: "absolute left-0 inline-flex w-[25px] items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "CheckSmall" }) })
7712
+ ]
7713
+ }
7714
+ );
7715
+ }
7716
+ function SetAppToPlayground({ appName }) {
7717
+ if (ENV.EPICSHOP_DEPLOYED)
7718
+ return null;
7719
+ return /* @__PURE__ */ jsx(
7720
+ SetPlayground,
7721
+ {
7722
+ appName,
7723
+ tooltipText: "Playground is not set to the right app. Click to set Playground.",
7724
+ children: /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-center gap-1 text-foreground-danger hover:underline", children: [
7725
+ /* @__PURE__ */ jsx(Icon, { name: "Unlinked", className: "animate-ping" }),
7726
+ " ",
7727
+ /* @__PURE__ */ jsx("span", { className: "uppercase", children: "Set to Playground" })
7728
+ ] })
7729
+ }
7730
+ );
7731
+ }
7732
+ const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7733
+ __proto__: null,
7734
+ PlaygroundChooser,
7735
+ SetAppToPlayground,
7736
+ SetPlayground,
7737
+ action: action$8
7738
+ }, Symbol.toStringTag, { value: "Module" }));
7739
+ const EmojiDataSchema = z$1.union([
7740
+ z$1.object({
7741
+ emojiName: z$1.never().optional(),
7742
+ emojiUrl: z$1.string()
7743
+ }),
7744
+ z$1.object({
7745
+ emojiName: z$1.string(),
7746
+ emojiUrl: z$1.never().optional()
7747
+ }),
7748
+ z$1.object({
7749
+ emojiName: z$1.never().optional(),
7750
+ emojiUrl: z$1.never().optional()
7751
+ })
7752
+ ]);
7753
+ const ThreadItemSchema = z$1.object({
7754
+ id: z$1.string(),
7755
+ tags: z$1.array(
7756
+ z$1.object({
7757
+ name: z$1.string()
7758
+ }).and(EmojiDataSchema)
7759
+ ),
7760
+ name: z$1.string(),
7761
+ link: z$1.string(),
7762
+ authorDisplayName: z$1.string(),
7763
+ authorHexAccentColor: z$1.string().nullable().optional(),
7764
+ authorAvatarUrl: z$1.string().nullable(),
7765
+ messagePreview: z$1.string(),
7766
+ messageCount: z$1.number(),
7767
+ lastUpdated: z$1.string(),
7768
+ previewImageUrl: z$1.string().nullable(),
7769
+ reactions: z$1.array(
7770
+ z$1.object({
7771
+ count: z$1.number()
7772
+ }).and(EmojiDataSchema)
7773
+ )
7774
+ });
7775
+ const ThreadDataSchema = z$1.array(ThreadItemSchema);
7776
+ const EpicForumResponseSchema = z$1.object({
7777
+ status: z$1.literal("error"),
7778
+ error: z$1.string()
7779
+ }).or(
7780
+ z$1.object({
7781
+ status: z$1.literal("success"),
7782
+ threadData: ThreadDataSchema
7783
+ })
7784
+ );
7785
+ async function fetchDiscordPosts({ request }) {
7786
+ return cachified({
7787
+ key: "fetchDiscordPosts",
7788
+ request,
7789
+ cache: fsCache,
7790
+ ttl: 1e3 * 60 * 2,
7791
+ swr: 1e3 * 60 * 60 * 24 * 7,
7792
+ checkValue: ThreadDataSchema,
7793
+ async getFreshValue() {
7794
+ const forceFresh = await shouldForceFresh({ request });
7795
+ const searchParams = new URLSearchParams(
7796
+ forceFresh ? { fresh: "true" } : {}
7797
+ );
7798
+ const result = await fetch(
7799
+ // `http://localhost:3000/resources/epic-web-forum?${searchParams}`,
7800
+ `https://kcd-discord-bot-v2.fly.dev/resources/epic-web-forum?${searchParams}`,
7801
+ {
7802
+ method: "POST",
7803
+ headers: { "content-type": "application/json" }
7804
+ }
7805
+ );
7806
+ if (!result.ok) {
7807
+ console.error(`There was an error communicating with discord`);
7808
+ try {
7809
+ console.error(await result.text());
7810
+ } catch {
7811
+ }
7812
+ return [];
7813
+ }
7814
+ const jsonResult = await result.json();
7815
+ const epicForumResponseResult = EpicForumResponseSchema.safeParse(jsonResult);
7816
+ if (epicForumResponseResult.success) {
7817
+ if (epicForumResponseResult.data.status === "error") {
7818
+ console.error(`There was an error communicating with discord`);
7819
+ console.error(epicForumResponseResult.data.error);
7820
+ return [];
7821
+ } else {
7822
+ return epicForumResponseResult.data.threadData;
7823
+ }
7824
+ } else {
7825
+ console.error(`There was an error parsing the discord response`);
7826
+ console.error(epicForumResponseResult.error.flatten());
7827
+ return [];
7828
+ }
7829
+ }
7830
+ });
7831
+ }
7832
+ async function loader$l() {
7833
+ return json({ discordAuthUrl: getDiscordAuthURL() });
7834
+ }
7835
+ function useDiscordCTALink({
7836
+ discordAuthUrl
7837
+ }) {
7838
+ const user = useOptionalUser();
7839
+ const discordMember = useOptionalDiscordMember();
7840
+ if (!user) {
7841
+ return "/login";
7842
+ }
7843
+ if (!discordMember) {
7844
+ return discordAuthUrl;
7845
+ }
7846
+ return "https://discord.com/channels/715220730605731931/1161045224907341972";
7847
+ }
7848
+ function DiscordCTA({ discordAuthUrl }) {
7849
+ const user = useOptionalUser();
7850
+ const discordMember = useOptionalDiscordMember();
7851
+ if (!user) {
7852
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
7853
+ /* @__PURE__ */ jsxs(Link, { to: "/login", className: "inline-flex items-center gap-2 underline", children: [
7854
+ /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
7855
+ "Login"
7856
+ ] }),
7857
+ " ",
7858
+ /* @__PURE__ */ jsxs("span", { children: [
7859
+ "to get access to the exclusive",
7860
+ " ",
7861
+ /* @__PURE__ */ jsx(Link, { to: "/discord", className: "underline", children: "discord channel" }),
7862
+ "."
7863
+ ] })
7864
+ ] });
7865
+ }
7866
+ if (!discordMember) {
7867
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center justify-center gap-2 text-xl", children: [
7868
+ /* @__PURE__ */ jsxs(Link, { to: discordAuthUrl, className: "flex items-center gap-2 underline", children: [
7869
+ /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }),
7870
+ "Connect Discord"
7871
+ ] }),
7872
+ " ",
7873
+ /* @__PURE__ */ jsxs("span", { children: [
7874
+ "to get access to the exclusive",
7875
+ " ",
7876
+ /* @__PURE__ */ jsx(Link, { to: "/discord", className: "underline", children: "discord channel" }),
7877
+ "."
7878
+ ] })
7879
+ ] });
7880
+ }
7881
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center justify-center gap-2 text-xl underline", children: [
7882
+ /* @__PURE__ */ jsx(Link, { to: "discord://discord.com/channels/715220730605731931/1161045224907341972", children: /* @__PURE__ */ jsx(Icon, { name: "Discord", size: "2xl" }) }),
7883
+ /* @__PURE__ */ jsx(
7884
+ Link,
7885
+ {
7886
+ to: "https://discord.com/channels/715220730605731931/1161045224907341972",
7887
+ target: "_blank",
7888
+ rel: "noreferrer noopener",
7889
+ children: "Open Discord"
7890
+ }
7891
+ )
7892
+ ] });
7893
+ }
7894
+ function DiscordRoute() {
7895
+ const data = useLoaderData();
7896
+ return /* @__PURE__ */ jsxs("div", { className: "container flex h-full max-w-3xl flex-col items-center justify-center gap-4 p-12", children: [
7897
+ /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }),
7898
+ /* @__PURE__ */ jsxs("p", { children: [
7899
+ "The",
7900
+ " ",
7901
+ /* @__PURE__ */ jsx(
7902
+ Link,
7903
+ {
7904
+ target: "_blank",
7905
+ rel: "noreferrer noopener",
7906
+ className: "underline",
7907
+ to: "https://kentcdodds.com/discord",
7908
+ children: "Epic Web Community on Discord"
7909
+ }
7910
+ ),
7911
+ " ",
7912
+ "is a great place to hang out with other developers who are working through this workshop. You can ask questions, get help, and solidify what you're learning by helping others."
7913
+ ] }),
7914
+ /* @__PURE__ */ jsx("p", { children: /* @__PURE__ */ jsxs("small", { className: "text-sm", children: [
7915
+ "If you've not joined the Epic Web Community on Discord yet, you'll be required to go through a short onboarding process first. A friendly bot will explain the process when you",
7916
+ " ",
7917
+ /* @__PURE__ */ jsx(
7918
+ Link,
7919
+ {
7920
+ to: "https://kcd.im/discord",
7921
+ target: "_blank",
7922
+ rel: "noreferrer noopener",
7923
+ className: "underline",
7924
+ children: "join"
7925
+ }
7926
+ ),
7927
+ "."
7928
+ ] }) })
7929
+ ] });
7930
+ }
7931
+ const route15 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7932
+ __proto__: null,
7933
+ DiscordCTA,
7934
+ default: DiscordRoute,
7935
+ loader: loader$l,
7936
+ useDiscordCTALink
7937
+ }, Symbol.toStringTag, { value: "Module" }));
7938
+ function DiscordChat() {
7939
+ const data = useLoaderData();
7940
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col gap-4 pt-4", children: [
7941
+ /* @__PURE__ */ jsx("div", { className: "text-center", children: /* @__PURE__ */ jsx(DiscordCTA, { discordAuthUrl: data.discordAuthUrl }) }),
7942
+ /* @__PURE__ */ jsx("div", { className: "flex-1 overflow-y-scroll bg-accent pb-4 scrollbar-thin scrollbar-thumb-scrollbar", children: /* @__PURE__ */ jsx(DiscordPosts, {}) })
7943
+ ] });
7944
+ }
7945
+ function DiscordPosts() {
7946
+ const data = useLoaderData();
7947
+ const ctaLink = useDiscordCTALink({ discordAuthUrl: data.discordAuthUrl });
7948
+ const altDown = useAltDown();
7949
+ return /* @__PURE__ */ jsxs("div", { className: "flex h-full flex-col items-center justify-between", children: [
7950
+ /* @__PURE__ */ jsx(
7951
+ React.Suspense,
7952
+ {
7953
+ fallback: /* @__PURE__ */ jsx("div", { className: "flex h-full w-full flex-col items-center justify-center", children: /* @__PURE__ */ jsx(Loading, { children: "Loading Discord Posts" }) }),
7954
+ children: /* @__PURE__ */ jsx(
7955
+ Await,
7956
+ {
7957
+ resolve: data.discordPostsPromise,
7958
+ errorElement: /* @__PURE__ */ jsx("div", { className: "text-red-500", children: "There was a problem loading the discord posts" }),
7959
+ children: (posts) => /* @__PURE__ */ jsx("ul", { className: "flex w-full flex-col gap-4 p-3 xl:p-12", children: posts.map((post) => /* @__PURE__ */ jsx(
7960
+ "li",
7961
+ {
7962
+ className: "rounded-xl border bg-background transition-all duration-200 focus-within:-translate-y-1 focus-within:shadow-lg hover:-translate-y-1 hover:shadow-lg",
7963
+ children: /* @__PURE__ */ jsx(DiscordPost, { thread: post })
7964
+ },
7965
+ post.id
7966
+ )) })
7967
+ }
7968
+ )
7969
+ }
7970
+ ),
7971
+ /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(
7972
+ Link,
7973
+ {
7974
+ to: altDown && !ctaLink.includes("oauth") ? ctaLink.replace(/^https/, "discord") : ctaLink,
7975
+ target: ctaLink.includes("oauth") ? void 0 : "_blank",
7976
+ rel: "noreferrer noopener",
7977
+ onClick: altDown ? (e) => {
7978
+ e.preventDefault();
7979
+ window.open(
7980
+ e.currentTarget.href,
7981
+ "_blank",
7982
+ "noreferrer noopener"
7983
+ );
7984
+ } : void 0,
7985
+ className: "flex items-center gap-2 p-2 text-xl hover:underline",
7986
+ children: [
7987
+ "Create Post ",
7988
+ /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" })
7989
+ ]
7990
+ }
7991
+ ) })
7992
+ ] });
7993
+ }
7994
+ function DiscordPost({ thread }) {
7995
+ const reactionsWithCounts = thread.reactions.filter((r) => r.count);
7996
+ const hints = useHints();
7997
+ return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2 p-4", children: [
7998
+ /* @__PURE__ */ jsxs("div", { className: "flex gap-4", children: [
7999
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-1", children: [
8000
+ thread.tags.length ? /* @__PURE__ */ jsx("div", { className: "flex gap-2", children: thread.tags.map((t) => /* @__PURE__ */ jsxs(
8001
+ "div",
8002
+ {
8003
+ className: "flex items-center justify-center gap-1 rounded-full bg-accent px-2 py-1 text-sm",
8004
+ children: [
8005
+ /* @__PURE__ */ jsx("span", { className: "h-3 w-3 leading-3", children: /* @__PURE__ */ jsx(Emoji, { name: t.emojiName, url: t.emojiUrl }) }),
8006
+ /* @__PURE__ */ jsx("span", { children: t.name })
8007
+ ]
8008
+ },
8009
+ t.name
8010
+ )) }) : null,
8011
+ /* @__PURE__ */ jsx("strong", { className: "text-xl font-bold", children: thread.name }),
8012
+ /* @__PURE__ */ jsxs("div", { className: "flex items-start gap-1", children: [
8013
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
8014
+ thread.authorAvatarUrl ? /* @__PURE__ */ jsx(
8015
+ "img",
8016
+ {
8017
+ src: thread.authorAvatarUrl,
8018
+ alt: "",
8019
+ className: "h-6 w-6 rounded-full"
8020
+ }
8021
+ ) : null,
8022
+ /* @__PURE__ */ jsxs("span", { children: [
8023
+ /* @__PURE__ */ jsx(
8024
+ "span",
8025
+ {
8026
+ className: "font-bold",
8027
+ style: thread.authorHexAccentColor ? { color: thread.authorHexAccentColor } : {},
8028
+ children: thread.authorDisplayName
7685
8029
  }
7686
- ) }),
7687
- /* @__PURE__ */ jsx(Select.Icon, { children: /* @__PURE__ */ jsx(Icon, { name: "TriangleDownSmall" }) })
7688
- ]
7689
- }
7690
- ),
7691
- /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(
7692
- Select.Content,
8030
+ ),
8031
+ ":",
8032
+ " "
8033
+ ] })
8034
+ ] }),
8035
+ /* @__PURE__ */ jsx("span", { className: "flex-1 overflow-ellipsis text-muted-foreground", children: thread.messagePreview })
8036
+ ] })
8037
+ ] }),
8038
+ thread.previewImageUrl ? /* @__PURE__ */ jsx(
8039
+ "img",
8040
+ {
8041
+ src: thread.previewImageUrl,
8042
+ alt: "",
8043
+ className: "h-28 w-28 rounded-lg object-cover"
8044
+ }
8045
+ ) : null
8046
+ ] }),
8047
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
8048
+ /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-3", children: [
8049
+ /* @__PURE__ */ jsx("span", { children: reactionsWithCounts.length ? /* @__PURE__ */ jsx("ul", { className: "flex items-center gap-2", children: reactionsWithCounts.map((r, i) => /* @__PURE__ */ jsxs(
8050
+ "li",
7693
8051
  {
7694
- position: "popper",
7695
- align: "start",
7696
- className: "z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",
8052
+ className: "flex items-center gap-1 rounded-md border border-blue-600 bg-blue-500/20 px-[5px] py-[0.5px] text-sm",
7697
8053
  children: [
7698
- /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
7699
- /* @__PURE__ */ jsx(Select.Viewport, { className: "p-3", children: /* @__PURE__ */ jsxs(Select.Group, { children: [
7700
- /* @__PURE__ */ jsx(Select.Label, { className: "px-5 pb-3 font-mono uppercase", children: "App" }),
7701
- allApps.filter((app) => app.name !== "playground").map((app) => {
7702
- return /* @__PURE__ */ jsx(SelectItem$1, { value: app.name, children: app.displayName }, app.name);
7703
- })
7704
- ] }) }),
7705
- /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
8054
+ /* @__PURE__ */ jsx("span", { className: "h-3 w-3 leading-3", children: /* @__PURE__ */ jsx(Emoji, { name: r.emojiName, url: r.emojiUrl }) }),
8055
+ /* @__PURE__ */ jsx("span", { children: r.count })
7706
8056
  ]
7707
- }
7708
- ) })
7709
- ]
7710
- }
7711
- );
7712
- }
7713
- function SelectItem$1({
7714
- value,
7715
- children
7716
- }) {
7717
- return /* @__PURE__ */ jsxs(
7718
- Select.Item,
7719
- {
7720
- value,
7721
- className: "relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",
7722
- children: [
7723
- /* @__PURE__ */ jsx(Select.ItemText, { children }),
7724
- /* @__PURE__ */ jsx(Select.ItemIndicator, { className: "absolute left-0 inline-flex w-[25px] items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "CheckSmall" }) })
7725
- ]
7726
- }
7727
- );
7728
- }
7729
- function SetAppToPlayground({ appName }) {
7730
- if (ENV.EPICSHOP_DEPLOYED)
7731
- return null;
7732
- return /* @__PURE__ */ jsx(
7733
- SetPlayground,
7734
- {
7735
- appName,
7736
- tooltipText: "Playground is not set to the right app. Click to set Playground.",
7737
- children: /* @__PURE__ */ jsxs("span", { className: "flex items-center justify-center gap-1 text-foreground-danger hover:underline", children: [
7738
- /* @__PURE__ */ jsx(Icon, { name: "Unlinked", className: "animate-ping" }),
7739
- " ",
7740
- /* @__PURE__ */ jsx("span", { className: "uppercase", children: "Set to Playground" })
8057
+ },
8058
+ i
8059
+ )) }) : null }),
8060
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-1", children: [
8061
+ /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-1", children: [
8062
+ /* @__PURE__ */ jsx(Icon, { name: "Chat" }),
8063
+ " ",
8064
+ thread.messageCount
8065
+ ] }),
8066
+ ` · ${dayjs(thread.lastUpdated).tz(hints.timeZone).fromNow()}`
8067
+ ] })
8068
+ ] }),
8069
+ /* @__PURE__ */ jsxs("span", { className: "flex items-center gap-4", children: [
8070
+ /* @__PURE__ */ jsx("a", { href: thread.link.replace(/^https/, "discord"), children: /* @__PURE__ */ jsx(Icon, { name: "Discord" }) }),
8071
+ /* @__PURE__ */ jsx("a", { href: thread.link, target: "_blank", rel: "noreferrer noopener", children: /* @__PURE__ */ jsx(Icon, { name: "ExternalLink" }) })
7741
8072
  ] })
7742
- }
7743
- );
8073
+ ] })
8074
+ ] }) });
8075
+ }
8076
+ function Emoji({ name, url }) {
8077
+ return url ? /* @__PURE__ */ jsx("img", { src: url, alt: name, className: "h-full w-full" }) : name ? name : null;
7744
8078
  }
7745
- const route31 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
7746
- __proto__: null,
7747
- PlaygroundChooser,
7748
- SetAppToPlayground,
7749
- SetPlayground,
7750
- action: action$8
7751
- }, Symbol.toStringTag, { value: "Module" }));
7752
8079
  function PlaygroundWindow({
7753
8080
  playgroundAppName,
7754
8081
  problemAppName,
@@ -8047,18 +8374,15 @@ const InBrowserBrowser = forwardRef(
8047
8374
  );
8048
8375
  function InBrowserBrowserImpl({ name, port: port2, portIsAvailable, isRunning, baseUrl, id, initialRoute }, ref) {
8049
8376
  const requestInfo = useRequestInfo();
8050
- return isRunning ? (
8051
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
8052
- /* @__PURE__ */ jsx(
8053
- InBrowserBrowserForRealz,
8054
- {
8055
- baseUrl,
8056
- id,
8057
- name,
8058
- ref,
8059
- initialRoute
8060
- }
8061
- )
8377
+ return isRunning ? /* @__PURE__ */ jsx(
8378
+ InBrowserBrowserForRealz,
8379
+ {
8380
+ baseUrl,
8381
+ id,
8382
+ name,
8383
+ ref,
8384
+ initialRoute
8385
+ }
8062
8386
  ) : portIsAvailable === false ? /* @__PURE__ */ jsxs("div", { className: "flex flex-col items-center justify-center", children: [
8063
8387
  /* @__PURE__ */ jsxs("p", { className: "max-w-xs pb-5 text-center", role: "status", children: [
8064
8388
  `The port for this app is unavailable. It could be that you're running it `,
@@ -8490,7 +8814,6 @@ async function action$6({ request }) {
8490
8814
  await fs.promises.readFile(cacheLocation, "utf-8")
8491
8815
  );
8492
8816
  const cachedEmbeddedFiles = new Map(
8493
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument, @typescript-eslint/no-unsafe-member-access
8494
8817
  Object.entries(((_a2 = cached == null ? void 0 : cached.value) == null ? void 0 : _a2.embeddedFiles) ?? {})
8495
8818
  );
8496
8819
  if (cachedEmbeddedFiles.has(embeddedKey)) {
@@ -8827,124 +9150,6 @@ function LinkToApp({
8827
9150
  ) }) : null
8828
9151
  ] });
8829
9152
  }
8830
- const AccordionComponent = ({
8831
- title,
8832
- children,
8833
- variant,
8834
- icon,
8835
- forceMount = false
8836
- }) => {
8837
- const getVariantIcon = () => {
8838
- switch (variant) {
8839
- case "changed":
8840
- return /* @__PURE__ */ jsx(
8841
- Icon,
8842
- {
8843
- name: "Modified",
8844
- "aria-label": "Modified",
8845
- className: "text-[#fb923c]"
8846
- }
8847
- );
8848
- case "renamed":
8849
- return /* @__PURE__ */ jsx(
8850
- Icon,
8851
- {
8852
- name: "Renamed",
8853
- "aria-label": "Renamed",
8854
- className: "text-[#fb923c]"
8855
- }
8856
- );
8857
- case "added":
8858
- return /* @__PURE__ */ jsx(Icon, { name: "Added", "aria-label": "Added", className: "text-[#10b981]" });
8859
- case "deleted":
8860
- return /* @__PURE__ */ jsx(
8861
- Icon,
8862
- {
8863
- name: "Deleted",
8864
- "aria-label": "Deleted",
8865
- className: "text-[#ef4444]"
8866
- }
8867
- );
8868
- default:
8869
- return /* @__PURE__ */ jsx(
8870
- Icon,
8871
- {
8872
- name: "Modified",
8873
- "aria-label": "Modified",
8874
- className: "text-[#fb923c]"
8875
- }
8876
- );
8877
- }
8878
- };
8879
- const getVariantLabel = () => {
8880
- switch (variant) {
8881
- case "changed":
8882
- return "modified";
8883
- default:
8884
- return variant;
8885
- }
8886
- };
8887
- const fixedTitle = title.replace(/\\\\/g, "\\");
8888
- return /* @__PURE__ */ jsxs(Accordion.Item, { value: title, children: [
8889
- /* @__PURE__ */ jsxs(AccordionTrigger, { variant: getVariantLabel(), children: [
8890
- icon ? icon : getVariantIcon(),
8891
- " ",
8892
- fixedTitle
8893
- ] }),
8894
- /* @__PURE__ */ jsx(
8895
- AccordionContent,
8896
- {
8897
- forceMount,
8898
- className: clsx(
8899
- "prose max-w-none whitespace-pre-wrap dark:prose-invert prose-pre:m-0 prose-pre:mb-1 prose-pre:rounded-none",
8900
- {
8901
- "radix-state-closed:hidden": forceMount
8902
- }
8903
- ),
8904
- children
8905
- }
8906
- )
8907
- ] });
8908
- };
8909
- const AccordionTrigger = React.forwardRef(
8910
- ({ children, className, variant, ...props }, forwardedRef) => /* @__PURE__ */ jsx(Accordion.Header, { className: "flex", asChild: true, children: /* @__PURE__ */ jsxs(
8911
- Accordion.Trigger,
8912
- {
8913
- className: clsx(
8914
- "group flex w-full items-center justify-between border-b p-4 pr-3 font-mono text-sm font-medium leading-none hover:bg-foreground/20",
8915
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
8916
- className
8917
- ),
8918
- ...props,
8919
- ref: forwardedRef,
8920
- children: [
8921
- /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1.5", children }),
8922
- /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2", children: [
8923
- /* @__PURE__ */ jsx("span", { className: "font-mono text-xs font-normal uppercase text-muted-foreground", children: variant }),
8924
- /* @__PURE__ */ jsx(
8925
- Icon,
8926
- {
8927
- name: "TriangleDownSmall",
8928
- className: "transition group-radix-state-open:rotate-180",
8929
- "aria-hidden": true
8930
- }
8931
- )
8932
- ] })
8933
- ]
8934
- }
8935
- ) })
8936
- );
8937
- const AccordionContent = React.forwardRef(
8938
- ({ children, className, ...props }, forwardedRef) => /* @__PURE__ */ jsx(
8939
- Accordion.Content,
8940
- {
8941
- className: clsx("", className),
8942
- ...props,
8943
- ref: forwardedRef,
8944
- children: /* @__PURE__ */ jsx("div", { children })
8945
- }
8946
- )
8947
- );
8948
9153
  const testRunnerStatusDataSchema = z$1.intersection(
8949
9154
  z$1.object({
8950
9155
  type: z$1.literal("epicshop:test-status-update"),
@@ -9594,232 +9799,6 @@ function TouchedFiles() {
9594
9799
  ) })
9595
9800
  ] }) });
9596
9801
  }
9597
- const pre = (props) => /* @__PURE__ */ jsx("pre", { ...props });
9598
- const mdxComponents$3 = {
9599
- Accordion: AccordionComponent,
9600
- // override the pre-with-buttons
9601
- pre
9602
- };
9603
- function Diff({
9604
- diff,
9605
- allApps
9606
- }) {
9607
- const submit = useSubmit();
9608
- const [params] = useSearchParams();
9609
- const paramsWithForcedRefresh = new URLSearchParams(params);
9610
- paramsWithForcedRefresh.set("forceFresh", "diff");
9611
- const navigation = useNavigation();
9612
- const spinnerNavigating = useSpinDelay(navigation.state !== "idle", {
9613
- delay: 0,
9614
- minDuration: 1e3
9615
- });
9616
- const hiddenInputs = [];
9617
- for (const [key, value] of params.entries()) {
9618
- if (key === "app1" || key === "app2")
9619
- continue;
9620
- hiddenInputs.push(
9621
- /* @__PURE__ */ jsx("input", { type: "hidden", name: key, value }, key)
9622
- );
9623
- }
9624
- return /* @__PURE__ */ jsx(
9625
- Suspense,
9626
- {
9627
- fallback: /* @__PURE__ */ jsx("div", { className: "flex items-center justify-center p-8", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "Loading diff", children: /* @__PURE__ */ jsx(Icon, { name: "Refresh", className: "animate-spin" }) }) }),
9628
- children: /* @__PURE__ */ jsx(
9629
- Await,
9630
- {
9631
- resolve: diff,
9632
- errorElement: /* @__PURE__ */ jsx("p", { className: "p-6 text-foreground-danger", children: "There was an error calculating the diff. Sorry." }),
9633
- children: (diff2) => /* @__PURE__ */ jsxs("div", { className: "flex h-full w-full flex-col", children: [
9634
- /* @__PURE__ */ jsxs("div", { className: "flex h-14 min-h-14 w-full overflow-x-hidden border-b", children: [
9635
- /* @__PURE__ */ jsx("div", { className: "border-r", children: /* @__PURE__ */ jsx(SimpleTooltip, { content: "Reload diff", children: /* @__PURE__ */ jsx(
9636
- Link,
9637
- {
9638
- to: `.?${paramsWithForcedRefresh}`,
9639
- className: "flex h-full w-14 items-center justify-center",
9640
- children: /* @__PURE__ */ jsx(
9641
- Icon,
9642
- {
9643
- name: "Refresh",
9644
- className: cn({ "animate-spin": spinnerNavigating })
9645
- }
9646
- )
9647
- }
9648
- ) }) }),
9649
- /* @__PURE__ */ jsxs(
9650
- Form,
9651
- {
9652
- onChange: (e) => submit(e.currentTarget),
9653
- className: "flex h-full flex-1 items-center overflow-x-auto scrollbar-thin scrollbar-thumb-scrollbar",
9654
- children: [
9655
- hiddenInputs,
9656
- /* @__PURE__ */ jsx(
9657
- SelectFileToDiff,
9658
- {
9659
- name: "app1",
9660
- label: "App 1",
9661
- className: "border-r",
9662
- allApps,
9663
- defaultValue: diff2.app1
9664
- }
9665
- ),
9666
- /* @__PURE__ */ jsx(
9667
- SelectFileToDiff,
9668
- {
9669
- name: "app2",
9670
- label: "App 2",
9671
- allApps,
9672
- defaultValue: diff2.app2
9673
- }
9674
- )
9675
- ]
9676
- },
9677
- `${diff2.app1}${diff2.app2}`
9678
- )
9679
- ] }),
9680
- /* @__PURE__ */ jsx("div", { className: "flex-grow overflow-y-scroll scrollbar-thin scrollbar-thumb-scrollbar", children: diff2.diffCode ? /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(Accordion.Root, { className: "w-full", type: "multiple", children: /* @__PURE__ */ jsx(Mdx, { code: diff2.diffCode, components: mdxComponents$3 }) }) }) : diff2.app1 && diff2.app2 ? /* @__PURE__ */ jsx("p", { className: "m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background", children: "There was a problem generating the diff" }) : /* @__PURE__ */ jsx("p", { className: "m-5 inline-flex items-center justify-center bg-foreground px-1 py-0.5 font-mono text-sm uppercase text-background", children: "Select two apps to compare" }) })
9681
- ] })
9682
- }
9683
- )
9684
- }
9685
- );
9686
- }
9687
- function SelectFileToDiff({
9688
- name,
9689
- label,
9690
- className,
9691
- allApps,
9692
- defaultValue
9693
- }) {
9694
- return /* @__PURE__ */ jsxs(Select.Root, { name, defaultValue, children: [
9695
- /* @__PURE__ */ jsxs(
9696
- Select.Trigger,
9697
- {
9698
- className: clsx(
9699
- "flex h-full w-full max-w-[50%] items-center justify-between px-3 text-left radix-placeholder:text-gray-500 focus-visible:outline-none",
9700
- className
9701
- ),
9702
- "aria-label": `Select ${label} for git Diff`,
9703
- children: [
9704
- /* @__PURE__ */ jsxs("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: [
9705
- label,
9706
- ":",
9707
- " ",
9708
- /* @__PURE__ */ jsx(
9709
- SelectValue,
9710
- {
9711
- placeholder: `Select ${label}`,
9712
- className: "inline-block w-40 text-ellipsis"
9713
- }
9714
- )
9715
- ] }),
9716
- /* @__PURE__ */ jsx(Select.Icon, { className: "", children: /* @__PURE__ */ jsx(Icon, { name: "TriangleDownSmall" }) })
9717
- ]
9718
- }
9719
- ),
9720
- /* @__PURE__ */ jsx(Select.Portal, { children: /* @__PURE__ */ jsxs(
9721
- Select.Content,
9722
- {
9723
- position: "popper",
9724
- align: "start",
9725
- className: "z-20 max-h-[50vh] bg-black text-white lg:max-h-[70vh]",
9726
- children: [
9727
- /* @__PURE__ */ jsx(Select.ScrollUpButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronUp" }) }),
9728
- /* @__PURE__ */ jsx(Select.Viewport, { className: "p-3", children: /* @__PURE__ */ jsxs(Select.Group, { children: [
9729
- /* @__PURE__ */ jsx(Select.Label, { className: "px-5 pb-3 font-mono uppercase", children: label }),
9730
- allApps.map((app) => {
9731
- return (
9732
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
9733
- /* @__PURE__ */ jsx(SelectItem, { value: app.name, children: app.displayName }, app.name)
9734
- );
9735
- })
9736
- ] }) }),
9737
- /* @__PURE__ */ jsx(Select.ScrollDownButton, { className: "flex h-5 cursor-default items-center justify-center ", children: /* @__PURE__ */ jsx(Icon, { name: "ChevronDown" }) })
9738
- ]
9739
- }
9740
- ) })
9741
- ] });
9742
- }
9743
- const SelectItem = React__default.forwardRef(
9744
- ({ children, className, ...props }, forwardedRef) => {
9745
- return /* @__PURE__ */ jsxs(
9746
- Select.Item,
9747
- {
9748
- className: clsx(
9749
- "relative flex cursor-pointer select-none items-center rounded px-10 py-2 leading-none opacity-80 radix-disabled:text-red-500 radix-highlighted:opacity-100 radix-highlighted:outline-none radix-state-checked:opacity-100",
9750
- // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
9751
- className
9752
- ),
9753
- ...props,
9754
- ref: forwardedRef,
9755
- children: [
9756
- /* @__PURE__ */ jsx(Select.ItemText, { children }),
9757
- /* @__PURE__ */ jsx(Select.ItemIndicator, { className: "absolute left-0 inline-flex w-[25px] items-center justify-center", children: /* @__PURE__ */ jsx(Icon, { name: "CheckSmall" }) })
9758
- ]
9759
- }
9760
- );
9761
- }
9762
- );
9763
- const SelectValue = React__default.forwardRef(
9764
- ({ children, className, ...props }, forwardedRef) => {
9765
- return /* @__PURE__ */ jsx(Select.Value, { ...props, ref: forwardedRef, children: props.value });
9766
- }
9767
- );
9768
- function NavChevrons({
9769
- prev,
9770
- next
9771
- }) {
9772
- return /* @__PURE__ */ jsxs("div", { className: "relative flex h-full overflow-hidden", children: [
9773
- prev ? /* @__PURE__ */ jsx(
9774
- Link,
9775
- {
9776
- prefetch: "intent",
9777
- ...prev,
9778
- className: "group flex h-full items-center justify-center border-l px-7",
9779
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
9780
- /* @__PURE__ */ jsx(
9781
- Icon,
9782
- {
9783
- name: "ChevronLeft",
9784
- className: "absolute opacity-100 transition duration-300 ease-in-out group-hover:translate-y-10 group-hover:opacity-0"
9785
- }
9786
- ),
9787
- /* @__PURE__ */ jsx(
9788
- Icon,
9789
- {
9790
- name: "ChevronLeft",
9791
- className: "absolute -translate-y-10 opacity-0 transition duration-300 ease-in-out group-hover:translate-y-0 group-hover:opacity-100"
9792
- }
9793
- )
9794
- ] })
9795
- }
9796
- ) : null,
9797
- next ? /* @__PURE__ */ jsx(
9798
- Link,
9799
- {
9800
- prefetch: "intent",
9801
- ...next,
9802
- className: "group flex h-full items-center justify-center border-l px-7",
9803
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
9804
- /* @__PURE__ */ jsx(
9805
- Icon,
9806
- {
9807
- name: "ChevronRight",
9808
- className: "absolute opacity-100 transition duration-300 ease-in-out group-hover:translate-y-10 group-hover:opacity-0"
9809
- }
9810
- ),
9811
- /* @__PURE__ */ jsx(
9812
- Icon,
9813
- {
9814
- name: "ChevronRight",
9815
- className: "absolute -translate-y-10 opacity-0 transition duration-300 ease-in-out group-hover:translate-y-0 group-hover:opacity-100"
9816
- }
9817
- )
9818
- ] })
9819
- }
9820
- ) : null
9821
- ] });
9822
- }
9823
9802
  function pageTitle(data, workshopTitle) {
9824
9803
  var _a2;
9825
9804
  const exerciseNumber = (data == null ? void 0 : data.exerciseStepApp.exerciseNumber.toString().padStart(2, "0")) ?? "00";
@@ -10607,24 +10586,6 @@ const route9 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProper
10607
10586
  default: Account,
10608
10587
  loader: loader$g
10609
10588
  }, Symbol.toStringTag, { value: "Module" }));
10610
- async function resolveApps({
10611
- request,
10612
- params,
10613
- timings
10614
- }) {
10615
- const url = new URL(request.url);
10616
- const { appName } = params;
10617
- invariantResponse(appName, "appName param required");
10618
- const app = await getAppByName(appName, { request, timings });
10619
- const fileAppName = url.searchParams.get("fileAppName");
10620
- if (fileAppName) {
10621
- const apps = await getApps({ request, timings });
10622
- const fileApp = fileAppName ? apps.find((app2) => app2.name === fileAppName) : app;
10623
- return { app, fileApp };
10624
- } else {
10625
- return { app, fileApp: app };
10626
- }
10627
- }
10628
10589
  async function getForceFresh(filePath, cacheEntry) {
10629
10590
  if (!cacheEntry)
10630
10591
  return true;
@@ -10675,6 +10636,24 @@ async function compileTs(filePath, fullPath, {
10675
10636
  }
10676
10637
  });
10677
10638
  }
10639
+ async function resolveApps({
10640
+ request,
10641
+ params,
10642
+ timings
10643
+ }) {
10644
+ const url = new URL(request.url);
10645
+ const { appName } = params;
10646
+ invariantResponse(appName, "appName param required");
10647
+ const app = await getAppByName(appName, { request, timings });
10648
+ const fileAppName = url.searchParams.get("fileAppName");
10649
+ if (fileAppName) {
10650
+ const apps = await getApps({ request, timings });
10651
+ const fileApp = fileAppName ? apps.find((app2) => app2.name === fileAppName) : app;
10652
+ return { app, fileApp };
10653
+ } else {
10654
+ return { app, fileApp: app };
10655
+ }
10656
+ }
10678
10657
  async function loader$f({ request, params }) {
10679
10658
  const timings = makeTimings("app-file");
10680
10659
  const { fileApp, app } = await resolveApps({ request, params, timings });
@@ -12133,7 +12112,7 @@ const route29 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
12133
12112
  __proto__: null,
12134
12113
  loader
12135
12114
  }, Symbol.toStringTag, { value: "Module" }));
12136
- const serverManifest = { "entry": { "module": "/assets/entry.client-0j1eoieD.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-CxuwYUpK.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DBBsMyAP.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-BdTNdCYE.js", "/assets/client-hints-BKxdo5Js.js", "/assets/error-boundary-BUV7xD2e.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/index-r90CY6Wk.js", "/assets/index-Drecz7hr.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-CGn-2XfF.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/error-boundary-BUV7xD2e.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-Caqk73Ed.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-BdTNdCYE.js", "/assets/client-hints-BKxdo5Js.js", "/assets/progress-HmjERaPh.js", "/assets/index-Drecz7hr.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BR-Qyofe.js", "imports": ["/assets/index-D6ygCrVn.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-D6YNCQoj.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/index-9nNr0Zqr.js", "/assets/mdx-BVZ4sNxQ.js", "/assets/progress-HmjERaPh.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-D00x64Vg.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-DXegGcTM.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/mdx-BVZ4sNxQ.js", "/assets/user-73ocDYRe.js", "/assets/index-9nNr0Zqr.js", "/assets/diff-ZJmYghvh.js", "/assets/discord-DZWTKMPn.js", "/assets/index-r90CY6Wk.js", "/assets/button-BfWwrI9B.js", "/assets/use-event-source-aW6X9lN1.js", "/assets/error-boundary-BUV7xD2e.js", "/assets/nav-chevrons-DnG58Hov.js", "/assets/progress-HmjERaPh.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-DR3gQ1pK.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/index-9nNr0Zqr.js", "/assets/nav-chevrons-DnG58Hov.js", "/assets/mdx-BVZ4sNxQ.js", "/assets/progress-HmjERaPh.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-Cp6A7SfU.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/button-BfWwrI9B.js", "/assets/misc-DBBsMyAP.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-fsySDDKv.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/user-73ocDYRe.js", "/assets/discord-DZWTKMPn.js"], "css": [] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-gQ-B3k8j.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/index-9nNr0Zqr.js", "/assets/mdx-BVZ4sNxQ.js", "/assets/progress-HmjERaPh.js", "/assets/nav-chevrons-DnG58Hov.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-CVJowtf6.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/index-9nNr0Zqr.js", "/assets/progress-HmjERaPh.js", "/assets/error-boundary-BUV7xD2e.js", "/assets/mdx-BVZ4sNxQ.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-BCM4kJTm.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/use-event-source-aW6X9lN1.js", "/assets/button-BfWwrI9B.js", "/assets/loading-C9f_vBoM.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-DUAHYT3r.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-MFX35ekR.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/progress-HmjERaPh.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-Ddyuc0-s.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DBBsMyAP.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/epic-video-BKzHxm70.js", "/assets/progress-bar-TRgQ8YZ8.js", "/assets/mdx-BVZ4sNxQ.js", "/assets/diff-ZJmYghvh.js", "/assets/nav-chevrons-DnG58Hov.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-oSo74A5L.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/misc-DBBsMyAP.js", "/assets/tooltip-BdTNdCYE.js", "/assets/loading-C9f_vBoM.js", "/assets/index-Drecz7hr.js", "/assets/button-BfWwrI9B.js", "/assets/epic-video-BKzHxm70.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-0b01450d.js", "version": "0b01450d" };
12115
+ const serverManifest = { "entry": { "module": "/assets/entry.client-0j1eoieD.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes": { "root": { "id": "root", "parentId": void 0, "path": "", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/root-BJrmef-V.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/error-boundary-Bcric_4t.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-r90CY6Wk.js", "/assets/index-Bg9MMnnf.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/$": { "id": "routes/$", "parentId": "root", "path": "*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_-COWH0sBh.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/error-boundary-Bcric_4t.js"], "css": [] }, "routes/_app+/_layout": { "id": "routes/_app+/_layout", "parentId": "root", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-CNgYirUN.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js", "/assets/progress-CF9Xwfxf.js", "/assets/index-Bg9MMnnf.js"], "css": [] }, "routes/_app+/_exercises+/_layout": { "id": "routes/_app+/_exercises+/_layout", "parentId": "routes/_app+/_layout", "path": void 0, "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-BR-Qyofe.js", "imports": ["/assets/index-D6ygCrVn.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber-jTT5JRgC.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/:stepNumber", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_exerciseNumber_._stepNumber-C37pli7_.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js"], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.$type+/_layout", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": ":type", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/_layout-CGUp6BkS.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/mdx-BYvGbvEr.js", "/assets/user-73ocDYRe.js", "/assets/index-9nNr0Zqr.js", "/assets/diff-tDYfSlOc.js", "/assets/error-boundary-Bcric_4t.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/progress-CF9Xwfxf.js", "/assets/discord-0kv66Q6F.js", "/assets/index-r90CY6Wk.js", "/assets/button-BfWwrI9B.js", "/assets/use-event-source-aW6X9lN1.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index": { "id": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber.index", "parentId": "routes/_app+/_exercises+/$exerciseNumber_.$stepNumber", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/_exercises+/$exerciseNumber_.finished": { "id": "routes/_app+/_exercises+/$exerciseNumber_.finished", "parentId": "routes/_app+/_exercises+/_layout", "path": ":exerciseNumber/finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_exerciseNumber_.finished-zgJKkJ7I.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/account": { "id": "routes/_app+/account", "parentId": "routes/_app+/_layout", "path": "account", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/account-DesvwOeg.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/button-BfWwrI9B.js", "/assets/misc-DNgC2Frq.js", "/assets/user-73ocDYRe.js", "/assets/presence-BJPzwbUy.js"], "css": [] }, "routes/_app+/app.$appName+/$": { "id": "routes/_app+/app.$appName+/$", "parentId": "routes/_app+/_layout", "path": "app/:appName/*", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/api.$": { "id": "routes/_app+/app.$appName+/api.$", "parentId": "routes/_app+/_layout", "path": "app/:appName/api/*", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/api._-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/epic_ws[.js]": { "id": "routes/_app+/app.$appName+/epic_ws[.js]", "parentId": "routes/_app+/_layout", "path": "app/:appName/epic_ws.js", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/epic_ws_.js_-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/index": { "id": "routes/_app+/app.$appName+/index", "parentId": "routes/_app+/_layout", "path": "app/:appName/", "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-DP2rzg_V.js", "imports": [], "css": [] }, "routes/_app+/app.$appName+/test.$testName": { "id": "routes/_app+/app.$appName+/test.$testName", "parentId": "routes/_app+/_layout", "path": "app/:appName/test/:testName", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test._testName-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/_app+/discord": { "id": "routes/_app+/discord", "parentId": "routes/_app+/_layout", "path": "discord", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord-Xp0X4-Fl.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/user-73ocDYRe.js", "/assets/discord-0kv66Q6F.js"], "css": [] }, "routes/_app+/finished": { "id": "routes/_app+/finished", "parentId": "routes/_app+/_layout", "path": "finished", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/finished-BSWdtBA4.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/nav-chevrons-DOYtx9XE.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/index": { "id": "routes/_app+/index", "parentId": "routes/_app+/_layout", "path": void 0, "index": true, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": true, "module": "/assets/index-BQRtqn3g.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js", "/assets/clsx-B-dksMZM.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/index-9nNr0Zqr.js", "/assets/error-boundary-Bcric_4t.js", "/assets/mdx-BYvGbvEr.js", "/assets/progress-CF9Xwfxf.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/_app+/login": { "id": "routes/_app+/login", "parentId": "routes/_app+/_layout", "path": "login", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-D8zyjBAb.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/request-info-Dyls4H67.js", "/assets/client-hints-BKxdo5Js.js", "/assets/use-event-source-aW6X9lN1.js", "/assets/button-BfWwrI9B.js", "/assets/loading-C9f_vBoM.js"], "css": [] }, "routes/_app+/support": { "id": "routes/_app+/support", "parentId": "routes/_app+/_layout", "path": "support", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/support-DUAHYT3r.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/components-C5xBZAiL.js"], "css": [] }, "routes/admin+/_layout": { "id": "routes/admin+/_layout", "parentId": "root", "path": "admin", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/_layout-D0zbQZjf.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/progress-CF9Xwfxf.js"], "css": [] }, "routes/admin+/apps": { "id": "routes/admin+/apps", "parentId": "routes/admin+/_layout", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/apps": { "id": "routes/apps", "parentId": "root", "path": "apps", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/apps-DP2rzg_V.js", "imports": [], "css": [] }, "routes/diff": { "id": "routes/diff", "parentId": "root", "path": "diff", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/diff-DZFtsH-a.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/epic-video-BwtXsHGU.js", "/assets/progress-bar-7LK87ZMh.js", "/assets/mdx-BYvGbvEr.js", "/assets/diff-tDYfSlOc.js", "/assets/nav-chevrons-DOYtx9XE.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/discord.callback": { "id": "routes/discord.callback", "parentId": "root", "path": "discord/callback", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/discord.callback-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/exercises": { "id": "routes/exercises", "parentId": "root", "path": "exercises", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/exercises-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/launch-editor": { "id": "routes/launch-editor", "parentId": "root", "path": "launch-editor", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/launch-editor-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/login-sse": { "id": "routes/login-sse", "parentId": "root", "path": "login-sse", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/login-sse-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/onboarding": { "id": "routes/onboarding", "parentId": "root", "path": "onboarding", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/onboarding-euWyXpCL.js", "imports": ["/assets/index-D6ygCrVn.js", "/assets/clsx-B-dksMZM.js", "/assets/components-C5xBZAiL.js", "/assets/misc-DNgC2Frq.js", "/assets/request-info-Dyls4H67.js", "/assets/tooltip-Kw0lYWBI.js", "/assets/client-hints-BKxdo5Js.js", "/assets/index-Bg9MMnnf.js", "/assets/loading-C9f_vBoM.js", "/assets/button-BfWwrI9B.js", "/assets/epic-video-BwtXsHGU.js"], "css": ["/assets/epic-video-DUnRvy1A.css"] }, "routes/processes": { "id": "routes/processes", "parentId": "root", "path": "processes", "index": void 0, "caseSensitive": void 0, "hasAction": false, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/processes-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/progress": { "id": "routes/progress", "parentId": "root", "path": "progress", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/progress-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/set-playground": { "id": "routes/set-playground", "parentId": "root", "path": "set-playground", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/set-playground-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/start": { "id": "routes/start", "parentId": "root", "path": "start", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/start-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/test": { "id": "routes/test", "parentId": "root", "path": "test", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": true, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/test-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/theme/index": { "id": "routes/theme/index", "parentId": "root", "path": "theme", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/update-mdx-cache": { "id": "routes/update-mdx-cache", "parentId": "root", "path": "update-mdx-cache", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/update-mdx-cache-l0sNRNKZ.js", "imports": [], "css": [] }, "routes/video-player/index": { "id": "routes/video-player/index", "parentId": "root", "path": "video-player", "index": void 0, "caseSensitive": void 0, "hasAction": true, "hasLoader": false, "hasClientAction": false, "hasClientLoader": false, "hasErrorBoundary": false, "module": "/assets/index-K6Dvbx-E.js", "imports": [], "css": [] } }, "url": "/assets/manifest-03cfc48d.js", "version": "03cfc48d" };
12137
12116
  const mode = "production";
12138
12117
  const assetsBuildDirectory = "build/client";
12139
12118
  const basename = "/";