using System.Threading.Tasks;
using UnityEngine;
namespace Needle.Engine.Utils
{
internal static class WebProjectUtils
{
///
/// Open the preview server. This assumes that the project has been built before calling this command
///
public static async Task StartPreviewServer(string projectDirectory)
{
var packageJsonPath = projectDirectory + "/package.json";
if (PackageUtils.TryGetScripts(packageJsonPath, out var scripts))
{
var addedPreviewScript = false;
if (!scripts.ContainsKey("preview"))
{
addedPreviewScript = true;
if (!InsertPreviewScript())
{
Debug.LogError(
"Could not insert preview script: Please insert a new script manually in your package.json: \"preview\" : \"\"\nAt " +
packageJsonPath.AsLink());
return false;
}
if (!PackageUtils.TryWriteScripts(packageJsonPath, scripts))
{
Debug.LogWarning(
"Missing preview script in package.json. Add \"preview\" : \"vite preview\" to your package.json at " +
packageJsonPath.AsLink());
return false;
}
Debug.LogWarning(
"Added temporary preview script: \"preview\" because no preview script was found in package.json at " +
packageJsonPath + "\n\"preview\": \"" + scripts["preview"] + "\"");
}
var preview = ProcessHelper.RunCommand("npm run preview", projectDirectory,
null, false, true);
if (addedPreviewScript)
{
await Task.Delay(5000);
scripts.Remove("preview");
PackageUtils.TryWriteScripts(packageJsonPath, scripts);
}
return await preview;
}
Debug.LogError("Could not find package.json in " + projectDirectory + " to start preview server");
return false;
bool InsertPreviewScript()
{
foreach (var script in scripts)
{
if (script.Value.Contains("vite"))
{
// https://vitejs.dev/guide/cli.html#vite-preview
scripts.Add("preview", "vite preview --host --port 3300 --open");
return true;
}
if (script.Value.Contains("next"))
{
// https://github.com/vercel/next.js/discussions/13448#discussioncomment-6491542
// https://nextjs.org/docs/pages/api-reference/next-cli#production
var openBrowserCommand = "URL=http://localhost:3300 && (open $URL || cmd.exe /c start $URL)";
scripts.Add("preview", $"{openBrowserCommand} && next start -p 3300 ");
return true;
}
}
return false;
}
}
}
}