diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 0f5c83e..0bd8375 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -11,7 +11,7 @@ builds: release: github: - owner: onsonr + owner: sonr-io name: motr name_template: "{{ .Tag }} | {{ .Env.RELEASE_DATE }}" draft: false diff --git a/.taskfile.dist.yml b/.taskfile.dist.yml index b6b0605..c102075 100644 --- a/.taskfile.dist.yml +++ b/.taskfile.dist.yml @@ -1,15 +1,91 @@ # https://taskfile.dev version: "3" +silent: true tasks: - sqlc:gen: - dir: internal + default: cmds: - - sqlc generate - silent: true + - task: test + - task: gen + - task: build - templ:gen: + test: + desc: Runs tests + cmds: + - defer: rm -rf .task + - task: test:go + + build: + desc: Builds code + cmds: + - rm -rf bin + - defer: rm -rf .task + - task: build:go + # - task: build:docker + + gen: + desc: Generates code + cmds: + - defer: rm -rf .task + - task: gen:templ + - task: gen:sqlc + + # + # Internal tasks + # + + build:go: + desc: Builds Go code + env: + GOOS: js + GOARCH: wasm + sources: + - "main.go" + - "**/*.go" + generates: + - bin/motr.wasm + cmds: + - go build -o bin/motr.wasm . + + build:docker: + desc: Builds Docker image + env: + GOOS: js + GOARCH: wasm + sources: + - "main.go" + - "**/*.go" + generates: + - bin/motr.wasm + cmds: + - go build -o bin/motr.wasm . + + gen:templ: + internal: true + sources: + - "**/*.templ" + generates: + - "**/_templ.go" cmds: - templ generate - silent: true + + gen:sqlc: + internal: true + sources: + - pkg/sink/query.sql + - pkg/sink/schema.sql + generates: + - pkg/models/db.go + - pkg/models/querier.go + - pkg/models/models.go + - pkg/models/query.sql.go + cmds: + - sqlc generate + + test:go: + internal: true + sources: + - "**/*.go" + cmds: + - go test -v ./... diff --git a/Makefile b/Makefile index f90b35d..09d9dd6 100644 --- a/Makefile +++ b/Makefile @@ -7,8 +7,7 @@ COMMIT := $(shell git log -1 --format='%H') all: generate build build: - GOOS=js GOARCH=wasm go build -o bin/motr.wasm . + @task -t .taskfile.dist.yml build generate: - @task -t .taskfile.dist.yml sqlc:gen - @task -t .taskfile.dist.yml templ:gen + @task -t .taskfile.dist.yml gen diff --git a/app/app.go b/app/app.go index b6a33c3..e306341 100644 --- a/app/app.go +++ b/app/app.go @@ -5,15 +5,15 @@ package app import ( "github.com/labstack/echo/v4" echomiddleware "github.com/labstack/echo/v4/middleware" - "github.com/onsonr/motr/internal/config" - "github.com/onsonr/motr/internal/context" - "github.com/onsonr/motr/internal/models" + "github.com/onsonr/motr/context" + "github.com/onsonr/motr/pkg/models" + "github.com/onsonr/motr/pkg/types" ) type Vault = *echo.Echo // New returns a new Vault instance -func New(config *config.Config, dbq *models.Queries) (Vault, error) { +func New(config *types.Config, dbq *models.Queries) (Vault, error) { e := echo.New() // Override default behaviors e.IPExtractor = echo.ExtractIPDirect() diff --git a/internal/context/wasm.go b/context/wasm.go similarity index 100% rename from internal/context/wasm.go rename to context/wasm.go diff --git a/embed/codec.go b/embed/codec.go deleted file mode 100644 index fcd7733..0000000 --- a/embed/codec.go +++ /dev/null @@ -1,49 +0,0 @@ -package embed - -import ( - "github.com/onsonr/motr/internal/config" -) - -// motr "github.com/onsonr/motr/pkg/config" - -const SchemaVersion = 1 - -const ( - AppManifestFileName = "app.webmanifest" - DWNConfigFileName = "dwn.json" - IndexHTMLFileName = "index.html" - MainJSFileName = "main.js" - ServiceWorkerFileName = "sw.js" -) - -// // spawnVaultDirectory creates a new directory with the default files -// -// func NewVaultFS(cfg *Config) (files.Directory, error) { -// manifestBz, err := NewWebManifest() -// if err != nil { -// return nil, err -// } -// cnfBz, err := json.Marshal(cfg) -// if err != nil { -// return nil, err -// } -// return files.NewMapDirectory(map[string]files.Node{ -// AppManifestFileName: files.NewBytesFile(manifestBz), -// DWNConfigFileName: files.NewBytesFile(cnfBz), -// IndexHTMLFileName: files.NewBytesFile(IndexHTML), -// MainJSFileName: files.NewBytesFile(MainJS), -// ServiceWorkerFileName: files.NewBytesFile(WorkerJS), -// }), nil -// } -// -// NewVaultConfig returns the default vault config -func NewVaultConfig(addr string, ucanCID string) *config.Config { - return &config.Config{ - MotrToken: ucanCID, - MotrAddress: addr, - IpfsGatewayURL: "http://localhost:80", - SonrAPIURL: "http://localhost:1317", - SonrRPCURL: "http://localhost:26657", - SonrChainID: "sonr-testnet-1", - } -} diff --git a/embed/utils.go b/embed/utils.go deleted file mode 100644 index fac01a1..0000000 --- a/embed/utils.go +++ /dev/null @@ -1,47 +0,0 @@ -package embed - -import ( - _ "embed" - "reflect" - "strings" -) - -//go:embed index.html -var IndexHTML []byte - -//go:embed main.js -var MainJS []byte - -//go:embed sw.js -var WorkerJS []byte - -func getSchema(structType interface{}) string { - t := reflect.TypeOf(structType) - if t.Kind() == reflect.Ptr { - t = t.Elem() - } - - if t.Kind() != reflect.Struct { - return "" - } - - var fields []string - for i := 0; i < t.NumField(); i++ { - field := t.Field(i) - fieldName := toCamelCase(field.Name) - fields = append(fields, fieldName) - } - - // Add "++" at the beginning, separated by a comma - return "++, " + strings.Join(fields, ", ") -} - -func toCamelCase(s string) string { - if s == "" { - return s - } - if len(s) == 1 { - return strings.ToLower(s) - } - return strings.ToLower(s[:1]) + s[1:] -} diff --git a/go.mod b/go.mod index 21901da..74e341c 100644 --- a/go.mod +++ b/go.mod @@ -3,27 +3,20 @@ module github.com/onsonr/motr go 1.23.4 require ( - github.com/a-h/templ v0.3.819 - github.com/apple/pkl-go v0.9.0 - github.com/ipfs/boxo v0.26.0 github.com/labstack/echo/v4 v4.13.3 github.com/ncruces/go-sqlite3 v0.21.3 ) require ( - github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/labstack/gommon v0.4.2 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/ncruces/julianday v1.0.0 // indirect - github.com/onsonr/nebula v0.1.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/tetratelabs/wazero v1.8.2 // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect github.com/valyala/fasttemplate v1.2.2 // indirect - github.com/vmihailenco/msgpack/v5 v5.4.1 // indirect - github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect golang.org/x/crypto v0.31.0 // indirect golang.org/x/net v0.33.0 // indirect golang.org/x/sys v0.28.0 // indirect diff --git a/go.sum b/go.sum index faa0325..58da449 100644 --- a/go.sum +++ b/go.sum @@ -1,15 +1,5 @@ -github.com/a-h/templ v0.3.819 h1:KDJ5jTFN15FyJnmSmo2gNirIqt7hfvBD2VXVDTySckM= -github.com/a-h/templ v0.3.819/go.mod h1:iDJKJktpttVKdWoTkRNNLcllRI+BlpopJc+8au3gOUo= -github.com/apple/pkl-go v0.9.0 h1:aA4Bh+WQ797p8nEnQhHzCahVuQP2HJ40ffSQWlAR5es= -github.com/apple/pkl-go v0.9.0/go.mod h1:5Hwil5tyZGrOekh7JXLZJvIAcGHb4gT19lnv4WEiKeI= -github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf h1:dwGgBWn84wUS1pVikGiruW+x5XM4amhjaZO20vCjay4= -github.com/crackcomm/go-gitignore v0.0.0-20241020182519-7843d2ba8fdf/go.mod h1:p1d6YEZWvFzEh4KLyvBcVSnrfNDDvK2zfK/4x2v/4pE= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/ipfs/boxo v0.26.0 h1:RRxEon7rJMy8ScVaTLncSZ5/nA6majYhRSbzc80snO8= -github.com/ipfs/boxo v0.26.0/go.mod h1:iHyc9cjoF7/zoiKVY65d2fBWRhoS2zx4cMk8hKgqrac= github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= @@ -23,10 +13,6 @@ github.com/ncruces/go-sqlite3 v0.21.3 h1:hHkfNQLcbnxPJZhC/RGw9SwP3bfkv/Y0xUHWsr1 github.com/ncruces/go-sqlite3 v0.21.3/go.mod h1:zxMOaSG5kFYVFK4xQa0pdwIszqxqJ0W0BxBgwdrNjuA= github.com/ncruces/julianday v1.0.0 h1:fH0OKwa7NWvniGQtxdJRxAgkBMolni2BjDHaWTxqt7M= github.com/ncruces/julianday v1.0.0/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= -github.com/onsonr/nebula v0.1.0 h1:hVwq/rlCRGVxUhs2ZGkF/pSOEYg0k9/TuhzWMHjdV+c= -github.com/onsonr/nebula v0.1.0/go.mod h1:60FFGLF4fUfOeNURep3rndIoazpKg+lzfXL1WMxj4eA= -github.com/onsonr/nebula v0.1.1 h1:YBIbf4JSt8jVz6DI04fa7gKY9fBZ47YBIzwe3Nom+YQ= -github.com/onsonr/nebula v0.1.1/go.mod h1:1Dcmw5lB4dvKRKSp55B/iLmN4ejZ4vp1/EB/RzXetAQ= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -37,10 +23,6 @@ github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6Kllzaw github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= 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/vmihailenco/msgpack/v5 v5.4.1 h1:cQriyiUvjTwOHg8QZaPihLWeRAAVoCpE00IUPn0Bjt8= -github.com/vmihailenco/msgpack/v5 v5.4.1/go.mod h1:GaZTsDaehaPpQVyxrf5mtQlH+pc21PIudVV/E3rRQok= -github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= -github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds= golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I= diff --git a/main.go b/main.go index 8322409..b2bc63d 100644 --- a/main.go +++ b/main.go @@ -19,9 +19,8 @@ import ( _ "github.com/ncruces/go-sqlite3/driver" _ "github.com/ncruces/go-sqlite3/embed" vault "github.com/onsonr/motr/app" - "github.com/onsonr/motr/internal/models" - sink "github.com/onsonr/motr/internal/sink" - // motr "github.com/onsonr/motr/pkg/config" + "github.com/onsonr/motr/pkg/models" + sink "github.com/onsonr/motr/pkg/sink" ) var ( @@ -64,6 +63,7 @@ func main() { // return &config, err // } // + // createDB initializes and returns a configured database connection func createDB() (*models.Queries, error) { db, err := sql.Open("sqlite3", ":memory:") diff --git a/pkg/embed/embed.go b/pkg/embed/embed.go new file mode 100644 index 0000000..878c38c --- /dev/null +++ b/pkg/embed/embed.go @@ -0,0 +1,142 @@ +package embed + +import ( + "encoding/json" + "reflect" + "strings" + + _ "embed" + + "github.com/onsonr/motr/pkg/types" +) + +//go:embed index.html +var IndexHTML []byte + +//go:embed main.js +var MainJS []byte + +//go:embed sw.js +var WorkerJS []byte + +const SchemaVersion = 1 + +const ( + AppManifestFileName = "app.webmanifest" + DWNConfigFileName = "dwn.json" + IndexHTMLFileName = "index.html" + MainJSFileName = "main.js" + ServiceWorkerFileName = "sw.js" +) + +// // spawnVaultDirectory creates a new directory with the default files +// +// func NewVaultFS(cfg *Config) (files.Directory, error) { +// manifestBz, err := NewWebManifest() +// if err != nil { +// return nil, err +// } +// cnfBz, err := json.Marshal(cfg) +// if err != nil { +// return nil, err +// } +// return files.NewMapDirectory(map[string]files.Node{ +// AppManifestFileName: files.NewBytesFile(manifestBz), +// DWNConfigFileName: files.NewBytesFile(cnfBz), +// IndexHTMLFileName: files.NewBytesFile(IndexHTML), +// MainJSFileName: files.NewBytesFile(MainJS), +// ServiceWorkerFileName: files.NewBytesFile(WorkerJS), +// }), nil +// } +// +// NewVaultConfig returns the default vault config +func NewVaultConfig(addr string, ucanCID string) *types.Config { + return &types.Config{ + MotrToken: ucanCID, + MotrAddress: addr, + IpfsGatewayURL: "http://localhost:80", + SonrAPIURL: "http://localhost:1317", + SonrRPCURL: "http://localhost:26657", + SonrChainID: "sonr-testnet-1", + } +} + +func NewWebManifest() ([]byte, error) { + return json.Marshal(baseWebManifest) +} + +var baseWebManifest = types.WebManifest{ + Name: "Sonr Vault", + ShortName: "Sonr.ID", + StartURL: "/index.html", + Display: "standalone", + DisplayOverride: []string{ + "fullscreen", + "minimal-ui", + }, + Icons: []types.IconDefinition{ + { + Src: "/icons/icon-192x192.png", + Sizes: "192x192", + Type: "image/png", + }, + }, + ServiceWorker: types.ServiceWorker{ + Scope: "/", + Src: "/sw.js", + UseCache: true, + }, + ProtocolHandlers: []types.ProtocolHandler{ + { + Scheme: "did.sonr", + URL: "/resolve/sonr/%s", + }, + { + Scheme: "did.eth", + URL: "/resolve/eth/%s", + }, + { + Scheme: "did.btc", + URL: "/resolve/btc/%s", + }, + { + Scheme: "did.usdc", + URL: "/resolve/usdc/%s", + }, + { + Scheme: "did.ipfs", + URL: "/resolve/ipfs/%s", + }, + }, +} + +func getSchema(structType interface{}) string { + t := reflect.TypeOf(structType) + if t.Kind() == reflect.Ptr { + t = t.Elem() + } + + if t.Kind() != reflect.Struct { + return "" + } + + var fields []string + for i := 0; i < t.NumField(); i++ { + field := t.Field(i) + fieldName := toCamelCase(field.Name) + fields = append(fields, fieldName) + } + + // Add "++" at the beginning, separated by a comma + return "++, " + strings.Join(fields, ", ") +} + +func toCamelCase(s string) string { + if s == "" { + return s + } + if len(s) == 1 { + return strings.ToLower(s) + } + return strings.ToLower(s[:1]) + s[1:] +} diff --git a/embed/index.html b/pkg/embed/index.html similarity index 100% rename from embed/index.html rename to pkg/embed/index.html diff --git a/embed/main.js b/pkg/embed/main.js similarity index 100% rename from embed/main.js rename to pkg/embed/main.js diff --git a/embed/sw.js b/pkg/embed/sw.js similarity index 100% rename from embed/sw.js rename to pkg/embed/sw.js diff --git a/internal/models/db.go b/pkg/models/db.go similarity index 100% rename from internal/models/db.go rename to pkg/models/db.go diff --git a/internal/models/models.go b/pkg/models/models.go similarity index 100% rename from internal/models/models.go rename to pkg/models/models.go diff --git a/internal/models/querier.go b/pkg/models/querier.go similarity index 100% rename from internal/models/querier.go rename to pkg/models/querier.go diff --git a/internal/models/query.sql.go b/pkg/models/query.sql.go similarity index 100% rename from internal/models/query.sql.go rename to pkg/models/query.sql.go diff --git a/internal/sink/query.sql b/pkg/sink/query.sql similarity index 100% rename from internal/sink/query.sql rename to pkg/sink/query.sql diff --git a/internal/sink/schema.sql b/pkg/sink/schema.sql similarity index 100% rename from internal/sink/schema.sql rename to pkg/sink/schema.sql diff --git a/internal/sink/sink.go b/pkg/sink/sink.go similarity index 100% rename from internal/sink/sink.go rename to pkg/sink/sink.go diff --git a/internal/config/config.go b/pkg/types/config.go similarity index 95% rename from internal/config/config.go rename to pkg/types/config.go index 452261a..c626a78 100644 --- a/internal/config/config.go +++ b/pkg/types/config.go @@ -1,4 +1,4 @@ -package config +package types type Config struct { // TODO diff --git a/embed/webworker.go b/pkg/types/web_manifest.go similarity index 74% rename from embed/webworker.go rename to pkg/types/web_manifest.go index fd0e83d..87a6c42 100644 --- a/embed/webworker.go +++ b/pkg/types/web_manifest.go @@ -1,55 +1,4 @@ -package embed - -import "encoding/json" - -func NewWebManifest() ([]byte, error) { - return json.Marshal(baseWebManifest) -} - -var baseWebManifest = WebManifest{ - Name: "Sonr Vault", - ShortName: "Sonr.ID", - StartURL: "/index.html", - Display: "standalone", - DisplayOverride: []string{ - "fullscreen", - "minimal-ui", - }, - Icons: []IconDefinition{ - { - Src: "/icons/icon-192x192.png", - Sizes: "192x192", - Type: "image/png", - }, - }, - ServiceWorker: ServiceWorker{ - Scope: "/", - Src: "/sw.js", - UseCache: true, - }, - ProtocolHandlers: []ProtocolHandler{ - { - Scheme: "did.sonr", - URL: "/resolve/sonr/%s", - }, - { - Scheme: "did.eth", - URL: "/resolve/eth/%s", - }, - { - Scheme: "did.btc", - URL: "/resolve/btc/%s", - }, - { - Scheme: "did.usdc", - URL: "/resolve/usdc/%s", - }, - { - Scheme: "did.ipfs", - URL: "/resolve/ipfs/%s", - }, - }, -} +package types type WebManifest struct { // Required fields diff --git a/internal/sqlc.yaml b/sqlc.yaml similarity index 58% rename from internal/sqlc.yaml rename to sqlc.yaml index f24f3f2..2101900 100644 --- a/internal/sqlc.yaml +++ b/sqlc.yaml @@ -1,11 +1,11 @@ version: "2" sql: - engine: "sqlite" - queries: "./sink/query.sql" - schema: "./sink/schema.sql" + queries: "./pkg/sink/query.sql" + schema: "./pkg/sink/schema.sql" gen: go: emit_interface: true emit_json_tags: true package: "models" - out: "./models" + out: "./pkg/models"