Compare commits

..

241 Commits

Author SHA1 Message Date
Renovate ecc4da28ff fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.225 2025-09-09 14:59:00 +00:00
Renovate 4a14f41324 chore(deps): update golang:1.25.1 docker digest to 53f7808 2025-09-08 23:23:22 +00:00
Renovate 3f8fdce292 chore(deps): update golang docker tag to v1.25.1 2025-09-03 19:58:22 +00:00
Renovate 335c419a44 chore(deps): update goreleaser/goreleaser docker tag to v2.12.0 2025-09-03 03:57:02 +00:00
Renovate 82d2aa1812 fix(deps): update module go.opentelemetry.io/contrib/bridges/otelslog to v0.13.0 2025-09-01 11:25:33 +02:00
Renovate 24bbb39c3d fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.224 2025-09-01 08:57:51 +00:00
Renovate d98a20afff fix(deps): update opentelemetry-go monorepo 2025-08-29 20:07:41 +00:00
Renovate 737b133b8b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.223 2025-08-28 09:57:27 +00:00
Renovate 177f923fc2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.222 2025-08-28 08:52:22 +02:00
Renovate fd0c89dce9 fix(deps): update module github.com/stretchr/testify to v1.11.1 2025-08-27 12:00:45 +00:00
Renovate 1e58f8e0d5 fix(deps): update module github.com/pressly/goose/v3 to v3.25.0 2025-08-25 08:34:02 +02:00
Renovate 53349071aa fix(deps): update module github.com/stretchr/testify to v1.11.0 2025-08-24 16:59:02 +00:00
Renovate efe9e0a5a0 chore(deps): update golang:1.25.0 docker digest to f6b9e1a 2025-08-22 18:58:38 +00:00
Unbound Release 406cb8e4d0 chore(release): prepare for v0.6.2 2025-08-22 13:47:28 +00:00
argoyle 6e7ee0110b chore: remove conflicts entry from homebrew-taps config
Remove the conflicts entry for the unbound-schemas formula in the 
homebrew-taps configuration to simplify the integration process. This 
change enhances compatibility and streamlines the build setup.
2025-08-22 15:32:55 +02:00
Unbound Release 6eac3a7796 chore(release): prepare for v0.6.1 2025-08-22 14:33:00 +02:00
Renovate 890a6fd50e fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.221 2025-08-22 09:58:39 +00:00
Renovate e1cf0d8cb3 chore(deps): update golang docker tag to v1.25.0 2025-08-14 18:57:49 +00:00
Renovate 63d70d7e35 chore(deps): update golang:1.24.6 docker digest to cd8f653 2025-08-14 13:57:53 +00:00
Renovate 35a454f8b1 fix(deps): update module github.com/sparetimecoders/goamqp to v0.3.3 2025-08-14 13:01:31 +00:00
Renovate 6651553246 chore(deps): update pre-commit hook golangci/golangci-lint to v2.4.0 2025-08-13 20:58:38 +00:00
Renovate 311ef3f530 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.220 2025-08-13 09:58:44 +00:00
Renovate d8cce2fb05 chore(deps): update golang:1.24.6 docker digest to 958bfd1 2025-08-12 22:58:04 +00:00
Renovate 309b9423a4 chore(deps): update pre-commit hook pre-commit/pre-commit-hooks to v6 2025-08-09 19:58:04 +00:00
Renovate 323145a076 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.219 2025-08-08 10:57:11 +00:00
Renovate 28b4dc5572 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.218 2025-08-07 15:57:39 +00:00
Renovate c1173c20ae chore(deps): update golang docker tag to v1.24.6 2025-08-06 20:58:16 +00:00
Renovate 2d12077016 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.217 2025-08-06 12:57:31 +00:00
Renovate c38db83cd1 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.216 2025-08-06 09:58:51 +00:00
Renovate 25bd438d05 chore(deps): update pre-commit hook golangci/golangci-lint to v2.3.1 2025-08-02 21:58:23 +00:00
Renovate f4355d620f fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.3.0 2025-07-31 22:14:05 +02:00
Renovate 887ba69c5e fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.215 2025-07-31 22:12:36 +02:00
Renovate 8e6c7aade7 chore(deps): update goreleaser/goreleaser docker tag to v2.11.2 2025-07-31 14:11:53 +00:00
Renovate 0f0f50111f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.213 2025-07-29 00:05:28 +00:00
Renovate 81a895e5a6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.212 2025-07-28 15:57:36 +00:00
Renovate 0fab1d5098 fix(deps): update module github.com/99designs/gqlgen to v0.17.78 2025-07-28 12:21:43 +02:00
Renovate 4fbfc0f42e chore(deps): update goreleaser/goreleaser docker tag to v2.11.1 2025-07-25 02:57:47 +00:00
Renovate 0ba3706c12 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.210 2025-07-22 19:56:58 +00:00
Renovate c44ac87b5e chore(deps): update golang:1.24.5 docker digest to 0a156a4 2025-07-22 04:57:28 +00:00
Renovate deefcd7045 chore(deps): update pre-commit hook golangci/golangci-lint to v2.3.0 2025-07-21 20:04:12 +02:00
Renovate 4933857351 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.208 2025-07-21 14:57:27 +00:00
Renovate 18616e8346 fix(deps): update module github.com/alecthomas/kong to v1.12.1 2025-07-21 07:37:41 +02:00
Renovate dd075afb8d chore(deps): update pre-commit hook gitleaks/gitleaks to v8.28.0 2025-07-20 16:56:45 +00:00
Renovate 003bd3cd50 fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.3 2025-07-15 21:09:48 +02:00
Renovate a68fb437dc fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.207 2025-07-15 17:54:08 +00:00
Renovate 8aa57e8f68 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.2 2025-07-11 12:54:20 +00:00
Renovate 84e8764054 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.204 2025-07-11 06:54:06 +00:00
Renovate c40bbad892 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.203 2025-07-10 09:54:19 +00:00
Renovate c159c6d20e chore(deps): update goreleaser/goreleaser docker tag to v2.11.0 2025-07-09 21:49:06 +02:00
Renovate ae0d796e93 chore(deps): update golang docker tag to v1.24.5 2025-07-09 18:55:13 +00:00
Renovate 1ec0f9a3a7 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.202 2025-07-09 12:54:39 +00:00
Renovate 0dad651959 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.200 2025-07-08 15:54:10 +00:00
Renovate 24fcc4e6a2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.199 2025-07-07 15:54:28 +00:00
Renovate 4c7406d97b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.198 2025-07-04 12:54:27 +00:00
Renovate 51affc5a55 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.197 2025-07-03 11:54:02 +00:00
Renovate 10871a9b32 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.196 2025-07-02 17:54:39 +00:00
Renovate 411b51f895 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.195 2025-07-02 02:22:25 +00:00
Renovate 6a478209ea chore(deps): update golang:1.24.4 docker digest to 9f820b6 2025-07-01 05:54:30 +00:00
Renovate 043ca65698 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.1 2025-06-29 21:53:56 +00:00
Unbound Release 8131042a1c chore(release): prepare for v0.6.0 2025-06-29 13:35:39 +02:00
Renovate 2fb2c1947a fix(deps): update module github.com/99designs/gqlgen to v0.17.76 2025-06-29 10:25:22 +02:00
Renovate 1cf4faa17f fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.30 2025-06-28 23:55:22 +00:00
Renovate 8bb6cb7279 chore(deps): update pre-commit hook golangci/golangci-lint to v2.2.0 2025-06-28 20:54:12 +00:00
Renovate 376ae41b4f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.194 2025-06-28 09:21:08 +02:00
Renovate dc6e57e815 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.29 2025-06-27 21:54:30 +00:00
Renovate f8c7de447a fix(deps): update module go.opentelemetry.io/contrib/bridges/otelslog to v0.12.0 2025-06-25 20:02:41 +00:00
Renovate 92050aa31f fix(deps): update opentelemetry-go monorepo 2025-06-25 07:54:48 +00:00
Renovate e20829bb2b fix(deps): update module github.com/alecthomas/kong to v1.12.0 2025-06-25 00:54:50 +00:00
Renovate 1918ec3da4 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.192 2025-06-19 09:03:08 +00:00
Renovate 735c387c58 fix(deps): update module github.com/99designs/gqlgen to v0.17.75 2025-06-16 14:55:10 +00:00
Renovate 98e2f660a6 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.28 2025-06-15 20:54:42 +00:00
Renovate 7a0159a33f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.190 2025-06-13 16:54:19 +00:00
argoyle b4447bb15e feat: add build version injection via CI_COMMIT argument
Inject the build version into the binary using the CI_COMMIT 
argument for better traceability of deployments. Update the 
Dockerfile to pass the commit hash to the build process, 
ensuring that each build contains version information tied 
to the specific commit.
2025-06-13 13:26:56 +02:00
argoyle 2948905005 feat(k8s): add OpenTelemetry exporter endpoint to deploy.yaml
Add the OTEL_EXPORTER_OTLP_ENDPOINT environment variable to 
the deployment configuration. This change enables the application 
to send telemetry data to the specified OpenTelemetry collector 
endpoint for better monitoring and observability.
2025-06-13 11:36:19 +02:00
Unbound Release 53141720ca chore(release): prepare for v0.5.3 2025-06-13 11:28:30 +02:00
argoyle e84df1db08 refactor: remove Sentry integration and replace with OpenTelemetry
Remove Sentry dependencies and configuration. Introduce monitoring 
setup for OpenTelemetry. Update logging to include log format 
options, and replace Sentry error handling middleware with 
monitoring handlers for GraphQL playground. Adjust environment 
variable handling to enhance configuration clarity and flexibility.
2025-06-13 11:00:52 +02:00
Renovate 9539e6bb1b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.189 2025-06-12 19:14:49 +00:00
Renovate 291ef08ad7 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.188 2025-06-11 17:54:30 +00:00
Renovate 98b84772df chore(deps): update golang:1.24.4 docker digest to 3494bbe 2025-06-11 03:01:58 +00:00
Renovate 26278066b8 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.187 2025-06-10 10:53:51 +00:00
Unbound Release 5bdacce71a chore(release): prepare for v0.5.2 2025-06-09 06:33:38 +00:00
argoyle 0b4bbdeef0 fix(goreleaser): specify binary name in configuration
Adds the binary name "schemactl" to the Goreleaser 
configuration file to ensure proper build and release 
process for the Homebrew tap. This improves clarity 
and correctness in the configuration.
2025-06-09 08:22:34 +02:00
Unbound Release 3c3c939447 chore(release): prepare for v0.5.1 2025-06-09 08:00:57 +02:00
Renovate 93a12a2909 chore(deps): update goreleaser/goreleaser docker tag to v2.10.2 2025-06-09 07:10:55 +02:00
Renovate c36802570a chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.2 2025-06-09 00:54:24 +00:00
Renovate 5d64a3a45c chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.1 2025-06-08 02:53:51 +00:00
Renovate e55d3400e6 chore(deps): update golang docker tag to v1.24.4 2025-06-05 20:54:48 +00:00
Renovate 7da95e7566 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.186 2025-06-05 14:54:09 +00:00
Renovate b8ea2690fc fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.185 2025-06-04 10:54:07 +00:00
Renovate 3689486fa8 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.184 2025-06-03 22:54:02 +00:00
Renovate 1787815299 fix(deps): update module github.com/99designs/gqlgen to v0.17.74 2025-06-02 17:56:04 +00:00
Renovate 2886835d18 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.27.0 2025-06-01 16:54:04 +00:00
Renovate 097e1274db fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.183 2025-05-28 18:55:37 +00:00
Renovate 640ede7de2 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.182 2025-05-27 10:53:51 +00:00
Renovate 122c87dab4 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.181 2025-05-23 10:53:47 +00:00
Renovate 4647d7ad1e chore(deps): update golang:1.24.3 docker digest to f255a7d 2025-05-22 11:23:04 +02:00
Renovate f2c73e8bf6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.180 2025-05-21 16:54:04 +00:00
Renovate ba7bbd082a fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.179 2025-05-19 11:54:14 +00:00
Renovate 2466d2a4ab fix(deps): update module github.com/khan/genqlient to v0.8.1 2025-05-18 19:53:47 +00:00
Renovate 86a61a1a64 fix(deps): update module github.com/getsentry/sentry-go to v0.33.0 2025-05-15 12:55:30 +00:00
Renovate 75e85c0339 fix(deps): update module github.com/alecthomas/kong to v1.11.0 2025-05-15 11:04:36 +00:00
Unbound Release d654ef1b81 chore(release): prepare for v0.5.0 2025-05-15 12:57:56 +02:00
argoyle 55114c3d39 fix(k8s): update apiVersion for external secrets
Update apiVersion in the secrets.yaml file from v1beta1 to v1 to 
ensure compatibility with the latest external-secrets API. This 
change maintains the stability and functionality of secrets 
management in Kubernetes deployments.
2025-05-15 10:17:09 +02:00
Renovate 0575c45d66 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.26.0 2025-05-12 21:54:21 +00:00
Renovate d004745244 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.27 2025-05-07 11:54:54 +00:00
Renovate 36ef6a85c2 fix(deps): update module github.com/pressly/goose/v3 to v3.24.3 2025-05-07 01:55:31 +00:00
Renovate aa8363428f chore(deps): update golang docker tag to v1.24.3 2025-05-06 20:54:50 +00:00
Renovate 36a387040f fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.178 2025-05-06 17:56:47 +00:00
Renovate 5cf10efe15 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.177 2025-05-06 14:54:10 +00:00
Renovate 73624e21d7 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.6 2025-05-04 15:53:50 +00:00
Renovate f53321368d fix(deps): update module github.com/99designs/gqlgen to v0.17.73 2025-05-03 16:37:30 +02:00
argoyle 59e0f17769 chore(ci): update GitLab CI configuration for templates
Adds a new template file 'Defaults.gitlab-ci.yml' to the CI
configuration and adjusts the include path for clarity. This
ensures better organization and standardization in the CI/CD
processes associated with the project.
2025-05-01 09:23:30 +02:00
Renovate 8661c931a1 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.176 2025-04-30 20:54:01 +00:00
Renovate f484bea8c4 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.25.1 2025-04-30 13:54:22 +00:00
Renovate 8c4f579cef chore(deps): update goreleaser/goreleaser docker tag to v2.9.0 2025-04-30 02:53:40 +00:00
Renovate 30ccbf9aab fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.175 2025-04-29 16:54:01 +00:00
Renovate 5973c1341d chore(deps): update pre-commit hook gitleaks/gitleaks to v8.25.0 2025-04-29 14:54:52 +00:00
Renovate 0285549431 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.174 2025-04-29 13:54:18 +00:00
argoyle 3256819705 feat(k8s): add PodDisruptionBudget for schemas service
Create a PodDisruptionBudget to ensure minimum availability of the 
schemas service during voluntary disruptions. This enhances the 
service's resilience and ensures high availability.
2025-04-29 09:51:37 +02:00
Renovate 578354ddeb chore(deps): update golang:1.24.2 docker digest to bf7899c 2025-04-29 07:39:48 +02:00
Renovate 12adc9bc48 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.173 2025-04-25 22:54:16 +00:00
Renovate a44937e130 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.5 2025-04-24 19:54:11 +00:00
Renovate 04a88bf310 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.26 2025-04-24 18:54:31 +00:00
Renovate c1e5ee97ee chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.4 2025-04-24 17:56:17 +00:00
Unbound Release 66dd948181 chore(release): prepare for v0.4.1 2025-04-24 14:44:21 +02:00
Renovate 6fc87e952b fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.172 2025-04-22 18:54:20 +00:00
Renovate dade16a10c fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.171 2025-04-22 09:55:07 +00:00
Renovate aa617ae11d fix(deps): update module github.com/99designs/gqlgen to v0.17.72 2025-04-19 00:56:32 +00:00
Renovate a87b480345 fix(deps): update module github.com/99designs/gqlgen to v0.17.71 2025-04-18 10:23:36 +02:00
Renovate 69e232cd7c fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.170 2025-04-17 19:53:50 +00:00
Renovate 5adfe0e711 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.25 2025-04-17 12:55:01 +00:00
Renovate 7fa947a945 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.2 2025-04-15 13:55:14 +00:00
Renovate a4552cb418 chore(deps): update pre-commit hook golangci/golangci-lint to v2.1.1 2025-04-12 18:55:16 +00:00
Unbound Release c15371c236 chore(release): prepare for v0.4.0 2025-04-12 14:08:29 +02:00
argoyle aaa111dd20 feat(service): implement graceful shutdown for HTTP server
Add a context with timeout to handle graceful shutdown of the HTTP 
server. Update error handling during the server's close to include 
context-aware shutdown. Ensure that the server properly logs only 
non-closed errors when listening.
2025-04-12 13:41:02 +02:00
argoyle 8e02bfb0a2 refactor(deploy): remove cpu and memory limits for schemas
Removes the CPU and memory limits for the schemas container in the
Kubernetes deployment configuration. This change is made to allow
for greater flexibility in resource allocation based on runtime
demands, ensuring better performance in varying load conditions.
2025-04-12 10:44:13 +02:00
Renovate 1e34fe77eb chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.3 2025-04-11 14:54:14 +00:00
Renovate 30ca9091d2 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.8.1 2025-04-11 09:56:34 +00:00
argoyle 4dd79e3d73 fix(k8s): increase CPU request for better performance
Adjusts the CPU requests from "10m" to "20m" in the deploy.yaml file to 
improve application performance and ensure stability under load.
2025-04-10 17:19:48 +02:00
Renovate bdfbf6c22e fix(deps): update module github.com/getsentry/sentry-go to v0.32.0 2025-04-10 09:56:22 +00:00
Renovate b6a281b5f2 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.24 2025-04-09 22:54:35 +00:00
Renovate e8305441bb fix(deps): update module github.com/sparetimecoders/goamqp to v0.3.2 2025-04-09 13:55:36 +00:00
argoyle dd5c0f3dc0 fix(secrets): remove namespace from ExternalSecret definition
This change removes the namespace field from the ExternalSecret 
definition in the secrets.yaml file, allowing for more flexible 
deployment within different namespaces without the need for 
modification.
2025-04-08 11:27:12 +02:00
Unbound Release f35be93cb6 chore(release): prepare for v0.3.0 2025-04-08 10:42:13 +02:00
Renovate 3840c40c90 chore(deps): update golang:1.24.2 docker digest to aebb7df 2025-04-08 08:24:05 +02:00
argoyle 2ba10d763d feat(k8s): add RabbitMQ configurations and update secrets
Add a new extract for RabbitMQ in the secrets and include
AMQP_URL in local secrets. Update the merge policy and
engine version in the deployment template. Remove unused
RabbitMQ secret reference from the deployment. These changes
improve configuration management and ensure consistency
between environments.
2025-04-08 07:49:54 +02:00
Renovate ba099eff51 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.169 2025-04-07 16:54:25 +00:00
Renovate 2196f5a417 chore(deps): update golang docker tag to v1.24.2 2025-04-01 22:31:52 +02:00
Renovate 3e26aa0166 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.168 2025-04-01 16:54:09 +00:00
Renovate fdf6402b7c fix(deps): update eventsourced 2025-04-01 12:54:52 +00:00
Renovate c6a5711dff fix(deps): update module github.com/alecthomas/kong to v1.10.0 2025-04-01 07:26:41 +02:00
Renovate f82935e71a chore(deps): update goreleaser/goreleaser docker tag to v2.8.2 2025-04-01 02:53:25 +00:00
Renovate b8053b6273 fix(deps): update module github.com/pressly/goose/v3 to v3.24.2 2025-03-28 02:54:25 +00:00
Renovate 4086ddf73c fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.1 2025-03-27 08:55:53 +00:00
Renovate 8d5ff3863d fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.167 2025-03-26 23:53:39 +00:00
Renovate 19233af4a7 fix(deps): update module github.com/99designs/gqlgen to v0.17.70 2025-03-26 14:54:27 +00:00
Renovate b6ed3c7ad9 fix(deps): update module github.com/99designs/gqlgen to v0.17.69 2025-03-26 08:53:17 +01:00
Renovate 05eaa96d37 chore(deps): update pre-commit hook golangci/golangci-lint to v2.0.2 2025-03-26 08:47:48 +01:00
Renovate 9b8f98c2d2 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.0 2025-03-25 20:54:41 +00:00
Renovate d6a862ee94 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.166 2025-03-25 17:54:57 +00:00
Renovate 574e6c8926 chore(deps): update pre-commit hook golangci/golangci-lint to v2.0.1 2025-03-24 20:53:49 +00:00
Renovate 15eda6f0de chore(deps): update pre-commit hook golangci/golangci-lint to v2 2025-03-24 14:45:39 +01:00
Renovate 46b624568e chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.2 2025-03-22 12:53:29 +00:00
Renovate 72bbf92265 fix(deps): update module github.com/golang-jwt/jwt/v5 to v5.2.2 2025-03-21 20:53:44 +00:00
Renovate 313e43016b chore(deps): update golang:1.24.1 docker digest to 5ecf333 2025-03-18 03:53:41 +00:00
Renovate 570a0114b3 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.8 2025-03-17 20:53:41 +00:00
Renovate a9c07bf4c2 fix(deps): update module github.com/99designs/gqlgen to v0.17.68 2025-03-17 08:39:58 +01:00
Renovate f126c23b45 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.165 2025-03-14 12:53:49 +00:00
Renovate 65dc35a5fc chore(deps): update goreleaser/goreleaser docker tag to v2.8.1 2025-03-14 02:53:00 +00:00
Renovate b57080c9d0 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.164 2025-03-13 18:54:37 +00:00
Renovate 19a826608c chore(deps): update goreleaser/goreleaser docker tag to v2.8.0 2025-03-13 04:53:08 +00:00
Renovate 316d4a4c34 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.7 2025-03-11 23:53:18 +00:00
Renovate 48873bf5ee chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.22.0 2025-03-11 14:53:36 +00:00
Renovate f9cce092b5 fix(deps): update module github.com/alecthomas/kong to v1.9.0 2025-03-11 06:53:43 +00:00
Renovate ae8aa21388 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.1 2025-03-10 16:01:25 +00:00
Renovate 7ba1d3ae08 fix(deps): update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.0 2025-03-09 19:54:00 +00:00
Renovate fd6e4a0cbd fix(deps): update module github.com/auth0/go-jwt-middleware/v2 to v2.3.0 2025-03-05 10:53:54 +00:00
Renovate 856b140538 chore(deps): update golang docker tag to v1.24.1 2025-03-05 11:22:36 +01:00
Renovate fdfbf823a6 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.163 2025-03-04 19:54:01 +00:00
Renovate 697e6c3d75 fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.162 2025-03-03 15:53:43 +00:00
Renovate fdbb57e33a fix(deps): update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.161 2025-03-03 13:53:34 +00:00
Renovate 07057d7206 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.6 2025-03-02 23:53:20 +00:00
Unbound Release d0afaa7815 chore(release): prepare for v0.2.0 2025-02-28 12:49:26 +00:00
argoyle ee378dc6a3 feat(sdlmerge): add shared types for GraphQL schema handling
Introduce types for managing fielded, enum, union, and scalar shared types.
Implement functionality for comparing values and creating field sets.
Enhance schema extensions by integrating new visitors for enum types.
2025-02-28 13:10:07 +01:00
Renovate 7ffa9a3881 fix(deps): update module github.com/vektah/gqlparser/v2 to v2.5.23 2025-02-27 23:35:06 +01:00
Renovate 683bf6bd85 fix(deps): update eventsourced 2025-02-27 20:24:02 +01:00
argoyle 17a3edbc07 feat(dependencies): add Eventsourced package group for updates
Adds a new package group for Eventsourced to the Renovate configuration.  
This change improves dependency management by organizing related  
packages under a specific group for better update tracking.
2025-02-27 20:24:02 +01:00
argoyle 318e211196 chore(docker): update base image architecture to amd64
Change the base image in the Dockerfile to use the amd64
architecture. This ensures compatibility with the target
environment and resolves issues related to image
compatibility during the build process.
2025-02-27 20:23:53 +01:00
Renovate bf0b8f5935 chore(deps): update golang:1.24.0 docker digest to 58cf31c 2025-02-25 18:54:36 +00:00
Renovate 1232ca62b2 chore(deps): update golang:1.24.0 docker digest to a14c5a6 2025-02-25 12:53:28 +00:00
Renovate f6a1e47361 chore(deps): update golang:1.24.0 docker digest 2025-02-25 06:53:30 +00:00
Renovate f96e6e860b chore(deps): update pre-commit hook gitleaks/gitleaks to v8.24.0 2025-02-20 02:53:59 +00:00
Renovate 44cc6ccd16 fix(deps): update module github.com/99designs/gqlgen to v0.17.66 2025-02-15 16:33:11 +00:00
Renovate 6abc49a3fc chore(deps): update pre-commit hook alessandrojcm/commitlint-pre-commit-hook to v9.21.0 2025-02-15 14:53:53 +00:00
Renovate 7d7836fedf fix(deps): update module github.com/99designs/gqlgen to v0.17.65 2025-02-15 00:55:15 +00:00
argoyle f62a8037bc fix(deps): update dependencies to latest versions
Updates the following dependencies to their latest stable versions:
- golang.org/x/crypto to v0.33.0
- golang.org/x/mod to v0.23.0
- golang.org/x/net to v0.35.0
- golang.org/x/sync to v0.11.0
- golang.org/x/sys to v0.30.0
- golang.org/x/text to v0.22.0
- golang.org/x/tools to v0.30.0

These changes ensure compatibility with the latest features and fixes, enhancing overall project stability and performance.
2025-02-14 10:54:08 +01:00
Renovate 08bba81ba0 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.5 2025-02-13 21:54:37 +00:00
Renovate 881ff122f8 fix(deps): update module github.com/alecthomas/kong to v1.8.1 2025-02-13 19:54:26 +00:00
Renovate 0d384e8a3f chore(deps): update golang docker tag to v1.24.0 2025-02-13 13:54:01 +00:00
argoyle f49156f637 chore(go): update go version to 1.23.6 and remove toolchain
Updates the Go version in go.mod to 1.23.6 and removes the toolchain 
line to simplify the module configuration. This ensures compatibility 
with the latest Go features and improvements.
2025-02-13 14:15:19 +01:00
Renovate 62869e4a77 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.4 2025-02-12 22:54:20 +00:00
Renovate ab2c55fb39 chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.3 2025-02-12 19:54:16 +00:00
argoyle ef271a88a9 fix(ci): add resource group to production deployment configuration
Adds a resource group to the production deployment configuration in 
the GitLab CI/CD pipeline. This change ensures that the deployment 
process is correctly associated with the specified resource group, 
enhancing the deployment's reliability and clarity.
2025-02-12 13:04:43 +00:00
argoyle 14d3733bf5 fix(ci): update golang image to improve compatibility
Changes the golang image used in the build and check stages from
a generic image to the amd64 variant. This ensures better
compatibility with the tools and libraries being used in the 
pipeline.
2025-02-12 13:50:46 +01:00
Renovate 2cc4e379bc chore(deps): update pre-commit hook golangci/golangci-lint to v1.64.2 2025-02-11 21:53:56 +00:00
Renovate d39427c9ff chore(deps): update goreleaser/goreleaser docker tag to v2.7.0 2025-02-11 02:53:26 +00:00
Renovate 2cb2ba9754 fix(deps): update module github.com/alecthomas/kong to v1.8.0 2025-02-09 23:54:31 +00:00
Renovate 53d5c21b77 chore(deps): update golang:1.23.6 docker digest to 9271129 2025-02-05 09:55:16 +00:00
Renovate 2b09f6c3c5 chore(deps): update golang:1.23.6 docker digest to 958bd2e 2025-02-05 06:53:44 +00:00
Renovate 9f2be264c3 chore(deps): update golang docker tag to v1.23.6 2025-02-05 03:54:38 +00:00
Renovate 31e8d8cd49 chore(deps): update dependency go to v1.23.6 2025-02-04 16:54:25 +00:00
Renovate b4e4c9e2e3 chore(deps): update golang:1.23.5 docker digest to e213430 2025-02-04 09:55:14 +00:00
Renovate 35bf4eb6dc fix(deps): update module github.com/khan/genqlient to v0.8.0 2025-02-03 00:56:28 +00:00
Renovate 7ddca97cce fix(deps): update module github.com/alecthomas/kong to v1.7.0 2025-01-30 02:56:20 +00:00
Renovate 3a78d90c4b chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.3 2025-01-29 14:54:57 +00:00
Renovate 84b7d2bf74 fix(deps): update module github.com/99designs/gqlgen to v0.17.64 2025-01-28 19:48:02 +01:00
Unbound Release 16008218a5 chore(release): prepare for v0.1.1 2025-01-24 17:42:58 +00:00
Renovate 0908099d34 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.2 2025-01-24 15:03:16 +00:00
argoyle 74823a8947 fix(k8s): standardize app label to app.kubernetes.io/name
Update Kubernetes YAML files to replace the app label with the 
standard app.kubernetes.io/name label for better consistency 
and adherence to best practices in Kubernetes resource labeling.
2025-01-24 15:14:13 +01:00
Renovate c5dcc6f87a chore(deps): update goreleaser/goreleaser docker tag to v2.6.1 2025-01-22 11:55:04 +00:00
Renovate 8f2a88f405 chore(deps): update golang:1.23.5 docker digest to 8c10f21 2025-01-22 09:14:34 +00:00
Renovate d88b6f2ee8 chore(deps): update goreleaser/goreleaser docker tag to v2.6.0 2025-01-22 00:57:25 +00:00
Renovate 21e32b5b09 chore(deps): update golang docker tag to v1.23.5 2025-01-17 07:25:59 +00:00
Renovate cd08e429e8 chore(deps): update dependency go to v1.23.5 2025-01-16 20:56:07 +00:00
Renovate 73fdd8a2e7 chore(deps): update golang:1.23.4 docker digest to 9820aca 2025-01-15 23:11:57 +00:00
Renovate c73a6a2c1f chore(deps): update golang:1.23.4 docker digest to 5305905 2025-01-15 18:55:36 +00:00
Renovate 22e0952012 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.1 2025-01-15 12:57:32 +00:00
Renovate fe52ddbb3a chore(deps): update golang:1.23.4 docker digest to 585103a 2025-01-15 00:57:22 +00:00
Renovate e229458c39 chore(deps): update golang:1.23.4 docker digest to 08e1417 2025-01-14 12:56:45 +00:00
Renovate c64f5ce1df chore(deps): update golang:1.23.4 docker digest to 3b1a7de 2025-01-14 07:13:53 +00:00
Renovate 7a95c98573 chore(deps): update pre-commit hook gitleaks/gitleaks to v8.23.0 2025-01-13 15:56:15 +00:00
Renovate 03ba8a774c fix(deps): update module github.com/99designs/gqlgen to v0.17.63 2025-01-10 15:55:56 +00:00
Renovate 23da66078a fix(deps): update module github.com/pressly/goose/v3 to v3.24.1 2025-01-10 09:07:01 +00:00
Renovate 1e50301c3c fix(deps): update module github.com/alecthomas/kong to v1.6.1 2025-01-07 00:57:18 +00:00
Renovate 8de129c925 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.4 2025-01-03 19:56:20 +00:00
Renovate 660f07f3cd chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.3 2025-01-02 20:29:38 +00:00
Renovate fed6e512d3 fix(deps): update module github.com/getsentry/sentry-go to v0.31.1 2025-01-02 16:56:30 +00:00
Renovate f1b7a36103 fix(deps): update module github.com/getsentry/sentry-go to v0.31.0 2025-01-02 14:14:31 +00:00
Renovate 74ee419e56 chore(deps): update goreleaser/goreleaser docker tag to v2.5.1 2025-01-02 14:13:28 +00:00
Renovate f8aa95ccd5 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.2 2025-01-02 12:55:24 +00:00
Renovate e013762fd9 chore(deps): update pre-commit hook golangci/golangci-lint to v1.63.1 2025-01-01 21:55:28 +00:00
44 changed files with 2376 additions and 502 deletions
+10 -4
View File
@@ -1,5 +1,7 @@
include:
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
- project: unboundsoftware/ci-templates
file: Defaults.gitlab-ci.yml
- project: unboundsoftware/ci-templates
file: Release.gitlab-ci.yml
- project: unboundsoftware/ci-templates
@@ -19,7 +21,7 @@ variables:
check:
stage: .pre
image: golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041
image: amd64/golang:1.25.1@sha256:53f7808857782118f3a062261f721507dfa36e5c545e5d39c2dcf9916e3f0b1b
script:
- go install mvdan.cc/gofumpt@latest
- go install golang.org/x/tools/cmd/goimports@latest
@@ -38,7 +40,7 @@ build:
vulnerabilities:
stage: build
image: golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041
image: amd64/golang:1.25.1@sha256:53f7808857782118f3a062261f721507dfa36e5c545e5d39c2dcf9916e3f0b1b
script:
- go install golang.org/x/vuln/cmd/govulncheck@latest
- govulncheck ./...
@@ -54,12 +56,15 @@ deploy-prod:
- if: $CI_COMMIT_BRANCH == "main"
environment:
name: prod
resource_group: prod
check_release:
stage: test
image:
name: goreleaser/goreleaser:v2.5.0@sha256:8a70dbaf65cef49cd3ae9b564395fe875fa8136a3d45908f84c6e35ff8925ec9
name: goreleaser/goreleaser:v2.12.0@sha256:3d43fbf51d57caa2c8a80ac7586127a4f9381d9235356dbb0132c6ab50705fb2
entrypoint: [ '' ]
variables:
GOTOOLCHAIN: auto
script: |
goreleaser check
goreleaser release --snapshot --clean
@@ -69,13 +74,14 @@ release:
needs:
- unbound_release_prepare_release
image:
name: goreleaser/goreleaser:v2.5.0@sha256:8a70dbaf65cef49cd3ae9b564395fe875fa8136a3d45908f84c6e35ff8925ec9
name: goreleaser/goreleaser:v2.12.0@sha256:3d43fbf51d57caa2c8a80ac7586127a4f9381d9235356dbb0132c6ab50705fb2
entrypoint: [ '' ]
variables:
# Disable shallow cloning so that goreleaser can diff between tags to
# generate a changelog.
GIT_DEPTH: 0
GITLAB_TOKEN: $GITLAB_CI_TOKEN
GOTOOLCHAIN: auto
# Only run this release job for tags, not every commit (for example).
rules:
- if: $CI_COMMIT_TAG
+20 -1
View File
@@ -1,3 +1,22 @@
version: "2"
run:
allow-parallel-runners: true
timeout: 5m
linters:
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
paths:
- third_party$
- builtin$
- examples$
formatters:
exclusions:
generated: lax
paths:
- third_party$
- builtin$
- examples$
+8 -4
View File
@@ -16,18 +16,22 @@ builds:
- amd64
- arm64
brews:
homebrew_casks:
- name: unbound-schemas
repository:
owner: unboundsoftware
name: homebrew-taps
directory: Formula
install: |
bin.install "schemactl"
binary: schemactl
directory: Casks
commit_author:
name: "Joakim Olsson"
email: joakim@unbound.se
homepage: "https://schemas.unbound.se/"
hooks:
post:
install: |
# replace foo with the actual binary name
system_command "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "#{staged_path}/schemactl"]
archives:
- id: unbound-schemas
+4 -4
View File
@@ -2,7 +2,7 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0
rev: v6.0.0
hooks:
- id: trailing-whitespace
- id: end-of-file-fixer
@@ -18,7 +18,7 @@ repos:
- --project
- unboundsoftware/schemas
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
rev: v9.20.0
rev: v9.22.0
hooks:
- id: commitlint
stages: [ commit-msg ]
@@ -37,11 +37,11 @@ repos:
- id: go-test
- id: gofumpt
- repo: https://github.com/golangci/golangci-lint
rev: v1.63.0
rev: v2.4.0
hooks:
- id: golangci-lint-full
- repo: https://github.com/gitleaks/gitleaks
rev: v8.22.1
rev: v8.28.0
hooks:
- id: gitleaks
exclude: '^ctl/generated.go|graph/generated/.*$|^graph/model/models_gen.go|^tools/.*$$'
+202 -11
View File
@@ -1,7 +1,207 @@
# Changelog
## [0.6.2] - 2025-08-22
All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- Remove conflicts entry from homebrew-taps config
## [0.6.1] - 2025-08-22
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.195
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.196
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.197
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.198
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.199
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.200
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.202
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.203
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.204
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.207
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.2.3
- *(deps)* Update module github.com/alecthomas/kong to v1.12.1
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.208
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.210
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.78
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.212
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.213
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.215
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.3.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.216
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.217
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.218
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.219
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.220
- *(deps)* Update module github.com/sparetimecoders/goamqp to v0.3.3
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.221
## [0.6.0] - 2025-06-29
### 🚀 Features
- *(k8s)* Add OpenTelemetry exporter endpoint to deploy.yaml
- Add build version injection via CI_COMMIT argument
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.190
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.28
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.75
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.192
- *(deps)* Update module github.com/alecthomas/kong to v1.12.0
- *(deps)* Update opentelemetry-go monorepo
- *(deps)* Update module go.opentelemetry.io/contrib/bridges/otelslog to v0.12.0
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.29
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.194
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.30
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.76
## [0.5.3] - 2025-06-13
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.187
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.188
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.189
### 🚜 Refactor
- Remove Sentry integration and replace with OpenTelemetry
## [0.5.2] - 2025-06-09
### 🐛 Bug Fixes
- *(goreleaser)* Specify binary name in configuration
## [0.5.1] - 2025-06-09
### 🐛 Bug Fixes
- *(deps)* Update module github.com/alecthomas/kong to v1.11.0
- *(deps)* Update module github.com/getsentry/sentry-go to v0.33.0
- *(deps)* Update module github.com/khan/genqlient to v0.8.1
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.179
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.180
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.181
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.182
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.183
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.74
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.184
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.185
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.186
## [0.5.0] - 2025-05-15
### 🚀 Features
- *(k8s)* Add PodDisruptionBudget for schemas service
### 🐛 Bug Fixes
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.26
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.173
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.174
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.175
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.176
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.73
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.177
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.178
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.3
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.27
- *(k8s)* Update apiVersion for external secrets
### ⚙️ Miscellaneous Tasks
- *(ci)* Update GitLab CI configuration for templates
## [0.4.1] - 2025-04-24
### 🐛 Bug Fixes
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.25
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.170
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.71
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.72
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.171
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.172
## [0.4.0] - 2025-04-12
### 🚀 Features
- *(service)* Implement graceful shutdown for HTTP server
### 🐛 Bug Fixes
- *(secrets)* Remove namespace from ExternalSecret definition
- *(deps)* Update module github.com/sparetimecoders/goamqp to v0.3.2
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.24
- *(deps)* Update module github.com/getsentry/sentry-go to v0.32.0
- *(k8s)* Increase CPU request for better performance
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.8.1
### 🚜 Refactor
- *(deploy)* Remove cpu and memory limits for schemas
## [0.3.0] - 2025-04-08
### 🚀 Features
- *(k8s)* Add RabbitMQ configurations and update secrets
### 🐛 Bug Fixes
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.161
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.162
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.163
- *(deps)* Update module github.com/auth0/go-jwt-middleware/v2 to v2.3.0
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.0
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.18.1
- *(deps)* Update module github.com/alecthomas/kong to v1.9.0
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.164
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.165
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.68
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.2.2
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.166
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.0
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.69
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.70
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.167
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.19.1
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.2
- *(deps)* Update module github.com/alecthomas/kong to v1.10.0
- *(deps)* Update eventsourced
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.168
- *(deps)* Update module github.com/wundergraph/graphql-go-tools/v2 to v2.0.0-rc.169
## [0.2.0] - 2025-02-28
### 🚀 Features
- *(dependencies)* Add Eventsourced package group for updates
- *(sdlmerge)* Add shared types for GraphQL schema handling
### 🐛 Bug Fixes
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.64
- *(deps)* Update module github.com/alecthomas/kong to v1.7.0
- *(deps)* Update module github.com/khan/genqlient to v0.8.0
- *(deps)* Update module github.com/alecthomas/kong to v1.8.0
- *(ci)* Update golang image to improve compatibility
- *(ci)* Add resource group to production deployment configuration
- *(deps)* Update module github.com/alecthomas/kong to v1.8.1
- *(deps)* Update dependencies to latest versions
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.65
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.66
- *(deps)* Update eventsourced
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.23
### ⚙️ Miscellaneous Tasks
- *(go)* Update go version to 1.23.6 and remove toolchain
- *(docker)* Update base image architecture to amd64
## [0.1.1] - 2025-01-24
### 🐛 Bug Fixes
- *(deps)* Update module github.com/getsentry/sentry-go to v0.31.0
- *(deps)* Update module github.com/getsentry/sentry-go to v0.31.1
- *(deps)* Update module github.com/alecthomas/kong to v1.6.1
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.1
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.63
- *(k8s)* Standardize app label to app.kubernetes.io/name
## [0.1.0] - 2025-01-01
### 🚀 Features
@@ -44,7 +244,6 @@ All notable changes to this project will be documented in this file.
- Remove unnecessary Docker variables from configuration
- *(ci)* Remove unused docker service from buildtools
## [0.0.7] - 2024-10-22
### 🐛 Bug Fixes
@@ -92,7 +291,6 @@ All notable changes to this project will be documented in this file.
- Update goreleaser image to v2.3.1
- Add generate check
- Add release notes for goreleaser command in .gitlab-ci.yml
## [0.0.6] - 2024-04-04
### 🐛 Bug Fixes
@@ -102,7 +300,6 @@ All notable changes to this project will be documented in this file.
### ⚙️ Miscellaneous Tasks
- Add step for checking release
## [0.0.5] - 2024-04-03
### 🚀 Features
@@ -138,7 +335,6 @@ All notable changes to this project will be documented in this file.
- Run release on medium instance
- Back to small and upgrade goreleaser
- Remove deprecated replacements
## [0.0.4] - 2023-05-29
### 🐛 Bug Fixes
@@ -150,7 +346,6 @@ All notable changes to this project will be documented in this file.
- Update Go version for vulnerabilities
- Update pre-commit and fix golangci-lint
- Actually validate API key privileges and refs
## [0.0.3] - 2023-04-27
### 🚀 Features
@@ -181,14 +376,12 @@ All notable changes to this project will be documented in this file.
- Reduce sample rate
- Update to Go 1.20.3
- Fix Gitlab CI lint
## [0.0.2] - 2022-10-14
### ⚙️ Miscellaneous Tasks
- Add docker ignore
- Handle push of unchanged schema
## [0.0.1] - 2022-10-09
### 🚀 Features
@@ -198,5 +391,3 @@ All notable changes to this project will be documented in this file.
### 🐛 Bug Fixes
- Remove GITLAB_TOKEN
<!-- generated by git-cliff -->
+3 -2
View File
@@ -1,9 +1,10 @@
FROM golang:1.23.4@sha256:7ea4c9dcb2b97ff8ee80a67db3d44f98c8ffa0d191399197007d8459c1453041 as modules
FROM amd64/golang:1.25.1@sha256:53f7808857782118f3a062261f721507dfa36e5c545e5d39c2dcf9916e3f0b1b as modules
WORKDIR /build
ADD go.* /build
RUN go mod download
FROM modules as build
ARG CI_COMMIT
WORKDIR /build
ENV CGO_ENABLED=0
ADD . /build
@@ -17,7 +18,7 @@ RUN GOOS=linux GOARCH=amd64 go build \
-a -installsuffix cgo \
-mod=readonly \
-o /release/service \
-ldflags '-w -s' \
-ldflags "-w -s -X main.buildVersion=${CI_COMMIT}" \
./cmd/service/service.go
FROM scratch as export
+4 -4
View File
@@ -2,9 +2,9 @@ package cache
import (
"fmt"
"log/slog"
"time"
"github.com/apex/log"
"github.com/sparetimecoders/goamqp"
"gitlab.com/unboundsoftware/schemas/domain"
@@ -18,7 +18,7 @@ type Cache struct {
services map[string]map[string]map[string]struct{}
subGraphs map[string]string
lastUpdate map[string]string
logger log.Interface
logger *slog.Logger
}
func (c *Cache) OrganizationByAPIKey(apiKey string) *domain.Organization {
@@ -98,7 +98,7 @@ func (c *Cache) Update(msg any, _ goamqp.Headers) (any, error) {
case *domain.SubGraph:
c.updateSubGraph(m.OrganizationId, m.Ref, m.ID.String(), m.Service, m.ChangedAt)
default:
c.logger.Warnf("unexpected message received: %+v", msg)
c.logger.With("msg", msg).Warn("unexpected message received")
}
return nil, nil
}
@@ -124,7 +124,7 @@ func (c *Cache) addUser(sub string, organization domain.Organization) {
}
}
func New(logger log.Interface) *Cache {
func New(logger *slog.Logger) *Cache {
return &Cache{
organizations: make(map[string]domain.Organization),
users: make(map[string][]string),
+29 -62
View File
@@ -2,7 +2,9 @@ package main
import (
"context"
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
@@ -17,10 +19,6 @@ import (
"github.com/99designs/gqlgen/graphql/handler/transport"
"github.com/99designs/gqlgen/graphql/playground"
"github.com/alecthomas/kong"
"github.com/apex/log"
"github.com/apex/log/handlers/json"
"github.com/getsentry/sentry-go"
sentryhttp "github.com/getsentry/sentry-go/http"
"github.com/rs/cors"
"github.com/sparetimecoders/goamqp"
"github.com/vektah/gqlparser/v2/ast"
@@ -32,7 +30,9 @@ import (
"gitlab.com/unboundsoftware/schemas/domain"
"gitlab.com/unboundsoftware/schemas/graph"
"gitlab.com/unboundsoftware/schemas/graph/generated"
"gitlab.com/unboundsoftware/schemas/logging"
"gitlab.com/unboundsoftware/schemas/middleware"
"gitlab.com/unboundsoftware/schemas/monitoring"
"gitlab.com/unboundsoftware/schemas/store"
)
@@ -40,16 +40,12 @@ type CLI struct {
AmqpURL string `name:"amqp-url" env:"AMQP_URL" help:"URL to use to connect to RabbitMQ" default:"amqp://user:password@unbound-control-plane.orb.local:5672/"`
Port int `name:"port" env:"PORT" help:"Listen-port for GraphQL API" default:"8080"`
LogLevel string `name:"log-level" env:"LOG_LEVEL" help:"The level of logging to use (debug, info, warn, error, fatal)" default:"info"`
LogFormat string `name:"log-format" env:"LOG_FORMAT" help:"The format of logs" default:"text" enum:"otel,json,text"`
DatabaseURL string `name:"postgres-url" env:"POSTGRES_URL" help:"URL to use to connect to Postgres" default:"postgres://postgres:postgres@unbound-control-plane.orb.local:5432/schemas?sslmode=disable"`
DatabaseDriverName string `name:"db-driver" env:"DB_DRIVER" help:"Driver to use to connect to db" default:"postgres"`
Issuer string `name:"issuer" env:"ISSUER" help:"The JWT token issuer to use" default:"unbound.eu.auth0.com"`
StrictSSL bool `name:"strict-ssl" env:"STRICT_SSL" help:"Should strict SSL handling be enabled" default:"true"`
SentryConfig
}
type SentryConfig struct {
DSN string `name:"sentry-dsn" env:"SENTRY_DSN" help:"Sentry dsn" default:""`
Environment string `name:"sentry-environment" env:"SENTRY_ENVIRONMENT" help:"Sentry environment" default:"development"`
Environment string `name:"environment" env:"ENVIRONMENT" help:"The environment we are running in" default:"development" enum:"development,staging,production"`
}
var buildVersion = "none"
@@ -59,9 +55,7 @@ const serviceName = "schemas"
func main() {
var cli CLI
_ = kong.Parse(&cli)
log.SetHandler(json.New(os.Stdout))
log.SetLevelFromString(cli.LogLevel)
logger := log.WithField("service", serviceName)
logger := logging.SetupLogger(cli.LogLevel, cli.LogFormat, serviceName, buildVersion)
closeEvents := make(chan error)
if err := start(
@@ -70,19 +64,22 @@ func main() {
ConnectAMQP,
cli,
); err != nil {
logger.WithError(err).Error("process error")
logger.With("error", err).Error("process error")
}
}
func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url string) (Connection, error), cli CLI) error {
if err := setupSentry(logger, cli.SentryConfig); err != nil {
return err
}
defer sentry.Flush(2 * time.Second)
func start(closeEvents chan error, logger *slog.Logger, connectToAmqpFunc func(url string) (Connection, error), cli CLI) error {
rootCtx, rootCancel := context.WithCancel(context.Background())
defer rootCancel()
shutdownFn, err := monitoring.SetupOTelSDK(rootCtx, cli.LogFormat == "otel", serviceName, buildVersion, cli.Environment)
if err != nil {
return err
}
defer func() {
_ = errors.Join(shutdownFn(context.Background()))
}()
db, err := store.SetupDB(cli.DatabaseDriverName, cli.DatabaseURL)
if err != nil {
return fmt.Errorf("failed to setup DB: %v", err)
@@ -123,7 +120,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
return fmt.Errorf("caching subgraphs: %w", err)
}
setups := []goamqp.Setup{
goamqp.UseLogger(logger.Error),
goamqp.UseLogger(func(s string) { logger.Error(s) }),
goamqp.CloseListener(closeEvents),
goamqp.WithPrefetchLimit(20),
goamqp.EventStreamPublisher(publisher),
@@ -169,7 +166,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
defer wg.Done()
err := <-closeEvents
if err != nil {
logger.WithError(err).Error("received close from AMQP")
logger.With("error", err).Error("received close from AMQP")
rootCancel()
}
}()
@@ -179,8 +176,11 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
defer wg.Done()
<-rootCtx.Done()
if err := httpSrv.Close(); err != nil {
logger.WithError(err).Error("close http server")
shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second)
defer shutdownRelease()
if err := httpSrv.Shutdown(shutdownCtx); err != nil {
logger.With("error", err).Error("close http server")
}
close(sigint)
close(closeEvents)
@@ -222,11 +222,10 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
Cache: lru.New[string](100),
})
sentryHandler := sentryhttp.New(sentryhttp.Options{Repanic: true})
mux.Handle("/", sentryHandler.HandleFunc(playground.Handler("GraphQL playground", "/query")))
mux.Handle("/", monitoring.Handler(playground.Handler("GraphQL playground", "/query")))
mux.Handle("/health", http.HandlerFunc(healthFunc))
mux.Handle("/query", cors.AllowAll().Handler(
sentryHandler.Handle(
monitoring.Handler(
mw.Middleware().CheckJWT(
apiKeyMiddleware.Handler(
authMiddleware.Handler(srv),
@@ -235,10 +234,10 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
),
))
logger.Infof("connect to http://localhost:%d/ for GraphQL playground", cli.Port)
logger.Info(fmt.Sprintf("connect to http://localhost:%d/ for GraphQL playground", cli.Port))
if err := httpSrv.ListenAndServe(); err != nil {
logger.WithError(err).Error("listen http")
if err := httpSrv.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
logger.With("error", err).Error("listen http")
}
}()
@@ -287,38 +286,6 @@ func healthFunc(w http.ResponseWriter, _ *http.Request) {
_, _ = w.Write([]byte("OK"))
}
func setupSentry(logger log.Interface, args SentryConfig) error {
if args.Environment == "" {
return fmt.Errorf("no Sentry environment supplied, exiting")
}
cfg := sentry.ClientOptions{
Dsn: args.DSN,
Environment: args.Environment,
Release: fmt.Sprintf("%s-%s", serviceName, buildVersion),
}
switch args.Environment {
case "development":
cfg.Debug = true
cfg.EnableTracing = false
cfg.TracesSampleRate = 0.0
case "production":
if args.DSN == "" {
return fmt.Errorf("no DSN supplied for non-dev environment, exiting")
}
cfg.Debug = false
cfg.EnableTracing = true
cfg.TracesSampleRate = 0.01
default:
return fmt.Errorf("illegal environment %s", args.Environment)
}
if err := sentry.Init(cfg); err != nil {
return fmt.Errorf("sentry setup: %w", err)
}
logger.Infof("configured Sentry for env: %s", args.Environment)
return nil
}
func ConnectAMQP(url string) (Connection, error) {
return goamqp.NewFromURL(serviceName, url)
}
+48 -30
View File
@@ -1,61 +1,79 @@
module gitlab.com/unboundsoftware/schemas
go 1.22.5
toolchain go1.23.4
go 1.25
require (
github.com/99designs/gqlgen v0.17.62
github.com/Khan/genqlient v0.7.0
github.com/alecthomas/kong v1.6.0
github.com/99designs/gqlgen v0.17.78
github.com/Khan/genqlient v0.8.1
github.com/alecthomas/kong v1.12.1
github.com/apex/log v1.9.0
github.com/auth0/go-jwt-middleware/v2 v2.2.2
github.com/getsentry/sentry-go v0.30.0
github.com/golang-jwt/jwt/v5 v5.2.1
github.com/auth0/go-jwt-middleware/v2 v2.3.0
github.com/golang-jwt/jwt/v5 v5.3.0
github.com/jmoiron/sqlx v1.4.0
github.com/pkg/errors v0.9.1
github.com/pressly/goose/v3 v3.24.0
github.com/pressly/goose/v3 v3.25.0
github.com/rs/cors v1.11.1
github.com/sparetimecoders/goamqp v0.3.1
github.com/stretchr/testify v1.10.0
github.com/vektah/gqlparser/v2 v2.5.21
github.com/wundergraph/graphql-go-tools v1.67.4
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0
github.com/sparetimecoders/goamqp v0.3.3
github.com/stretchr/testify v1.11.1
github.com/vektah/gqlparser/v2 v2.5.30
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.225
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0
go.opentelemetry.io/contrib/bridges/otelslog v0.13.0
go.opentelemetry.io/otel v1.38.0
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0
go.opentelemetry.io/otel/log v0.14.0
go.opentelemetry.io/otel/sdk v1.38.0
go.opentelemetry.io/otel/sdk/log v0.14.0
go.opentelemetry.io/otel/sdk/metric v1.38.0
go.opentelemetry.io/otel/trace v1.38.0
)
require (
github.com/agnivade/levenshtein v1.2.0 // indirect
github.com/agnivade/levenshtein v1.2.1 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-viper/mapstructure/v2 v2.4.0 // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/mfridman/interpolate v0.0.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 // indirect
github.com/sethvargo/go-retry v0.3.0 // indirect
github.com/sosodev/duration v1.3.1 // indirect
github.com/tidwall/gjson v1.17.0 // indirect
github.com/tidwall/match v1.1.1 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
github.com/tidwall/sjson v1.2.5 // indirect
github.com/urfave/cli/v2 v2.27.5 // indirect
github.com/urfave/cli/v2 v2.27.7 // indirect
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 // indirect
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
go.opentelemetry.io/otel/metric v1.38.0 // indirect
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/mod v0.20.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/tools v0.24.0 // indirect
golang.org/x/mod v0.26.0 // indirect
golang.org/x/net v0.43.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/sys v0.35.0 // indirect
golang.org/x/text v0.28.0 // indirect
golang.org/x/tools v0.35.0 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 // indirect
google.golang.org/grpc v1.75.0 // indirect
google.golang.org/protobuf v1.36.8 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
+129 -98
View File
@@ -1,25 +1,25 @@
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/99designs/gqlgen v0.17.62 h1:Wovt1+XJN9dTWYh92537Y9a5FuMVSkrQL4bn0a8v5Rg=
github.com/99designs/gqlgen v0.17.62/go.mod h1:sVCM2iwIZisJjTI/DEC3fpH+HFgxY1496ZJ+jbT9IjA=
github.com/99designs/gqlgen v0.17.78 h1:bhIi7ynrc3js2O8wu1sMQj1YHPENDt3jQGyifoBvoVI=
github.com/99designs/gqlgen v0.17.78/go.mod h1:yI/o31IauG2kX0IsskM4R894OCCG1jXJORhtLQqB7Oc=
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU=
github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w=
github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM=
github.com/PuerkitoBio/goquery v1.9.3 h1:mpJr/ikUA9/GNJB/DBZcGeFDXUtosHRyRrwh7KGdTG0=
github.com/PuerkitoBio/goquery v1.9.3/go.mod h1:1ndLHPdTz+DyQPICCWYlYQMPl0oXZj0G6D4LCYA6u4U=
github.com/agnivade/levenshtein v1.2.0 h1:U9L4IOT0Y3i0TIlUIDJ7rVUziKi/zPbrJGaFrtYH3SY=
github.com/agnivade/levenshtein v1.2.0/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/Khan/genqlient v0.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU=
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/kong v1.6.0 h1:mwOzbdMR7uv2vul9J0FU3GYxE7ls/iX1ieMg5WIM6gE=
github.com/alecthomas/kong v1.6.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
github.com/alecthomas/kong v1.12.1 h1:iq6aMJDcFYP9uFrLdsiZQ2ZMmcshduyGv4Pek0MQPW0=
github.com/alecthomas/kong v1.12.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
github.com/andybalholm/cascadia v1.3.2 h1:3Xi6Dw5lHF15JtdcmAHD3i1+T8plmv7BQ/nsViSLyss=
github.com/andybalholm/cascadia v1.3.2/go.mod h1:7gtRlve5FxPPgIgX36uWBX58OdBsSS6lUvCFb+h7KvU=
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0=
github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA=
github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
@@ -27,16 +27,18 @@ github.com/aphistic/golf v0.0.0-20180712155816-02c07f170c5a/go.mod h1:3NqKYiepwy
github.com/aphistic/sweet v0.2.0/go.mod h1:fWDlIh/isSE9n6EPsRmC0det+whmX6dJid3stzu0Xys=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
github.com/auth0/go-jwt-middleware/v2 v2.2.2 h1:vrvkFZf72r3Qbt45KLjBG3/6Xq2r3NTixWKu2e8de9I=
github.com/auth0/go-jwt-middleware/v2 v2.2.2/go.mod h1:4vwxpVtu/Kl4c4HskT+gFLjq0dra8F1joxzamrje6J0=
github.com/auth0/go-jwt-middleware/v2 v2.3.0 h1:4QREj6cS3d8dS05bEm443jhnqQF97FX9sMBeWqnNRzE=
github.com/auth0/go-jwt-middleware/v2 v2.3.0/go.mod h1:dL4ObBs1/dj4/W4cYxd8rqAdDGXYyd5rqbpMIxcbVrU=
github.com/aws/aws-sdk-go v1.20.6/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aybabtme/rgbterm v0.0.0-20170906152045-cc83f3b3ce59/go.mod h1:q/89r3U2H7sSsE2t6Kca0lfwTK8JdoNGS/yzM/4iH5I=
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/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cpuguy83/go-md2man/v2 v2.0.5 h1:ZtcqGrnekaHpVLArFSe4HK5DoKx1T0rq2DwVB0alcyc=
github.com/cpuguy83/go-md2man/v2 v2.0.5/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
github.com/cpuguy83/go-md2man/v2 v2.0.7/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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
@@ -44,39 +46,39 @@ github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7c
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/evanphx/json-patch/v5 v5.1.0 h1:B0aXl1o/1cP8NbviYiBMkcHBtUjIJ1/Ccg6b+SwCLQg=
github.com/evanphx/json-patch/v5 v5.1.0/go.mod h1:G79N1coSVB93tBe7j6PhzjmR3/2VvlbKOFpnXhI9Bw4=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/getsentry/sentry-go v0.30.0 h1:lWUwDnY7sKHaVIoZ9wYqRHJ5iEmoc0pqcRqFkosKzBo=
github.com/getsentry/sentry-go v0.30.0/go.mod h1:WU9B9/1/sHDqeV8T+3VwwbjeR5MSXs/6aqG3mqZrezA=
github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA=
github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
github.com/go-sql-driver/mysql v1.9.3 h1:U/N249h2WzJ3Ukj8SowVFjdtZKfu9vlLZxjPXV1aweo=
github.com/go-sql-driver/mysql v1.9.3/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
github.com/golang-jwt/jwt/v5 v5.3.0 h1:pv4AsKCKKZuqlgs5sUmn4x8UlGa0kEVt/puTpKx9vvo=
github.com/golang-jwt/jwt/v5 v5.3.0/go.mod h1:fxCRLWMO43lRc8nhHWY6LGqRcf+1gQWArsqaEUEa5bE=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
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/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs=
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68 h1:E80wOd3IFQcoBxLkAUpUQ3BoGrZ4DxhQdP21+HH1s6A=
github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68/go.mod h1:0D5r/VSW6D/o65rKLL9xk7sZxL2+oku2HvFPYeIMFr4=
github.com/jensneuse/diffview v1.0.0 h1:4b6FQJ7y3295JUHU3tRko6euyEboL825ZsXeZZM47Z4=
github.com/jensneuse/diffview v1.0.0/go.mod h1:i6IacuD8LnEaPuiyzMHA+Wfz5mAuycMOf3R/orUY9y4=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
@@ -88,8 +90,9 @@ github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfn
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
@@ -107,32 +110,28 @@ github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdh
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4=
github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/pressly/goose/v3 v3.24.0 h1:sFbNms7Bd++2VMq6HSgDHDLWa7kHz1qXzPb3ZIU72VU=
github.com/pressly/goose/v3 v3.24.0/go.mod h1:rEWreU9uVtt0DHCyLzF9gRcWiiTF/V+528DV+4DORug=
github.com/pressly/goose/v3 v3.25.0 h1:6WeYhMWGRCzpyd89SpODFnCBCKz41KrVbRT58nVjGng=
github.com/pressly/goose/v3 v3.25.0/go.mod h1:4hC1KrritdCxtuFsqgs1R4AU5bWtTAf+cnWvfhf2DNY=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
github.com/rogpeppe/fastuuid v1.1.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8=
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sanity-io/litter v1.5.5 h1:iE+sBxPBzoK6uaEP5Lt3fHNgpKcHXc/A2HGETy0uJQo=
github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1 h1:lZUw3E0/J3roVtGQ+SCrUrg3ON6NgVqpn3+iol9aGu4=
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1/go.mod h1:uToXkOrWAZ6/Oc07xWQrPOhJotwFIyu2bBVN41fcDUY=
github.com/sebdah/goldie/v2 v2.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/sanity-io/litter v1.5.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rYg=
github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
github.com/sebdah/goldie/v2 v2.7.1 h1:PkBHymaYdtvEkZV7TmyqKxdmn5/Vcj+8TpATWZjnG5E=
github.com/sebdah/goldie/v2 v2.7.1/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
@@ -143,19 +142,13 @@ github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
github.com/sparetimecoders/goamqp v0.3.1 h1:NCzdyAz84G679HlO+ivhyoI1aMgXEe3qfqpn4EChu1s=
github.com/sparetimecoders/goamqp v0.3.1/go.mod h1:PjkgrmsuMVgRbiQDTLs0pCWYrcQgqcUee38JjCDZdlk=
github.com/sparetimecoders/goamqp v0.3.3 h1:z/nfTPmrjeU/rIVuNOgsVLCimp3WFoNFvS3ZzXRJ6HE=
github.com/sparetimecoders/goamqp v0.3.3/go.mod h1:W9NRCpWLE+Vruv2dcRSbszNil2O826d2Nv6kAkETW5o=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
@@ -173,51 +166,95 @@ github.com/tj/go-buffer v1.1.0/go.mod h1:iyiJpfFcR2B9sXu7KvjbT9fpM4mOelRSDTbntVj
github.com/tj/go-elastic v0.0.0-20171221160941-36157cbbebc2/go.mod h1:WjeM0Oo1eNAjXGDx2yma7uG2XoyRZTq1uv3M/o7imD0=
github.com/tj/go-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao=
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
github.com/urfave/cli/v2 v2.27.5 h1:WoHEJLdsXr6dDWoJgMq/CboDmyY/8HMMH1fTECbih+w=
github.com/urfave/cli/v2 v2.27.5/go.mod h1:3Sevf16NykTbInEnD0yKkjDAeZDS0A6bzhBH5hrMvTQ=
github.com/vektah/gqlparser/v2 v2.5.21 h1:Zw1rG2dr1pRR4wqwbVq4d6+xk2f4ut/yo+hwr4QjE08=
github.com/vektah/gqlparser/v2 v2.5.21/go.mod h1:xMl+ta8a5M1Yo1A1Iwt/k7gSpscwSnHZdw7tfhEGfTM=
github.com/wundergraph/graphql-go-tools v1.67.4 h1:1QtoftaZz5sScV/J6XLZ/oTfi1lMHp6UmFkYRQfY2/g=
github.com/wundergraph/graphql-go-tools v1.67.4/go.mod h1:UFvflYjB/qnSCdgcHQuE6dTfwZ6viJB7yPnGOtBuibo=
github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
github.com/vektah/gqlparser/v2 v2.5.30 h1:EqLwGAFLIzt1wpx1IPpY67DwUujF1OfzgEyDsLrN6kE=
github.com/vektah/gqlparser/v2 v2.5.30/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo=
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTBjW+SZK4mhxTTBVpxcqeBgWF1Rfmltbfk=
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.225 h1:D7VbIl1P6/6Zj86HNiO7UmH05DDFnFLVA/ig31+Uy5c=
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.225/go.mod h1:g1IFIylu5Fd9pKjzq0mDvpaKhEB/vkwLAIbGdX2djXU=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0 h1:AyYVqo/2gNtgtx6Nq4USu9uH2MIE9pV5YXsMk5utdKw=
gitlab.com/unboundsoftware/eventsourced/amqp v1.7.0/go.mod h1:gmA1jjRBNPtOawpzwEkOABvRYE0rE187wSsBrCtnEBA=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0 h1:M23pbqxgwFc+bzLKEio4lj+fRSDoWjp6QHOHzdRRtw4=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.16.0/go.mod h1:UAf1o59zIANqyzFzcR7Z0pWp5rfd2wyz2XDSP4LJIdI=
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0 h1:wH74r4MIiLgFxV8U+aF6OfjpwBLjVmeWnd/dilgQmwY=
gitlab.com/unboundsoftware/eventsourced/pg v1.15.0/go.mod h1:u3niHnTGKssMUyHxiMDkl6IUEED8qHyX1pKJyy5cRmk=
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1 h1:MGHH2Uxp68J9i4V3/3vApB6gjBUjn6RjiPHhbc8Wsno=
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1/go.mod h1:clGBkdpFWb5/27aLOhJ6+DB15enJf+T4J5lR6X0lqAs=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2 h1:8sCnThNHEPB3BQomcJ7u6fmc2t043fAZSMmVPDDbQOs=
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2/go.mod h1:KeLn3U67hxbdFLfeXd0c0LI/r1C5rijbWrfNdARWe98=
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0 h1:pUJzMpNPX0GVsffRZXlpKR1d7Ws96KTxJwbLFPpASSc=
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0/go.mod h1:WgPrZhyCbsZ3TG2tPUbh2MUjOEaANJjsWi/0hlIwRVU=
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/bridges/otelslog v0.13.0 h1:bwnLpizECbPr1RrQ27waeY2SPIPeccCx/xLuoYADZ9s=
go.opentelemetry.io/contrib/bridges/otelslog v0.13.0/go.mod h1:3nWlOiiqA9UtUnrcNk82mYasNxD8ehOspL0gOfEo6Y4=
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0 h1:Oe2z/BCg5q7k4iXC3cqJxKYg0ieRiOqF0cecFYdPTwk=
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.38.0/go.mod h1:ZQM5lAJpOsKnYagGg/zV2krVqTtaVdYdDkhMoX6Oalg=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4=
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0 h1:B/g+qde6Mkzxbry5ZZag0l7QrQBCtVm7lVjaLgmpje8=
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.14.0/go.mod h1:mOJK8eMmgW6ocDJn6Bn11CcZ05gi3P8GylBXEkZtbgA=
go.opentelemetry.io/otel/log v0.14.0 h1:2rzJ+pOAZ8qmZ3DDHg73NEKzSZkhkGIua9gXtxNGgrM=
go.opentelemetry.io/otel/log v0.14.0/go.mod h1:5jRG92fEAgx0SU/vFPxmJvhIuDU9E1SUnEQrMlJpOno=
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI=
go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E=
go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg=
go.opentelemetry.io/otel/sdk/log v0.14.0 h1:JU/U3O7N6fsAXj0+CXz21Czg532dW2V4gG1HE/e8Zrg=
go.opentelemetry.io/otel/sdk/log v0.14.0/go.mod h1:imQvII+0ZylXfKU7/wtOND8Hn4OpT3YUoIgqJVksUkM=
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0 h1:Ijbtz+JKXl8T2MngiwqBlPaHqc4YCaP/i13Qrow6gAM=
go.opentelemetry.io/otel/sdk/log/logtest v0.14.0/go.mod h1:dCU8aEL6q+L9cYTqcVOk8rM9Tp8WdnHOPLiBgp0SGOA=
go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM=
go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA=
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
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-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0=
golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o=
golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8=
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24=
golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ=
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5 h1:BIRfGDEjiHRrk0QKZe3Xv2ieMhtgRGeLcZQ0mIVn4EY=
google.golang.org/genproto/googleapis/api v0.0.0-20250825161204-c5933d9347a5/go.mod h1:j3QtIyytwqGr1JUDtYXwtMXWPKsEa5LtzIFN1Wn5WvE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5 h1:eaY8u2EuxbRv7c3NiGK0/NedzVsCcV6hDuU5qPX5EGE=
google.golang.org/genproto/googleapis/rpc v0.0.0-20250825161204-c5933d9347a5/go.mod h1:M4/wBTSeyLxupu3W3tJtOgB14jILAS/XWPSSa3TAlJc=
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
google.golang.org/protobuf v1.36.8 h1:xHScyCOEuuwZEc6UtSOvPbAT4zRh0xcNRYekJwfqyMc=
google.golang.org/protobuf v1.36.8/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
@@ -232,17 +269,11 @@ gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C
gopkg.in/yaml.v3 v3.0.0-20200605160147-a5ece683394c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
modernc.org/libc v1.55.3 h1:AzcW1mhlPNrRtjS5sS+eW2ISCgSOLLNyFzRh/V3Qj/U=
modernc.org/libc v1.55.3/go.mod h1:qFXepLhz+JjFThQ4kzwzOjA/y/artDeg+pcYnY+Q83w=
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
modernc.org/memory v1.8.0 h1:IqGTL6eFMaDZZhEWwcREgeMXYwmW83LYW8cROZYkg+E=
modernc.org/memory v1.8.0/go.mod h1:XPZ936zp5OMKGWPqbD3JShgd/ZoQ7899TUuQqxY+peU=
modernc.org/sqlite v1.34.1 h1:u3Yi6M0N8t9yKRDwhXcyp1eS5/ErhPTBggxWFuR6Hfk=
modernc.org/sqlite v1.34.1/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k=
modernc.org/strutil v1.2.0 h1:agBi9dp1I+eOnxXeiZawM8F4LawKv4NzGWSaLfyeNZA=
modernc.org/strutil v1.2.0/go.mod h1:/mdcBmfOibveCTBxUl5B5l6W+TTH1FXPLHZE6bTosX0=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
modernc.org/token v1.1.0/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
modernc.org/memory v1.11.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek=
modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
File diff suppressed because it is too large Load Diff
+2 -2
View File
@@ -3,8 +3,8 @@ package graph
import (
"context"
"fmt"
"log/slog"
"github.com/apex/log"
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
"gitlab.com/unboundsoftware/schemas/cache"
@@ -26,7 +26,7 @@ type Publisher interface {
type Resolver struct {
EventStore eventsourced.EventStore
Publisher Publisher
Logger log.Interface
Logger *slog.Logger
Cache *cache.Cache
}
+1 -1
View File
@@ -9,7 +9,6 @@ import (
"fmt"
"strings"
"github.com/wundergraph/graphql-go-tools/pkg/federation/sdlmerge"
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
"gitlab.com/unboundsoftware/schemas/domain"
@@ -17,6 +16,7 @@ import (
"gitlab.com/unboundsoftware/schemas/graph/model"
"gitlab.com/unboundsoftware/schemas/middleware"
"gitlab.com/unboundsoftware/schemas/rand"
"gitlab.com/unboundsoftware/schemas/sdlmerge"
)
// AddOrganization is the resolver for the addOrganization field.
+1 -1
View File
@@ -2,7 +2,7 @@ apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
name: schemas
spec:
scaleTargetRef:
+7
View File
@@ -0,0 +1,7 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: schemas
data:
LOG_FORMAT: "otel"
ENVIRONMENT: "production"
+6
View File
@@ -0,0 +1,6 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: schemas
data:
ENVIRONMENT: "development"
+11 -11
View File
@@ -7,7 +7,7 @@ apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
name: schemas
annotations:
kubernetes.io/change-cause: "${TIMESTAMP} Deployed commit id: ${COMMIT}"
@@ -15,7 +15,7 @@ spec:
replicas: 1
selector:
matchLabels:
app: schemas
app.kubernetes.io/name: schemas
strategy:
rollingUpdate:
maxSurge: 1
@@ -24,7 +24,7 @@ spec:
template:
metadata:
labels:
app: schemas
app.kubernetes.io/name: schemas
spec:
affinity:
podAntiAffinity:
@@ -33,7 +33,7 @@ spec:
podAffinityTerm:
labelSelector:
matchExpressions:
- key: "app"
- key: "app.kubernetes.io/name"
operator: In
values:
- schemas
@@ -41,11 +41,8 @@ spec:
containers:
- name: schemas
resources:
limits:
cpu: "500m"
memory: "100Mi"
requests:
cpu: "10m"
cpu: "20m"
memory: "20Mi"
readinessProbe:
httpGet:
@@ -59,11 +56,14 @@ spec:
ports:
- name: api
containerPort: 8080
env:
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://k8s-monitoring-alloy-receiver.monitoring.svc.cluster.local:4318
envFrom:
- secretRef:
- configMapRef:
name: schemas
- secretRef:
name: rabbitmq
name: schemas
restartPolicy: Always
serviceAccountName: schemas
---
@@ -79,5 +79,5 @@ spec:
protocol: TCP
targetPort: 8080
selector:
app: schemas
app.kubernetes.io/name: schemas
type: NodePort
+9
View File
@@ -0,0 +1,9 @@
apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
name: schemas-pdb
spec:
minAvailable: 1
selector:
matchLabels:
app.kubernetes.io/name: schemas
+1
View File
@@ -5,3 +5,4 @@ metadata:
stringData:
API_KEY: supersecret123!
POSTGRES_URL: "postgres://postgres:postgres@postgres:5432/schemas?sslmode=disable"
AMQP_URL: "amqp://user:password@rabbitmq:5672/"
+5 -4
View File
@@ -1,8 +1,7 @@
apiVersion: external-secrets.io/v1beta1
apiVersion: external-secrets.io/v1
kind: ExternalSecret
metadata:
name: schemas
namespace: default
spec:
refreshInterval: 1h
secretStoreRef:
@@ -11,13 +10,15 @@ spec:
target:
creationPolicy: Owner
template:
mergePolicy: Merge
engineVersion: 'v2'
data:
POSTGRES_URL: "postgres://{{ .DB_USERNAME }}:{{ .DB_PASSWORD }}@{{ .DB_HOST }}:{{ .DB_PORT }}/schemas?sslmode=disable"
API_KEY: "{{ .API_KEY }}"
SENTRY_DSN: "{{ .SENTRY_DSN }}"
SENTRY_ENVIRONMENT: "{{ .SENTRY_ENVIRONMENT }}"
dataFrom:
- extract:
key: services/schemas
- extract:
key: rds/postgres/prod-psql
- extract:
key: mq/rabbit/prod
+65
View File
@@ -0,0 +1,65 @@
package logging
import (
"context"
"log/slog"
"os"
"go.opentelemetry.io/contrib/bridges/otelslog"
)
type Logger interface {
Info(msg string, args ...any)
Warn(msg string, args ...any)
Error(msg string, args ...any)
}
var defaultLogger *slog.Logger
type contextKey string
const loggerKey = contextKey("logger")
func SetupLogger(logLevel, logFormat, serviceName, buildVersion string) *slog.Logger {
var leveler slog.LevelVar
err := leveler.UnmarshalText([]byte(logLevel))
handlerOpts := &slog.HandlerOptions{
AddSource: false,
Level: leveler.Level(),
ReplaceAttr: nil,
}
var handler slog.Handler
switch logFormat {
case "json":
handler = slog.NewJSONHandler(os.Stdout, handlerOpts)
case "text":
handler = slog.NewTextHandler(os.Stdout, handlerOpts)
case "otel":
handler = otelslog.NewHandler(serviceName,
otelslog.WithVersion(buildVersion))
}
defaultLogger = slog.New(handler).With("service", serviceName).With("version", buildVersion)
if err != nil {
defaultLogger.With("err", err).Error("Failed to parse log level")
os.Exit(1)
}
slog.SetDefault(defaultLogger)
return defaultLogger
}
// ContextWithLogger returns a new Context with the logger attached
func ContextWithLogger(ctx context.Context, logger *slog.Logger) context.Context {
return context.WithValue(ctx, loggerKey, logger)
}
// LoggerFromContext returns a logger from the passed context or the default logger
func LoggerFromContext(ctx context.Context) *slog.Logger {
logger := ctx.Value(loggerKey)
if l, ok := logger.(*slog.Logger); ok {
return l
}
return defaultLogger
}
+48
View File
@@ -0,0 +1,48 @@
package logging
import (
"bytes"
"log/slog"
"strings"
"testing"
"github.com/stretchr/testify/assert"
)
func NewMockLogger() *MockLogger {
logged := &bytes.Buffer{}
return &MockLogger{
logged: logged,
logger: slog.New(slog.NewTextHandler(logged, &slog.HandlerOptions{
ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
if a.Key == "time" {
return slog.Attr{}
}
return a
},
})),
}
}
type MockLogger struct {
logger *slog.Logger
logged *bytes.Buffer
}
func (m *MockLogger) Logger() *slog.Logger {
return m.logger
}
func (m *MockLogger) Check(t testing.TB, wantLogged []string) {
var gotLogged []string
if m.logged.String() != "" {
gotLogged = strings.Split(m.logged.String(), "\n")
gotLogged = gotLogged[:len(gotLogged)-1]
}
if len(wantLogged) == 0 {
assert.Empty(t, gotLogged)
return
}
assert.Equal(t, wantLogged, gotLogged)
}
+41
View File
@@ -0,0 +1,41 @@
package monitoring
import (
"context"
"fmt"
"github.com/99designs/gqlgen/graphql"
"go.opentelemetry.io/otel/trace"
)
func AroundOperations(ctx context.Context, next graphql.OperationHandler) graphql.ResponseHandler {
op := graphql.GetOperationContext(ctx)
spanName := fmt.Sprintf("graphql:operation:%s", op.OperationName)
// Span always injected in the http handler above
sp := trace.SpanFromContext(ctx)
if sp != nil {
sp.SetName(spanName)
}
return next(ctx)
}
func AroundRootFields(ctx context.Context, next graphql.RootResolver) graphql.Marshaler {
oc := graphql.GetRootFieldContext(ctx)
spanCtx, span := StartSpan(ctx, fmt.Sprintf("graphql:rootfield:%s", oc.Field.Name))
defer span.Finish()
return next(spanCtx)
}
func AroundFields(ctx context.Context, next graphql.Resolver) (res any, err error) {
oc := graphql.GetFieldContext(ctx)
var span Span
if oc.IsResolver {
ctx, span = StartSpan(ctx, fmt.Sprintf("graphql:field:%s", oc.Field.Name))
}
defer func() {
if span != nil {
span.Finish()
}
}()
return next(ctx)
}
+100
View File
@@ -0,0 +1,100 @@
package monitoring
import (
"context"
"errors"
"fmt"
"net/http"
"os"
"time"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
"go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
"go.opentelemetry.io/otel/log/global"
"go.opentelemetry.io/otel/propagation"
"go.opentelemetry.io/otel/sdk/log"
"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/trace"
)
// SetupOTelSDK bootstraps the OpenTelemetry pipeline.
func SetupOTelSDK(ctx context.Context, enabled bool, serviceName, buildVersion, environment string) (func(context.Context) error, error) {
if os.Getenv("OTEL_RESOURCE_ATTRIBUTES") == "" {
if err := os.Setenv("OTEL_RESOURCE_ATTRIBUTES", fmt.Sprintf("service.name=%s,service.version=%s,service.environment=%s", serviceName, buildVersion, environment)); err != nil {
return func(context.Context) error {
return nil
}, err
}
}
var shutdownFuncs []func(context.Context) error
if !enabled {
return func(context.Context) error {
return nil
}, nil
}
shutdown := func(ctx context.Context) error {
var err error
for _, fn := range shutdownFuncs {
err = errors.Join(err, fn(ctx))
}
shutdownFuncs = nil
return err
}
// handleErr calls shutdown for cleanup and makes sure that all errors are returned.
handleErr := func(inErr error) (func(context.Context) error, error) {
return nil, errors.Join(inErr, shutdown(ctx))
}
// Set up the propagator.
prop := propagation.NewCompositeTextMapPropagator(
propagation.TraceContext{},
propagation.Baggage{},
)
otel.SetTextMapPropagator(prop)
traceExporter, err := otlptracehttp.New(ctx)
if err != nil {
return handleErr(err)
}
shutdownFuncs = append(shutdownFuncs, traceExporter.Shutdown)
tracerProvider := trace.NewTracerProvider(
trace.WithBatcher(traceExporter,
trace.WithBatchTimeout(5*time.Second)),
)
shutdownFuncs = append(shutdownFuncs, tracerProvider.Shutdown)
otel.SetTracerProvider(tracerProvider)
logExporter, err := stdoutlog.New()
if err != nil {
return handleErr(err)
}
processor := log.NewSimpleProcessor(logExporter)
logProvider := log.NewLoggerProvider(log.WithProcessor(processor))
global.SetLoggerProvider(logProvider)
shutdownFuncs = append(shutdownFuncs, logProvider.Shutdown)
exp, err := otlpmetrichttp.New(ctx)
if err != nil {
return handleErr(err)
}
meterProvider := metric.NewMeterProvider(metric.WithReader(metric.NewPeriodicReader(exp)))
shutdownFuncs = append(shutdownFuncs, meterProvider.Shutdown)
otel.SetMeterProvider(meterProvider)
return shutdown, err
}
func Handler(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := otel.GetTextMapPropagator().Extract(r.Context(), propagation.HeaderCarrier(r.Header))
spanCtx, s := StartSpan(ctx, "http")
defer s.Finish()
h.ServeHTTP(w, r.WithContext(spanCtx))
})
}
+46
View File
@@ -0,0 +1,46 @@
package monitoring
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/trace"
)
type Span interface {
Context() context.Context
Finish()
}
type span struct {
otelSpan trace.Span
ctx context.Context
}
func (s *span) Finish() {
s.otelSpan.End()
}
func (s *span) Context() context.Context {
return s.ctx
}
func StartSpan(ctx context.Context, name string, opts ...trace.SpanStartOption) (context.Context, Span) {
ctx, otelSpan := otel.Tracer("").Start(ctx, name, opts...)
return ctx, &span{
otelSpan: otelSpan,
ctx: ctx,
}
}
type TraceHandlerFunc func(ctx context.Context, name string) (context.Context, func())
func (t TraceHandlerFunc) Trace(tx context.Context, name string) (context.Context, func()) {
return t(tx, name)
}
func Trace(ctx context.Context, name string) (context.Context, func()) {
ctx, s := StartSpan(ctx, name)
return ctx, s.Finish
}
+6
View File
@@ -12,6 +12,12 @@
"registry.gitlab.com/unboundsoftware/schemas"
],
"enabled": false
},
{
"groupName": "Eventsourced",
"matchPackageNames": [
"gitlab.com/unboundsoftware/eventsourced/**"
]
}
]
}
+61
View File
@@ -0,0 +1,61 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type collectEntitiesVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func newCollectEntitiesVisitor(collectedEntities entitySet) *collectEntitiesVisitor {
return &collectEntitiesVisitor{
collectedEntities: collectedEntities,
}
}
func (c *collectEntitiesVisitor) Register(walker *astvisitor.Walker) {
c.Walker = walker
walker.RegisterEnterDocumentVisitor(c)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(c)
walker.RegisterEnterObjectTypeDefinitionVisitor(c)
}
func (c *collectEntitiesVisitor) EnterDocument(operation, _ *ast.Document) {
c.document = operation
}
func (c *collectEntitiesVisitor) EnterInterfaceTypeDefinition(ref int) {
interfaceType := c.document.InterfaceTypeDefinitions[ref]
name := c.document.InterfaceTypeDefinitionNameString(ref)
if err := c.resolvePotentialEntity(name, interfaceType.Directives.Refs); err != nil {
c.StopWithExternalErr(*err)
}
}
func (c *collectEntitiesVisitor) EnterObjectTypeDefinition(ref int) {
objectType := c.document.ObjectTypeDefinitions[ref]
name := c.document.ObjectTypeDefinitionNameString(ref)
if err := c.resolvePotentialEntity(name, objectType.Directives.Refs); err != nil {
c.StopWithExternalErr(*err)
}
}
func (c *collectEntitiesVisitor) resolvePotentialEntity(name string, directiveRefs []int) *operationreport.ExternalError {
if _, exists := c.collectedEntities[name]; exists {
err := operationreport.ErrEntitiesMustNotBeDuplicated(name)
return &err
}
for _, directiveRef := range directiveRefs {
if c.document.DirectiveNameString(directiveRef) != "key" {
continue
}
c.collectedEntities[name] = struct{}{}
return nil
}
return nil
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type extendEnumTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func newExtendEnumTypeDefinition() *extendEnumTypeDefinitionVisitor {
return &extendEnumTypeDefinitionVisitor{}
}
func (e *extendEnumTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterEnumTypeExtensionVisitor(e)
}
func (e *extendEnumTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendEnumTypeDefinitionVisitor) EnterEnumTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.EnumTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindEnumTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.EnumTypeExtensionNameString(ref)))
return
}
e.document.ExtendEnumTypeDefinitionByEnumTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.EnumTypeExtensionNameBytes(ref)))
}
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendInputObjectTypeDefinition() *extendInputObjectTypeDefinitionVisitor {
return &extendInputObjectTypeDefinitionVisitor{}
}
type extendInputObjectTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendInputObjectTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterInputObjectTypeExtensionVisitor(e)
}
func (e *extendInputObjectTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendInputObjectTypeDefinitionVisitor) EnterInputObjectTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.InputObjectTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindInputObjectTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.InputObjectTypeExtensionNameString(ref)))
return
}
e.document.ExtendInputObjectTypeDefinitionByInputObjectTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.InputObjectTypeExtensionNameBytes(ref)))
}
}
+63
View File
@@ -0,0 +1,63 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendInterfaceTypeDefinition(collectedEntities entitySet) *extendInterfaceTypeDefinitionVisitor {
return &extendInterfaceTypeDefinitionVisitor{
collectedEntities: collectedEntities,
}
}
type extendInterfaceTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func (e *extendInterfaceTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterInterfaceTypeExtensionVisitor(e)
}
func (e *extendInterfaceTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendInterfaceTypeDefinitionVisitor) EnterInterfaceTypeExtension(ref int) {
nameBytes := e.document.InterfaceTypeExtensionNameBytes(ref)
nodes, exists := e.document.Index.NodesByNameBytes(nameBytes)
if !exists {
return
}
var nodeToExtend *ast.Node
isEntity := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindInterfaceTypeDefinition {
continue
}
if nodeToExtend != nil {
e.StopWithExternalErr(*multipleExtensionError(isEntity, nameBytes))
return
}
var err *operationreport.ExternalError
extension := e.document.InterfaceTypeExtensions[ref]
if isEntity, err = e.collectedEntities.isExtensionForEntity(nameBytes, extension.Directives.Refs, e.document); err != nil {
e.StopWithExternalErr(*err)
return
}
nodeToExtend = &nodes[i]
}
if nodeToExtend == nil {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.InterfaceTypeExtensionNameBytes(ref)))
return
}
e.document.ExtendInterfaceTypeDefinitionByInterfaceTypeExtension(nodeToExtend.Ref, ref)
}
+62
View File
@@ -0,0 +1,62 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type mergeDuplicatedFieldsVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func newMergeDuplicatedFieldsVisitor() *mergeDuplicatedFieldsVisitor {
return &mergeDuplicatedFieldsVisitor{
nil,
nil,
}
}
func (m *mergeDuplicatedFieldsVisitor) Register(walker *astvisitor.Walker) {
m.Walker = walker
walker.RegisterEnterDocumentVisitor(m)
walker.RegisterLeaveObjectTypeDefinitionVisitor(m)
}
func (m *mergeDuplicatedFieldsVisitor) EnterDocument(document, _ *ast.Document) {
m.document = document
}
func (m *mergeDuplicatedFieldsVisitor) LeaveObjectTypeDefinition(ref int) {
var refsForDeletion []int
fieldByTypeRefSet := make(map[string]int)
for _, fieldRef := range m.document.ObjectTypeDefinitions[ref].FieldsDefinition.Refs {
fieldName := m.document.FieldDefinitionNameString(fieldRef)
newTypeRef := m.document.FieldDefinitions[fieldRef].Type
if oldTypeRef, ok := fieldByTypeRefSet[fieldName]; ok {
if m.document.TypesAreEqualDeep(oldTypeRef, newTypeRef) {
refsForDeletion = append(refsForDeletion, fieldRef)
continue
}
oldFieldTypeNameBytes, err := m.document.PrintTypeBytes(oldTypeRef, nil)
if err != nil {
m.StopWithInternalErr(err)
return
}
newFieldTypeNameBytes, err := m.document.PrintTypeBytes(newTypeRef, nil)
if err != nil {
m.StopWithInternalErr(err)
return
}
m.StopWithExternalErr(operationreport.ErrDuplicateFieldsMustBeIdentical(
fieldName, m.document.ObjectTypeDefinitionNameString(ref), string(oldFieldTypeNameBytes), string(newFieldTypeNameBytes),
))
return
}
fieldByTypeRefSet[fieldName] = newTypeRef
}
m.document.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
}
+66
View File
@@ -0,0 +1,66 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendObjectTypeDefinition(collectedEntities entitySet) *extendObjectTypeDefinitionVisitor {
return &extendObjectTypeDefinitionVisitor{
collectedEntities: collectedEntities,
}
}
type extendObjectTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
collectedEntities entitySet
}
func (e *extendObjectTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterObjectTypeExtensionVisitor(e)
}
func (e *extendObjectTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendObjectTypeDefinitionVisitor) EnterObjectTypeExtension(ref int) {
nameBytes := e.document.ObjectTypeExtensionNameBytes(ref)
nodes, exists := e.document.Index.NodesByNameBytes(nameBytes)
if !exists {
return
}
var nodeToExtend *ast.Node
isEntity := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindObjectTypeDefinition {
continue
}
if nodeToExtend != nil {
e.StopWithExternalErr(*multipleExtensionError(isEntity, nameBytes))
return
}
var err *operationreport.ExternalError
extension := e.document.ObjectTypeExtensions[ref]
if isEntity, err = e.collectedEntities.isExtensionForEntity(nameBytes, extension.Directives.Refs, e.document); err != nil {
e.StopWithExternalErr(*err)
return
}
nodeToExtend = &nodes[i]
if ast.IsRootType(nameBytes) {
break
}
}
if nodeToExtend == nil {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(nameBytes))
return
}
e.document.ExtendObjectTypeDefinitionByObjectTypeExtension(nodeToExtend.Ref, ref)
}
@@ -0,0 +1,107 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type removeDuplicateFieldedSharedTypesVisitor struct {
*astvisitor.Walker
document *ast.Document
sharedTypeSet map[string]fieldedSharedType
rootNodesToRemove []ast.Node
lastInputRef int
lastInterfaceRef int
lastObjectRef int
}
func newRemoveDuplicateFieldedSharedTypesVisitor() *removeDuplicateFieldedSharedTypesVisitor {
return &removeDuplicateFieldedSharedTypesVisitor{
nil,
nil,
make(map[string]fieldedSharedType),
nil,
ast.InvalidRef,
ast.InvalidRef,
ast.InvalidRef,
}
}
func (r *removeDuplicateFieldedSharedTypesVisitor) Register(walker *astvisitor.Walker) {
r.Walker = walker
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterInputObjectTypeDefinitionVisitor(r)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(r)
walker.RegisterEnterObjectTypeDefinitionVisitor(r)
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterDocument(operation, _ *ast.Document) {
r.document = operation
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterInputObjectTypeDefinition(ref int) {
if ref <= r.lastInputRef {
return
}
name := r.document.InputObjectTypeDefinitionNameString(ref)
refs := r.document.InputObjectTypeDefinitions[ref].InputFieldsDefinition.Refs
input, exists := r.sharedTypeSet[name]
if exists {
if !input.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInputObjectTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindInputValueDefinition, refs)
}
r.lastInputRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterInterfaceTypeDefinition(ref int) {
if ref <= r.lastInterfaceRef {
return
}
name := r.document.InterfaceTypeDefinitionNameString(ref)
interfaceType := r.document.InterfaceTypeDefinitions[ref]
refs := interfaceType.FieldsDefinition.Refs
iFace, exists := r.sharedTypeSet[name]
if exists {
if !iFace.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindInterfaceTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindFieldDefinition, refs)
}
r.lastInterfaceRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) EnterObjectTypeDefinition(ref int) {
if ref <= r.lastObjectRef {
return
}
name := r.document.ObjectTypeDefinitionNameString(ref)
objectType := r.document.ObjectTypeDefinitions[ref]
refs := objectType.FieldsDefinition.Refs
object, exists := r.sharedTypeSet[name]
if exists {
if !object.areFieldsIdentical(refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindObjectTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newFieldedSharedType(r.document, ast.NodeKindFieldDefinition, refs)
}
r.lastObjectRef = ref
}
func (r *removeDuplicateFieldedSharedTypesVisitor) LeaveDocument(_, _ *ast.Document) {
if r.rootNodesToRemove != nil {
r.document.DeleteRootNodes(r.rootNodesToRemove)
}
}
@@ -0,0 +1,98 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
type removeDuplicateFieldlessSharedTypesVisitor struct {
*astvisitor.Walker
document *ast.Document
sharedTypeSet map[string]fieldlessSharedType
rootNodesToRemove []ast.Node
lastEnumRef int
lastUnionRef int
lastScalarRef int
}
func newRemoveDuplicateFieldlessSharedTypesVisitor() *removeDuplicateFieldlessSharedTypesVisitor {
return &removeDuplicateFieldlessSharedTypesVisitor{
nil,
nil,
make(map[string]fieldlessSharedType),
nil,
ast.InvalidRef,
ast.InvalidRef,
ast.InvalidRef,
}
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) Register(walker *astvisitor.Walker) {
r.Walker = walker
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterEnumTypeDefinitionVisitor(r)
walker.RegisterEnterScalarTypeDefinitionVisitor(r)
walker.RegisterEnterUnionTypeDefinitionVisitor(r)
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterDocument(operation, _ *ast.Document) {
r.document = operation
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterEnumTypeDefinition(ref int) {
if ref <= r.lastEnumRef {
return
}
name := r.document.EnumTypeDefinitionNameString(ref)
enum, exists := r.sharedTypeSet[name]
if exists {
if !enum.areValuesIdentical(r.document.EnumTypeDefinitions[ref].EnumValuesDefinition.Refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindEnumTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newEnumSharedType(r.document, ref)
}
r.lastEnumRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterScalarTypeDefinition(ref int) {
if ref <= r.lastScalarRef {
return
}
name := r.document.ScalarTypeDefinitionNameString(ref)
_, exists := r.sharedTypeSet[name]
if exists {
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindScalarTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = scalarSharedType{}
}
r.lastScalarRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) EnterUnionTypeDefinition(ref int) {
if ref <= r.lastUnionRef {
return
}
name := r.document.UnionTypeDefinitionNameString(ref)
union, exists := r.sharedTypeSet[name]
if exists {
if !union.areValuesIdentical(r.document.UnionTypeDefinitions[ref].UnionMemberTypes.Refs) {
r.StopWithExternalErr(operationreport.ErrSharedTypesMustBeIdenticalToFederate(name))
return
}
r.rootNodesToRemove = append(r.rootNodesToRemove, ast.Node{Kind: ast.NodeKindUnionTypeDefinition, Ref: ref})
} else {
r.sharedTypeSet[name] = newUnionSharedType(r.document, ref)
}
r.lastUnionRef = ref
}
func (r *removeDuplicateFieldlessSharedTypesVisitor) LeaveDocument(_, _ *ast.Document) {
if r.rootNodesToRemove != nil {
r.document.DeleteRootNodes(r.rootNodesToRemove)
}
}
@@ -0,0 +1,32 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveEmptyObjectTypeDefinition() *removeEmptyObjectTypeDefinition {
return &removeEmptyObjectTypeDefinition{}
}
type removeEmptyObjectTypeDefinition struct{}
func (r *removeEmptyObjectTypeDefinition) Register(walker *astvisitor.Walker) {
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeEmptyObjectTypeDefinition) LeaveDocument(operation, _ *ast.Document) {
for ref := range operation.ObjectTypeDefinitions {
if operation.ObjectTypeDefinitions[ref].HasFieldDefinitions {
continue
}
name := operation.ObjectTypeDefinitionNameString(ref)
node, ok := operation.Index.FirstNodeByNameStr(name)
if !ok {
return
}
operation.RemoveRootNode(node)
}
}
@@ -0,0 +1,46 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveFieldDefinitions(directives ...string) *removeFieldDefinitionByDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeFieldDefinitionByDirective{
directives: directivesSet,
}
}
type removeFieldDefinitionByDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeFieldDefinitionByDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterLeaveObjectTypeDefinitionVisitor(r)
}
func (r *removeFieldDefinitionByDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeFieldDefinitionByDirective) LeaveObjectTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, fieldRef := range r.operation.ObjectTypeDefinitions[ref].FieldsDefinition.Refs {
for _, directiveRef := range r.operation.FieldDefinitions[fieldRef].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, fieldRef)
}
}
}
// delete fields
r.operation.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
}
@@ -0,0 +1,44 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveFieldDefinitionDirective(directives ...string) *removeFieldDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeFieldDefinitionDirective{
directives: directivesSet,
}
}
type removeFieldDefinitionDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeFieldDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterFieldDefinitionVisitor(r)
}
func (r *removeFieldDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeFieldDefinitionDirective) EnterFieldDefinition(ref int) {
var refsForDeletion []int
// select directives for deletion
for _, directiveRef := range r.operation.FieldDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindFieldDefinition, Ref: ref}, refsForDeletion)
}
@@ -0,0 +1,45 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveInterfaceDefinitionDirective(directives ...string) *removeInterfaceDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeInterfaceDefinitionDirective{
directives: directivesSet,
}
}
type removeInterfaceDefinitionDirective struct {
*astvisitor.Walker
operation *ast.Document
directives map[string]struct{}
}
func (r *removeInterfaceDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterInterfaceTypeDefinitionVisitor(r)
}
func (r *removeInterfaceDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeInterfaceDefinitionDirective) EnterInterfaceTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, directiveRef := range r.operation.InterfaceTypeDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindInterfaceTypeDefinition, Ref: ref}, refsForDeletion)
}
@@ -0,0 +1,44 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveObjectTypeDefinitionDirective(directives ...string) *removeObjectTypeDefinitionDirective {
directivesSet := make(map[string]struct{}, len(directives))
for _, directive := range directives {
directivesSet[directive] = struct{}{}
}
return &removeObjectTypeDefinitionDirective{
directives: directivesSet,
}
}
type removeObjectTypeDefinitionDirective struct {
operation *ast.Document
directives map[string]struct{}
}
func (r *removeObjectTypeDefinitionDirective) Register(walker *astvisitor.Walker) {
walker.RegisterEnterDocumentVisitor(r)
walker.RegisterEnterObjectTypeDefinitionVisitor(r)
}
func (r *removeObjectTypeDefinitionDirective) EnterDocument(operation, _ *ast.Document) {
r.operation = operation
}
func (r *removeObjectTypeDefinitionDirective) EnterObjectTypeDefinition(ref int) {
var refsForDeletion []int
// select fields for deletion
for _, directiveRef := range r.operation.ObjectTypeDefinitions[ref].Directives.Refs {
directiveName := r.operation.DirectiveNameString(directiveRef)
if _, ok := r.directives[directiveName]; ok {
refsForDeletion = append(refsForDeletion, directiveRef)
}
}
// delete directives
r.operation.RemoveDirectivesFromNode(ast.Node{Kind: ast.NodeKindObjectTypeDefinition, Ref: ref}, refsForDeletion)
}
+20
View File
@@ -0,0 +1,20 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
)
func newRemoveMergedTypeExtensions() *removeMergedTypeExtensionsVisitor {
return &removeMergedTypeExtensionsVisitor{}
}
type removeMergedTypeExtensionsVisitor struct{}
func (r *removeMergedTypeExtensionsVisitor) Register(walker *astvisitor.Walker) {
walker.RegisterLeaveDocumentVisitor(r)
}
func (r *removeMergedTypeExtensionsVisitor) LeaveDocument(operation, definition *ast.Document) {
operation.RemoveMergedTypeExtensions()
}
+49
View File
@@ -0,0 +1,49 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendScalarTypeDefinition() *extendScalarTypeDefinitionVisitor {
return &extendScalarTypeDefinitionVisitor{}
}
type extendScalarTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendScalarTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterScalarTypeExtensionVisitor(e)
}
func (e *extendScalarTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendScalarTypeDefinitionVisitor) EnterScalarTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.ScalarTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindScalarTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.ScalarTypeExtensionNameString(ref)))
return
}
e.document.ExtendScalarTypeDefinitionByScalarTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.ScalarTypeExtensionNameBytes(ref)))
}
}
+205
View File
@@ -0,0 +1,205 @@
package sdlmerge
import (
"fmt"
"strings"
"github.com/wundergraph/graphql-go-tools/v2/pkg/asttransform"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvalidation"
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astnormalization"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astparser"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astprinter"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
const (
rootOperationTypeDefinitions = `
type Query {}
type Mutation {}
type Subscription {}
`
parseDocumentError = "parse graphql document string: %w"
)
type Visitor interface {
Register(walker *astvisitor.Walker)
}
func MergeAST(ast *ast.Document) error {
normalizer := normalizer{}
normalizer.setupWalkers()
return normalizer.normalize(ast)
}
func MergeSDLs(SDLs ...string) (string, error) {
rawDocs := make([]string, 0, len(SDLs)+1)
rawDocs = append(rawDocs, rootOperationTypeDefinitions)
rawDocs = append(rawDocs, SDLs...)
if validationError := validateSubgraphs(rawDocs[1:]); validationError != nil {
return "", validationError
}
if normalizationError := normalizeSubgraphs(rawDocs[1:]); normalizationError != nil {
return "", normalizationError
}
doc, report := astparser.ParseGraphqlDocumentString(strings.Join(rawDocs, "\n"))
if report.HasErrors() {
return "", fmt.Errorf("parse graphql document string: %w", report)
}
astnormalization.NormalizeSubgraphSDL(&doc, &report)
if report.HasErrors() {
return "", fmt.Errorf("merge ast: %w", report)
}
if err := MergeAST(&doc); err != nil {
return "", fmt.Errorf("merge ast: %w", err)
}
out, err := astprinter.PrintString(&doc)
if err != nil {
return "", fmt.Errorf("stringify schema: %w", err)
}
return out, nil
}
func validateSubgraphs(subgraphs []string) error {
validator := astvalidation.NewDefinitionValidator(
astvalidation.PopulatedTypeBodies(), astvalidation.KnownTypeNames(),
)
for _, subgraph := range subgraphs {
doc, report := astparser.ParseGraphqlDocumentString(subgraph)
if err := asttransform.MergeDefinitionWithBaseSchema(&doc); err != nil {
return err
}
if report.HasErrors() {
return fmt.Errorf(parseDocumentError, report)
}
validator.Validate(&doc, &report)
if report.HasErrors() {
return fmt.Errorf("validate schema: %w", report)
}
}
return nil
}
func normalizeSubgraphs(subgraphs []string) error {
subgraphNormalizer := astnormalization.NewSubgraphDefinitionNormalizer()
for i, subgraph := range subgraphs {
doc, report := astparser.ParseGraphqlDocumentString(subgraph)
if report.HasErrors() {
return fmt.Errorf(parseDocumentError, report)
}
subgraphNormalizer.NormalizeDefinition(&doc, &report)
if report.HasErrors() {
return fmt.Errorf("normalize schema: %w", report)
}
out, err := astprinter.PrintString(&doc)
if err != nil {
return fmt.Errorf("stringify schema: %w", err)
}
subgraphs[i] = out
}
return nil
}
type normalizer struct {
walkers []*astvisitor.Walker
}
type entitySet map[string]struct{}
func (m *normalizer) setupWalkers() {
collectedEntities := make(entitySet)
visitorGroups := [][]Visitor{
{
newCollectEntitiesVisitor(collectedEntities),
},
{
newExtendEnumTypeDefinition(),
newExtendInputObjectTypeDefinition(),
newExtendInterfaceTypeDefinition(collectedEntities),
newExtendScalarTypeDefinition(),
newExtendUnionTypeDefinition(),
newExtendObjectTypeDefinition(collectedEntities),
newRemoveEmptyObjectTypeDefinition(),
newRemoveMergedTypeExtensions(),
},
// visitors for cleaning up federated duplicated fields and directives
{
newRemoveFieldDefinitions("external"),
newRemoveDuplicateFieldedSharedTypesVisitor(),
newRemoveDuplicateFieldlessSharedTypesVisitor(),
newMergeDuplicatedFieldsVisitor(),
newRemoveInterfaceDefinitionDirective("key"),
newRemoveObjectTypeDefinitionDirective("key"),
newRemoveFieldDefinitionDirective("provides", "requires"),
},
}
for _, visitorGroup := range visitorGroups {
walker := astvisitor.NewWalker(48)
for _, visitor := range visitorGroup {
visitor.Register(&walker)
m.walkers = append(m.walkers, &walker)
}
}
}
func (m *normalizer) normalize(operation *ast.Document) error {
report := operationreport.Report{}
for _, walker := range m.walkers {
walker.Walk(operation, nil, &report)
if report.HasErrors() {
return fmt.Errorf("walk: %w", report)
}
}
return nil
}
func (e entitySet) isExtensionForEntity(nameBytes []byte, directiveRefs []int, document *ast.Document) (bool, *operationreport.ExternalError) {
name := string(nameBytes)
hasDirectives := len(directiveRefs) > 0
if _, exists := e[name]; !exists {
if !hasDirectives || !isEntityExtension(directiveRefs, document) {
return false, nil
}
err := operationreport.ErrExtensionWithKeyDirectiveMustExtendEntity(name)
return false, &err
}
if !hasDirectives {
err := operationreport.ErrEntityExtensionMustHaveKeyDirective(name)
return false, &err
}
if isEntityExtension(directiveRefs, document) {
return true, nil
}
err := operationreport.ErrEntityExtensionMustHaveKeyDirective(name)
return false, &err
}
func isEntityExtension(directiveRefs []int, document *ast.Document) bool {
for _, directiveRef := range directiveRefs {
if document.DirectiveNameString(directiveRef) == "key" {
return true
}
}
return false
}
func multipleExtensionError(isEntity bool, nameBytes []byte) *operationreport.ExternalError {
if isEntity {
err := operationreport.ErrEntitiesMustNotBeDuplicated(string(nameBytes))
return &err
}
err := operationreport.ErrSharedTypesMustNotBeExtended(string(nameBytes))
return &err
}
+167
View File
@@ -0,0 +1,167 @@
package sdlmerge
import "github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
type fieldlessSharedType interface {
areValuesIdentical(valueRefsToCompare []int) bool
valueRefs() []int
valueName(ref int) string
}
func createValueSet(f fieldlessSharedType) map[string]bool {
valueSet := make(map[string]bool)
for _, valueRef := range f.valueRefs() {
valueSet[f.valueName(valueRef)] = true
}
return valueSet
}
type fieldedSharedType struct {
document *ast.Document
fieldKind ast.NodeKind
fieldRefs []int
fieldSet map[string]int
}
func newFieldedSharedType(document *ast.Document, fieldKind ast.NodeKind, fieldRefs []int) fieldedSharedType {
f := fieldedSharedType{
document,
fieldKind,
fieldRefs,
nil,
}
f.createFieldSet()
return f
}
func (f fieldedSharedType) areFieldsIdentical(fieldRefsToCompare []int) bool {
if len(f.fieldRefs) != len(fieldRefsToCompare) {
return false
}
for _, fieldRef := range fieldRefsToCompare {
actualFieldName := f.fieldName(fieldRef)
expectedTypeRef, exists := f.fieldSet[actualFieldName]
if !exists {
return false
}
actualTypeRef := f.fieldTypeRef(fieldRef)
if !f.document.TypesAreCompatibleDeep(expectedTypeRef, actualTypeRef) {
return false
}
}
return true
}
func (f *fieldedSharedType) createFieldSet() {
fieldSet := make(map[string]int)
for _, fieldRef := range f.fieldRefs {
fieldSet[f.fieldName(fieldRef)] = f.fieldTypeRef(fieldRef)
}
f.fieldSet = fieldSet
}
func (f fieldedSharedType) fieldName(ref int) string {
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
return f.document.InputValueDefinitionNameString(ref)
default:
return f.document.FieldDefinitionNameString(ref)
}
}
func (f fieldedSharedType) fieldTypeRef(ref int) int {
switch f.fieldKind {
case ast.NodeKindInputValueDefinition:
return f.document.InputValueDefinitions[ref].Type
default:
return f.document.FieldDefinitions[ref].Type
}
}
type enumSharedType struct {
*ast.EnumTypeDefinition
document *ast.Document
valueSet map[string]bool
}
func newEnumSharedType(document *ast.Document, ref int) enumSharedType {
e := enumSharedType{
&document.EnumTypeDefinitions[ref],
document,
nil,
}
e.valueSet = createValueSet(e)
return e
}
func (e enumSharedType) areValuesIdentical(valueRefsToCompare []int) bool {
if len(e.valueRefs()) != len(valueRefsToCompare) {
return false
}
for _, valueRefToCompare := range valueRefsToCompare {
name := e.valueName(valueRefToCompare)
if !e.valueSet[name] {
return false
}
}
return true
}
func (e enumSharedType) valueRefs() []int {
return e.EnumValuesDefinition.Refs
}
func (e enumSharedType) valueName(ref int) string {
return e.document.EnumValueDefinitionNameString(ref)
}
type unionSharedType struct {
*ast.UnionTypeDefinition
document *ast.Document
valueSet map[string]bool
}
func newUnionSharedType(document *ast.Document, ref int) unionSharedType {
u := unionSharedType{
&document.UnionTypeDefinitions[ref],
document,
nil,
}
u.valueSet = createValueSet(u)
return u
}
func (u unionSharedType) areValuesIdentical(valueRefsToCompare []int) bool {
if len(u.valueRefs()) != len(valueRefsToCompare) {
return false
}
for _, refToCompare := range valueRefsToCompare {
name := u.valueName(refToCompare)
if !u.valueSet[name] {
return false
}
}
return true
}
func (u unionSharedType) valueRefs() []int {
return u.UnionMemberTypes.Refs
}
func (u unionSharedType) valueName(ref int) string {
return u.document.TypeNameString(ref)
}
type scalarSharedType struct{}
func (scalarSharedType) areValuesIdentical(_ []int) bool {
return true
}
func (scalarSharedType) valueRefs() []int {
return nil
}
func (scalarSharedType) valueName(_ int) string {
return ""
}
+50
View File
@@ -0,0 +1,50 @@
package sdlmerge
import (
"github.com/wundergraph/graphql-go-tools/v2/pkg/ast"
"github.com/wundergraph/graphql-go-tools/v2/pkg/astvisitor"
"github.com/wundergraph/graphql-go-tools/v2/pkg/operationreport"
)
func newExtendUnionTypeDefinition() *extendUnionTypeDefinitionVisitor {
return &extendUnionTypeDefinitionVisitor{}
}
type extendUnionTypeDefinitionVisitor struct {
*astvisitor.Walker
document *ast.Document
}
func (e *extendUnionTypeDefinitionVisitor) Register(walker *astvisitor.Walker) {
e.Walker = walker
walker.RegisterEnterDocumentVisitor(e)
walker.RegisterEnterUnionTypeExtensionVisitor(e)
}
func (e *extendUnionTypeDefinitionVisitor) EnterDocument(operation, _ *ast.Document) {
e.document = operation
}
func (e *extendUnionTypeDefinitionVisitor) EnterUnionTypeExtension(ref int) {
nodes, exists := e.document.Index.NodesByNameBytes(e.document.UnionTypeExtensionNameBytes(ref))
if !exists {
return
}
hasExtended := false
for i := range nodes {
if nodes[i].Kind != ast.NodeKindUnionTypeDefinition {
continue
}
if hasExtended {
e.StopWithExternalErr(operationreport.ErrSharedTypesMustNotBeExtended(e.document.UnionTypeExtensionNameString(ref)))
return
}
e.document.ExtendUnionTypeDefinitionByUnionTypeExtension(nodes[i].Ref, ref)
hasExtended = true
}
if !hasExtended {
e.StopWithExternalErr(operationreport.ErrExtensionOrphansMustResolveInSupergraph(e.document.UnionTypeExtensionNameBytes(ref)))
}
}