Repository: JanDeDobbeleer/oh-my-posh
Pull request #5122 (2024-06-19 00:09:19)

feat: add Yarn segment and fix PNPM docs
### Prerequisites

- [x] I have read and understood the [contributing guide][CONTRIBUTING.md].
- [x] The commit message follows the [conventional commits][cc] guidelines.
- [x] Tests for the changes have been added (for bug fixes / features).
- [x] Docs have been added/updated (for bug fixes / features).

### Description

1. Added `Yarn` segment
2. Fixed `PNPM` docs



Patch:
diff --git a/src/engine/segment.go b/src/engine/segment.go
index 8a2fd16b..b876813b 100644
--- a/src/engine/segment.go
+++ b/src/engine/segment.go
@@ -270,6 +270,8 @@ const (
 	WITHINGS SegmentType = "withings"
 	// XMAKE write the xmake version if xmake.lua is present
 	XMAKE SegmentType = "xmake"
+	// yarn version
+	YARN SegmentType = "yarn"
 	// YTM writes YouTube Music information and status
 	YTM SegmentType = "ytm"
 )
@@ -366,6 +368,7 @@ var Segments = map[SegmentType]func() SegmentWriter{
 	WINREG:          func() SegmentWriter { return &segments.WindowsRegistry{} },
 	WITHINGS:        func() SegmentWriter { return &segments.Withings{} },
 	XMAKE:           func() SegmentWriter { return &segments.XMake{} },
+	YARN:            func() SegmentWriter { return &segments.Yarn{} },
 	YTM:             func() SegmentWriter { return &segments.Ytm{} },
 }
 
diff --git a/src/segments/yarn.go b/src/segments/yarn.go
new file mode 100644
index 00000000..e78dd273
--- /dev/null
+++ b/src/segments/yarn.go
@@ -0,0 +1,34 @@
+package segments
+
+import (
+	"github.com/jandedobbeleer/oh-my-posh/src/platform"
+	"github.com/jandedobbeleer/oh-my-posh/src/properties"
+)
+
+type Yarn struct {
+	language
+}
+
+func (n *Yarn) Enabled() bool {
+	return n.language.Enabled()
+}
+
+func (n *Yarn) Template() string {
+	return " \U000F011B {{.Full}} "
+}
+
+func (n *Yarn) Init(props properties.Properties, env platform.Environment) {
+	n.language = language{
+		env:        env,
+		props:      props,
+		extensions: []string{"package.json", "yarn.lock"},
+		commands: []*cmd{
+			{
+				executable: "yarn",
+				args:       []string{"--version"},
+				regex:      `(?P<version>((?P<major>[0-9]+).(?P<minor>[0-9]+).(?P<patch>[0-9]+)))`,
+			},
+		},
+		versionURLTemplate: "https://github.com/yarnpkg/berry/releases/tag/v{{ .Full }}",
+	}
+}
diff --git a/themes/schema.json b/themes/schema.json
index 6cf9ab47..6da564e1 100644
--- a/themes/schema.json
+++ b/themes/schema.json
@@ -375,6 +375,7 @@
             "winreg",
             "withings",
             "xmake",
+            "yarn",
             "ytm"
           ]
         },
@@ -4639,6 +4640,55 @@
               }
             }
           }
+        },
+        {
+          "if": {
+            "properties": {
+              "type": {
+                "const": "yarn"
+              }
+            }
+          },
+          "then": {
+            "title": "Yarn Segment",
+            "description": "https://ohmyposh.dev/docs/segments/yarn",
+            "properties": {
+              "properties": {
+                "properties": {
+                  "home_enabled": {
+                    "$ref": "#/definitions/home_enabled"
+                  },
+                  "fetch_version": {
+                    "$ref": "#/definitions/fetch_version"
+                  },
+                  "display_mode": {
+                    "$ref": "#/definitions/display_mode"
+                  },
+                  "missing_command_text": {
+                    "$ref": "#/definitions/missing_command_text"
+                  },
+                  "version_url_template": {
+                    "$ref": "#/definitions/version_url_template"
+                  },
+                  "cache_version": {
+                    "$ref": "#/definitions/cache_version"
+                  },
+                  "extensions": {
+                    "type": "array",
+                    "title": "Extensions",
+                    "description": "The extensions to look for when determining if a folder is an Yarn workspace",
+                    "default": ["package.json", "yarn.lock"],
+                    "items": {
+                      "type": "string"
+                    }
+                  },
+                  "folders": {
+                    "$ref": "#/definitions/folders"
+                  }
+                }
+              }
+            }
+          }
         }
       ]
     }
@@ -4676,6 +4726,12 @@
       "description": "https://ohmyposh.dev/docs/configuration/title#general-settings",
       "default": false
     },
+    "auto_upgrade": {
+      "type": "boolean",
+      "title": "Enable automatic upgrades for Oh My Posh (supports Windows/macOS only)",
+      "description": "https://ohmyposh.dev/docs/configuration/title#general-settings",
+      "default": false
+    },
     "patch_pwsh_bleed": {
       "type": "boolean",
       "title": "Patch PowerShell Color Bleed",
diff --git a/website/docs/configuration/general.mdx b/website/docs/configuration/general.mdx
index 640a4375..c3a9b6b9 100644
--- a/website/docs/configuration/general.mdx
+++ b/website/docs/configuration/general.mdx
@@ -137,6 +137,7 @@ For example, the following is a valid `--config` flag:
 | `disable_cursor_positioning` | `boolean`        | disable fetching the cursor position in bash and zsh in case of unwanted side-effects                                                                                                                                                                                        |
 | `patch_pwsh_bleed`           | `boolean`        | patch a PowerShell bug where the background colors bleed into the next line at the end of the buffer (can be removed when [this][pwsh-bleed] is merged)                                                                                                                      |
 | `disable_notice`             | `boolean`        | disable the upgrade notice                                                                                                                                                                                                                                                   |
+| `auto_upgrade`               | `boolean`        | enable automatic upgrades for Oh My Posh (supports Windows/macOS only)                                                                                                                                                                                                       |
 | `iterm_features`             | `[]string`       | enable iTerm2 specific features:<ul><li>`prompt_mark`: add the `iterm2_prompt_mark` [function][iterm2-si] for supported shells</li><li>`current_dir`: expose the current directory for iTerm2</li><li>`remote_host`: expose the current remote and user for iTerm2</li></ul> |
 
 ### JSON Schema Validation
@@ -160,7 +161,7 @@ For example, given the following code:
 ```
 
 Warnings will be raised for type, since `an_invalid_entry` is not in the list of acceptable values, as well as
-for the entire segment item (enclosed in {}), since it lacks the required `style` key. Take advantage of these
+for the entire segment item (enclosed in `{}`), since it lacks the required `style` key. Take advantage of these
 warnings, and ignore them at your peril.
 
 ### Accepted Formats
diff --git a/website/docs/segments/pnpm.mdx b/website/docs/segments/pnpm.mdx
index 381d7421..983f955c 100644
--- a/website/docs/segments/pnpm.mdx
+++ b/website/docs/segments/pnpm.mdx
@@ -15,9 +15,8 @@ import Config from "@site/src/components/Config.js";
 <Config
   data={{
     type: "pnpm",
-    style: "diamond",
-    leading_diamond: "\uE0B2",
-    trailing_diamond: "\uE0D6",
+    style: "powerline",
+    powerline_symbol: "\uE0B0",
     foreground: "#000000",
     background: "#F9AD00",
     template: " \uDB80\uDEC1 {{ .Full }} ",
@@ -33,7 +32,7 @@ import Config from "@site/src/components/Config.js";
 | `missing_command_text` |  `string`  |                                | text to display when the command is missing                                                                                                                                                                                          |
 | `display_mode`         |  `string`  |           `context`            | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
 | `version_url_template` |  `string`  |                                | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes                                                                                                                |
-| `extensions`           | `[]string` | `package.json, yarn-lock.yaml` | allows to override the default list of file extensions to validate                                                                                                                                                                   |
+| `extensions`           | `[]string` | `package.json, pnpm-lock.yaml` | allows to override the default list of file extensions to validate                                                                                                                                                                   |
 | `folders`              | `[]string` |                                | allows to override the list of folder names to validate                                                                                                                                                                              |
 | `cache_version`        | `boolean`  |            `false`             | cache the executable's version or not                                                                                                                                                                                                |
 
diff --git a/website/docs/segments/yarn.mdx b/website/docs/segments/yarn.mdx
new file mode 100644
index 00000000..512c6d62
--- /dev/null
+++ b/website/docs/segments/yarn.mdx
@@ -0,0 +1,62 @@
+---
+id: yarn
+title: Yarn
+sidebar_label: Yarn
+---
+
+## What
+
+Display the currently active [yarn][yarn-docs] version.
+
+## Sample Configuration
+
+import Config from "@site/src/components/Config.js";
+
+<Config
+  data={{
+    type: "yarn",
+    style: "powerline",
+    powerline_symbol: "\uE0B0",
+    foreground: "#FFFFFF",
+    background: "#2E2A65",
+    template: " \uDB80\uDD1B {{ .Full }} ",
+  }}
+/>
+
+## Properties
+
+| Name                   |    Type    |          Default          | Description                                                                                                                                                                                                                          |
+| ---------------------- | :--------: | :-----------------------: | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+| `home_enabled`         | `boolean`  |          `false`          | display the segment in the HOME folder or not                                                                                                                                                                                        |
+| `fetch_version`        | `boolean`  |          `true`           | fetch the Yarn version                                                                                                                                                                                                               |
+| `missing_command_text` |  `string`  |                           | text to display when the command is missing                                                                                                                                                                                          |
+| `display_mode`         |  `string`  |         `context`         | <ul><li>`always`: the segment is always displayed</li><li>`files`: the segment is only displayed when file `extensions` listed are present</li><li>`context`: displays the segment when the environment or files is active</li></ul> |
+| `version_url_template` |  `string`  |                           | a go [text/template][go-text-template] [template][templates] that creates the URL of the version info / release notes                                                                                                                |
+| `extensions`           | `[]string` | `package.json, yarn.lock` | allows to override the default list of file extensions to validate                                                                                                                                                                   |
+| `folders`              | `[]string` |                           | allows to override the list of folder names to validate                                                                                                                                                                              |
+| `cache_version`        | `boolean`  |          `false`          | cache the executable's version or not                                                                                                                                                                                                |
+
+## Template ([info][templates])
+
+:::note default template
+
+```template
+\uDB80\uDD1B {{.Full}}
+```
+
+:::
+
+### Properties
+
+| Name     | Type     | Description                                        |
+| -------- | -------- | -------------------------------------------------- |
+| `.Full`  | `string` | the full version                                   |
+| `.Major` | `string` | major number                                       |
+| `.Minor` | `string` | minor number                                       |
+| `.Patch` | `string` | patch number                                       |
+| `.URL`   | `string` | URL of the version info / release notes            |
+| `.Error` | `string` | error encountered when fetching the version string |
+
+[go-text-template]: https://golang.org/pkg/text/template/
+[templates]: /docs/configuration/templates
+[yarn-docs]: https://yarnpkg.com
diff --git a/website/sidebars.js b/website/sidebars.js
index 32ef3287..78ca49bf 100644
--- a/website/sidebars.js
+++ b/website/sidebars.js
@@ -138,6 +138,7 @@ module.exports = {
         "segments/withings",
         "segments/winreg",
         "segments/xmake",
+        "segments/yarn",
         "segments/ytm",
       ],
     },


Test patch:
diff --git a/src/segments/yarn_test.go b/src/segments/yarn_test.go
new file mode 100644
index 00000000..8b1c2bd7
--- /dev/null
+++ b/src/segments/yarn_test.go
@@ -0,0 +1,31 @@
+package segments
+
+import (
+	"fmt"
+	"testing"
+
+	"github.com/alecthomas/assert"
+)
+
+func TestYarn(t *testing.T) {
+	cases := []struct {
+		Case           string
+		ExpectedString string
+		Version        string
+	}{
+		{Case: "1.0.0", ExpectedString: "\U000F011B 1.0.0", Version: "1.0.0"},
+	}
+	for _, tc := range cases {
+		params := &mockedLanguageParams{
+			cmd:           "yarn",
+			versionParam:  "--version",
+			versionOutput: tc.Version,
+			extension:     "package.json",
+		}
+		env, props := getMockedLanguageEnv(params)
+		yarn := &Yarn{}
+		yarn.Init(props, env)
+		assert.True(t, yarn.Enabled(), fmt.Sprintf("Failed in case: %s", tc.Case))
+		assert.Equal(t, tc.ExpectedString, renderTemplate(env, yarn.Template(), yarn), fmt.Sprintf("Failed in case: %s", tc.Case))
+	}
+}