From 487358ee89d9617d0131a9778d91f64536ddd8fd Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 23 May 2025 12:32:51 +0200 Subject: [PATCH 1/3] feat: go 1.24.3 --- .golangci.yml | 5 +-- go.mod | 46 +++++++++++------------ go.sum | 101 +++++++++++++++++++++++++------------------------- 3 files changed, 75 insertions(+), 77 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 1cd1de2..9f6c813 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,8 +1,7 @@ version: "2" run: - go: 1.24.1 - build-tags: - - safe + go: 1.24.3 + build-tags: [safe] modules-download-mode: readonly linters: default: none diff --git a/go.mod b/go.mod index 1683498..2f8c0a1 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/foomo/sesamy-cli -go 1.24.1 +go 1.24.3 require ( github.com/Code-Hex/Neo-cowsay/v2 v2.0.4 @@ -8,14 +8,14 @@ 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.9.0 + github.com/foomo/sesamy-go v0.10.0 github.com/invopop/jsonschema v0.13.0 github.com/itchyny/json2yaml v0.1.4 github.com/joho/godotenv v1.5.1 - github.com/knadh/koanf/parsers/yaml v0.1.0 - github.com/knadh/koanf/providers/file v1.1.2 - github.com/knadh/koanf/providers/rawbytes v0.1.0 - github.com/knadh/koanf/v2 v2.1.2 + github.com/knadh/koanf/parsers/yaml v1.0.0 + github.com/knadh/koanf/providers/file v1.2.0 + github.com/knadh/koanf/providers/rawbytes v1.0.0 + github.com/knadh/koanf/v2 v2.2.0 github.com/pkg/errors v0.9.1 github.com/pterm/pterm v0.12.80 github.com/spf13/cobra v1.9.1 @@ -23,14 +23,14 @@ 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.228.0 + google.golang.org/api v0.230.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.15.0 // indirect + cloud.google.com/go/auth v0.16.0 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect github.com/Code-Hex/go-wordwrap v1.0.0 // indirect @@ -41,7 +41,7 @@ require ( github.com/dlclark/regexp2 v1.11.5 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/foomo/gostandards v0.2.0 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-viper/mapstructure/v2 v2.2.1 // indirect @@ -51,42 +51,42 @@ require ( github.com/googleapis/gax-go/v2 v2.14.1 // indirect github.com/gookit/color v1.5.4 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/knadh/koanf/maps v0.1.1 // indirect + github.com/knadh/koanf/maps v0.1.2 // indirect github.com/lithammer/fuzzysearch v1.1.8 // indirect github.com/mailru/easyjson v0.9.0 // indirect github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect github.com/mitchellh/reflectwalk v1.0.2 // indirect - github.com/pelletier/go-toml/v2 v2.2.3 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/sagikazarmark/locafero v0.7.0 // indirect + github.com/sagikazarmark/locafero v0.9.0 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.12.0 // indirect + github.com/spf13/afero v1.14.0 // indirect github.com/spf13/cast v1.7.1 // 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.59.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.uber.org/multierr v1.11.0 // indirect - golang.org/x/crypto v0.36.0 // indirect + golang.org/x/crypto v0.37.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.37.0 // indirect - golang.org/x/oauth2 v0.28.0 // indirect - golang.org/x/sync v0.12.0 // indirect - golang.org/x/sys v0.31.0 // indirect - golang.org/x/term v0.30.0 // indirect - golang.org/x/text v0.23.0 // indirect + golang.org/x/net v0.39.0 // indirect + golang.org/x/oauth2 v0.29.0 // indirect + golang.org/x/sync v0.13.0 // indirect + golang.org/x/sys v0.32.0 // indirect + golang.org/x/term v0.31.0 // indirect + golang.org/x/text v0.24.0 // indirect golang.org/x/tools v0.31.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 // indirect - google.golang.org/grpc v1.71.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/protobuf v1.36.6 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index 20621f9..1bf1ce1 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ 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.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= +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/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= @@ -53,12 +53,12 @@ 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.9.0 h1:pydJkKsAfvGk112HSL9hQj2T+gfsCz7qBJTEVXTM+7c= -github.com/foomo/sesamy-go v0.9.0/go.mod h1:MwbT1lskUrzZH/6LwxZc+slovgMXLLp8LlSK9pZf0HI= +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/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.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -96,16 +96,16 @@ github.com/klauspost/cpuid/v2 v2.0.10/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuOb github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= github.com/klauspost/cpuid/v2 v2.2.3 h1:sxCkb+qR91z4vsqw4vGGZlDgPz3G7gjaLyK3V8y70BU= github.com/klauspost/cpuid/v2 v2.2.3/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= -github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= -github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= -github.com/knadh/koanf/parsers/yaml v0.1.0 h1:ZZ8/iGfRLvKSaMEECEBPM1HQslrZADk8fP1XFUxVI5w= -github.com/knadh/koanf/parsers/yaml v0.1.0/go.mod h1:cvbUDC7AL23pImuQP0oRw/hPuccrNBS2bps8asS0CwY= -github.com/knadh/koanf/providers/file v1.1.2 h1:aCC36YGOgV5lTtAFz2qkgtWdeQsgfxUkxDOe+2nQY3w= -github.com/knadh/koanf/providers/file v1.1.2/go.mod h1:/faSBcv2mxPVjFrXck95qeoyoZ5myJ6uxN8OOVNJJCI= -github.com/knadh/koanf/providers/rawbytes v0.1.0 h1:dpzgu2KO6uf6oCb4aP05KDmKmAmI51k5pe8RYKQ0qME= -github.com/knadh/koanf/providers/rawbytes v0.1.0/go.mod h1:mMTB1/IcJ/yE++A2iEZbY1MLygX7vttU+C+S/YmPu9c= -github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= -github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= +github.com/knadh/koanf/maps v0.1.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo= +github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/parsers/yaml v1.0.0 h1:PXyeHCRhAMKyfLJaoTWsqUTxIFeDMmdAKz3XVEslZV4= +github.com/knadh/koanf/parsers/yaml v1.0.0/go.mod h1:Q63VAOh/s6XaQs6a0TB2w9GFUuuPGvfYrCSWb9eWAQU= +github.com/knadh/koanf/providers/file v1.2.0 h1:hrUJ6Y9YOA49aNu/RSYzOTFlqzXSCpmYIDXI7OJU6+U= +github.com/knadh/koanf/providers/file v1.2.0/go.mod h1:bp1PM5f83Q+TOUu10J/0ApLBd9uIzg+n9UgthfY+nRA= +github.com/knadh/koanf/providers/rawbytes v1.0.0 h1:MrKDh/HksJlKJmaZjgs4r8aVBb/zsJyc/8qaSnzcdNI= +github.com/knadh/koanf/providers/rawbytes v1.0.0/go.mod h1:KxwYJf1uezTKy6PBtfE+m725NGp4GPVA7XoNTJ/PtLo= +github.com/knadh/koanf/v2 v2.2.0 h1:FZFwd9bUjpb8DyCWARUBy5ovuhDs1lI87dOEn2K8UVU= +github.com/knadh/koanf/v2 v2.2.0/go.mod h1:PSFru3ufQgTsI7IF+95rf9s8XA1+aHxKuO/W+dPoHEY= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= @@ -127,8 +127,8 @@ github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 h1:BpfhmL github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/pelletier/go-toml/v2 v2.2.3 h1:YmeHyLY8mFWbdkNWwpr+qIL2bEqT0o95WSdkNHvL12M= -github.com/pelletier/go-toml/v2 v2.2.3/go.mod h1:MfCQTFTvCcUyyvvwm1+G6H/jORL20Xlb6rzQu9GuUkc= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= 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/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -149,14 +149,14 @@ github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUc github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsFaodPcyo= -github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= +github.com/sagikazarmark/locafero v0.9.0 h1:GbgQGNtTrEmddYDSAH9QLRyfAHY12md+8YFTqyMTC9k= +github.com/sagikazarmark/locafero v0.9.0/go.mod h1:UBUyz37V+EdMS3hDF3QWIiVr/2dPrx49OMO0Bn0hJqk= github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= -github.com/spf13/afero v1.12.0 h1:UcOPyRBYczmFn6yvphxkn9ZEOY65cpwGKb5mL36mrqs= -github.com/spf13/afero v1.12.0/go.mod h1:ZTlWwG4/ahT8W7T0WQ5uYmjI9duaLQGy3Q2OAl4sk/4= +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/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= @@ -190,24 +190,24 @@ github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJu github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0 h1:CV7UdSGJt/Ao6Gp4CXckLxVRRsRgDHoI8XjbL3PDl8s= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +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/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= -go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= -go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +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.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= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.36.0 h1:AnAEvhDddvBdpY+uR+MyHmuZzzNqXSe/GvuDeob5L34= -golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0 h1:kJNSjF/Xp7kU0iB2Z+9viTPMW4EqqsrywMXLJOOsXSE= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= @@ -218,15 +218,15 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.37.0 h1:1zLorHbz+LYj7MQlSf1+2tPIIgibq2eL5xkrGk6f+2c= -golang.org/x/net v0.37.0/go.mod h1:ivrbrMbzFq5J41QOQh0siUuly180yBYtLp+CKbEaFx8= -golang.org/x/oauth2 v0.28.0 h1:CrgCKl8PPAVtLnU3c+EDw6x11699EWlsDeWNWKdIOkc= -golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= +golang.org/x/net v0.39.0 h1:ZCu7HMWDxpXpaiKdhzIfaltL9Lp31x/3fCP11bc6/fY= +golang.org/x/net v0.39.0/go.mod h1:X7NRbYVEA+ewNkCNyJ513WmMdQ3BineSwVtN2zD/d+E= +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/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= -golang.org/x/sync v0.12.0 h1:MHc5BpPuC30uJk597Ri8TV3CNZcTLu6B6z4lJy+g6Jw= -golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sync v0.13.0 h1:AauUjRAJ9OSnvULf/ARrrVywoJDy0YS2AwQ98I37610= +golang.org/x/sync v0.13.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -238,22 +238,22 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.31.0 h1:ioabZlmFYtWhL+TRYpcnNlLwhyxaM9kWTDEmfnprqik= -golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/sys v0.32.0 h1:s77OFDvIQeibCmezSnk/q6iAfkdiQaJi4VzroCFrN20= +golang.org/x/sys v0.32.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.30.0 h1:PQ39fJZ+mfadBm0y5WlL4vlM7Sx1Hgf13sMIY2+QS9Y= -golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= +golang.org/x/term v0.31.0 h1:erwDkOK1Msy6offm1mOgvspSkslFnIGsFnxOKoufg3o= +golang.org/x/term v0.31.0/go.mod h1:R4BeIy7D95HzImkxGkTW1UQTtP54tio2RyHz7PwK0aw= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.23.0 h1:D71I7dUrlY+VX0gQShAThNGHFxZ13dGLBHQLVl1mJlY= -golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= +golang.org/x/text v0.24.0 h1:dd5Bzh4yt5KYA8f9CJHCP4FB4D51c2c6JvN37xJJkJ0= +golang.org/x/text v0.24.0/go.mod h1:L8rBsPeo2pSS+xqN0d5u2ikmjtmoJbDBT1b7nHvFCdU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= @@ -263,15 +263,14 @@ 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.228.0 h1:X2DJ/uoWGnY5obVjewbp8icSL5U4FzuCfy9OjbLSnLs= -google.golang.org/api v0.228.0/go.mod h1:wNvRS1Pbe8r4+IfBIniV8fwCpGwTrYa+kMUDiC5z5a4= -google.golang.org/genproto v0.0.0-20241118233622-e639e219e697 h1:ToEetK57OidYuqD4Q5w+vfEnPvPpuTwedCNVohYJfNk= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f h1:gap6+3Gk41EItBuyi4XX/bp4oqJ3UwuIMl25yGinuAA= -google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:Ic02D47M+zbarjYYUlK57y316f2MoN0gjAwI3f2S95o= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4 h1:iK2jbkWL86DXjEx0qiHcRE9dE4/Ahua5k6V8OWFb//c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= -google.golang.org/grpc v1.71.0 h1:kF77BGdPTQ4/JZWMlb9VpJ5pa25aqvVqogsxNHHdeBg= -google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= +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/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= From e3fa04dd0ad5a12e7c6abf629f086d60ddb9cc32 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 23 May 2025 12:33:30 +0200 Subject: [PATCH 2/3] chore: bump action --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 1e000d9..4f681c5 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -26,7 +26,7 @@ jobs: with: token: ${{ secrets.GITHUB_TOKEN }} - - uses: golangci/golangci-lint-action@v7 + - uses: golangci/golangci-lint-action@v8 with: version: latest From 15fc18c62c614f21e2ec32623d4607d3eb5a8043 Mon Sep 17 00:00:00 2001 From: Kevin Franklin Kim Date: Fri, 23 May 2025 12:35:19 +0200 Subject: [PATCH 3/3] feat: add mixpanel provider --- cmd/provision/server.go | 8 ++ cmd/tags.go | 2 + main.go | 1 - pkg/config/config.go | 2 + pkg/config/mixpanel.go | 22 +++++ pkg/provider/criteo/server.go | 2 +- pkg/provider/googleads/folder.go | 12 +++ pkg/provider/googleads/server.go | 12 ++- pkg/provider/googletag/folder.go | 12 +++ pkg/provider/googletag/server.go | 2 +- pkg/provider/googletag/web.go | 2 +- pkg/provider/mixpanel/constants.go | 8 ++ pkg/provider/mixpanel/folder.go | 12 +++ pkg/provider/mixpanel/server.go | 85 +++++++++++++++++ pkg/provider/mixpanel/server/tag/event.go | 93 +++++++++++++++++++ pkg/provider/mixpanel/server/tag/type.go | 18 ++++ pkg/provider/mixpanel/server/trigger/event.go | 75 +++++++++++++++ sesamy.schema.json | 36 +++++++ sesamy.yaml | 35 +++++++ 19 files changed, 432 insertions(+), 7 deletions(-) create mode 100644 pkg/config/mixpanel.go create mode 100644 pkg/provider/googleads/folder.go create mode 100644 pkg/provider/googletag/folder.go create mode 100644 pkg/provider/mixpanel/constants.go create mode 100644 pkg/provider/mixpanel/folder.go create mode 100644 pkg/provider/mixpanel/server.go create mode 100644 pkg/provider/mixpanel/server/tag/event.go create mode 100644 pkg/provider/mixpanel/server/tag/type.go create mode 100644 pkg/provider/mixpanel/server/trigger/event.go diff --git a/cmd/provision/server.go b/cmd/provision/server.go index 2a888da..d6c6cb5 100644 --- a/cmd/provision/server.go +++ b/cmd/provision/server.go @@ -13,6 +13,7 @@ import ( googletagprovider "github.com/foomo/sesamy-cli/pkg/provider/googletag" googletagmanagerprovider "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager" microsoftadsprovider "github.com/foomo/sesamy-cli/pkg/provider/microsoftads" + mixpanelprovider "github.com/foomo/sesamy-cli/pkg/provider/mixpanel" tracifyprovider "github.com/foomo/sesamy-cli/pkg/provider/tracify" umamiprovider "github.com/foomo/sesamy-cli/pkg/provider/umami" ptermx "github.com/foomo/sesamy-cli/pkg/pterm" @@ -136,6 +137,13 @@ func NewServer(l *slog.Logger) *cobra.Command { } } + if cfg.Mixpanel.Enabled && utils.Tag(mixpanelprovider.Tag, tags) { + l.Info("🅿️ Running provider", "name", mixpanelprovider.Name, "tag", mixpanelprovider.Tag) + if err := mixpanelprovider.Server(cmd.Context(), l, tm, cfg.Mixpanel); err != nil { + return errors.Wrap(err, "failed to provision mixpanel") + } + } + if missed := tm.Missed(); len(tags) == 0 && len(missed) > 0 { tree := pterm.TreeNode{ Text: "♻️ Missed resources (potentially garbage)", diff --git a/cmd/tags.go b/cmd/tags.go index 0dd366c..d540743 100644 --- a/cmd/tags.go +++ b/cmd/tags.go @@ -15,6 +15,7 @@ import ( "github.com/foomo/sesamy-cli/pkg/provider/googletagmanager" "github.com/foomo/sesamy-cli/pkg/provider/hotjar" "github.com/foomo/sesamy-cli/pkg/provider/microsoftads" + "github.com/foomo/sesamy-cli/pkg/provider/mixpanel" "github.com/foomo/sesamy-cli/pkg/provider/tracify" "github.com/foomo/sesamy-cli/pkg/provider/umami" "github.com/pterm/pterm" @@ -42,6 +43,7 @@ func NewTags(l *slog.Logger) *cobra.Command { {googletagmanager.Name, googletagmanager.Tag}, {hotjar.Name, hotjar.Tag}, {microsoftads.Name, microsoftads.Tag}, + {mixpanel.Name, mixpanel.Tag}, {tracify.Name, tracify.Tag}, {umami.Name, umami.Tag}, } diff --git a/main.go b/main.go index 4006986..5f60843 100644 --- a/main.go +++ b/main.go @@ -17,7 +17,6 @@ func main() { root := cmd.NewRoot(l) root.AddCommand( - cmd.NewConfig(l), cmd.NewConfig(l), cmd.NewList(l), cmd.NewProvision(l), diff --git a/pkg/config/config.go b/pkg/config/config.go index cd7729f..c4e55cc 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -26,6 +26,8 @@ type Config struct { Facebook Facebook `json:"facebook" yaml:"facebook"` // MicrosoftAds provider settings MicrosoftAds MicrosoftAds `json:"microsoftAds" yaml:"microsoftAds"` + // Mixpanel provider settings + Mixpanel Mixpanel `json:"mixpanel" yaml:"mixpanel"` // Emarsys provider settings Emarsys Emarsys `json:"emarsys" yaml:"emarsys"` // Hotjar provider settings diff --git a/pkg/config/mixpanel.go b/pkg/config/mixpanel.go new file mode 100644 index 0000000..a866dac --- /dev/null +++ b/pkg/config/mixpanel.go @@ -0,0 +1,22 @@ +package config + +import ( + "github.com/foomo/gocontemplate/pkg/contemplate" +) + +type ( + Mixpanel struct { + // Enable provider + Enabled bool `json:"enabled" yaml:"enabled"` + // Mixpanel project token + ProjectToken string `json:"projectToken" yaml:"projectToken"` + // Google Consent settings + GoogleConsent GoogleConsent `json:"googleConsent" yaml:"googleConsent"` + // Google Tag Manager server container settings + ServerContainer MixpanelServerContainer `json:"serverContainer" yaml:"serverContainer"` + } + MixpanelServerContainer struct { + // Track events + Track contemplate.Config `json:"track" yaml:"track"` + } +) diff --git a/pkg/provider/criteo/server.go b/pkg/provider/criteo/server.go index 135c01c..8c7eb37 100644 --- a/pkg/provider/criteo/server.go +++ b/pkg/provider/criteo/server.go @@ -24,7 +24,7 @@ func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg template, err := tm.LookupTemplate(ctx, NameCriteoEventsAPITemplate) if err != nil { if errors.Is(err, tagmanager.ErrNotFound) { - l.Warn("Please install the 'Criteo Events API' template manually first") + l.Warn("Please install the 'Criteo Events API' Tag Template manually first") } return err } diff --git a/pkg/provider/googleads/folder.go b/pkg/provider/googleads/folder.go new file mode 100644 index 0000000..c01b6fc --- /dev/null +++ b/pkg/provider/googleads/folder.go @@ -0,0 +1,12 @@ +package googleads + +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/googleads/server.go b/pkg/provider/googleads/server.go index db1bbf5..f2d1422 100644 --- a/pkg/provider/googleads/server.go +++ b/pkg/provider/googleads/server.go @@ -9,6 +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/tagmanager" commonvariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable" "github.com/foomo/sesamy-cli/pkg/tagmanager/server/variable" @@ -17,7 +18,12 @@ import ( ) func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg config.GoogleAds) error { - folder, err := tm.UpsertFolder(ctx, "Sesamy - "+Name) + folder, err := Folder(ctx, tm) + if err != nil { + return err + } + + gtagFolder, err := googletag.Folder(ctx, tm) if err != nil { return err } @@ -29,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, folder, variable.NewEventData("value")) + value, err := tm.UpsertVariable(ctx, gtagFolder, variable.NewEventData("value")) if err != nil { return err } - currency, err := tm.UpsertVariable(ctx, folder, variable.NewEventData("currency")) + currency, err := tm.UpsertVariable(ctx, gtagFolder, variable.NewEventData("currency")) if err != nil { return err } diff --git a/pkg/provider/googletag/folder.go b/pkg/provider/googletag/folder.go new file mode 100644 index 0000000..bfb5939 --- /dev/null +++ b/pkg/provider/googletag/folder.go @@ -0,0 +1,12 @@ +package googletag + +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/googletag/server.go b/pkg/provider/googletag/server.go index 8a9d0c3..55fe1cf 100644 --- a/pkg/provider/googletag/server.go +++ b/pkg/provider/googletag/server.go @@ -9,7 +9,7 @@ import ( ) func Server(ctx context.Context, tm *tagmanager.TagManager, cfg config.GoogleTag) error { - folder, err := tm.UpsertFolder(ctx, "Sesamy - "+Name) + folder, err := Folder(ctx, tm) if err != nil { return err } diff --git a/pkg/provider/googletag/web.go b/pkg/provider/googletag/web.go index e4fbfa1..8f893aa 100644 --- a/pkg/provider/googletag/web.go +++ b/pkg/provider/googletag/web.go @@ -16,7 +16,7 @@ import ( ) func Web(ctx context.Context, tm *tagmanager.TagManager, cfg config.GoogleTag) 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 new file mode 100644 index 0000000..d3dcf8b --- /dev/null +++ b/pkg/provider/mixpanel/constants.go @@ -0,0 +1,8 @@ +package mixpanel + +const ( + Tag = "mixpanel" + Name = "Mixpanel" + NameTagTemplate = "Mixpanel" + NamePrjectTokenConstant = "Project Token" +) diff --git a/pkg/provider/mixpanel/folder.go b/pkg/provider/mixpanel/folder.go new file mode 100644 index 0000000..462a48d --- /dev/null +++ b/pkg/provider/mixpanel/folder.go @@ -0,0 +1,12 @@ +package mixpanel + +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/mixpanel/server.go b/pkg/provider/mixpanel/server.go new file mode 100644 index 0000000..e3b7632 --- /dev/null +++ b/pkg/provider/mixpanel/server.go @@ -0,0 +1,85 @@ +package mixpanel + +import ( + "context" + "log/slog" + + "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" + 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" + commonvariable "github.com/foomo/sesamy-cli/pkg/tagmanager/common/variable" + "github.com/foomo/sesamy-cli/pkg/tagmanager/server/variable" + "github.com/foomo/sesamy-cli/pkg/utils" + "github.com/pkg/errors" + tagmanager2 "google.golang.org/api/tagmanager/v2" +) + +func Server(ctx context.Context, l *slog.Logger, tm *tagmanager.TagManager, cfg config.Mixpanel) error { + folder, err := Folder(ctx, tm) + if err != nil { + return err + } + + gtagFolder, err := googletag.Folder(ctx, tm) + if err != nil { + return err + } + + template, err := tm.LookupTemplate(ctx, NameTagTemplate) + if err != nil { + if errors.Is(err, tagmanager.ErrNotFound) { + l.Warn("Please install the 'Mixpanel' by stape-io Tag Template manually first") + } + return err + } + + projectToken, err := tm.UpsertVariable(ctx, folder, commonvariable.NewConstant(NamePrjectTokenConstant, cfg.ProjectToken)) + if err != nil { + return err + } + + { // create track tags + eventParameters, err := utils.LoadEventParams(ctx, cfg.ServerContainer.Track) + 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, gtagFolder, 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.NewEvent(servertagx.TypeTrack, event, projectToken, template, eventParams, eventTrigger)); err != nil { + return err + } + } + } + + return nil +} diff --git a/pkg/provider/mixpanel/server/tag/event.go b/pkg/provider/mixpanel/server/tag/event.go new file mode 100644 index 0000000..c2a8d64 --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/event.go @@ -0,0 +1,93 @@ +package tag + +import ( + "maps" + "slices" + + "github.com/foomo/sesamy-cli/pkg/utils" + "google.golang.org/api/tagmanager/v2" +) + +func EventName(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 { + parameter := []*tagmanager.Parameter{ + { + Key: "serverEU", + Type: "boolean", + Value: "true", + }, + { + Key: "logType", + Type: "template", + Value: "debug", + }, + { + Key: "trackCommonData", + Type: "boolean", + Value: "true", + }, + { + Key: "identifyAuto", + Type: "boolean", + Value: "true", + }, + { + Key: "trackName", + Type: "template", + Value: name, + }, + { + Key: "type", + Type: "template", + Value: eventType.String(), + }, + { + 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: "trackParameters", + Type: "list", + List: list, + }) + } + + return &tagmanager.Tag{ + FiringTriggerId: utils.TriggerIDs(triggers), + Name: EventName(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 new file mode 100644 index 0000000..5d167ea --- /dev/null +++ b/pkg/provider/mixpanel/server/tag/type.go @@ -0,0 +1,18 @@ +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/provider/mixpanel/server/trigger/event.go b/pkg/provider/mixpanel/server/trigger/event.go new file mode 100644 index 0000000..9cf6dad --- /dev/null +++ b/pkg/provider/mixpanel/server/trigger/event.go @@ -0,0 +1,75 @@ +package trigger + +import ( + "google.golang.org/api/tagmanager/v2" +) + +func EventName(v string) string { + return "Mixpanel - " + v +} + +type ( + EventOptions struct { + consentMode *tagmanager.Variable + } + EventOption func(*EventOptions) +) + +func EventWithConsentMode(mode *tagmanager.Variable) EventOption { + return func(o *EventOptions) { + o.consentMode = mode + } +} + +func NewEvent(name string, opts ...EventOption) *tagmanager.Trigger { + o := &EventOptions{} + for _, opt := range opts { + if opt != nil { + opt(o) + } + } + + var filter []*tagmanager.Condition + if o.consentMode != nil { + filter = append(filter, + &tagmanager.Condition{ + Parameter: []*tagmanager.Parameter{ + { + Key: "arg0", + Type: "template", + Value: "{{" + o.consentMode.Name + "}}", + }, + { + Key: "arg1", + Type: "template", + Value: "granted", + }, + }, + Type: "equals", + }, + ) + } + + return &tagmanager.Trigger{ + Type: "customEvent", + Name: EventName(name), + CustomEventFilter: []*tagmanager.Condition{ + { + Parameter: []*tagmanager.Parameter{ + { + Key: "arg0", + Type: "template", + Value: "{{_event}}", + }, + { + Key: "arg1", + Type: "template", + Value: name, + }, + }, + Type: "equals", + }, + }, + Filter: filter, + } +} diff --git a/sesamy.schema.json b/sesamy.schema.json index ac5b585..47e40be 100644 --- a/sesamy.schema.json +++ b/sesamy.schema.json @@ -95,6 +95,10 @@ "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.MicrosoftAds", "description": "MicrosoftAds provider settings" }, + "mixpanel": { + "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.Mixpanel", + "description": "Mixpanel provider settings" + }, "emarsys": { "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.Emarsys", "description": "Emarsys provider settings" @@ -669,6 +673,38 @@ "additionalProperties": false, "type": "object" }, + "github.com.foomo.sesamy-cli.pkg.config.Mixpanel": { + "properties": { + "enabled": { + "type": "boolean", + "description": "Enable provider" + }, + "projectToken": { + "type": "string", + "description": "Mixpanel project token" + }, + "googleConsent": { + "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.GoogleConsent", + "description": "Google Consent settings" + }, + "serverContainer": { + "$ref": "#/$defs/github.com.foomo.sesamy-cli.pkg.config.MixpanelServerContainer", + "description": "Google Tag Manager server container settings" + } + }, + "additionalProperties": false, + "type": "object" + }, + "github.com.foomo.sesamy-cli.pkg.config.MixpanelServerContainer": { + "properties": { + "track": { + "$ref": "#/$defs/github.com.foomo.gocontemplate.pkg.contemplate.Config", + "description": "Track events" + } + }, + "additionalProperties": false, + "type": "object" + }, "github.com.foomo.sesamy-cli.pkg.config.Tracify": { "properties": { "enabled": { diff --git a/sesamy.yaml b/sesamy.yaml index 8cf7d30..90e56c1 100644 --- a/sesamy.yaml +++ b/sesamy.yaml @@ -439,3 +439,38 @@ cookiebot: adUserData: denied # Default consent ad_personalization adPersonalization: denied + +# --- Mixpanel +mixpanel: + # Enable provider + enabled: true + # Project Token + projectToken: '' + # Google Consent settings + googleConsent: + # Enable consent mode + enabled: true + # Consent mode name + mode: analytics_storage + # Google Tag Manager server container settings + serverContainer: + # Track events + track: + # Directory containing the go.mod file + directory: . + # Contemplate package config for generated events + packages: + - path: 'github.com/foomo/sesamy-go/pkg/event' + types: + - AddPaymentInfo + - AddShippingInfo + - AddToCart + - BeginCheckout + - PageView + - Purchase + - RemoveFromCart + - Search + - SelectItem + - ViewCart + - ViewItem + - ViewItemList