Skip to content

Basic Usage Examples ​

This page contains basic usage examples of NPM Skills to help you get started quickly.

Typical Usage Flow ​

Almost every programmatic use follows three steps: "create client → call with context → handle result/error":

Example 1: Get Package Information ​

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    // Create client
    client := registry.NewRegistry()
    ctx := context.Background()
    
    // Get package information
    pkg, err := client.GetPackageInformation(ctx, "react")
    if err != nil {
        log.Fatal(err)
    }
    
    // Display basic information
    fmt.Printf("Package: %s\n", pkg.Name)
    fmt.Printf("Description: %s\n", pkg.Description)
    fmt.Printf("Latest Version: %s\n", pkg.DistTags["latest"])
    fmt.Printf("License: %s\n", pkg.License)
    fmt.Printf("Homepage: %s\n", pkg.Homepage)
    fmt.Printf("Author: %s\n", pkg.Author.Name)
}

Example 2: Using Different Mirror Sources ​

go
package main

import (
    "context"
    "fmt"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    ctx := context.Background()

    // Use different mirror sources
    mirrors := map[string]*registry.Registry{
        "Official":      registry.NewRegistry(),
        "Taobao Mirror": registry.NewTaoBaoRegistry(),
        "NPM Mirror":    registry.NewNpmMirrorRegistry(),
        "Huawei Cloud":  registry.NewHuaWeiCloudRegistry(),
    }
    
    packageName := "lodash"
    
    for name, client := range mirrors {
        pkg, err := client.GetPackageInformation(ctx, packageName)
        if err != nil {
            fmt.Printf("%s: Failed to get - %v\n", name, err)
            continue
        }
        
        fmt.Printf("%s: %s (v%s)\n", name, pkg.Name, pkg.DistTags["latest"])
    }
}

Example 3: Proxy Configuration ​

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    // Configure proxy
    options := registry.NewOptions().
        SetRegistryURL("https://registry.npmjs.org").
        SetProxy("http://proxy.example.com:8080")
    
    client := registry.NewRegistry(options)
    ctx := context.Background()
    
    pkg, err := client.GetPackageInformation(ctx, "express")
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Got package info via proxy: %s\n", pkg.Name)
}

Example 4: Search Packages ​

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    ctx := context.Background()
    
    // Search packages
    result, err := client.SearchPackages(ctx, "react ui component", 5)
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Found %d results (time: %s)\n", result.Total, result.Time)
    fmt.Println("---")
    
    for i, obj := range result.Objects {
        pkg := obj.Package
        fmt.Printf("%d. %s (v%s)\n", i+1, pkg.Name, pkg.Version)
        fmt.Printf("   Description: %s\n", pkg.Description)
        fmt.Printf("   Score: %.2f\n", obj.Score.Final)
        fmt.Printf("   Link: %s\n", pkg.Links.NPM)
        fmt.Println()
    }
}

Example 5: Get Specific Version Information ​

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    ctx := context.Background()
    
    // Get specific version
    version, err := client.GetPackageVersion(ctx, "react", "17.0.2")
    if err != nil {
        log.Fatal(err)
    }
    
    fmt.Printf("Package: %s\n", version.Name)
    fmt.Printf("Version: %s\n", version.Version)
    fmt.Printf("Description: %s\n", version.Description)
    fmt.Printf("Main File: %s\n", version.Main)
    
    // Display dependencies
    if len(version.Dependencies) > 0 {
        fmt.Println("\nRuntime Dependencies:")
        for dep, ver := range version.Dependencies {
            fmt.Printf("  %s: %s\n", dep, ver)
        }
    }
    
    // Display dev dependencies
    if len(version.DevDependencies) > 0 {
        fmt.Println("\nDev Dependencies:")
        for dep, ver := range version.DevDependencies {
            fmt.Printf("  %s: %s\n", dep, ver)
        }
    }
}

Example 6: Get Download Statistics ​

go
package main

import (
    "context"
    "fmt"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    ctx := context.Background()

    packages := []string{"react", "vue", "angular"}
    periods := []string{"last-day", "last-week", "last-month"}
    
    for _, pkg := range packages {
        fmt.Printf("\n=== %s ===\n", pkg)
        
        for _, period := range periods {
            stats, err := client.GetDownloadStats(ctx, pkg, period)
            if err != nil {
                fmt.Printf("%s: Failed to get - %v\n", period, err)
                continue
            }
            
            fmt.Printf("%s: %d downloads\n", period, stats.Downloads)
        }
    }
}

Example 7: Error Handling ​

go
package main

import (
    "context"
    "errors"
    "fmt"
    "log"
    "time"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    
    // Set timeout
    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
    defer cancel()
    
    pkg, err := client.GetPackageInformation(ctx, "nonexistent-package-12345")
    if err != nil {
        switch {
        case errors.Is(err, context.DeadlineExceeded):
            log.Println("Request timeout")
        case errors.Is(err, context.Canceled):
            log.Println("Request canceled")
        default:
            log.Printf("Failed to get package info: %v\n", err)
        }
        return
    }
    
    fmt.Printf("Package info: %s\n", pkg.Name)
}

Example 8: Compare Version Information ​

go
package main

import (
    "context"
    "fmt"
    "log"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    ctx := context.Background()
    
    packageName := "lodash"
    versions := []string{"4.17.20", "4.17.21"}
    
    fmt.Printf("Comparing different versions of %s:\n\n", packageName)
    
    for _, ver := range versions {
        version, err := client.GetPackageVersion(ctx, packageName, ver)
        if err != nil {
            log.Printf("Failed to get version %s: %v\n", ver, err)
            continue
        }
        
        fmt.Printf("Version %s:\n", version.Version)
        fmt.Printf("  Description: %s\n", version.Description)
        fmt.Printf("  Dependencies count: %d\n", len(version.Dependencies))
        fmt.Printf("  Dev dependencies count: %d\n", len(version.DevDependencies))
        
        if version.Deprecated != "" {
            fmt.Printf("  ⚠️  Deprecated: %s\n", version.Deprecated)
        }
        
        fmt.Println()
    }
}

Example 9: Get Registry Status ​

go
package main

import (
    "context"
    "fmt"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    // Check status of multiple registries
    registries := map[string]*registry.Registry{
        "NPM Official": registry.NewRegistry(),
        "Taobao Mirror": registry.NewTaoBaoRegistry(),
        "Huawei Cloud":  registry.NewHuaWeiCloudRegistry(),
    }
    
    ctx := context.Background()
    
    for name, client := range registries {
        fmt.Printf("=== %s ===\n", name)
        
        info, err := client.GetRegistryInformation(ctx)
        if err != nil {
            fmt.Printf("Failed to get: %v\n\n", err)
            continue
        }
        
        fmt.Printf("Database name: %s\n", info.DbName)
        fmt.Printf("Total packages: %d\n", info.DocCount)
        fmt.Printf("Deleted packages: %d\n", info.DocDelCount)
        fmt.Printf("Data size: %d MB\n", info.DataSize/(1024*1024))
        fmt.Printf("Disk usage: %d MB\n", info.DiskSize/(1024*1024))
        fmt.Printf("Instance start time: %s\n", info.InstanceStartTime)
        fmt.Println()
    }
}

Example 10: Batch Processing ​

go
package main

import (
    "context"
    "fmt"
    "sync"

    "github.com/scagogogo/npm-skills/pkg/registry"
)

func main() {
    client := registry.NewRegistry()
    ctx := context.Background()
    
    packages := []string{
        "react", "vue", "angular", "lodash", "express",
        "axios", "moment", "underscore", "jquery", "bootstrap",
    }
    
    var wg sync.WaitGroup
    results := make(chan string, len(packages))
    
    // Concurrently get package information
    for _, pkg := range packages {
        wg.Add(1)
        go func(packageName string) {
            defer wg.Done()
            
            info, err := client.GetPackageInformation(ctx, packageName)
            if err != nil {
                results <- fmt.Sprintf("❌ %s: %v", packageName, err)
                return
            }
            
            results <- fmt.Sprintf("✅ %s: v%s (%s)", 
                info.Name, 
                info.DistTags["latest"], 
                info.Description[:50]+"...")
        }(pkg)
    }
    
    // Wait for all goroutines to complete
    go func() {
        wg.Wait()
        close(results)
    }()
    
    // Collect and display results
    fmt.Println("Batch package information results:")
    for result := range results {
        fmt.Println(result)
    }
}

Running Examples ​

Save any example code to a file (e.g., example.go), then run:

bash
go mod init npm-skills-example
go get github.com/scagogogo/npm-skills
go run example.go

Next Steps ​

Released under the MIT License.