Merge pull request #123 from foomo/feature/mixpanel-event-types

feat(mixpanel): add event types
This commit is contained in:
Kevin Franklin Kim
2025-05-26 23:00:43 +02:00
committed by GitHub
20 changed files with 519 additions and 80 deletions
+3
View File
@@ -16,6 +16,9 @@
## Editorconfig
!.editorconfig
## Ownbrew
!.ownbrew.yaml
## Husky
!.husky/
!.husky.yaml
+3 -3
View File
@@ -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
+1
View File
@@ -1,5 +1,6 @@
.DEFAULT_GOAL := help
-include .makerc
PATH:=bin:$(PATH)
# --- Targets -----------------------------------------------------------------
+13 -13
View File
@@ -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
)
+30 -28
View File
@@ -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=
+8
View File
@@ -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"`
}
)
+4 -4
View File
@@ -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
}
+12
View File
@@ -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)
}
+1 -1
View File
@@ -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
}
+1 -1
View File
@@ -4,5 +4,5 @@ const (
Tag = "mixpanel"
Name = "Mixpanel"
NameTagTemplate = "Mixpanel"
NamePrjectTokenConstant = "Project Token"
NamePrjectTokenConstant = "Mixpanel Project Token"
)
+147 -4
View File
@@ -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
}
}
@@ -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),
}
}
+41
View File
@@ -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),
}
}
+88
View File
@@ -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),
}
}
@@ -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),
}
}
@@ -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),
-18
View File
@@ -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)
}
+1 -1
View File
@@ -5,7 +5,7 @@ import (
)
func EventDataName(v string) string {
return "event." + v
return "eventData." + v
}
func NewEventData(name string) *tagmanager.Variable {
+7 -3
View File
@@ -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",
+16
View File
@@ -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,