nano-web 1.0.0

Static file server built with Rust with pre-compressed in-memory caching
Documentation
version: "3"

env:
  PKGOS: linux
  PKGARCH: amd64
  PKGNAME: nano-web
  RELEASEDIR: ./release
  CGO_ENABLED: 0

vars:
  VERSION:
    sh: cat VERSION 2>/dev/null || echo "dev"
  COMMIT:
    sh: git rev-parse --short HEAD
  BUILD_TIME:
    sh: date -u +"%Y-%m-%dT%H:%M:%SZ"
  LDFLAGS: -s -w -X main.version={{.VERSION}} -X main.commit={{.COMMIT}} -X main.buildTime={{.BUILD_TIME}}
  PKGRELEASE: "{{.PKGNAME}}_{{.VERSION}}"
  PKGDIR: "{{.RELEASEDIR}}/{{.PKGRELEASE}}-{{.PKGARCH}}"

tasks:
  default:
    desc: "Show available tasks"
    cmd: task --list

  dev:
    desc: "๐Ÿš€ Run development server"
    deps: [build]
    cmd: ./{{.PKGNAME}} --dev --port 3000 --log-format console --log-level debug

  run:
    desc: "๐Ÿƒ Run with go run"
    cmd: go run . --port 3000 --log-format console --log-level debug

  build:
    desc: "๐Ÿ—๏ธ Build binary"
    sources:
      - "*.go"
      - "go.mod"
      - "go.sum"
    generates:
      - "{{.PKGNAME}}"
    cmd: go build -ldflags="{{.LDFLAGS}}" -o {{.PKGNAME}} ./

  build-all:
    desc: "๐ŸŒ Build for all platforms"
    deps: [clean-dist]
    cmds:
      - mkdir -p dist
      - GOOS=linux GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-linux-amd64 .
      - GOOS=linux GOARCH=arm64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-linux-arm64 .
      - GOOS=darwin GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-darwin-amd64 .
      - GOOS=darwin GOARCH=arm64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-darwin-arm64 .
      - GOOS=windows GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-windows-amd64.exe .
      - GOOS=freebsd GOARCH=amd64 go build -ldflags="{{.LDFLAGS}}" -o dist/{{.PKGNAME}}-freebsd-amd64 .

  test:
    desc: "๐Ÿงช Run tests"
    env:
      CGO_ENABLED: 1
    cmd: go test -v -race .

  test-coverage:
    desc: "๐Ÿ“Š Run tests with coverage"
    env:
      CGO_ENABLED: 1
    cmds:
      - go test -v -race -coverprofile=coverage.out -covermode=atomic ./
      - go tool cover -html=coverage.out -o coverage.html
      - echo "Coverage report generated coverage.html"

  bench:
    desc: "๐Ÿ”ฅ Run benchmarks"
    env:
      CGO_ENABLED: 1
    cmd: go test -bench=. -benchmem -count=3 .

  lint:
    desc: "๐Ÿ” Run linter"
    cmd: golangci-lint run ./...

  fmt:
    desc: "โœจ Format code"
    cmds:
      - go fmt ./...
      - goimports -w .

  vet:
    desc: "๐Ÿ”Ž Run go vet"
    cmd: go vet ./...

  check:
    desc: "โœ… Run all checks"
    cmds:
      - task: test
      - task: lint
      - task: vet

  deps:
    desc: "๐Ÿ“ฆ Download dependencies"
    cmd: go mod download

  deps-update:
    desc: "โฌ†๏ธ Update dependencies"
    cmds:
      - go get -u ./...
      - go mod tidy

  clean:
    desc: "๐Ÿงน Clean build artifacts"
    cmds:
      - rm -f {{.PKGNAME}}
      - rm -f coverage.out coverage.html

  clean-dist:
    desc: "๐Ÿ—‘๏ธ Clean dist directory"
    cmd: rm -rf dist/

  clean-all:
    desc: "๐Ÿ’ฅ Clean everything"
    deps: [clean, clean-dist, pkg-clean]

  docker-build:
    desc: "๐Ÿณ Build Docker image"
    cmd: docker build -t {{.PKGNAME}}:{{.VERSION}} -t {{.PKGNAME}}:latest .

  docker-run:
    desc: "๐Ÿšข Run Docker container"
    deps: [docker-build]
    cmd: docker run --rm -p 3000:3000 -e PORT=3000 {{.PKGNAME}}:latest

  release-local:
    desc: "๐Ÿš€ Create local release"
    deps: [build-all]
    cmds:
      - mkdir -p {{.RELEASEDIR}}
      - cd dist && for file in {{.PKGNAME}}-*; do tar -czf ../{{.RELEASEDIR}}/$file.tar.gz $file; done
      - cd {{.RELEASEDIR}} && sha256sum *.tar.gz > checksums.txt
      - echo "Local release created in release dir"

  pkg-clean:
    desc: "๐Ÿงน Clean package artifacts"
    cmd: rm -rf {{.RELEASEDIR}}

  pkg-build:
    desc: "๐Ÿ“ฆ Build OPS package binary"
    env:
      GOOS: "{{.PKGOS}}"
      GOARCH: "{{.PKGARCH}}"
    cmd: |
      mkdir -p {{.PKGDIR}}
      go build -ldflags="{{.LDFLAGS}}" -o {{.PKGDIR}}/{{.PKGNAME}} .

  pkg-create:
    desc: "๐Ÿ“ Create OPS package structure"
    deps: [pkg-clean]
    cmds:
      - mkdir -p {{.PKGDIR}}/sysroot/public
      - |
        cat > {{.PKGDIR}}/package.manifest << EOF
        {
           "Program":"{{.PKGRELEASE}}/{{.PKGNAME}}",
           "Args" : ["{{.PKGNAME}}"],
           "Version":"{{.VERSION}}"
        }
        EOF
      - cp README.md {{.PKGDIR}}/

  pkg-add:
    desc: "โž• Add OPS package"
    deps: [pkg-create, pkg-build]
    cmd: ops pkg add {{.PKGDIR}} --name {{.PKGRELEASE}}

  pkg-bundle:
    desc: "๐Ÿ“ฆ Bundle OPS package"
    deps: [pkg-add]
    cmds:
      - cd {{.RELEASEDIR}} && tar czvf {{.PKGRELEASE}}-{{.PKGARCH}}.tar.gz {{.PKGRELEASE}}-{{.PKGARCH}}
      - echo "Package bundle created"

  pkg-push:
    desc: "๐Ÿ“ค Push OPS package"
    deps: [pkg-add]
    cmd: ops pkg push {{.PKGRELEASE}}

  pkg-load:
    desc: "๐Ÿš€ Load and run OPS package"
    deps: [pkg-add]
    cmd: ops pkg load -l {{.PKGRELEASE}} -p 80

  current-version:
    desc: "๐Ÿ“‹ Show current version from file"
    cmd: cat VERSION

  publish:
    desc: "๐Ÿ“ก Publish module to Go proxy"
    vars:
      VERSION: "{{.VERSION}}"
    cmd: GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@v{{.VERSION}}

  publish-current:
    desc: "๐Ÿ“ก Publish current version to Go proxy"
    cmd: GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@v{{.VERSION}}

  version:
    desc: "๐Ÿ“‹ Show version"
    cmd: echo "Version {{.VERSION}} Commit {{.COMMIT}} Built {{.BUILD_TIME}}"

  info:
    desc: "โ„น๏ธ Show project info"
    cmds:
      - echo "Project {{.PKGNAME}}"
      - echo "Version {{.VERSION}}"
      - echo "Commit {{.COMMIT}}"
      - echo "Build Time {{.BUILD_TIME}}"
      - go version
      - echo "Platform {{OS}}/{{ARCH}}"

  update-changelog:
    desc: "๐Ÿ“ Update CHANGELOG.md with current version"
    cmd: ./scripts/update-changelog.sh {{.VERSION}}

  release:
    desc: "Create and push a semantic version release (usage: task release -- major|minor|patch)"
    silent: true
    cmds:
      - |
        CLI_ARGS="{{.CLI_ARGS}}"
        VERSION_TYPE=$(echo "$CLI_ARGS" | awk '{print $1}')
        VERSION_TYPE="${VERSION_TYPE:-patch}"
        CURRENT_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")

        if [ -z "$CURRENT_TAG" ]; then
          CURRENT_VERSION="0.0.0"
        else
          CURRENT_VERSION=$(echo "$CURRENT_TAG" | sed 's/^v//')
        fi

        echo "Current version: $CURRENT_VERSION"
        IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"

        # Ensure components are numbers
        MAJOR=${MAJOR:-0}
        MINOR=${MINOR:-0}
        PATCH=${PATCH:-0}

        case "$VERSION_TYPE" in
          major)
            MAJOR=$((MAJOR + 1))
            MINOR=0
            PATCH=0
            ;;
          minor)
            MINOR=$((MINOR + 1))
            PATCH=0
            ;;
          patch)
            PATCH=$((PATCH + 1))
            ;;
          *)
            echo "Usage: task release -- major|minor|patch"
            exit 1
            ;;
        esac

        NEW_VERSION="$MAJOR.$MINOR.$PATCH"
        NEW_TAG="v$NEW_VERSION"

        echo "Creating release $NEW_TAG (was v$CURRENT_VERSION)"

        # Update VERSION file
        echo "$NEW_VERSION" > VERSION
        
        # Update changelog
        echo "๐Ÿ“ Updating changelog..."
        ./scripts/update-changelog.sh "$NEW_VERSION" "$CURRENT_VERSION"
        
        # Commit version and changelog updates
        git add VERSION CHANGELOG.md
        git commit -m "Bump version to $NEW_VERSION"

        # Create and push tag
        git tag -a "$NEW_TAG" -m "Release $NEW_TAG"
        git push origin main
        git push origin "$NEW_TAG"

        echo "Release $NEW_TAG created and pushed!"
        echo "๐Ÿ“ก Publishing to Go module proxy..."
        GOPROXY=proxy.golang.org go list -m github.com/radiosilence/nano-web@$NEW_TAG
        echo "๐Ÿ“ฆ Version $NEW_VERSION is now live and published!"
        echo "GitHub Actions will build the release and update Homebrew automatically."

  ci:
    desc: "๐Ÿค– Run CI pipeline"
    cmds:
      - task: deps
      - task: check
      - task: build-all
      - echo "CI completed successfully"