PDD2ROUBLE32JERYQJ6DEQLJWMK6RHRH4QBWTJGJYOC4ST2JIQXAC {"$schema": "https://wails.io/schemas/config.v2.json","name": "hangman","outputfilename": "hangman","frontend:install": "go mod tidy","frontend:build": "make","frontend:dev:watcher": "make dev","frontend:dev:serverUrl": "http://localhost:8844","author": {"name": "Nurahmadie","email": "177826+fudanchii@users.noreply.github.com"}}
package mainimport ("embed""jisho/internal/jmdict""github.com/wailsapp/wails/v2""github.com/wailsapp/wails/v2/pkg/options""github.com/wailsapp/wails/v2/pkg/options/assetserver")//go:embed all:distvar assets embed.FSfunc main() {// Create an instance of the app structuredict := jmdict.Load()app := NewApp(dict)// Create application with optionsappOptions := &options.App{Title: "jisho",Width: 1024,Height: 768,AssetServer: &assetserver.Options{Assets: assets,},BackgroundColour: &options.RGBA{R: 27, G: 38, B: 54, A: 1},OnStartup: app.startup,Bind: []interface{}{app,},}if err := wails.Run(appOptions); err != nil {println("Error:", err.Error())}}
package wordtype Provider interface {Provide() (string, error)Ready() (bool, error)}
package jmdictimport ("compress/gzip""fmt""math/rand""os""sync""github.com/samber/lo""github.com/themoeway/jmdict-go")type JMdictProvider struct {mtx sync.MutexloadErr errorjdict *jmdict.Jmdict}func Load() *JMdictProvider {provider := &JMdictProvider{}go func(provider *JMdictProvider) {provider.mtx.Lock()defer provider.mtx.Unlock()f, err := os.Open("./3rdparty/JMdict_e.gz")if err != nil {provider.loadErr = errreturn}defer f.Close()gzReader, err := gzip.NewReader(f)if err != nil {provider.loadErr = errreturn}jdict, _, err := jmdict.LoadJmdict(gzReader)if err != nil {provider.loadErr = errreturn}provider.jdict = &jdict}(provider)return provider}func (j *JMdictProvider) Provide() (string, error) {j.mtx.Lock()defer j.mtx.Unlock()if j.err() != nil {return "", j.err()}idx := rand.Int31n(int32(len(j.jdict.Entries)))return j.readings(idx)[0], nil}func (j *JMdictProvider) readings(i int32) []string {return lo.Map(j.jdict.Entries[i].Readings, func(r jmdict.JmdictReading, _ int) string {return r.Reading})}func (j *JMdictProvider) Ready() (bool, error) {j.mtx.Lock()defer j.mtx.Unlock()if j.loadErr != nil {return false, j.loadErr}return j.jdict != nil, nil}func (j *JMdictProvider) err() error {if j.loadErr != nil {return j.loadErr}if j.jdict == nil {return fmt.Errorf("provider is not ready")}return nil}
github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY=github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0=github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY=github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck=github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs=github.com/labstack/echo/v4 v4.10.2 h1:n1jAhnq/elIFTHr1EYpiYtyKgx4RW9ccVgkqByZaN2M=github.com/labstack/echo/v4 v4.10.2/go.mod h1:OEyqf2//K1DFdE57vw2DRgWY0M7s65IVQO2FzvI4J5k=github.com/labstack/gommon v0.4.0 h1:y7cvthEAEbU0yHOf4axH8ZG2NH8knB9iNSoTO8dyIk8=github.com/labstack/gommon v0.4.0/go.mod h1:uW6kP17uPlLJsD3ijUYn3/M5bAxtlZhMI6m3MFxTMTM=github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc=github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA=github.com/leaanthony/go-ansi-parser v1.6.0 h1:T8TuMhFB6TUMIUm0oRrSbgJudTFw9csT3ZK09w0t4Pg=github.com/leaanthony/go-ansi-parser v1.6.0/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU=github.com/leaanthony/gosod v1.0.3 h1:Fnt+/B6NjQOVuCWOKYRREZnjGyvg+mEhd1nkkA04aTQ=github.com/leaanthony/gosod v1.0.3/go.mod h1:BJ2J+oHsQIyIQpnLPjnqFGTMnOZXDbvWtRCSG7jGxs4=github.com/leaanthony/slicer v1.5.0/go.mod h1:FwrApmf8gOrpzEWM2J/9Lh79tyq8KTX5AzRtwV7m4AY=github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js=github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8=github.com/leaanthony/u v1.1.0 h1:2n0d2BwPVXSUq5yhe8lJPHdxevE2qK5G99PMStMZMaI=github.com/leaanthony/u v1.1.0/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI=github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE=github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU=github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA=github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU=github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=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/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc=github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis=github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88=github.com/samber/lo v1.38.1 h1:j2XEAqXKb09Am4ebOg31SpvzUTTs6EN3VfgeLUhPdXM=github.com/samber/lo v1.38.1/go.mod h1:+m/ZKRl6ClXCE2Lgf3MsQlWfh4bn1bz6CXEOxnEXnEA=github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk=github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=github.com/themoeway/jmdict-go v0.0.0-20230321060422-fa8f5d54f364 h1:JSSM5osTN5FCoj7uErWoMVY+IbDh+OG0aRJnKsxgngc=github.com/themoeway/jmdict-go v0.0.0-20230321060422-fa8f5d54f364/go.mod h1:M9O+lJXOwrOqpN4VUv8Qkn1gsZ/SZaSAiF7nj0m1NZk=github.com/tkrajina/go-reflector v0.5.6 h1:hKQ0gyocG7vgMD2M3dRlYN6WBBOmdoOzJ6njQSepKdE=github.com/tkrajina/go-reflector v0.5.6/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4=github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=github.com/wailsapp/go-webview2 v1.0.7 h1:s95+7irJsAsTy1RsjJ6N0cYX7tZ4gP7Uzawds0L2urs=github.com/wailsapp/go-webview2 v1.0.7/go.mod h1:Uk2BePfCRzttBBjFrBmqKGJd41P6QIHeV9kTgIeOZNo=github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs=github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o=golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g=golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc=golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w=golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M=golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/sys v0.0.0-20210616045830-e2b7044e8c71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU=golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE=golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
module jishogo 1.21toolchain go1.21.0require (github.com/samber/lo v1.38.1github.com/themoeway/jmdict-go v0.0.0-20230321060422-fa8f5d54f364github.com/wailsapp/wails/v2 v2.6.0)require (github.com/bep/debounce v1.2.1 // indirectgithub.com/go-ole/go-ole v1.2.6 // indirectgithub.com/google/uuid v1.3.0 // indirectgithub.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirectgithub.com/labstack/echo/v4 v4.10.2 // indirectgithub.com/labstack/gommon v0.4.0 // indirectgithub.com/leaanthony/go-ansi-parser v1.6.0 // indirectgithub.com/leaanthony/gosod v1.0.3 // indirectgithub.com/leaanthony/slicer v1.6.0 // indirectgithub.com/leaanthony/u v1.1.0 // indirectgithub.com/mattn/go-colorable v0.1.13 // indirectgithub.com/mattn/go-isatty v0.0.19 // indirectgithub.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirectgithub.com/pkg/errors v0.9.1 // indirectgithub.com/rivo/uniseg v0.4.4 // indirectgithub.com/tkrajina/go-reflector v0.5.6 // indirectgithub.com/valyala/bytebufferpool v1.0.0 // indirectgithub.com/valyala/fasttemplate v1.2.2 // indirectgithub.com/wailsapp/go-webview2 v1.0.7 // indirectgithub.com/wailsapp/mimetype v1.4.1 // indirectgolang.org/x/crypto v0.9.0 // indirectgolang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirectgolang.org/x/net v0.10.0 // indirectgolang.org/x/sys v0.8.0 // indirectgolang.org/x/text v0.9.0 // indirect)replace github.com/wailsapp/wails/v2 v2.6.0 => /home/adie/repo/wails/v2
@use 'fonts';body {width: 100vw;height: 100vh;background: white;overflow: hidden;margin: 0;padding: 0;}#root {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}.main {.text-entry {font-family: 'Homemade Apple';font-size: 2.5em;border-bottom-width: 5px;border-top-width: 0;border-left-width: 0;border-right-width: 0;&:focus {outline: none;}&::before {content: " ";}}}
@font-face {font-family: 'Homemade Apple';src: url('fonts/HomemadeApple-Regular.ttf');}
<div id="root"><div class="main" vg-if='c.Word != ""'><components:TextEntry :Value='c.Word'></components:TextEntry><components:TextDisplay :Name='&c.Word'></components:TextDisplay></div><div class="main" vg-if='c.Word == ""'><marquee><h1>loading</h1></marquee><pre vg-if='c.Err != nil' vg-content='c.Err.Error()'></pre></div></div><script type="application/x-go">import "src/components"</script>
package mainimport ("src/bindings""github.com/vugu/vugu")type Root struct {Word string `vugu:"data"`Err error `vugu:"data"`bindings.App}func (r *Root) Init(ctx vugu.InitCtx) {go func() {ctx.EventEnv().Lock()defer ctx.EventEnv().UnlockRender()for {ready, err := r.Ready()if err != nil {r.Err = errbreak}if ready {r.Word, err = r.Provide()if err != nil {r.Err = err}break}}}()}
github.com/chromedp/cdproto v0.0.0-20191009033829-c22f49c9ff0a/go.mod h1:PfAWWKJqjlGFYJEidUM6aVIWPr0EpobeyVWEEmplX7g=github.com/chromedp/chromedp v0.5.1/go.mod h1:3NMfuKTrKNr8PWEvHzdzZ57PK4jm9zW1C5nKiaWdxcM=github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=github.com/fudanchii/infr v0.0.0-20231015031929-aa95fddceacc h1:1b1uHL9lNb39kArDEM+ZE7TqRBHiQudBz3RkYslDH2s=github.com/fudanchii/infr v0.0.0-20231015031929-aa95fddceacc/go.mod h1:Ugezx5DO+3euYKHu2Ib/WEgfm1Er6fjZxL7Hr75YN+I=github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo=github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw=github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM=github.com/knq/sysutil v0.0.0-20191005231841-15668db23d08/go.mod h1:dFWs1zEqDjFtnBXsd1vPOZaLsESovai349994nHx3e0=github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs=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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=github.com/vugu/html v0.0.0-20190914200101-c62dc20b8289/go.mod h1:Y3pLGz8dZUSrB9SARXqFmtW8RNs4HIGAr0+JaWL31Vg=github.com/vugu/vjson v0.0.0-20200505061711-f9cbed27d3d9 h1:0cwYt2uGUAwxOYF6zAkVvCKWt8zOV3JhQqjvwKb6jf0=github.com/vugu/vjson v0.0.0-20200505061711-f9cbed27d3d9/go.mod h1:z7mAqSUjRDMQ09NIO18jG2llXMHLnUHlZ3/8MEMyBPA=github.com/vugu/vugu v0.3.5 h1:AdhL+RDWMI3ZLZij9b8HdRHTKqNYkSDbcgFND02zNGU=github.com/vugu/vugu v0.3.5/go.mod h1:E0NT8+F8KDmLDKzYTNySlcvljJdfOpBHzcMJ/0bYLfM=github.com/vugu/xxhash v0.0.0-20191111030615-ed24d0179019 h1:8NGiD5gWbVGObr+lnqcbM2rcOQBO6mr+m19BIblCdho=github.com/vugu/xxhash v0.0.0-20191111030615-ed24d0179019/go.mod h1:PrBK6+LJXwb+3EnJTHo43Uh4FhjFFwvN4jKk4Zc5zZ8=golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=golang.org/x/net v0.0.0-20190912160710-24e19bdeb0f2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/sys v0.0.0-20200724161237-0e2f3a69832c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
module srcgo 1.21require (github.com/fudanchii/infr v0.0.0-20231015031929-aa95fddceaccgithub.com/vugu/vjson v0.0.0-20200505061711-f9cbed27d3d9github.com/vugu/vugu v0.3.5)require github.com/vugu/xxhash v0.0.0-20191111030615-ed24d0179019 // indirect
package main//go:generate vugugen -s -r ./
//go:build ignore// +build ignorepackage mainimport ("io""log""net/http""os""github.com/vugu/vugu/devutil")func main() {l := "127.0.0.1:8844"log.Printf("Starting HTTP Server at %q", l)wc := devutil.NewWasmCompiler().SetDir(".")mux := devutil.NewMux()index_file, err := os.Open("../index.html")if err != nil {log.Fatal(err.Error())}defer index_file.Close()index_content, err := io.ReadAll(index_file)if err != nil {log.Fatal(err.Error())}mux.Match(devutil.NoFileExt, devutil.StaticContent(string(index_content)))mux.Exact("/main.wasm", devutil.NewMainWasmHandler(wc))mux.Exact("/wasm_exec.js", devutil.NewWasmExecJSHandler(wc))mux.Default(devutil.NewFileServer().SetDir("../dist"))log.Fatal(http.ListenAndServe(l, mux))}
<div><div class="flex h-centered v-centered"><divvg-for='i := 0; i < len(c.runeVal); i++':class='"char-box "+c.visibleStateClassFor(i)'vg-content='fmt.Sprintf(" %s ", string(c.runeVal[i]))'></div></div></div><style>.char-box {background: gray;border-bottom-width: 5px;font-size: 2.5em;width: 58px;height: 58px;text-align: center;text-transform: uppercase;}.flex {display: flex;}.h-centered {justify-items: center;}.v-centered {align-items: center;}.revealed{display: inline-block;}.concealed {display: none;}</style>
package componentsimport ("github.com/vugu/vugu")type TextEntry struct {Value string `vugu:"data"`runeVal []runevisible []bool}func (t *TextEntry) Init(ctx vugu.InitCtx) {t.runeVal = []rune(t.Value)for range t.runeVal {t.visible = append(t.visible, true)}}func (t *TextEntry) visibleStateClassFor(i int) string {if t.visible[i] {return "revealed"}return "concealed"}
<div><p vg-if='c.Name != nil && strings.TrimSpace(*c.Name) != ""'>Hello, <span vg-html='strings.TrimSpace(*c.Name)'></span>!</p></div><script type="application/x-go">import "strings"</script>
package componentstype TextDisplay struct {Name *string `vugu:"data"`}
package bindingsimport ("fmt""syscall/js")type String stringfunc (s String) From(v js.Value) String {return String(v.String())}func (s String) TryFrom(v js.Value) (String, error) {if v.Type() != js.TypeString {return s, fmt.Errorf("js.Value is not a string")}return s.From(v), nil}type Bool boolfunc (b Bool) From(v js.Value) Bool {return Bool(v.Bool())}func (b Bool) TryFrom(v js.Value) (Bool, error) {if v.Type() != js.TypeBoolean {return b, fmt.Errorf("js.Value is not a boolean")}return b.From(v), nil}
package bindingsimport ("syscall/js""github.com/fudanchii/infr")type Promise[T infr.TryFromType[js.Value, T]] struct {js.Value}func (p Promise[T]) forward(t string, f func(arg js.Value)) Promise[T] {var cb js.Funccb = js.FuncOf(func(_ js.Value, args []js.Value) any {f(args[0])cb.Release()return nil})p.Call(t, cb)return p}func (p Promise[T]) Catch(f func(arg js.Value)) Promise[T] {return p.forward("catch", f)}func (p Promise[T]) Then(f func(arg js.Value)) Promise[T] {return p.forward("then", f)}func (p Promise[T]) Await() (T, error) {vchan := make(chan js.Value, 1)echan := make(chan js.Value, 1)p.Then(func(arg js.Value) { vchan <- arg }).Catch(func(err js.Value) { echan <- err })var defT Tselect {case err := <-echan:return defT, PromiseError{err}case v := <-vchan:return infr.TryInto[T](v)}}type PromiseError struct {js.Value}func (pe PromiseError) Error() string {if pe.Get("message").Type() == js.TypeString {return pe.Get("message").String()}return pe.String()}
package bindingsimport ("syscall/js")type App struct{}func (a App) Provide() (string, error) {val, err := Promise[String]{a.js().Call("Provide")}.Await()return string(val), err}func (a App) Ready() (bool, error) {val, err := Promise[Bool]{a.js().Call("Ready")}.Await()return bool(val), err}func (a App) js() js.Value {return js.Global().Get("go").Get("main").Get("App")}
# simpleSimple Vugu ExampleYou can get started with:```shgo get -u github.com/vugu/vgrunvgrun -new-from-example=simple myexamplecd myexamplevgrun devserver.go```Then browse to the running server: http://localhost:8844/
MIT LicenseCopyright (c) 2020 vugu-examplesPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
bin**_vgen.go.vscode
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta content="width=device-width, initial-scale=1.0" name="viewport"/><title>Wails App</title><link rel="stylesheet" href="main.css" /><script src="wasm_exec.js"></script><script>const go = new Go();function runWASM(runner, module) {return runner(module, go.importObject).then((result) => go.run(result.instance));}function fallbackWASMInstantiate() {fetch('main.wasm').then((response) => response.arrayBuffer()).then((buff) => runWASM(WebAssembly.instantiate, buff));}fetch('main.wasm').then((response) => {runWASM(WebAssembly.instantiateStreaming, response).catch((err) => {if (response.headers.get('Content-Type') != 'application/wasm') {console.warn('cannot stream wasm, binary served without `application/wasm` Content-Type header');fallbackWASMInstantiate();} else throw(err);});});</script></head><body><div id="vugu_mount_point"></div></body></html>
Apache LicenseVersion 2.0, January 2004http://www.apache.org/licenses/TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION1. Definitions."License" shall mean the terms and conditions for use, reproduction,and distribution as defined by Sections 1 through 9 of this document."Licensor" shall mean the copyright owner or entity authorized bythe copyright owner that is granting the License."Legal Entity" shall mean the union of the acting entity and allother entities that control, are controlled by, or are under commoncontrol with that entity. For the purposes of this definition,"control" means (i) the power, direct or indirect, to cause thedirection or management of such entity, whether by contract orotherwise, or (ii) ownership of fifty percent (50%) or more of theoutstanding shares, or (iii) beneficial ownership of such entity."You" (or "Your") shall mean an individual or Legal Entityexercising permissions granted by this License."Source" form shall mean the preferred form for making modifications,including but not limited to software source code, documentationsource, and configuration files."Object" form shall mean any form resulting from mechanicaltransformation or translation of a Source form, including butnot limited to compiled object code, generated documentation,and conversions to other media types."Work" shall mean the work of authorship, whether in Source orObject form, made available under the License, as indicated by acopyright notice that is included in or attached to the work(an example is provided in the Appendix below)."Derivative Works" shall mean any work, whether in Source or Objectform, that is based on (or derived from) the Work and for which theeditorial revisions, annotations, elaborations, or other modificationsrepresent, as a whole, an original work of authorship. For the purposesof this License, Derivative Works shall not include works that remainseparable from, or merely link (or bind by name) to the interfaces of,the Work and Derivative Works thereof."Contribution" shall mean any work of authorship, includingthe original version of the Work and any modifications or additionsto that Work or Derivative Works thereof, that is intentionallysubmitted to Licensor for inclusion in the Work by the copyright owneror by an individual or Legal Entity authorized to submit on behalf ofthe copyright owner. For the purposes of this definition, "submitted"means any form of electronic, verbal, or written communication sentto the Licensor or its representatives, including but not limited tocommunication on electronic mailing lists, source code control systems,and issue tracking systems that are managed by, or on behalf of, theLicensor for the purpose of discussing and improving the Work, butexcluding communication that is conspicuously marked or otherwisedesignated in writing by the copyright owner as "Not a Contribution.""Contributor" shall mean Licensor and any individual or Legal Entityon behalf of whom a Contribution has been received by Licensor andsubsequently incorporated within the Work.2. Grant of Copyright License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocablecopyright license to reproduce, prepare Derivative Works of,publicly display, publicly perform, sublicense, and distribute theWork and such Derivative Works in Source or Object form.3. Grant of Patent License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocable(except as stated in this section) patent license to make, have made,use, offer to sell, sell, import, and otherwise transfer the Work,where such license applies only to those patent claims licensableby such Contributor that are necessarily infringed by theirContribution(s) alone or by combination of their Contribution(s)with the Work to which such Contribution(s) was submitted. If Youinstitute patent litigation against any entity (including across-claim or counterclaim in a lawsuit) alleging that the Workor a Contribution incorporated within the Work constitutes director contributory patent infringement, then any patent licensesgranted to You under this License for that Work shall terminateas of the date such litigation is filed.4. Redistribution. You may reproduce and distribute copies of theWork or Derivative Works thereof in any medium, with or withoutmodifications, and in Source or Object form, provided that Youmeet the following conditions:(a) You must give any other recipients of the Work orDerivative Works a copy of this License; and(b) You must cause any modified files to carry prominent noticesstating that You changed the files; and(c) You must retain, in the Source form of any Derivative Worksthat You distribute, all copyright, patent, trademark, andattribution notices from the Source form of the Work,excluding those notices that do not pertain to any part ofthe Derivative Works; and(d) If the Work includes a "NOTICE" text file as part of itsdistribution, then any Derivative Works that You distribute mustinclude a readable copy of the attribution notices containedwithin such NOTICE file, excluding those notices that do notpertain to any part of the Derivative Works, in at least oneof the following places: within a NOTICE text file distributedas part of the Derivative Works; within the Source form ordocumentation, if provided along with the Derivative Works; or,within a display generated by the Derivative Works, if andwherever such third-party notices normally appear. The contentsof the NOTICE file are for informational purposes only anddo not modify the License. You may add Your own attributionnotices within Derivative Works that You distribute, alongsideor as an addendum to the NOTICE text from the Work, providedthat such additional attribution notices cannot be construedas modifying the License.You may add Your own copyright statement to Your modifications andmay provide additional or different license terms and conditionsfor use, reproduction, or distribution of Your modifications, orfor any such Derivative Works as a whole, provided Your use,reproduction, and distribution of the Work otherwise complies withthe conditions stated in this License.5. Submission of Contributions. Unless You explicitly state otherwise,any Contribution intentionally submitted for inclusion in the Workby You to the Licensor shall be under the terms and conditions ofthis License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modifythe terms of any separate license agreement you may have executedwith Licensor regarding such Contributions.6. Trademarks. This License does not grant permission to use the tradenames, trademarks, service marks, or product names of the Licensor,except as required for reasonable and customary use in describing theorigin of the Work and reproducing the content of the NOTICE file.7. Disclaimer of Warranty. Unless required by applicable law oragreed to in writing, Licensor provides the Work (and eachContributor provides its Contributions) on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied, including, without limitation, any warranties or conditionsof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR APARTICULAR PURPOSE. You are solely responsible for determining theappropriateness of using or redistributing the Work and assume anyrisks associated with Your exercise of permissions under this License.8. Limitation of Liability. In no event and under no legal theory,whether in tort (including negligence), contract, or otherwise,unless required by applicable law (such as deliberate and grosslynegligent acts) or agreed to in writing, shall any Contributor beliable to You for damages, including any direct, indirect, special,incidental, or consequential damages of any character arising as aresult of this License or out of the use or inability to use theWork (including but not limited to damages for loss of goodwill,work stoppage, computer failure or malfunction, or any and allother commercial damages or losses), even if such Contributorhas been advised of the possibility of such damages.9. Accepting Warranty or Additional Liability. While redistributingthe Work or Derivative Works thereof, You may choose to offer,and charge a fee for, acceptance of support, warranty, indemnity,or other liability obligations and/or rights consistent with thisLicense. However, in accepting such obligations, You may act onlyon Your own behalf and on Your sole responsibility, not on behalfof any other Contributor, and only if You agree to indemnify,defend, and hold each Contributor harmless for any liabilityincurred by, or claims asserted against, such Contributor by reasonof your accepting any such warranty or additional liability.END OF TERMS AND CONDITIONSAPPENDIX: How to apply the Apache License to your work.To apply the Apache License to your work, attach the followingboilerplate notice, with the fields enclosed by brackets "[]"replaced with your own identifying information. (Don't includethe brackets!) The text should be enclosed in the appropriatecomment syntax for the file format. We also recommend that afile or class name and description of purpose be included on thesame "printed page" as the copyright notice for easieridentification within third-party archives.Copyright [yyyy] [name of copyright owner]Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
// Copyright 2018 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file."use strict";(() => {const enosys = () => {const err = new Error("not implemented");err.code = "ENOSYS";return err;};if (!globalThis.fs) {let outputBuf = "";globalThis.fs = {constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unusedwriteSync(fd, buf) {outputBuf += decoder.decode(buf);const nl = outputBuf.lastIndexOf("\n");if (nl != -1) {console.log(outputBuf.substring(0, nl));outputBuf = outputBuf.substring(nl + 1);}return buf.length;},write(fd, buf, offset, length, position, callback) {if (offset !== 0 || length !== buf.length || position !== null) {callback(enosys());return;}const n = this.writeSync(fd, buf);callback(null, n);},chmod(path, mode, callback) { callback(enosys()); },chown(path, uid, gid, callback) { callback(enosys()); },close(fd, callback) { callback(enosys()); },fchmod(fd, mode, callback) { callback(enosys()); },fchown(fd, uid, gid, callback) { callback(enosys()); },fstat(fd, callback) { callback(enosys()); },fsync(fd, callback) { callback(null); },ftruncate(fd, length, callback) { callback(enosys()); },lchown(path, uid, gid, callback) { callback(enosys()); },link(path, link, callback) { callback(enosys()); },lstat(path, callback) { callback(enosys()); },mkdir(path, perm, callback) { callback(enosys()); },open(path, flags, mode, callback) { callback(enosys()); },read(fd, buffer, offset, length, position, callback) { callback(enosys()); },readdir(path, callback) { callback(enosys()); },readlink(path, callback) { callback(enosys()); },rename(from, to, callback) { callback(enosys()); },rmdir(path, callback) { callback(enosys()); },stat(path, callback) { callback(enosys()); },symlink(path, link, callback) { callback(enosys()); },truncate(path, length, callback) { callback(enosys()); },unlink(path, callback) { callback(enosys()); },utimes(path, atime, mtime, callback) { callback(enosys()); },};}if (!globalThis.process) {globalThis.process = {getuid() { return -1; },getgid() { return -1; },geteuid() { return -1; },getegid() { return -1; },getgroups() { throw enosys(); },pid: -1,ppid: -1,umask() { throw enosys(); },cwd() { throw enosys(); },chdir() { throw enosys(); },}}if (!globalThis.crypto) {throw new Error("globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)");}if (!globalThis.performance) {throw new Error("globalThis.performance is not available, polyfill required (performance.now only)");}if (!globalThis.TextEncoder) {throw new Error("globalThis.TextEncoder is not available, polyfill required");}if (!globalThis.TextDecoder) {throw new Error("globalThis.TextDecoder is not available, polyfill required");}const encoder = new TextEncoder("utf-8");const decoder = new TextDecoder("utf-8");globalThis.Go = class {constructor() {this.argv = ["js"];this.env = {};this.exit = (code) => {if (code !== 0) {console.warn("exit code:", code);}};this._exitPromise = new Promise((resolve) => {this._resolveExitPromise = resolve;});this._pendingEvent = null;this._scheduledTimeouts = new Map();this._nextCallbackTimeoutID = 1;const setInt64 = (addr, v) => {this.mem.setUint32(addr + 0, v, true);this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);}const setInt32 = (addr, v) => {this.mem.setUint32(addr + 0, v, true);}const getInt64 = (addr) => {const low = this.mem.getUint32(addr + 0, true);const high = this.mem.getInt32(addr + 4, true);return low + high * 4294967296;}const loadValue = (addr) => {const f = this.mem.getFloat64(addr, true);if (f === 0) {return undefined;}if (!isNaN(f)) {return f;}const id = this.mem.getUint32(addr, true);return this._values[id];}const storeValue = (addr, v) => {const nanHead = 0x7FF80000;if (typeof v === "number" && v !== 0) {if (isNaN(v)) {this.mem.setUint32(addr + 4, nanHead, true);this.mem.setUint32(addr, 0, true);return;}this.mem.setFloat64(addr, v, true);return;}if (v === undefined) {this.mem.setFloat64(addr, 0, true);return;}let id = this._ids.get(v);if (id === undefined) {id = this._idPool.pop();if (id === undefined) {id = this._values.length;}this._values[id] = v;this._goRefCounts[id] = 0;this._ids.set(v, id);}this._goRefCounts[id]++;let typeFlag = 0;switch (typeof v) {case "object":if (v !== null) {typeFlag = 1;}break;case "string":typeFlag = 2;break;case "symbol":typeFlag = 3;break;case "function":typeFlag = 4;break;}this.mem.setUint32(addr + 4, nanHead | typeFlag, true);this.mem.setUint32(addr, id, true);}const loadSlice = (addr) => {const array = getInt64(addr + 0);const len = getInt64(addr + 8);return new Uint8Array(this._inst.exports.mem.buffer, array, len);}const loadSliceOfValues = (addr) => {const array = getInt64(addr + 0);const len = getInt64(addr + 8);const a = new Array(len);for (let i = 0; i < len; i++) {a[i] = loadValue(array + i * 8);}return a;}const loadString = (addr) => {const saddr = getInt64(addr + 0);const len = getInt64(addr + 8);return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len));}const timeOrigin = Date.now() - performance.now();this.importObject = {_gotest: {add: (a, b) => a + b,},gojs: {// Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)// may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported// function. A goroutine can switch to a new stack if the current stack is too small (see morestack function).// This changes the SP, thus we have to update the SP used by the imported function.// func wasmExit(code int32)"runtime.wasmExit": (sp) => {sp >>>= 0;const code = this.mem.getInt32(sp + 8, true);this.exited = true;delete this._inst;delete this._values;delete this._goRefCounts;delete this._ids;delete this._idPool;this.exit(code);},// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)"runtime.wasmWrite": (sp) => {sp >>>= 0;const fd = getInt64(sp + 8);const p = getInt64(sp + 16);const n = this.mem.getInt32(sp + 24, true);fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n));},// func resetMemoryDataView()"runtime.resetMemoryDataView": (sp) => {sp >>>= 0;this.mem = new DataView(this._inst.exports.mem.buffer);},// func nanotime1() int64"runtime.nanotime1": (sp) => {sp >>>= 0;setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000);},// func walltime() (sec int64, nsec int32)"runtime.walltime": (sp) => {sp >>>= 0;const msec = (new Date).getTime();setInt64(sp + 8, msec / 1000);this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true);},// func scheduleTimeoutEvent(delay int64) int32"runtime.scheduleTimeoutEvent": (sp) => {sp >>>= 0;const id = this._nextCallbackTimeoutID;this._nextCallbackTimeoutID++;this._scheduledTimeouts.set(id, setTimeout(() => {this._resume();while (this._scheduledTimeouts.has(id)) {// for some reason Go failed to register the timeout event, log and try again// (temporary workaround for https://github.com/golang/go/issues/28975)console.warn("scheduleTimeoutEvent: missed timeout event");this._resume();}},getInt64(sp + 8),));this.mem.setInt32(sp + 16, id, true);},// func clearTimeoutEvent(id int32)"runtime.clearTimeoutEvent": (sp) => {sp >>>= 0;const id = this.mem.getInt32(sp + 8, true);clearTimeout(this._scheduledTimeouts.get(id));this._scheduledTimeouts.delete(id);},// func getRandomData(r []byte)"runtime.getRandomData": (sp) => {sp >>>= 0;crypto.getRandomValues(loadSlice(sp + 8));},// func finalizeRef(v ref)"syscall/js.finalizeRef": (sp) => {sp >>>= 0;const id = this.mem.getUint32(sp + 8, true);this._goRefCounts[id]--;if (this._goRefCounts[id] === 0) {const v = this._values[id];this._values[id] = null;this._ids.delete(v);this._idPool.push(id);}},// func stringVal(value string) ref"syscall/js.stringVal": (sp) => {sp >>>= 0;storeValue(sp + 24, loadString(sp + 8));},// func valueGet(v ref, p string) ref"syscall/js.valueGet": (sp) => {sp >>>= 0;const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16));sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 32, result);},// func valueSet(v ref, p string, x ref)"syscall/js.valueSet": (sp) => {sp >>>= 0;Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));},// func valueDelete(v ref, p string)"syscall/js.valueDelete": (sp) => {sp >>>= 0;Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16));},// func valueIndex(v ref, i int) ref"syscall/js.valueIndex": (sp) => {sp >>>= 0;storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));},// valueSetIndex(v ref, i int, x ref)"syscall/js.valueSetIndex": (sp) => {sp >>>= 0;Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24));},// func valueCall(v ref, m string, args []ref) (ref, bool)"syscall/js.valueCall": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const m = Reflect.get(v, loadString(sp + 16));const args = loadSliceOfValues(sp + 32);const result = Reflect.apply(m, v, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 56, result);this.mem.setUint8(sp + 64, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 56, err);this.mem.setUint8(sp + 64, 0);}},// func valueInvoke(v ref, args []ref) (ref, bool)"syscall/js.valueInvoke": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const args = loadSliceOfValues(sp + 16);const result = Reflect.apply(v, undefined, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, result);this.mem.setUint8(sp + 48, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, err);this.mem.setUint8(sp + 48, 0);}},// func valueNew(v ref, args []ref) (ref, bool)"syscall/js.valueNew": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const args = loadSliceOfValues(sp + 16);const result = Reflect.construct(v, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, result);this.mem.setUint8(sp + 48, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, err);this.mem.setUint8(sp + 48, 0);}},// func valueLength(v ref) int"syscall/js.valueLength": (sp) => {sp >>>= 0;setInt64(sp + 16, parseInt(loadValue(sp + 8).length));},// valuePrepareString(v ref) (ref, int)"syscall/js.valuePrepareString": (sp) => {sp >>>= 0;const str = encoder.encode(String(loadValue(sp + 8)));storeValue(sp + 16, str);setInt64(sp + 24, str.length);},// valueLoadString(v ref, b []byte)"syscall/js.valueLoadString": (sp) => {sp >>>= 0;const str = loadValue(sp + 8);loadSlice(sp + 16).set(str);},// func valueInstanceOf(v ref, t ref) bool"syscall/js.valueInstanceOf": (sp) => {sp >>>= 0;this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0);},// func copyBytesToGo(dst []byte, src ref) (int, bool)"syscall/js.copyBytesToGo": (sp) => {sp >>>= 0;const dst = loadSlice(sp + 8);const src = loadValue(sp + 32);if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {this.mem.setUint8(sp + 48, 0);return;}const toCopy = src.subarray(0, dst.length);dst.set(toCopy);setInt64(sp + 40, toCopy.length);this.mem.setUint8(sp + 48, 1);},// func copyBytesToJS(dst ref, src []byte) (int, bool)"syscall/js.copyBytesToJS": (sp) => {sp >>>= 0;const dst = loadValue(sp + 8);const src = loadSlice(sp + 16);if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {this.mem.setUint8(sp + 48, 0);return;}const toCopy = src.subarray(0, dst.length);dst.set(toCopy);setInt64(sp + 40, toCopy.length);this.mem.setUint8(sp + 48, 1);},"debug": (value) => {console.log(value);},}};}async run(instance) {if (!(instance instanceof WebAssembly.Instance)) {throw new Error("Go.run: WebAssembly.Instance expected");}this._inst = instance;this.mem = new DataView(this._inst.exports.mem.buffer);this._values = [ // JS values that Go currently has references to, indexed by reference idNaN,0,null,true,false,globalThis,this,];this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference idthis._ids = new Map([ // mapping from JS values to reference ids[0, 1],[null, 2],[true, 3],[false, 4],[globalThis, 5],[this, 6],]);this._idPool = []; // unused ids that have been garbage collectedthis.exited = false; // whether the Go program has exited// Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.let offset = 4096;const strPtr = (str) => {const ptr = offset;const bytes = encoder.encode(str + "\0");new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes);offset += bytes.length;if (offset % 8 !== 0) {offset += 8 - (offset % 8);}return ptr;};const argc = this.argv.length;const argvPtrs = [];this.argv.forEach((arg) => {argvPtrs.push(strPtr(arg));});argvPtrs.push(0);const keys = Object.keys(this.env).sort();keys.forEach((key) => {argvPtrs.push(strPtr(`${key}=${this.env[key]}`));});argvPtrs.push(0);const argv = offset;argvPtrs.forEach((ptr) => {this.mem.setUint32(offset, ptr, true);this.mem.setUint32(offset + 4, 0, true);offset += 8;});// The linker guarantees global data starts from at least wasmMinDataAddr.// Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr.const wasmMinDataAddr = 4096 + 8192;if (offset >= wasmMinDataAddr) {throw new Error("total length of command line and environment variables exceeds limit");}this._inst.exports.run(argc, argv);if (this.exited) {this._resolveExitPromise();}await this._exitPromise;}_resume() {if (this.exited) {throw new Error("Go program has already exited");}this._inst.exports.resume();if (this.exited) {this._resolveExitPromise();}}_makeFuncWrapper(id) {const go = this;return function () {const event = { id: id, this: this, args: arguments };go._pendingEvent = event;go._resume();return event.result;};}}})();
{"version":3,"sourceRoot":"","sources":["../stylesheets/_fonts.scss","../stylesheets/index.scss"],"names":[],"mappings":"AAAA;EACI;EACA;;ACAJ;EACI;EACA;EAEA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAEJ;EACI","file":"main.css"}
@font-face {font-family: "Homemade Apple";src: url("fonts/HomemadeApple-Regular.ttf");}body {width: 100vw;height: 100vh;background: white;overflow: hidden;margin: 0;padding: 0;}#root {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}.main .text-entry {font-family: "Homemade Apple";font-size: 2.5em;border-bottom-width: 5px;border-top-width: 0;border-left-width: 0;border-right-width: 0;}.main .text-entry:focus {outline: none;}.main .text-entry::before {content: " ";}/*# sourceMappingURL=main.css.map */
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta content="width=device-width, initial-scale=1.0" name="viewport"/><title>Wails App</title><link rel="stylesheet" href="main.css" /><script src="wasm_exec.js"></script><script>const go = new Go();function runWASM(runner, module) {return runner(module, go.importObject).then((result) => go.run(result.instance));}function fallbackWASMInstantiate() {fetch('main.wasm').then((response) => response.arrayBuffer()).then((buff) => runWASM(WebAssembly.instantiate, buff));}fetch('main.wasm').then((response) => {runWASM(WebAssembly.instantiateStreaming, response).catch((err) => {if (response.headers.get('Content-Type') != 'application/wasm') {console.warn('cannot stream wasm, binary served without `application/wasm` Content-Type header');fallbackWASMInstantiate();} else throw(err);});});</script></head><body><div id="vugu_mount_point"></div></body></html>
Apache LicenseVersion 2.0, January 2004http://www.apache.org/licenses/TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION1. Definitions."License" shall mean the terms and conditions for use, reproduction,and distribution as defined by Sections 1 through 9 of this document."Licensor" shall mean the copyright owner or entity authorized bythe copyright owner that is granting the License."Legal Entity" shall mean the union of the acting entity and allother entities that control, are controlled by, or are under commoncontrol with that entity. For the purposes of this definition,"control" means (i) the power, direct or indirect, to cause thedirection or management of such entity, whether by contract orotherwise, or (ii) ownership of fifty percent (50%) or more of theoutstanding shares, or (iii) beneficial ownership of such entity."You" (or "Your") shall mean an individual or Legal Entityexercising permissions granted by this License."Source" form shall mean the preferred form for making modifications,including but not limited to software source code, documentationsource, and configuration files."Object" form shall mean any form resulting from mechanicaltransformation or translation of a Source form, including butnot limited to compiled object code, generated documentation,and conversions to other media types."Work" shall mean the work of authorship, whether in Source orObject form, made available under the License, as indicated by acopyright notice that is included in or attached to the work(an example is provided in the Appendix below)."Derivative Works" shall mean any work, whether in Source or Objectform, that is based on (or derived from) the Work and for which theeditorial revisions, annotations, elaborations, or other modificationsrepresent, as a whole, an original work of authorship. For the purposesof this License, Derivative Works shall not include works that remainseparable from, or merely link (or bind by name) to the interfaces of,the Work and Derivative Works thereof."Contribution" shall mean any work of authorship, includingthe original version of the Work and any modifications or additionsto that Work or Derivative Works thereof, that is intentionallysubmitted to Licensor for inclusion in the Work by the copyright owneror by an individual or Legal Entity authorized to submit on behalf ofthe copyright owner. For the purposes of this definition, "submitted"means any form of electronic, verbal, or written communication sentto the Licensor or its representatives, including but not limited tocommunication on electronic mailing lists, source code control systems,and issue tracking systems that are managed by, or on behalf of, theLicensor for the purpose of discussing and improving the Work, butexcluding communication that is conspicuously marked or otherwisedesignated in writing by the copyright owner as "Not a Contribution.""Contributor" shall mean Licensor and any individual or Legal Entityon behalf of whom a Contribution has been received by Licensor andsubsequently incorporated within the Work.2. Grant of Copyright License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocablecopyright license to reproduce, prepare Derivative Works of,publicly display, publicly perform, sublicense, and distribute theWork and such Derivative Works in Source or Object form.3. Grant of Patent License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocable(except as stated in this section) patent license to make, have made,use, offer to sell, sell, import, and otherwise transfer the Work,where such license applies only to those patent claims licensableby such Contributor that are necessarily infringed by theirContribution(s) alone or by combination of their Contribution(s)with the Work to which such Contribution(s) was submitted. If Youinstitute patent litigation against any entity (including across-claim or counterclaim in a lawsuit) alleging that the Workor a Contribution incorporated within the Work constitutes director contributory patent infringement, then any patent licensesgranted to You under this License for that Work shall terminateas of the date such litigation is filed.4. Redistribution. You may reproduce and distribute copies of theWork or Derivative Works thereof in any medium, with or withoutmodifications, and in Source or Object form, provided that Youmeet the following conditions:(a) You must give any other recipients of the Work orDerivative Works a copy of this License; and(b) You must cause any modified files to carry prominent noticesstating that You changed the files; and(c) You must retain, in the Source form of any Derivative Worksthat You distribute, all copyright, patent, trademark, andattribution notices from the Source form of the Work,excluding those notices that do not pertain to any part ofthe Derivative Works; and(d) If the Work includes a "NOTICE" text file as part of itsdistribution, then any Derivative Works that You distribute mustinclude a readable copy of the attribution notices containedwithin such NOTICE file, excluding those notices that do notpertain to any part of the Derivative Works, in at least oneof the following places: within a NOTICE text file distributedas part of the Derivative Works; within the Source form ordocumentation, if provided along with the Derivative Works; or,within a display generated by the Derivative Works, if andwherever such third-party notices normally appear. The contentsof the NOTICE file are for informational purposes only anddo not modify the License. You may add Your own attributionnotices within Derivative Works that You distribute, alongsideor as an addendum to the NOTICE text from the Work, providedthat such additional attribution notices cannot be construedas modifying the License.You may add Your own copyright statement to Your modifications andmay provide additional or different license terms and conditionsfor use, reproduction, or distribution of Your modifications, orfor any such Derivative Works as a whole, provided Your use,reproduction, and distribution of the Work otherwise complies withthe conditions stated in this License.5. Submission of Contributions. Unless You explicitly state otherwise,any Contribution intentionally submitted for inclusion in the Workby You to the Licensor shall be under the terms and conditions ofthis License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modifythe terms of any separate license agreement you may have executedwith Licensor regarding such Contributions.6. Trademarks. This License does not grant permission to use the tradenames, trademarks, service marks, or product names of the Licensor,except as required for reasonable and customary use in describing theorigin of the Work and reproducing the content of the NOTICE file.7. Disclaimer of Warranty. Unless required by applicable law oragreed to in writing, Licensor provides the Work (and eachContributor provides its Contributions) on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied, including, without limitation, any warranties or conditionsof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR APARTICULAR PURPOSE. You are solely responsible for determining theappropriateness of using or redistributing the Work and assume anyrisks associated with Your exercise of permissions under this License.8. Limitation of Liability. In no event and under no legal theory,whether in tort (including negligence), contract, or otherwise,unless required by applicable law (such as deliberate and grosslynegligent acts) or agreed to in writing, shall any Contributor beliable to You for damages, including any direct, indirect, special,incidental, or consequential damages of any character arising as aresult of this License or out of the use or inability to use theWork (including but not limited to damages for loss of goodwill,work stoppage, computer failure or malfunction, or any and allother commercial damages or losses), even if such Contributorhas been advised of the possibility of such damages.9. Accepting Warranty or Additional Liability. While redistributingthe Work or Derivative Works thereof, You may choose to offer,and charge a fee for, acceptance of support, warranty, indemnity,or other liability obligations and/or rights consistent with thisLicense. However, in accepting such obligations, You may act onlyon Your own behalf and on Your sole responsibility, not on behalfof any other Contributor, and only if You agree to indemnify,defend, and hold each Contributor harmless for any liabilityincurred by, or claims asserted against, such Contributor by reasonof your accepting any such warranty or additional liability.END OF TERMS AND CONDITIONSAPPENDIX: How to apply the Apache License to your work.To apply the Apache License to your work, attach the followingboilerplate notice, with the fields enclosed by brackets "[]"replaced with your own identifying information. (Don't includethe brackets!) The text should be enclosed in the appropriatecomment syntax for the file format. We also recommend that afile or class name and description of purpose be included on thesame "printed page" as the copyright notice for easieridentification within third-party archives.Copyright [yyyy] [name of copyright owner]Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
# simpleSimple Vugu ExampleYou can get started with:```shgo get -u github.com/vugu/vgrunvgrun -new-from-example=simple myexamplecd myexamplevgrun devserver.go```Then browse to the running server: http://localhost:8844/
default: buildsrc/main.wasm:@cd src && \go mod tidy && \go generate && \go mod tidy && \GOOS=js GOARCH=wasm go build -o main.wasm && \cd -dist/index.html: prebuild index.html@cp -fv index.html ./distdist/wasm_exec.js: prebuild@cp -fv "$$(go env GOROOT)/misc/wasm/wasm_exec.js" ./distdist/main.wasm: prebuild src/main.wasm@cp -fv src/main.wasm ./distdist/main.css: prebuild stylesheets/index.scss@sass stylesheets/index.scss dist/main.cssdist/fonts: prebuild@cp -a fonts ./distbuild: dist/index.html dist/main.wasm dist/main.css dist/wasm_exec.js dist/fonts@cp -a ./dist ../distprebuild:@mkdir -p ./distclean:@rm -rf ./dist@rm -rf ../dist@rm -rf ./bin@rm -rf ./wailsjs@cd src && rm -rf bin main.wasm 0_components_vgen.go main_wasm.go components/0_components_vgen.go && cd -@cd src && go clean && cd -dev: build@cd src && vgrun devserver.go && cd -.PHONY: build dev prebuild clean
MIT LicenseCopyright (c) 2020 vugu-examplesPermission is hereby granted, free of charge, to any person obtaining a copyof this software and associated documentation files (the "Software"), to dealin the Software without restriction, including without limitation the rightsto use, copy, modify, merge, publish, distribute, sublicense, and/or sellcopies of the Software, and to permit persons to whom the Software isfurnished to do so, subject to the following conditions:The above copyright notice and this permission notice shall be included in allcopies or substantial portions of the Software.THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ORIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THEAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHERLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THESOFTWARE.
let $GOOS='js'let $GOARCH='wasm'
// Copyright 2018 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// license that can be found in the LICENSE file."use strict";(() => {const enosys = () => {const err = new Error("not implemented");err.code = "ENOSYS";return err;};if (!globalThis.fs) {let outputBuf = "";globalThis.fs = {constants: { O_WRONLY: -1, O_RDWR: -1, O_CREAT: -1, O_TRUNC: -1, O_APPEND: -1, O_EXCL: -1 }, // unusedwriteSync(fd, buf) {outputBuf += decoder.decode(buf);const nl = outputBuf.lastIndexOf("\n");if (nl != -1) {console.log(outputBuf.substring(0, nl));outputBuf = outputBuf.substring(nl + 1);}return buf.length;},write(fd, buf, offset, length, position, callback) {if (offset !== 0 || length !== buf.length || position !== null) {callback(enosys());return;}const n = this.writeSync(fd, buf);callback(null, n);},chmod(path, mode, callback) { callback(enosys()); },chown(path, uid, gid, callback) { callback(enosys()); },close(fd, callback) { callback(enosys()); },fchmod(fd, mode, callback) { callback(enosys()); },fchown(fd, uid, gid, callback) { callback(enosys()); },fstat(fd, callback) { callback(enosys()); },fsync(fd, callback) { callback(null); },ftruncate(fd, length, callback) { callback(enosys()); },lchown(path, uid, gid, callback) { callback(enosys()); },link(path, link, callback) { callback(enosys()); },lstat(path, callback) { callback(enosys()); },mkdir(path, perm, callback) { callback(enosys()); },open(path, flags, mode, callback) { callback(enosys()); },read(fd, buffer, offset, length, position, callback) { callback(enosys()); },readdir(path, callback) { callback(enosys()); },readlink(path, callback) { callback(enosys()); },rename(from, to, callback) { callback(enosys()); },rmdir(path, callback) { callback(enosys()); },stat(path, callback) { callback(enosys()); },symlink(path, link, callback) { callback(enosys()); },truncate(path, length, callback) { callback(enosys()); },unlink(path, callback) { callback(enosys()); },utimes(path, atime, mtime, callback) { callback(enosys()); },};}if (!globalThis.process) {globalThis.process = {getuid() { return -1; },getgid() { return -1; },geteuid() { return -1; },getegid() { return -1; },getgroups() { throw enosys(); },pid: -1,ppid: -1,umask() { throw enosys(); },cwd() { throw enosys(); },chdir() { throw enosys(); },}}if (!globalThis.crypto) {throw new Error("globalThis.crypto is not available, polyfill required (crypto.getRandomValues only)");}if (!globalThis.performance) {throw new Error("globalThis.performance is not available, polyfill required (performance.now only)");}if (!globalThis.TextEncoder) {throw new Error("globalThis.TextEncoder is not available, polyfill required");}if (!globalThis.TextDecoder) {throw new Error("globalThis.TextDecoder is not available, polyfill required");}const encoder = new TextEncoder("utf-8");const decoder = new TextDecoder("utf-8");globalThis.Go = class {constructor() {this.argv = ["js"];this.env = {};this.exit = (code) => {if (code !== 0) {console.warn("exit code:", code);}};this._exitPromise = new Promise((resolve) => {this._resolveExitPromise = resolve;});this._pendingEvent = null;this._scheduledTimeouts = new Map();this._nextCallbackTimeoutID = 1;const setInt64 = (addr, v) => {this.mem.setUint32(addr + 0, v, true);this.mem.setUint32(addr + 4, Math.floor(v / 4294967296), true);}const setInt32 = (addr, v) => {this.mem.setUint32(addr + 0, v, true);}const getInt64 = (addr) => {const low = this.mem.getUint32(addr + 0, true);const high = this.mem.getInt32(addr + 4, true);return low + high * 4294967296;}const loadValue = (addr) => {const f = this.mem.getFloat64(addr, true);if (f === 0) {return undefined;}if (!isNaN(f)) {return f;}const id = this.mem.getUint32(addr, true);return this._values[id];}const storeValue = (addr, v) => {const nanHead = 0x7FF80000;if (typeof v === "number" && v !== 0) {if (isNaN(v)) {this.mem.setUint32(addr + 4, nanHead, true);this.mem.setUint32(addr, 0, true);return;}this.mem.setFloat64(addr, v, true);return;}if (v === undefined) {this.mem.setFloat64(addr, 0, true);return;}let id = this._ids.get(v);if (id === undefined) {id = this._idPool.pop();if (id === undefined) {id = this._values.length;}this._values[id] = v;this._goRefCounts[id] = 0;this._ids.set(v, id);}this._goRefCounts[id]++;let typeFlag = 0;switch (typeof v) {case "object":if (v !== null) {typeFlag = 1;}break;case "string":typeFlag = 2;break;case "symbol":typeFlag = 3;break;case "function":typeFlag = 4;break;}this.mem.setUint32(addr + 4, nanHead | typeFlag, true);this.mem.setUint32(addr, id, true);}const loadSlice = (addr) => {const array = getInt64(addr + 0);const len = getInt64(addr + 8);return new Uint8Array(this._inst.exports.mem.buffer, array, len);}const loadSliceOfValues = (addr) => {const array = getInt64(addr + 0);const len = getInt64(addr + 8);const a = new Array(len);for (let i = 0; i < len; i++) {a[i] = loadValue(array + i * 8);}return a;}const loadString = (addr) => {const saddr = getInt64(addr + 0);const len = getInt64(addr + 8);return decoder.decode(new DataView(this._inst.exports.mem.buffer, saddr, len));}const timeOrigin = Date.now() - performance.now();this.importObject = {_gotest: {add: (a, b) => a + b,},gojs: {// Go's SP does not change as long as no Go code is running. Some operations (e.g. calls, getters and setters)// may synchronously trigger a Go event handler. This makes Go code get executed in the middle of the imported// function. A goroutine can switch to a new stack if the current stack is too small (see morestack function).// This changes the SP, thus we have to update the SP used by the imported function.// func wasmExit(code int32)"runtime.wasmExit": (sp) => {sp >>>= 0;const code = this.mem.getInt32(sp + 8, true);this.exited = true;delete this._inst;delete this._values;delete this._goRefCounts;delete this._ids;delete this._idPool;this.exit(code);},// func wasmWrite(fd uintptr, p unsafe.Pointer, n int32)"runtime.wasmWrite": (sp) => {sp >>>= 0;const fd = getInt64(sp + 8);const p = getInt64(sp + 16);const n = this.mem.getInt32(sp + 24, true);fs.writeSync(fd, new Uint8Array(this._inst.exports.mem.buffer, p, n));},// func resetMemoryDataView()"runtime.resetMemoryDataView": (sp) => {sp >>>= 0;this.mem = new DataView(this._inst.exports.mem.buffer);},// func nanotime1() int64"runtime.nanotime1": (sp) => {sp >>>= 0;setInt64(sp + 8, (timeOrigin + performance.now()) * 1000000);},// func walltime() (sec int64, nsec int32)"runtime.walltime": (sp) => {sp >>>= 0;const msec = (new Date).getTime();setInt64(sp + 8, msec / 1000);this.mem.setInt32(sp + 16, (msec % 1000) * 1000000, true);},// func scheduleTimeoutEvent(delay int64) int32"runtime.scheduleTimeoutEvent": (sp) => {sp >>>= 0;const id = this._nextCallbackTimeoutID;this._nextCallbackTimeoutID++;this._scheduledTimeouts.set(id, setTimeout(() => {this._resume();while (this._scheduledTimeouts.has(id)) {// for some reason Go failed to register the timeout event, log and try again// (temporary workaround for https://github.com/golang/go/issues/28975)console.warn("scheduleTimeoutEvent: missed timeout event");this._resume();}},getInt64(sp + 8),));this.mem.setInt32(sp + 16, id, true);},// func clearTimeoutEvent(id int32)"runtime.clearTimeoutEvent": (sp) => {sp >>>= 0;const id = this.mem.getInt32(sp + 8, true);clearTimeout(this._scheduledTimeouts.get(id));this._scheduledTimeouts.delete(id);},// func getRandomData(r []byte)"runtime.getRandomData": (sp) => {sp >>>= 0;crypto.getRandomValues(loadSlice(sp + 8));},// func finalizeRef(v ref)"syscall/js.finalizeRef": (sp) => {sp >>>= 0;const id = this.mem.getUint32(sp + 8, true);this._goRefCounts[id]--;if (this._goRefCounts[id] === 0) {const v = this._values[id];this._values[id] = null;this._ids.delete(v);this._idPool.push(id);}},// func stringVal(value string) ref"syscall/js.stringVal": (sp) => {sp >>>= 0;storeValue(sp + 24, loadString(sp + 8));},// func valueGet(v ref, p string) ref"syscall/js.valueGet": (sp) => {sp >>>= 0;const result = Reflect.get(loadValue(sp + 8), loadString(sp + 16));sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 32, result);},// func valueSet(v ref, p string, x ref)"syscall/js.valueSet": (sp) => {sp >>>= 0;Reflect.set(loadValue(sp + 8), loadString(sp + 16), loadValue(sp + 32));},// func valueDelete(v ref, p string)"syscall/js.valueDelete": (sp) => {sp >>>= 0;Reflect.deleteProperty(loadValue(sp + 8), loadString(sp + 16));},// func valueIndex(v ref, i int) ref"syscall/js.valueIndex": (sp) => {sp >>>= 0;storeValue(sp + 24, Reflect.get(loadValue(sp + 8), getInt64(sp + 16)));},// valueSetIndex(v ref, i int, x ref)"syscall/js.valueSetIndex": (sp) => {sp >>>= 0;Reflect.set(loadValue(sp + 8), getInt64(sp + 16), loadValue(sp + 24));},// func valueCall(v ref, m string, args []ref) (ref, bool)"syscall/js.valueCall": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const m = Reflect.get(v, loadString(sp + 16));const args = loadSliceOfValues(sp + 32);const result = Reflect.apply(m, v, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 56, result);this.mem.setUint8(sp + 64, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 56, err);this.mem.setUint8(sp + 64, 0);}},// func valueInvoke(v ref, args []ref) (ref, bool)"syscall/js.valueInvoke": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const args = loadSliceOfValues(sp + 16);const result = Reflect.apply(v, undefined, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, result);this.mem.setUint8(sp + 48, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, err);this.mem.setUint8(sp + 48, 0);}},// func valueNew(v ref, args []ref) (ref, bool)"syscall/js.valueNew": (sp) => {sp >>>= 0;try {const v = loadValue(sp + 8);const args = loadSliceOfValues(sp + 16);const result = Reflect.construct(v, args);sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, result);this.mem.setUint8(sp + 48, 1);} catch (err) {sp = this._inst.exports.getsp() >>> 0; // see comment abovestoreValue(sp + 40, err);this.mem.setUint8(sp + 48, 0);}},// func valueLength(v ref) int"syscall/js.valueLength": (sp) => {sp >>>= 0;setInt64(sp + 16, parseInt(loadValue(sp + 8).length));},// valuePrepareString(v ref) (ref, int)"syscall/js.valuePrepareString": (sp) => {sp >>>= 0;const str = encoder.encode(String(loadValue(sp + 8)));storeValue(sp + 16, str);setInt64(sp + 24, str.length);},// valueLoadString(v ref, b []byte)"syscall/js.valueLoadString": (sp) => {sp >>>= 0;const str = loadValue(sp + 8);loadSlice(sp + 16).set(str);},// func valueInstanceOf(v ref, t ref) bool"syscall/js.valueInstanceOf": (sp) => {sp >>>= 0;this.mem.setUint8(sp + 24, (loadValue(sp + 8) instanceof loadValue(sp + 16)) ? 1 : 0);},// func copyBytesToGo(dst []byte, src ref) (int, bool)"syscall/js.copyBytesToGo": (sp) => {sp >>>= 0;const dst = loadSlice(sp + 8);const src = loadValue(sp + 32);if (!(src instanceof Uint8Array || src instanceof Uint8ClampedArray)) {this.mem.setUint8(sp + 48, 0);return;}const toCopy = src.subarray(0, dst.length);dst.set(toCopy);setInt64(sp + 40, toCopy.length);this.mem.setUint8(sp + 48, 1);},// func copyBytesToJS(dst ref, src []byte) (int, bool)"syscall/js.copyBytesToJS": (sp) => {sp >>>= 0;const dst = loadValue(sp + 8);const src = loadSlice(sp + 16);if (!(dst instanceof Uint8Array || dst instanceof Uint8ClampedArray)) {this.mem.setUint8(sp + 48, 0);return;}const toCopy = src.subarray(0, dst.length);dst.set(toCopy);setInt64(sp + 40, toCopy.length);this.mem.setUint8(sp + 48, 1);},"debug": (value) => {console.log(value);},}};}async run(instance) {if (!(instance instanceof WebAssembly.Instance)) {throw new Error("Go.run: WebAssembly.Instance expected");}this._inst = instance;this.mem = new DataView(this._inst.exports.mem.buffer);this._values = [ // JS values that Go currently has references to, indexed by reference idNaN,0,null,true,false,globalThis,this,];this._goRefCounts = new Array(this._values.length).fill(Infinity); // number of references that Go has to a JS value, indexed by reference idthis._ids = new Map([ // mapping from JS values to reference ids[0, 1],[null, 2],[true, 3],[false, 4],[globalThis, 5],[this, 6],]);this._idPool = []; // unused ids that have been garbage collectedthis.exited = false; // whether the Go program has exited// Pass command line arguments and environment variables to WebAssembly by writing them to the linear memory.let offset = 4096;const strPtr = (str) => {const ptr = offset;const bytes = encoder.encode(str + "\0");new Uint8Array(this.mem.buffer, offset, bytes.length).set(bytes);offset += bytes.length;if (offset % 8 !== 0) {offset += 8 - (offset % 8);}return ptr;};const argc = this.argv.length;const argvPtrs = [];this.argv.forEach((arg) => {argvPtrs.push(strPtr(arg));});argvPtrs.push(0);const keys = Object.keys(this.env).sort();keys.forEach((key) => {argvPtrs.push(strPtr(`${key}=${this.env[key]}`));});argvPtrs.push(0);const argv = offset;argvPtrs.forEach((ptr) => {this.mem.setUint32(offset, ptr, true);this.mem.setUint32(offset + 4, 0, true);offset += 8;});// The linker guarantees global data starts from at least wasmMinDataAddr.// Keep in sync with cmd/link/internal/ld/data.go:wasmMinDataAddr.const wasmMinDataAddr = 4096 + 8192;if (offset >= wasmMinDataAddr) {throw new Error("total length of command line and environment variables exceeds limit");}this._inst.exports.run(argc, argv);if (this.exited) {this._resolveExitPromise();}await this._exitPromise;}_resume() {if (this.exited) {throw new Error("Go program has already exited");}this._inst.exports.resume();if (this.exited) {this._resolveExitPromise();}}_makeFuncWrapper(id) {const go = this;return function () {const event = { id: id, this: this, args: arguments };go._pendingEvent = event;go._resume();return event.result;};}}})();
{"version":3,"sourceRoot":"","sources":["../stylesheets/_fonts.scss","../stylesheets/index.scss"],"names":[],"mappings":"AAAA;EACI;EACA;;ACAJ;EACI;EACA;EAEA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAEJ;EACI","file":"main.css"}
@font-face {font-family: "Homemade Apple";src: url("fonts/HomemadeApple-Regular.ttf");}body {width: 100vw;height: 100vh;background: white;overflow: hidden;margin: 0;padding: 0;}#root {width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;}.main .text-entry {font-family: "Homemade Apple";font-size: 2.5em;border-bottom-width: 5px;border-top-width: 0;border-left-width: 0;border-right-width: 0;}.main .text-entry:focus {outline: none;}.main .text-entry::before {content: " ";}/*# sourceMappingURL=main.css.map */
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"/><meta content="width=device-width, initial-scale=1.0" name="viewport"/><title>Wails App</title><link rel="stylesheet" href="main.css" /><script src="wasm_exec.js"></script><script>const go = new Go();function runWASM(runner, module) {return runner(module, go.importObject).then((result) => go.run(result.instance));}function fallbackWASMInstantiate() {fetch('main.wasm').then((response) => response.arrayBuffer()).then((buff) => runWASM(WebAssembly.instantiate, buff));}fetch('main.wasm').then((response) => {runWASM(WebAssembly.instantiateStreaming, response).catch((err) => {if (response.headers.get('Content-Type') != 'application/wasm') {console.warn('cannot stream wasm, binary served without `application/wasm` Content-Type header');fallbackWASMInstantiate();} else throw(err);});});</script></head><body><div id="vugu_mount_point"></div></body></html>
Apache LicenseVersion 2.0, January 2004http://www.apache.org/licenses/TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION1. Definitions."License" shall mean the terms and conditions for use, reproduction,and distribution as defined by Sections 1 through 9 of this document."Licensor" shall mean the copyright owner or entity authorized bythe copyright owner that is granting the License."Legal Entity" shall mean the union of the acting entity and allother entities that control, are controlled by, or are under commoncontrol with that entity. For the purposes of this definition,"control" means (i) the power, direct or indirect, to cause thedirection or management of such entity, whether by contract orotherwise, or (ii) ownership of fifty percent (50%) or more of theoutstanding shares, or (iii) beneficial ownership of such entity."You" (or "Your") shall mean an individual or Legal Entityexercising permissions granted by this License."Source" form shall mean the preferred form for making modifications,including but not limited to software source code, documentationsource, and configuration files."Object" form shall mean any form resulting from mechanicaltransformation or translation of a Source form, including butnot limited to compiled object code, generated documentation,and conversions to other media types."Work" shall mean the work of authorship, whether in Source orObject form, made available under the License, as indicated by acopyright notice that is included in or attached to the work(an example is provided in the Appendix below)."Derivative Works" shall mean any work, whether in Source or Objectform, that is based on (or derived from) the Work and for which theeditorial revisions, annotations, elaborations, or other modificationsrepresent, as a whole, an original work of authorship. For the purposesof this License, Derivative Works shall not include works that remainseparable from, or merely link (or bind by name) to the interfaces of,the Work and Derivative Works thereof."Contribution" shall mean any work of authorship, includingthe original version of the Work and any modifications or additionsto that Work or Derivative Works thereof, that is intentionallysubmitted to Licensor for inclusion in the Work by the copyright owneror by an individual or Legal Entity authorized to submit on behalf ofthe copyright owner. For the purposes of this definition, "submitted"means any form of electronic, verbal, or written communication sentto the Licensor or its representatives, including but not limited tocommunication on electronic mailing lists, source code control systems,and issue tracking systems that are managed by, or on behalf of, theLicensor for the purpose of discussing and improving the Work, butexcluding communication that is conspicuously marked or otherwisedesignated in writing by the copyright owner as "Not a Contribution.""Contributor" shall mean Licensor and any individual or Legal Entityon behalf of whom a Contribution has been received by Licensor andsubsequently incorporated within the Work.2. Grant of Copyright License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocablecopyright license to reproduce, prepare Derivative Works of,publicly display, publicly perform, sublicense, and distribute theWork and such Derivative Works in Source or Object form.3. Grant of Patent License. Subject to the terms and conditions ofthis License, each Contributor hereby grants to You a perpetual,worldwide, non-exclusive, no-charge, royalty-free, irrevocable(except as stated in this section) patent license to make, have made,use, offer to sell, sell, import, and otherwise transfer the Work,where such license applies only to those patent claims licensableby such Contributor that are necessarily infringed by theirContribution(s) alone or by combination of their Contribution(s)with the Work to which such Contribution(s) was submitted. If Youinstitute patent litigation against any entity (including across-claim or counterclaim in a lawsuit) alleging that the Workor a Contribution incorporated within the Work constitutes director contributory patent infringement, then any patent licensesgranted to You under this License for that Work shall terminateas of the date such litigation is filed.4. Redistribution. You may reproduce and distribute copies of theWork or Derivative Works thereof in any medium, with or withoutmodifications, and in Source or Object form, provided that Youmeet the following conditions:(a) You must give any other recipients of the Work orDerivative Works a copy of this License; and(b) You must cause any modified files to carry prominent noticesstating that You changed the files; and(c) You must retain, in the Source form of any Derivative Worksthat You distribute, all copyright, patent, trademark, andattribution notices from the Source form of the Work,excluding those notices that do not pertain to any part ofthe Derivative Works; and(d) If the Work includes a "NOTICE" text file as part of itsdistribution, then any Derivative Works that You distribute mustinclude a readable copy of the attribution notices containedwithin such NOTICE file, excluding those notices that do notpertain to any part of the Derivative Works, in at least oneof the following places: within a NOTICE text file distributedas part of the Derivative Works; within the Source form ordocumentation, if provided along with the Derivative Works; or,within a display generated by the Derivative Works, if andwherever such third-party notices normally appear. The contentsof the NOTICE file are for informational purposes only anddo not modify the License. You may add Your own attributionnotices within Derivative Works that You distribute, alongsideor as an addendum to the NOTICE text from the Work, providedthat such additional attribution notices cannot be construedas modifying the License.You may add Your own copyright statement to Your modifications andmay provide additional or different license terms and conditionsfor use, reproduction, or distribution of Your modifications, orfor any such Derivative Works as a whole, provided Your use,reproduction, and distribution of the Work otherwise complies withthe conditions stated in this License.5. Submission of Contributions. Unless You explicitly state otherwise,any Contribution intentionally submitted for inclusion in the Workby You to the Licensor shall be under the terms and conditions ofthis License, without any additional terms or conditions.Notwithstanding the above, nothing herein shall supersede or modifythe terms of any separate license agreement you may have executedwith Licensor regarding such Contributions.6. Trademarks. This License does not grant permission to use the tradenames, trademarks, service marks, or product names of the Licensor,except as required for reasonable and customary use in describing theorigin of the Work and reproducing the content of the NOTICE file.7. Disclaimer of Warranty. Unless required by applicable law oragreed to in writing, Licensor provides the Work (and eachContributor provides its Contributions) on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express orimplied, including, without limitation, any warranties or conditionsof TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR APARTICULAR PURPOSE. You are solely responsible for determining theappropriateness of using or redistributing the Work and assume anyrisks associated with Your exercise of permissions under this License.8. Limitation of Liability. In no event and under no legal theory,whether in tort (including negligence), contract, or otherwise,unless required by applicable law (such as deliberate and grosslynegligent acts) or agreed to in writing, shall any Contributor beliable to You for damages, including any direct, indirect, special,incidental, or consequential damages of any character arising as aresult of this License or out of the use or inability to use theWork (including but not limited to damages for loss of goodwill,work stoppage, computer failure or malfunction, or any and allother commercial damages or losses), even if such Contributorhas been advised of the possibility of such damages.9. Accepting Warranty or Additional Liability. While redistributingthe Work or Derivative Works thereof, You may choose to offer,and charge a fee for, acceptance of support, warranty, indemnity,or other liability obligations and/or rights consistent with thisLicense. However, in accepting such obligations, You may act onlyon Your own behalf and on Your sole responsibility, not on behalfof any other Contributor, and only if You agree to indemnify,defend, and hold each Contributor harmless for any liabilityincurred by, or claims asserted against, such Contributor by reasonof your accepting any such warranty or additional liability.END OF TERMS AND CONDITIONSAPPENDIX: How to apply the Apache License to your work.To apply the Apache License to your work, attach the followingboilerplate notice, with the fields enclosed by brackets "[]"replaced with your own identifying information. (Don't includethe brackets!) The text should be enclosed in the appropriatecomment syntax for the file format. We also recommend that afile or class name and description of purpose be included on thesame "printed page" as the copyright notice for easieridentification within third-party archives.Copyright [yyyy] [name of copyright owner]Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License athttp://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
package mainimport ("context""jisho/internal/word")// App structtype App struct {ctx context.Contextword.Provider}// NewApp creates a new App application structfunc NewApp(p word.Provider) *App {return &App{Provider: p}}// startup is called when the app starts. The context is saved// so we can call the runtime methodsfunc (a *App) startup(ctx context.Context) {a.ctx = ctx}
# README## AboutThis is the official Wails Vanilla template.You can configure the project by editing `wails.json`. More information about the project settings can be foundhere: https://wails.io/docs/reference/project-config## Live DevelopmentTo run in live development mode, run `wails dev` in the project directory. This will run a Vite developmentserver that will provide very fast hot reload of your frontend changes. If you want to develop in a browserand have access to your Go methods, there is also a dev server that runs on http://localhost:34115. Connectto this in your browser, and you can call your Go code from devtools.## BuildingTo build a redistributable, production mode package, use `wails build`.
package mainimport ("compress/gzip""fmt""os""github.com/themoeway/jmdict-go")func main() {f, err := os.Open("./JMdict_e.gz")if err != nil {fmt.Println(err.Error())return}defer f.Close()gzReader, err := gzip.NewReader(f)if err != nil {fmt.Println(err.Error())return}jdict, _, err := jmdict.LoadJmdict(gzReader)if err != nil {fmt.Println(err.Error())return}fmt.Printf("there are %d entries in the dictionary.\n", len(jdict.Entries))kanji := "-"if len(jdict.Entries[0].Kanji) > 0 {kanji = jdict.Entries[0].Kanji[0].Expression}fmt.Printf("first entry: %s [%s] : %s\n", kanji,jdict.Entries[0].Readings[0].Reading,jdict.Entries[0].Sense[0].Glossary[0].Content)kanji = "-"last := len(jdict.Entries) - 1if len(jdict.Entries[last].Kanji) > 0 {kanji = jdict.Entries[last].Kanji[0].Expression}fmt.Printf("last entry: %s [%s] : %s\n", kanji,jdict.Entries[last].Readings[0].Reading,jdict.Entries[last].Sense[0].Glossary[0].Content)}
.git.DS_Store/build/*.wasmJMdict_e.gzwailsjs/0_components_vgen.gomain_wasm.go
build/binnode_modulesfrontend/dist