Bootstraps from Shopify's official shopify-app-template-remix (cloned directly rather than via `shopify app init`, which requires an interactive Partner login unavailable in this session): - Prisma (SQLite dev / Postgres-ready) with baseline Session model + migration - Vitest configured for unit tests, Playwright configured for E2E - Redis client + BullMQ worker skeleton (app/lib/redis.server.ts, jobs/worker.ts) - shopify.app.toml: minimal scopes, GDPR + orders webhooks wired (stub handlers), app proxy config for the future storefront widget - Stripped template-repo-only meta files (CLA, issue templates, demo product page) and replaced CI with a lint+typecheck+test workflow - Bumped @shopify/shopify-app-session-storage-prisma to resolve a duplicate @shopify/shopify-api install that broke typecheck - Dropped the Jest-only ESLint config (template default) since the project standardizes on Vitest per IMPLEMENTATION_PLAN.md Verified: npm install, lint, typecheck, unit tests, prisma migrate dev, and npm run build all pass on Node 22 LTS. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
74 lines
1.9 KiB
TypeScript
74 lines
1.9 KiB
TypeScript
import { vitePlugin as remix } from "@remix-run/dev";
|
|
import { installGlobals } from "@remix-run/node";
|
|
import { defineConfig, type UserConfig } from "vite";
|
|
import tsconfigPaths from "vite-tsconfig-paths";
|
|
|
|
installGlobals({ nativeFetch: true });
|
|
|
|
// Related: https://github.com/remix-run/remix/issues/2835#issuecomment-1144102176
|
|
// Replace the HOST env var with SHOPIFY_APP_URL so that it doesn't break the remix server. The CLI will eventually
|
|
// stop passing in HOST, so we can remove this workaround after the next major release.
|
|
if (
|
|
process.env.HOST &&
|
|
(!process.env.SHOPIFY_APP_URL ||
|
|
process.env.SHOPIFY_APP_URL === process.env.HOST)
|
|
) {
|
|
process.env.SHOPIFY_APP_URL = process.env.HOST;
|
|
delete process.env.HOST;
|
|
}
|
|
|
|
const host = new URL(process.env.SHOPIFY_APP_URL || "http://localhost")
|
|
.hostname;
|
|
|
|
let hmrConfig;
|
|
if (host === "localhost") {
|
|
hmrConfig = {
|
|
protocol: "ws",
|
|
host: "localhost",
|
|
port: 64999,
|
|
clientPort: 64999,
|
|
};
|
|
} else {
|
|
hmrConfig = {
|
|
protocol: "wss",
|
|
host: host,
|
|
port: parseInt(process.env.FRONTEND_PORT!) || 8002,
|
|
clientPort: 443,
|
|
};
|
|
}
|
|
|
|
export default defineConfig({
|
|
server: {
|
|
allowedHosts: [host],
|
|
cors: {
|
|
preflightContinue: true,
|
|
},
|
|
port: Number(process.env.PORT || 3000),
|
|
hmr: hmrConfig,
|
|
fs: {
|
|
// See https://vitejs.dev/config/server-options.html#server-fs-allow for more information
|
|
allow: ["app", "node_modules"],
|
|
},
|
|
},
|
|
plugins: [
|
|
remix({
|
|
ignoredRouteFiles: ["**/.*"],
|
|
future: {
|
|
v3_fetcherPersist: true,
|
|
v3_relativeSplatPath: true,
|
|
v3_throwAbortReason: true,
|
|
v3_lazyRouteDiscovery: true,
|
|
v3_singleFetch: false,
|
|
v3_routeConfig: true,
|
|
},
|
|
}),
|
|
tsconfigPaths(),
|
|
],
|
|
build: {
|
|
assetsInlineLimit: 0,
|
|
},
|
|
optimizeDeps: {
|
|
include: ["@shopify/app-bridge-react", "@shopify/polaris"],
|
|
},
|
|
}) satisfies UserConfig;
|