@epic-web/workshop-app 0.0.0-semantically-released
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.
- package/README.md +10 -0
- package/bin/epicshop.js +321 -0
- package/build/client/app-default.css +39 -0
- package/build/client/assets/_-C_7mS1-0.js +2 -0
- package/build/client/assets/_-C_7mS1-0.js.map +1 -0
- package/build/client/assets/_-l0sNRNKZ.js +2 -0
- package/build/client/assets/_-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/_basePickBy-DxgDhkrj.js +2 -0
- package/build/client/assets/_basePickBy-DxgDhkrj.js.map +1 -0
- package/build/client/assets/_baseUniq-Bh4NktJz.js +2 -0
- package/build/client/assets/_baseUniq-Bh4NktJz.js.map +1 -0
- package/build/client/assets/_exerciseNumber-D3lfJewu.js +2 -0
- package/build/client/assets/_exerciseNumber-D3lfJewu.js.map +1 -0
- package/build/client/assets/_exerciseNumber_._stepNumber-BNj079sn.js +2 -0
- package/build/client/assets/_exerciseNumber_._stepNumber-BNj079sn.js.map +1 -0
- package/build/client/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js +2 -0
- package/build/client/assets/_exerciseNumber_._stepNumber.index-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/_exerciseNumber_.finished-a6jXslNA.js +2 -0
- package/build/client/assets/_exerciseNumber_.finished-a6jXslNA.js.map +1 -0
- package/build/client/assets/_layout-B3FchrR9.js +2 -0
- package/build/client/assets/_layout-B3FchrR9.js.map +1 -0
- package/build/client/assets/_layout-B6ARVFTz.js +2 -0
- package/build/client/assets/_layout-B6ARVFTz.js.map +1 -0
- package/build/client/assets/_layout-CtqVeNw0.js +6 -0
- package/build/client/assets/_layout-CtqVeNw0.js.map +1 -0
- package/build/client/assets/_layout-dHfVo9gJ.js +2 -0
- package/build/client/assets/_layout-dHfVo9gJ.js.map +1 -0
- package/build/client/assets/accordion-PSsenYUI.js +2 -0
- package/build/client/assets/accordion-PSsenYUI.js.map +1 -0
- package/build/client/assets/account-Jl0f1Zst.js +2 -0
- package/build/client/assets/account-Jl0f1Zst.js.map +1 -0
- package/build/client/assets/api._-l0sNRNKZ.js +2 -0
- package/build/client/assets/api._-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/app-CpF0K1cW.css +1 -0
- package/build/client/assets/app-CzIg9kJh.js +2 -0
- package/build/client/assets/app-CzIg9kJh.js.map +1 -0
- package/build/client/assets/app.epic_ws_.js_-l0sNRNKZ.js +2 -0
- package/build/client/assets/app.epic_ws_.js_-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/apps-DP2rzg_V.js +2 -0
- package/build/client/assets/apps-DP2rzg_V.js.map +1 -0
- package/build/client/assets/apps-l0sNRNKZ.js +2 -0
- package/build/client/assets/apps-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/arc-B6tHINqs.js +2 -0
- package/build/client/assets/arc-B6tHINqs.js.map +1 -0
- package/build/client/assets/architectureDiagram-NQ2NVSRB-D_wGZ5nT.js +37 -0
- package/build/client/assets/architectureDiagram-NQ2NVSRB-D_wGZ5nT.js.map +1 -0
- package/build/client/assets/blockDiagram-PHRCVELO-h_TbDJvl.js +123 -0
- package/build/client/assets/blockDiagram-PHRCVELO-h_TbDJvl.js.map +1 -0
- package/build/client/assets/button-cFpvwtjC.js +2 -0
- package/build/client/assets/button-cFpvwtjC.js.map +1 -0
- package/build/client/assets/c4Diagram-6F6E4RAY-BfXjadL9.js +11 -0
- package/build/client/assets/c4Diagram-6F6E4RAY-BfXjadL9.js.map +1 -0
- package/build/client/assets/cache-l0sNRNKZ.js +2 -0
- package/build/client/assets/cache-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/channel-ClIoK57K.js +2 -0
- package/build/client/assets/channel-ClIoK57K.js.map +1 -0
- package/build/client/assets/chunk-353BL4L5-CExuR7H8.js +2 -0
- package/build/client/assets/chunk-353BL4L5-CExuR7H8.js.map +1 -0
- package/build/client/assets/chunk-67H74DCK-BF9_AOuB.js +2 -0
- package/build/client/assets/chunk-67H74DCK-BF9_AOuB.js.map +1 -0
- package/build/client/assets/chunk-6OLS64BW-B_GeRv1G.js +221 -0
- package/build/client/assets/chunk-6OLS64BW-B_GeRv1G.js.map +1 -0
- package/build/client/assets/chunk-AACKK3MU-BcoQc9Ht.js +2 -0
- package/build/client/assets/chunk-AACKK3MU-BcoQc9Ht.js.map +1 -0
- package/build/client/assets/chunk-BFAMUDN2-DBCLoV1m.js +2 -0
- package/build/client/assets/chunk-BFAMUDN2-DBCLoV1m.js.map +1 -0
- package/build/client/assets/chunk-E2GYISFI-DvCzOl_M.js +16 -0
- package/build/client/assets/chunk-E2GYISFI-DvCzOl_M.js.map +1 -0
- package/build/client/assets/chunk-QEP2MXWD-BA02qRA0.js +166 -0
- package/build/client/assets/chunk-QEP2MXWD-BA02qRA0.js.map +1 -0
- package/build/client/assets/chunk-QMGIS6GS-CG5cA6CX.js +44 -0
- package/build/client/assets/chunk-QMGIS6GS-CG5cA6CX.js.map +1 -0
- package/build/client/assets/chunk-SKB7J2MH-BG1nHV0M.js +2 -0
- package/build/client/assets/chunk-SKB7J2MH-BG1nHV0M.js.map +1 -0
- package/build/client/assets/classDiagram-BGRH5UQR-BZY1Xh5a.js +2 -0
- package/build/client/assets/classDiagram-BGRH5UQR-BZY1Xh5a.js.map +1 -0
- package/build/client/assets/classDiagram-v2-O24JOBDK-BZY1Xh5a.js +2 -0
- package/build/client/assets/classDiagram-v2-O24JOBDK-BZY1Xh5a.js.map +1 -0
- package/build/client/assets/clone-RGlausHy.js +2 -0
- package/build/client/assets/clone-RGlausHy.js.map +1 -0
- package/build/client/assets/cytoscape.esm-BBIONMvf.js +332 -0
- package/build/client/assets/cytoscape.esm-BBIONMvf.js.map +1 -0
- package/build/client/assets/dagre-FFZHY6LT-CGbe3nXJ.js +5 -0
- package/build/client/assets/dagre-FFZHY6LT-CGbe3nXJ.js.map +1 -0
- package/build/client/assets/defaultLocale-C4B-KCzX.js +2 -0
- package/build/client/assets/defaultLocale-C4B-KCzX.js.map +1 -0
- package/build/client/assets/diagram-3EMPZRKU-8UM2S96z.js +25 -0
- package/build/client/assets/diagram-3EMPZRKU-8UM2S96z.js.map +1 -0
- package/build/client/assets/diagram-5UYTHUR4-Bq8b35J7.js +25 -0
- package/build/client/assets/diagram-5UYTHUR4-Bq8b35J7.js.map +1 -0
- package/build/client/assets/diagram-ZTM2IBQH-DZ0Q3vKL.js +44 -0
- package/build/client/assets/diagram-ZTM2IBQH-DZ0Q3vKL.js.map +1 -0
- package/build/client/assets/diff-DTFs5rVO.js +2 -0
- package/build/client/assets/diff-DTFs5rVO.js.map +1 -0
- package/build/client/assets/diff-DpX_9FU6.js +2 -0
- package/build/client/assets/diff-DpX_9FU6.js.map +1 -0
- package/build/client/assets/discord-C86FbV-j.js +2 -0
- package/build/client/assets/discord-C86FbV-j.js.map +1 -0
- package/build/client/assets/discord-DOEtvB6W.js +2 -0
- package/build/client/assets/discord-DOEtvB6W.js.map +1 -0
- package/build/client/assets/entry.client-anc4-dZY.js +35 -0
- package/build/client/assets/entry.client-anc4-dZY.js.map +1 -0
- package/build/client/assets/epic-video-CCv7QINN.js +3210 -0
- package/build/client/assets/epic-video-CCv7QINN.js.map +1 -0
- package/build/client/assets/epic-video-D2Xftn6t.css +1 -0
- package/build/client/assets/epic_ws_.js_-l0sNRNKZ.js +2 -0
- package/build/client/assets/epic_ws_.js_-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/erDiagram-R3QVA2FD-Bu6B069U.js +61 -0
- package/build/client/assets/erDiagram-R3QVA2FD-Bu6B069U.js.map +1 -0
- package/build/client/assets/error-boundary-B8bEOgxp.js +2 -0
- package/build/client/assets/error-boundary-B8bEOgxp.js.map +1 -0
- package/build/client/assets/exercises-l0sNRNKZ.js +2 -0
- package/build/client/assets/exercises-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/finished-RnlPhc3t.js +2 -0
- package/build/client/assets/finished-RnlPhc3t.js.map +1 -0
- package/build/client/assets/flowDiagram-PKI6S5ZS-ie1Nf5_c.js +163 -0
- package/build/client/assets/flowDiagram-PKI6S5ZS-ie1Nf5_c.js.map +1 -0
- package/build/client/assets/ganttDiagram-EK5VF46D-BjgRWg6k.js +268 -0
- package/build/client/assets/ganttDiagram-EK5VF46D-BjgRWg6k.js.map +1 -0
- package/build/client/assets/gitGraphDiagram-GW3U2K7C-BmD31KK0.js +66 -0
- package/build/client/assets/gitGraphDiagram-GW3U2K7C-BmD31KK0.js.map +1 -0
- package/build/client/assets/graph-BBuyk5Ru.js +2 -0
- package/build/client/assets/graph-BBuyk5Ru.js.map +1 -0
- package/build/client/assets/icons-BM6r7NHK.svg +570 -0
- package/build/client/assets/index-7Ba6ptu2.js +42 -0
- package/build/client/assets/index-7Ba6ptu2.js.map +1 -0
- package/build/client/assets/index-Bp_2FjuO.js +10 -0
- package/build/client/assets/index-Bp_2FjuO.js.map +1 -0
- package/build/client/assets/index-CNmh2cao.js +2 -0
- package/build/client/assets/index-CNmh2cao.js.map +1 -0
- package/build/client/assets/index-CZ8q0Nf8.js +2 -0
- package/build/client/assets/index-CZ8q0Nf8.js.map +1 -0
- package/build/client/assets/index-DP2rzg_V.js +2 -0
- package/build/client/assets/index-DP2rzg_V.js.map +1 -0
- package/build/client/assets/index-DSMFPAn8.js +2 -0
- package/build/client/assets/index-DSMFPAn8.js.map +1 -0
- package/build/client/assets/index-DxbpRM0V.js +2 -0
- package/build/client/assets/index-DxbpRM0V.js.map +1 -0
- package/build/client/assets/index-K6Dvbx-E.js +2 -0
- package/build/client/assets/index-K6Dvbx-E.js.map +1 -0
- package/build/client/assets/index-LNXI3Vlr.js +2 -0
- package/build/client/assets/index-LNXI3Vlr.js.map +1 -0
- package/build/client/assets/index-_jNKXw67.js +2 -0
- package/build/client/assets/index-_jNKXw67.js.map +1 -0
- package/build/client/assets/index-l0sNRNKZ.js +2 -0
- package/build/client/assets/index-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/index-rknZKmMI.js +36 -0
- package/build/client/assets/index-rknZKmMI.js.map +1 -0
- package/build/client/assets/infoDiagram-RLU2ROGC-DVoDIRGH.js +3 -0
- package/build/client/assets/infoDiagram-RLU2ROGC-DVoDIRGH.js.map +1 -0
- package/build/client/assets/init-Gi6I4Gst.js +2 -0
- package/build/client/assets/init-Gi6I4Gst.js.map +1 -0
- package/build/client/assets/journeyDiagram-EWQZEKCU-C_Lb2L11.js +140 -0
- package/build/client/assets/journeyDiagram-EWQZEKCU-C_Lb2L11.js.map +1 -0
- package/build/client/assets/jsx-runtime-EKYJJIwR.js +10 -0
- package/build/client/assets/jsx-runtime-EKYJJIwR.js.map +1 -0
- package/build/client/assets/kanban-definition-ILFWEQ3N-KsekSC1N.js +90 -0
- package/build/client/assets/kanban-definition-ILFWEQ3N-KsekSC1N.js.map +1 -0
- package/build/client/assets/katex-DsmCZfJr.js +262 -0
- package/build/client/assets/katex-DsmCZfJr.js.map +1 -0
- package/build/client/assets/l-D9C1VDbZ.js +2 -0
- package/build/client/assets/l-D9C1VDbZ.js.map +1 -0
- package/build/client/assets/launch-editor-l0sNRNKZ.js +2 -0
- package/build/client/assets/launch-editor-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/layout-BkH8Qi9T.js +2 -0
- package/build/client/assets/layout-BkH8Qi9T.js.map +1 -0
- package/build/client/assets/linear-tKBS5mAJ.js +2 -0
- package/build/client/assets/linear-tKBS5mAJ.js.map +1 -0
- package/build/client/assets/loading-CZYaLyAk.js +2 -0
- package/build/client/assets/loading-CZYaLyAk.js.map +1 -0
- package/build/client/assets/login-BHKNDLwl.js +2 -0
- package/build/client/assets/login-BHKNDLwl.js.map +1 -0
- package/build/client/assets/login-sse-l0sNRNKZ.js +2 -0
- package/build/client/assets/login-sse-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/manifest-b97649b5.js +1 -0
- package/build/client/assets/mdx-BEhxx-X4.js +3 -0
- package/build/client/assets/mdx-BEhxx-X4.js.map +1 -0
- package/build/client/assets/mermaid.core-CqaUvNIK.js +214 -0
- package/build/client/assets/mermaid.core-CqaUvNIK.js.map +1 -0
- package/build/client/assets/mindmap-definition-CZNETY7S-BGn0gmpB.js +96 -0
- package/build/client/assets/mindmap-definition-CZNETY7S-BGn0gmpB.js.map +1 -0
- package/build/client/assets/misc-COGqV2fm.js +2 -0
- package/build/client/assets/misc-COGqV2fm.js.map +1 -0
- package/build/client/assets/nav-chevrons-Cxzx0j13.js +2 -0
- package/build/client/assets/nav-chevrons-Cxzx0j13.js.map +1 -0
- package/build/client/assets/notifications-l0sNRNKZ.js +2 -0
- package/build/client/assets/notifications-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/og-l0sNRNKZ.js +2 -0
- package/build/client/assets/og-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/onboarding-7Vho777l.js +2 -0
- package/build/client/assets/onboarding-7Vho777l.js.map +1 -0
- package/build/client/assets/online-CwZkKwTv.js +2 -0
- package/build/client/assets/online-CwZkKwTv.js.map +1 -0
- package/build/client/assets/ordinal-Cboi1Yqb.js +2 -0
- package/build/client/assets/ordinal-Cboi1Yqb.js.map +1 -0
- package/build/client/assets/pe-DoDyGTeN.js +2 -0
- package/build/client/assets/pe-DoDyGTeN.js.map +1 -0
- package/build/client/assets/pieDiagram-NIOCPIFQ-TwGmrzCW.js +31 -0
- package/build/client/assets/pieDiagram-NIOCPIFQ-TwGmrzCW.js.map +1 -0
- package/build/client/assets/preferences-Dx_EUPYj.js +2 -0
- package/build/client/assets/preferences-Dx_EUPYj.js.map +1 -0
- package/build/client/assets/presence-tDxUeb6L.js +28 -0
- package/build/client/assets/presence-tDxUeb6L.js.map +1 -0
- package/build/client/assets/preview-COuApZAb.js +2 -0
- package/build/client/assets/preview-COuApZAb.js.map +1 -0
- package/build/client/assets/processes-l0sNRNKZ.js +2 -0
- package/build/client/assets/processes-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/product-DNKDVhI_.js +2 -0
- package/build/client/assets/product-DNKDVhI_.js.map +1 -0
- package/build/client/assets/progress-DKsShYpv.js +2 -0
- package/build/client/assets/progress-DKsShYpv.js.map +1 -0
- package/build/client/assets/progress-bar-Cww9t8Vn.js +2 -0
- package/build/client/assets/progress-bar-Cww9t8Vn.js.map +1 -0
- package/build/client/assets/progress-l0sNRNKZ.js +2 -0
- package/build/client/assets/progress-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/quadrantDiagram-2OG54O6I-C2FaFW77.js +8 -0
- package/build/client/assets/quadrantDiagram-2OG54O6I-C2FaFW77.js.map +1 -0
- package/build/client/assets/requirementDiagram-SO3GGRV7-BENrmejn.js +65 -0
- package/build/client/assets/requirementDiagram-SO3GGRV7-BENrmejn.js.map +1 -0
- package/build/client/assets/revalidation-ws-DJwDeSaI.js +2 -0
- package/build/client/assets/revalidation-ws-DJwDeSaI.js.map +1 -0
- package/build/client/assets/robots_._txt-l0sNRNKZ.js +2 -0
- package/build/client/assets/robots_._txt-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/root-30K5JoaI.js +2 -0
- package/build/client/assets/root-30K5JoaI.js.map +1 -0
- package/build/client/assets/sankeyDiagram-4UZDY2LN-DHcxz6y6.js +11 -0
- package/build/client/assets/sankeyDiagram-4UZDY2LN-DHcxz6y6.js.map +1 -0
- package/build/client/assets/seo-t5J-DRxw.js +2 -0
- package/build/client/assets/seo-t5J-DRxw.js.map +1 -0
- package/build/client/assets/sequenceDiagram-ZIKVLSP4-wsbYfOcv.js +123 -0
- package/build/client/assets/sequenceDiagram-ZIKVLSP4-wsbYfOcv.js.map +1 -0
- package/build/client/assets/set-playground-Bx0yIjpY.js +2 -0
- package/build/client/assets/set-playground-Bx0yIjpY.js.map +1 -0
- package/build/client/assets/set-playground-l0sNRNKZ.js +2 -0
- package/build/client/assets/set-playground-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/sitemap_._xml-l0sNRNKZ.js +2 -0
- package/build/client/assets/sitemap_._xml-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/start-l0sNRNKZ.js +2 -0
- package/build/client/assets/start-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/stateDiagram-XX37X6EN-D8VCWzU7.js +2 -0
- package/build/client/assets/stateDiagram-XX37X6EN-D8VCWzU7.js.map +1 -0
- package/build/client/assets/stateDiagram-v2-GD6S3NHB-CWoWkzf7.js +2 -0
- package/build/client/assets/stateDiagram-v2-GD6S3NHB-CWoWkzf7.js.map +1 -0
- package/build/client/assets/support-BnsTkkCH.js +2 -0
- package/build/client/assets/support-BnsTkkCH.js.map +1 -0
- package/build/client/assets/tailwind-Dqccob1p.css +1 -0
- package/build/client/assets/test-B2dwsj84.js +2 -0
- package/build/client/assets/test-B2dwsj84.js.map +1 -0
- package/build/client/assets/test-l0sNRNKZ.js +2 -0
- package/build/client/assets/test-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/test._testName-l0sNRNKZ.js +2 -0
- package/build/client/assets/test._testName-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/test.epic_ws_.js_-l0sNRNKZ.js +2 -0
- package/build/client/assets/test.epic_ws_.js_-l0sNRNKZ.js.map +1 -0
- package/build/client/assets/tests-DvbNIXBP.js +4 -0
- package/build/client/assets/tests-DvbNIXBP.js.map +1 -0
- package/build/client/assets/timeline-definition-RI47OAVP-D44Hv-fs.js +62 -0
- package/build/client/assets/timeline-definition-RI47OAVP-D44Hv-fs.js.map +1 -0
- package/build/client/assets/tooltip-Cm7A1uIP.js +2 -0
- package/build/client/assets/tooltip-Cm7A1uIP.js.map +1 -0
- package/build/client/assets/treemap-FKARHQ26-COx8AcUM.js +129 -0
- package/build/client/assets/treemap-FKARHQ26-COx8AcUM.js.map +1 -0
- package/build/client/assets/use-event-source-DDlZtAwc.js +2 -0
- package/build/client/assets/use-event-source-DDlZtAwc.js.map +1 -0
- package/build/client/assets/user-BQ8D2Fty.js +2 -0
- package/build/client/assets/user-BQ8D2Fty.js.map +1 -0
- package/build/client/assets/version-CG_ZHfTC.js +2 -0
- package/build/client/assets/version-CG_ZHfTC.js.map +1 -0
- package/build/client/assets/workshop-config-5VcXxeyp.js +2 -0
- package/build/client/assets/workshop-config-5VcXxeyp.js.map +1 -0
- package/build/client/assets/xychartDiagram-H2YORKM3-rhbSyPlb.js +8 -0
- package/build/client/assets/xychartDiagram-H2YORKM3-rhbSyPlb.js.map +1 -0
- package/build/client/favicon.ico +0 -0
- package/build/client/favicon.png +0 -0
- package/build/client/favicon.svg +13 -0
- package/build/client/fonts/neogrotesk/0b8b755c-fee2-4661-9c8b-c5d1fbea901b.woff2 +0 -0
- package/build/client/fonts/neogrotesk/146d9d20-3e53-4e5d-beb2-1209bba5ac61.woff2 +0 -0
- package/build/client/fonts/neogrotesk/1798ef2b-5ee0-4f39-8b2c-ae3e36f07cd1.woff2 +0 -0
- package/build/client/fonts/neogrotesk/1eb2cb40-6822-4654-856c-8cbe652366b6.woff +0 -0
- package/build/client/fonts/neogrotesk/3b64793c-0bdb-4e4f-bf0e-cdf2e974d5f2.woff +0 -0
- package/build/client/fonts/neogrotesk/3bb44ed4-cf17-469c-8d0d-5946d10fdad1.woff +0 -0
- package/build/client/fonts/neogrotesk/4bd29470-1701-41fe-94b6-4a147512160c.woff +0 -0
- package/build/client/fonts/neogrotesk/5cdbf070-a094-44c8-b8f1-17a00a19c959.woff2 +0 -0
- package/build/client/fonts/neogrotesk/6d439be9-37df-4912-ac09-388ce938fa46.woff2 +0 -0
- package/build/client/fonts/neogrotesk/7fc2971f-a9c2-4e09-bd24-bfd4ee6e97b3.woff +0 -0
- package/build/client/fonts/neogrotesk/861b65ee-56bd-4057-9af4-3b2903af231e.woff +0 -0
- package/build/client/fonts/neogrotesk/8cf836d9-a49e-4387-bcbd-4800766e5d24.woff +0 -0
- package/build/client/fonts/neogrotesk/8d61128d-534c-4793-9668-b98bcc2e5969.woff2 +0 -0
- package/build/client/fonts/neogrotesk/98423f75-c341-4161-8b92-7cd5c05081e5.woff +0 -0
- package/build/client/fonts/neogrotesk/a1456726-ad0d-4f5e-9d8f-ce92e8ce375d.woff2 +0 -0
- package/build/client/fonts/neogrotesk/af81e7d2-0bb1-4aa0-bc76-adb78338c568.woff +0 -0
- package/build/client/fonts/neogrotesk/d1302ad5-ceee-47cb-a0fa-2da6bd0d4d54.woff2 +0 -0
- package/build/client/fonts/neogrotesk/e7e15c31-aad1-4384-abd3-0671ccd03251.woff +0 -0
- package/build/client/fonts/neogrotesk/ec6cb127-161b-469c-9816-69489032a234.woff2 +0 -0
- package/build/client/fonts/neogrotesk/f480430c-6c50-4ae3-9abb-e92c484f84d6.woff2 +0 -0
- package/build/client/img/tiffany.png +0 -0
- package/build/client/logo.svg +48 -0
- package/build/client/neogrotesk-font.css +100 -0
- package/build/client/og/background.png +0 -0
- package/build/client/og/logo.svg +1 -0
- package/build/server/index.js +11899 -0
- package/build/server/index.js.map +1 -0
- package/dist/server/index.js +247 -0
- package/package.json +1 -0
- package/start.js +50 -0
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
import path from "path";
|
|
3
|
+
import { fileURLToPath } from "url";
|
|
4
|
+
import { getPresentUsers } from "@epic-web/workshop-presence/presence.server";
|
|
5
|
+
import {
|
|
6
|
+
getApps,
|
|
7
|
+
getWorkshopRoot,
|
|
8
|
+
init as initApps,
|
|
9
|
+
setModifiedTimesForAppDirs
|
|
10
|
+
} from "@epic-web/workshop-utils/apps.server";
|
|
11
|
+
import { checkForUpdatesCached } from "@epic-web/workshop-utils/git.server";
|
|
12
|
+
import { checkConnectionCached } from "@epic-web/workshop-utils/utils.server";
|
|
13
|
+
import { createRequestHandler } from "@react-router/express";
|
|
14
|
+
import { ip as ipAddress } from "address";
|
|
15
|
+
import chalk from "chalk";
|
|
16
|
+
import chokidar from "chokidar";
|
|
17
|
+
import closeWithGrace from "close-with-grace";
|
|
18
|
+
import compression from "compression";
|
|
19
|
+
import express from "express";
|
|
20
|
+
import getPort, { portNumbers } from "get-port";
|
|
21
|
+
import morgan from "morgan";
|
|
22
|
+
import sourceMapSupport from "source-map-support";
|
|
23
|
+
import { WebSocketServer } from "ws";
|
|
24
|
+
const MODE = process.env.NODE_ENV ?? "development";
|
|
25
|
+
void initApps();
|
|
26
|
+
sourceMapSupport.install();
|
|
27
|
+
const viteDevServer = process.env.NODE_ENV === "production" ? null : await import("vite").then(
|
|
28
|
+
(vite) => vite.createServer({
|
|
29
|
+
server: { middlewareMode: true },
|
|
30
|
+
appType: "custom"
|
|
31
|
+
})
|
|
32
|
+
);
|
|
33
|
+
const isProd = process.env.NODE_ENV === "production";
|
|
34
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const isPublished = !fs.existsSync(path.join(__dirname, "..", "app"));
|
|
36
|
+
const isDeployed = process.env.EPICSHOP_DEPLOYED === "true" || process.env.EPICSHOP_DEPLOYED === "1";
|
|
37
|
+
const isRunningInBuildDir = path.dirname(__dirname).endsWith("dist");
|
|
38
|
+
const epicshopAppRootDir = isRunningInBuildDir ? path.join(__dirname, "..", "..") : path.join(__dirname, "..");
|
|
39
|
+
const hasUpdatesPromise = checkForUpdatesCached();
|
|
40
|
+
void getApps();
|
|
41
|
+
void checkConnectionCached();
|
|
42
|
+
void getPresentUsers();
|
|
43
|
+
const app = express();
|
|
44
|
+
app.get(
|
|
45
|
+
"/.well-known/appspecific/com.chrome.devtools.json",
|
|
46
|
+
(req, res) => {
|
|
47
|
+
return res.status(404).send("Not found");
|
|
48
|
+
}
|
|
49
|
+
);
|
|
50
|
+
app.use(compression());
|
|
51
|
+
app.disable("x-powered-by");
|
|
52
|
+
app.use(
|
|
53
|
+
express.static(path.join(getWorkshopRoot(), "public"), {
|
|
54
|
+
maxAge: isProd ? "1h" : 0
|
|
55
|
+
})
|
|
56
|
+
);
|
|
57
|
+
if (viteDevServer) {
|
|
58
|
+
app.use(viteDevServer.middlewares);
|
|
59
|
+
} else {
|
|
60
|
+
app.use(
|
|
61
|
+
express.static(path.join(epicshopAppRootDir, "build/client"), {
|
|
62
|
+
maxAge: isProd ? "1h" : 0
|
|
63
|
+
})
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
if (process.env.NODE_ENV !== "production" && !isPublished || isDeployed) {
|
|
67
|
+
morgan.token("url", (req) => decodeURIComponent(req.url ?? ""));
|
|
68
|
+
app.use(morgan("tiny"));
|
|
69
|
+
}
|
|
70
|
+
function getNumberOrNull(value) {
|
|
71
|
+
if (value == null) return null;
|
|
72
|
+
const number = Number(value);
|
|
73
|
+
return Number.isNaN(number) ? null : number;
|
|
74
|
+
}
|
|
75
|
+
app.use((req, res, next) => {
|
|
76
|
+
const [path2 = "", search] = req.url.split("?");
|
|
77
|
+
const segments = path2.split("/").map((s) => s.trim()).filter(Boolean);
|
|
78
|
+
let [first, second, ...rest] = segments;
|
|
79
|
+
let leading = "";
|
|
80
|
+
if (segments[0] === "app") {
|
|
81
|
+
leading = "/app";
|
|
82
|
+
[first, second, ...rest] = segments.slice(1);
|
|
83
|
+
}
|
|
84
|
+
if (segments[0] === "exercise") {
|
|
85
|
+
leading = "/exercise";
|
|
86
|
+
[first, second, ...rest] = segments.slice(1);
|
|
87
|
+
}
|
|
88
|
+
const firstNumber = getNumberOrNull(first);
|
|
89
|
+
const secondNumber = getNumberOrNull(second);
|
|
90
|
+
if (firstNumber === null && secondNumber === null) return next();
|
|
91
|
+
if (firstNumber != null) first = firstNumber.toString().padStart(2, "0");
|
|
92
|
+
if (secondNumber != null) second = secondNumber.toString().padStart(2, "0");
|
|
93
|
+
const updatedPath = `${leading}/${[first, second, ...rest].filter(Boolean).join("/")}`;
|
|
94
|
+
const updatedUrl = search ? `${updatedPath}?${search}` : updatedPath;
|
|
95
|
+
if (req.url !== updatedUrl) {
|
|
96
|
+
return res.redirect(302, updatedUrl);
|
|
97
|
+
}
|
|
98
|
+
next();
|
|
99
|
+
});
|
|
100
|
+
async function getBuild() {
|
|
101
|
+
const build = viteDevServer ? viteDevServer.ssrLoadModule("virtual:react-router/server-build") : (
|
|
102
|
+
// @ts-ignore this should exist before running the server
|
|
103
|
+
// but it may not exist just yet.
|
|
104
|
+
await import("#build/server/index.js")
|
|
105
|
+
);
|
|
106
|
+
return build;
|
|
107
|
+
}
|
|
108
|
+
app.all(
|
|
109
|
+
"*splat",
|
|
110
|
+
createRequestHandler({
|
|
111
|
+
getLoadContext: () => ({ serverBuild: getBuild() }),
|
|
112
|
+
mode: MODE,
|
|
113
|
+
build: getBuild
|
|
114
|
+
})
|
|
115
|
+
);
|
|
116
|
+
const desiredPort = Number(process.env.PORT || 5639);
|
|
117
|
+
const portToUse = await getPort({
|
|
118
|
+
port: portNumbers(desiredPort, desiredPort + 100)
|
|
119
|
+
});
|
|
120
|
+
const localIp = ipAddress() ?? "Unknown";
|
|
121
|
+
const lanUrl = /^10[.]|^172[.](1[6-9]|2[0-9]|3[0-1])[.]|^192[.]168[.]/.test(
|
|
122
|
+
localIp
|
|
123
|
+
) ? `http://${localIp}:${portToUse}` : null;
|
|
124
|
+
const server = app.listen(portToUse, async () => {
|
|
125
|
+
const addy = server.address();
|
|
126
|
+
const portUsed = desiredPort === portToUse ? desiredPort : addy && typeof addy === "object" ? addy.port : 0;
|
|
127
|
+
if (portUsed !== desiredPort) {
|
|
128
|
+
console.warn(
|
|
129
|
+
chalk.yellow(
|
|
130
|
+
`\u26A0\uFE0F Port ${desiredPort} is not available, using ${portUsed} instead.`
|
|
131
|
+
)
|
|
132
|
+
);
|
|
133
|
+
}
|
|
134
|
+
console.log(`\u{1F428} Let's get learning!`);
|
|
135
|
+
const localUrl = `http://localhost:${portUsed}`;
|
|
136
|
+
console.log(
|
|
137
|
+
`
|
|
138
|
+
${chalk.bold("Local:")} ${chalk.cyan(localUrl)}
|
|
139
|
+
${lanUrl ? `${chalk.bold("On Your Network:")} ${chalk.cyan(lanUrl)}` : ""}
|
|
140
|
+
${chalk.bold("Press Ctrl+C to stop")}
|
|
141
|
+
`.trim()
|
|
142
|
+
);
|
|
143
|
+
if (process.env.EPICSHOP_DEPLOYED !== "true" && process.env.EPICSHOP_ENABLE_WATCHER === "true") {
|
|
144
|
+
const watches = /* @__PURE__ */ new Map();
|
|
145
|
+
const wss = new WebSocketServer({ noServer: true });
|
|
146
|
+
server.on("upgrade", (request, socket, head) => {
|
|
147
|
+
const url = new URL(request.url ?? "/", "ws://localhost:0000");
|
|
148
|
+
if (url.pathname === "/__ws") {
|
|
149
|
+
const origin = request.headers.origin;
|
|
150
|
+
const isValidOrigin = origin && (origin === `http://localhost:${portToUse}` || origin === `http://127.0.0.1:${portToUse}` || lanUrl && origin === lanUrl);
|
|
151
|
+
if (!isValidOrigin) {
|
|
152
|
+
socket.write("HTTP/1.1 403 Forbidden\r\n\r\n");
|
|
153
|
+
socket.destroy();
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
wss.handleUpgrade(request, socket, head, (ws) => {
|
|
157
|
+
const watchPaths = url.searchParams.getAll("watch");
|
|
158
|
+
if (watchPaths.length === 0) {
|
|
159
|
+
socket.destroy();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const key = watchPaths.join("&&");
|
|
163
|
+
let watcher = watches.get(key);
|
|
164
|
+
if (!watcher) {
|
|
165
|
+
const chok = chokidar.watch(watchPaths, {
|
|
166
|
+
cwd: getWorkshopRoot(),
|
|
167
|
+
ignoreInitial: true,
|
|
168
|
+
ignored: [
|
|
169
|
+
`/.git/`,
|
|
170
|
+
`/node_modules/`,
|
|
171
|
+
`/build/`,
|
|
172
|
+
`/server-build/`,
|
|
173
|
+
`/playwright-report/`,
|
|
174
|
+
`/dist/`,
|
|
175
|
+
`/.cache/`
|
|
176
|
+
]
|
|
177
|
+
});
|
|
178
|
+
watcher = { clients: /* @__PURE__ */ new Set(), chok };
|
|
179
|
+
watches.set(key, watcher);
|
|
180
|
+
let timer = null;
|
|
181
|
+
let fileChanges = /* @__PURE__ */ new Set();
|
|
182
|
+
watcher.chok.on("all", (event, filePath) => {
|
|
183
|
+
fileChanges.add(path.join(getWorkshopRoot(), filePath));
|
|
184
|
+
if (timer) return;
|
|
185
|
+
timer = setTimeout(async () => {
|
|
186
|
+
for (const client of watcher?.clients ?? []) {
|
|
187
|
+
client.send(
|
|
188
|
+
JSON.stringify({
|
|
189
|
+
type: "epicshop:file-change",
|
|
190
|
+
data: { event, filePaths: Array.from(fileChanges) }
|
|
191
|
+
})
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
setModifiedTimesForAppDirs(...Array.from(fileChanges));
|
|
195
|
+
fileChanges = /* @__PURE__ */ new Set();
|
|
196
|
+
timer = null;
|
|
197
|
+
}, 50);
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
watcher.clients.add(ws);
|
|
201
|
+
ws.on("close", () => {
|
|
202
|
+
watcher?.clients.delete(ws);
|
|
203
|
+
if (watcher?.clients.size === 0) {
|
|
204
|
+
watches.delete(key);
|
|
205
|
+
void watcher.chok.close();
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
} else {
|
|
210
|
+
socket.destroy();
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
closeWithGrace(async () => {
|
|
214
|
+
await Promise.all([
|
|
215
|
+
...Array.from(watches.values()).map((watcher) => watcher.chok.close()),
|
|
216
|
+
new Promise((resolve, reject) => {
|
|
217
|
+
wss.close((e) => e ? reject(e) : resolve("ok"));
|
|
218
|
+
})
|
|
219
|
+
]);
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
const hasUpdates = await hasUpdatesPromise;
|
|
223
|
+
if (hasUpdates.updatesAvailable) {
|
|
224
|
+
const updateCommand = chalk.blue.bold.bgWhite(" npx update-epic-workshop ");
|
|
225
|
+
const updateLink = chalk.blue.bgWhite(` ${hasUpdates.diffLink} `);
|
|
226
|
+
console.log(
|
|
227
|
+
"\n",
|
|
228
|
+
`\u{1F389} There are ${chalk.yellow(
|
|
229
|
+
"updates available"
|
|
230
|
+
)} for this workshop repository. \u{1F389}
|
|
231
|
+
|
|
232
|
+
To get the updates, ${chalk.green.bold.bgWhite(
|
|
233
|
+
`press the "u" key`
|
|
234
|
+
)} or stop the server and run the following command:
|
|
235
|
+
|
|
236
|
+
${updateCommand}
|
|
237
|
+
|
|
238
|
+
To view a diff, check:
|
|
239
|
+
${updateLink}`
|
|
240
|
+
);
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
closeWithGrace(() => {
|
|
244
|
+
return new Promise((resolve, reject) => {
|
|
245
|
+
server.close((e) => e ? reject(e) : resolve());
|
|
246
|
+
});
|
|
247
|
+
});
|
package/package.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"name":"@epic-web/workshop-app","version":"0.0.0-semantically-released","sideEffects":false,"publishConfig":{"access":"public"},"bin":{"epicshop":"./bin/epicshop.js"},"files":["bin","build","dist","start.js"],"type":"module","imports":{"#app/*":"./app/*","#tests/*":"./tests/*","#build/*":"./build/*"},"exports":{"./start":{"default":"./start.js"}},"scripts":{"build":"run-p --print-label --print-name build:*","build:app":"react-router build --sourcemapClient --sourcemapServer","build:server":"tsx ./other/build-dir.ts server","dev":"node ./server/dev-server.js","format":"prettier --write .","lint":"eslint --cache --cache-location ./node_modules/.cache/eslint .","start":"cross-env NODE_ENV=production node ./start.js","typecheck":"react-router typegen && tsc --noEmit","validate":"run-p lint typecheck"},"dependencies":{"@conform-to/react":"^1.8.0","@conform-to/zod":"^1.8.0","@epic-web/cachified":"^5.6.0","@epic-web/client-hints":"^1.3.5","@epic-web/invariant":"^1.0.0","@epic-web/remember":"^1.1.0","@epic-web/restore-scroll":"^2.0.0","@epic-web/workshop-presence":"^5.29.2","@epic-web/workshop-utils":"^5.29.2","@mdx-js/mdx":"^3.1.0","@mux/mux-player-react":"^3.5.0","@nasa-gcn/remix-seo":"^2.0.1","@paralleldrive/cuid2":"^2.2.2","@radix-ui/react-accordion":"^1.2.11","@radix-ui/react-dialog":"^1.1.14","@radix-ui/react-popover":"^1.1.14","@radix-ui/react-select":"^2.2.5","@radix-ui/react-tabs":"^1.1.12","@radix-ui/react-toast":"^1.2.14","@radix-ui/react-tooltip":"^1.2.7","@react-router/express":"^7.6.3","@react-router/node":"^7.6.3","@react-router/remix-routes-option-adapter":"^7.6.3","@resvg/resvg-js":"^2.6.2","@sindresorhus/slugify":"^2.2.1","address":"^2.0.3","ansi-to-html":"^0.7.2","chalk":"^5.4.1","chokidar":"^4.0.3","close-with-grace":"^2.2.0","clsx":"^2.1.1","compression":"^1.8.0","confetti-react":"^2.6.0","cookie":"^1.0.2","cross-env":"^7.0.3","cross-spawn":"^7.0.6","dotenv":"^17.0.1","esbuild":"^0.25.5","etag":"^1.8.1","execa":"^9.6.0","express":"^5.1.0","fkill":"^9.0.0","framer-motion":"^12.23.0","fs-extra":"^11.3.0","get-port":"^7.1.0","glob":"^11.0.3","isbot":"^5.1.28","lru-cache":"^11.1.0","md5-hex":"^5.0.0","mdx-bundler":"^10.1.1","mermaid":"^11.8.0","mime-types":"^3.0.1","morgan":"^1.10.0","msw":"^2.10.2","open":"^10.1.2","openid-client":"^6.6.2","p-queue":"^8.1.0","partysocket":"^1.1.4","react":"^19.1.0","react-dom":"^19.1.0","react-router":"^7.6.3","remix-flat-routes":"^0.8.5","remix-utils":"^8.7.0","satori":"^0.15.2","shell-quote":"^1.8.3","sonner":"^2.0.6","source-map-support":"^0.5.21","spin-delay":"^2.0.1","tailwind-merge":"^2.6.0","vite-env-only":"^3.0.3","ws":"^8.18.3","zod":"^3.25.71"},"devDependencies":{"@playwright/test":"^1.53.2","@react-router/dev":"^7.6.3","@tailwindcss/typography":"^0.5.16","@testing-library/dom":"^10.4.0","@total-typescript/ts-reset":"^0.6.1","@types/compression":"^1.8.1","@types/cross-spawn":"^6.0.6","@types/etag":"^1.8.4","@types/express":"^5.0.3","@types/fs-extra":"^11.0.4","@types/hast":"^3.0.4","@types/lodash.escape":"^4.0.9","@types/mdast":"^4.0.4","@types/mime-types":"^3.0.1","@types/morgan":"^1.9.10","@types/node":"^24.0.10","@types/react":"^19.1.8","@types/react-dom":"^19.1.6","@types/shell-quote":"^1.7.5","@types/source-map-support":"^0.5.10","@types/wait-on":"^5.3.4","@types/ws":"^8.18.1","autoprefixer":"^10.4.21","eslint":"^9.30.1","mdast-util-mdx-jsx":"^3.2.0","npm-run-all":"^4.1.5","prettier":"^3.6.2","prettier-plugin-tailwindcss":"^0.6.13","tailwind-scrollbar":"^3.1.0","tailwindcss":"^3.4.13","tailwindcss-animate":"^1.0.7","tailwindcss-radix":"^3.0.5","tailwindcss-safe-area":"^0.6.0","tsx":"^4.20.3","typescript":"^5.8.3","vite":"^7.0.1"},"engines":{"node":"20 || 22 || 24"},"repository":{"type":"git","url":"https://github.com/epicweb-dev/epicshop.git","directory":"packages/workshop-app"}}
|
package/start.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import fs from 'fs/promises'
|
|
2
|
+
import path from 'path'
|
|
3
|
+
import dotenv from 'dotenv'
|
|
4
|
+
|
|
5
|
+
if (process.env.EPICSHOP_SLOW_START === 'true') {
|
|
6
|
+
// slow start is used when doing the update-repo action to give time for the
|
|
7
|
+
// old server to exist before the new server starts (so ports are freed up).
|
|
8
|
+
await new Promise((resolve) => setTimeout(resolve, 1000))
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const packageJson = JSON.parse(
|
|
12
|
+
await fs.readFile(path.resolve(process.cwd(), 'package.json'), 'utf-8'),
|
|
13
|
+
)
|
|
14
|
+
|
|
15
|
+
process.env.EPICSHOP_APP_VERSION ??= packageJson.version
|
|
16
|
+
process.env.NODE_ENV ??= 'development'
|
|
17
|
+
process.env.EPICSHOP_ENABLE_WATCHER ??= 'true'
|
|
18
|
+
const EPICSHOP_CONTEXT_CWD = process.env.EPICSHOP_CONTEXT_CWD ?? process.cwd()
|
|
19
|
+
dotenv.config({
|
|
20
|
+
quiet: true,
|
|
21
|
+
path: path.join(EPICSHOP_CONTEXT_CWD, '.env'),
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
if (process.env.NODE_ENV === 'production') {
|
|
25
|
+
await import('./dist/server/index.js').catch((err) => {
|
|
26
|
+
console.error(
|
|
27
|
+
'Encountered error importing the production server, exiting...',
|
|
28
|
+
)
|
|
29
|
+
console.error(err)
|
|
30
|
+
process.exit(1)
|
|
31
|
+
})
|
|
32
|
+
} else {
|
|
33
|
+
await import('./server/index.ts').catch((err) => {
|
|
34
|
+
console.error(
|
|
35
|
+
'Encountered error importing the development server, exiting...',
|
|
36
|
+
)
|
|
37
|
+
console.error(err)
|
|
38
|
+
process.exit(1)
|
|
39
|
+
})
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
process.on('unhandledRejection', (reason, promise) => {
|
|
43
|
+
console.error(
|
|
44
|
+
'Unhandled Rejection for: ',
|
|
45
|
+
promise,
|
|
46
|
+
'\nWith the reason: ',
|
|
47
|
+
reason,
|
|
48
|
+
)
|
|
49
|
+
throw reason
|
|
50
|
+
})
|