sst / ion

SST v3
https://sst.dev
MIT License
1.44k stars 189 forks source link

remix deploy fails when using custom `buildDirectory` #688

Closed klaemo closed 3 weeks ago

klaemo commented 1 month ago

Specifying a custom buildDirectory (docs) in the vite.config.ts for a remix app makes sst deploy fail.

vite.config.js

export default defineConfig({
  plugins: [
    remix({
++    buildDirectory: "dist",
      future: {
        v3_fetcherPersist: true,
        v3_relativeSplatPath: true,
        v3_throwAbortReason: true,
      },
    }),
    tsconfigPaths(),
  ],
});
❯ sst deploy
SST ❍ ion 0.0.503  ready!

➜  App:        remix-aws
   Stage:      clemens

~  Deploying

|  Updated     RemixApp sst:aws:Remix → RemixAppOriginAccessIdentity sst:aws:OriginAccessIdentity
|  Log         Running "npm run build" script
|  Log         > build
|  Log         > remix vite:build
|  Log         vite v5.3.3 building for production...
|  Log         transforming...
|  Log         ✓ 85 modules transformed.
|  Log         rendering chunks...
|  Log         computing gzip size...
|  Log         dist/client/.vite/manifest.json                1.12 kB │ gzip:  0.32 kB
|  Log         dist/client/assets/root-BFUH26ow.css           5.36 kB │ gzip:  1.61 kB
|  Log         dist/client/assets/_index-B6hwyHK-.js          0.94 kB │ gzip:  0.40 kB
|  Log         dist/client/assets/root-Ca5PpFob.js            1.44 kB │ gzip:  0.84 kB
|  Log         dist/client/assets/entry.client-CqMLZIdi.js    4.11 kB │ gzip:  1.56 kB
|  Log         dist/client/assets/jsx-runtime-56DGgGmo.js     8.11 kB │ gzip:  3.05 kB
|  Log         dist/client/assets/components-CPckMTFJ.js    243.44 kB │ gzip: 78.49 kB
|  Log         ✓ built in 618ms
|  Log         vite v5.3.3 building SSR bundle for production...
|  Log         transforming...
|  Log         ✓ 6 modules transformed.
|  Log         rendering chunks...
|  Log         dist/server/.vite/manifest.json               0.22 kB
|  Log         dist/server/assets/server-build-BFUH26ow.css  5.36 kB
|  Log         dist/server/index.js                          7.21 kB
|  Log         ✓ built in 23ms
|  Error       
|  Error: ENOENT: no such file or directory, scandir 'build/client'
|      at Object.readdirSync (node:fs:1507:26)
|      at file:///Users/clemens/Projects/remix-aws/.sst/platform/src/components/aws/remix.ts:431:16
|      at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/output.ts:404:31
|      at Generator.next (<anonymous>)
|      at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:21:71
|      at new Promise (<anonymous>)
|      at __awaiter (/Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:17:12)
|      at applyHelperAsync (/Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:245:12)
|      at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/output.ts:316:13
|      at processTicksAndRejections (node:internal/process/task_queues:95:5) {
|    errno: -2,
|    code: 'ENOENT',
|    syscall: 'scandir',
|    path: 'build/client',
|    promise: Promise { <rejected> [Circular *1] }
|  }

×  Failed
   Error: ENOENT: no such file or directory, scandir 'build/client'                                                      
       at Object.readdirSync (node:fs:1507:26)                                                                           
       at file:///Users/clemens/Projects/remix-aws/.sst/platform/src/components/aws/remix.ts:431:16                      
       at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/output.ts:404:31                          
       at Generator.next (<anonymous>)                                                                                   
       at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:21:71                    
       at new Promise (<anonymous>)                                                                                      
       at __awaiter (/Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:17:12)        
       at applyHelperAsync (/Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/pulumi/output.js:245:12)
       at /Users/clemens/Projects/remix-aws/.sst/platform/node_modules/@pulumi/output.ts:316:13                          
       at processTicksAndRejections (node:internal/process/task_queues:95:5) {                                           
     errno: -2,                                                                                                          
     code: 'ENOENT',                                                                                                     
     syscall: 'scandir',                                                                                                 
     path: 'build/client',                                                                                               
     promise: Promise { <rejected> [Circular *1] }                                                                       
   }
klaemo commented 1 month ago

I guess this would require resolving the vite config and using the configured directories:

import { resolveConfig } from "vite"
import viteConfig from "./vite.config"

const config = await resolveConfig(viteConfig, "build")

// Project root directory. Can be an absolute path, or a path relative from the location of the config file itself.
console.log("root", config.root)
// Directory relative from `root` where build output will be placed.
console.log("build.outDir", config.build.outDir) // remix default: "build/client"
// Directory relative from `outDir` where the built js/css/image assets will be placed.
console.log("build.assetsDir", config.build.assetsDir) // default: "assets"