@epic-web/workshop-app 6.10.0 → 6.11.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.
package/dist/server/index.js
CHANGED
|
@@ -111,27 +111,12 @@ async function getBuild() {
|
|
|
111
111
|
);
|
|
112
112
|
return build;
|
|
113
113
|
}
|
|
114
|
-
app.all(
|
|
115
|
-
"*splat",
|
|
116
|
-
createRequestHandler({
|
|
117
|
-
getLoadContext: () => ({ serverBuild: getBuild() }),
|
|
118
|
-
mode: MODE,
|
|
119
|
-
build: getBuild
|
|
120
|
-
})
|
|
121
|
-
);
|
|
122
|
-
const SENTRY_ENABLED = Boolean(
|
|
123
|
-
ENV.EPICSHOP_IS_PUBLISHED && process.env.SENTRY_DSN
|
|
124
|
-
);
|
|
125
|
-
if (SENTRY_ENABLED) {
|
|
126
|
-
const Sentry = await import("@sentry/react-router");
|
|
127
|
-
Sentry.setupExpressErrorHandler(app);
|
|
128
|
-
}
|
|
129
114
|
const desiredPort = Number(process.env.PORT || 5639);
|
|
130
115
|
const portToUse = await getPort({
|
|
131
116
|
port: portNumbers(desiredPort, desiredPort + 100)
|
|
132
117
|
});
|
|
133
118
|
if (!ENV.EPICSHOP_DEPLOYED) {
|
|
134
|
-
app.use((req, res, next) => {
|
|
119
|
+
app.use(async (req, res, next) => {
|
|
135
120
|
const config = getWorkshopConfig();
|
|
136
121
|
if (!config.subdomain) {
|
|
137
122
|
return next();
|
|
@@ -139,12 +124,27 @@ if (!ENV.EPICSHOP_DEPLOYED) {
|
|
|
139
124
|
const host = req.headers.host;
|
|
140
125
|
const expectedHost = `${config.subdomain}.localhost`;
|
|
141
126
|
if (host && !host.startsWith(expectedHost)) {
|
|
142
|
-
const redirectUrl = getWorkshopUrl(portToUse);
|
|
143
|
-
return res.redirect(
|
|
127
|
+
const redirectUrl = await getWorkshopUrl(portToUse);
|
|
128
|
+
return res.redirect(307, `${redirectUrl}${req.url}`);
|
|
144
129
|
}
|
|
145
130
|
next();
|
|
146
131
|
});
|
|
147
132
|
}
|
|
133
|
+
app.all(
|
|
134
|
+
"*splat",
|
|
135
|
+
createRequestHandler({
|
|
136
|
+
getLoadContext: () => ({ serverBuild: getBuild() }),
|
|
137
|
+
mode: MODE,
|
|
138
|
+
build: getBuild
|
|
139
|
+
})
|
|
140
|
+
);
|
|
141
|
+
const SENTRY_ENABLED = Boolean(
|
|
142
|
+
ENV.EPICSHOP_IS_PUBLISHED && process.env.SENTRY_DSN
|
|
143
|
+
);
|
|
144
|
+
if (SENTRY_ENABLED) {
|
|
145
|
+
const Sentry = await import("@sentry/react-router");
|
|
146
|
+
Sentry.setupExpressErrorHandler(app);
|
|
147
|
+
}
|
|
148
148
|
const localIp = ipAddress() ?? "Unknown";
|
|
149
149
|
const lanUrl = /^10[.]|^172[.](1[6-9]|2[0-9]|3[0-1])[.]|^192[.]168[.]/.test(
|
|
150
150
|
localIp
|
|
@@ -160,7 +160,7 @@ const server = app.listen(portToUse, async () => {
|
|
|
160
160
|
);
|
|
161
161
|
}
|
|
162
162
|
console.log(`\u{1F428} Let's get learning!`);
|
|
163
|
-
const localUrl = getWorkshopUrl(portUsed);
|
|
163
|
+
const localUrl = await getWorkshopUrl(portUsed);
|
|
164
164
|
console.log(
|
|
165
165
|
`
|
|
166
166
|
${chalk.bold("Local:")} ${chalk.cyan(localUrl)}
|
|
@@ -173,11 +173,11 @@ ${lanUrl ? `${chalk.bold("On Your Network:")} ${chalk.cyan(lanUrl)}` : ""}
|
|
|
173
173
|
if (!ENV.EPICSHOP_DEPLOYED && process.env.EPICSHOP_ENABLE_WATCHER) {
|
|
174
174
|
const watches = /* @__PURE__ */ new Map();
|
|
175
175
|
const wss = new WebSocketServer({ noServer: true });
|
|
176
|
-
server.on("upgrade", (request, socket, head) => {
|
|
176
|
+
server.on("upgrade", async (request, socket, head) => {
|
|
177
177
|
const url = new URL(request.url ?? "/", "ws://localhost:0000");
|
|
178
178
|
if (url.pathname === "/__ws") {
|
|
179
179
|
const origin = request.headers.origin;
|
|
180
|
-
const workshopUrl = getWorkshopUrl(portToUse);
|
|
180
|
+
const workshopUrl = await getWorkshopUrl(portToUse);
|
|
181
181
|
const isValidOrigin = origin && (origin === workshopUrl || origin === `http://localhost:${portToUse}` || origin === `http://127.0.0.1:${portToUse}` || lanUrl && origin === lanUrl);
|
|
182
182
|
if (!isValidOrigin) {
|
|
183
183
|
socket.write("HTTP/1.1 403 Forbidden\r\n\r\n");
|
package/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"@epic-web/workshop-app","version":"6.
|
|
1
|
+
{"name":"@epic-web/workshop-app","version":"6.11.1","sideEffects":false,"publishConfig":{"access":"public"},"files":["build","dist","start.js"],"type":"module","imports":{"#app/*":"./app/*","#tests/*":"./tests/*","#build/*":"./build/*"},"exports":{"./start":"./start.js","./package.json":"./package.json","./instrument":"./instrument.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":"6.11.1","@epic-web/workshop-utils":"6.11.1","@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","@sentry/profiling-node":"^9.35.0","@sentry/react-router":"^9.35.0","@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"}}
|