diff --git a/packages/toolchain/cli/src/util/deploy.rs b/packages/toolchain/cli/src/util/deploy.rs index 32bf4b7b3d..68bb0cffdd 100644 --- a/packages/toolchain/cli/src/util/deploy.rs +++ b/packages/toolchain/cli/src/util/deploy.rs @@ -127,7 +127,7 @@ pub async fn deploy(opts: DeployOpts<'_>) -> Result> { // Setup Rivetkit let mut _rivet_actor_tempfiles = Vec::new(); - let mut _rivet_actor_tempdirs = Vec::new(); + // let mut _rivet_actor_tempdirs = Vec::new(); if let Some(rivetkit) = &root.rivetkit { // Create service token let service_token = @@ -175,37 +175,42 @@ pub async fn deploy(opts: DeployOpts<'_>) -> Result> { .await?; // Determine server runtime - let function_build = if rivetkit.build.image.is_some() - || rivetkit.build.dockerfile.is_some() - { - // Use user-provided Docker config - rivetkit.build.clone() - } else { - // Auto-generate server Dockerfile - // - // Has to be in the project path in order to use NPM dependencies - let dockerfile_tempdir = tempfile::Builder::new().prefix("rivet-server-").tempdir()?; - let dockerfile_path = dockerfile_tempdir.path().join("Dockerfile"); - let dockerignore_path = dockerfile_tempdir.path().join("Dockerfile.dockerignore"); - _rivet_actor_tempdirs.push(dockerfile_tempdir); - - let server_path = rivetkit.server.clone(); - tokio::fs::write( - &dockerfile_path, - generate_server_dockerfile(&project_root, server_path), - ) - .await?; - tokio::fs::write(&dockerignore_path, generate_server_dockerignore()).await?; - - toolchain::config::build::docker::Build { - dockerfile: Some(dockerfile_path.display().to_string()), - build_path: Some(project_root.display().to_string()), - image: None, - build_target: None, - build_args: None, - unstable: rivetkit.build.unstable.clone(), - } - }; + let function_build = + if rivetkit.build.image.is_some() || rivetkit.build.dockerfile.is_some() { + // Use user-provided Docker config + rivetkit.build.clone() + } else { + // Auto-generate server Dockerfile + // + // Has to be in the project path in order to use NPM dependencies + // + // Preserve the paths because we want to be able to let the user to test the Dockerfile + // that's printed out + let dockerfile_tempdir = tempfile::Builder::new() + .prefix("rivet-server-") + .tempdir()? + .into_path(); + let dockerfile_path = dockerfile_tempdir.join("Dockerfile"); + let dockerignore_path = dockerfile_tempdir.join("Dockerfile.dockerignore"); + // _rivet_actor_tempdirs.push(dockerfile_tempdir); + + let server_path = rivetkit.server.clone(); + tokio::fs::write( + &dockerfile_path, + generate_server_dockerfile(&project_root, server_path), + ) + .await?; + tokio::fs::write(&dockerignore_path, generate_server_dockerignore()).await?; + + toolchain::config::build::docker::Build { + dockerfile: Some(dockerfile_path.display().to_string()), + build_path: Some(project_root.display().to_string()), + image: None, + build_target: None, + build_args: None, + unstable: rivetkit.build.unstable.clone(), + } + }; // Add function root.functions.insert( @@ -716,8 +721,6 @@ fn generate_dockerfile_for_package_manager( package_manager: &PackageManager, server_path_js: &str, ) -> String { - let copy_files = package_manager.copy_files.join(" "); - // Determine package manager specific configurations let (base_image, setup_commands, build_cmd, runtime_cmd, add_deps_cmd) = match package_manager.name.as_str() { "yarn" => ( @@ -732,7 +735,7 @@ fn generate_dockerfile_for_package_manager( "", "bunx tsc --outDir dist/ --rootDir ./", "bun run", - "bun add @hono/node-server @hono/node-ws" + "echo noop" ), "pnpm" => ( "node:22-alpine", @@ -753,6 +756,7 @@ fn generate_dockerfile_for_package_manager( let mut dockerfile = String::new(); // Builder stage + let copy_files = package_manager.copy_files.join(" "); dockerfile.push_str(&format!("FROM {} AS builder\n\n", base_image)); dockerfile.push_str("WORKDIR /app\n\n"); dockerfile.push_str(&format!("# Copy package files\nCOPY {} ./\n\n", copy_files)); @@ -793,9 +797,14 @@ fn generate_dockerfile_for_package_manager( dockerfile.push_str("\n\n"); } + let app_copy_files = package_manager + .copy_files + .iter() + .map(|x| format!("/app/{x}")) + .collect::>() + .join(" "); dockerfile.push_str(&format!( - "COPY --from=builder --chown=rivet:rivet /app/{} ./\n\n", - copy_files + "COPY --from=builder --chown=rivet:rivet {app_copy_files} ./\n\n" )); // Install production dependencies diff --git a/packages/toolchain/js-utils-embed/js/src/tasks/build/build.ts b/packages/toolchain/js-utils-embed/js/src/tasks/build/build.ts index 0e4b8f3414..a54b590c7a 100644 --- a/packages/toolchain/js-utils-embed/js/src/tasks/build/build.ts +++ b/packages/toolchain/js-utils-embed/js/src/tasks/build/build.ts @@ -54,6 +54,8 @@ export async function build(input: Input): Promise { stdLibBrowser[ `node:${packageName}` ] = packagePath; } + console.log('foo') + const result = await esbuild.build({ absWorkingDir: input.projectRoot, entryPoints: [input.entryPoint], @@ -67,6 +69,11 @@ export async function build(input: Input): Promise { inject: [stdLibInject], plugins: [stdLibPlugin(stdLibBrowser)], external: [ + "node:*", + "node:fs", + "node:fs/promises", + "fs", + "fs/promises", // Wasm must be loaded as a separate file manually, cannot be bundled "*.wasm", "*.wasm?module", diff --git a/packages/toolchain/js-utils-embed/js/src/tasks/build/preset.ts b/packages/toolchain/js-utils-embed/js/src/tasks/build/preset.ts index 5e81b05efb..8c76cad5d0 100644 --- a/packages/toolchain/js-utils-embed/js/src/tasks/build/preset.ts +++ b/packages/toolchain/js-utils-embed/js/src/tasks/build/preset.ts @@ -36,6 +36,8 @@ const nodeCompatModules = [ //"url", //"util/types", //"zlib", + "fs", + "fs/promises", ]; // Modules implemented via a mix of workerd APIs and polyfills. @@ -48,6 +50,9 @@ const hybridNodeCompatModules = [ "util", ]; +const externalModules = nodeCompatModules.flatMap((p) => [p, `node:${p}`]) +console.log('modules', externalModules); + export const rivetPreset: Preset = { meta: { name: "unenv:rivet", @@ -86,5 +91,5 @@ export const rivetPreset: Preset = { //process: "@cloudflare/unenv-preset/runtime/node/process/index", }, polyfill: [], - external: nodeCompatModules.flatMap((p) => [p, `node:${p}`]), + externa: nodeCompatModules.flatMap((p) => [p, `node:${p}`]), };