diff --git a/src/nodejs/hooks/sealights.go b/src/nodejs/hooks/sealights.go index 3b8893c9a..b020e545e 100644 --- a/src/nodejs/hooks/sealights.go +++ b/src/nodejs/hooks/sealights.go @@ -60,6 +60,7 @@ type SealightsParameters struct { ProxyPassword string ProjectRoot string TestStage string + NpmRunScript string } type SealightsRunOptions struct { @@ -155,8 +156,17 @@ func (sl *SealightsHook) SetApplicationStartInProcfile(stager *libbuildpack.Stag originalStartCommand := string(bytes) _, usePackageJson := sl.usePackageJson(originalStartCommand, stager) if usePackageJson { + // Extract script name from command or use configured default + scriptName, err := sl.ExtractNpmRunScriptName(originalStartCommand) + if err != nil { + sl.Log.Warning("Failed to extract script name from command '%s', using configured default: %s", originalStartCommand, err) + scriptName = sl.parameters.NpmRunScript + if scriptName == "" { + scriptName = "start" + } + } // move to package json scenario - return sl.SetApplicationStartInPackageJson(stager) + return sl.SetApplicationStartInPackageJson(stager, scriptName) } // we suppose that format is "web: node " @@ -182,6 +192,62 @@ func (sl *SealightsHook) SetApplicationStartInProcfile(stager *libbuildpack.Stag return nil } +func (sl *SealightsHook) ExtractNpmRunScriptName(command string) (string, error) { + // Remove leading "web:" prefix if present + cleanCommand := strings.TrimSpace(command) + if strings.HasPrefix(cleanCommand, "web:") { + cleanCommand = strings.TrimSpace(cleanCommand[4:]) + } + + // Handle commands with cd prefix (e.g., "cd app && npm run start") + if strings.Contains(cleanCommand, "&&") { + parts := strings.Split(cleanCommand, "&&") + if len(parts) >= 2 { + cleanCommand = strings.TrimSpace(parts[len(parts)-1]) + } + } + + // Extract script name from npm commands + // Patterns to match: + // - "npm start" -> "start" + // - "npm run start-dev" -> "start-dev" + // - "npm run dev" -> "dev" + patterns := []string{ + `^npm\s+run\s+([a-zA-Z0-9\-_]+)`, // npm run