diff --git a/pkg/commands/package.go b/pkg/commands/package.go index b2c9294..2f30918 100644 --- a/pkg/commands/package.go +++ b/pkg/commands/package.go @@ -142,3 +142,7 @@ func (p *Package) ConfigPath() string { func (p *Package) ID() string { return fmt.Sprintf("package:%s", p.Path) } + +func (p *Package) Scoped() bool { + return strings.HasPrefix(p.Config.Name, "@") +} diff --git a/pkg/config/app_config.go b/pkg/config/app_config.go index 68ab5a7..e3a1ab5 100644 --- a/pkg/config/app_config.go +++ b/pkg/config/app_config.go @@ -304,6 +304,7 @@ keybinding: globalLink: 'L' build: 'b' pack: 'p' + publish: 'P' `) } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 1706632..9162511 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -201,31 +201,26 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { { ViewName: "", Key: gui.getKey("universal.quit"), - Modifier: gocui.ModNone, Handler: gui.handleQuit, }, { ViewName: "", Key: gui.getKey("universal.quitWithoutChangingDirectory"), - Modifier: gocui.ModNone, Handler: gui.handleQuitWithoutChangingDirectory, }, { ViewName: "", Key: gui.getKey("universal.quit-alt1"), - Modifier: gocui.ModNone, Handler: gui.handleQuit, }, { ViewName: "", Key: gui.getKey("universal.return"), - Modifier: gocui.ModNone, Handler: gui.handleQuit, }, { ViewName: "", Key: gui.getKey("universal.scrollUpMain"), - Modifier: gocui.ModNone, Handler: gui.scrollUpMain, Alternative: "fn+up", Description: gui.Tr.SLocalize("scrollUpMainPanel"), @@ -233,7 +228,6 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { { ViewName: "", Key: gui.getKey("universal.scrollDownMain"), - Modifier: gocui.ModNone, Handler: gui.scrollDownMain, Alternative: "fn+down", Description: gui.Tr.SLocalize("scrollDownMainPanel"), @@ -241,85 +235,72 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { { ViewName: "", Key: gui.getKey("universal.scrollUpMain-alt1"), - Modifier: gocui.ModNone, Handler: gui.scrollUpMain, }, { ViewName: "", Key: gui.getKey("universal.scrollDownMain-alt1"), - Modifier: gocui.ModNone, Handler: gui.scrollDownMain, }, { ViewName: "", Key: gui.getKey("universal.scrollUpMain-alt2"), - Modifier: gocui.ModNone, Handler: gui.scrollUpMain, }, { ViewName: "", Key: gui.getKey("universal.scrollDownMain-alt2"), - Modifier: gocui.ModNone, Handler: gui.scrollDownMain, }, { ViewName: "", Key: gui.getKey("universal.refresh"), - Modifier: gocui.ModNone, Handler: gui.handleRefresh, Description: gui.Tr.SLocalize("refresh"), }, { ViewName: "", Key: gui.getKey("universal.optionMenu"), - Modifier: gocui.ModNone, Handler: gui.handleCreateOptionsMenu, Description: gui.Tr.SLocalize("openMenu"), }, { ViewName: "", Key: gui.getKey("universal.optionMenu-alt1"), - Modifier: gocui.ModNone, Handler: gui.handleCreateOptionsMenu, }, { ViewName: "", Key: gocui.MouseMiddle, - Modifier: gocui.ModNone, Handler: gui.handleCreateOptionsMenu, }, { ViewName: "status", Key: gui.getKey("universal.edit"), - Modifier: gocui.ModNone, Handler: gui.handleEditConfig, Description: gui.Tr.SLocalize("EditConfig"), }, { ViewName: "", Key: gui.getKey("universal.nextScreenMode"), - Modifier: gocui.ModNone, Handler: gui.nextScreenMode, Description: gui.Tr.SLocalize("nextScreenMode"), }, { ViewName: "", Key: gui.getKey("universal.prevScreenMode"), - Modifier: gocui.ModNone, Handler: gui.prevScreenMode, Description: gui.Tr.SLocalize("prevScreenMode"), }, { ViewName: "status", Key: gui.getKey("universal.openFile"), - Modifier: gocui.ModNone, Handler: gui.handleOpenConfig, Description: gui.Tr.SLocalize("OpenConfig"), }, { ViewName: "status", Key: gui.getKey("status.checkForUpdate"), - Modifier: gocui.ModNone, Handler: gui.handleCheckForUpdate, Description: gui.Tr.SLocalize("checkForUpdate"), }, @@ -327,173 +308,152 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { { ViewName: "menu", Key: gui.getKey("universal.return"), - Modifier: gocui.ModNone, Handler: gui.handleMenuClose, Description: gui.Tr.SLocalize("closeMenu"), }, { ViewName: "menu", Key: gui.getKey("universal.quit"), - Modifier: gocui.ModNone, Handler: gui.handleMenuClose, Description: gui.Tr.SLocalize("closeMenu"), }, { ViewName: "information", Key: gocui.MouseLeft, - Modifier: gocui.ModNone, Handler: gui.handleInfoClick, }, { ViewName: "secondary", Contexts: []string{"normal"}, Key: gocui.MouseLeft, - Modifier: gocui.ModNone, Handler: gui.handleMouseDownSecondary, }, { ViewName: "status", Key: gocui.MouseLeft, - Modifier: gocui.ModNone, Handler: gui.handleStatusClick, }, { ViewName: "search", Key: gocui.KeyEnter, - Modifier: gocui.ModNone, Handler: gui.handleSearch, }, { ViewName: "search", Key: gui.getKey("universal.return"), - Modifier: gocui.ModNone, Handler: gui.handleSearchEscape, }, { ViewName: "confirmation", Key: gui.getKey("universal.prevItem"), - Modifier: gocui.ModNone, Handler: gui.scrollUpConfirmationPanel, }, { ViewName: "confirmation", Key: gui.getKey("universal.nextItem"), - Modifier: gocui.ModNone, Handler: gui.scrollDownConfirmationPanel, }, { ViewName: "confirmation", Key: gui.getKey("universal.prevItem-alt"), - Modifier: gocui.ModNone, Handler: gui.scrollUpConfirmationPanel, }, { ViewName: "confirmation", Key: gui.getKey("universal.nextItem-alt"), - Modifier: gocui.ModNone, Handler: gui.scrollDownConfirmationPanel, }, { ViewName: "packages", Key: gui.getKey("universal.select"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleCheckoutPackage), }, + { + ViewName: "packages", + Key: gui.getKey("packages.publish"), + Handler: gui.wrappedPackageHandler(gui.handlePublishPackage), + }, { ViewName: "packages", Key: gui.getKey("universal.new"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleAddPackage), Description: "add package to list", }, { ViewName: "packages", Key: gui.getKey("packages.pack"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handlePackPackage), Description: fmt.Sprintf("%s package", utils.ColoredString("`npm pack`", color.FgYellow)), }, { ViewName: "packages", Key: gui.getKey("packages.link"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleLinkPackage), Description: fmt.Sprintf("%s (or unlink if already linked)", utils.ColoredString("`npm link `", color.FgYellow)), }, { ViewName: "packages", Key: gui.getKey("packages.globalLink"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleGlobalLinkPackage), Description: fmt.Sprintf("%s (i.e. globally link) (or unlink if already linked)", utils.ColoredString("`npm link`", color.FgYellow)), }, { ViewName: "packages", Key: gui.getKey("universal.remove"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleRemovePackage), Description: "remove package from list", }, { ViewName: "packages", Key: gui.getKey("universal.install"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleInstall), Description: fmt.Sprintf("%s package", utils.ColoredString("`npm install`", color.FgYellow)), }, { ViewName: "packages", Key: gui.getKey("packages.build"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleBuild), Description: fmt.Sprintf("%s package", utils.ColoredString("`npm run build`", color.FgYellow)), }, { ViewName: "packages", Key: gui.getKey("universal.openFile"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleOpenPackageConfig), Description: "open package.json", }, { ViewName: "scripts", Key: gui.getKey("universal.select"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleRunScript), Description: fmt.Sprintf("%s script", utils.ColoredString("`npm run`", color.FgYellow)), }, { ViewName: "scripts", Key: gui.getKey("universal.remove"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleRemoveScript), Description: "remove script from package.json", }, { ViewName: "deps", Key: gui.getKey("universal.install"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleDepInstall), Description: fmt.Sprintf("%s dependency", utils.ColoredString("`npm install`", color.FgYellow)), }, { ViewName: "deps", Key: gui.getKey("universal.openFile"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleOpenDepPackageConfig), Description: "open package.json", }, { ViewName: "deps", Key: gui.getKey("universal.update"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleDepUpdate), Description: fmt.Sprintf("%s dependency", utils.ColoredString("`npm update`", color.FgYellow)), }, { ViewName: "deps", Key: gui.getKey("universal.remove"), - Modifier: gocui.ModNone, Handler: gui.wrappedHandler(gui.handleDepUninstall), Description: fmt.Sprintf("%s dependency", utils.ColoredString("`npm uninstall`", color.FgYellow)), }, @@ -501,36 +461,35 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { for _, viewName := range []string{"status", "packages", "deps", "scripts", "menu"} { bindings = append(bindings, []*Binding{ - {ViewName: viewName, Key: gui.getKey("universal.togglePanel"), Modifier: gocui.ModNone, Handler: gui.nextView}, - {ViewName: viewName, Key: gui.getKey("universal.prevBlock"), Modifier: gocui.ModNone, Handler: gui.previousView}, - {ViewName: viewName, Key: gui.getKey("universal.nextBlock"), Modifier: gocui.ModNone, Handler: gui.nextView}, - {ViewName: viewName, Key: gui.getKey("universal.prevBlock-alt"), Modifier: gocui.ModNone, Handler: gui.previousView}, - {ViewName: viewName, Key: gui.getKey("universal.nextBlock-alt"), Modifier: gocui.ModNone, Handler: gui.nextView}, + {ViewName: viewName, Key: gui.getKey("universal.togglePanel"), Handler: gui.nextView}, + {ViewName: viewName, Key: gui.getKey("universal.prevBlock"), Handler: gui.previousView}, + {ViewName: viewName, Key: gui.getKey("universal.nextBlock"), Handler: gui.nextView}, + {ViewName: viewName, Key: gui.getKey("universal.prevBlock-alt"), Handler: gui.previousView}, + {ViewName: viewName, Key: gui.getKey("universal.nextBlock-alt"), Handler: gui.nextView}, }...) } // Appends keybindings to jump to a particular sideView using numbers for i, viewName := range []string{"status", "packages", "deps", "scripts"} { - bindings = append(bindings, &Binding{ViewName: "", Key: rune(i+1) + '0', Modifier: gocui.ModNone, Handler: gui.goToSideView(viewName)}) + bindings = append(bindings, &Binding{ViewName: "", Key: rune(i+1) + '0', Handler: gui.goToSideView(viewName)}) } for _, listView := range gui.getListViews() { bindings = append(bindings, []*Binding{ - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevItem-alt"), Modifier: gocui.ModNone, Handler: listView.handlePrevLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevItem"), Modifier: gocui.ModNone, Handler: listView.handlePrevLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseWheelUp, Modifier: gocui.ModNone, Handler: listView.handlePrevLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextItem-alt"), Modifier: gocui.ModNone, Handler: listView.handleNextLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextItem"), Modifier: gocui.ModNone, Handler: listView.handleNextLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevPage"), Modifier: gocui.ModNone, Handler: listView.handlePrevPage, Description: gui.Tr.SLocalize("prevPage")}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextPage"), Modifier: gocui.ModNone, Handler: listView.handleNextPage, Description: gui.Tr.SLocalize("nextPage")}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.gotoTop"), Modifier: gocui.ModNone, Handler: listView.handleGotoTop, Description: gui.Tr.SLocalize("gotoTop")}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseWheelDown, Modifier: gocui.ModNone, Handler: listView.handleNextLine}, - {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseLeft, Modifier: gocui.ModNone, Handler: listView.handleClick}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevItem-alt"), Handler: listView.handlePrevLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevItem"), Handler: listView.handlePrevLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseWheelUp, Handler: listView.handlePrevLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextItem-alt"), Handler: listView.handleNextLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextItem"), Handler: listView.handleNextLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.prevPage"), Handler: listView.handlePrevPage, Description: gui.Tr.SLocalize("prevPage")}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.nextPage"), Handler: listView.handleNextPage, Description: gui.Tr.SLocalize("nextPage")}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.gotoTop"), Handler: listView.handleGotoTop, Description: gui.Tr.SLocalize("gotoTop")}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseWheelDown, Handler: listView.handleNextLine}, + {ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gocui.MouseLeft, Handler: listView.handleClick}, { ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.startSearch"), - Modifier: gocui.ModNone, Handler: gui.handleOpenSearch, Description: gui.Tr.SLocalize("startSearch"), }, @@ -538,7 +497,6 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { ViewName: listView.viewName, Contexts: []string{listView.context}, Key: gui.getKey("universal.gotoBottom"), - Modifier: gocui.ModNone, Handler: listView.handleGotoBottom, Description: gui.Tr.SLocalize("gotoBottom"), }, diff --git a/pkg/gui/packages_panel.go b/pkg/gui/packages_panel.go index 8dc9286..dec3f7c 100644 --- a/pkg/gui/packages_panel.go +++ b/pkg/gui/packages_panel.go @@ -264,3 +264,52 @@ func (gui *Gui) selectedPackageID() string { return pkg.ID() } + +func (gui *Gui) handlePublishPackage(pkg *commands.Package) error { + cmdStr := "npm publish" + + tagPrompt := func() error { + return gui.createPromptPanel(gui.getPackagesView(), "Enter tag name (leave blank for no tag)", "", func(tag string) error { + if tag != "" { + cmdStr = fmt.Sprintf("%s --tag=%s", cmdStr, tag) + } + cmdStr = fmt.Sprintf("%s %s", cmdStr, pkg.Config.Name) + return gui.newMainCommand(cmdStr, pkg.ID()) + }) + } + + if pkg.Scoped() { + menuItems := []*menuItem{ + { + displayStrings: []string{"restricted (default)", utils.ColoredString("--access=restricted", color.FgYellow)}, + onPress: func() error { + cmdStr = fmt.Sprintf("%s --access=restricted", cmdStr) + return tagPrompt() + }, + }, + { + displayStrings: []string{"public", utils.ColoredString("--access=public", color.FgYellow)}, + onPress: func() error { + cmdStr = fmt.Sprintf("%s --access=public", cmdStr) + return tagPrompt() + }, + }, + } + + return gui.createMenu("Set access for publishing scoped package (npm publish)", menuItems, createMenuOptions{showCancel: true}) + } + + return tagPrompt() +} + +func (gui *Gui) wrappedPackageHandler(f func(*commands.Package) error) func(*gocui.Gui, *gocui.View) error { + + return gui.wrappedHandler(func() error { + pkg := gui.getSelectedPackage() + if pkg == nil { + return nil + } + + return f(pkg) + }) +} diff --git a/pkg/gui/pty.go b/pkg/gui/pty.go index 258b7b3..51cc4d2 100644 --- a/pkg/gui/pty.go +++ b/pkg/gui/pty.go @@ -69,9 +69,14 @@ func (gui *Gui) newPtyTask(viewName string, cmd *exec.Cmd, cmdStr string) error _, _ = io.Copy(view, ptmx) - fmt.Fprint(view, utils.ColoredString("\ncommand has completed", color.FgGreen)) - onClose() + + if cmd.ProcessState.Success() { + fmt.Fprint(view, utils.ColoredString("\ncommand completed successfully", color.FgGreen)) + } else { + fmt.Fprint(view, utils.ColoredString("\ncommand failed", color.FgRed)) + } + }() return nil }