From 888da9e3c8c83dba82e4984ba2bc9ad8ed060c2c Mon Sep 17 00:00:00 2001 From: hmerritt Date: Wed, 11 Feb 2026 15:46:06 +0000 Subject: [PATCH 1/6] chore: ignore cover file --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 6af1bac..27bb00e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,8 @@ node_modules/ *.tar *.tar.gz +cover.out + !npm/reactenv/bin/reactenv npm/reactenv-darwin-arm64/reactenv npm/reactenv-darwin-x64/reactenv From 1d6d61e621ae8207c88e7ff42de2fcff6f0b9753 Mon Sep 17 00:00:00 2001 From: hmerritt Date: Thu, 12 Feb 2026 15:05:40 +0000 Subject: [PATCH 2/6] ci: release flow to github and ftp --- .github/actions/build/action.yml | 13 ++++++ .github/actions/release-ftp/action.yml | 37 +++++++++++++++ .github/actions/test/action.yml | 8 +--- .github/workflows/release.yml | 64 ++++++++++++++++++++++++++ .github/workflows/test-dev.yml | 3 ++ .github/workflows/test-master.yml | 3 ++ .gitignore | 3 +- go.mod | 2 + go.sum | 4 ++ 9 files changed, 129 insertions(+), 8 deletions(-) create mode 100644 .github/actions/build/action.yml create mode 100644 .github/actions/release-ftp/action.yml create mode 100644 .github/workflows/release.yml diff --git a/.github/actions/build/action.yml b/.github/actions/build/action.yml new file mode 100644 index 0000000..37ba696 --- /dev/null +++ b/.github/actions/build/action.yml @@ -0,0 +1,13 @@ +name: Build +description: Build release binaries + +runs: + using: "composite" + steps: + - name: Build release binaries + shell: bash + run: | + mage -v build:release + mage -v release:prep + find bin -type f -printf "%p %k KB\n" + find dist -type f -printf "%p %k KB\n" diff --git a/.github/actions/release-ftp/action.yml b/.github/actions/release-ftp/action.yml new file mode 100644 index 0000000..131dd95 --- /dev/null +++ b/.github/actions/release-ftp/action.yml @@ -0,0 +1,37 @@ +name: "Upload Release to FTP" +description: "Uploads all release ZIPs to an FTP server" + +inputs: + ftp_host: + description: "FTP server hostname or IP address" + required: true + ftp_username: + description: "FTP username" + required: true + ftp_password: + description: "FTP password" + required: true + ftp_path: + description: "FTP remote directory path" + required: true + local_path: + description: "Local directory path containing release binaries" + required: true + release_version: + description: "Version number for release. For example: 1.2.123" + required: true + +runs: + using: "composite" + steps: + - name: Upload release ZIPs to FTP server + shell: bash + run: | + mage -v release:ftp + env: + FTP_HOST: ${{ inputs.ftp_host }} + FTP_USERNAME: ${{ inputs.ftp_username }} + FTP_PASSWORD: ${{ inputs.ftp_password }} + FTP_PATH: ${{ inputs.ftp_path }} + LOCAL_PATH: ${{ inputs.local_path }} + RELEASE_VERSION: ${{ inputs.release_version }} diff --git a/.github/actions/test/action.yml b/.github/actions/test/action.yml index b781f68..7635c8b 100644 --- a/.github/actions/test/action.yml +++ b/.github/actions/test/action.yml @@ -1,5 +1,5 @@ name: Test -description: Run Go tests +description: Run tests runs: using: "composite" @@ -7,9 +7,3 @@ runs: - name: Run Tests shell: bash run: mage -v test - - - name: Run Build - shell: bash - run: | - mage -v build:release - ls -la bin diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..a7152ac --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,64 @@ +name: Release + +on: + push: + tags: + - "[0-9]+.[0-9]+.[0-9]+" + +jobs: + test: + runs-on: ubuntu-latest + name: Run Tests + + steps: + - uses: actions/checkout@v6 + - name: Go Setup + uses: ./.github/actions/go-setup + + - name: Run Tests + uses: ./.github/actions/test + + release: + needs: test + runs-on: ubuntu-latest + name: Build release binaries + + steps: + - uses: actions/checkout@v6 + - name: Go Setup + uses: ./.github/actions/go-setup + + - name: Build release binaries + uses: ./.github/actions/build + + - name: Release to GitHub via tagged-release + id: create_release + uses: softprops/action-gh-release@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + tag_name: ${{ github.ref_name }} + name: v${{ github.ref_name }} + draft: true + prerelease: false + files: | + ./dist/reactenv_${{ github.ref_name }}_darwin_amd64.zip + ./dist/reactenv_${{ github.ref_name }}_darwin_arm64.zip + ./dist/reactenv_${{ github.ref_name }}_freebsd_amd64.zip + ./dist/reactenv_${{ github.ref_name }}_freebsd_arm.zip + ./dist/reactenv_${{ github.ref_name }}_linux_amd64.zip + ./dist/reactenv_${{ github.ref_name }}_linux_arm64.zip + ./dist/reactenv_${{ github.ref_name }}_netbsd_amd64.zip + ./dist/reactenv_${{ github.ref_name }}_netbsd_arm.zip + ./dist/reactenv_${{ github.ref_name }}_openbsd_amd64.zip + ./dist/reactenv_${{ github.ref_name }}_windows_amd64.zip + + - name: Release to FTP + uses: ./.github/actions/release-ftp + with: + ftp_host: ${{ secrets.FTP_HOST }} + ftp_username: ${{ secrets.FTP_USERNAME }} + ftp_password: ${{ secrets.FTP_PASSWORD }} + ftp_path: ${{ secrets.FTP_PATH }} + local_path: ./dist + release_version: ${{ github.ref_name }} diff --git a/.github/workflows/test-dev.yml b/.github/workflows/test-dev.yml index e325437..288b094 100644 --- a/.github/workflows/test-dev.yml +++ b/.github/workflows/test-dev.yml @@ -19,3 +19,6 @@ jobs: - name: Run Tests uses: ./.github/actions/test + + - name: Build release binaries + uses: ./.github/actions/build diff --git a/.github/workflows/test-master.yml b/.github/workflows/test-master.yml index 0cbc1f2..b9c15c8 100644 --- a/.github/workflows/test-master.yml +++ b/.github/workflows/test-master.yml @@ -22,3 +22,6 @@ jobs: - name: Send coverage uses: ./.github/actions/coverage + + - name: Build release binaries + uses: ./.github/actions/build diff --git a/.gitignore b/.gitignore index 27bb00e..88a7c33 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,8 @@ .yarn/ .idea/ .vagrant/ -bin/**/* +bin/ +dist/ target/ node_modules/ diff --git a/go.mod b/go.mod index 5a39871..e364bc3 100644 --- a/go.mod +++ b/go.mod @@ -32,12 +32,14 @@ require ( github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.8.0 // indirect github.com/huandu/xstrings v1.5.0 // indirect + github.com/kr/fs v0.1.0 // indirect github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/iochan v1.0.0 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect + github.com/pkg/sftp v1.13.10 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/shopspring/decimal v1.4.0 // indirect diff --git a/go.sum b/go.sum index bef359b..ecd2aa4 100644 --- a/go.sum +++ b/go.sum @@ -56,6 +56,8 @@ github.com/huandu/xstrings v1.5.0/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/jessevdk/go-flags v1.6.1 h1:Cvu5U8UGrLay1rZfv/zP7iLpSHGUZ/Ou68T0iX1bBK4= github.com/jessevdk/go-flags v1.6.1/go.mod h1:Mk8T1hIAWpOiJiHa9rJASDK2UGWji0EuPGBnNLMooyc= +github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -84,6 +86,8 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/pkg/sftp v1.13.10 h1:+5FbKNTe5Z9aspU88DPIKJ9z2KZoaGCu6Sr6kKR/5mU= +github.com/pkg/sftp v1.13.10/go.mod h1:bJ1a7uDhrX/4OII+agvy28lzRvQrmIQuaHrcI1HbeGA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= From 502ad2380d1d7c8c4064e7fc887f09ada6b3c959 Mon Sep 17 00:00:00 2001 From: hmerritt Date: Thu, 12 Feb 2026 15:06:20 +0000 Subject: [PATCH 3/6] feat: go scripts for release prep, ftp upload, and npm publish --- magefile.go | 82 +++++++++++++++++++++++++++++++++-- magefile_helpers.go | 95 ++++++++++++++++++++++++++++++++++++++++- version/version_base.go | 5 +++ 3 files changed, 177 insertions(+), 5 deletions(-) diff --git a/magefile.go b/magefile.go index c3ff5fd..34e0428 100644 --- a/magefile.go +++ b/magefile.go @@ -18,6 +18,7 @@ import ( ) type Build mg.Namespace +type Release mg.Namespace type Npm mg.Namespace var Aliases = map[string]interface{}{ @@ -78,12 +79,18 @@ func Bench() error { func (Build) Clean() error { log := NewLogger() defer log.End() - log.Info("cleaning bin directory") + log.Info("cleaning bin and dist directories") if err := os.RemoveAll("bin"); err != nil { return log.Error(err) } + if err := os.RemoveAll("dist"); err != nil { + return log.Error(err) + } + + log.Info("cleaning npm directories") + return fs.WalkDir(os.DirFS("npm"), ".", func(filePath string, d fs.DirEntry, err error) error { if d.IsDir() || filePath == "reactenv/bin/reactenv" || @@ -105,7 +112,7 @@ func (Build) Debug() error { } func (Build) Release() error { - mg.Deps(Build.Clean, BumpVersion) + mg.Deps(Build.Clean) log := NewLogger() defer log.End() @@ -130,7 +137,8 @@ func (Build) Release() error { // Release // ---------------------------------------------------------------------------- -func Release() error { +// Prep for release (zip, copy each binary to npm directories, copy zips to dist directory) +func (Release) Prep() error { log := NewLogger() defer log.End() @@ -211,6 +219,74 @@ func Release() error { } } + // Copy zips to dist directory + log.Debug("copying release zips to dist directory") + if err := os.MkdirAll("dist", 0755); err != nil { + return log.Error("failed to create dist directory:", err) + } + for _, arch := range releaseArchs { + zipFilePath := fmt.Sprintf("bin/%s_%s_%s.zip", BINARY_FILENAME, releaseVersion, arch) + CopyFile(zipFilePath, path.Join("dist", path.Base(zipFilePath))) + } + + return nil +} + +// Upload release binaries to FTP server. +// +// A new directory is created on the FTP server for the release version, +// and the release files (everything in `LOCAL_PATH` directory) are uploaded to it. +func (Release) FTP() error { + log := NewLogger() + defer log.End() + + ftpHost := os.Getenv("FTP_HOST") + ftpUsername := os.Getenv("FTP_USERNAME") + ftpPassword := os.Getenv("FTP_PASSWORD") + ftpPath := os.Getenv("FTP_PATH") + localPath := os.Getenv("LOCAL_PATH") + releaseVersion := os.Getenv("RELEASE_VERSION") + ftpReleasePath := path.Join(ftpPath, releaseVersion) + + log.Info("ftp upload path: ", ftpReleasePath) + + if ftpHost == "" || ftpUsername == "" || ftpPassword == "" || ftpPath == "" || localPath == "" || releaseVersion == "" { + return log.Error("required FTP environment variables not set") + } + + err := FTPUploadDir(ftpHost, ftpUsername, ftpPassword, ftpReleasePath, localPath, releaseVersion) + if err != nil { + return log.Error("failed to upload release files to FTP server:", err) + } + + return nil +} + +// Runs `npm publish` for each npm package. +func (Release) NPM() error { + log := NewLogger() + defer log.End() + + // Read all npm directories + npmDirectories, err := fs.ReadDir(os.DirFS("npm"), ".") + if err != nil { + return log.Error("failed to read npm directories:", err) + } + + // Run `npm publish` for each npm package + for _, dir := range npmDirectories { + if !dir.IsDir() || !strings.HasPrefix(dir.Name(), "reactenv") { + continue + } + + packagePath := path.Join("npm", dir.Name()) + log.Info("publishing npm package: ", packagePath) + + if err := RunStream([]string{"npm", "publish"}, packagePath, false); err != nil { + return log.Error("failed to publish npm package:", packagePath, err) + } + } + return nil } diff --git a/magefile_helpers.go b/magefile_helpers.go index 166c945..8cd8ba6 100644 --- a/magefile_helpers.go +++ b/magefile_helpers.go @@ -11,18 +11,25 @@ import ( "io" "os" "os/exec" + "path" "runtime" "strings" "sync" "time" + "github.com/hmerritt/reactenv/version" + "github.com/pkg/sftp" + "golang.org/x/crypto/ssh" + "github.com/fatih/color" "github.com/magefile/mage/sh" ) const ( - MODULE_NAME = "hmerritt/reactenv" // go.mod module name - LOG_LEVEL = 4 // 5 = debug, 4 = info, 3 = warn, 2 = error + APP_NAME = version.AppName + BINARY_FILENAME = version.BinaryFilename + MODULE_NAME = "hmerritt/reactenv" // go.mod module name + LOG_LEVEL = 4 // 5 = debug, 4 = info, 3 = warn, 2 = error ) // ---------------------------------------------------------------------------- @@ -283,6 +290,14 @@ func GitBranch() string { // MISC // ---------------------------------------------------------------------------- +// Returns the filename of the application binary, based on the current OS. +func BinaryFilenameForCurrentOS(filename string) string { + if runtime.GOOS == "windows" { + return fmt.Sprintf("%s.exe", filename) + } + return filename +} + // Checks if an executable exists in PATH func ExecExists(e string) bool { _, err := exec.LookPath(e) @@ -355,3 +370,79 @@ func ZipFiles(zipPath string, files ...string) error { return nil } + +// Upload all files in a directory to a FTP server +func FTPUploadDir(host, username, password, remotePath, localPath, releaseVersion string) error { + log := NewLogger() + defer log.End() + + if host == "" || username == "" || password == "" || remotePath == "" || localPath == "" || releaseVersion == "" { + return errors.New("required FTP environment variables not set") + } + + config := &ssh.ClientConfig{ + User: username, + Auth: []ssh.AuthMethod{ + ssh.Password(password), + }, + HostKeyCallback: ssh.InsecureIgnoreHostKey(), + } + + conn, err := ssh.Dial("tcp", fmt.Sprintf("%s:%s", host, "22"), config) + if err != nil { + return err + } + defer conn.Close() + + client, err := sftp.NewClient(conn) + if err != nil { + return err + } + defer client.Close() + + err = client.Mkdir(remotePath) + if err != nil && !os.IsExist(err) { + // If the directory already exists, ignore the error + return err + } + + localDir, err := os.Open(localPath) + if err != nil { + return err + } + defer localDir.Close() + + files, err := localDir.Readdir(-1) + if err != nil { + return err + } + + for _, file := range files { + if file.IsDir() { + continue + } + + localFilePath := path.Join(localPath, file.Name()) + remoteFilePath := path.Join(remotePath, file.Name()) + + localFile, err := os.Open(localFilePath) + if err != nil { + return err + } + defer localFile.Close() + + remoteFile, err := client.Create(remoteFilePath) + if err != nil { + return err + } + defer remoteFile.Close() + + _, err = remoteFile.ReadFrom(localFile) + if err != nil { + return err + } + + } + + return nil +} diff --git a/version/version_base.go b/version/version_base.go index d8b97fd..027b19b 100644 --- a/version/version_base.go +++ b/version/version_base.go @@ -1,5 +1,10 @@ package version +const ( + AppName = "reactenv" + BinaryFilename = "reactenv" +) + var ( // The git commit that was compiled. This will be filled in by the compiler. GitCommit string From 9c3612981735a2cf23fe61afae5a17333a0f7de6 Mon Sep 17 00:00:00 2001 From: hmerritt Date: Thu, 12 Feb 2026 15:19:35 +0000 Subject: [PATCH 4/6] test: wordwrap.go --- ui/wordwrap_test.go | 173 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 ui/wordwrap_test.go diff --git a/ui/wordwrap_test.go b/ui/wordwrap_test.go new file mode 100644 index 0000000..4074759 --- /dev/null +++ b/ui/wordwrap_test.go @@ -0,0 +1,173 @@ +package ui + +import ( + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestWrapStringWrapsWithIndent(t *testing.T) { + input := "alpha beta gamma" + + got := WrapString(input, 10, 2) + + require.Equal(t, "alpha beta\n gamma", got) +} + +func TestWrapStringExactLimitDoesNotWrap(t *testing.T) { + input := "alpha beta" + + got := WrapString(input, 10, 2) + + require.Equal(t, input, got) +} + +func TestWrapStringOneOverLimitWraps(t *testing.T) { + input := "alpha beta" + + got := WrapString(input, 9, 2) + + require.Equal(t, "alpha\n beta", got) +} + +func TestWrapStringPreservesExplicitNewlinesWithIndent(t *testing.T) { + input := "alpha\nbeta" + + got := WrapString(input, 10, 3) + + require.Equal(t, "alpha\n beta", got) +} + +func TestWrapStringPreservesConsecutiveNewlinesWithIndent(t *testing.T) { + input := "alpha\n\nbeta" + + got := WrapString(input, 10, 2) + + require.Equal(t, "alpha\n \n beta", got) +} + +func TestWrapStringPreservesLeadingAndTrailingSpacesWithinLimit(t *testing.T) { + input := " alpha beta " + + got := WrapString(input, 20, 2) + + require.Equal(t, input, got) +} + +func TestWrapStringTreatsTabsAsWhitespace(t *testing.T) { + input := "alpha\tbeta" + + got := WrapString(input, 9, 2) + + require.Equal(t, "alpha\n beta", got) +} + +func TestWrapStringDropsExtraSpacesOnWrap(t *testing.T) { + input := "alpha beta" + + got := WrapString(input, 10, 2) + + require.Equal(t, "alpha\n beta", got) +} + +func TestWrapStringDoesNotBreakOnNBSPOrLongWord(t *testing.T) { + input := "alpha\u00A0beta" + + got := WrapString(input, 6, 2) + + require.Equal(t, input, got) +} + +func TestWrapStringDoesNotBreakLongWord(t *testing.T) { + input := "supercalifragilisticexpialidocious" + + got := WrapString(input, 8, 2) + + require.Equal(t, input, got) +} + +func TestWrapStringIndentZero(t *testing.T) { + input := "alpha beta" + + got := WrapString(input, 9, 0) + + require.Equal(t, "alpha\nbeta", got) +} + +func TestWrapAtLengthDelegatesToWrapString(t *testing.T) { + input := "one two three" + + got := WrapAtLength(input, 1) + expected := WrapString(input, MaxLineLength, 1) + + require.Equal(t, expected, got) +} + +func TestWrapAtLengthKeepsLinesWithinLimitForWords(t *testing.T) { + input := strings.TrimSpace(strings.Repeat("alpha beta ", 10)) + + got := WrapAtLength(input, 2) + lines := strings.Split(got, "\n") + + require.Greater(t, len(lines), 1) + for i, line := range lines { + if i == 0 { + require.LessOrEqual(t, len(line), MaxLineLength) + continue + } + + require.True(t, strings.HasPrefix(line, " ")) + require.LessOrEqual(t, len(strings.TrimPrefix(line, " ")), MaxLineLength) + } +} + +func TestIndentStringAddsIndentAfterNewlines(t *testing.T) { + input := "a\nb\n" + + got := IndentString(input, 2) + + require.Equal(t, "a\n b\n ", got) +} + +func TestIndentStringNoNewlines(t *testing.T) { + input := "abc" + + got := IndentString(input, 2) + + require.Equal(t, input, got) +} + +func TestIndentStringEmpty(t *testing.T) { + got := IndentString("", 3) + + require.Equal(t, "", got) +} + +func TestIndentStringMultipleNewlines(t *testing.T) { + input := "a\nb\nc" + + got := IndentString(input, 2) + + require.Equal(t, "a\n b\n c", got) +} + +func TestPluralize(t *testing.T) { + tests := []struct { + name string + input string + count int + expected string + }{ + {name: "Singular", input: "item", count: 1, expected: "item"}, + {name: "Zero", input: "item", count: 0, expected: "items"}, + {name: "Negative", input: "item", count: -1, expected: "items"}, + {name: "Many", input: "item", count: 3, expected: "items"}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + require.Equal(t, tc.expected, Pluralize(tc.input, tc.count)) + }) + } +} From 5ebcc91f2f07d0a0b58c6ec557c0b144bb90b3c6 Mon Sep 17 00:00:00 2001 From: hmerritt Date: Thu, 12 Feb 2026 15:35:07 +0000 Subject: [PATCH 5/6] chore: improve comment --- magefile.go | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/magefile.go b/magefile.go index 34e0428..1246633 100644 --- a/magefile.go +++ b/magefile.go @@ -137,7 +137,11 @@ func (Build) Release() error { // Release // ---------------------------------------------------------------------------- -// Prep for release (zip, copy each binary to npm directories, copy zips to dist directory) +// Prep for release +// +// - Copy each binary to `npm` directories +// +// - Zip up binaries, then copy zips to `dist` directory func (Release) Prep() error { log := NewLogger() defer log.End() @@ -232,7 +236,8 @@ func (Release) Prep() error { return nil } -// Upload release binaries to FTP server. +// Upload all files in a directory to an FTP server (configurable). Used to upload +// all release zips in `dist`. // // A new directory is created on the FTP server for the release version, // and the release files (everything in `LOCAL_PATH` directory) are uploaded to it. From aff6e79dfeeaeeff2e72d4a057ac562fffa4eb87 Mon Sep 17 00:00:00 2001 From: hmerritt Date: Thu, 12 Feb 2026 15:36:25 +0000 Subject: [PATCH 6/6] chore: bump version --- npm/reactenv-darwin-arm64/package.json | 2 +- npm/reactenv-darwin-x64/package.json | 2 +- npm/reactenv-linux-arm64/package.json | 2 +- npm/reactenv-linux-x64/package.json | 2 +- npm/reactenv-win32-x64/package.json | 2 +- npm/reactenv/package.json | 2 +- version/version_base.go | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/npm/reactenv-darwin-arm64/package.json b/npm/reactenv-darwin-arm64/package.json index 6f5bc4a..ee25301 100644 --- a/npm/reactenv-darwin-arm64/package.json +++ b/npm/reactenv-darwin-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli-darwin-arm64", - "version": "0.1.88", + "version": "0.1.96", "description": "The macOS ARM 64-bit binary for reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "os": [ diff --git a/npm/reactenv-darwin-x64/package.json b/npm/reactenv-darwin-x64/package.json index 86126a2..c9f7b03 100644 --- a/npm/reactenv-darwin-x64/package.json +++ b/npm/reactenv-darwin-x64/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli-darwin-x64", - "version": "0.1.88", + "version": "0.1.96", "description": "The macOS 64-bit binary for reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "os": [ diff --git a/npm/reactenv-linux-arm64/package.json b/npm/reactenv-linux-arm64/package.json index 24f4277..b395215 100644 --- a/npm/reactenv-linux-arm64/package.json +++ b/npm/reactenv-linux-arm64/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli-linux-arm64", - "version": "0.1.88", + "version": "0.1.96", "description": "The Linux ARM 64-bit binary for reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "os": [ diff --git a/npm/reactenv-linux-x64/package.json b/npm/reactenv-linux-x64/package.json index 2c29345..27bc591 100644 --- a/npm/reactenv-linux-x64/package.json +++ b/npm/reactenv-linux-x64/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli-linux-x64", - "version": "0.1.88", + "version": "0.1.96", "description": "The Linux 64-bit binary for reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "os": [ diff --git a/npm/reactenv-win32-x64/package.json b/npm/reactenv-win32-x64/package.json index 6b0d184..680394d 100644 --- a/npm/reactenv-win32-x64/package.json +++ b/npm/reactenv-win32-x64/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli-win32-x64", - "version": "0.1.88", + "version": "0.1.96", "description": "The Windows 64-bit binary for reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "os": [ diff --git a/npm/reactenv/package.json b/npm/reactenv/package.json index 3f56cd3..1414e73 100644 --- a/npm/reactenv/package.json +++ b/npm/reactenv/package.json @@ -1,6 +1,6 @@ { "name": "@reactenv/cli", - "version": "0.1.88", + "version": "0.1.96", "description": "reactenv, an experimental solution to inject env variables after a build.", "license": "Apache-2.0", "bin": { diff --git a/version/version_base.go b/version/version_base.go index 027b19b..c98b00f 100644 --- a/version/version_base.go +++ b/version/version_base.go @@ -14,7 +14,7 @@ var ( // The compilation date. This will be filled in by the compiler. BuildDate string - Version = "0.1.88" + Version = "0.1.96" VersionPrerelease = "" VersionMetadata = "" )