Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| d0afaa7815 | |||
|
ee378dc6a3
|
|||
|
7ffa9a3881
|
|||
|
683bf6bd85
|
|||
|
17a3edbc07
|
|||
|
318e211196
|
|||
| bf0b8f5935 | |||
| 1232ca62b2 | |||
| f6a1e47361 | |||
| f96e6e860b | |||
| 44cc6ccd16 | |||
| 6abc49a3fc | |||
| 7d7836fedf | |||
|
f62a8037bc
|
|||
| 08bba81ba0 | |||
| 881ff122f8 | |||
| 0d384e8a3f | |||
|
f49156f637
|
|||
| 62869e4a77 | |||
| ab2c55fb39 | |||
| ef271a88a9 | |||
|
14d3733bf5
|
|||
| 2cc4e379bc | |||
| d39427c9ff | |||
| 2cb2ba9754 | |||
| 53d5c21b77 | |||
| 2b09f6c3c5 | |||
| 9f2be264c3 | |||
| 31e8d8cd49 | |||
| b4e4c9e2e3 | |||
| 35bf4eb6dc | |||
| 7ddca97cce | |||
| 3a78d90c4b | |||
|
84b7d2bf74
|
|||
| 16008218a5 | |||
| 0908099d34 | |||
|
74823a8947
|
|||
| c5dcc6f87a | |||
| 8f2a88f405 | |||
| d88b6f2ee8 | |||
| 21e32b5b09 | |||
| cd08e429e8 | |||
| 73fdd8a2e7 | |||
| c73a6a2c1f | |||
| 22e0952012 | |||
| fe52ddbb3a | |||
| e229458c39 | |||
| c64f5ce1df | |||
| 7a95c98573 | |||
| 03ba8a774c | |||
| 23da66078a | |||
| 1e50301c3c | |||
| 8de129c925 | |||
| 660f07f3cd | |||
| fed6e512d3 | |||
| f1b7a36103 | |||
| 74ee419e56 | |||
| f8aa95ccd5 | |||
| e013762fd9 | |||
| f1ca04fb07 | |||
|
4be0518209
|
|||
| 649c297d5b | |||
| bc43aa3fae | |||
|
2861e9d067
|
|||
| cc668505e6 | |||
| 7af4548a8b | |||
| 8ce0fffb02 | |||
| 03cd2ab9a3 | |||
|
6bf0e2c12b
|
|||
| 6fc27915c9 | |||
| f18dbcae92 | |||
| c4ac7c6b6c | |||
| d8681ac484 | |||
| 75d9b9d719 | |||
| 09909ed26c | |||
| 68b80c51c1 | |||
| feec5b7bf2 | |||
|
b1c31afed3
|
|||
|
7fc195e44e
|
|||
| 8cb62f47b3 | |||
|
52ffdde1ca
|
|||
|
75909a3797
|
|||
| d605d8fa63 | |||
| 6809635518 | |||
| ffde98ffa7 | |||
| e14974623b | |||
| 1ac137a27d | |||
| b6fe4a34a3 | |||
| 8c269381d5 | |||
| 523be169ad | |||
| d3d197ab65 | |||
| 3992e6f61d | |||
| 92c7880271 | |||
| 1017c29527 | |||
| 1016a20fc3 | |||
| 9b388ef2eb | |||
| d8287c0797 | |||
| 1258c47ef5 | |||
| 01a6a79fd9 | |||
| dd7786d690 | |||
| d717fddec9 | |||
| cfa48a2b81 | |||
| 49cc4b392f | |||
| f9625ac4f5 | |||
| 91f232c54c | |||
| a97ed6018a | |||
| 9ccea01c4c | |||
| ad68feb8af | |||
|
9200aad878
|
|||
| 8cfa8a7e75 | |||
| 2720e14e8b | |||
| aed67aa0a3 | |||
| a7ce266a41 | |||
| 2235427f48 | |||
|
d07a714d3c
|
|||
| ce366061fc | |||
| 6200594ac6 | |||
| fcda9f1c46 | |||
| 6c505385e4 | |||
| 765a9abc04 | |||
| e8c1a56f40 | |||
| 06bb2d9ea8 | |||
|
e6152b379f
|
|||
| d5a171eb76 | |||
| 5472216ae8 | |||
| f364b7c8c7 | |||
| 9ceecd52f6 | |||
| 846614ca2f |
+10
-25
@@ -2,6 +2,8 @@ include:
|
||||
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
|
||||
- project: unboundsoftware/ci-templates
|
||||
file: Release.gitlab-ci.yml
|
||||
- project: unboundsoftware/ci-templates
|
||||
file: Pre-Commit-Go.gitlab-ci.yml
|
||||
|
||||
stages:
|
||||
- build
|
||||
@@ -11,34 +13,13 @@ stages:
|
||||
|
||||
variables:
|
||||
UNBOUND_RELEASE_TAG_ONLY: true
|
||||
DOCKER_HOST: tcp://docker:2376
|
||||
DOCKER_TLS_CERTDIR: "/certs"
|
||||
DOCKER_TLS_VERIFY: 1
|
||||
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
||||
DOCKER_DRIVER: overlay2
|
||||
|
||||
.buildtools:
|
||||
image: buildtool/build-tools:${BUILDTOOLS_VERSION}
|
||||
services:
|
||||
- docker:${DOCKER_DIND_VERSION}
|
||||
|
||||
run-pre-commit:
|
||||
stage: .pre
|
||||
image: unbound/pre-commit
|
||||
variables:
|
||||
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
|
||||
cache:
|
||||
- key:
|
||||
files:
|
||||
- .pre-commit-config.yaml
|
||||
paths:
|
||||
- ${PRE_COMMIT_HOME}
|
||||
script:
|
||||
- pre-commit run --all-files
|
||||
|
||||
check:
|
||||
stage: .pre
|
||||
image: golang:1.23.2
|
||||
image: amd64/golang:1.24.0@sha256:4a3f1013f696a1f86314902f2c9907fe712eabc91e911cc9fde4fdc57a16d35d
|
||||
script:
|
||||
- go install mvdan.cc/gofumpt@latest
|
||||
- go install golang.org/x/tools/cmd/goimports@latest
|
||||
@@ -57,7 +38,7 @@ build:
|
||||
|
||||
vulnerabilities:
|
||||
stage: build
|
||||
image: golang:1.23.2
|
||||
image: amd64/golang:1.24.0@sha256:4a3f1013f696a1f86314902f2c9907fe712eabc91e911cc9fde4fdc57a16d35d
|
||||
script:
|
||||
- go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||
- govulncheck ./...
|
||||
@@ -73,12 +54,15 @@ deploy-prod:
|
||||
- if: $CI_COMMIT_BRANCH == "main"
|
||||
environment:
|
||||
name: prod
|
||||
resource_group: prod
|
||||
|
||||
check_release:
|
||||
stage: test
|
||||
image:
|
||||
name: goreleaser/goreleaser:v2.3.2
|
||||
name: goreleaser/goreleaser:v2.7.0@sha256:41247b711fc423eddcd8395b998b9de5c7d169bfe99e6a474ba35e87896c1343
|
||||
entrypoint: [ '' ]
|
||||
variables:
|
||||
GOTOOLCHAIN: auto
|
||||
script: |
|
||||
goreleaser check
|
||||
goreleaser release --snapshot --clean
|
||||
@@ -88,13 +72,14 @@ release:
|
||||
needs:
|
||||
- unbound_release_prepare_release
|
||||
image:
|
||||
name: goreleaser/goreleaser:v2.3.2
|
||||
name: goreleaser/goreleaser:v2.7.0@sha256:41247b711fc423eddcd8395b998b9de5c7d169bfe99e6a474ba35e87896c1343
|
||||
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
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
run:
|
||||
allow-parallel-runners: true
|
||||
timeout: 5m
|
||||
|
||||
@@ -18,7 +18,7 @@ repos:
|
||||
- --project
|
||||
- unboundsoftware/schemas
|
||||
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
|
||||
rev: v9.18.0
|
||||
rev: v9.21.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.61.0
|
||||
rev: v1.64.5
|
||||
hooks:
|
||||
- id: golangci-lint-full
|
||||
- repo: https://github.com/gitleaks/gitleaks
|
||||
rev: v8.21.1
|
||||
rev: v8.24.0
|
||||
hooks:
|
||||
- id: gitleaks
|
||||
exclude: '^ctl/generated.go|graph/generated/.*$|^graph/model/models_gen.go|^tools/.*$$'
|
||||
|
||||
@@ -2,6 +2,87 @@
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [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
|
||||
|
||||
- Add timeout configuration to golangci-lint
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- *(deps)* Update module github.com/alecthomas/kong to v1.3.0
|
||||
- No digest pinning of own image
|
||||
- *(deps)* Update module github.com/alecthomas/kong to v1.4.0
|
||||
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.19
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.56
|
||||
- *(deps)* Update module github.com/pressly/goose/v3 to v3.23.0
|
||||
- *(deps)* Update module github.com/stretchr/testify to v1.10.0
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.57
|
||||
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.20
|
||||
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.16.0
|
||||
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.7.0
|
||||
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/pg to v1.15.0
|
||||
- *(deps)* Update module github.com/alecthomas/kong to v1.5.0
|
||||
- *(deps)* Update module github.com/alecthomas/kong to v1.5.1
|
||||
- *(deps)* Update module github.com/getsentry/sentry-go to v0.30.0
|
||||
- *(deps)* Update module github.com/alecthomas/kong to v1.6.0
|
||||
- *(k8s)* Adjust CPU requests for better resource allocation
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.58
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.59
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.60
|
||||
- *(deps)* Update module github.com/pressly/goose/v3 to v3.23.1
|
||||
- *(deps)* Update module github.com/pressly/goose/v3 to v3.24.0
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.61
|
||||
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.21
|
||||
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.62
|
||||
|
||||
### 🚜 Refactor
|
||||
|
||||
- Use common pre-commit job
|
||||
|
||||
### ⚙️ Miscellaneous Tasks
|
||||
|
||||
- Remove unnecessary Docker variables from configuration
|
||||
- *(ci)* Remove unused docker service from buildtools
|
||||
|
||||
## [0.0.7] - 2024-10-22
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
FROM golang:1.23.2 as modules
|
||||
FROM amd64/golang:1.24.0@sha256:4a3f1013f696a1f86314902f2c9907fe712eabc91e911cc9fde4fdc57a16d35d as modules
|
||||
WORKDIR /build
|
||||
ADD go.* /build
|
||||
RUN go mod download
|
||||
|
||||
+20
-3
@@ -12,6 +12,9 @@ import (
|
||||
"time"
|
||||
|
||||
"github.com/99designs/gqlgen/graphql/handler"
|
||||
"github.com/99designs/gqlgen/graphql/handler/extension"
|
||||
"github.com/99designs/gqlgen/graphql/handler/lru"
|
||||
"github.com/99designs/gqlgen/graphql/handler/transport"
|
||||
"github.com/99designs/gqlgen/graphql/playground"
|
||||
"github.com/alecthomas/kong"
|
||||
"github.com/apex/log"
|
||||
@@ -20,6 +23,7 @@ import (
|
||||
sentryhttp "github.com/getsentry/sentry-go/http"
|
||||
"github.com/rs/cors"
|
||||
"github.com/sparetimecoders/goamqp"
|
||||
"github.com/vektah/gqlparser/v2/ast"
|
||||
"gitlab.com/unboundsoftware/eventsourced/amqp"
|
||||
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
||||
"gitlab.com/unboundsoftware/eventsourced/pg"
|
||||
@@ -201,9 +205,22 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
|
||||
mw := middleware.NewAuth0("https://schemas.unbound.se", cli.Issuer, cli.StrictSSL)
|
||||
authMiddleware := middleware.NewAuth(serviceCache)
|
||||
config.Directives.Auth = authMiddleware.Directive
|
||||
srv := handler.NewDefaultServer(generated.NewExecutableSchema(
|
||||
config,
|
||||
))
|
||||
srv := handler.New(generated.NewExecutableSchema(config))
|
||||
|
||||
srv.AddTransport(transport.Websocket{
|
||||
KeepAlivePingInterval: 10 * time.Second,
|
||||
})
|
||||
srv.AddTransport(transport.Options{})
|
||||
srv.AddTransport(transport.GET{})
|
||||
srv.AddTransport(transport.POST{})
|
||||
srv.AddTransport(transport.MultipartForm{})
|
||||
|
||||
srv.SetQueryCache(lru.New[*ast.QueryDocument](1000))
|
||||
|
||||
srv.Use(extension.Introspection{})
|
||||
srv.Use(extension.AutomaticPersistedQuery{
|
||||
Cache: lru.New[string](100),
|
||||
})
|
||||
|
||||
sentryHandler := sentryhttp.New(sentryhttp.Options{Repanic: true})
|
||||
mux.Handle("/", sentryHandler.HandleFunc(playground.Handler("GraphQL playground", "/query")))
|
||||
|
||||
@@ -1,61 +1,58 @@
|
||||
module gitlab.com/unboundsoftware/schemas
|
||||
|
||||
go 1.22.5
|
||||
|
||||
toolchain go1.23.2
|
||||
go 1.23.6
|
||||
|
||||
require (
|
||||
github.com/99designs/gqlgen v0.17.55
|
||||
github.com/Khan/genqlient v0.7.0
|
||||
github.com/alecthomas/kong v1.2.1
|
||||
github.com/99designs/gqlgen v0.17.66
|
||||
github.com/Khan/genqlient v0.8.0
|
||||
github.com/alecthomas/kong v1.8.1
|
||||
github.com/apex/log v1.9.0
|
||||
github.com/auth0/go-jwt-middleware/v2 v2.2.2
|
||||
github.com/getsentry/sentry-go v0.29.1
|
||||
github.com/getsentry/sentry-go v0.31.1
|
||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
||||
github.com/jmoiron/sqlx v1.4.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/pressly/goose/v3 v3.22.1
|
||||
github.com/pressly/goose/v3 v3.24.1
|
||||
github.com/rs/cors v1.11.1
|
||||
github.com/sparetimecoders/goamqp v0.3.1
|
||||
github.com/stretchr/testify v1.9.0
|
||||
github.com/vektah/gqlparser/v2 v2.5.18
|
||||
github.com/wundergraph/graphql-go-tools v1.67.4
|
||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.6.6
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.15.0
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.4
|
||||
github.com/stretchr/testify v1.10.0
|
||||
github.com/vektah/gqlparser/v2 v2.5.23
|
||||
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.160
|
||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.0
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.17.0
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.16.0
|
||||
)
|
||||
|
||||
require (
|
||||
github.com/agnivade/levenshtein v1.1.1 // 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.4 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
|
||||
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||
github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
|
||||
github.com/google/uuid v1.6.0 // indirect
|
||||
github.com/gorilla/websocket v1.5.1 // 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/mitchellh/mapstructure v1.5.0 // 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.4 // indirect
|
||||
github.com/urfave/cli/v2 v2.27.5 // indirect
|
||||
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 // indirect
|
||||
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
||||
go.uber.org/multierr v1.11.0 // indirect
|
||||
golang.org/x/mod v0.20.0 // indirect
|
||||
golang.org/x/net v0.29.0 // indirect
|
||||
golang.org/x/sync v0.8.0 // indirect
|
||||
golang.org/x/sys v0.25.0 // indirect
|
||||
golang.org/x/text v0.18.0 // indirect
|
||||
golang.org/x/tools v0.24.0 // indirect
|
||||
golang.org/x/mod v0.23.0 // indirect
|
||||
golang.org/x/net v0.35.0 // indirect
|
||||
golang.org/x/sync v0.11.0 // indirect
|
||||
golang.org/x/sys v0.30.0 // indirect
|
||||
golang.org/x/text v0.22.0 // indirect
|
||||
golang.org/x/tools v0.30.0 // indirect
|
||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||
)
|
||||
|
||||
@@ -1,19 +1,19 @@
|
||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||
github.com/99designs/gqlgen v0.17.55 h1:3vzrNWYyzSZjGDFo68e5j9sSauLxfKvLp+6ioRokVtM=
|
||||
github.com/99designs/gqlgen v0.17.55/go.mod h1:3Bq768f8hgVPGZxL8aY9MaYmbxa6llPM/qu1IGH1EJo=
|
||||
github.com/99designs/gqlgen v0.17.66 h1:2/SRc+h3115fCOZeTtsqrB5R5gTGm+8qCAwcrZa+CXA=
|
||||
github.com/99designs/gqlgen v0.17.66/go.mod h1:gucrb5jK5pgCKzAGuOMMVU9C8PnReecHEHd2UxLQwCg=
|
||||
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/Khan/genqlient v0.8.0 h1:Hd1a+E1CQHYbMEKakIkvBH3zW0PWEeiX6Hp1i2kP2WE=
|
||||
github.com/Khan/genqlient v0.8.0/go.mod h1:hn70SpYjWteRGvxTwo0kfaqg4wxvndECGkfa1fdDdYI=
|
||||
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.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
|
||||
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
|
||||
github.com/alecthomas/assert/v2 v2.10.0 h1:jjRCHsj6hBJhkmhznrCzoNpbA3zqy0fYiUcYZP/GkPY=
|
||||
github.com/alecthomas/assert/v2 v2.10.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||
github.com/alecthomas/kong v1.2.1 h1:E8jH4Tsgv6wCRX2nGrdPyHDUCSG83WH2qE4XLACD33Q=
|
||||
github.com/alecthomas/kong v1.2.1/go.mod h1:rKTSFhbdp3Ryefn8x5MOEprnRFQ7nlmMC01GKhehhBM=
|
||||
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.8.1 h1:6aamvWBE/REnR/BCq10EcozmcpUPc5aGI1lPAWdB0EE=
|
||||
github.com/alecthomas/kong v1.8.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=
|
||||
@@ -35,30 +35,28 @@ github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMU
|
||||
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.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
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/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=
|
||||
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g=
|
||||
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
|
||||
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=
|
||||
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.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA=
|
||||
github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0=
|
||||
github.com/getsentry/sentry-go v0.31.1 h1:ELVc0h7gwyhnXHDouXkhqTFSO5oslsRDk0++eyE0KJ4=
|
||||
github.com/getsentry/sentry-go v0.31.1/go.mod h1:CYNcMMz73YigoHljQRG+qPF+eMq8gG72XcGN/p71BAY=
|
||||
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-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/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=
|
||||
@@ -73,8 +71,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf
|
||||
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=
|
||||
@@ -101,8 +97,6 @@ github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxU
|
||||
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
|
||||
github.com/mfridman/interpolate v0.0.2/go.mod h1:p+7uk6oE07mpE/Ik1b8EckO0O4ZXiGAfshKBWLUM9Xg=
|
||||
github.com/mgutz/ansi v0.0.0-20170206155736-9520e82c474b/go.mod h1:01TrycV0kFyexm33Z7vhZRXopbI8J3TDReVlkTgMUxE=
|
||||
github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
|
||||
github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
|
||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
||||
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=
|
||||
@@ -114,8 +108,8 @@ 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.22.1 h1:2zICEfr1O3yTP9BRZMGPj7qFxQ+ik6yeo+z1LMuioLc=
|
||||
github.com/pressly/goose/v3 v3.22.1/go.mod h1:xtMpbstWyCpyH+0cxLTMCENWBG+0CSxvTsXhW95d5eo=
|
||||
github.com/pressly/goose/v3 v3.24.1 h1:bZmxRco2uy5uu5Ng1MMVEfYsFlrMJI+e/VMXHQ3C4LY=
|
||||
github.com/pressly/goose/v3 v3.24.1/go.mod h1:rEWreU9uVtt0DHCyLzF9gRcWiiTF/V+528DV+4DORug=
|
||||
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=
|
||||
@@ -127,10 +121,8 @@ 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/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.5.3 h1:9ES/mNN+HNUbNWpVAlrzuZ7jE+Nrczbj8uFRjM7624Y=
|
||||
github.com/sebdah/goldie/v2 v2.5.3/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
|
||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
||||
@@ -146,16 +138,10 @@ github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERA
|
||||
github.com/sparetimecoders/goamqp v0.3.1 h1:NCzdyAz84G679HlO+ivhyoI1aMgXEe3qfqpn4EChu1s=
|
||||
github.com/sparetimecoders/goamqp v0.3.1/go.mod h1:PjkgrmsuMVgRbiQDTLs0pCWYrcQgqcUee38JjCDZdlk=
|
||||
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.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||
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/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 +159,53 @@ 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.4 h1:o1owoI+02Eb+K107p27wEX9Bb8eqIoZCfLXloLUSWJ8=
|
||||
github.com/urfave/cli/v2 v2.27.4/go.mod h1:m4QzxcD2qpra4z7WhzEGn74WZLViBnMpb1ToCAKdGRQ=
|
||||
github.com/vektah/gqlparser/v2 v2.5.18 h1:zSND3GtutylAQ1JpWnTHcqtaRZjl+y3NROeW8vuNo6Y=
|
||||
github.com/vektah/gqlparser/v2 v2.5.18/go.mod h1:6HLzf7JKv9Fi3APymudztFQNmLXR5qJeEo6BOFcXVfc=
|
||||
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.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.23 h1:PurJ9wpgEVB7tty1seRUwkIDa/QH5RzkzraiKIjKLfA=
|
||||
github.com/vektah/gqlparser/v2 v2.5.23/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.160 h1:whZcpumOJNwJg71M56VGZ/Ex4TnYeGjmzhWa6+1X+uI=
|
||||
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.160/go.mod h1:B7eV0Qh8Lop9QzIOQcsvKp3S0ejfC6mgyWoJnI917yQ=
|
||||
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.6.6 h1:v0HmyqTBBODtJf0kCxt/g8iJuLp31EfjPLVbDVnSt38=
|
||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.6.6/go.mod h1:dUyrC2fqHNkW8yFT/XQYtITxgFT/Q4U7le3efu8p0qU=
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.15.0 h1:dW/w53Mz/TykCU7led8VTUoNZzy57o9MPjbK5I/4+mo=
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.15.0/go.mod h1:8IGvjd/6NXjLUrmyETGjr+IkiEIuRSPlefwiLlnoBUM=
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.4 h1:8akaF80HFGfaPba2uE8VL3w6W8rv4HlATmrqMczbTKo=
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.4/go.mod h1:O8sLw27s5ulJJOVX6TdmkWg3N2pVlrd3s8QSvwF+CB4=
|
||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.0 h1:Ez3UuXvveyV/HlphqWUWZU/05DuhqKfgF9r6tCJigEI=
|
||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.0/go.mod h1:HO9ZBFAvBNRhVS3hXPuGMW7zyENDfoqjLCUAzPWw3so=
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.17.0 h1:CWttfHbytJb7eZ1hflwYkQ7W/c9meHLOjjxguPeZm28=
|
||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.17.0/go.mod h1:KeLn3U67hxbdFLfeXd0c0LI/r1C5rijbWrfNdARWe98=
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.16.0 h1:n4ZoGseeBM/+12pRxMdNI0XYPaWghxPGJNcWbN30c0o=
|
||||
gitlab.com/unboundsoftware/eventsourced/pg v1.16.0/go.mod h1:zHnnTcR7xzh6Z/iZASZaDQpFsa8kefcXDbcMEeFFbNc=
|
||||
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.27.0 h1:GXm2NjJrPaiv/h1tb2UH8QfgC/hOf/+z0p6PT8o1w7A=
|
||||
golang.org/x/crypto v0.27.0/go.mod h1:1Xngt8kV6Dvbssa53Ziq6Eqn0HqbZi5Z6R0ZpwQzt70=
|
||||
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.33.0 h1:IOBPskki6Lysi0lo9qQvbxiQ+FvsCC/YWOecCHAixus=
|
||||
golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M=
|
||||
golang.org/x/mod v0.23.0 h1:Zb7khfcRGKk+kqfxFaP5tZqCnDZMjC5VtUBs87Hr6QM=
|
||||
golang.org/x/mod v0.23.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
||||
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.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo=
|
||||
golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0=
|
||||
golang.org/x/net v0.35.0 h1:T5GQRQb2y08kTAByq9L4/bz8cipCdA8FbRTXewonqY8=
|
||||
golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
|
||||
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
||||
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.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34=
|
||||
golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
|
||||
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
||||
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.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
||||
golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM=
|
||||
golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY=
|
||||
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.30.0 h1:BgcpHewrV5AUp2G9MebG4XPFI1E2W41zU1SaqVA9vJY=
|
||||
golang.org/x/tools v0.30.0/go.mod h1:c347cR/OJfw5TI+GfX7RUPNMdDRRbjvYTS0jPyvsVtY=
|
||||
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=
|
||||
@@ -228,20 +216,20 @@ gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEI
|
||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
||||
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
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.33.0 h1:WWkA/T2G17okiLGgKAj4/RMIvgyMT19yQ038160IeYk=
|
||||
modernc.org/sqlite v1.33.0/go.mod h1:9uQ9hF/pCZoYZK73D/ud5Z7cIRIILSZI8NdIemVMTX8=
|
||||
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=
|
||||
|
||||
+462
-257
File diff suppressed because it is too large
Load Diff
@@ -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
@@ -2,7 +2,7 @@ apiVersion: autoscaling/v2
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
labels:
|
||||
app: schemas
|
||||
app.kubernetes.io/name: schemas
|
||||
name: schemas
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
|
||||
+6
-6
@@ -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
|
||||
@@ -45,7 +45,7 @@ spec:
|
||||
cpu: "500m"
|
||||
memory: "100Mi"
|
||||
requests:
|
||||
cpu: "100m"
|
||||
cpu: "10m"
|
||||
memory: "20Mi"
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
@@ -79,5 +79,5 @@ spec:
|
||||
protocol: TCP
|
||||
targetPort: 8080
|
||||
selector:
|
||||
app: schemas
|
||||
app.kubernetes.io/name: schemas
|
||||
type: NodePort
|
||||
|
||||
@@ -2,5 +2,22 @@
|
||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||
"extends": [
|
||||
"config:recommended"
|
||||
],
|
||||
"packageRules": [
|
||||
{
|
||||
"matchManagers": [
|
||||
"kubernetes"
|
||||
],
|
||||
"matchPackageNames": [
|
||||
"registry.gitlab.com/unboundsoftware/schemas"
|
||||
],
|
||||
"enabled": false
|
||||
},
|
||||
{
|
||||
"groupName": "Eventsourced",
|
||||
"matchPackageNames": [
|
||||
"gitlab.com/unboundsoftware/eventsourced/**"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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.Walker.StopWithInternalErr(err)
|
||||
return
|
||||
}
|
||||
newFieldTypeNameBytes, err := m.document.PrintTypeBytes(newTypeRef, nil)
|
||||
if err != nil {
|
||||
m.Walker.StopWithInternalErr(err)
|
||||
return
|
||||
}
|
||||
m.Walker.StopWithExternalErr(operationreport.ErrDuplicateFieldsMustBeIdentical(
|
||||
fieldName, m.document.ObjectTypeDefinitionNameString(ref), string(oldFieldTypeNameBytes), string(newFieldTypeNameBytes),
|
||||
))
|
||||
return
|
||||
}
|
||||
|
||||
fieldByTypeRefSet[fieldName] = newTypeRef
|
||||
}
|
||||
|
||||
m.document.RemoveFieldDefinitionsFromObjectTypeDefinition(refsForDeletion, ref)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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()
|
||||
}
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
@@ -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 ""
|
||||
}
|
||||
@@ -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)))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user