Compare commits
379 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6eac3a7796 | |||
| 890a6fd50e | |||
| e1cf0d8cb3 | |||
| 63d70d7e35 | |||
| 35a454f8b1 | |||
| 6651553246 | |||
| 311ef3f530 | |||
| d8cce2fb05 | |||
| 309b9423a4 | |||
| 323145a076 | |||
| 28b4dc5572 | |||
| c1173c20ae | |||
| 2d12077016 | |||
| c38db83cd1 | |||
| 25bd438d05 | |||
| f4355d620f | |||
| 887ba69c5e | |||
| 8e6c7aade7 | |||
| 0f0f50111f | |||
| 81a895e5a6 | |||
|
0fab1d5098
|
|||
| 4fbfc0f42e | |||
| 0ba3706c12 | |||
| c44ac87b5e | |||
| deefcd7045 | |||
| 4933857351 | |||
| 18616e8346 | |||
| dd075afb8d | |||
| 003bd3cd50 | |||
| a68fb437dc | |||
| 8aa57e8f68 | |||
| 84e8764054 | |||
| c40bbad892 | |||
| c159c6d20e | |||
| ae0d796e93 | |||
| 1ec0f9a3a7 | |||
| 0dad651959 | |||
| 24fcc4e6a2 | |||
| 4c7406d97b | |||
| 51affc5a55 | |||
| 10871a9b32 | |||
| 411b51f895 | |||
| 6a478209ea | |||
| 043ca65698 | |||
| 8131042a1c | |||
| 2fb2c1947a | |||
| 1cf4faa17f | |||
| 8bb6cb7279 | |||
|
376ae41b4f
|
|||
| dc6e57e815 | |||
| f8c7de447a | |||
| 92050aa31f | |||
| e20829bb2b | |||
| 1918ec3da4 | |||
| 735c387c58 | |||
| 98e2f660a6 | |||
| 7a0159a33f | |||
|
b4447bb15e
|
|||
|
2948905005
|
|||
| 53141720ca | |||
|
e84df1db08
|
|||
| 9539e6bb1b | |||
| 291ef08ad7 | |||
| 98b84772df | |||
| 26278066b8 | |||
| 5bdacce71a | |||
|
0b4bbdeef0
|
|||
| 3c3c939447 | |||
|
93a12a2909
|
|||
| c36802570a | |||
| 5d64a3a45c | |||
| e55d3400e6 | |||
| 7da95e7566 | |||
| b8ea2690fc | |||
| 3689486fa8 | |||
| 1787815299 | |||
| 2886835d18 | |||
| 097e1274db | |||
| 640ede7de2 | |||
| 122c87dab4 | |||
| 4647d7ad1e | |||
| f2c73e8bf6 | |||
| ba7bbd082a | |||
| 2466d2a4ab | |||
| 86a61a1a64 | |||
| 75e85c0339 | |||
| d654ef1b81 | |||
|
55114c3d39
|
|||
| 0575c45d66 | |||
| d004745244 | |||
| 36ef6a85c2 | |||
| aa8363428f | |||
| 36a387040f | |||
| 5cf10efe15 | |||
| 73624e21d7 | |||
|
f53321368d
|
|||
|
59e0f17769
|
|||
| 8661c931a1 | |||
| f484bea8c4 | |||
| 8c4f579cef | |||
| 30ccbf9aab | |||
| 5973c1341d | |||
| 0285549431 | |||
|
3256819705
|
|||
| 578354ddeb | |||
| 12adc9bc48 | |||
| a44937e130 | |||
| 04a88bf310 | |||
| c1e5ee97ee | |||
| 66dd948181 | |||
| 6fc87e952b | |||
| dade16a10c | |||
| aa617ae11d | |||
|
a87b480345
|
|||
| 69e232cd7c | |||
| 5adfe0e711 | |||
| 7fa947a945 | |||
| a4552cb418 | |||
| c15371c236 | |||
|
aaa111dd20
|
|||
|
8e02bfb0a2
|
|||
| 1e34fe77eb | |||
| 30ca9091d2 | |||
|
4dd79e3d73
|
|||
| bdfbf6c22e | |||
| b6a281b5f2 | |||
| e8305441bb | |||
|
dd5c0f3dc0
|
|||
| f35be93cb6 | |||
| 3840c40c90 | |||
|
2ba10d763d
|
|||
| ba099eff51 | |||
| 2196f5a417 | |||
| 3e26aa0166 | |||
| fdf6402b7c | |||
| c6a5711dff | |||
| f82935e71a | |||
| b8053b6273 | |||
| 4086ddf73c | |||
| 8d5ff3863d | |||
| 19233af4a7 | |||
| b6ed3c7ad9 | |||
| 05eaa96d37 | |||
| 9b8f98c2d2 | |||
| d6a862ee94 | |||
| 574e6c8926 | |||
|
15eda6f0de
|
|||
| 46b624568e | |||
| 72bbf92265 | |||
| 313e43016b | |||
| 570a0114b3 | |||
|
a9c07bf4c2
|
|||
| f126c23b45 | |||
| 65dc35a5fc | |||
| b57080c9d0 | |||
| 19a826608c | |||
| 316d4a4c34 | |||
| 48873bf5ee | |||
| f9cce092b5 | |||
| ae8aa21388 | |||
| 7ba1d3ae08 | |||
| fd6e4a0cbd | |||
| 856b140538 | |||
| fdfbf823a6 | |||
| 697e6c3d75 | |||
| fdbb57e33a | |||
| 07057d7206 | |||
| 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 | |||
| 26614c9270 | |||
|
75307f53ca
|
|||
| bf2248c53c | |||
| 1f071316d1 | |||
| 694434219c | |||
| 456c749db7 | |||
| c28dbd5a61 | |||
| 4274303441 | |||
| b51ad6526f | |||
| bd41057595 | |||
| b091326684 | |||
| 114ce7f43d | |||
| 0eb67f6144 | |||
| 42d13ff3c0 | |||
| 9203cc3396 | |||
| 93ea2f1627 | |||
| 6bf3ee8348 | |||
| e5ad0ba9cf | |||
| 84ef5b1750 | |||
| 7ea24199c0 | |||
| 5cc4ed6f9d | |||
| ab7e4ed2cf | |||
| 1ae6af6163 | |||
|
c6748fc1ad
|
|||
| 903738da9f | |||
| e0c775cba1 | |||
| e55acc3c6f | |||
| 09066e17d2 | |||
|
1d1041c6bf
|
|||
| 0fd1a1ec2b | |||
| 03ab5a77c7 | |||
| a268493733 | |||
| 9f043af220 | |||
| 35f3d16da8 | |||
| ac87dcaf95 | |||
| 31b7497bc3 | |||
| aa7f44233b | |||
| f52983b305 | |||
| dd94ae193d | |||
| e7e09b70aa | |||
| 9393a199fa | |||
| c4e30881d6 | |||
| 07ca26768e | |||
|
a7491261a0
|
|||
| f36d5df9ad | |||
| 6152399901 | |||
| bb4972abf9 | |||
| a7fc4d9189 | |||
| d941c83bce | |||
| 4fef4d9130 | |||
| 69df8b4f77 | |||
| f41e2307cd | |||
| 5eb524e2eb | |||
| 6b8332293c | |||
| e897686b12 | |||
| 144d01bec5 | |||
| e90226aa77 | |||
| a0af1955ca | |||
| 6190438540 | |||
| 14489eed7f | |||
| 49e4486cac | |||
| 190e70723b | |||
| c887dc969f | |||
| d0c553dd9c | |||
| eed427e50b | |||
| bb90aec4c4 | |||
| 44d966cc0d | |||
| 9b52ac4d6b | |||
| ae74889f56 | |||
| 83886cf762 | |||
| 4b9d7f7b1f | |||
| 9c64a7adce | |||
| 14cab92b11 | |||
| 28a069a8bb | |||
| a07c304a6d | |||
| f6dee4b4af | |||
| 21fc644d39 | |||
| b4d4ce9031 | |||
| 038adeeddb | |||
| c5ec82b20a | |||
| 622fa3fca6 | |||
|
087ddaa7c1
|
|||
| 4b21d4366c | |||
|
27da6e122d
|
@@ -5,3 +5,5 @@ coverage.html
|
|||||||
/exported
|
/exported
|
||||||
/release
|
/release
|
||||||
/schemactl
|
/schemactl
|
||||||
|
CHANGES.md
|
||||||
|
VERSION
|
||||||
|
|||||||
+35
-36
@@ -1,36 +1,32 @@
|
|||||||
include:
|
include:
|
||||||
- template: 'Workflows/MergeRequest-Pipelines.gitlab-ci.yml'
|
- 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
|
||||||
|
file: Pre-Commit-Go.gitlab-ci.yml
|
||||||
|
|
||||||
stages:
|
stages:
|
||||||
- build
|
- build
|
||||||
|
- test
|
||||||
- deploy-prod
|
- deploy-prod
|
||||||
- release
|
- release
|
||||||
|
|
||||||
variables:
|
variables:
|
||||||
DOCKER_HOST: tcp://docker:2376
|
UNBOUND_RELEASE_TAG_ONLY: true
|
||||||
DOCKER_TLS_CERTDIR: "/certs"
|
|
||||||
DOCKER_TLS_VERIFY: 1
|
|
||||||
DOCKER_CERT_PATH: "$DOCKER_TLS_CERTDIR/client"
|
|
||||||
DOCKER_DRIVER: overlay2
|
|
||||||
|
|
||||||
.buildtools:
|
.buildtools:
|
||||||
image: buildtool/build-tools:${BUILDTOOLS_VERSION}
|
image: buildtool/build-tools:${BUILDTOOLS_VERSION}
|
||||||
services:
|
|
||||||
- docker:${DOCKER_DIND_VERSION}
|
|
||||||
|
|
||||||
run-pre-commit:
|
check:
|
||||||
stage: .pre
|
stage: .pre
|
||||||
image: unbound/pre-commit
|
image: amd64/golang:1.25.0@sha256:36e95221032d4c929d001ae5c1059ba1fbe1dec3b1f5c74d2708583d3141e151
|
||||||
variables:
|
|
||||||
PRE_COMMIT_HOME: ${CI_PROJECT_DIR}/.cache/pre-commit
|
|
||||||
cache:
|
|
||||||
- key:
|
|
||||||
files:
|
|
||||||
- .pre-commit-config.yaml
|
|
||||||
paths:
|
|
||||||
- ${PRE_COMMIT_HOME}
|
|
||||||
script:
|
script:
|
||||||
- pre-commit run --all-files
|
- go install mvdan.cc/gofumpt@latest
|
||||||
|
- go install golang.org/x/tools/cmd/goimports@latest
|
||||||
|
- go generate ./...
|
||||||
|
- git diff --stat --exit-code
|
||||||
|
|
||||||
build:
|
build:
|
||||||
extends: .buildtools
|
extends: .buildtools
|
||||||
@@ -44,7 +40,7 @@ build:
|
|||||||
|
|
||||||
vulnerabilities:
|
vulnerabilities:
|
||||||
stage: build
|
stage: build
|
||||||
image: golang:1.22.1
|
image: amd64/golang:1.25.0@sha256:36e95221032d4c929d001ae5c1059ba1fbe1dec3b1f5c74d2708583d3141e151
|
||||||
script:
|
script:
|
||||||
- go install golang.org/x/vuln/cmd/govulncheck@latest
|
- go install golang.org/x/vuln/cmd/govulncheck@latest
|
||||||
- govulncheck ./...
|
- govulncheck ./...
|
||||||
@@ -60,31 +56,34 @@ deploy-prod:
|
|||||||
- if: $CI_COMMIT_BRANCH == "main"
|
- if: $CI_COMMIT_BRANCH == "main"
|
||||||
environment:
|
environment:
|
||||||
name: prod
|
name: prod
|
||||||
|
resource_group: prod
|
||||||
|
|
||||||
|
check_release:
|
||||||
|
stage: test
|
||||||
|
image:
|
||||||
|
name: goreleaser/goreleaser:v2.11.2@sha256:649e73dbf38046e0fdfbb74b74df89a51530ab6bd846dfc36319fe2d1221ca71
|
||||||
|
entrypoint: [ '' ]
|
||||||
|
variables:
|
||||||
|
GOTOOLCHAIN: auto
|
||||||
|
script: |
|
||||||
|
goreleaser check
|
||||||
|
goreleaser release --snapshot --clean
|
||||||
|
|
||||||
release:
|
release:
|
||||||
stage: release
|
stage: release
|
||||||
image: docker:stable
|
needs:
|
||||||
services:
|
- unbound_release_prepare_release
|
||||||
- docker:${DOCKER_DIND_VERSION}
|
image:
|
||||||
|
name: goreleaser/goreleaser:v2.11.2@sha256:649e73dbf38046e0fdfbb74b74df89a51530ab6bd846dfc36319fe2d1221ca71
|
||||||
|
entrypoint: [ '' ]
|
||||||
variables:
|
variables:
|
||||||
GORELEASER_IMAGE: goreleaser/goreleaser:v1.25.0-amd64
|
|
||||||
# Disable shallow cloning so that goreleaser can diff between tags to
|
# Disable shallow cloning so that goreleaser can diff between tags to
|
||||||
# generate a changelog.
|
# generate a changelog.
|
||||||
GIT_DEPTH: 0
|
GIT_DEPTH: 0
|
||||||
|
GITLAB_TOKEN: $GITLAB_CI_TOKEN
|
||||||
|
GOTOOLCHAIN: auto
|
||||||
# Only run this release job for tags, not every commit (for example).
|
# Only run this release job for tags, not every commit (for example).
|
||||||
rules:
|
rules:
|
||||||
- if: $CI_COMMIT_TAG
|
- if: $CI_COMMIT_TAG
|
||||||
|
|
||||||
script: |
|
script: |
|
||||||
docker pull $GORELEASER_IMAGE
|
goreleaser release --clean --release-notes=CHANGES.md
|
||||||
|
|
||||||
# GITLAB_TOKEN is needed to create GitLab releases.
|
|
||||||
# DOCKER_* are needed to push Docker images.
|
|
||||||
docker run --rm --privileged \
|
|
||||||
-v $PWD:/src \
|
|
||||||
-w /src \
|
|
||||||
-v /var/run/docker.sock:/var/run/docker.sock \
|
|
||||||
-e GITLAB_TOKEN \
|
|
||||||
$GORELEASER_IMAGE release --rm-dist
|
|
||||||
|
|||||||
@@ -1,2 +1,22 @@
|
|||||||
|
version: "2"
|
||||||
run:
|
run:
|
||||||
allow-parallel-runners: true
|
allow-parallel-runners: true
|
||||||
|
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$
|
||||||
|
|||||||
+13
-6
@@ -1,4 +1,5 @@
|
|||||||
project_name: unbound-schemas
|
project_name: unbound-schemas
|
||||||
|
version: 2
|
||||||
|
|
||||||
env:
|
env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
@@ -15,18 +16,24 @@ builds:
|
|||||||
- amd64
|
- amd64
|
||||||
- arm64
|
- arm64
|
||||||
|
|
||||||
brews:
|
homebrew_casks:
|
||||||
- name: unbound-schemas
|
- name: unbound-schemas
|
||||||
tap:
|
repository:
|
||||||
owner: unboundsoftware
|
owner: unboundsoftware
|
||||||
name: homebrew-taps
|
name: homebrew-taps
|
||||||
folder: Formula
|
binary: schemactl
|
||||||
install: |
|
directory: Casks
|
||||||
bin.install "schemactl"
|
conflicts:
|
||||||
|
- formula: unbound-schemas
|
||||||
commit_author:
|
commit_author:
|
||||||
name: "Joakim Olsson"
|
name: "Joakim Olsson"
|
||||||
email: joakim@unbound.se
|
email: joakim@unbound.se
|
||||||
homepage: "https://schemas.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:
|
archives:
|
||||||
- id: unbound-schemas
|
- id: unbound-schemas
|
||||||
@@ -35,7 +42,7 @@ checksum:
|
|||||||
name_template: 'checksums.txt'
|
name_template: 'checksums.txt'
|
||||||
|
|
||||||
snapshot:
|
snapshot:
|
||||||
name_template: "{{ .Tag }}-next"
|
version_template: "{{ .Tag }}-next"
|
||||||
|
|
||||||
changelog:
|
changelog:
|
||||||
sort: asc
|
sort: asc
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
# See https://pre-commit.com/hooks.html for more hooks
|
# See https://pre-commit.com/hooks.html for more hooks
|
||||||
repos:
|
repos:
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
||||||
rev: v4.5.0
|
rev: v6.0.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: trailing-whitespace
|
- id: trailing-whitespace
|
||||||
- id: end-of-file-fixer
|
- id: end-of-file-fixer
|
||||||
@@ -18,7 +18,7 @@ repos:
|
|||||||
- --project
|
- --project
|
||||||
- unboundsoftware/schemas
|
- unboundsoftware/schemas
|
||||||
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
|
- repo: https://github.com/alessandrojcm/commitlint-pre-commit-hook
|
||||||
rev: v9.14.0
|
rev: v9.22.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: commitlint
|
- id: commitlint
|
||||||
stages: [ commit-msg ]
|
stages: [ commit-msg ]
|
||||||
@@ -37,11 +37,11 @@ repos:
|
|||||||
- id: go-test
|
- id: go-test
|
||||||
- id: gofumpt
|
- id: gofumpt
|
||||||
- repo: https://github.com/golangci/golangci-lint
|
- repo: https://github.com/golangci/golangci-lint
|
||||||
rev: v1.57.2
|
rev: v2.4.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: golangci-lint
|
- id: golangci-lint-full
|
||||||
- repo: https://github.com/gitleaks/gitleaks
|
- repo: https://github.com/gitleaks/gitleaks
|
||||||
rev: v8.18.2
|
rev: v8.28.0
|
||||||
hooks:
|
hooks:
|
||||||
- id: gitleaks
|
- id: gitleaks
|
||||||
exclude: '^ctl/generated.go|graph/generated/.*$|^graph/model/models_gen.go|^tools/.*$$'
|
exclude: '^ctl/generated.go|graph/generated/.*$|^graph/model/models_gen.go|^tools/.*$$'
|
||||||
|
|||||||
+388
@@ -0,0 +1,388 @@
|
|||||||
|
## [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
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.20.0
|
||||||
|
- *(deps)* Update module github.com/jmoiron/sqlx to v1.4.0
|
||||||
|
- *(deps)* Update module github.com/rs/cors to v1.11.0
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.46
|
||||||
|
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.12
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.47
|
||||||
|
- *(deps)* Update module github.com/getsentry/sentry-go to v0.28.0
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.48
|
||||||
|
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.16
|
||||||
|
- *(deps)* Update module github.com/getsentry/sentry-go to v0.28.1
|
||||||
|
- *(deps)* Update module github.com/wundergraph/graphql-go-tools to v1.67.3
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.49
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.21.0
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.21.1
|
||||||
|
- *(deps)* Update module github.com/wundergraph/graphql-go-tools to v1.67.4
|
||||||
|
- *(deps)* Update module github.com/sparetimecoders/goamqp to v0.3.1
|
||||||
|
- *(deps)* Update module github.com/auth0/go-jwt-middleware/v2 to v2.2.2
|
||||||
|
- *(deps)* Update module github.com/rs/cors to v1.11.1
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.22.0
|
||||||
|
- *(deps)* Update module github.com/getsentry/sentry-go to v0.29.0
|
||||||
|
- *(deps)* Update module github.com/alecthomas/kong to v1
|
||||||
|
- *(deps)* Update module github.com/alecthomas/kong to v1.2.1
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.50
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.51
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.52
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.22.1
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.53
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.54
|
||||||
|
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.17
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.55
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.6.5
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/eventsourced to v1.15.0
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/pg to v1.14.4
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/amqp to v1.6.6
|
||||||
|
- *(deps)* Update module github.com/getsentry/sentry-go to v0.29.1
|
||||||
|
- *(deps)* Update module github.com/vektah/gqlparser/v2 to v2.5.18
|
||||||
|
|
||||||
|
### ⚙️ Miscellaneous Tasks
|
||||||
|
|
||||||
|
- Update golangci-lint hook identifier in pre-commit config
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- Don't set fixed global_sequence_no
|
||||||
|
|
||||||
|
### ⚙️ Miscellaneous Tasks
|
||||||
|
|
||||||
|
- Add step for checking release
|
||||||
|
## [0.0.5] - 2024-04-03
|
||||||
|
|
||||||
|
### 🚀 Features
|
||||||
|
|
||||||
|
- Add full SDL to SupGraph response
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- *(deps)* Update module github.com/stretchr/testify to v1.9.0
|
||||||
|
- *(deps)* Update module github.com/golang-jwt/jwt/v4 to v5
|
||||||
|
- Update default migrations
|
||||||
|
- *(deps)* Update module github.com/golang-jwt/jwt/v5 to v5.2.1
|
||||||
|
- *(deps)* Update module github.com/khan/genqlient to v0.7.0
|
||||||
|
- *(deps)* Update module github.com/alecthomas/kong to v0.9.0
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.19.1
|
||||||
|
- *(deps)* Update module github.com/99designs/gqlgen to v0.17.45
|
||||||
|
- *(deps)* Update module github.com/pressly/goose/v3 to v3.19.2
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/pg to v1.14.0
|
||||||
|
- *(deps)* Update module gitlab.com/unboundsoftware/eventsourced/pg to v1.14.3
|
||||||
|
- *(deps)* Update module github.com/wundergraph/graphql-go-tools to v1.67.2
|
||||||
|
|
||||||
|
### ⚙️ Miscellaneous Tasks
|
||||||
|
|
||||||
|
- Update golangci-lint
|
||||||
|
- Update Go version for vulnerabilities
|
||||||
|
- Update to Go 1.20.7
|
||||||
|
- Update to Golang 1.21.0 for vulnerabilities
|
||||||
|
- Update pre-commit versions
|
||||||
|
- Update to Go 1.21.1 for vulnerabilities
|
||||||
|
- Use OrbStack for local dev
|
||||||
|
- Add gitleaks to pre-commit setup
|
||||||
|
- Update resources
|
||||||
|
- Run release on medium instance
|
||||||
|
- Back to small and upgrade goreleaser
|
||||||
|
- Remove deprecated replacements
|
||||||
|
## [0.0.4] - 2023-05-29
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- Explicitly set dialect to make goose use correct version table
|
||||||
|
|
||||||
|
### ⚙️ Miscellaneous Tasks
|
||||||
|
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- Add Sentry setup
|
||||||
|
- Add Sentry setup
|
||||||
|
- Organizations and API keys
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- Use correct healthcheck path
|
||||||
|
|
||||||
|
### ⚙️ Miscellaneous Tasks
|
||||||
|
|
||||||
|
- Update schema if URLs have changed
|
||||||
|
- Add pre-commit and remove those checks from Dockerfile
|
||||||
|
- Add context and error handling
|
||||||
|
- Move to default ingress group
|
||||||
|
- Decrease trace sample rate
|
||||||
|
- Improve docker caching
|
||||||
|
- Add local module to pre-commit config
|
||||||
|
- Only ignore generated files with do not edit
|
||||||
|
- Default ingress group
|
||||||
|
- Use Docker DinD version from variable
|
||||||
|
- Switch to manual rebases for Dependabot
|
||||||
|
- Update to golang 1.20.1
|
||||||
|
- Update Go verion for vulnerabilities scan
|
||||||
|
- 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
|
||||||
|
|
||||||
|
- Initial commit
|
||||||
|
|
||||||
|
### 🐛 Bug Fixes
|
||||||
|
|
||||||
|
- Remove GITLAB_TOKEN
|
||||||
+3
-2
@@ -1,9 +1,10 @@
|
|||||||
FROM golang:1.22.1 as modules
|
FROM amd64/golang:1.25.0@sha256:36e95221032d4c929d001ae5c1059ba1fbe1dec3b1f5c74d2708583d3141e151 as modules
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
ADD go.* /build
|
ADD go.* /build
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
||||||
FROM modules as build
|
FROM modules as build
|
||||||
|
ARG CI_COMMIT
|
||||||
WORKDIR /build
|
WORKDIR /build
|
||||||
ENV CGO_ENABLED=0
|
ENV CGO_ENABLED=0
|
||||||
ADD . /build
|
ADD . /build
|
||||||
@@ -17,7 +18,7 @@ RUN GOOS=linux GOARCH=amd64 go build \
|
|||||||
-a -installsuffix cgo \
|
-a -installsuffix cgo \
|
||||||
-mod=readonly \
|
-mod=readonly \
|
||||||
-o /release/service \
|
-o /release/service \
|
||||||
-ldflags '-w -s' \
|
-ldflags "-w -s -X main.buildVersion=${CI_COMMIT}" \
|
||||||
./cmd/service/service.go
|
./cmd/service/service.go
|
||||||
|
|
||||||
FROM scratch as export
|
FROM scratch as export
|
||||||
|
|||||||
Vendored
+4
-4
@@ -2,9 +2,9 @@ package cache
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/apex/log"
|
|
||||||
"github.com/sparetimecoders/goamqp"
|
"github.com/sparetimecoders/goamqp"
|
||||||
|
|
||||||
"gitlab.com/unboundsoftware/schemas/domain"
|
"gitlab.com/unboundsoftware/schemas/domain"
|
||||||
@@ -18,7 +18,7 @@ type Cache struct {
|
|||||||
services map[string]map[string]map[string]struct{}
|
services map[string]map[string]map[string]struct{}
|
||||||
subGraphs map[string]string
|
subGraphs map[string]string
|
||||||
lastUpdate map[string]string
|
lastUpdate map[string]string
|
||||||
logger log.Interface
|
logger *slog.Logger
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cache) OrganizationByAPIKey(apiKey string) *domain.Organization {
|
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:
|
case *domain.SubGraph:
|
||||||
c.updateSubGraph(m.OrganizationId, m.Ref, m.ID.String(), m.Service, m.ChangedAt)
|
c.updateSubGraph(m.OrganizationId, m.Ref, m.ID.String(), m.Service, m.ChangedAt)
|
||||||
default:
|
default:
|
||||||
c.logger.Warnf("unexpected message received: %+v", msg)
|
c.logger.With("msg", msg).Warn("unexpected message received")
|
||||||
}
|
}
|
||||||
return nil, nil
|
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{
|
return &Cache{
|
||||||
organizations: make(map[string]domain.Organization),
|
organizations: make(map[string]domain.Organization),
|
||||||
users: make(map[string][]string),
|
users: make(map[string][]string),
|
||||||
|
|||||||
+49
-65
@@ -2,7 +2,9 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"os/signal"
|
"os/signal"
|
||||||
@@ -12,14 +14,14 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/99designs/gqlgen/graphql/handler"
|
"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/99designs/gqlgen/graphql/playground"
|
||||||
"github.com/alecthomas/kong"
|
"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/rs/cors"
|
||||||
"github.com/sparetimecoders/goamqp"
|
"github.com/sparetimecoders/goamqp"
|
||||||
|
"github.com/vektah/gqlparser/v2/ast"
|
||||||
"gitlab.com/unboundsoftware/eventsourced/amqp"
|
"gitlab.com/unboundsoftware/eventsourced/amqp"
|
||||||
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
||||||
"gitlab.com/unboundsoftware/eventsourced/pg"
|
"gitlab.com/unboundsoftware/eventsourced/pg"
|
||||||
@@ -28,7 +30,9 @@ import (
|
|||||||
"gitlab.com/unboundsoftware/schemas/domain"
|
"gitlab.com/unboundsoftware/schemas/domain"
|
||||||
"gitlab.com/unboundsoftware/schemas/graph"
|
"gitlab.com/unboundsoftware/schemas/graph"
|
||||||
"gitlab.com/unboundsoftware/schemas/graph/generated"
|
"gitlab.com/unboundsoftware/schemas/graph/generated"
|
||||||
|
"gitlab.com/unboundsoftware/schemas/logging"
|
||||||
"gitlab.com/unboundsoftware/schemas/middleware"
|
"gitlab.com/unboundsoftware/schemas/middleware"
|
||||||
|
"gitlab.com/unboundsoftware/schemas/monitoring"
|
||||||
"gitlab.com/unboundsoftware/schemas/store"
|
"gitlab.com/unboundsoftware/schemas/store"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -36,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/"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
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"`
|
StrictSSL bool `name:"strict-ssl" env:"STRICT_SSL" help:"Should strict SSL handling be enabled" default:"true"`
|
||||||
SentryConfig
|
Environment string `name:"environment" env:"ENVIRONMENT" help:"The environment we are running in" default:"development" enum:"development,staging,production"`
|
||||||
}
|
|
||||||
|
|
||||||
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"`
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var buildVersion = "none"
|
var buildVersion = "none"
|
||||||
@@ -55,9 +55,7 @@ const serviceName = "schemas"
|
|||||||
func main() {
|
func main() {
|
||||||
var cli CLI
|
var cli CLI
|
||||||
_ = kong.Parse(&cli)
|
_ = kong.Parse(&cli)
|
||||||
log.SetHandler(json.New(os.Stdout))
|
logger := logging.SetupLogger(cli.LogLevel, cli.LogFormat, serviceName, buildVersion)
|
||||||
log.SetLevelFromString(cli.LogLevel)
|
|
||||||
logger := log.WithField("service", serviceName)
|
|
||||||
closeEvents := make(chan error)
|
closeEvents := make(chan error)
|
||||||
|
|
||||||
if err := start(
|
if err := start(
|
||||||
@@ -66,19 +64,22 @@ func main() {
|
|||||||
ConnectAMQP,
|
ConnectAMQP,
|
||||||
cli,
|
cli,
|
||||||
); err != nil {
|
); 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 {
|
func start(closeEvents chan error, logger *slog.Logger, 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)
|
|
||||||
|
|
||||||
rootCtx, rootCancel := context.WithCancel(context.Background())
|
rootCtx, rootCancel := context.WithCancel(context.Background())
|
||||||
defer rootCancel()
|
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)
|
db, err := store.SetupDB(cli.DatabaseDriverName, cli.DatabaseURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to setup DB: %v", err)
|
return fmt.Errorf("failed to setup DB: %v", err)
|
||||||
@@ -119,7 +120,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
|
|||||||
return fmt.Errorf("caching subgraphs: %w", err)
|
return fmt.Errorf("caching subgraphs: %w", err)
|
||||||
}
|
}
|
||||||
setups := []goamqp.Setup{
|
setups := []goamqp.Setup{
|
||||||
goamqp.UseLogger(logger.Error),
|
goamqp.UseLogger(func(s string) { logger.Error(s) }),
|
||||||
goamqp.CloseListener(closeEvents),
|
goamqp.CloseListener(closeEvents),
|
||||||
goamqp.WithPrefetchLimit(20),
|
goamqp.WithPrefetchLimit(20),
|
||||||
goamqp.EventStreamPublisher(publisher),
|
goamqp.EventStreamPublisher(publisher),
|
||||||
@@ -165,7 +166,7 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
|
|||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
err := <-closeEvents
|
err := <-closeEvents
|
||||||
if err != nil {
|
if err != nil {
|
||||||
logger.WithError(err).Error("received close from AMQP")
|
logger.With("error", err).Error("received close from AMQP")
|
||||||
rootCancel()
|
rootCancel()
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
@@ -175,8 +176,11 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
|
|||||||
defer wg.Done()
|
defer wg.Done()
|
||||||
<-rootCtx.Done()
|
<-rootCtx.Done()
|
||||||
|
|
||||||
if err := httpSrv.Close(); err != nil {
|
shutdownCtx, shutdownRelease := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
logger.WithError(err).Error("close http server")
|
defer shutdownRelease()
|
||||||
|
|
||||||
|
if err := httpSrv.Shutdown(shutdownCtx); err != nil {
|
||||||
|
logger.With("error", err).Error("close http server")
|
||||||
}
|
}
|
||||||
close(sigint)
|
close(sigint)
|
||||||
close(closeEvents)
|
close(closeEvents)
|
||||||
@@ -201,15 +205,27 @@ func start(closeEvents chan error, logger *log.Entry, connectToAmqpFunc func(url
|
|||||||
mw := middleware.NewAuth0("https://schemas.unbound.se", cli.Issuer, cli.StrictSSL)
|
mw := middleware.NewAuth0("https://schemas.unbound.se", cli.Issuer, cli.StrictSSL)
|
||||||
authMiddleware := middleware.NewAuth(serviceCache)
|
authMiddleware := middleware.NewAuth(serviceCache)
|
||||||
config.Directives.Auth = authMiddleware.Directive
|
config.Directives.Auth = authMiddleware.Directive
|
||||||
srv := handler.NewDefaultServer(generated.NewExecutableSchema(
|
srv := handler.New(generated.NewExecutableSchema(config))
|
||||||
config,
|
|
||||||
))
|
|
||||||
|
|
||||||
sentryHandler := sentryhttp.New(sentryhttp.Options{Repanic: true})
|
srv.AddTransport(transport.Websocket{
|
||||||
mux.Handle("/", sentryHandler.HandleFunc(playground.Handler("GraphQL playground", "/query")))
|
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),
|
||||||
|
})
|
||||||
|
|
||||||
|
mux.Handle("/", monitoring.Handler(playground.Handler("GraphQL playground", "/query")))
|
||||||
mux.Handle("/health", http.HandlerFunc(healthFunc))
|
mux.Handle("/health", http.HandlerFunc(healthFunc))
|
||||||
mux.Handle("/query", cors.AllowAll().Handler(
|
mux.Handle("/query", cors.AllowAll().Handler(
|
||||||
sentryHandler.Handle(
|
monitoring.Handler(
|
||||||
mw.Middleware().CheckJWT(
|
mw.Middleware().CheckJWT(
|
||||||
apiKeyMiddleware.Handler(
|
apiKeyMiddleware.Handler(
|
||||||
authMiddleware.Handler(srv),
|
authMiddleware.Handler(srv),
|
||||||
@@ -218,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 {
|
if err := httpSrv.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) {
|
||||||
logger.WithError(err).Error("listen http")
|
logger.With("error", err).Error("listen http")
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -270,38 +286,6 @@ func healthFunc(w http.ResponseWriter, _ *http.Request) {
|
|||||||
_, _ = w.Write([]byte("OK"))
|
_, _ = 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) {
|
func ConnectAMQP(url string) (Connection, error) {
|
||||||
return goamqp.NewFromURL(serviceName, url)
|
return goamqp.NewFromURL(serviceName, url)
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-12
@@ -272,7 +272,7 @@ type __UpdateSubGraphInput struct {
|
|||||||
// GetInput returns __UpdateSubGraphInput.Input, and is useful for accessing the field via an interface.
|
// GetInput returns __UpdateSubGraphInput.Input, and is useful for accessing the field via an interface.
|
||||||
func (v *__UpdateSubGraphInput) GetInput() *InputSubGraph { return v.Input }
|
func (v *__UpdateSubGraphInput) GetInput() *InputSubGraph { return v.Input }
|
||||||
|
|
||||||
// The query or mutation executed by SubGraphs.
|
// The query executed by SubGraphs.
|
||||||
const SubGraphs_Operation = `
|
const SubGraphs_Operation = `
|
||||||
query SubGraphs ($ref: String!) {
|
query SubGraphs ($ref: String!) {
|
||||||
supergraph(ref: $ref) {
|
supergraph(ref: $ref) {
|
||||||
@@ -294,7 +294,7 @@ func SubGraphs(
|
|||||||
ctx_ context.Context,
|
ctx_ context.Context,
|
||||||
client_ graphql.Client,
|
client_ graphql.Client,
|
||||||
ref string,
|
ref string,
|
||||||
) (*SubGraphsResponse, error) {
|
) (data_ *SubGraphsResponse, err_ error) {
|
||||||
req_ := &graphql.Request{
|
req_ := &graphql.Request{
|
||||||
OpName: "SubGraphs",
|
OpName: "SubGraphs",
|
||||||
Query: SubGraphs_Operation,
|
Query: SubGraphs_Operation,
|
||||||
@@ -302,10 +302,9 @@ func SubGraphs(
|
|||||||
Ref: ref,
|
Ref: ref,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var err_ error
|
|
||||||
|
|
||||||
var data_ SubGraphsResponse
|
data_ = &SubGraphsResponse{}
|
||||||
resp_ := &graphql.Response{Data: &data_}
|
resp_ := &graphql.Response{Data: data_}
|
||||||
|
|
||||||
err_ = client_.MakeRequest(
|
err_ = client_.MakeRequest(
|
||||||
ctx_,
|
ctx_,
|
||||||
@@ -313,10 +312,10 @@ func SubGraphs(
|
|||||||
resp_,
|
resp_,
|
||||||
)
|
)
|
||||||
|
|
||||||
return &data_, err_
|
return data_, err_
|
||||||
}
|
}
|
||||||
|
|
||||||
// The query or mutation executed by UpdateSubGraph.
|
// The mutation executed by UpdateSubGraph.
|
||||||
const UpdateSubGraph_Operation = `
|
const UpdateSubGraph_Operation = `
|
||||||
mutation UpdateSubGraph ($input: InputSubGraph!) {
|
mutation UpdateSubGraph ($input: InputSubGraph!) {
|
||||||
updateSubGraph(input: $input) {
|
updateSubGraph(input: $input) {
|
||||||
@@ -333,7 +332,7 @@ func UpdateSubGraph(
|
|||||||
ctx_ context.Context,
|
ctx_ context.Context,
|
||||||
client_ graphql.Client,
|
client_ graphql.Client,
|
||||||
input *InputSubGraph,
|
input *InputSubGraph,
|
||||||
) (*UpdateSubGraphResponse, error) {
|
) (data_ *UpdateSubGraphResponse, err_ error) {
|
||||||
req_ := &graphql.Request{
|
req_ := &graphql.Request{
|
||||||
OpName: "UpdateSubGraph",
|
OpName: "UpdateSubGraph",
|
||||||
Query: UpdateSubGraph_Operation,
|
Query: UpdateSubGraph_Operation,
|
||||||
@@ -341,10 +340,9 @@ func UpdateSubGraph(
|
|||||||
Input: input,
|
Input: input,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
var err_ error
|
|
||||||
|
|
||||||
var data_ UpdateSubGraphResponse
|
data_ = &UpdateSubGraphResponse{}
|
||||||
resp_ := &graphql.Response{Data: &data_}
|
resp_ := &graphql.Response{Data: data_}
|
||||||
|
|
||||||
err_ = client_.MakeRequest(
|
err_ = client_.MakeRequest(
|
||||||
ctx_,
|
ctx_,
|
||||||
@@ -352,5 +350,5 @@ func UpdateSubGraph(
|
|||||||
resp_,
|
resp_,
|
||||||
)
|
)
|
||||||
|
|
||||||
return &data_, err_
|
return data_, err_
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,62 +1,79 @@
|
|||||||
module gitlab.com/unboundsoftware/schemas
|
module gitlab.com/unboundsoftware/schemas
|
||||||
|
|
||||||
go 1.21
|
go 1.24.4
|
||||||
|
|
||||||
toolchain go1.21.3
|
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/99designs/gqlgen v0.17.45
|
github.com/99designs/gqlgen v0.17.78
|
||||||
github.com/Khan/genqlient v0.7.0
|
github.com/Khan/genqlient v0.8.1
|
||||||
github.com/alecthomas/kong v0.9.0
|
github.com/alecthomas/kong v1.12.1
|
||||||
github.com/apex/log v1.9.0
|
github.com/apex/log v1.9.0
|
||||||
github.com/auth0/go-jwt-middleware/v2 v2.2.1
|
github.com/auth0/go-jwt-middleware/v2 v2.3.0
|
||||||
github.com/getsentry/sentry-go v0.27.0
|
github.com/golang-jwt/jwt/v5 v5.3.0
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1
|
github.com/jmoiron/sqlx v1.4.0
|
||||||
github.com/jmoiron/sqlx v1.3.5
|
|
||||||
github.com/pkg/errors v0.9.1
|
github.com/pkg/errors v0.9.1
|
||||||
github.com/pressly/goose/v3 v3.19.2
|
github.com/pressly/goose/v3 v3.24.3
|
||||||
github.com/rs/cors v1.10.1
|
github.com/rs/cors v1.11.1
|
||||||
github.com/sparetimecoders/goamqp v0.3.0
|
github.com/sparetimecoders/goamqp v0.3.3
|
||||||
github.com/stretchr/testify v1.9.0
|
github.com/stretchr/testify v1.10.0
|
||||||
github.com/vektah/gqlparser/v2 v2.5.11
|
github.com/vektah/gqlparser/v2 v2.5.30
|
||||||
github.com/wundergraph/graphql-go-tools v1.67.2
|
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.221
|
||||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.6.4
|
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1
|
||||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.14.2
|
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2
|
||||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.3
|
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0
|
||||||
|
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0
|
||||||
|
go.opentelemetry.io/otel v1.37.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0
|
||||||
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0
|
||||||
|
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0
|
||||||
|
go.opentelemetry.io/otel/log v0.13.0
|
||||||
|
go.opentelemetry.io/otel/sdk v1.37.0
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.13.0
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.37.0
|
||||||
|
go.opentelemetry.io/otel/trace v1.37.0
|
||||||
)
|
)
|
||||||
|
|
||||||
require (
|
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/buger/jsonparser v1.1.1 // indirect
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 // indirect
|
github.com/cenkalti/backoff/v5 v5.0.2 // indirect
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // 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/davecgh/go-spew v1.1.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/google/uuid v1.6.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.0 // indirect
|
github.com/gorilla/websocket v1.5.1 // indirect
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 // indirect
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 // 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/lib/pq v1.10.9 // indirect
|
||||||
github.com/mfridman/interpolate v0.0.2 // 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/pmezard/go-difflib v1.0.0 // indirect
|
||||||
github.com/rabbitmq/amqp091-go v1.9.0 // indirect
|
github.com/rabbitmq/amqp091-go v1.10.0 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.12.0 // indirect
|
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 // indirect
|
github.com/sethvargo/go-retry v0.3.0 // indirect
|
||||||
github.com/sethvargo/go-retry v0.2.4 // indirect
|
github.com/sosodev/duration v1.3.1 // indirect
|
||||||
github.com/sosodev/duration v1.2.0 // indirect
|
github.com/tidwall/gjson v1.17.0 // indirect
|
||||||
github.com/tidwall/gjson v1.14.3 // indirect
|
|
||||||
github.com/tidwall/match v1.1.1 // indirect
|
github.com/tidwall/match v1.1.1 // indirect
|
||||||
github.com/tidwall/pretty v1.2.1 // indirect
|
github.com/tidwall/pretty v1.2.1 // indirect
|
||||||
github.com/tidwall/sjson v1.2.5 // indirect
|
github.com/tidwall/sjson v1.2.5 // indirect
|
||||||
github.com/urfave/cli/v2 v2.27.1 // indirect
|
github.com/urfave/cli/v2 v2.27.7 // indirect
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // 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.37.0 // indirect
|
||||||
|
go.opentelemetry.io/otel/metric v1.37.0 // indirect
|
||||||
|
go.opentelemetry.io/proto/otlp v1.7.0 // indirect
|
||||||
go.uber.org/multierr v1.11.0 // indirect
|
go.uber.org/multierr v1.11.0 // indirect
|
||||||
golang.org/x/mod v0.16.0 // indirect
|
golang.org/x/mod v0.26.0 // indirect
|
||||||
golang.org/x/sync v0.6.0 // indirect
|
golang.org/x/net v0.42.0 // indirect
|
||||||
golang.org/x/sys v0.18.0 // indirect
|
golang.org/x/sync v0.16.0 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
golang.org/x/sys v0.34.0 // indirect
|
||||||
golang.org/x/tools v0.19.0 // indirect
|
golang.org/x/text v0.27.0 // indirect
|
||||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df // indirect
|
golang.org/x/tools v0.35.0 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 // indirect
|
||||||
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 // indirect
|
||||||
|
google.golang.org/grpc v1.73.0 // indirect
|
||||||
|
google.golang.org/protobuf v1.36.6 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.1 // indirect
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,39 +1,25 @@
|
|||||||
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
|
||||||
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
|
||||||
github.com/99designs/gqlgen v0.17.45 h1:bH0AH67vIJo8JKNKPJP+pOPpQhZeuVRQLf53dKIpDik=
|
github.com/99designs/gqlgen v0.17.78 h1:bhIi7ynrc3js2O8wu1sMQj1YHPENDt3jQGyifoBvoVI=
|
||||||
github.com/99designs/gqlgen v0.17.45/go.mod h1:Bas0XQ+Jiu/Xm5E33jC8sES3G+iC2esHBMXcq0fUPs0=
|
github.com/99designs/gqlgen v0.17.78/go.mod h1:yI/o31IauG2kX0IsskM4R894OCCG1jXJORhtLQqB7Oc=
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
|
|
||||||
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
|
|
||||||
github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0=
|
|
||||||
github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw=
|
|
||||||
github.com/ClickHouse/clickhouse-go/v2 v2.17.1 h1:ZCmAYWpu75IyEi7+Yrs/uaAjiCGY5wfW5kXo64exkX4=
|
|
||||||
github.com/ClickHouse/clickhouse-go/v2 v2.17.1/go.mod h1:rkGTvFDTLqLIm0ma+13xmcCfr/08Gvs7KmFt1tgiWHQ=
|
|
||||||
github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU=
|
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/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.8.1 h1:wtOCc8N9rNynRLXN3k3CnfzheCUNKBcvXmVv5zt6WCs=
|
||||||
github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM=
|
github.com/Khan/genqlient v0.8.1/go.mod h1:R2G6DzjBvCbhjsEajfRjbWdVglSH/73kSivC9TLWVjU=
|
||||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
github.com/PuerkitoBio/goquery v1.10.3 h1:pFYcNSqHxBD06Fpj/KsbStFRsgRATgnf3LeXiUkhzPo=
|
||||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
github.com/PuerkitoBio/goquery v1.10.3/go.mod h1:tMUX0zDMHXYlAQk6p35XxQMqMweEKB7iK7iLNd4RH4Y=
|
||||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw=
|
github.com/agnivade/levenshtein v1.2.1 h1:EHBY3UOn1gwdy/VbFwgo4cxecRznFk7fKWN1KOX7eoM=
|
||||||
github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk=
|
github.com/agnivade/levenshtein v1.2.1/go.mod h1:QVVI16kDrtSuwcpd0p1+xMC6Z/VfhtCyDIjcwga4/DU=
|
||||||
github.com/PuerkitoBio/goquery v1.9.1 h1:mTL6XjbJTZdpfL+Gwl5U2h1l9yEkJjhmlTeV9VPW7UI=
|
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
|
||||||
github.com/PuerkitoBio/goquery v1.9.1/go.mod h1:cW1n6TmIMDoORQU5IU/P1T3tGFunOeXEpGP2WHRwkbY=
|
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
||||||
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
|
github.com/alecthomas/kong v1.12.1 h1:iq6aMJDcFYP9uFrLdsiZQ2ZMmcshduyGv4Pek0MQPW0=
|
||||||
github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo=
|
github.com/alecthomas/kong v1.12.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
|
||||||
github.com/alecthomas/assert/v2 v2.6.0 h1:o3WJwILtexrEUk3cUVal3oiQY2tfgr/FHWiz/v2n4FU=
|
|
||||||
github.com/alecthomas/assert/v2 v2.6.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
|
|
||||||
github.com/alecthomas/kong v0.9.0 h1:G5diXxc85KvoV2f0ZRVuMsi45IrBgx9zDNGNj165aPA=
|
|
||||||
github.com/alecthomas/kong v0.9.0/go.mod h1:Y47y5gKfHp1hDc7CH7OeXgLIpp+Q2m1Ni0L5s3bI8Os=
|
|
||||||
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
|
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/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 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ=
|
||||||
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
|
github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8=
|
||||||
github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI=
|
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
|
||||||
github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
|
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
|
||||||
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/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk=
|
|
||||||
github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM=
|
|
||||||
github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0=
|
github.com/apex/log v1.9.0 h1:FHtw/xuaM8AgmvDDTI9fiwoAL25Sq2cxojnZICUU8l0=
|
||||||
github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA=
|
github.com/apex/log v1.9.0/go.mod h1:m82fZlWIuiWzWP04XCTXmnX0xRkYYbCdYn8jbJeLBEA=
|
||||||
github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
|
github.com/apex/logs v1.0.0/go.mod h1:XzxuLZ5myVHDy9SAmYpamKKRNApGj54PfYLcFrXqDwo=
|
||||||
@@ -41,213 +27,131 @@ 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/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 h1:jfIu9sQUG6Ig+0+Ap1h4unLjW6YQJpKZVmUzxsD4E/Q=
|
||||||
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
|
github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE=
|
||||||
github.com/auth0/go-jwt-middleware/v2 v2.2.1 h1:pqxEIwlCztD0T9ZygGfOrw4NK/F9iotnCnPJVADKbkE=
|
github.com/auth0/go-jwt-middleware/v2 v2.3.0 h1:4QREj6cS3d8dS05bEm443jhnqQF97FX9sMBeWqnNRzE=
|
||||||
github.com/auth0/go-jwt-middleware/v2 v2.2.1/go.mod h1:CSi0tuu0QrALbWdiQZwqFL8SbBhj4e2MJzkvNfjY0Us=
|
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/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/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 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs=
|
||||||
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM=
|
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
|
||||||
github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE=
|
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE=
|
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
|
||||||
github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
|
||||||
github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8=
|
github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo=
|
||||||
github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ=
|
github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
|
||||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/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.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 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
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-20230903005119-f50d829f2e54 h1:SG7nF6SRlWhcT7cNTs5R6Hk4V2lcmLz2NsG2VnInyNo=
|
||||||
github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
|
github.com/dgryski/trifles v0.0.0-20230903005119-f50d829f2e54/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA=
|
||||||
github.com/docker/cli v24.0.7+incompatible h1:wa/nIwYFW7BVTGa7SWPVyyXU9lgORqUb1xfI36MSkFg=
|
|
||||||
github.com/docker/cli v24.0.7+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8=
|
|
||||||
github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM=
|
|
||||||
github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
|
|
||||||
github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ=
|
|
||||||
github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec=
|
|
||||||
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
|
|
||||||
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
|
|
||||||
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
|
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/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
|
||||||
github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4=
|
|
||||||
github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ=
|
|
||||||
github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0=
|
|
||||||
github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss=
|
|
||||||
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/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
|
||||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||||
github.com/getsentry/sentry-go v0.27.0 h1:Pv98CIbtB3LkMWmXi4Joa5OOcwbmnX88sF5qbK3r3Ps=
|
|
||||||
github.com/getsentry/sentry-go v0.27.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY=
|
|
||||||
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-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw=
|
|
||||||
github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw=
|
|
||||||
github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI=
|
|
||||||
github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY=
|
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4=
|
github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI=
|
||||||
github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg=
|
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
|
||||||
github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0=
|
github.com/go-sql-driver/mysql v1.9.2 h1:4cNKDYQ1I84SXslGddlsrMhc8k4LeDVj6Ad6WRjiHuU=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1 h1:OuVbFODueb089Lh128TAcimifWaLhJwVflnrgM17wHk=
|
github.com/go-sql-driver/mysql v1.9.2/go.mod h1:qn46aNg1333BRMNU69Lq93t8du/dwxI64Gl8i5p1WMU=
|
||||||
github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
|
github.com/go-viper/mapstructure/v2 v2.4.0 h1:EBsztssimR/CONLSZZ04E8qAkxNYq4Qp9LvH92wZUgs=
|
||||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
github.com/go-viper/mapstructure/v2 v2.4.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
|
||||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
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.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
|
||||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
|
||||||
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4=
|
|
||||||
github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ=
|
|
||||||
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0/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 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY=
|
||||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1 h1:X5VWvz21y3gzm9Nw/kaUeku/1+uBhcekkmy4IkffJww=
|
||||||
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.1/go.mod h1:Zanoh4+gvIgluNqcfMVTJueD4wSS5hT7zTt4Mrutd90=
|
||||||
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
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/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 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
||||||
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
|
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/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4=
|
|
||||||
github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY=
|
|
||||||
github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM=
|
|
||||||
github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg=
|
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk=
|
|
||||||
github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM=
|
|
||||||
github.com/jackc/pgx/v5 v5.5.5 h1:amBjrZVmksIdNjxGW/IiIMzxMKZFelXbUoPNb+8sjQw=
|
|
||||||
github.com/jackc/pgx/v5 v5.5.5/go.mod h1:ez9gk+OAat140fv9ErkZDYFWmXLfV+++K0uAOiwgm1A=
|
|
||||||
github.com/jackc/puddle/v2 v2.2.1 h1:RhxXJtFG022u4ibrCSMSiu5aOq1i77R3OHKNJj77OAk=
|
|
||||||
github.com/jackc/puddle/v2 v2.2.1/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
|
||||||
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 h1:4b6FQJ7y3295JUHU3tRko6euyEboL825ZsXeZZM47Z4=
|
||||||
github.com/jensneuse/diffview v1.0.0/go.mod h1:i6IacuD8LnEaPuiyzMHA+Wfz5mAuycMOf3R/orUY9y4=
|
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=
|
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
|
||||||
github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
|
github.com/jmoiron/sqlx v1.4.0 h1:1PLqN7S1UYp5t4SrVVnt4nUVNemrDAtxlulVe+Qgm3o=
|
||||||
github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
|
github.com/jmoiron/sqlx v1.4.0/go.mod h1:ZrZ7UsYB/weZdl2Bxg6jCRO9c3YHl8r3ahlKmRT4JLY=
|
||||||
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4=
|
|
||||||
github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak=
|
|
||||||
github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4=
|
|
||||||
github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc=
|
|
||||||
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
|
github.com/jpillora/backoff v0.0.0-20180909062703-3050d21c67d7/go.mod h1:2iMrUgbbvHEiQClaW2NsSzMyGHqN+rDFqY705q49KG0=
|
||||||
github.com/klauspost/compress v1.17.2 h1:RlWWUY/Dr4fL8qk9YG7DTZ7PDgME2V4csBXA8L/ixi4=
|
|
||||||
github.com/klauspost/compress v1.17.2/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE=
|
|
||||||
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
|
||||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
|
||||||
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
|
||||||
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
|
||||||
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
|
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/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.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||||
github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
|
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 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
|
||||||
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
|
||||||
github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475 h1:6PfEMwfInASh9hkN83aR0j4W/eKaAZt/AURtXAXlas0=
|
|
||||||
github.com/libsql/sqlite-antlr4-parser v0.0.0-20230802215326-5cb5bb604475/go.mod h1:20nXSmcf0nAscrzqsXeC2/tA3KkV2eCiJqYuyAgl+ss=
|
|
||||||
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
|
||||||
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
|
||||||
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
|
||||||
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
|
||||||
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
|
||||||
github.com/mattn/go-sqlite3 v1.14.6 h1:dNPt6NO46WmLVt2DLNpwczCmdV5boIZ6g/tlDrlRUbg=
|
github.com/mattn/go-sqlite3 v1.14.22 h1:2gZY6PC6kBnID23Tichd1K+Z0oS6nE/XwU+Vz/5o4kU=
|
||||||
github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU=
|
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||||
github.com/mfridman/interpolate v0.0.2 h1:pnuTK7MQIxxFz1Gr+rjSIx9u7qVjf5VOoM/u6BbAxPY=
|
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/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/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/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0=
|
|
||||||
github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y=
|
|
||||||
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
|
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/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/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/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
|
||||||
github.com/opencontainers/image-spec v1.1.0-rc5 h1:Ygwkfw9bpDvs+c9E34SdgGOj41dX/cbdlwvlWt0pnFI=
|
|
||||||
github.com/opencontainers/image-spec v1.1.0-rc5/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8=
|
|
||||||
github.com/opencontainers/runc v1.1.12 h1:BOIssBaW1La0/qbNZHXOOa71dZfZEQOzW7dqQf3phss=
|
|
||||||
github.com/opencontainers/runc v1.1.12/go.mod h1:S+lQwSfncpBha7XTy/5lBwWgm5+y5Ma/O44Ekby9FK8=
|
|
||||||
github.com/ory/dockertest/v3 v3.10.0 h1:4K3z2VMe8Woe++invjaTB7VRyQXQy5UY+loujO4aNE4=
|
|
||||||
github.com/ory/dockertest/v3 v3.10.0/go.mod h1:nr57ZbRWMqfsdGdFNLHz5jjNdDb7VVFnzAeW1n5N1Lg=
|
|
||||||
github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s=
|
|
||||||
github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU=
|
|
||||||
github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ=
|
|
||||||
github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
|
|
||||||
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.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
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 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/pressly/goose/v3 v3.19.2 h1:z1yuD41jS4iaqLkyjkzGkKBz4rgyz/BYtCyMMGHlgzQ=
|
github.com/pressly/goose/v3 v3.24.3 h1:DSWWNwwggVUsYZ0X2VitiAa9sKuqtBfe+Jr9zFGwWlM=
|
||||||
github.com/pressly/goose/v3 v3.19.2/go.mod h1:BHkf3LzSBmO8E5FTMPupUYIpMTIh/ZuQVy+YTfhZLD4=
|
github.com/pressly/goose/v3 v3.24.3/go.mod h1:v9zYL4xdViLHCUUJh/mhjnm6JrK7Eul8AS93IxiZM4E=
|
||||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
|
||||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
|
||||||
github.com/rabbitmq/amqp091-go v1.5.0/go.mod h1:JsV0ofX5f1nwOGafb8L5rBItt9GyhfQfcJj+oyz0dGg=
|
|
||||||
github.com/rabbitmq/amqp091-go v1.9.0 h1:qrQtyzB4H8BQgEuJwhmVQqVHB9O4+MNDJCCAcpc3Aoo=
|
|
||||||
github.com/rabbitmq/amqp091-go v1.9.0/go.mod h1:+jPrT9iY2eLjRaMSRHUhc3z14E/l85kv/f+6luSD3pc=
|
|
||||||
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
|
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/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/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.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ=
|
||||||
github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4=
|
github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc=
|
||||||
github.com/rs/cors v1.10.1 h1:L0uuZVXIKlI1SShY2nhFfo44TYvDPQ1w4oFkUJNfhyo=
|
github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA=
|
||||||
github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU=
|
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 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
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.8 h1:uM/2lKrWdGbRXDrIq08Lh9XtVYoeGtcQxk9rtQ7+rYg=
|
||||||
github.com/sanity-io/litter v1.5.5/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
|
github.com/sanity-io/litter v1.5.8/go.mod h1:9gzJgR2i4ZpjZHsKvUXIRQVk7P+yM3e+jAF7bU2UI5U=
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 h1:uIkTLo0AGRc8l7h5l9r+GcYi9qfVPt6lD4/bhmzfiKo=
|
github.com/sebdah/goldie/v2 v2.7.1 h1:PkBHymaYdtvEkZV7TmyqKxdmn5/Vcj+8TpATWZjnG5E=
|
||||||
github.com/santhosh-tekuri/jsonschema/v5 v5.3.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0=
|
github.com/sebdah/goldie/v2 v2.7.1/go.mod h1:oZ9fp0+se1eapSRjfYbsV/0Hqhbuu3bJVvKI/NNtssI=
|
||||||
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/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
|
|
||||||
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
|
|
||||||
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
|
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 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
||||||
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
||||||
github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec=
|
github.com/sethvargo/go-retry v0.3.0 h1:EEt31A35QhrcRZtrYFDTBg91cqZVnFL2navjDrah2SE=
|
||||||
github.com/sethvargo/go-retry v0.2.4/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw=
|
github.com/sethvargo/go-retry v0.3.0/go.mod h1:mNX17F0C/HguQMyMyJxcnU471gOZGxCLyYaFyAZraas=
|
||||||
github.com/shopspring/decimal v1.3.1 h1:2Usl1nmF/WZucqkFZhnfFYxxxu8LG21F6nPQBE5gKV8=
|
|
||||||
github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
|
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
|
||||||
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
github.com/smartystreets/assertions v1.0.0/go.mod h1:kHHU4qYBaI3q23Pp3VPrmWhuIUrLW/7eUrw0BU5VaoM=
|
||||||
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
github.com/smartystreets/go-aws-auth v0.0.0-20180515143844-0c1422d1fdb9/go.mod h1:SnhjPscd9TpLiy1LpzGSKh3bXCfxxXuqd9xmQJy3slM=
|
||||||
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
|
github.com/smartystreets/gunit v1.0.0/go.mod h1:qwPWnhz6pn0NnRBP++URONOVyNkPyr4SauJk4cUOwJs=
|
||||||
github.com/sosodev/duration v1.2.0 h1:pqK/FLSjsAADWY74SyWDCjOcd5l7H8GSnnOGEB9A1Us=
|
github.com/sosodev/duration v1.3.1 h1:qtHBDMQ6lvMQsL15g4aopM4HEfOaYuhWBw3NPTtlqq4=
|
||||||
github.com/sosodev/duration v1.2.0/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
|
github.com/sosodev/duration v1.3.1/go.mod h1:RQIBBX0+fMLc/D9+Jb/fwvVmo0eZvDDEERAikUR6SDg=
|
||||||
github.com/sparetimecoders/goamqp v0.1.3/go.mod h1:BKUl32yHsxpKEZEn7oEgyKB8Y0C4dk5n+17FModO6iM=
|
github.com/sparetimecoders/goamqp v0.3.3 h1:z/nfTPmrjeU/rIVuNOgsVLCimp3WFoNFvS3ZzXRJ6HE=
|
||||||
github.com/sparetimecoders/goamqp v0.3.0 h1:GrJ+WgTqcP+Yt2SJXgaloo0WX37D09nFn06ZRUrTltc=
|
github.com/sparetimecoders/goamqp v0.3.3/go.mod h1:W9NRCpWLE+Vruv2dcRSbszNil2O826d2Nv6kAkETW5o=
|
||||||
github.com/sparetimecoders/goamqp v0.3.0/go.mod h1:/kywWTiRX6EjLKG4eKmoO3l6byh4ycyeYjOx7csf3z4=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
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/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
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.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
|
||||||
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
||||||
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
|
||||||
github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
|
||||||
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/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw=
|
github.com/tidwall/gjson v1.17.0 h1:/Jocvlh98kcTfpN2+JzGQWQcqrPQwDrVEMApx/M5ZwM=
|
||||||
github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
github.com/tidwall/gjson v1.17.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk=
|
||||||
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA=
|
||||||
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
|
||||||
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
|
||||||
@@ -262,132 +166,112 @@ 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-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-kinesis v0.0.0-20171128231115-08b17f58cb1b/go.mod h1:/yhzCV0xPfx6jb1bBgRFjl5lytqVqZXEaeqWP8lTEao=
|
||||||
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
|
github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4=
|
||||||
github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898 h1:1MvEhzI5pvP27e9Dzz861mxk9WzXZLSJwzOU67cKTbU=
|
github.com/urfave/cli/v2 v2.27.7 h1:bH59vdhbjLv3LAvIu6gd0usJHgoTTPhCFib8qqOwXYU=
|
||||||
github.com/tursodatabase/libsql-client-go v0.0.0-20240220085343-4ae0eb9d0898/go.mod h1:9bKuHS7eZh/0mJndbUOrCx8Ej3PlsRDszj4L7oVYMPQ=
|
github.com/urfave/cli/v2 v2.27.7/go.mod h1:CyNAG/xg+iAOg0N4MPGZqVmv2rCoP267496AOXUZjA4=
|
||||||
github.com/urfave/cli/v2 v2.27.1 h1:8xSQ6szndafKVRmfyeUMxkNUJQMjL1F2zmsZ+qHpfho=
|
github.com/vektah/gqlparser/v2 v2.5.30 h1:EqLwGAFLIzt1wpx1IPpY67DwUujF1OfzgEyDsLrN6kE=
|
||||||
github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ=
|
github.com/vektah/gqlparser/v2 v2.5.30/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo=
|
||||||
github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8=
|
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083 h1:8/D7f8gKxTBjW+SZK4mhxTTBVpxcqeBgWF1Rfmltbfk=
|
||||||
github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc=
|
github.com/wundergraph/astjson v0.0.0-20250106123708-be463c97e083/go.mod h1:eOTL6acwctsN4F3b7YE+eE2t8zcJ/doLm9sZzsxxxrE=
|
||||||
github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw=
|
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.221 h1:+Gti+5xU36ANUmeYqtaNbDpVHQ0O2Dxhy8yT2w6pIfI=
|
||||||
github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4=
|
github.com/wundergraph/graphql-go-tools/v2 v2.0.0-rc.221/go.mod h1:DnYY1alnsgzkanSwbFiFIdXKOuf8dHQWQ2P4BzTc6aI=
|
||||||
github.com/wundergraph/graphql-go-tools v1.67.2 h1:79cKWyzL6oiYPePORqDgc00eugUK4HI9YuA79rHWMJM=
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 h1:gEOO8jv9F4OT7lGCjxCBTO/36wtF6j2nSip77qHd4x4=
|
||||||
github.com/wundergraph/graphql-go-tools v1.67.2/go.mod h1:XPiFH1mHduFuQTYiGpQe6ZtNI7/BX4EJQVMXr6oWxw0=
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1/go.mod h1:Ohn+xnUBiLI6FVj/9LpzZWtj1/D6lUovWYBkxHVV3aM=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb h1:zGWFAtiMcyryUHoUjUJX0/lt1H2+i2Ka2n+D3DImSNo=
|
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1 h1:MGHH2Uxp68J9i4V3/3vApB6gjBUjn6RjiPHhbc8Wsno=
|
||||||
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU=
|
gitlab.com/unboundsoftware/eventsourced/amqp v1.8.1/go.mod h1:clGBkdpFWb5/27aLOhJ6+DB15enJf+T4J5lR6X0lqAs=
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0=
|
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2 h1:8sCnThNHEPB3BQomcJ7u6fmc2t043fAZSMmVPDDbQOs=
|
||||||
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ=
|
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.19.2/go.mod h1:KeLn3U67hxbdFLfeXd0c0LI/r1C5rijbWrfNdARWe98=
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74=
|
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0 h1:pUJzMpNPX0GVsffRZXlpKR1d7Ws96KTxJwbLFPpASSc=
|
||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
gitlab.com/unboundsoftware/eventsourced/pg v1.17.0/go.mod h1:WgPrZhyCbsZ3TG2tPUbh2MUjOEaANJjsWi/0hlIwRVU=
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
|
||||||
github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw=
|
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0 h1:lFM7SZo8Ce01RzRfnUFQZEYeWRf/MtOA3A5MobOqk2g=
|
||||||
github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I=
|
go.opentelemetry.io/contrib/bridges/otelslog v0.12.0/go.mod h1:Dw05mhFtrKAYu72Tkb3YBYeQpRUJ4quDgo2DQw3No5A=
|
||||||
github.com/ydb-platform/ydb-go-sdk/v3 v3.55.1 h1:Ebo6J5AMXgJ3A438ECYotA0aK7ETqjQx9WoZvVxzKBE=
|
go.opentelemetry.io/otel v1.37.0 h1:9zhNfelUvx0KBfu/gb+ZgeAfAgtWrfHJZcAqFC228wQ=
|
||||||
github.com/ydb-platform/ydb-go-sdk/v3 v3.55.1/go.mod h1:udNPW8eupyH/EZocecFmaSNJacKKYjzQa7cVgX5U2nc=
|
go.opentelemetry.io/otel v1.37.0/go.mod h1:ehE/umFRLnuLa/vSccNq9oS1ErUlkkK71gMcN34UG8I=
|
||||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0 h1:9PgnL3QNlj10uGxExowIDIZu66aVBwWhXmbOp1pa6RA=
|
||||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.6.4 h1:k9xA5fo3zvP2W5GZseAytAivJvVvBKezn5acZssrgvk=
|
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.37.0/go.mod h1:0ineDcLELf6JmKfuo0wvvhAVMuxWFYvkTin2iV4ydPQ=
|
||||||
gitlab.com/unboundsoftware/eventsourced/amqp v1.6.4/go.mod h1:XHg6Men3GHsA/x9ln+atApW4ST2ZHVMp3NPnxW51JoA=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0 h1:Ahq7pZmv87yiyn3jeFz/LekZmPLLdKejuO3NcK9MssM=
|
||||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.11.2/go.mod h1:vGYGhwwjQjal7d+niWo4wKZ6ZI1zc1ehHPBfPbc2ICg=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.37.0/go.mod h1:MJTqhM0im3mRLw1i8uGHnCvUEeS7VwRyxlLC78PA18M=
|
||||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.14.2 h1:Asn2nwqu29ebpdme4CD4NPTWBkxZxNf1XCVwK2+kh/k=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0 h1:bDMKF3RUSxshZ5OjOTi8rsHGaPKsAt76FaqgvIUySLc=
|
||||||
gitlab.com/unboundsoftware/eventsourced/eventsourced v1.14.2/go.mod h1:IJUxIM+3Z2ce2fuaVgY6OZq1GnKifmDXK/shZEEGMUs=
|
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.37.0/go.mod h1:dDT67G/IkA46Mr2l9Uj7HsQVwsjASyV9SjGofsiUZDA=
|
||||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.3 h1:1YXX0waunPD8UAj6UHjtCaGD3uQTsBc5wEZzrX2oOhU=
|
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0 h1:yEX3aC9KDgvYPhuKECHbOlr5GLwH6KTjLJ1sBSkkxkc=
|
||||||
gitlab.com/unboundsoftware/eventsourced/pg v1.14.3/go.mod h1:zr/v9zRed+W/E8SZGFP1fzWZI/JlqSy98gdlrnDgsuA=
|
go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.13.0/go.mod h1:/GXR0tBmmkxDaCUGahvksvp66mx4yh5+cFXgSlhg0vQ=
|
||||||
go.opentelemetry.io/otel v1.20.0 h1:vsb/ggIY+hUjD/zCAQHpzTmndPqv/ml2ArbsbfBYTAc=
|
go.opentelemetry.io/otel/log v0.13.0 h1:yoxRoIZcohB6Xf0lNv9QIyCzQvrtGZklVbdCoyb7dls=
|
||||||
go.opentelemetry.io/otel v1.20.0/go.mod h1:oUIGj3D77RwJdM6PPZImDpSZGDvkD9fhesHny69JFrs=
|
go.opentelemetry.io/otel/log v0.13.0/go.mod h1:INKfG4k1O9CL25BaM1qLe0zIedOpvlS5Z7XgSbmN83E=
|
||||||
go.opentelemetry.io/otel/trace v1.20.0 h1:+yxVAPZPbQhbC3OfAkeIVTky6iTFpcr4SiY9om7mXSQ=
|
go.opentelemetry.io/otel/metric v1.37.0 h1:mvwbQS5m0tbmqML4NqK+e3aDiO02vsf/WgbsdpcPoZE=
|
||||||
go.opentelemetry.io/otel/trace v1.20.0/go.mod h1:HJSK7F/hA5RlzpZ0zKDCHCDHm556LCDtKaAo6JmBFUU=
|
go.opentelemetry.io/otel/metric v1.37.0/go.mod h1:04wGrZurHYKOc+RKeye86GwKiTb9FKm1WHtO+4EVr2E=
|
||||||
go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
|
go.opentelemetry.io/otel/sdk v1.37.0 h1:ItB0QUqnjesGRvNcmAcU0LyvkVyGJ2xftD29bWdDvKI=
|
||||||
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
|
go.opentelemetry.io/otel/sdk v1.37.0/go.mod h1:VredYzxUvuo2q3WRcDnKDjbdvmO0sCzOvVAiY+yUkAg=
|
||||||
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
|
go.opentelemetry.io/otel/sdk/log v0.13.0 h1:I3CGUszjM926OphK8ZdzF+kLqFvfRY/IIoFq/TjwfaQ=
|
||||||
|
go.opentelemetry.io/otel/sdk/log v0.13.0/go.mod h1:lOrQyCCXmpZdN7NchXb6DOZZa1N5G1R2tm5GMMTpDBw=
|
||||||
|
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0 h1:9yio6AFZ3QD9j9oqshV1Ibm9gPLlHNxurno5BreMtIA=
|
||||||
|
go.opentelemetry.io/otel/sdk/log/logtest v0.13.0/go.mod h1:QOGiAJHl+fob8Nu85ifXfuQYmJTFAvcrxL6w5/tu168=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.37.0 h1:90lI228XrB9jCMuSdA0673aubgRobVZFhbjxHHspCPc=
|
||||||
|
go.opentelemetry.io/otel/sdk/metric v1.37.0/go.mod h1:cNen4ZWfiD37l5NhS+Keb5RXVWZWpRE+9WyVCpbo5ps=
|
||||||
|
go.opentelemetry.io/otel/trace v1.37.0 h1:HLdcFNbRQBE2imdSEgm/kwqmQj1Or1l/7bW6mxVK7z4=
|
||||||
|
go.opentelemetry.io/otel/trace v1.37.0/go.mod h1:TlgrlQ+PtQO5XFerSPUYG0JSgGyryXewPGyayAWSBS0=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.7.0 h1:jX1VolD6nHuFzOYso2E73H85i92Mv8JQYk0K9vz09os=
|
||||||
|
go.opentelemetry.io/proto/otlp v1.7.0/go.mod h1:fSKjH6YJ7HDlwzltzyMj036AJ3ejJLCgCSHGj4efDDo=
|
||||||
|
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 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
|
||||||
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
|
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-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.0.0-20190426145343-a29dc8fdc734/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM=
|
||||||
golang.org/x/crypto v0.18.0 h1:PGVlW0xEltQnzFZ55hkuX5+KLyrMYhHld1YHO4AKcdc=
|
golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY=
|
||||||
golang.org/x/crypto v0.18.0/go.mod h1:R0j02AL6hcrfOiy9T4ZYp/rcWeMxM3L6QYxlOuEG1mg=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI=
|
||||||
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678 h1:mchzmB1XO2pMaKFRqk/+MV3mgGG96aqaPXaMifQU47w=
|
golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ=
|
||||||
golang.org/x/exp v0.0.0-20231108232855-2478ac86f678/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE=
|
golang.org/x/mod v0.26.0 h1:EGMPT//Ezu+ylkCijjPc+f4Aih7sZvaAr+O3EHBxvZg=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/mod v0.26.0/go.mod h1:/j6NAhSk8iQ723BGAUyoAcn7SlD7s15Dp9Nd/SfeaFQ=
|
||||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
|
||||||
golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic=
|
|
||||||
golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
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.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs=
|
||||||
golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
|
golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8=
|
||||||
golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
|
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
|
||||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
|
||||||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
|
||||||
golang.org/x/sync v0.6.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-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-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-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.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.34.0 h1:H5Y5sJ2L2JRdyv7ROF1he/lPdvFsd0mJHFw2ThKHxLA=
|
||||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.34.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
|
||||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
|
|
||||||
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
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.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.35.0 h1:mBffYraMEf7aa0sB+NuKnuCy8qI/9Bughn8dC2Gu5r0=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw=
|
||||||
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822 h1:oWVWY3NzT7KJppx2UKhKmzPq4SRe0LdCijVRwvGeikY=
|
||||||
golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw=
|
google.golang.org/genproto/googleapis/api v0.0.0-20250603155806-513f23925822/go.mod h1:h3c4v36UTKzUiuaOKQ6gr3S+0hovBtUrXzTG/i3+XEc=
|
||||||
golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822 h1:fc6jSaCT0vBduLYZHYrBBNY4dsWuvgyff9noRNDdBeE=
|
||||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20250603155806-513f23925822/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A=
|
||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
google.golang.org/grpc v1.73.0 h1:VIWSmpI2MegBtTuFt5/JWy2oXxtjJ/e89Z70ImfD2ok=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
google.golang.org/grpc v1.73.0/go.mod h1:50sbHOUqWoCQGI8V2HQLJM0B+LMlIUjNSZmow7EVBQc=
|
||||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618=
|
google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY=
|
||||||
golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8=
|
google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14=
|
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA=
|
|
||||||
google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk=
|
|
||||||
google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98=
|
|
||||||
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
|
|
||||||
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/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-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/go-jose/go-jose.v2 v2.6.2 h1:Rl5+9rA0kG3vsO1qhncMPRT5eHICihAMQYJkD7u/i4M=
|
gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs=
|
||||||
gopkg.in/go-jose/go-jose.v2 v2.6.2/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
|
gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI=
|
||||||
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
|
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.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.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-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.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 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM=
|
modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y=
|
||||||
howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g=
|
modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs=
|
||||||
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6 h1:5D53IMaUuA5InSeMu9eJtlQXS2NxAhyWQvkKEgXZhHI=
|
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
|
||||||
modernc.org/gc/v3 v3.0.0-20240107210532-573471604cb6/go.mod h1:Qz0X07sNOR1jWYCrJMEnbW/X55x206Q7Vt4mz6/wHp4=
|
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
|
||||||
modernc.org/libc v1.41.0 h1:g9YAc6BkKlgORsUWj+JwqoB1wU3o4DE3bM3yvA3k+Gk=
|
modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4=
|
||||||
modernc.org/libc v1.41.0/go.mod h1:w0eszPsiXoOnoMJgrXjglgLuDy/bt5RR4y3QzUUeodY=
|
modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw=
|
||||||
modernc.org/mathutil v1.6.0 h1:fRe9+AmYlaej+64JsEEhoWuAYBkOtQiMEU7n/XgfYi4=
|
modernc.org/sqlite v1.37.0 h1:s1TMe7T3Q3ovQiK2Ouz4Jwh7dw4ZDqbebSDTlSJdfjI=
|
||||||
modernc.org/mathutil v1.6.0/go.mod h1:Ui5Q9q1TR2gFm0AQRqQUaBWFLAhQpCwNcuhBOSedWPo=
|
modernc.org/sqlite v1.37.0/go.mod h1:5YiWv+YviqGMuGw4V+PNplcyaJ5v+vQd7TQOgkACoJM=
|
||||||
modernc.org/memory v1.7.2 h1:Klh90S215mmH8c9gO98QxQFsY+W451E8AnzjoE2ee1E=
|
|
||||||
modernc.org/memory v1.7.2/go.mod h1:NO4NVCQy0N7ln+T9ngWqOQfi7ley4vpwvARR+Hjw95E=
|
|
||||||
modernc.org/sqlite v1.29.5 h1:8l/SQKAjDtZFo9lkJLdk8g9JEOeYRG4/ghStDCCTiTE=
|
|
||||||
modernc.org/sqlite v1.29.5/go.mod h1:S02dvcmm7TnTRvGhv8IGYyLnIt7AS2KPaB1F/71p75U=
|
|
||||||
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=
|
|
||||||
nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g=
|
|
||||||
nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0=
|
|
||||||
|
|||||||
+536
-341
File diff suppressed because it is too large
Load Diff
+2
-2
@@ -3,8 +3,8 @@ package graph
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log/slog"
|
||||||
|
|
||||||
"github.com/apex/log"
|
|
||||||
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
||||||
|
|
||||||
"gitlab.com/unboundsoftware/schemas/cache"
|
"gitlab.com/unboundsoftware/schemas/cache"
|
||||||
@@ -26,7 +26,7 @@ type Publisher interface {
|
|||||||
type Resolver struct {
|
type Resolver struct {
|
||||||
EventStore eventsourced.EventStore
|
EventStore eventsourced.EventStore
|
||||||
Publisher Publisher
|
Publisher Publisher
|
||||||
Logger log.Interface
|
Logger *slog.Logger
|
||||||
Cache *cache.Cache
|
Cache *cache.Cache
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/wundergraph/graphql-go-tools/pkg/federation/sdlmerge"
|
|
||||||
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
"gitlab.com/unboundsoftware/eventsourced/eventsourced"
|
||||||
|
|
||||||
"gitlab.com/unboundsoftware/schemas/domain"
|
"gitlab.com/unboundsoftware/schemas/domain"
|
||||||
@@ -17,6 +16,7 @@ import (
|
|||||||
"gitlab.com/unboundsoftware/schemas/graph/model"
|
"gitlab.com/unboundsoftware/schemas/graph/model"
|
||||||
"gitlab.com/unboundsoftware/schemas/middleware"
|
"gitlab.com/unboundsoftware/schemas/middleware"
|
||||||
"gitlab.com/unboundsoftware/schemas/rand"
|
"gitlab.com/unboundsoftware/schemas/rand"
|
||||||
|
"gitlab.com/unboundsoftware/schemas/sdlmerge"
|
||||||
)
|
)
|
||||||
|
|
||||||
// AddOrganization is the resolver for the addOrganization field.
|
// AddOrganization is the resolver for the addOrganization field.
|
||||||
|
|||||||
+1
-1
@@ -2,7 +2,7 @@ apiVersion: autoscaling/v2
|
|||||||
kind: HorizontalPodAutoscaler
|
kind: HorizontalPodAutoscaler
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: schemas
|
app.kubernetes.io/name: schemas
|
||||||
name: schemas
|
name: schemas
|
||||||
spec:
|
spec:
|
||||||
scaleTargetRef:
|
scaleTargetRef:
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: schemas
|
||||||
|
data:
|
||||||
|
LOG_FORMAT: "otel"
|
||||||
|
ENVIRONMENT: "production"
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: schemas
|
||||||
|
data:
|
||||||
|
ENVIRONMENT: "development"
|
||||||
+11
-11
@@ -7,7 +7,7 @@ apiVersion: apps/v1
|
|||||||
kind: Deployment
|
kind: Deployment
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: schemas
|
app.kubernetes.io/name: schemas
|
||||||
name: schemas
|
name: schemas
|
||||||
annotations:
|
annotations:
|
||||||
kubernetes.io/change-cause: "${TIMESTAMP} Deployed commit id: ${COMMIT}"
|
kubernetes.io/change-cause: "${TIMESTAMP} Deployed commit id: ${COMMIT}"
|
||||||
@@ -15,7 +15,7 @@ spec:
|
|||||||
replicas: 1
|
replicas: 1
|
||||||
selector:
|
selector:
|
||||||
matchLabels:
|
matchLabels:
|
||||||
app: schemas
|
app.kubernetes.io/name: schemas
|
||||||
strategy:
|
strategy:
|
||||||
rollingUpdate:
|
rollingUpdate:
|
||||||
maxSurge: 1
|
maxSurge: 1
|
||||||
@@ -24,7 +24,7 @@ spec:
|
|||||||
template:
|
template:
|
||||||
metadata:
|
metadata:
|
||||||
labels:
|
labels:
|
||||||
app: schemas
|
app.kubernetes.io/name: schemas
|
||||||
spec:
|
spec:
|
||||||
affinity:
|
affinity:
|
||||||
podAntiAffinity:
|
podAntiAffinity:
|
||||||
@@ -33,7 +33,7 @@ spec:
|
|||||||
podAffinityTerm:
|
podAffinityTerm:
|
||||||
labelSelector:
|
labelSelector:
|
||||||
matchExpressions:
|
matchExpressions:
|
||||||
- key: "app"
|
- key: "app.kubernetes.io/name"
|
||||||
operator: In
|
operator: In
|
||||||
values:
|
values:
|
||||||
- schemas
|
- schemas
|
||||||
@@ -41,11 +41,8 @@ spec:
|
|||||||
containers:
|
containers:
|
||||||
- name: schemas
|
- name: schemas
|
||||||
resources:
|
resources:
|
||||||
limits:
|
|
||||||
cpu: "500m"
|
|
||||||
memory: "100Mi"
|
|
||||||
requests:
|
requests:
|
||||||
cpu: "100m"
|
cpu: "20m"
|
||||||
memory: "20Mi"
|
memory: "20Mi"
|
||||||
readinessProbe:
|
readinessProbe:
|
||||||
httpGet:
|
httpGet:
|
||||||
@@ -59,11 +56,14 @@ spec:
|
|||||||
ports:
|
ports:
|
||||||
- name: api
|
- name: api
|
||||||
containerPort: 8080
|
containerPort: 8080
|
||||||
|
env:
|
||||||
|
- name: OTEL_EXPORTER_OTLP_ENDPOINT
|
||||||
|
value: http://k8s-monitoring-alloy-receiver.monitoring.svc.cluster.local:4318
|
||||||
envFrom:
|
envFrom:
|
||||||
- secretRef:
|
- configMapRef:
|
||||||
name: schemas
|
name: schemas
|
||||||
- secretRef:
|
- secretRef:
|
||||||
name: rabbitmq
|
name: schemas
|
||||||
restartPolicy: Always
|
restartPolicy: Always
|
||||||
serviceAccountName: schemas
|
serviceAccountName: schemas
|
||||||
---
|
---
|
||||||
@@ -79,5 +79,5 @@ spec:
|
|||||||
protocol: TCP
|
protocol: TCP
|
||||||
targetPort: 8080
|
targetPort: 8080
|
||||||
selector:
|
selector:
|
||||||
app: schemas
|
app.kubernetes.io/name: schemas
|
||||||
type: NodePort
|
type: NodePort
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
apiVersion: policy/v1
|
||||||
|
kind: PodDisruptionBudget
|
||||||
|
metadata:
|
||||||
|
name: schemas-pdb
|
||||||
|
spec:
|
||||||
|
minAvailable: 1
|
||||||
|
selector:
|
||||||
|
matchLabels:
|
||||||
|
app.kubernetes.io/name: schemas
|
||||||
@@ -5,3 +5,4 @@ metadata:
|
|||||||
stringData:
|
stringData:
|
||||||
API_KEY: supersecret123!
|
API_KEY: supersecret123!
|
||||||
POSTGRES_URL: "postgres://postgres:postgres@postgres:5432/schemas?sslmode=disable"
|
POSTGRES_URL: "postgres://postgres:postgres@postgres:5432/schemas?sslmode=disable"
|
||||||
|
AMQP_URL: "amqp://user:password@rabbitmq:5672/"
|
||||||
|
|||||||
+5
-4
@@ -1,8 +1,7 @@
|
|||||||
apiVersion: external-secrets.io/v1beta1
|
apiVersion: external-secrets.io/v1
|
||||||
kind: ExternalSecret
|
kind: ExternalSecret
|
||||||
metadata:
|
metadata:
|
||||||
name: schemas
|
name: schemas
|
||||||
namespace: default
|
|
||||||
spec:
|
spec:
|
||||||
refreshInterval: 1h
|
refreshInterval: 1h
|
||||||
secretStoreRef:
|
secretStoreRef:
|
||||||
@@ -11,13 +10,15 @@ spec:
|
|||||||
target:
|
target:
|
||||||
creationPolicy: Owner
|
creationPolicy: Owner
|
||||||
template:
|
template:
|
||||||
|
mergePolicy: Merge
|
||||||
|
engineVersion: 'v2'
|
||||||
data:
|
data:
|
||||||
POSTGRES_URL: "postgres://{{ .DB_USERNAME }}:{{ .DB_PASSWORD }}@{{ .DB_HOST }}:{{ .DB_PORT }}/schemas?sslmode=disable"
|
POSTGRES_URL: "postgres://{{ .DB_USERNAME }}:{{ .DB_PASSWORD }}@{{ .DB_HOST }}:{{ .DB_PORT }}/schemas?sslmode=disable"
|
||||||
API_KEY: "{{ .API_KEY }}"
|
API_KEY: "{{ .API_KEY }}"
|
||||||
SENTRY_DSN: "{{ .SENTRY_DSN }}"
|
|
||||||
SENTRY_ENVIRONMENT: "{{ .SENTRY_ENVIRONMENT }}"
|
|
||||||
dataFrom:
|
dataFrom:
|
||||||
- extract:
|
- extract:
|
||||||
key: services/schemas
|
key: services/schemas
|
||||||
- extract:
|
- extract:
|
||||||
key: rds/postgres/prod-psql
|
key: rds/postgres/prod-psql
|
||||||
|
- extract:
|
||||||
|
key: mq/rabbit/prod
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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))
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -2,5 +2,22 @@
|
|||||||
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
|
||||||
"extends": [
|
"extends": [
|
||||||
"config:recommended"
|
"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.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)
|
||||||
|
}
|
||||||
@@ -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)))
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -3,27 +3,27 @@
|
|||||||
insert into aggregates (id, name)
|
insert into aggregates (id, name)
|
||||||
values ('d46ffcb0-19e8-4769-8697-590326ef7b51', 'domain.Organization');
|
values ('d46ffcb0-19e8-4769-8697-590326ef7b51', 'domain.Organization');
|
||||||
|
|
||||||
insert into events (name, aggregate_id, global_sequence_no, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
insert into events (name, aggregate_id, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
||||||
values ('domain.OrganizationAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 1, 1, '{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T14:46:04.43462+02:00","name":"Unbound Software Development","initiator":"google-oauth2|101953650269257914934"}', '2023-04-26T14:46:04.43462+02:00', 'domain.Organization');
|
values ('domain.OrganizationAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 1, '{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T14:46:04.43462+02:00","name":"Unbound Software Development","initiator":"google-oauth2|101953650269257914934"}', '2023-04-26T14:46:04.43462+02:00', 'domain.Organization');
|
||||||
|
|
||||||
-- Add API keys
|
-- Add API keys
|
||||||
insert into events (name, aggregate_id, global_sequence_no, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
insert into events (name, aggregate_id, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
||||||
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 2, 2,
|
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 2,
|
||||||
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T15:46:54.181929+02:00","organizationId":"","name":"CI","key":"dXNfYWtfeUl2R3RRQUJQTmJzVEFrUeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@staging","Shiny@prod"],"read":false,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T15:46:54.181929+02:00","organizationId":"","name":"CI","key":"dXNfYWtfeUl2R3RRQUJQTmJzVEFrUeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@staging","Shiny@prod"],"read":false,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
||||||
'2023-04-26 15:46:54.181929 +02:00', 'domain.Organization');
|
'2023-04-26 15:46:54.181929 +02:00', 'domain.Organization');
|
||||||
|
|
||||||
insert into events (name, aggregate_id, global_sequence_no, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
insert into events (name, aggregate_id, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
||||||
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 3, 3,
|
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 3,
|
||||||
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T15:52:55.955203+02:00","organizationId":"","name":"Gateway","key":"dXNfYWtfdnkzSkRseDNlSDNjcnZzOeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@staging","Shiny@prod"],"read":true,"publish":false,"initiator":"google-oauth2|101953650269257914934"}',
|
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T15:52:55.955203+02:00","organizationId":"","name":"Gateway","key":"dXNfYWtfdnkzSkRseDNlSDNjcnZzOeOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@staging","Shiny@prod"],"read":true,"publish":false,"initiator":"google-oauth2|101953650269257914934"}',
|
||||||
'2023-04-26 15:52:55.955203 +02:00', 'domain.Organization');
|
'2023-04-26 15:52:55.955203 +02:00', 'domain.Organization');
|
||||||
|
|
||||||
insert into events (name, aggregate_id, global_sequence_no, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
insert into events (name, aggregate_id, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
||||||
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 4, 4,
|
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 4,
|
||||||
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T16:30:00.0011+02:00","organizationId":"","name":"Local dev","key":"dXNfYWtfM0kzaGZndmVaQllyQzdjVOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@dev"],"read":true,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-26T16:30:00.0011+02:00","organizationId":"","name":"Local dev","key":"dXNfYWtfM0kzaGZndmVaQllyQzdjVOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@dev"],"read":true,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
||||||
'2023-04-26 16:30:00.001100 +02:00', 'domain.Organization');
|
'2023-04-26 16:30:00.001100 +02:00', 'domain.Organization');
|
||||||
|
|
||||||
insert into events (name, aggregate_id, global_sequence_no, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
insert into events (name, aggregate_id, aggregate_sequence_no, payload, tstamp, aggregate_name)
|
||||||
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 5, 5,
|
values ('domain.APIKeyAdded', 'd46ffcb0-19e8-4769-8697-590326ef7b51', 5,
|
||||||
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-27T07:43:26.599544+02:00","organizationId":"","name":"Acctest","key":"dXNfYWtfdlVqMzdBMXVraklmaGtKSOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@test"],"read":true,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
'{"id":"d46ffcb0-19e8-4769-8697-590326ef7b51","time":"2023-04-27T07:43:26.599544+02:00","organizationId":"","name":"Acctest","key":"dXNfYWtfdlVqMzdBMXVraklmaGtKSOOwxEKY/BwUmvv0yJlvuSQnrkHkZJuTTKSVmRt4UrhV","refs":["Shiny@test"],"read":true,"publish":true,"initiator":"google-oauth2|101953650269257914934"}',
|
||||||
'2023-04-27 07:43:26.599544 +02:00', 'domain.Organization');
|
'2023-04-27 07:43:26.599544 +02:00', 'domain.Organization');
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user