diff --git a/.changeset/poor-eels-bow.md b/.changeset/poor-eels-bow.md new file mode 100644 index 00000000000..0eec188583f --- /dev/null +++ b/.changeset/poor-eels-bow.md @@ -0,0 +1,18 @@ +--- +"@remix-run/dev": patch +--- + +Add `vite:dev` and `vite:build` commands to the Remix CLI. + +In order to handle upcoming Remix features where your plugin options can impact the number of Vite builds required, you should now run your Vite `dev` and `build` processes via the Remix CLI. + +```diff +{ + "scripts": { +- "dev": "vite dev", +- "build": "vite build && vite build --ssr" ++ "dev": "remix vite:dev", ++ "build": "remix vite:build" + } +} +``` diff --git a/docs/future/vite.md b/docs/future/vite.md index 5f22feb9fbe..1fc9154c9f7 100644 --- a/docs/future/vite.md +++ b/docs/future/vite.md @@ -164,7 +164,7 @@ Vite handles imports for all sorts of different file types, sometimes in ways th #### Migrating from Remix App Server If you were using `remix-serve` in development (or `remix dev` without the `-c` flag), you'll need to switch to the new minimal dev server. -It comes built-in with the Remix Vite plugin and will take over when you run `vite dev`. +It comes built-in with the Remix Vite plugin and will take over when you run `remix vite:dev`. Unlike `remix-serve`, the Remix Vite plugin doesn't install any [global Node polyfills][global-node-polyfills] so you'll need to install them yourself if you were relying on them. The easiest way to do this is by calling `installGlobals` at the top of your Vite config. @@ -175,8 +175,8 @@ You'll also need to update to the new build output paths, which are `build/serve ```json filename=package.json lines=[3-4] { "scripts": { - "build": "vite build && vite build --ssr", - "dev": "vite dev", + "dev": "remix vite:dev", + "build": "remix vite:build", "start": "remix-serve ./build/server/index.js" } } @@ -272,8 +272,8 @@ app.listen(port, () => ```json filename=package.json { "scripts": { - "build": "vite build && vite build --ssr", "dev": "node ./server.mjs", + "build": "remix vite:build", "start": "cross-env NODE_ENV=production node ./server.mjs" } } @@ -793,11 +793,7 @@ Alternatively, you can use separate Vite config files for each tool. For example, to use a Vite config specifically scoped to Remix: ```shellscript nonumber -# Development -vite dev --config vite.config.remix.ts - -# Production -vite build --config vite.config.remix.ts && vite build --config vite.config.remix.ts --ssr +remix vite:dev --config vite.config.remix.ts ``` ## Acknowledgements diff --git a/integration/helpers/create-fixture.ts b/integration/helpers/create-fixture.ts index 98c130b4532..56317b192fd 100644 --- a/integration/helpers/create-fixture.ts +++ b/integration/helpers/create-fixture.ts @@ -5,7 +5,6 @@ import fse from "fs-extra"; import express from "express"; import getPort from "get-port"; import dedent from "dedent"; -import resolveBin from "resolve-bin"; import stripIndent from "strip-indent"; import serializeJavaScript from "serialize-javascript"; import { sync as spawnSync, spawn } from "cross-spawn"; @@ -22,8 +21,6 @@ import { installGlobals } from "../../build/node_modules/@remix-run/node/dist/in const TMP_DIR = path.join(process.cwd(), ".tmp", "integration"); const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); -const viteBin = resolveBin.sync("vite"); - export interface FixtureInit { buildStdio?: Writable; sourcemap?: boolean; @@ -315,43 +312,36 @@ function build( let remixBin = "node_modules/@remix-run/dev/dist/cli.js"; - let commands: string[][] = + let buildArgs: string[] = compiler === "vite" - ? [ - [viteBin, "build"], - [viteBin, "build", "--ssr"], - ] - : [[remixBin, "build", ...(sourcemap ? ["--sourcemap"] : [])]]; - - commands.forEach((buildArgs) => { - let buildSpawn = spawnSync("node", buildArgs, { - cwd: projectDir, - env: { - ...process.env, - NODE_ENV: mode || ServerMode.Production, - }, - }); + ? [remixBin, "vite:build"] + : [remixBin, "build", ...(sourcemap ? ["--sourcemap"] : [])]; + + let buildSpawn = spawnSync("node", buildArgs, { + cwd: projectDir, + env: { + ...process.env, + NODE_ENV: mode || ServerMode.Production, + }, + }); - // These logs are helpful for debugging. Remove comments if needed. - // console.log("spawning node " + buildArgs.join(" ") + ":\n"); - // console.log(" STDOUT:"); - // console.log(" " + buildSpawn.stdout.toString("utf-8")); - // console.log(" STDERR:"); - // console.log(" " + buildSpawn.stderr.toString("utf-8")); - - if (buildStdio) { - buildStdio.write(buildSpawn.stdout.toString("utf-8")); - buildStdio.write(buildSpawn.stderr.toString("utf-8")); - buildStdio.end(); - } + // These logs are helpful for debugging. Remove comments if needed. + // console.log("spawning node " + buildArgs.join(" ") + ":\n"); + // console.log(" STDOUT:"); + // console.log(" " + buildSpawn.stdout.toString("utf-8")); + // console.log(" STDERR:"); + // console.log(" " + buildSpawn.stderr.toString("utf-8")); + + if (buildStdio) { + buildStdio.write(buildSpawn.stdout.toString("utf-8")); + buildStdio.write(buildSpawn.stderr.toString("utf-8")); + buildStdio.end(); + } - if (buildSpawn.error || buildSpawn.status) { - console.error(buildSpawn.stderr.toString("utf-8")); - throw ( - buildSpawn.error || new Error(`Build failed, check the output above`) - ); - } - }); + if (buildSpawn.error || buildSpawn.status) { + console.error(buildSpawn.stderr.toString("utf-8")); + throw buildSpawn.error || new Error(`Build failed, check the output above`); + } } async function writeTestFiles(init: FixtureInit, dir: string) { diff --git a/integration/helpers/vite-template/package.json b/integration/helpers/vite-template/package.json index 254a96df4dc..ac20019f64e 100644 --- a/integration/helpers/vite-template/package.json +++ b/integration/helpers/vite-template/package.json @@ -3,8 +3,8 @@ "sideEffects": false, "type": "module", "scripts": { - "dev": "vite dev", - "build": "vite build && vite build --ssr", + "dev": "remix vite:dev", + "build": "remix vite:build", "start": "remix-serve ./build/server/index.js", "typecheck": "tsc" }, diff --git a/integration/helpers/vite.ts b/integration/helpers/vite.ts index 5c4faa4ea11..225058bd250 100644 --- a/integration/helpers/vite.ts +++ b/integration/helpers/vite.ts @@ -5,13 +5,13 @@ import type { Readable } from "node:stream"; import url from "node:url"; import execa from "execa"; import fse from "fs-extra"; -import resolveBin from "resolve-bin"; import stripIndent from "strip-indent"; import waitOn from "wait-on"; import getPort from "get-port"; import shell from "shelljs"; import glob from "glob"; +const remixBin = "node_modules/@remix-run/dev/dist/cli.js"; const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); export const VITE_CONFIG = async (args: { @@ -127,20 +127,11 @@ const createDev = export const viteBuild = ({ cwd }: { cwd: string }) => { let nodeBin = process.argv[0]; - let viteBin = resolveBin.sync("vite"); - let commands = [ - [viteBin, "build"], - [viteBin, "build", "--ssr"], - ]; - let results = []; - for (let command of commands) { - let result = spawnSync(nodeBin, command, { - cwd, - env: { ...process.env }, - }); - results.push(result); - } - return results; + + return spawnSync(nodeBin, [remixBin, "vite:build"], { + cwd, + env: { ...process.env }, + }); }; export const viteRemixServe = async ({ @@ -168,7 +159,7 @@ export const viteRemixServe = async ({ }; }; -export const viteDev = createDev([resolveBin.sync("vite"), "dev"]); +export const viteDev = createDev([remixBin, "vite:dev"]); export const customDev = createDev(["./server.mjs"]); function node(args: string[], options: { cwd: string }) { diff --git a/integration/vite-dev-custom-entry-test.ts b/integration/vite-dev-custom-entry-test.ts index e609e5391e9..6444fee5863 100644 --- a/integration/vite-dev-custom-entry-test.ts +++ b/integration/vite-dev-custom-entry-test.ts @@ -1,7 +1,6 @@ import { test, expect } from "@playwright/test"; import type { Readable } from "node:stream"; import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; -import resolveBin from "resolve-bin"; import getPort from "get-port"; import waitOn from "wait-on"; @@ -130,8 +129,8 @@ test.describe("Vite custom entry dev", () => { }); let nodeBin = process.argv[0]; - let viteBin = resolveBin.sync("vite"); - devProc = spawn(nodeBin, [viteBin, "dev"], { + let remixBin = "node_modules/@remix-run/dev/dist/cli.js"; + devProc = spawn(nodeBin, [remixBin, "vite:dev"], { cwd: projectDir, env: process.env, stdio: "pipe", diff --git a/integration/vite-dev-test.ts b/integration/vite-dev-test.ts index cf2251736cf..ba9e17e508b 100644 --- a/integration/vite-dev-test.ts +++ b/integration/vite-dev-test.ts @@ -3,7 +3,6 @@ import type { Readable } from "node:stream"; import { spawn, type ChildProcessWithoutNullStreams } from "node:child_process"; import fs from "node:fs/promises"; import path from "node:path"; -import resolveBin from "resolve-bin"; import getPort from "get-port"; import waitOn from "wait-on"; @@ -264,8 +263,8 @@ test.describe("Vite dev", () => { }); let nodeBin = process.argv[0]; - let viteBin = resolveBin.sync("vite"); - devProc = spawn(nodeBin, [viteBin, "dev"], { + let remixBin = "node_modules/@remix-run/dev/dist/cli.js"; + devProc = spawn(nodeBin, [remixBin, "vite:dev"], { cwd: projectDir, env: process.env, stdio: "pipe", diff --git a/integration/vite-dot-client-test.ts b/integration/vite-dot-client-test.ts index 95e055f3394..85ebc464b9f 100644 --- a/integration/vite-dot-client-test.ts +++ b/integration/vite-dot-client-test.ts @@ -37,9 +37,8 @@ test("Vite / client code excluded from server bundle", async () => { } `, }); - let [client, server] = viteBuild({ cwd }); - expect(client.status).toBe(0); - expect(server.status).toBe(0); + let { status } = viteBuild({ cwd }); + expect(status).toBe(0); let lines = grep( path.join(cwd, "build/server"), /CLIENT_ONLY_FILE|CLIENT_ONLY_DIR/ diff --git a/integration/vite-dot-server-test.ts b/integration/vite-dot-server-test.ts index 42721b39b53..ae53192e3f8 100644 --- a/integration/vite-dot-server-test.ts +++ b/integration/vite-dot-server-test.ts @@ -26,8 +26,8 @@ test("Vite / .server file / named import in client fails with expected error", a } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch( `"dotServerFile" is not exported by "app/utils.server.ts"` ); @@ -45,8 +45,8 @@ test("Vite / .server file / namespace import in client fails with expected error } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch( `"dotServerFile" is not exported by "app/utils.server.ts"` ); @@ -64,8 +64,8 @@ test("Vite / .server file / default import in client fails with expected error", } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch(`"default" is not exported by "app/utils.server.ts"`); }); @@ -81,8 +81,8 @@ test("Vite / .server dir / named import in client fails with expected error", as } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch( `"dotServerDir" is not exported by "app/.server/utils.ts"` ); @@ -100,8 +100,8 @@ test("Vite / .server dir / namespace import in client fails with expected error" } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch( `"dotServerDir" is not exported by "app/.server/utils.ts"` ); @@ -119,8 +119,8 @@ test("Vite / .server dir / default import in client fails with expected error", } `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch(`"default" is not exported by "app/.server/utils.ts"`); }); @@ -142,9 +142,8 @@ test("Vite / `handle` with dynamic imports as an escape hatch for server-only co } `, }); - let [client, server] = viteBuild({ cwd }); - expect(client.status).toBe(0); - expect(server.status).toBe(0); + let { status } = viteBuild({ cwd }); + expect(status).toBe(0); let lines = grep( path.join(cwd, "build/client"), @@ -186,9 +185,8 @@ test("Vite / dead-code elimination for server exports", async () => { } `, }); - let [client, server] = viteBuild({ cwd }); - expect(client.status).toBe(0); - expect(server.status).toBe(0); + let { status } = viteBuild({ cwd }); + expect(status).toBe(0); let lines = grep( path.join(cwd, "build/client"), diff --git a/integration/vite-route-exports-test.ts b/integration/vite-route-exports-test.ts index 80e4673e4ef..661f40574a3 100644 --- a/integration/vite-route-exports-test.ts +++ b/integration/vite-route-exports-test.ts @@ -21,8 +21,8 @@ test("Vite / invalid route exports / expected build error", async () => { export const invalid2 = 2; `, }); - let client = viteBuild({ cwd })[0]; - let stderr = client.stderr.toString("utf8"); + let result = viteBuild({ cwd }); + let stderr = result.stderr.toString("utf8"); expect(stderr).toMatch( "2 invalid route exports in `routes/fail-non-remix-exports.tsx`:\n - `invalid1`\n - `invalid2`" ); @@ -64,7 +64,6 @@ test("Vite / invalid route exports / ignore in mdx", async () => { # Hello World `, }); - let [client, server] = viteBuild({ cwd }); - expect(client.status).toBe(0); - expect(server.status).toBe(0); + let { status } = viteBuild({ cwd }); + expect(status).toBe(0); }); diff --git a/package.json b/package.json index 8d309e7788f..bebe4a9a8a2 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,6 @@ "@types/react": "^18.2.20", "@types/react-dom": "^18.2.7", "@types/react-test-renderer": "^18.0.0", - "@types/resolve-bin": "^0.4.1", "@types/retry": "^0.12.0", "@types/semver": "^7.3.4", "@types/serialize-javascript": "^5.0.2", @@ -118,7 +117,6 @@ "remark-gfm": "3.0.1", "remark-parse": "^10.0.1", "remark-stringify": "^10.0.2", - "resolve-bin": "^1.0.1", "rollup": "^2.36.1", "rollup-plugin-copy": "^3.3.0", "semver": "^7.3.7", diff --git a/packages/remix-dev/cli/commands.ts b/packages/remix-dev/cli/commands.ts index 18b7c19b603..5aae527544c 100644 --- a/packages/remix-dev/cli/commands.ts +++ b/packages/remix-dev/cli/commands.ts @@ -11,6 +11,8 @@ import * as compiler from "../compiler"; import * as devServer from "../devServer"; import * as devServer_unstable from "../devServer_unstable"; import type { RemixConfig } from "../config"; +import type { ViteDevOptions } from "../vite/dev"; +import type { ViteBuildOptions } from "../vite/build"; import { readConfig } from "../config"; import { formatRoutes, RoutesFormat, isRoutesFormat } from "../config/format"; import { detectPackageManager } from "./detectPackageManager"; @@ -132,6 +134,14 @@ export async function build( logger.info("built" + pc.gray(` (${prettyMs(Date.now() - start)})`)); } +export async function viteBuild( + root: string, + options: ViteBuildOptions = {} +): Promise { + let { build } = await import("../vite/build"); + await build(root, options); +} + export async function watch( remixRootOrConfig: string | RemixConfig, mode?: string @@ -175,6 +185,14 @@ export async function dev( await new Promise(() => {}); } +export async function viteDev(root: string, options: ViteDevOptions = {}) { + let { dev } = await import("../vite/dev"); + await dev(root, options); + + // keep `remix vite-dev` alive by waiting indefinitely + await new Promise(() => {}); +} + let clientEntries = ["entry.client.tsx", "entry.client.js", "entry.client.jsx"]; let serverEntries = ["entry.server.tsx", "entry.server.js", "entry.server.jsx"]; let entries = ["entry.client", "entry.server"]; diff --git a/packages/remix-dev/cli/run.ts b/packages/remix-dev/cli/run.ts index 05796f3a0a2..ca178f97a07 100644 --- a/packages/remix-dev/cli/run.ts +++ b/packages/remix-dev/cli/run.ts @@ -92,6 +92,12 @@ export async function run(argv: string[] = process.argv.slice(2)) { ); } + let isBooleanFlag = (arg: string) => { + let index = argv.indexOf(arg); + let nextArg = argv[index + 1]; + return !nextArg || nextArg.startsWith("-"); + }; + let args = arg( { "--no-delete": Boolean, @@ -100,7 +106,6 @@ export async function run(argv: string[] = process.argv.slice(2)) { "--help": Boolean, "-h": "--help", "--json": Boolean, - "--sourcemap": Boolean, "--token": String, "--typescript": Boolean, "--no-typescript": Boolean, @@ -109,12 +114,36 @@ export async function run(argv: string[] = process.argv.slice(2)) { // dev server "--command": String, - "-c": "--command", "--manual": Boolean, "--port": Number, "-p": "--port", "--tls-key": String, "--tls-cert": String, + + ...(argv[0].startsWith("vite:") + ? { + // Vite commands + // --force and --port are already defined above + "--assetsInlineLimit": Number, + "--clearScreen": Boolean, + "--config": String, + "-c": "--config", + "--cors": Boolean, + "--emptyOutDir": Boolean, + "--host": isBooleanFlag("--host") ? Boolean : String, + "--logLevel": String, + "-l": "--logLevel", + "--minify": String, + "--mode": String, + "-m": "--mode", + "--open": isBooleanFlag("--open") ? Boolean : String, + "--strictPort": Boolean, + } + : { + // Non Vite commands + "-c": "--command", + "--sourcemap": Boolean, + }), }, { argv, @@ -172,6 +201,9 @@ export async function run(argv: string[] = process.argv.slice(2)) { if (!process.env.NODE_ENV) process.env.NODE_ENV = "production"; await commands.build(input[1], process.env.NODE_ENV, flags.sourcemap); break; + case "vite:build": + await commands.viteBuild(input[1], flags); + break; case "watch": if (!process.env.NODE_ENV) process.env.NODE_ENV = "development"; await commands.watch(input[1], process.env.NODE_ENV); @@ -187,6 +219,9 @@ export async function run(argv: string[] = process.argv.slice(2)) { case "dev": await commands.dev(input[1], flags); break; + case "vite:dev": + await commands.viteDev(input[1], flags); + break; default: // `remix ./my-project` is shorthand for `remix dev ./my-project` await commands.dev(input[0], flags); diff --git a/packages/remix-dev/vite/build.ts b/packages/remix-dev/vite/build.ts new file mode 100644 index 00000000000..006e4a98e70 --- /dev/null +++ b/packages/remix-dev/vite/build.ts @@ -0,0 +1,84 @@ +import type * as Vite from "vite"; +import colors from "picocolors"; + +import type { ResolvedRemixVitePluginConfig } from "./plugin"; + +async function extractRemixPluginConfig({ + configFile, + mode, + root, +}: { + configFile?: string; + mode?: string; + root: string; +}): Promise { + let vite = await import("vite"); + + // Leverage the Vite config as a way to configure the entire multi-step build + // process so we don't need to have a separate Remix config + let viteConfig = await vite.resolveConfig( + { mode, configFile, root }, + "build" + ); + + let pluginConfig = viteConfig[ + "__remixPluginResolvedConfig" as keyof typeof viteConfig + ] as ResolvedRemixVitePluginConfig | undefined; + if (!pluginConfig) { + console.error(colors.red("Remix Vite plugin not found in Vite config")); + process.exit(1); + } + + return pluginConfig; +} + +export interface ViteBuildOptions { + assetsInlineLimit?: number; + clearScreen?: boolean; + config?: string; + emptyOutDir?: boolean; + force?: boolean; + logLevel?: Vite.LogLevel; + minify?: Vite.BuildOptions["minify"]; + mode?: string; +} + +export async function build( + root: string, + { + assetsInlineLimit, + clearScreen, + config: configFile, + emptyOutDir, + force, + logLevel, + minify, + mode, + }: ViteBuildOptions +) { + // For now we just use this function to validate that the Vite config is + // targeting Remix, but in the future the return value can be used to + // configure the entire multi-step build process. + await extractRemixPluginConfig({ + configFile, + mode, + root, + }); + + let vite = await import("vite"); + + async function viteBuild({ ssr }: { ssr: boolean }) { + await vite.build({ + root, + mode, + configFile, + build: { assetsInlineLimit, emptyOutDir, minify, ssr }, + optimizeDeps: { force }, + clearScreen, + logLevel, + }); + } + + await viteBuild({ ssr: false }); + await viteBuild({ ssr: true }); +} diff --git a/packages/remix-dev/vite/dev.ts b/packages/remix-dev/vite/dev.ts new file mode 100644 index 00000000000..1af62a30043 --- /dev/null +++ b/packages/remix-dev/vite/dev.ts @@ -0,0 +1,51 @@ +import type * as Vite from "vite"; +import colors from "picocolors"; + +export interface ViteDevOptions { + clearScreen?: boolean; + config?: string; + cors?: boolean; + force?: boolean; + host?: boolean | string; + logLevel?: Vite.LogLevel; + mode?: string; + open?: boolean | string; + port?: number; + strictPort?: boolean; +} + +export async function dev( + root: string, + { + clearScreen, + config: configFile, + cors, + force, + host, + logLevel, + mode, + open, + port, + strictPort, + }: ViteDevOptions +) { + let vite = await import("vite"); + let server = await vite.createServer({ + root, + mode, + configFile, + server: { open, cors, host, port, strictPort }, + optimizeDeps: { force }, + clearScreen, + logLevel, + }); + + if (!server.config.plugins.find((plugin) => plugin.name === "remix")) { + console.error(colors.red("Remix Vite plugin not found in Vite config")); + process.exit(1); + } + + await server.listen(); + server.printUrls(); + server.bindCLIShortcuts({ print: true }); +} diff --git a/packages/remix-dev/vite/plugin.ts b/packages/remix-dev/vite/plugin.ts index 168cead8f34..f3892243898 100644 --- a/packages/remix-dev/vite/plugin.ts +++ b/packages/remix-dev/vite/plugin.ts @@ -86,7 +86,7 @@ type RemixConfigJsdocOverrides = { export type RemixVitePluginOptions = RemixConfigJsdocOverrides & Omit; -type ResolvedRemixVitePluginConfig = Pick< +export type ResolvedRemixVitePluginConfig = Pick< ResolvedRemixConfig, | "appDirectory" | "rootDirectory" @@ -559,6 +559,7 @@ export const remixVitePlugin: RemixVitePlugin = (options = {}) => { : viteConfigEnv.isSsrBuild; return { + __remixPluginResolvedConfig: pluginConfig, appType: "custom", experimental: { hmrPartialAccept: true }, optimizeDeps: { diff --git a/templates/unstable-vite-express/package.json b/templates/unstable-vite-express/package.json index 40878aaa49e..f7b19e8777d 100644 --- a/templates/unstable-vite-express/package.json +++ b/templates/unstable-vite-express/package.json @@ -4,7 +4,7 @@ "type": "module", "scripts": { "dev": "node ./server.mjs", - "build": "vite build && vite build --ssr", + "build": "remix vite:build", "start": "cross-env NODE_ENV=production node ./server.mjs", "typecheck": "tsc" }, diff --git a/templates/unstable-vite/package.json b/templates/unstable-vite/package.json index 254a96df4dc..ac20019f64e 100644 --- a/templates/unstable-vite/package.json +++ b/templates/unstable-vite/package.json @@ -3,8 +3,8 @@ "sideEffects": false, "type": "module", "scripts": { - "dev": "vite dev", - "build": "vite build && vite build --ssr", + "dev": "remix vite:dev", + "build": "remix vite:build", "start": "remix-serve ./build/server/index.js", "typecheck": "tsc" }, diff --git a/yarn.lock b/yarn.lock index 3986c421a53..1474f565699 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3055,11 +3055,6 @@ dependencies: "@types/node" "*" -"@types/resolve-bin@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@types/resolve-bin/-/resolve-bin-0.4.1.tgz#e5f2c2de1de8b77f2222a9e28e56ecc37028116c" - integrity sha512-5bWIuv+28N2+WxIQNdLwkzD+THqH221tR1rsjHV23CiM46+AZZ/U5V5KsuoBywkB/x7gK/xEBW1l9R7Ucdkcvg== - "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" @@ -6238,11 +6233,6 @@ finalhandler@~1.1.2: statuses "~1.5.0" unpipe "~1.0.0" -find-parent-dir@~0.3.0: - version "0.3.1" - resolved "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz#c5c385b96858c3351f95d446cab866cbf9f11125" - integrity sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A== - find-up@^4.0.0, find-up@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" @@ -11361,13 +11351,6 @@ requires-port@^1.0.0: resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== -resolve-bin@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/resolve-bin/-/resolve-bin-1.0.1.tgz#795255591443e7007b21f2eadd8baa39b7378e50" - integrity sha512-4G9C3udcDB1c9qaopB+9dygm2bMyF2LeJ2JHBIc24N7ob+UuSSwX3ID1hQwpDEQep9ZRNdhT//rgEd6xbWA/SA== - dependencies: - find-parent-dir "~0.3.0" - resolve-cwd@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz"