diff --git a/.gitignore b/.gitignore index b711704..e2e999b 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,9 @@ ## Editorconfig !.editorconfig +## Ownbrew +!.ownbrew.yaml + ## Husky !.husky/ !.husky.yaml diff --git a/ownbrew.yaml b/.ownbrew.yaml similarity index 82% rename from ownbrew.yaml rename to .ownbrew.yaml index 53803b7..1249b2e 100644 --- a/ownbrew.yaml +++ b/.ownbrew.yaml @@ -1,5 +1,5 @@ -# yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/ownbrew/refs/tags/v0.1.0/ownbrew.schema.json -version: '1.0' +# yaml-language-server: $schema=https://raw.githubusercontent.com/foomo/ownbrew/refs/tags/v0.2.3/ownbrew.schema.json +version: '1.1' binDir: "bin" tapDir: ".ownbrew/tap" @@ -9,7 +9,7 @@ packages: ## https://github.com/golangci/golangci-lint/releases - name: golangci-lint tap: foomo/tap/golangci/golangci-lint - version: 1.61.0 + version: 2.1.6 ## https://github.com/go-courier/husky/releases - name: husky tap: foomo/tap/go-courier/husky diff --git a/Makefile b/Makefile index 3268146..f632f38 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,6 @@ .DEFAULT_GOAL := help -include .makerc +PATH:=bin:$(PATH) # --- Targets ----------------------------------------------------------------- diff --git a/go.mod b/go.mod index 12feee1..fa216d1 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ require ( github.com/fatih/structtag v1.2.0 github.com/foomo/go v0.0.3 github.com/foomo/gocontemplate v0.2.0 - github.com/foomo/sesamy-go v0.10.0 + github.com/foomo/sesamy-go v0.11.1 github.com/invopop/jsonschema v0.13.0 github.com/itchyny/json2yaml v0.1.4 github.com/joho/godotenv v1.5.1 @@ -23,20 +23,20 @@ require ( github.com/stoewer/go-strcase v1.3.0 github.com/stretchr/testify v1.10.0 github.com/wissance/stringFormatter v1.4.1 - google.golang.org/api v0.230.0 + google.golang.org/api v0.234.0 ) require ( atomicgo.dev/cursor v0.2.0 // indirect atomicgo.dev/keyboard v0.2.9 // indirect atomicgo.dev/schedule v0.1.0 // indirect - cloud.google.com/go/auth v0.16.0 // indirect + cloud.google.com/go/auth v0.16.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect - cloud.google.com/go/compute/metadata v0.6.0 // indirect + cloud.google.com/go/compute/metadata v0.7.0 // indirect github.com/Code-Hex/go-wordwrap v1.0.0 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect - github.com/containerd/console v1.0.4 // indirect + github.com/containerd/console v1.0.5 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dlclark/regexp2 v1.11.5 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect @@ -48,7 +48,7 @@ require ( github.com/google/s2a-go v0.1.9 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect - github.com/googleapis/gax-go/v2 v2.14.1 // indirect + github.com/googleapis/gax-go/v2 v2.14.2 // indirect github.com/gookit/color v1.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/knadh/koanf/maps v0.1.2 // indirect @@ -64,29 +64,29 @@ require ( github.com/sagikazarmark/locafero v0.9.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.14.0 // indirect - github.com/spf13/cast v1.7.1 // indirect + github.com/spf13/cast v1.8.0 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect - go.opentelemetry.io/otel v1.35.0 // indirect - go.opentelemetry.io/otel/metric v1.35.0 // indirect - go.opentelemetry.io/otel/trace v1.35.0 // indirect + go.opentelemetry.io/otel v1.36.0 // indirect + go.opentelemetry.io/otel/metric v1.36.0 // indirect + go.opentelemetry.io/otel/trace v1.36.0 // indirect go.uber.org/multierr v1.11.0 // indirect golang.org/x/crypto v0.38.0 // indirect golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect golang.org/x/mod v0.24.0 // indirect golang.org/x/net v0.40.0 // indirect - golang.org/x/oauth2 v0.29.0 // indirect + golang.org/x/oauth2 v0.30.0 // indirect golang.org/x/sync v0.14.0 // indirect golang.org/x/sys v0.33.0 // indirect golang.org/x/term v0.32.0 // indirect golang.org/x/text v0.25.0 // indirect golang.org/x/tools v0.31.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e // indirect - google.golang.org/grpc v1.72.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect + google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 931f0cd..c3b52b9 100644 --- a/go.sum +++ b/go.sum @@ -6,12 +6,12 @@ atomicgo.dev/keyboard v0.2.9 h1:tOsIid3nlPLZ3lwgG8KZMp/SFmr7P0ssEN5JUsm78K8= atomicgo.dev/keyboard v0.2.9/go.mod h1:BC4w9g00XkxH/f1HXhW2sXmJFOCWbKn9xrOunSFtExQ= atomicgo.dev/schedule v0.1.0 h1:nTthAbhZS5YZmgYbb2+DH8uQIZcTlIrd4eYr3UQxEjs= atomicgo.dev/schedule v0.1.0/go.mod h1:xeUa3oAkiuHYh8bKiQBRojqAMq3PXXbJujjb0hw8pEU= -cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= -cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth v0.16.1 h1:XrXauHMd30LhQYVRHLGvJiYeczweKQXZxsTbV9TiguU= +cloud.google.com/go/auth v0.16.1/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= -cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I= -cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg= +cloud.google.com/go/compute/metadata v0.7.0 h1:PBWF+iiAerVNe8UCHxdOt6eHLVc3ydFeOCw78U8ytSU= +cloud.google.com/go/compute/metadata v0.7.0/go.mod h1:j5MvL9PprKL39t166CoB1uVHfQMs4tFQZZcKwksXUjo= github.com/Code-Hex/Neo-cowsay/v2 v2.0.4 h1:y80Hd9hmB+rsEH/p4c5ti5PbO0PhBmxw4NgbpFZvoHg= github.com/Code-Hex/Neo-cowsay/v2 v2.0.4/go.mod h1:6k40Pwrc2FazLf1BUbmAC36E9LvT+DErjZr30isbXhg= github.com/Code-Hex/go-wordwrap v1.0.0 h1:yl5fLyZEz3+hPGbpTRlTQ8mQJ1HXWcTq1FCNR1ch6zM= @@ -33,8 +33,8 @@ github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xW github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/console v1.0.4 h1:F2g4+oChYvBTsASRTz8NP6iIAi97J3TtSAsLbIFn4ro= -github.com/containerd/console v1.0.4/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= +github.com/containerd/console v1.0.5 h1:R0ymNeydRqH2DmakFNdmjR2k0t7UPuiOV/N/27/qqsc= +github.com/containerd/console v1.0.5/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -53,8 +53,8 @@ github.com/foomo/gocontemplate v0.2.0 h1:YbgNUwZ9mK9Wj05cGVTPamCpMuxlaL4qegkbZv2 github.com/foomo/gocontemplate v0.2.0/go.mod h1:VOYIvxPPAT7HxrderRexS0EttcT8pyfSRkCMvS8rtxA= github.com/foomo/gostandards v0.2.0 h1:Ryd7TI9yV3Xk5B84DcUDB7KcL3LzQ8NS+TVOrFxTYfA= github.com/foomo/gostandards v0.2.0/go.mod h1:XQx7Ur6vyvxaIe2cQvAthuhPYDe+d2soibqVcXDXOh4= -github.com/foomo/sesamy-go v0.10.0 h1:LRxdVOt5Cqq2lPo6PGYhtlIlp0erOE73wpdv5CAkcI0= -github.com/foomo/sesamy-go v0.10.0/go.mod h1:MwbT1lskUrzZH/6LwxZc+slovgMXLLp8LlSK9pZf0HI= +github.com/foomo/sesamy-go v0.11.1 h1:AIwcNVWacq0dPvGXBafw2u6bY2IGPsXiqdZgqmBSYoE= +github.com/foomo/sesamy-go v0.11.1/go.mod h1:3xnen0BWauXGBXq/7K7hDcc+Gxc3/HXHIlBX7ff2YGk= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= @@ -77,8 +77,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= -github.com/googleapis/gax-go/v2 v2.14.1 h1:hb0FFeiPaQskmvakKu5EbCbpntQn48jyHuvrkurSS/Q= -github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEPqouaLeN2IUxoA= +github.com/googleapis/gax-go/v2 v2.14.2 h1:eBLnkZ9635krYIPD+ag1USrOAI0Nr0QYF3+/3GqO0k0= +github.com/googleapis/gax-go/v2 v2.14.2/go.mod h1:ON64QhlJkhVtSqp4v1uaK92VyZ2gmvDQsweuyLV+8+w= github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQHCoQ= github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= @@ -157,8 +157,8 @@ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9yS github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spf13/afero v1.14.0 h1:9tH6MapGnn/j0eb0yIXiLjERO8RB6xIVZRDCX7PtqWA= github.com/spf13/afero v1.14.0/go.mod h1:acJQ8t0ohCGuMN3O+Pv0V0hgMxNYDlvdk+VTfyZmbYo= -github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= -github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +github.com/spf13/cast v1.8.0 h1:gEN9K4b8Xws4EX0+a0reLmhq8moKn7ntRlQYgjPeCDk= +github.com/spf13/cast v1.8.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= @@ -192,16 +192,16 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ= -go.opentelemetry.io/otel v1.35.0 h1:xKWKPxrxB6OtMCbmMY021CqC45J+3Onta9MqjhnusiQ= -go.opentelemetry.io/otel v1.35.0/go.mod h1:UEqy8Zp11hpkUrL73gSlELM0DupHoiq72dR+Zqel/+Y= -go.opentelemetry.io/otel/metric v1.35.0 h1:0znxYu2SNyuMSQT4Y9WDWej0VpcsxkuklLa4/siN90M= -go.opentelemetry.io/otel/metric v1.35.0/go.mod h1:nKVFgxBZ2fReX6IlyW28MgZojkoAkJGaE8CpgeAU3oE= +go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg= +go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E= +go.opentelemetry.io/otel/metric v1.36.0 h1:MoWPKVhQvJ+eeXWHFBOPoBOi20jh6Iq2CcCREuTYufE= +go.opentelemetry.io/otel/metric v1.36.0/go.mod h1:zC7Ks+yeyJt4xig9DEw9kuUFe5C3zLbVjV2PzT6qzbs= go.opentelemetry.io/otel/sdk v1.35.0 h1:iPctf8iprVySXSKJffSS79eOjl9pvxV9ZqOWT0QejKY= go.opentelemetry.io/otel/sdk v1.35.0/go.mod h1:+ga1bZliga3DxJ3CQGg3updiaAJoNECOgJREo9KHGQg= go.opentelemetry.io/otel/sdk/metric v1.35.0 h1:1RriWBmCKgkeHEhM7a2uMjMUfP7MsOF5JpUCaEqEI9o= go.opentelemetry.io/otel/sdk/metric v1.35.0/go.mod h1:is6XYCUMpcKi+ZsOvfluY5YstFnhW0BidkR+gL+qN+w= -go.opentelemetry.io/otel/trace v1.35.0 h1:dPpEfJu1sDIqruz7BHFG3c7528f6ddfSWfFDVt/xgMs= -go.opentelemetry.io/otel/trace v1.35.0/go.mod h1:WUk7DtFp1Aw2MkvqGdwiXYDZZNvA/1J8o6xRXLrIkyc= +go.opentelemetry.io/otel/trace v1.36.0 h1:ahxWNuqZjpdiFAyrIoQ4GIiAIhxAunQR6MUoKrsNd4w= +go.opentelemetry.io/otel/trace v1.36.0/go.mod h1:gQ+OnDZzrybY4k4seLzPAWNwVBBVlF2szhehOBB/tGA= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -220,8 +220,8 @@ golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.40.0 h1:79Xs7wF06Gbdcg4kdCCIQArK11Z1hr5POQ6+fIYHNuY= golang.org/x/net v0.40.0/go.mod h1:y0hY0exeL2Pku80/zKK7tpntoX23cqL3Oa6njdgRtds= -golang.org/x/oauth2 v0.29.0 h1:WdYw2tdTK1S8olAzWHdgeqfy+Mtm9XNhv/xJsY65d98= -golang.org/x/oauth2 v0.29.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= +golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -263,14 +263,16 @@ golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.230.0 h1:2u1hni3E+UXAXrONrrkfWpi/V6cyKVAbfGVeGtC3OxM= -google.golang.org/api v0.230.0/go.mod h1:aqvtoMk7YkiXx+6U12arQFExiRV9D/ekvMCwCd/TksQ= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a h1:nwKuGPlUAt+aR+pcrkfFRrTU1BVrSmYyYMxYbUIVHr0= -google.golang.org/genproto/googleapis/api v0.0.0-20250218202821-56aae31c358a/go.mod h1:3kWAYMk1I75K4vykHtKt2ycnOgpA6974V7bREqbsenU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e h1:ztQaXfzEXTmCBvbtWYRhJxW+0iJcz2qXfd38/e9l7bA= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= -google.golang.org/grpc v1.72.0 h1:S7UkcVa60b5AAQTaO6ZKamFp1zMZSU0fGDK2WZLbBnM= -google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/api v0.234.0 h1:d3sAmYq3E9gdr2mpmiWGbm9pHsA/KJmyiLkwKfHBqU4= +google.golang.org/api v0.234.0/go.mod h1:QpeJkemzkFKe5VCE/PMv7GsUfn9ZF+u+q1Q7w6ckxTg= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2 h1:1tXaIXCracvtsRxSBsYDiSBN0cuJvM7QYW+MrpIRY78= +google.golang.org/genproto v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:49MsLSx0oWMOZqcpB3uL8ZOkAh1+TndpJ8ONoCBWiZk= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2 h1:vPV0tzlsK6EzEDHNNH5sa7Hs9bd7iXR7B1tSiPepkV0= +google.golang.org/genproto/googleapis/api v0.0.0-20250505200425-f936aa4a68b2/go.mod h1:pKLAc5OolXC3ViWGI62vvC0n10CpwAtRcTNCFwTKBEw= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= +google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/pkg/config/mixpanel.go b/pkg/config/mixpanel.go index a866dac..f73e0f7 100644 --- a/pkg/config/mixpanel.go +++ b/pkg/config/mixpanel.go @@ -16,7 +16,15 @@ type ( ServerContainer MixpanelServerContainer `json:"serverContainer" yaml:"serverContainer"` } MixpanelServerContainer struct { + // Set events + Set contemplate.Config `json:"set" yaml:"set"` + // SetOnce events + SetOnce contemplate.Config `json:"setOnce" yaml:"setOnce"` + // Reset events + Reset contemplate.Config `json:"reset" yaml:"reset"` // Track events Track contemplate.Config `json:"track" yaml:"track"` + // Identify events + Identify contemplate.Config `json:"identify" yaml:"identify"` } ) diff --git a/pkg/provider/googleads/server.go b/pkg/provider/googleads/server.go index 9fbe035..e083901 100644 --- a/pkg/provider/googleads/server.go +++ b/pkg/provider/googleads/server.go @@ -9,7 +9,7 @@ import ( "github.com/foomo/sesamy-cli/pkg/provider/googleads/server/trigger" "github.com/foomo/sesamy-cli/pkg/provider/googleconsent" googleconsentvariable "github.com/foomo/sesamy-cli/pkg/provider/googleconsent/server/variable" - "github.com/foomo/sesamy-cli/pkg/provider/googletag" + "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager" "github.com/foomo/sesamy-cli/pkg/tagmanager" commonvariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable" "github.com/foomo/sesamy-cli/pkg/tagmanager/server/variable" @@ -23,7 +23,7 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg return err } - gtagFolder, err := googletag.Folder(ctx, tm) + gtmFolder, err := googletagmanager.Folder(ctx, tm) if err != nil { return err } @@ -35,12 +35,12 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg // conversion if cfg.Conversion.Enabled { - value, err := tm.UpsertVariable(ctx, gtagFolder, variable.NewEventData("value")) + value, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData("value")) if err != nil { return err } - currency, err := tm.UpsertVariable(ctx, gtagFolder, variable.NewEventData("currency")) + currency, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData("currency")) if err != nil { return err } diff --git a/pkg/provider/googletagmanager/folder.go b/pkg/provider/googletagmanager/folder.go new file mode 100644 index 0000000..591fb51 --- /dev/null +++ b/pkg/provider/googletagmanager/folder.go @@ -0,0 +1,12 @@ +package googletagmanager + +import ( + "context" + + pkgtagmanager "github.com/foomo/sesamy-cli/pkg/tagmanager" + "google.golang.org/api/tagmanager/v2" +) + +func Folder(ctx context.Context, tm *pkgtagmanager.TagManager) (*tagmanager.Folder, error) { + return tm.UpsertFolder(ctx, "Sesamy - "+Name) +} diff --git a/pkg/provider/googletagmanager/server.go b/pkg/provider/googletagmanager/server.go index e9ea91b..2c18df3 100644 --- a/pkg/provider/googletagmanager/server.go +++ b/pkg/provider/googletagmanager/server.go @@ -12,7 +12,7 @@ import ( ) func Server(ctx context.Context, tm *tagmanager.TagManager, cfg config.GoogleTagManager, enableGeoResolution bool) error { - folder, err := tm.UpsertFolder(ctx, "Sesamy - "+Name) + folder, err := Folder(ctx, tm) if err != nil { return err } diff --git a/pkg/provider/mixpanel/constants.go b/pkg/provider/mixpanel/constants.go index d3dcf8b..0df3c56 100644 --- a/pkg/provider/mixpanel/constants.go +++ b/pkg/provider/mixpanel/constants.go @@ -4,5 +4,5 @@ const ( Tag = "mixpanel" Name = "Mixpanel" NameTagTemplate = "Mixpanel" - NamePrjectTokenConstant = "Project Token" + NamePrjectTokenConstant = "Mixpanel Project Token" ) diff --git a/pkg/provider/mixpanel/server.go b/pkg/provider/mixpanel/server.go index e3b7632..8a25e03 100644 --- a/pkg/provider/mixpanel/server.go +++ b/pkg/provider/mixpanel/server.go @@ -7,7 +7,7 @@ import ( "github.com/foomo/sesamy-cli/pkg/config" "github.com/foomo/sesamy-cli/pkg/provider/googleconsent" googleconsentvariable "github.com/foomo/sesamy-cli/pkg/provider/googleconsent/server/variable" - "github.com/foomo/sesamy-cli/pkg/provider/googletag" + "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager" servertagx "github.com/foomo/sesamy-cli/pkg/provider/mixpanel/server/tag" "github.com/foomo/sesamy-cli/pkg/provider/mixpanel/server/trigger" "github.com/foomo/sesamy-cli/pkg/tagmanager" @@ -24,7 +24,7 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg return err } - gtagFolder, err := googletag.Folder(ctx, tm) + gtmFolder, err := googletagmanager.Folder(ctx, tm) if err != nil { return err } @@ -42,6 +42,114 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg return err } + { // create set tags + eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.Set) + if err != nil { + return err + } + + for event, params := range eventParameters { + var eventTriggerOpts []trigger.EventOption + if cfg.GoogleConsent.Enabled { + if err := googleconsent.ServerEnsure(ctx, tm); err != nil { + return err + } + consentVariable, err := tm.LookupVariable(ctx, googleconsentvariable.GoogleConsentModeName(cfg.GoogleConsent.Mode)) + if err != nil { + return err + } + eventTriggerOpts = append(eventTriggerOpts, trigger.EventWithConsentMode(consentVariable)) + } + + eventParams := map[string]*tagmanager2.Variable{} + for k := range params { + if value, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData(k)); err != nil { + return err + } else { + eventParams[k] = value + } + } + + eventTrigger, err := tm.UpsertTrigger(ctx, folder, trigger.NewEvent(event, eventTriggerOpts...)) + if err != nil { + return errors.Wrap(err, "failed to upsert event trigger: "+event) + } + + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewSet(event, projectToken, template, eventParams, eventTrigger)); err != nil { + return err + } + } + } + + { // create set once tags + eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.SetOnce) + if err != nil { + return err + } + + for event, params := range eventParameters { + var eventTriggerOpts []trigger.EventOption + if cfg.GoogleConsent.Enabled { + if err := googleconsent.ServerEnsure(ctx, tm); err != nil { + return err + } + consentVariable, err := tm.LookupVariable(ctx, googleconsentvariable.GoogleConsentModeName(cfg.GoogleConsent.Mode)) + if err != nil { + return err + } + eventTriggerOpts = append(eventTriggerOpts, trigger.EventWithConsentMode(consentVariable)) + } + + eventParams := map[string]*tagmanager2.Variable{} + for k := range params { + if value, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData(k)); err != nil { + return err + } else { + eventParams[k] = value + } + } + + eventTrigger, err := tm.UpsertTrigger(ctx, folder, trigger.NewEvent(event, eventTriggerOpts...)) + if err != nil { + return errors.Wrap(err, "failed to upsert event trigger: "+event) + } + + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewSetOnce(event, projectToken, template, eventParams, eventTrigger)); err != nil { + return err + } + } + } + + { // create reset tags + eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.Reset) + if err != nil { + return err + } + + for event := range eventParameters { + var eventTriggerOpts []trigger.EventOption + if cfg.GoogleConsent.Enabled { + if err := googleconsent.ServerEnsure(ctx, tm); err != nil { + return err + } + consentVariable, err := tm.LookupVariable(ctx, googleconsentvariable.GoogleConsentModeName(cfg.GoogleConsent.Mode)) + if err != nil { + return err + } + eventTriggerOpts = append(eventTriggerOpts, trigger.EventWithConsentMode(consentVariable)) + } + + eventTrigger, err := tm.UpsertTrigger(ctx, folder, trigger.NewEvent(event, eventTriggerOpts...)) + if err != nil { + return errors.Wrap(err, "failed to upsert event trigger: "+event) + } + + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewReset(event, projectToken, template, eventTrigger)); err != nil { + return err + } + } + } + { // create track tags eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.Track) if err != nil { @@ -63,7 +171,7 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg eventParams := map[string]*tagmanager2.Variable{} for k := range params { - if value, err := tm.UpsertVariable(ctx, gtagFolder, variable.NewEventData(k)); err != nil { + if value, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData(k)); err != nil { return err } else { eventParams[k] = value @@ -75,7 +183,42 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg return errors.Wrap(err, "failed to upsert event trigger: "+event) } - if _, err := tm.UpsertTag(ctx, folder, servertagx.NewEvent(servertagx.TypeTrack, event, projectToken, template, eventParams, eventTrigger)); err != nil { + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewTrack(event, projectToken, template, eventParams, eventTrigger)); err != nil { + return err + } + } + } + + { // create reset tags + eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.Identify) + if err != nil { + return err + } + + for event := range eventParameters { + var eventTriggerOpts []trigger.EventOption + if cfg.GoogleConsent.Enabled { + if err := googleconsent.ServerEnsure(ctx, tm); err != nil { + return err + } + consentVariable, err := tm.LookupVariable(ctx, googleconsentvariable.GoogleConsentModeName(cfg.GoogleConsent.Mode)) + if err != nil { + return err + } + eventTriggerOpts = append(eventTriggerOpts, trigger.EventWithConsentMode(consentVariable)) + } + + eventTrigger, err := tm.UpsertTrigger(ctx, folder, trigger.NewEvent(event, eventTriggerOpts...)) + if err != nil { + return errors.Wrap(err, "failed to upsert event trigger: "+event) + } + + userID, err := tm.UpsertVariable(ctx, gtmFolder, variable.NewEventData("user_id")) + if err != nil { + return err + } + + if _, err := tm.UpsertTag(ctx, folder, servertagx.NewIdentify(event, userID, projectToken, template, eventTrigger)); err != nil { return err } } diff --git a/pkg/provider/mixpanel/server/tag/identify.go b/pkg/provider/mixpanel/server/tag/identify.go new file mode 100644 index 0000000..75209c6 --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/identify.go @@ -0,0 +1,51 @@ +package tag + +import ( + "github.com/foomo/sesamy-cli/pkg/utils" + "google.golang.org/api/tagmanager/v2" +) + +func IdentifyName(v string) string { + return "Mixpanel Identify - " + v +} + +func NewIdentify(name string, identifier, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag { + return &tagmanager.Tag{ + FiringTriggerId: utils.TriggerIDs(triggers), + Name: IdentifyName(name), + TagFiringOption: "oncePerEvent", + Parameter: []*tagmanager.Parameter{ + { + Key: "serverEU", + Type: "boolean", + Value: "true", + }, + { + Key: "logType", + Type: "template", + Value: "debug", + }, + { + Key: "identifier", + Type: "template", + Value: "{{" + identifier.Name + "}}", + }, + { + Key: "identifyAuto", + Type: "boolean", + Value: "true", + }, + { + Key: "type", + Type: "template", + Value: "reset", + }, + { + Key: "token", + Type: "template", + Value: "{{" + projectToken.Name + "}}", + }, + }, + Type: utils.TemplateType(template), + } +} diff --git a/pkg/provider/mixpanel/server/tag/reset.go b/pkg/provider/mixpanel/server/tag/reset.go new file mode 100644 index 0000000..70d2383 --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/reset.go @@ -0,0 +1,41 @@ +package tag + +import ( + "github.com/foomo/sesamy-cli/pkg/utils" + "google.golang.org/api/tagmanager/v2" +) + +func ResetName(v string) string { + return "Mixpanel Reset - " + v +} + +func NewReset(name string, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, triggers ...*tagmanager.Trigger) *tagmanager.Tag { + return &tagmanager.Tag{ + FiringTriggerId: utils.TriggerIDs(triggers), + Name: ResetName(name), + TagFiringOption: "oncePerEvent", + Parameter: []*tagmanager.Parameter{ + { + Key: "serverEU", + Type: "boolean", + Value: "true", + }, + { + Key: "logType", + Type: "template", + Value: "debug", + }, + { + Key: "type", + Type: "template", + Value: "reset", + }, + { + Key: "token", + Type: "template", + Value: "{{" + projectToken.Name + "}}", + }, + }, + Type: utils.TemplateType(template), + } +} diff --git a/pkg/provider/mixpanel/server/tag/set.go b/pkg/provider/mixpanel/server/tag/set.go new file mode 100644 index 0000000..a135f7a --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/set.go @@ -0,0 +1,88 @@ +package tag + +import ( + "maps" + "slices" + + "github.com/foomo/sesamy-cli/pkg/utils" + "google.golang.org/api/tagmanager/v2" +) + +func SetName(v string) string { + return "Mixpanel Set - " + v +} + +func NewSet(name string, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, params map[string]*tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag { + parameter := []*tagmanager.Parameter{ + { + Key: "serverEU", + Type: "boolean", + Value: "true", + }, + { + Key: "logType", + Type: "template", + Value: "debug", + }, + { + Key: "identifyAuto", + Type: "boolean", + Value: "true", + }, + { + Key: "trackName", + Type: "template", + Value: name, + }, + { + Key: "type", + Type: "template", + Value: "profile-set", + }, + { + Key: "token", + Type: "template", + Value: "{{" + projectToken.Name + "}}", + }, + { + Key: "trackFromVariable", + Type: "boolean", + Value: "false", + }, + } + + if len(params) > 0 { + var list []*tagmanager.Parameter + for _, key := range slices.Sorted(maps.Keys(params)) { + param := params[key] + list = append(list, &tagmanager.Parameter{ + Type: "map", + Map: []*tagmanager.Parameter{ + { + Key: "name", + Type: "template", + Value: key, + }, + { + Key: "value", + Type: "template", + Value: "{{" + param.Name + "}}", + }, + }, + }) + } + parameter = append(parameter, &tagmanager.Parameter{ + Key: "userPropertiesTable", + Type: "list", + List: list, + }) + } + + return &tagmanager.Tag{ + FiringTriggerId: utils.TriggerIDs(triggers), + Name: SetName(name), + TagFiringOption: "oncePerEvent", + Parameter: parameter, + Type: utils.TemplateType(template), + } +} diff --git a/pkg/provider/mixpanel/server/tag/setonce.go b/pkg/provider/mixpanel/server/tag/setonce.go new file mode 100644 index 0000000..d4bcc83 --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/setonce.go @@ -0,0 +1,88 @@ +package tag + +import ( + "maps" + "slices" + + "github.com/foomo/sesamy-cli/pkg/utils" + "google.golang.org/api/tagmanager/v2" +) + +func SetOnceName(v string) string { + return "Mixpanel SetOnce - " + v +} + +func NewSetOnce(name string, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, params map[string]*tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag { + parameter := []*tagmanager.Parameter{ + { + Key: "serverEU", + Type: "boolean", + Value: "true", + }, + { + Key: "logType", + Type: "template", + Value: "debug", + }, + { + Key: "identifyAuto", + Type: "boolean", + Value: "true", + }, + { + Key: "trackName", + Type: "template", + Value: name, + }, + { + Key: "type", + Type: "template", + Value: "profile-set-once", + }, + { + Key: "token", + Type: "template", + Value: "{{" + projectToken.Name + "}}", + }, + { + Key: "trackFromVariable", + Type: "boolean", + Value: "false", + }, + } + + if len(params) > 0 { + var list []*tagmanager.Parameter + for _, key := range slices.Sorted(maps.Keys(params)) { + param := params[key] + list = append(list, &tagmanager.Parameter{ + Type: "map", + Map: []*tagmanager.Parameter{ + { + Key: "name", + Type: "template", + Value: key, + }, + { + Key: "value", + Type: "template", + Value: "{{" + param.Name + "}}", + }, + }, + }) + } + parameter = append(parameter, &tagmanager.Parameter{ + Key: "userPropertiesToSetOnce", + Type: "list", + List: list, + }) + } + + return &tagmanager.Tag{ + FiringTriggerId: utils.TriggerIDs(triggers), + Name: SetOnceName(name), + TagFiringOption: "oncePerEvent", + Parameter: parameter, + Type: utils.TemplateType(template), + } +} diff --git a/pkg/provider/mixpanel/server/tag/event.go b/pkg/provider/mixpanel/server/tag/track.go similarity index 83% rename from pkg/provider/mixpanel/server/tag/event.go rename to pkg/provider/mixpanel/server/tag/track.go index c2a8d64..05ba0ad 100644 --- a/pkg/provider/mixpanel/server/tag/event.go +++ b/pkg/provider/mixpanel/server/tag/track.go @@ -8,11 +8,11 @@ import ( "google.golang.org/api/tagmanager/v2" ) -func EventName(v string) string { +func TrackName(v string) string { return "Mixpanel Track - " + v } -func NewEvent(eventType Type, name string, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, params map[string]*tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag { +func NewTrack(name string, projectToken *tagmanager.Variable, template *tagmanager.CustomTemplate, params map[string]*tagmanager.Variable, triggers ...*tagmanager.Trigger) *tagmanager.Tag { parameter := []*tagmanager.Parameter{ { Key: "serverEU", @@ -42,7 +42,7 @@ func NewEvent(eventType Type, name string, projectToken *tagmanager.Variable, te { Key: "type", Type: "template", - Value: eventType.String(), + Value: "track", }, { Key: "token", @@ -85,7 +85,7 @@ func NewEvent(eventType Type, name string, projectToken *tagmanager.Variable, te return &tagmanager.Tag{ FiringTriggerId: utils.TriggerIDs(triggers), - Name: EventName(name), + Name: TrackName(name), TagFiringOption: "oncePerEvent", Parameter: parameter, Type: utils.TemplateType(template), diff --git a/pkg/provider/mixpanel/server/tag/type.go b/pkg/provider/mixpanel/server/tag/type.go deleted file mode 100644 index 5d167ea..0000000 --- a/pkg/provider/mixpanel/server/tag/type.go +++ /dev/null @@ -1,18 +0,0 @@ -package tag - -type Type string - -const ( - TypeAlias Type = "alias" - TypeAppend Type = "append" - TypeGroup Type = "group" - TypeIdentify Type = "identify" - TypeReset Type = "reset" - TypeSet Type = "set" - TypeSetOnce Type = "set-once" - TypeTrack Type = "track" -) - -func (t Type) String() string { - return string(t) -} diff --git a/pkg/tagmanager/server/variable/eventdata.go b/pkg/tagmanager/server/variable/eventdata.go index e2e6f6a..6cf809c 100644 --- a/pkg/tagmanager/server/variable/eventdata.go +++ b/pkg/tagmanager/server/variable/eventdata.go @@ -5,7 +5,7 @@ import ( ) func EventDataName(v string) string { - return "event." + v + return "eventData." + v } func NewEventData(name string) *tagmanager.Variable { diff --git a/pkg/typescript/generator/generate_test.go b/pkg/typescript/generator/generate_test.go index 156f95f..2de6d1c 100644 --- a/pkg/typescript/generator/generate_test.go +++ b/pkg/typescript/generator/generate_test.go @@ -74,9 +74,13 @@ export interface Item { } export interface PageView { - page_title?: string; - page_referrer?: string; + client_id?: string; + language?: string; + page_encoding?: string; page_location?: string; + page_referrer?: string; + page_title?: string; + user_agent?: string; } ` expectedSesamy = ` @@ -106,6 +110,7 @@ export enum EventName { LevelStart = "level_start", LevelUp = "level_up", Login = "login", + Logout = "logout", PageView = "page_view", PostScore = "post_score", Purchase = "purchase", @@ -118,7 +123,6 @@ export enum EventName { SelectContent = "select_content", SelectItem = "select_item", SelectPromotion = "select_promotion", - SessionStart = "session_start", Share = "share", SignUp = "sign_up", SpendVirtualCurrency = "spend_virtual_currency", diff --git a/sesamy.schema.json b/sesamy.schema.json index d91ecfc..7a38e67 100644 --- a/sesamy.schema.json +++ b/sesamy.schema.json @@ -709,9 +709,25 @@ }, "github.com.foomo.sesamy-cli.pkg.config.MixpanelServerContainer": { "properties": { + "set": { + "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", + "description": "Set events" + }, + "setOnce": { + "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", + "description": "SetOnce events" + }, + "reset": { + "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", + "description": "Reset events" + }, "track": { "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", "description": "Track events" + }, + "identify": { + "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", + "description": "Identify events" } }, "additionalProperties": false,