@@ -289,6 +289,39 @@ var _ = Describe("Sealights hook", func() {
289289 expectedCommand := strings .ReplaceAll ("./node_modules/.bin/slnodejs run --useinitialcolor true --token good_token --buildsessionid goodBsid --proxy goodProxy --proxyUsername goodName --proxyPassword goodPassword --labid goodLab --projectroot ./ --teststage \" Good tests\" index.js --build 192 --name Good" , " " , "" )
290290 Expect (cleanResult ).To (Equal ("web:" + expectedCommand ))
291291 })
292+
293+ It ("should use custom npmRunScript parameter for npm commands" , func () {
294+ err = os .WriteFile (filepath .Join (stager .BuildDir (), procfileName ), []byte ("web: npm run dev" ), 0755 )
295+ Expect (err ).To (BeNil ())
296+
297+ customPackageJson := "{\n \" scripts\" : {\n \" dev\" : \" " + originalStartCommand + "\" ,\n \" start\" : \" node index.js\" \n }\n }"
298+ err = os .WriteFile (filepath .Join (stager .BuildDir (), packageJsonName ), []byte (customPackageJson ), 0755 )
299+ Expect (err ).To (BeNil ())
300+
301+ vcapTemplate := `{
302+ "user-provided":[{
303+ "label": "user-provided",
304+ "name": "sealights",
305+ "credentials": {
306+ "token": "` + token + `",
307+ "buildSessionId": "` + bsid + `",
308+ "npmRunScript": "dev"
309+ }
310+ }]
311+ }`
312+ err = os .Setenv ("VCAP_SERVICES" , vcapTemplate )
313+ Expect (err ).To (BeNil ())
314+
315+ err = sealights .AfterCompile (stager )
316+ Expect (err ).To (BeNil ())
317+
318+ packageJson , err := sealights .ReadPackageJson (stager )
319+ Expect (err ).To (BeNil ())
320+
321+ devScript := packageJson ["scripts" ].(map [string ]interface {})["dev" ].(string )
322+ Expect (devScript ).To (ContainSubstring ("slnodejs" ))
323+ Expect (devScript ).To (ContainSubstring ("index.js --build 192 --name Good" ))
324+ })
292325 })
293326
294327 Context ("Sealights injection" , func () {
@@ -363,7 +396,7 @@ var _ = Describe("Sealights hook", func() {
363396 })
364397
365398 It ("fail to find scripts section in package.json" , func () {
366- err = sealights .SetApplicationStartInPackageJson (stager )
399+ err = sealights .SetApplicationStartInPackageJson (stager , "start" )
367400 Expect (err ).ShouldNot (BeNil ())
368401 })
369402 })
@@ -379,7 +412,7 @@ var _ = Describe("Sealights hook", func() {
379412 })
380413
381414 It ("fail to start under scripts section in package.json" , func () {
382- err = sealights .SetApplicationStartInPackageJson (stager )
415+ err = sealights .SetApplicationStartInPackageJson (stager , "start" )
383416 Expect (err ).ShouldNot (BeNil ())
384417 })
385418 })
@@ -397,7 +430,7 @@ var _ = Describe("Sealights hook", func() {
397430 Expect (err ).To (BeNil ())
398431 err = os .Setenv ("SL_TEST_STAGE" , stage )
399432 Expect (err ).To (BeNil ())
400- err = sealights .SetApplicationStartInPackageJson (stager )
433+ err = sealights .SetApplicationStartInPackageJson (stager , "start" )
401434 Expect (err ).To (BeNil ())
402435 packageJson , err := sealights .ReadPackageJson (stager )
403436 Expect (err ).To (BeNil ())
@@ -409,7 +442,7 @@ var _ = Describe("Sealights hook", func() {
409442 Expect (err ).NotTo (HaveOccurred ())
410443 err = os .Setenv ("SL_BUILD_SESSION_ID_FILE" , "" )
411444 Expect (err ).NotTo (HaveOccurred ())
412- err = sealights .SetApplicationStartInPackageJson (stager )
445+ err = sealights .SetApplicationStartInPackageJson (stager , "start" )
413446 Expect (err ).To (MatchError (ContainSubstring (hooks .EmptyBuildError )))
414447 })
415448 It ("test application run cmd creation" , func () {
@@ -422,7 +455,7 @@ var _ = Describe("Sealights hook", func() {
422455 err = os .Setenv ("SL_BUILD_SESSION_ID_FILE" , "" )
423456 Expect (err ).NotTo (HaveOccurred ())
424457 Expect (err ).To (BeNil ())
425- err = sealights .SetApplicationStartInPackageJson (stager )
458+ err = sealights .SetApplicationStartInPackageJson (stager , "start" )
426459 packageJson , err := sealights .ReadPackageJson (stager )
427460 Expect (err ).To (BeNil ())
428461 cleanResult := strings .ReplaceAll (packageJson ["scripts" ].(map [string ]interface {})["start" ].(string ), " " , "" )
@@ -571,5 +604,152 @@ var _ = Describe("Sealights hook", func() {
571604 Expect (command .args [1 ]).To (Equal ("slnodejs@" + customVersion ))
572605 })
573606 })
607+
608+ Context ("extractNpmRunScriptName function" , func () {
609+ It ("should extract script name from npm run command" , func () {
610+ scriptName , err := sealights .ExtractNpmRunScriptName ("web: npm run start-dev" )
611+ Expect (err ).To (BeNil ())
612+ Expect (scriptName ).To (Equal ("start-dev" ))
613+ })
614+
615+ It ("should extract script name from npm command without run" , func () {
616+ scriptName , err := sealights .ExtractNpmRunScriptName ("web: npm start" )
617+ Expect (err ).To (BeNil ())
618+ Expect (scriptName ).To (Equal ("start" ))
619+ })
620+
621+ It ("should extract script name from command with cd prefix" , func () {
622+ scriptName , err := sealights .ExtractNpmRunScriptName ("web: cd app && npm run dev" )
623+ Expect (err ).To (BeNil ())
624+ Expect (scriptName ).To (Equal ("dev" ))
625+ })
626+
627+ It ("should extract script name from simple npm run command" , func () {
628+ scriptName , err := sealights .ExtractNpmRunScriptName ("npm run test" )
629+ Expect (err ).To (BeNil ())
630+ Expect (scriptName ).To (Equal ("test" ))
631+ })
632+
633+ It ("should handle commands with hyphens and underscores" , func () {
634+ scriptName , err := sealights .ExtractNpmRunScriptName ("npm run start-prod_env" )
635+ Expect (err ).To (BeNil ())
636+ Expect (scriptName ).To (Equal ("start-prod_env" ))
637+ })
638+
639+ It ("should fail for non-npm commands" , func () {
640+ _ , err := sealights .ExtractNpmRunScriptName ("web: node server.js" )
641+ Expect (err ).To (HaveOccurred ())
642+ Expect (err .Error ()).To (ContainSubstring ("failed to extract npm script name" ))
643+ })
644+ })
645+
646+ Context ("validateNpmRunScript function" , func () {
647+ var packageJson map [string ]interface {}
648+
649+ BeforeEach (func () {
650+ packageJson = map [string ]interface {}{
651+ "scripts" : map [string ]interface {}{
652+ "start" : "node server.js" ,
653+ "test" : "mocha" ,
654+ "dev" : "nodemon server.js" ,
655+ "build" : "webpack" ,
656+ },
657+ }
658+ })
659+
660+ It ("should validate existing script" , func () {
661+ err := sealights .ValidateNpmRunScript (packageJson , "start" )
662+ Expect (err ).To (BeNil ())
663+ })
664+
665+ It ("should validate existing custom script" , func () {
666+ err := sealights .ValidateNpmRunScript (packageJson , "dev" )
667+ Expect (err ).To (BeNil ())
668+ })
669+
670+ It ("should fail for non-existing script" , func () {
671+ err := sealights .ValidateNpmRunScript (packageJson , "nonexistent" )
672+ Expect (err ).To (HaveOccurred ())
673+ Expect (err .Error ()).To (ContainSubstring ("script 'nonexistent' not found" ))
674+ })
675+
676+ It ("should fail for package.json without scripts section" , func () {
677+ packageJsonWithoutScripts := map [string ]interface {}{
678+ "name" : "test-app" ,
679+ }
680+ err := sealights .ValidateNpmRunScript (packageJsonWithoutScripts , "start" )
681+ Expect (err ).To (HaveOccurred ())
682+ Expect (err .Error ()).To (ContainSubstring ("no scripts section found" ))
683+ })
684+
685+ It ("should fail for package.json with null scripts section" , func () {
686+ packageJsonWithNullScripts := map [string ]interface {}{
687+ "scripts" : nil ,
688+ }
689+ err := sealights .ValidateNpmRunScript (packageJsonWithNullScripts , "start" )
690+ Expect (err ).To (HaveOccurred ())
691+ Expect (err .Error ()).To (ContainSubstring ("no scripts section found" ))
692+ })
693+ })
694+
695+ Context ("custom npm script support" , func () {
696+ BeforeEach (func () {
697+ err = os .WriteFile (filepath .Join (stager .BuildDir (), procfileName ), []byte ("web: npm run custom-script" ), 0755 )
698+ Expect (err ).To (BeNil ())
699+
700+ customPackageJson := "{\n \" scripts\" : {\n \" custom-script\" : \" " + originalStartCommand + "\" ,\n \" start\" : \" node index.js\" \n }\n }"
701+ err = os .WriteFile (filepath .Join (stager .BuildDir (), packageJsonName ), []byte (customPackageJson ), 0755 )
702+ Expect (err ).To (BeNil ())
703+
704+ os .Setenv ("VCAP_SERVICES" , `{"user-provided":[
705+ {
706+ "label": "user-provided",
707+ "name": "sealights",
708+ "credentials": {
709+ "token": "` + token + `"
710+ }
711+ }
712+ ]}` )
713+ })
714+
715+ AfterEach (func () {
716+ os .Remove (filepath .Join (stager .BuildDir (), packageJsonName ))
717+ })
718+
719+ It ("should inject sealights into custom npm script" , func () {
720+ err = os .Setenv ("SL_LAB_ID" , lab )
721+ Expect (err ).To (BeNil ())
722+ err = os .Setenv ("SL_PROJECT_ROOT" , root )
723+ Expect (err ).To (BeNil ())
724+ err = os .Setenv ("SL_TEST_STAGE" , stage )
725+ Expect (err ).To (BeNil ())
726+ err = os .Setenv ("SL_BUILD_SESSION_ID_FILE" , "" )
727+ Expect (err ).NotTo (HaveOccurred ())
728+
729+ err = sealights .SetApplicationStartInProcfile (stager )
730+ Expect (err ).To (BeNil ())
731+
732+ packageJson , err := sealights .ReadPackageJson (stager )
733+ Expect (err ).To (BeNil ())
734+
735+ customScript := packageJson ["scripts" ].(map [string ]interface {})["custom-script" ].(string )
736+ cleanResult := strings .ReplaceAll (customScript , " " , "" )
737+ Expect (cleanResult ).To (Equal (expected ))
738+ })
739+
740+ It ("should fallback to start script when custom script doesn't exist" , func () {
741+ err = os .WriteFile (filepath .Join (stager .BuildDir (), procfileName ), []byte ("web: npm run nonexistent" ), 0755 )
742+ Expect (err ).To (BeNil ())
743+
744+ err = sealights .SetApplicationStartInPackageJson (stager , "nonexistent" )
745+ Expect (err ).To (BeNil ())
746+
747+ packageJson , err := sealights .ReadPackageJson (stager )
748+ Expect (err ).To (BeNil ())
749+
750+ startScript := packageJson ["scripts" ].(map [string ]interface {})["start" ].(string )
751+ Expect (startScript ).To (ContainSubstring ("slnodejs" ))
752+ })
753+ })
574754 })
575755})
0 commit comments