Skip to content

Commit

Permalink
Add MustGetGlobal() for more convenient global class usage (#3)
Browse files Browse the repository at this point in the history
  • Loading branch information
JohnStarich committed Mar 5, 2023
1 parent 4a52697 commit 330b042
Show file tree
Hide file tree
Showing 2 changed files with 74 additions and 1 deletion.
34 changes: 33 additions & 1 deletion global.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,41 @@

package safejs

import "syscall/js"
import (
"fmt"
"syscall/js"
)

// Global returns the JavaScript global object, usually "window" or "global".
func Global() Value {
return Safe(js.Global())
}

// MustGetGlobal fetches the given global, then verifies it is truthy. Panics on error or falsy values.
// This is intended for simple global variable initialization, like preparing classes for later instantiation.
//
// For example:
//
// var jsUint8Array = safejs.MustGetGlobal("Uint8Array")
func MustGetGlobal(property string) Value {
value, err := getGlobal(property)
if err != nil {
panic(err)
}
return value
}

func getGlobal(property string) (Value, error) {
value, err := Global().Get(property)
if err != nil {
return Value{}, err
}
truthy, err := value.Truthy()
if err != nil {
return Value{}, err
}
if !truthy {
return Value{}, fmt.Errorf("global %q is not defined", property)
}
return value, nil
}
41 changes: 41 additions & 0 deletions global_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
//go:build js && wasm

package safejs

import (
"testing"

"github.com/hack-pad/safejs/internal/assert"
"github.com/hack-pad/safejs/internal/catch"
)

func TestGlobal(t *testing.T) {
t.Parallel()
global := Global()
self, err := global.Get("self")
assert.NoError(t, err)
assert.Equal(t, true, global.Equal(self))
}

func TestMustGetGlobal(t *testing.T) {
t.Parallel()
const className = "Uint8Array"
t.Run("success", func(t *testing.T) {
t.Parallel()
jsUint8Array, err := catch.Try(func() Value {
return MustGetGlobal(className)
})
assert.NoError(t, err)
jsUint8Array2, err := Global().Get(className)
assert.NoError(t, err)
assert.Equal(t, true, jsUint8Array.Equal(jsUint8Array2))
})

t.Run("undefined global", func(t *testing.T) {
t.Parallel()
_, err := catch.Try(func() Value {
return MustGetGlobal(className + "-foo")
})
assert.EqualError(t, err, `global "Uint8Array-foo" is not defined`)
})
}

0 comments on commit 330b042

Please sign in to comment.