Skip to content

Commit

Permalink
add: handle adding unknown provider, pin version by default
Browse files Browse the repository at this point in the history
  • Loading branch information
thdxr committed Sep 2, 2024
1 parent f2b8db4 commit 8950ca7
Show file tree
Hide file tree
Showing 8 changed files with 49 additions and 47 deletions.
9 changes: 6 additions & 3 deletions cmd/sst/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -633,8 +633,11 @@ var root = &cli.Command{
return err
}
}

err = p.Add(pkg)
entry, err := project.FindProvider(pkg, "latest")
if err != nil {
return util.NewReadableError(err, "Could not find provider "+pkg)
}
err = p.Add(entry.Name, entry.Version)
if err != nil {
return err
}
Expand All @@ -652,7 +655,7 @@ var root = &cli.Command{
return err
}
spin.Stop()
ui.Success(fmt.Sprintf("Added provider \"%s\"", pkg))
ui.Success(fmt.Sprintf("Added provider \"%s\". You can create resources with `new %s.SomeResource()`", entry.Alias, entry.Alias))
return nil
},
},
Expand Down
2 changes: 1 addition & 1 deletion examples/aws-hono/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,6 @@
"@aws-sdk/client-s3": "^3.552.0",
"@aws-sdk/s3-request-presigner": "^3.552.0",
"hono": "^4.1.3",
"sst": "latest"
"sst": "^3.0.83"
}
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -76,7 +76,7 @@ require (
github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 // indirect
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 // indirect
github.com/aws/aws-sdk-go-v2/service/sts v1.26.7
github.com/aws/smithy-go v1.20.3 // indirect
github.com/aws/smithy-go v1.20.3
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/blang/semver v3.5.1+incompatible // indirect
github.com/charmbracelet/bubbles v0.18.0
Expand Down
4 changes: 4 additions & 0 deletions pkg/npm/npm.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ import (
type Package struct {
Name string `json:"name"`
Version string `json:"version"`
Pulumi struct {
Name string `json:"name"`
Version string `json:"version"`
}
}

func Get(name string, version string) (*Package, error) {
Expand Down
6 changes: 4 additions & 2 deletions pkg/project/add.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,12 @@ import (
"github.com/sst/ion/pkg/global"
)

func (p *Project) Add(pkg string) error {
func (p *Project) Add(pkg string, version string) error {
cmd := exec.Command(global.BunPath(), filepath.Join(p.PathPlatformDir(), "src/ast/add.ts"),
p.PathConfig(),
pkg)
pkg,
version,
)
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
return cmd.Run()
Expand Down
64 changes: 25 additions & 39 deletions pkg/project/install.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package project

import (
"bufio"
"encoding/json"
"errors"
"fmt"
Expand All @@ -10,8 +9,6 @@ import (
"os"
"os/exec"
"path/filepath"
"regexp"
"strings"

"github.com/sst/ion/pkg/global"
"github.com/sst/ion/pkg/npm"
Expand Down Expand Up @@ -139,7 +136,7 @@ func (p *Project) writeTypes() error {
file.WriteString(` interface Providers {` + "\n")
file.WriteString(` providers?: {` + "\n")
for _, entry := range p.lock {
file.WriteString(` "` + entry.Name + `"?: (_` + entry.Alias + `.ProviderArgs & { version?: string }) | boolean;` + "\n")
file.WriteString(` "` + entry.Name + `"?: (_` + entry.Alias + `.ProviderArgs & { version?: string }) | boolean | string;` + "\n")
}
file.WriteString(` }` + "\n")
file.WriteString(` }` + "\n")
Expand All @@ -165,29 +162,6 @@ func (p *Project) fetchDeps() error {
if err != nil {
return errors.New("failed to run bun install " + string(output))
}
for _, entry := range p.lock {
path := filepath.Join(p.PathPlatformDir(), "node_modules", entry.Package, "provider.js")
file, err := os.Open(path)
if err != nil {
return err
}
defer file.Close()
scanner := bufio.NewScanner(file)
pulumiTypePattern := regexp.MustCompile(`Provider\.__pulumiType = ['"]([^'"]+)['"]`)
for scanner.Scan() {
matches := pulumiTypePattern.FindStringSubmatch(scanner.Text())
if len(matches) > 1 {
entry.Alias = strings.ReplaceAll(matches[1], "-", "")
break
}
}
if err := scanner.Err(); err != nil {
return err
}
if entry.Alias == "" {
return fmt.Errorf("failed to find __pulumiType for %s", entry.Package)
}
}
return nil
}

Expand Down Expand Up @@ -225,19 +199,12 @@ func (p *Project) generateProviderLock() error {
version = "latest"
}
wg.Go(func() error {
for _, prefix := range []string{"@sst-provider/", "@pulumi/", "@pulumiverse/", "@", ""} {
pkg, err := npm.Get(prefix+n, version.(string))
if err != nil {
continue
}
results <- ProviderLockEntry{
Name: n,
Package: pkg.Name,
Version: version.(string),
}
return nil
result, err := FindProvider(n, version.(string))
if err != nil {
return err
}
return fmt.Errorf("provider %s not found", n)
results <- *result
return nil
})
}
wg.Go(func() error {
Expand All @@ -256,6 +223,25 @@ func (p *Project) generateProviderLock() error {
return nil
}

func FindProvider(name string, version string) (*ProviderLockEntry, error) {
for _, prefix := range []string{"@sst-provider/", "@pulumi/", "@pulumiverse/", "pulumi-", "@", ""} {
pkg, err := npm.Get(prefix+name, version)
if err != nil {
continue
}
if pkg.Pulumi.Name == "" {
continue
}
return &ProviderLockEntry{
Name: name,
Package: pkg.Name,
Version: pkg.Version,
Alias: pkg.Pulumi.Name,
}, nil
}
return nil, fmt.Errorf("provider %s not found", name)
}

func (p *Project) writeProviderLock() error {
lockPath := filepath.Join(p.PathPlatformDir(), "provider-lock.json")
data, err := json.MarshalIndent(p.lock, "", " ")
Expand Down
6 changes: 6 additions & 0 deletions pkg/project/project.go
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,12 @@ console.log("~j" + JSON.stringify(mod.app({
if argsBool, ok := args.(bool); ok && argsBool {
proj.app.Providers[name] = make(map[string]interface{})
}

if argsString, ok := args.(string); ok {
proj.app.Providers[name] = map[string]interface{}{
"version": argsString,
}
}
}

if proj.app.Name == "" {
Expand Down
3 changes: 2 additions & 1 deletion platform/src/ast/add.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import prettier from "prettier";

const config = process.argv[2];
const pkg = process.argv[3];
const version = process.argv[4];

const code = fs.readFileSync(config);

Expand Down Expand Up @@ -61,7 +62,7 @@ if (
// Create a new property node for "foo: {}"
const newProperty = ts.factory.createPropertyAssignment(
ts.factory.createStringLiteral(pkg),
ts.factory.createTrue(),
ts.factory.createStringLiteral(version),
);

providersProperty.initializer.properties.push(newProperty);
Expand Down

0 comments on commit 8950ca7

Please sign in to comment.