From f85832ec22a2f4f933c96f5549958d9ae6dcc7f4 Mon Sep 17 00:00:00 2001 From: fiam Date: Mon, 15 May 2023 19:43:31 +0100 Subject: [PATCH 1/4] fix: workaround for data race in qri-io/jsonschema Registration is not goroutine-safe, run a dummy validation once to force the registration, avoiding the race condition in subsequent parallel runs. --- pkg/graphqljsonschema/jsonschema.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/pkg/graphqljsonschema/jsonschema.go b/pkg/graphqljsonschema/jsonschema.go index e31257cc87..a4db907b61 100644 --- a/pkg/graphqljsonschema/jsonschema.go +++ b/pkg/graphqljsonschema/jsonschema.go @@ -201,16 +201,18 @@ func NewValidatorFromString(schema string) (*Validator, error) { if err != nil { return nil, err } + // Run validator once to make it set up its internal state, otherwise we + // run into a data race in https://github.com/qri-io/jsonschema/blob/master/schema.go#L60 + validator.schema.Validate(context.Background(), []byte{}) return &validator, nil } func MustNewValidatorFromString(schema string) *Validator { - var validator Validator - err := json.Unmarshal([]byte(schema), &validator.schema) + validator, err := NewValidatorFromString(schema) if err != nil { panic(err) } - return &validator + return validator } func TopLevelType(schema string) (jsonparser.ValueType, error) { From bf70410ed6b75a90d2e1d21edccc21ebd01c6a8f Mon Sep 17 00:00:00 2001 From: fiam Date: Tue, 16 May 2023 12:33:54 +0100 Subject: [PATCH 2/4] chore: switch jsonschema library to github.com/santhosh-tekuri/jsonschema/v5 github.com/qri-io/jsonschema has race conditions, bugs and seems to not be maintained anymore. --- go.mod | 33 +- go.sum | 110 +---- pkg/graphqljsonschema/jsonschema.go | 48 +- pkg/graphqljsonschema/jsonschema_test.go | 567 ++++++++++++++++++++++- 4 files changed, 589 insertions(+), 169 deletions(-) diff --git a/go.mod b/go.mod index 147f95fda1..bf852a7b85 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,6 @@ go 1.18 require ( github.com/99designs/gqlgen v0.17.13 - github.com/Shopify/sarama v1.29.1 github.com/buger/jsonparser v1.1.1 github.com/cespare/xxhash/v2 v2.1.2 github.com/dave/jennifer v1.4.0 @@ -12,7 +11,6 @@ require ( github.com/eclipse/paho.mqtt.golang v1.2.0 github.com/evanphx/json-patch/v5 v5.1.0 github.com/go-test/deep v1.0.8 - github.com/go-zookeeper/zk v1.0.2 github.com/gobwas/ws v1.0.4 github.com/golang/mock v1.4.1 github.com/google/go-cmp v0.5.8 @@ -25,9 +23,8 @@ require ( github.com/jensneuse/pipeline v0.0.0-20200117120358-9fb4de085cd6 github.com/mitchellh/go-homedir v1.1.0 github.com/nats-io/nats.go v1.19.1 - github.com/ory/dockertest v3.3.5+incompatible - github.com/qri-io/jsonschema v0.2.1 github.com/r3labs/sse/v2 v2.8.1 + github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 github.com/sebdah/goldie/v2 v2.5.3 github.com/spf13/cobra v0.0.5 github.com/spf13/viper v1.3.2 @@ -44,38 +41,20 @@ require ( ) require ( - github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 // indirect github.com/Masterminds/goutils v1.1.0 // indirect github.com/Masterminds/semver v1.5.0 // indirect github.com/Masterminds/sprig v2.22.0+incompatible // indirect - github.com/Microsoft/go-winio v0.5.2 // indirect - github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 // indirect github.com/agnivade/levenshtein v1.1.1 // indirect - github.com/cenkalti/backoff v2.2.1+incompatible // indirect - github.com/containerd/continuity v0.3.0 // indirect - github.com/docker/go-connections v0.4.0 // indirect - github.com/docker/go-units v0.4.0 // indirect - github.com/eapache/go-resiliency v1.2.0 // indirect - github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 // indirect - github.com/eapache/queue v1.1.0 // indirect github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee // indirect github.com/gobwas/pool v0.2.0 // indirect - github.com/golang/snappy v0.0.3 // indirect github.com/google/uuid v1.1.1 // indirect - github.com/gotestyourself/gotestyourself v2.2.0+incompatible // indirect - github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/huandu/xstrings v1.2.1 // indirect github.com/imdario/mergo v0.3.8 // indirect github.com/inconshreveable/mousetrap v1.0.0 // indirect - github.com/jcmturner/aescts/v2 v2.0.0 // indirect - github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect - github.com/jcmturner/gofork v1.0.0 // indirect - github.com/jcmturner/gokrb5/v8 v8.4.2 // indirect - github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/klauspost/compress v1.14.4 // indirect - github.com/lib/pq v1.10.6 // indirect + github.com/kr/text v0.2.0 // indirect github.com/logrusorgru/aurora/v3 v3.0.0 // indirect github.com/magiconair/properties v1.8.0 // indirect github.com/mattn/go-colorable v0.1.12 // indirect @@ -86,15 +65,9 @@ require ( github.com/nats-io/nats-server/v2 v2.8.2 // indirect github.com/nats-io/nkeys v0.3.0 // indirect github.com/nats-io/nuid v1.0.1 // indirect - github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.2 // indirect - github.com/opencontainers/runc v1.1.2 // indirect github.com/pelletier/go-toml v1.6.0 // indirect - github.com/pierrec/lz4 v2.6.0+incompatible // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/qri-io/jsonpointer v0.1.1 // indirect - github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.8.1 // indirect github.com/spf13/afero v1.6.0 // indirect @@ -110,6 +83,6 @@ require ( golang.org/x/sys v0.1.0 // indirect golang.org/x/text v0.3.7 // indirect gopkg.in/cenkalti/backoff.v1 v1.1.0 // indirect + gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect - gotest.tools v2.2.0+incompatible // indirect ) diff --git a/go.sum b/go.sum index ca4a073d8f..1b4dfdd401 100644 --- a/go.sum +++ b/go.sum @@ -1,7 +1,5 @@ github.com/99designs/gqlgen v0.17.13 h1:ETUEqvRg5Zvr1lXtpoRdj026fzVay0ZlJPwI33qXLIw= github.com/99designs/gqlgen v0.17.13/go.mod h1:w1brbeOdqVyNJI553BGwtwdVcYu1LKeYE1opLWN9RgQ= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= -github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.1.0 h1:ksErzDEI1khOiGPgpwuI7x2ebx/uXQNw7xJpn9Eq1+I= github.com/BurntSushi/toml v1.1.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= @@ -11,14 +9,6 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/Masterminds/sprig v2.22.0+incompatible h1:z4yfnGrZ7netVz+0EDJ0Wi+5VZCSYp4Z0m2dk6cEM60= github.com/Masterminds/sprig v2.22.0+incompatible/go.mod h1:y6hNFY5UBTIWBxnzTeuNhlNS5hqE0NB0E6fgfo2Br3o= -github.com/Microsoft/go-winio v0.5.2 h1:a9IhgEQBCUEk6QCdml9CiJGhAws+YwffDHEMp1VMrpA= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= -github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= -github.com/Shopify/sarama v1.29.1 h1:wBAacXbYVLmWieEA/0X/JagDdCZ8NVFOfS6l6+2u5S0= -github.com/Shopify/sarama v1.29.1/go.mod h1:mdtqvCSg8JOxk8PmpTNGyo6wzd4BMm4QXSfDnTXmgkE= -github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= @@ -31,24 +21,14 @@ github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLj github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/continuity v0.3.0 h1:nisirsYROK15TAMVukJOUyGJjz4BNQJBVsNvAXZJ/eg= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/dave/jennifer v1.4.0 h1:tNJFJmLDVTLu+v05mVZ88RINa3vQqnyyWkTKWYz0CwE= github.com/dave/jennifer v1.4.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -56,24 +36,10 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48 h1:fRzb/w+pyskVMQ+UbP35JkH8yB7MYb4q/qhBarqZE6g= github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= -github.com/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.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= -github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/eapache/go-resiliency v1.2.0 h1:v7g92e/KSN71Rq7vSThKaWIq68fL4YHvWyiUKorFR1Q= -github.com/eapache/go-resiliency v1.2.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= 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/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= -github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= @@ -90,8 +56,6 @@ github.com/go-playground/validator/v10 v10.2.0 h1:KgJ0snyC2R9VXYN2rneOtQcw5aHQB1 github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= -github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee h1:s+21KNqlpePfkah2I+gwHF8xmJWRjooY+5248k6m4A0= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= github.com/gobwas/pool v0.2.0 h1:QEmUOlnSjWtnpRGHF3SauEiOsy82Cup83Vf2LcMlnc8= @@ -99,18 +63,13 @@ github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6Wezm github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= github.com/gobwas/ws v1.0.4 h1:5eXU1CZhpQdq5kXbKb+sECH5Ia5KiO6CYzIzdlVx6Bs= github.com/gobwas/ws v1.0.4/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/golang/mock v1.4.1 h1:ocYkMQY5RrXTYgXl7ICpV0IXwlEQGwKIsery4gyXa1U= github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= github.com/golang/protobuf v1.5.0 h1:LUVKkCeviFUMKqHa4tXIIij/lbhnMbP7Fn5wKdKkRh4= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= @@ -118,15 +77,9 @@ github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= -github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible h1:AQwinXlbQR2HvPjQZOmDhRqsv5mZf+Jb1RnSLxcqZcI= -github.com/gotestyourself/gotestyourself v2.2.0+incompatible/go.mod h1:zZKM6oeNM8k+FRljX1mnzVYeS8wiGgQyvST1/GafPbY= -github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= -github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= @@ -139,18 +92,6 @@ github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= -github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= -github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= -github.com/jcmturner/dnsutils/v2 v2.0.0/go.mod h1:b0TnjGOvI/n42bZa+hmXL+kFJZsFT7G4t3HTlQ184QM= -github.com/jcmturner/gofork v1.0.0 h1:J7uCkflzTEhUZ64xqKnkDxq3kzc96ajM1Gli5ktUem8= -github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/UM3ncEo0o= -github.com/jcmturner/goidentity/v6 v6.0.1 h1:VKnZd2oEIMorCTsFBnJWbExfNN7yZr3EhJAxwOkZg6o= -github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= -github.com/jcmturner/gokrb5/v8 v8.4.2 h1:6ZIM6b/JJN0X8UM43ZOM6Z4SJzla+a/u7scXFJzodkA= -github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= -github.com/jcmturner/rpc/v2 v2.0.3 h1:7FXXj8Ti1IaVFpSAziCZWNzbNuZmnvw/i6CqLNdWfZY= -github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= github.com/jensneuse/abstractlogger v0.0.4 h1:sa4EH8fhWk3zlTDbSncaWKfwxYM8tYSlQ054ETLyyQY= github.com/jensneuse/abstractlogger v0.0.4/go.mod h1:6WuamOHuykJk8zED/R0LNiLhWR6C7FIAo43ocUEB3mo= github.com/jensneuse/byte-template v0.0.0-20200214152254-4f3cf06e5c68 h1:E80wOd3IFQcoBxLkAUpUQ3BoGrZ4DxhQdP21+HH1s6A= @@ -165,7 +106,6 @@ github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.12.2/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.14.4 h1:eijASRJcobkVtSt81Olfh7JX43osYLwy5krOJo6YEu4= github.com/klauspost/compress v1.14.4/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -179,8 +119,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs= -github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4= github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= @@ -202,12 +140,10 @@ github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxd github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.0 h1:9D+8oIskB4VJBN5SFlmc27fSlIBZaov1Wpk/IfikLNY= github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/nats-io/jwt/v2 v2.2.1-0.20220330180145-442af02fd36a h1:lem6QCvxR0Y28gth9P+wV2K/zYUUAkJ+55U8cpS0p5I= github.com/nats-io/nats-server/v2 v2.8.2 h1:5m1VytMEbZx0YINvKY+X2gXdLNwP43uLXnFRwz8j8KE= github.com/nats-io/nats-server/v2 v2.8.2/go.mod h1:vIdpKz3OG+DCg4q/xVPdXHoztEyKDWRtykQ4N7hd7C4= @@ -217,48 +153,28 @@ github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -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.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= -github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/ory/dockertest v3.3.5+incompatible h1:iLLK6SQwIhcbrG783Dghaaa3WPzGc+4Emza6EbVUUGA= -github.com/ory/dockertest v3.3.5+incompatible/go.mod h1:1vX4m9wsvi00u5bseYwXaSnhNrne+V0E6LAcBILJdPs= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.6.0 h1:aetoXYr0Tv7xRU/V4B4IZJ2QcbtMUFoNb3ORp7TzIK4= github.com/pelletier/go-toml v1.6.0/go.mod h1:5N711Q9dKgbdkxHL+MEfF31hpT7l0S0s/t2kKREewys= -github.com/pierrec/lz4 v2.6.0+incompatible h1:Ix9yFKn1nSPBLFl/yZknTp8TU5G4Ps0JDmguYK6iH1A= -github.com/pierrec/lz4 v2.6.0+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 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/qri-io/jsonpointer v0.1.1 h1:prVZBZLL6TW5vsSB9fFHFAMBLI4b0ri5vribQlTJiBA= -github.com/qri-io/jsonpointer v0.1.1/go.mod h1:DnJPaYgiKu56EuDp8TU5wFLdZIcAnb/uH9v37ZaMV64= -github.com/qri-io/jsonschema v0.2.1 h1:NNFoKms+kut6ABPf6xiKNM5214jzxAhDBrPHCJ97Wg0= -github.com/qri-io/jsonschema v0.2.1/go.mod h1:g7DPkiOsK1xv6T/Ao5scXRkd+yTFygcANPBaaqW+VrI= github.com/r3labs/sse/v2 v2.8.1 h1:lZH+W4XOLIq88U5MIHOsLec7+R62uhz3bIi2yn0Sg8o= github.com/r3labs/sse/v2 v2.8.1/go.mod h1:Igau6Whc+F17QUgML1fYe1VPZzTV6EMCnYktEmkNJ7I= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= -github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.0 h1:uIkTLo0AGRc8l7h5l9r+GcYi9qfVPt6lD4/bhmzfiKo= +github.com/santhosh-tekuri/jsonschema/v5 v5.3.0/go.mod h1:FKdcjfQW6rpZSnxxUvEA5H/cDPdvJ/SZJQLWWXWGrZ0= 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/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.8.1 h1:dJKuHgqk1NNQlqoA6BTlM1Wf9DOH3NBjQyu0h9+AZZE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= @@ -279,11 +195,9 @@ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -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.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= github.com/tidwall/gjson v1.11.0 h1:C16pk7tQNiH6VlCrtIXL1w8GaOsi1X3W8KDkE1BuYd4= github.com/tidwall/gjson v1.11.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -297,14 +211,9 @@ github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVM github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.8.1/go.mod h1:Z41J9TPoffeoqP0Iza0YbAhGvymRdZAd2uPmZ5JxRdY= github.com/vektah/gqlparser/v2 v2.4.6 h1:Yjzp66g6oVq93Jihbi0qhGnf/6zIWjcm8H6gA27zstE= github.com/vektah/gqlparser/v2 v2.4.6/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/xdg/scram v1.0.3/go.mod h1:lB8K/P019DLNhemzwFU4jHLhdvlE6uDZjXFejJXr49I= -github.com/xdg/stringprep v1.0.3/go.mod h1:Jhud4/sHMO4oL310DaZAKk9ZaJ08SJfe+sJh0HrGL1Y= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= @@ -327,9 +236,7 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201112155050-0c6587e931a9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd h1:XcWmESyNjXJMLahc3mqVQJcgSTDxFxhETVlfk9uGc38= golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= @@ -345,10 +252,7 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn 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-20191116160921-f9c825593386/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -358,22 +262,15 @@ golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5h golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0 h1:kunALQeHf1/185U1i0GOB/fy1IPRDDpuoOOqRReG57U= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -404,7 +301,6 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/cenkalti/backoff.v1 v1.1.0 h1:Arh75ttbsvlpVA7WtVpH4u9h6Zl46xuptxqLxPiSo4Y= @@ -423,8 +319,6 @@ 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-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= diff --git a/pkg/graphqljsonschema/jsonschema.go b/pkg/graphqljsonschema/jsonschema.go index a4db907b61..8fcbcf0232 100644 --- a/pkg/graphqljsonschema/jsonschema.go +++ b/pkg/graphqljsonschema/jsonschema.go @@ -4,10 +4,9 @@ import ( "context" "encoding/json" "fmt" - "strings" "github.com/buger/jsonparser" - "github.com/qri-io/jsonschema" + "github.com/santhosh-tekuri/jsonschema/v5" "github.com/wundergraph/graphql-go-tools/pkg/ast" ) @@ -176,7 +175,7 @@ func (r *fromTypeRefResolver) fromTypeRef(operation, definition *ast.Document, t } type Validator struct { - schema jsonschema.Schema + schema *jsonschema.Schema } func NewValidatorFromSchema(schema JsonSchema) (*Validator, error) { @@ -196,15 +195,13 @@ func MustNewValidatorFromSchema(schema JsonSchema) *Validator { } func NewValidatorFromString(schema string) (*Validator, error) { - var validator Validator - err := json.Unmarshal([]byte(schema), &validator.schema) + sch, err := jsonschema.CompileString("schema.json", schema) if err != nil { return nil, err } - // Run validator once to make it set up its internal state, otherwise we - // run into a data race in https://github.com/qri-io/jsonschema/blob/master/schema.go#L60 - validator.schema.Validate(context.Background(), []byte{}) - return &validator, nil + return &Validator{ + schema: sch, + }, nil } func MustNewValidatorFromString(schema string) *Validator { @@ -215,13 +212,23 @@ func MustNewValidatorFromString(schema string) *Validator { return validator } +func (v *Validator) Validate(ctx context.Context, inputJSON []byte) error { + var value interface{} + if err := json.Unmarshal(inputJSON, &value); err != nil { + return err + } + if err := v.schema.Validate(value); err != nil { + return err + } + return nil +} + func TopLevelType(schema string) (jsonparser.ValueType, error) { - var jsonSchema jsonschema.Schema - err := json.Unmarshal([]byte(schema), &jsonSchema) + sch, err := jsonschema.CompileString("schema.json", schema) if err != nil { return jsonparser.Unknown, err } - switch jsonSchema.TopLevelType() { + switch sch.Types[0] { case "boolean": return jsonparser.Boolean, nil case "string": @@ -241,23 +248,6 @@ func TopLevelType(schema string) (jsonparser.ValueType, error) { } } -func (v *Validator) Validate(ctx context.Context, inputJSON []byte) error { - errs, err := v.schema.ValidateBytes(ctx, inputJSON) - if err != nil { - // There was an issue performing the validation itself. Return a - // generic error so the input isn't exposed. - return fmt.Errorf("could not perform validation") - } - if len(errs) > 0 { - messages := make([]string, len(errs)) - for i := range errs { - messages[i] = errs[i].Error() - } - return fmt.Errorf("validation failed: %v", strings.Join(messages, "; ")) - } - return nil -} - type Kind int const ( diff --git a/pkg/graphqljsonschema/jsonschema_test.go b/pkg/graphqljsonschema/jsonschema_test.go index ef3e759da0..6718c92545 100644 --- a/pkg/graphqljsonschema/jsonschema_test.go +++ b/pkg/graphqljsonschema/jsonschema_test.go @@ -10,6 +10,18 @@ import ( "github.com/wundergraph/graphql-go-tools/internal/pkg/unsafeparser" ) +func prettyPrint(s string) string { + var v interface{} + if err := json.Unmarshal([]byte(s), &v); err != nil { + panic(err) + } + pretty, err := json.MarshalIndent(v, " ", " ") + if err != nil { + panic(err) + } + return string(pretty) +} + func runTest(schema, operation, expectedJsonSchema string, valid []string, invalid []string, opts ...Option) func(t *testing.T) { return func(t *testing.T) { definition := unsafeparser.ParseGraphqlDocumentString(schema) @@ -21,7 +33,7 @@ func runTest(schema, operation, expectedJsonSchema string, valid []string, inval jsonSchemaDefinition := FromTypeRef(&operationDoc, &definition, varType, opts...) actualSchema, err := json.Marshal(jsonSchemaDefinition) assert.NoError(t, err) - assert.Equal(t, expectedJsonSchema, string(actualSchema)) + assert.Equal(t, prettyPrint(expectedJsonSchema), prettyPrint(string(actualSchema))) validator, err := NewValidatorFromString(string(actualSchema)) assert.NoError(t, err) @@ -228,7 +240,7 @@ func TestJsonSchema(t *testing.T) { t.Run("complex recursive schema", runTest( complexRecursiveSchema, `query ($input: db_messagesWhereInput){}`, - `{"type":["object","null"],"properties":{"AND":{"$ref":"#/$defs/db_messagesWhereInput"},"NOT":{"$ref":"#/$defs/db_messagesWhereInput"},"OR":{"type":["array","null"],"items":{"$ref":"#/$defs/db_messagesWhereInput"}},"id":{"$ref":"#/$defs/db_IntFilter"},"message":{"$ref":"#/$defs/db_StringFilter"},"payload":{"$ref":"#/$defs/db_JsonFilter"},"user_id":{"$ref":"#/$defs/db_IntFilter"},"users":{"$ref":"#/$defs/db_UsersRelationFilter"}},"additionalProperties":false,"$defs":{"db_DateTimeFilter":{"type":["object","null"],"properties":{"equals":{},"gt":{},"gte":{},"in":{"type":["array","null"],"items":{}},"lt":{},"lte":{},"not":{"$ref":"#/$defs/db_NestedDateTimeFilter"},"notIn":{"type":["array","null"],"items":{}}},"additionalProperties":false},"db_IntFilter":{"type":["object","null"],"properties":{"equals":null,"gt":null,"gte":null,"in":{"type":["array","null"],"items":null},"lt":null,"lte":null,"not":{"$ref":"#/$defs/db_NestedIntFilter"},"notIn":{"type":["array","null"],"items":null}},"additionalProperties":false},"db_JsonFilter":{"type":["object","null"],"properties":{"equals":{"type":["string","null"]},"not":{"type":["string","null"]}},"additionalProperties":false},"db_MessagesListRelationFilter":{"type":["object","null"],"properties":{"every":{"$ref":"#/$defs/db_messagesWhereInput"},"none":{"$ref":"#/$defs/db_messagesWhereInput"},"some":{"$ref":"#/$defs/db_messagesWhereInput"}},"additionalProperties":false},"db_NestedDateTimeFilter":{"type":["object","null"],"properties":{"equals":{},"gt":{},"gte":{},"in":{"type":["array","null"],"items":{}},"lt":{},"lte":{},"not":{"$ref":"#/$defs/db_NestedDateTimeFilter"},"notIn":{"type":["array","null"],"items":{}}},"additionalProperties":false},"db_NestedIntFilter":{"type":["object","null"],"properties":{"equals":null,"gt":null,"gte":null,"in":{"type":["array","null"],"items":null},"lt":null,"lte":null,"not":{"$ref":"#/$defs/db_NestedIntFilter"},"notIn":{"type":["array","null"],"items":null}},"additionalProperties":false},"db_NestedStringFilter":{"type":["object","null"],"properties":{"contains":null,"endsWith":null,"equals":null,"gt":null,"gte":null,"in":{"type":["array","null"],"items":null},"lt":null,"lte":null,"not":{"$ref":"#/$defs/db_NestedStringFilter"},"notIn":{"type":["array","null"],"items":null},"startsWith":null},"additionalProperties":false},"db_StringFilter":{"type":["object","null"],"properties":{"contains":null,"endsWith":null,"equals":null,"gt":null,"gte":null,"in":{"type":["array","null"],"items":null},"lt":null,"lte":null,"mode":{"type":["string","null"]},"not":{"$ref":"#/$defs/db_NestedStringFilter"},"notIn":{"type":["array","null"],"items":null},"startsWith":null},"additionalProperties":false},"db_UsersRelationFilter":{"type":["object","null"],"properties":{"is":{"$ref":"#/$defs/db_usersWhereInput"},"isNot":{"$ref":"#/$defs/db_usersWhereInput"}},"additionalProperties":false},"db_messagesWhereInput":{"type":["object","null"],"properties":{"AND":{"$ref":"#/$defs/db_messagesWhereInput"},"NOT":{"$ref":"#/$defs/db_messagesWhereInput"},"OR":{"type":["array","null"],"items":{"$ref":"#/$defs/db_messagesWhereInput"}},"id":{"$ref":"#/$defs/db_IntFilter"},"message":{"$ref":"#/$defs/db_StringFilter"},"payload":{"$ref":"#/$defs/db_JsonFilter"},"user_id":{"$ref":"#/$defs/db_IntFilter"},"users":{"$ref":"#/$defs/db_UsersRelationFilter"}},"additionalProperties":false},"db_usersWhereInput":{"type":["object","null"],"properties":{"AND":{"$ref":"#/$defs/db_usersWhereInput"},"NOT":{"$ref":"#/$defs/db_usersWhereInput"},"OR":{"type":["array","null"],"items":{"$ref":"#/$defs/db_usersWhereInput"}},"email":{"$ref":"#/$defs/db_StringFilter"},"id":{"$ref":"#/$defs/db_IntFilter"},"lastlogin":{"$ref":"#/$defs/db_DateTimeFilter"},"messages":{"$ref":"#/$defs/db_MessagesListRelationFilter"},"name":{"$ref":"#/$defs/db_StringFilter"},"pet":{"$ref":"#/$defs/db_StringFilter"},"updatedat":{"$ref":"#/$defs/db_DateTimeFilter"}},"additionalProperties":false}}}`, + complexRecursiveSchemaResult, []string{}, []string{}, )) @@ -260,6 +272,7 @@ func TestJsonSchema(t *testing.T) { } const complexRecursiveSchema = ` +scalar Int scalar String input db_NestedIntFilter { equals: Int @@ -1069,3 +1082,553 @@ input db_WidgetsInput { items: [db_WidgetInput]! } ` + +const complexRecursiveSchemaResult = ` +{ + "type": [ + "object", + "null" + ], + "properties": { + "AND": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "NOT": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "OR": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/$defs/db_messagesWhereInput" + } + }, + "id": { + "$ref": "#/$defs/db_IntFilter" + }, + "message": { + "$ref": "#/$defs/db_StringFilter" + }, + "payload": { + "$ref": "#/$defs/db_JsonFilter" + }, + "user_id": { + "$ref": "#/$defs/db_IntFilter" + }, + "users": { + "$ref": "#/$defs/db_UsersRelationFilter" + } + }, + "additionalProperties": false, + "$defs": { + "db_DateTimeFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "equals": {}, + "gt": {}, + "gte": {}, + "in": { + "type": [ + "array", + "null" + ], + "items": {} + }, + "lt": {}, + "lte": {}, + "not": { + "$ref": "#/$defs/db_NestedDateTimeFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": {} + } + }, + "additionalProperties": false + }, + "db_IntFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "equals": { + "type": [ + "integer", + "null" + ] + }, + "gt": { + "type": [ + "integer", + "null" + ] + }, + "gte": { + "type": [ + "integer", + "null" + ] + }, + "in": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "integer", + "null" + ] + } + }, + "lt": { + "type": [ + "integer", + "null" + ] + }, + "lte": { + "type": [ + "integer", + "null" + ] + }, + "not": { + "$ref": "#/$defs/db_NestedIntFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "integer", + "null" + ] + } + } + }, + "additionalProperties": false + }, + "db_JsonFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "equals": { + "type": [ + "string", + "null" + ] + }, + "not": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "db_MessagesListRelationFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "every": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "none": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "some": { + "$ref": "#/$defs/db_messagesWhereInput" + } + }, + "additionalProperties": false + }, + "db_NestedDateTimeFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "equals": {}, + "gt": {}, + "gte": {}, + "in": { + "type": [ + "array", + "null" + ], + "items": {} + }, + "lt": {}, + "lte": {}, + "not": { + "$ref": "#/$defs/db_NestedDateTimeFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": {} + } + }, + "additionalProperties": false + }, + "db_NestedIntFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "equals": { + "type": [ + "integer", + "null" + ] + }, + "gt": { + "type": [ + "integer", + "null" + ] + }, + "gte": { + "type": [ + "integer", + "null" + ] + }, + "in": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "integer", + "null" + ] + } + }, + "lt": { + "type": [ + "integer", + "null" + ] + }, + "lte": { + "type": [ + "integer", + "null" + ] + }, + "not": { + "$ref": "#/$defs/db_NestedIntFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "integer", + "null" + ] + } + } + }, + "additionalProperties": false + }, + "db_NestedStringFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "contains": { + "type": [ + "string", + "null" + ] + }, + "endsWith": { + "type": [ + "string", + "null" + ] + }, + "equals": { + "type": [ + "string", + "null" + ] + }, + "gt": { + "type": [ + "string", + "null" + ] + }, + "gte": { + "type": [ + "string", + "null" + ] + }, + "in": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "lt": { + "type": [ + "string", + "null" + ] + }, + "lte": { + "type": [ + "string", + "null" + ] + }, + "not": { + "$ref": "#/$defs/db_NestedStringFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "startsWith": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "db_StringFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "contains": { + "type": [ + "string", + "null" + ] + }, + "endsWith": { + "type": [ + "string", + "null" + ] + }, + "equals": { + "type": [ + "string", + "null" + ] + }, + "gt": { + "type": [ + "string", + "null" + ] + }, + "gte": { + "type": [ + "string", + "null" + ] + }, + "in": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "lt": { + "type": [ + "string", + "null" + ] + }, + "lte": { + "type": [ + "string", + "null" + ] + }, + "mode": { + "type": [ + "string", + "null" + ] + }, + "not": { + "$ref": "#/$defs/db_NestedStringFilter" + }, + "notIn": { + "type": [ + "array", + "null" + ], + "items": { + "type": [ + "string", + "null" + ] + } + }, + "startsWith": { + "type": [ + "string", + "null" + ] + } + }, + "additionalProperties": false + }, + "db_UsersRelationFilter": { + "type": [ + "object", + "null" + ], + "properties": { + "is": { + "$ref": "#/$defs/db_usersWhereInput" + }, + "isNot": { + "$ref": "#/$defs/db_usersWhereInput" + } + }, + "additionalProperties": false + }, + "db_messagesWhereInput": { + "type": [ + "object", + "null" + ], + "properties": { + "AND": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "NOT": { + "$ref": "#/$defs/db_messagesWhereInput" + }, + "OR": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/$defs/db_messagesWhereInput" + } + }, + "id": { + "$ref": "#/$defs/db_IntFilter" + }, + "message": { + "$ref": "#/$defs/db_StringFilter" + }, + "payload": { + "$ref": "#/$defs/db_JsonFilter" + }, + "user_id": { + "$ref": "#/$defs/db_IntFilter" + }, + "users": { + "$ref": "#/$defs/db_UsersRelationFilter" + } + }, + "additionalProperties": false + }, + "db_usersWhereInput": { + "type": [ + "object", + "null" + ], + "properties": { + "AND": { + "$ref": "#/$defs/db_usersWhereInput" + }, + "NOT": { + "$ref": "#/$defs/db_usersWhereInput" + }, + "OR": { + "type": [ + "array", + "null" + ], + "items": { + "$ref": "#/$defs/db_usersWhereInput" + } + }, + "email": { + "$ref": "#/$defs/db_StringFilter" + }, + "id": { + "$ref": "#/$defs/db_IntFilter" + }, + "lastlogin": { + "$ref": "#/$defs/db_DateTimeFilter" + }, + "messages": { + "$ref": "#/$defs/db_MessagesListRelationFilter" + }, + "name": { + "$ref": "#/$defs/db_StringFilter" + }, + "pet": { + "$ref": "#/$defs/db_StringFilter" + }, + "updatedat": { + "$ref": "#/$defs/db_DateTimeFilter" + } + }, + "additionalProperties": false + } + } +} +` From a7ace7dd01bdf8d9a51ce560d7762a0fbf5572c4 Mon Sep 17 00:00:00 2001 From: fiam Date: Tue, 16 May 2023 12:34:47 +0100 Subject: [PATCH 3/4] fix: return unknown types as any instead of null --- pkg/graphqljsonschema/jsonschema.go | 2 +- pkg/graphqljsonschema/jsonschema_test.go | 7 +++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/pkg/graphqljsonschema/jsonschema.go b/pkg/graphqljsonschema/jsonschema.go index 8fcbcf0232..4db381fa66 100644 --- a/pkg/graphqljsonschema/jsonschema.go +++ b/pkg/graphqljsonschema/jsonschema.go @@ -105,7 +105,7 @@ func (r *fromTypeRefResolver) fromTypeRef(operation, definition *ast.Document, t } typeDefinitionNode, ok := definition.Index.FirstNodeByNameStr(name) if !ok { - return nil + return NewAny() } if typeDefinitionNode.Kind == ast.NodeKindEnumTypeDefinition { return NewString(nonNull) diff --git a/pkg/graphqljsonschema/jsonschema_test.go b/pkg/graphqljsonschema/jsonschema_test.go index 6718c92545..17e50146b1 100644 --- a/pkg/graphqljsonschema/jsonschema_test.go +++ b/pkg/graphqljsonschema/jsonschema_test.go @@ -269,6 +269,13 @@ func TestJsonSchema(t *testing.T) { }, WithPath([]string{"pet", "name"}), )) + t.Run("not defined scalar", runTest( + `input Container { name: MyScalar }`, + `query ($input: Container){}`, + `{"type":["object", "null"], "properties": {"name": {}}, "additionalProperties": false}`, + []string{}, + []string{}, + )) } const complexRecursiveSchema = ` From 65491296a212cf85d26dbbf6f1b30e34a5cc1720 Mon Sep 17 00:00:00 2001 From: fiam Date: Tue, 16 May 2023 12:35:00 +0100 Subject: [PATCH 4/4] chore: fix stylistic warnings --- pkg/graphqljsonschema/jsonschema.go | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pkg/graphqljsonschema/jsonschema.go b/pkg/graphqljsonschema/jsonschema.go index 4db381fa66..603560f934 100644 --- a/pkg/graphqljsonschema/jsonschema.go +++ b/pkg/graphqljsonschema/jsonschema.go @@ -287,7 +287,7 @@ type String struct { Type []string `json:"type"` } -func (_ String) Kind() Kind { +func (String) Kind() Kind { return StringKind } @@ -301,7 +301,7 @@ type ID struct { Type []string `json:"type"` } -func (_ ID) Kind() Kind { +func (ID) Kind() Kind { return IDKind } @@ -315,7 +315,7 @@ type Boolean struct { Type []string `json:"type"` } -func (_ Boolean) Kind() Kind { +func (Boolean) Kind() Kind { return BooleanKind } @@ -335,7 +335,7 @@ func NewNumber(nonNull bool) Number { } } -func (_ Number) Kind() Kind { +func (Number) Kind() Kind { return NumberKind } @@ -343,7 +343,7 @@ type Integer struct { Type []string `json:"type"` } -func (_ Integer) Kind() Kind { +func (Integer) Kind() Kind { return IntegerKind } @@ -357,7 +357,7 @@ type Ref struct { Ref string `json:"$ref"` } -func (_ Ref) Kind() Kind { +func (Ref) Kind() Kind { return RefKind } @@ -375,7 +375,7 @@ type Object struct { Defs map[string]JsonSchema `json:"$defs,omitempty"` } -func (_ Object) Kind() Kind { +func (Object) Kind() Kind { return ObjectKind } @@ -402,7 +402,7 @@ type Array struct { Defs map[string]JsonSchema `json:"$defs,omitempty"` } -func (_ Array) Kind() Kind { +func (Array) Kind() Kind { return ArrayKind }