diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..b512c09 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +node_modules \ No newline at end of file diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 40d4dd3..6c67548 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -3,61 +3,87 @@ name: Bazel Build on: push jobs: - bazel_build: - name: Bazel Build + go_test: runs-on: ubuntu-latest + name: Go CI + steps: + - uses: actions/checkout@master + - uses: actions/cache@v2 + with: + path: ~/go/pkg/mod + key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} + restore-keys: | + ${{ runner.os }}-go- + - uses: actions/setup-go@v2 + with: + go-version: '^1.15.5' + + - run: go vet ./... + + - run: go test ./... + + node_test: + runs-on: ubuntu-latest + name: Node CI steps: - uses: actions/checkout@master - - name: Mount bazel cache - uses: actions/cache@v2.1.2 + - uses: actions/setup-node@v2-beta with: - path: | - /home/runner/.cache/bazel - /home/runner/.cache/bazel-disk-cache - key: bazel + node-version: '14' - - name: Install bazelisk - run: | - curl -LO "https://github.com/bazelbuild/bazelisk/releases/download/v1.1.0/bazelisk-linux-amd64" - mkdir -p "${GITHUB_WORKSPACE}/bin/" - mv bazelisk-linux-amd64 "${GITHUB_WORKSPACE}/bin/bazel" - chmod +x "${GITHUB_WORKSPACE}/bin/bazel" + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" - - name: Test - run: | - "${GITHUB_WORKSPACE}/bin/bazel" test \ - -k -c opt \ - --stamp \ - --workspace_status_command hack/workspace_status.sh --\ - //src/... //hack/... -//hack/dev-container/... - - - name: Docker Login - run: | - echo ${{github.token}} | docker login -u ${{github.actor}} --password-stdin docker.pkg.github.com - - - name: Publish Artifacts - run: | - "${GITHUB_WORKSPACE}/bin/bazel" query //src/... |\ - grep +publish |\ - xargs -l1 "${GITHUB_WORKSPACE}/bin/bazel" run \ - -c opt \ - --stamp \ - --workspace_status_command hack/workspace_status.sh - - - name: Write Artifact Manifest - run: | - artifacts=$(${GITHUB_WORKSPACE}/bin/bazel query //src/... | grep +publish) - publishedServices=${artifacts//$'//src/'/} - publishedServices=${publishedServices//$':+publish'/} - manifestJSON='{"services": {}}' - for svc in $publishedServices; do - manifestJSON=$(echo $manifestJSON | jq ".services+={\"$svc\":\"$(cat bazel-bin/src/$svc/+publish.digest)\"}") - done - echo $manifestJSON > manifest.json - - - name: Upload Artifact Manifest - uses: actions/upload-artifact@v2 + - uses: actions/cache@v2 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) with: - name: manifest.json - path: manifest.json + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - uses: actions/cache@v2 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-buildx-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-buildx- + + - run: yarn install --frozen-lockfile + + - run: yarn lint + + - run: yarn test + + - name: Docker meta + id: docker_meta + uses: crazy-max/ghaction-docker-meta@v1 + with: + images: docker.pkg.github.com/roleypoly/roleypoly/ui + tag-sha: true + + - name: Set up Docker Buildx + id: buildx + uses: docker/setup-buildx-action@v1 + with: + install: true + + - name: Login to GitHub Packages Docker Registry + uses: docker/login-action@v1 + with: + registry: docker.pkg.github.com + username: ${{ github.repository_owner }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build and push + uses: docker/build-push-action@v2 + with: + context: . + file: .hack/dockerfiles/ui.Dockerfile + push: true + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache + tags: ${{ steps.docker_meta.outputs.tags }} + diff --git a/.gitignore b/.gitignore index d50025d..5e94906 100644 --- a/.gitignore +++ b/.gitignore @@ -1,12 +1,5 @@ -bazel-bin -bazel-out -bazel-roleypoly -bazel-testlogs node_modules .env -/target *.log storybook-static -dist -.firebaserc .next diff --git a/.storybook/main.js b/.storybook/main.js index bcfe1a0..71d8b6e 100644 --- a/.storybook/main.js +++ b/.storybook/main.js @@ -13,4 +13,9 @@ module.exports = { return config; }, + typescript: { + checkOptions: { + tsconfig: path.resolve(__dirname, '../tsconfig.stories.json'), + }, + }, }; diff --git a/.vscode/settings.json b/.vscode/settings.json index faf75a6..cc72227 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,11 +1,15 @@ { - "[starlark]": { - "editor.tabSize": 4 - }, - "bazel.buildifierFixOnFormat": true, - "editor.formatOnSave": true, - "editor.insertSpaces": true, - "editor.tabSize": 2, - "go.inferGopath": false, - "typescript.tsdk": "node_modules/typescript/lib" + "[starlark]": { + "editor.tabSize": 4 + }, + "bazel.buildifierFixOnFormat": true, + "editor.formatOnSave": true, + "editor.insertSpaces": true, + "editor.tabSize": 2, + "go.inferGopath": false, + "search.exclude": { + "**/.yarn": true, + "**/.pnp.*": true + }, + "typescript.enablePromptUseWorkspaceTsdk": true, } diff --git a/go.mod b/go.mod index 31c9916..c79c9be 100644 --- a/go.mod +++ b/go.mod @@ -3,18 +3,31 @@ module github.com/roleypoly/roleypoly go 1.15 require ( + cloud.google.com/go v0.72.0 // indirect cloud.google.com/go/firestore v1.3.0 github.com/GoogleCloudPlatform/functions-framework-go v1.2.0 + github.com/alicebob/miniredis/v2 v2.14.1 github.com/bwmarrin/discordgo v0.22.0 + github.com/cloudevents/sdk-go/v2 v2.3.1 // indirect github.com/dghubble/trie v0.0.0-20201011220304-ed6d6b8add55 - github.com/google/martian v2.1.0+incompatible + github.com/go-redis/redis/v8 v8.4.0 + github.com/google/go-cmp v0.5.4 // indirect github.com/gorilla/websocket v1.4.2 // indirect github.com/joho/godotenv v1.3.0 github.com/lampjaw/discordclient v0.0.0-20200923011548-6558fc9e89df - github.com/onsi/gomega v1.8.1 + github.com/onsi/gomega v1.10.3 github.com/segmentio/ksuid v1.0.3 - golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 // indirect - golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 // indirect - google.golang.org/api v0.30.0 + github.com/sony/gobreaker v0.4.1 + go.uber.org/multierr v1.6.0 // indirect + go.uber.org/zap v1.16.0 // indirect + golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 // indirect + golang.org/x/mod v0.4.0 // indirect + golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb // indirect + golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58 // indirect + golang.org/x/sys v0.0.0-20201202213521-69691e467435 // indirect + golang.org/x/tools v0.0.0-20201202200335-bef1c476418a // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20201202151023-55d61f90c1ce // indirect + google.golang.org/grpc v1.34.0 // indirect k8s.io/klog v1.0.0 ) diff --git a/go.sum b/go.sum index 7128f50..eeb76f3 100644 --- a/go.sum +++ b/go.sum @@ -15,7 +15,9 @@ cloud.google.com/go v0.61.0/go.mod h1:XukKJg4Y7QsUu0Hxg3qQKUWR4VuWivmyMK2+rUyxAq cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.63.0 h1:A+DfAZQ/eWca7gvu42CS6FNSDX4R8cghF+XfWLn4R6g= cloud.google.com/go v0.63.0/go.mod h1:GmezbQc7T2snqkEXWfZ0sy0VfkB/ivI2DdtJL2DEmlg= +cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= cloud.google.com/go v0.72.0 h1:eWRCuwubtDrCJG0oSUMgnsbD4CmPFQF2ei4OFbXvwww= +cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -36,36 +38,53 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/GoogleCloudPlatform/functions-framework-go v1.2.0 h1:E4DI4WUMSlOJXMkqBWOHKTXOnWfjHuuLQMseDudJUGM= github.com/GoogleCloudPlatform/functions-framework-go v1.2.0/go.mod h1:slApqIKn4fvBaQl1VRZJsWCx9I8WzC2JlUZAtuF41kU= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= +github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis/v2 v2.14.1 h1:GjlbSeoJ24bzdLRs13HoMEeaRZx9kg5nHoRW7QV/nCs= +github.com/alicebob/miniredis/v2 v2.14.1/go.mod h1:uS970Sw5Gs9/iK3yBg0l9Uj9s25wXxSpQUE9EaJ/Blg= github.com/bwmarrin/discordgo v0.22.0 h1:uBxY1HmlVCsW1IuaPjpCGT6A2DBwRn0nvOguQIxDdFM= github.com/bwmarrin/discordgo v0.22.0/go.mod h1:c1WtWUGN6nREDmzIpyTp/iD3VYt4Fpx+bVyfBG7JE+M= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= +github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudevents/sdk-go/v2 v2.2.0 h1:FlBJg7W0QywbOjuZGmRXUyFk8qkCHx2euETp+tuopSU= github.com/cloudevents/sdk-go/v2 v2.2.0/go.mod h1:3CTrpB4+u7Iaj6fd7E2Xvm5IxMdRoaAhqaRVnOr2rCU= +github.com/cloudevents/sdk-go/v2 v2.3.1 h1:QRTu0yRA4FbznjRSds0/4Hy6cVYpWV2wInlNJSHWAtw= +github.com/cloudevents/sdk-go/v2 v2.3.1/go.mod h1:4fO2UjPMYYR1/7KPJQCwTPb0lFA8zYuitkUpAZFSY1Q= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dghubble/trie v0.0.0-20201011220304-ed6d6b8add55 h1:3yKntgWb7KwnHd4nCVgCIUNQs4qRdua+jitRqGMxKys= github.com/dghubble/trie v0.0.0-20201011220304-ed6d6b8add55/go.mod h1:xNBeoT4V92/aNvuC3IJ2g59uxuKP4/kzvkpoHrb7v4A= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= +github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= 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= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-redis/redis/v8 v8.4.0 h1:J5NCReIgh3QgUJu398hUncxDExN4gMOHI11NVbVicGQ= +github.com/go-redis/redis/v8 v8.4.0/go.mod h1:A1tbYoHSa1fXwN+//ljcCYYJeLmVrwL9hbQN45Jdy0M= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -92,6 +111,8 @@ github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvq github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= github.com/golang/protobuf v1.4.2 h1:+Z5KGCizgyZCbGh1KZqA0fcLLkwbsjIzS4aV2v7wJX0= github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.4.3 h1:JjCZWpVbqXDqFVmTfYWEVTMIYrL/NPdPSCHPJ0T/raM= +github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -102,9 +123,15 @@ github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1 h1:JFrFEBb2xKufg6XkJsJr+WbKb4FQlURi5RUcBveYu9k= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.3 h1:x95R7cp+rSeeqAMI2knLtQ0DKlaBhv2NrtrOvafPHRo= +github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4 h1:L8R9j+yAqZuZjsqh/z+F1NCffTKKLShY6zXTItVIZ8M= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= +github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= @@ -112,9 +139,12 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= +github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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/google/uuid v1.1.2 h1:EVhdT+1Kseyi1/pUmXKaFxYsDNy9RQYkMWRH68J/W7Y= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= @@ -127,9 +157,11 @@ github.com/hashicorp/golang-lru v0.5.3/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uG github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -143,13 +175,23 @@ github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac h1:+2b6i github.com/lightstep/tracecontext.go v0.0.0-20181129014701-1757c391b1ac/go.mod h1:Frd2bnT3w5FB5q49ENTfVlztJES+1k/7lyWX2+9gq/M= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= +github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw= github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.14.2 h1:8mVmC9kjFFmA8H4pKMUhcblgifdkOIXPvbhN1T36q1M= +github.com/onsi/ginkgo v1.14.2/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34= github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.3 h1:gph6h/qe9GSUw1NhH1gp+qb+h8rXD8Cy60Z32Qw3ELA= +github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -158,35 +200,56 @@ github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1: github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/segmentio/ksuid v1.0.3 h1:FoResxvleQwYiPAVKe1tMUlEirodZqlqglIuFsdDntY= github.com/segmentio/ksuid v1.0.3/go.mod h1:/XUiZBD3kVx5SmUOl55voK5yeAbBNNIed+2O73XgrPE= +github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= +github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0= +github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb h1:ZkM6LRnq40pR1Ox0hTHlnpkcOTuFIDQpZ1IN8rKKhX0= +github.com/yuin/gopher-lua v0.0.0-20191220021717-ab39c6098bdb/go.mod h1:gqRgreBUhTSL0GeU64rtZ3Uq3wtjOa/TB2YfrtkCbVQ= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4 h1:LYy1Hy3MJdrCdMwwzxA/dRok4ejH+RwNGbuoD9fCjto= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= +go.opencensus.io v0.22.5 h1:dntmOdLpSpHlVqbW5Eay97DelsZHe+55D+xC6i0dDS0= +go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= +go.opentelemetry.io/otel v0.14.0 h1:YFBEfjCk9MTjaytCNSUkp9Q8lF7QJezA06T71FbQxLQ= +go.opentelemetry.io/otel v0.14.0/go.mod h1:vH5xEuwy7Rts0GNtsCW3HYQoZDY+OmBJ6t1bFGGlxgw= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= +go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= +go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= +go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= +go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= +go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= +go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0 h1:ORx85nbTijNz8ljznvCMR1ZBIPKFn3jQrag10X2AsuM= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= +go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM= +go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= golang.org/x/crypto v0.0.0-20181030102418-4d3f4d9ffa16/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9 h1:phUcVbl53swtrUN8kQEXFhUxPlIlWyBfKmidCu7P95o= -golang.org/x/crypto v0.0.0-20201117144127-c1f2f97bffc9/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392 h1:xYJJ3S178yv++9zXV/hnr29plCAGO9vAFG9dorqaFQc= +golang.org/x/crypto v0.0.0-20201124201722-c8d3bf9c5392/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -208,6 +271,7 @@ golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20200302205851-738671d3881b h1:Wh+f8QHJXR411sJR8/vRBTZ7YapZaRvUcLFFJhusH0k= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= @@ -216,7 +280,10 @@ golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0 h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.0 h1:8pl+sMODzuvGJkmj2W4kZihvVb5mKm8pB/X44PIQHv8= +golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -240,16 +307,27 @@ golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/ golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200707034311-ab3426394381 h1:VXak5I6aEWmAXeQjA+QSZzlgNrpq9mjcfDemuexIKsU= golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0 h1:wBouT66WTYFXdxfVdz9sVWARVd/2vfGcmI45D2gj45M= +golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb h1:eBmm0M9fYhWpKZLjQUUKka/LtIxf46G4fxeEz5KJr9U= +golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58 h1:Mj83v+wSRNEar42a/MQgxk9X42TdEmrOl9i+y8WbxLo= +golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -258,8 +336,10 @@ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190204203706-41f3e6584952/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-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -268,8 +348,11 @@ golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/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-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -283,10 +366,13 @@ golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201202213521-69691e467435 h1:25AvDqqB9PrNqj1FLf2/70I4W0L19qqoaFq3gjNwbKk= +golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -294,6 +380,8 @@ golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3 h1:cokOdA+Jmi5PJGXLlLllQSgYigAEfHXJAERHVMaCc2k= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.4 h1:0YWbFKbhXG/wIiuHDSKpS0Iy7FSA+u45VtBMfQcFTTc= +golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -312,6 +400,8 @@ golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -338,7 +428,13 @@ golang.org/x/tools v0.0.0-20200713011307-fd294ab11aed/go.mod h1:njjCfa9FT2d7l9Bc golang.org/x/tools v0.0.0-20200727233628-55644ead90ce/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200806022845-90696ccdc692 h1:fsn47thVa7Ar/TMyXYlZgOoT7M4+kRpb+KpSAqRQx1w= golang.org/x/tools v0.0.0-20200806022845-90696ccdc692/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= +golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= +golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.0.0-20201202200335-bef1c476418a h1:TYqOq/v+Ri5aADpldxXOj6PmvcPMOJbLjdALzZDQT2M= +golang.org/x/tools v0.0.0-20201202200335-bef1c476418a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -361,12 +457,17 @@ google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0 h1:yfrXXP61wVuLb0vBcG6qaOoIoqYEzOQS8jum51jkv2w= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.35.0 h1:TBCmTTxUrRDA1iTctnK/fIeitxIZ+TQuaf0j29fmCGo= +google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.6 h1:lMO5rYAqUxkmaj76jAkRUvt5JZgFymx/+Q5Mzfivuhc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -399,6 +500,11 @@ google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98 h1:LCO0fg4kb6WwkXQXRQQgUYsFeFb5taTX5WAx5O/Vt28= google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20201202151023-55d61f90c1ce h1:iS2R2xZpNiQFZrGqWisFYEYzOyKzvz07am2h/QXKqoY= +google.golang.org/genproto v0.0.0-20201202151023-55d61f90c1ce/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= @@ -412,6 +518,10 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0 h1:T7P4R73V3SSDPhH7WW7ATbfViLtmamH0DKrP3f9AuDI= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= +google.golang.org/grpc v1.34.0 h1:raiipEjMOIC/TO2AvyTxP25XFdLxNIBwzDh3FM3XztI= +google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -437,12 +547,17 @@ gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= +honnef.co/go/tools v0.0.1-2020.1.4 h1:UoveltGrhghAA7ePc+e+QYDHXrBps2PqFZiHkGR/xK8= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= diff --git a/hack/dockerfiles/ui.Dockerfile b/hack/dockerfiles/ui.Dockerfile new file mode 100644 index 0000000..9324fb9 --- /dev/null +++ b/hack/dockerfiles/ui.Dockerfile @@ -0,0 +1,25 @@ +FROM node:14-alpine AS base +WORKDIR /src + +# +# Builder +# +FROM base AS builder + +COPY package.json yarn.lock ./ +RUN yarn install --frozen-lockfile + +COPY . . +RUN yarn ui:build + +RUN yarn install --frozen-lockfile --prod + +# +# Output layer +# +FROM base AS output + +COPY --from=builder /src/.next /src/node_modules ./ + +EXPOSE 3000 +CMD yarn ui:prod \ No newline at end of file diff --git a/hack/functions-local/main.go b/hack/functions-local/main.go index 269d6dc..63b752b 100644 --- a/hack/functions-local/main.go +++ b/hack/functions-local/main.go @@ -13,6 +13,7 @@ import ( botjoin "github.com/roleypoly/roleypoly/src/functions/bot-join" createsession "github.com/roleypoly/roleypoly/src/functions/create-session" + helloworld "github.com/roleypoly/roleypoly/src/functions/hello-world" loginbounce "github.com/roleypoly/roleypoly/src/functions/login-bounce" loginhandler "github.com/roleypoly/roleypoly/src/functions/login-handler" sessiondata "github.com/roleypoly/roleypoly/src/functions/session-data" @@ -24,6 +25,7 @@ var mappings map[string]http.HandlerFunc = map[string]http.HandlerFunc{ "/login-bounce": loginbounce.LoginBounce, "/login-handler": loginhandler.LoginHandler, "/create-session": createsession.CreateSession, + "/hello-world": helloworld.HelloWorld, } var port string diff --git a/jest.config.js b/jest.config.js index cc7b98c..96e97a9 100644 --- a/jest.config.js +++ b/jest.config.js @@ -2,7 +2,7 @@ const { pathsToModuleNameMapper } = require('ts-jest/utils'); const { compilerOptions } = require('./tsconfig.json'); module.exports = { - preset: 'ts-jest', + preset: 'ts-jest/presets/js-with-babel', testEnvironment: 'enzyme', reporters: ['default'], setupFilesAfterEnv: ['jest-enzyme', 'jest-styled-components', './hack/jestSetup.ts'], @@ -10,4 +10,9 @@ module.exports = { prefix: '/', }), snapshotSerializers: ['enzyme-to-json/serializer'], + globals: { + 'ts-jest': { + tsconfig: './tsconfig.test.json', + }, + }, }; diff --git a/package.json b/package.json index aea7808..822e099 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,8 @@ "storybook:build": "build-storybook", "test": "jest", "ui:build": "next build", - "ui:dev": "next dev -p 6601" + "ui:prod": "next start", + "ui": "next dev -p 6601" }, "dependencies": { "chroma-js": "^2.1.0", @@ -50,6 +51,7 @@ "@types/minimist": "^1.2.1", "@types/node": "^14.14.10", "@types/react": "^17.0.0", + "@types/react-custom-scrollbars": "^4.0.7", "@types/react-dom": "^17.0.0", "@types/styled-components": "^5.1.4", "@typescript-eslint/eslint-plugin": "^4.9.0", @@ -57,7 +59,7 @@ "@typescript-eslint/parser": "^4.9.0", "babel-jest": "^26.6.3", "babel-loader": "^8.2.2", - "babel-plugin-styled-components": "1.12.0", + "babel-plugin-styled-components": "^1.12.0", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.5", "enzyme-to-json": "^3.6.1", @@ -87,4 +89,4 @@ "tsconfig-paths-webpack-plugin": "^3.3.0", "typescript": "^4.1.2" } -} +} \ No newline at end of file diff --git a/src/design-system/atoms/avatar/Avatar.stories.tsx b/src/design-system/atoms/avatar/Avatar.stories.tsx index e800fe5..91fde10 100644 --- a/src/design-system/atoms/avatar/Avatar.stories.tsx +++ b/src/design-system/atoms/avatar/Avatar.stories.tsx @@ -1,5 +1,5 @@ import * as React from 'react'; -import { Avatar } from './Avatar'; +import { Avatar, AvatarProps } from './Avatar'; export default { title: 'Atoms/Avatar', @@ -12,18 +12,22 @@ export default { }, }; -export const WithInitials = ({ initials, ...rest }) => ( +type StoryArgs = { + initials?: string; +} & AvatarProps; + +export const WithInitials = ({ initials, ...rest }: StoryArgs) => ( {initials} ); -export const WithText = ({ initials, ...rest }) => ( +export const WithText = ({ initials, ...rest }: StoryArgs) => ( {initials} ); -export const Empty = (args) => ; -export const DeliberatelyEmpty = (args) => ( +export const Empty = (args: StoryArgs) => ; +export const DeliberatelyEmpty = (args: StoryArgs) => ( ); diff --git a/src/design-system/organisms/help-page-base/HelpPageBase.story.tsx b/src/design-system/organisms/help-page-base/HelpPageBase.story.tsx deleted file mode 100644 index 94ac3eb..0000000 --- a/src/design-system/organisms/help-page-base/HelpPageBase.story.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import * as React from 'react'; -import { organismStories } from 'roleypoly/design-system/organisms/organisms.story'; -import { HelpPageBase } from './HelpPageBase'; -import { Content } from 'roleypoly/design-system/organisms/app-shell/AppShell.styled'; - -const baseStory = organismStories('Help Pages', module); - -export const HelpStoryWrapper = (props: { children: React.ReactNode }) => ( - - {props.children} - -); - -baseStory.add('Base', () => ( - -

What is the world but vibrations?

-

Vibrations that synchronize and tie it together, running free forever.

-
-)); diff --git a/src/design-system/organisms/help-why-no-roles/WhyNoRoles.story.tsx b/src/design-system/organisms/help-why-no-roles/WhyNoRoles.story.tsx deleted file mode 100644 index 2d22335..0000000 --- a/src/design-system/organisms/help-why-no-roles/WhyNoRoles.story.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { WhyNoRoles } from './WhyNoRoles'; -import * as React from 'react'; -import { organismStories } from 'roleypoly/design-system/organisms/organisms.story'; -import { HelpStoryWrapper } from 'roleypoly/design-system/organisms/help-page-base/HelpPageBase.story'; - -organismStories('Help Pages/Pages', module).add('Why No Roles', () => ( - - - -)); diff --git a/src/design-system/organisms/landing/Landing.story.tsx b/src/design-system/organisms/landing/Landing.story.tsx deleted file mode 100644 index 1d27c8f..0000000 --- a/src/design-system/organisms/landing/Landing.story.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import * as React from 'react'; -import { organismStories } from 'roleypoly/design-system/organisms/organisms.story'; -import { Landing } from './Landing'; - -const story = organismStories('Landing', module); - -story.add('Landing', () => ); diff --git a/src/design-system/organisms/role-picker/RolePicker.story.tsx b/src/design-system/organisms/role-picker/RolePicker.story.tsx deleted file mode 100644 index 23e7ab3..0000000 --- a/src/design-system/organisms/role-picker/RolePicker.story.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import * as React from 'react'; -import { RolePicker, RolePickerProps } from './RolePicker'; -import { organismStories } from 'roleypoly/design-system/organisms/organisms.story'; -import { guildData, member, guildRoles, guild } from 'roleypoly/common/types/storyData'; -import { action } from '@storybook/addon-actions'; - -const storyPublic = organismStories('Role Picker/Public', module); -const storyEditable = organismStories('Role Picker/Editable', module); - -const props: RolePickerProps = { - guildData: guildData, - member: member, - guild: guild, - roles: guildRoles, - onSubmit: action('onSubmit'), - editable: false, -}; - -const storyBuilder = ( - story: typeof storyPublic, - mixinProps: Partial -) => { - story.add('Full', () => ); - story.add('No Message', () => ( - - )); - story.add('No Categories', () => ( - - )); -}; - -storyBuilder(storyPublic, {}); -storyBuilder(storyEditable, { editable: true }); diff --git a/src/functions/hello-world/helloworld.go b/src/functions/hello-world/helloworld.go new file mode 100644 index 0000000..8d960ae --- /dev/null +++ b/src/functions/hello-world/helloworld.go @@ -0,0 +1,10 @@ +package helloworld + +import ( + "fmt" + "net/http" +) + +func HelloWorld(rw http.ResponseWriter, req *http.Request) { + fmt.Fprintln(rw, "Hello "+req.RemoteAddr+"!") +} diff --git a/src/pages/README.md b/src/pages/README.md new file mode 100644 index 0000000..756d131 --- /dev/null +++ b/src/pages/README.md @@ -0,0 +1,3 @@ +# Pages + +This is the Next.js root for the main UI. diff --git a/terraform/functions/.terraform.lock.hcl b/terraform/functions/.terraform.lock.hcl new file mode 100755 index 0000000..27e67f3 --- /dev/null +++ b/terraform/functions/.terraform.lock.hcl @@ -0,0 +1,20 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/google" { + version = "3.49.0" + constraints = ">= 3.49.0" + hashes = [ + "h1:MgihBNqO052m2jthWBu00wWYkz+eNrETwLqBfWmvMMY=", + "zh:00ea68b3a3b6e11ea469f47ee949c7f8f5751f935a3366152f9d3c6660c27e9b", + "zh:1ef3efc2e81fa31ceb04e39ae25acd0f061629f104827e127bdb4345e95f37d0", + "zh:6bf00943baa776adef0bbc914886359cf95c505b0494f3936cedac5cd1e01a00", + "zh:7d2cce5a9be476d8eee67435d854d094f82b5814a0e34964d10f28c1e88a2c8f", + "zh:841d074e3fb06f0df7c930bc0c4a9733ce0c5f1a19d6af98632a7931d2ca6a59", + "zh:8920ccd27c8904fcf5d701d71baee4f64d9d6f1383e66c4673909d9c53895057", + "zh:91d4479d2d461ad582d127d47aa7094bd74a1278cc8d78ad36a1c4f31301f4f0", + "zh:a97c19cdb42b5f7e4e297183d60eaa45843ee7b0adde1120e47026c4cae456c1", + "zh:cbd862cc4d21866bb832e3e7fe4e6ed959f5e5363bcf3d74e476b42fec716efe", + "zh:ec3c63ba6db74b353fafff6aedbb30e3eb1a4e5c856b4920c7ffa10d7081cbbd", + ] +} diff --git a/terraform/functions/cloud-function.tf b/terraform/functions/cloud-function.tf new file mode 100644 index 0000000..bdc244c --- /dev/null +++ b/terraform/functions/cloud-function.tf @@ -0,0 +1,23 @@ + +resource "google_cloudfunctions_function" "function" { + name = "roleypoly-test-hello-world" + description = "Roleypoly FaaS: /hello-world" + runtime = "go113" + + available_memory_mb = 128 + source_repository { + url = "https://source.cloud.google.com/projects/roleypoly/repos/github_roleypoly_roleypoly/moveable-alias/gcf/paths/src/functions/hello-world" + } + trigger_http = true + entry_point = "helloGET" +} + +# IAM entry for all users to invoke the function +resource "google_cloudfunctions_function_iam_member" "invoker" { + project = google_cloudfunctions_function.function.project + region = google_cloudfunctions_function.function.region + cloud_function = google_cloudfunctions_function.function.name + + role = "roles/cloudfunctions.invoker" + member = "allUsers" +} diff --git a/terraform/functions/provision.tf b/terraform/functions/provision.tf new file mode 100644 index 0000000..c9263a2 --- /dev/null +++ b/terraform/functions/provision.tf @@ -0,0 +1,26 @@ +terraform { + required_version = ">=0.14" + required_providers { + google = { + source = "hashicorp/google" + version = ">=3.49.0" + } + } +} + +/* + Google Cloud +*/ +# variable "gcs_token" { type = string } +# variable "gcs_region" { type = string } +# variable "gcs_project" { type = string } +provider "google" { + # project = var.gcs_project + # region = var.gcs_region + # credentials = var.gcs_token + + scopes = [ + "https://www.googleapis.com/auth/devstorage.full_control", + "https://www.googleapis.com/auth/cloud-platform", + ] +} diff --git a/terraform/platform/app/environments.tf b/terraform/platform/app/environments.tf deleted file mode 100644 index 0861d29..0000000 --- a/terraform/platform/app/environments.tf +++ /dev/null @@ -1,13 +0,0 @@ -module "app-env-prod" { - source = "github.com/roleypoly/devops.git//terraform/modules/cluster-environment" - - environment_tag = "production" - app_name = "roleypoly" -} - -module "app-env-stage" { - source = "github.com/roleypoly/devops.git//terraform/modules/cluster-environment" - - environment_tag = "staging" - app_name = "roleypoly" -} diff --git a/terraform/platform/app/provision.tf b/terraform/platform/app/provision.tf deleted file mode 100644 index 841eaf7..0000000 --- a/terraform/platform/app/provision.tf +++ /dev/null @@ -1,47 +0,0 @@ -terraform { - required_version = ">=0.12.6" - - backend "remote" { - organization = "Roleypoly" - - workspaces { - name = "roleypoly-platform-app" - } - } -} - -/* - Terraform Cloud -*/ -variable "tfc_email" { type = string } -variable "tfc_oauth_token_id" { type = string } -variable "tfc_webhook_url" { type = string } -provider "tfe" { - version = ">=0.15.0" -} - -/* - Cloudflare (for tfc vars) -*/ -variable "cloudflare_token" { type = string } -variable "cloudflare_email" { type = string } -variable "cloudflare_zone_id" { type = string } -provider "cloudflare" { - version = ">=2.0" - email = var.cloudflare_email - api_token = var.cloudflare_token - api_user_service_key = var.cloudflare_origin_ca_token -} - -/* - Kubernetes -*/ -variable "k8s_endpoint" { type = string } -variable "k8s_token" { type = string } -variable "k8s_cert" { type = string } -provider "kubernetes" { - load_config_file = false - token = var.k8s_token - host = var.k8s_endpoint - cluster_ca_certificate = var.k8s_cert -} diff --git a/terraform/platform/app/workspaces.tf b/terraform/platform/app/workspaces.tf deleted file mode 100644 index 910b75e..0000000 --- a/terraform/platform/app/workspaces.tf +++ /dev/null @@ -1,76 +0,0 @@ -locals { - repo = "roleypoly/devops" - branch = "master" - tfc_org = "Roleypoly" - - common_vars = {} - common_secret_vars = { - cloudflare_token = var.cloudflare_token, - cloudflare_email = var.cloudflare_email, - cloudflare_zone_id = var.cloudflare_zone_id, - k8s_endpoint = var.k8s_endpoint, - } -} - -module "tfcws-production" { - source = "github.com/roleypoly/devops.git//terraform/modules/tfc-workspace" - workspace-name = "roleypoly-app-production" - repo = local.repo - branch = local.branch - tfc_webhook_url = var.tfc_webhook_url - directory = "terraform/app" - auto_apply = false - dependent_modules = [] - tfc_org = local.tfc_org - tfc_oauth_token_id = var.tfc_oauth_token_id - - vars = merge(local.common_vars, { - environment_tag = "production", - ingress_hostname = "prd.roleypoly-nyc.kc" - k8s_namespace = module.app-env-prod.namespace, - }) - - secret-vars = merge(local.common_secret_vars, { - k8s_cert = var.k8s_cert, - }) -} - -module "tfcws-staging" { - source = "github.com/roleypoly/devops.git//terraform/modules/tfc-workspace" - workspace-name = "roleypoly-app-staging" - repo = local.repo - branch = local.branch - tfc_webhook_url = var.tfc_webhook_url - directory = "terraform/app" - auto_apply = true - dependent_modules = [] - tfc_org = local.tfc_org - tfc_oauth_token_id = var.tfc_oauth_token_id - - vars = merge(local.common_vars, { - environment_tag = "staging", - ingress_hostname = "stg.roleypoly-nyc.kc" - k8s_namespace = module.app-env-stage.namespace, - }) - - secret-vars = merge(local.common_secret_vars, { - k8s_cert = var.k8s_cert, - }) -} - -// Due to quirk, we must set secret vars manually. -resource "tfe_variable" "k8s-token-prod" { - key = "k8s_token" - value = module.app-env-prod.service_account_token - category = "terraform" - workspace_id = module.tfcws-production.workspace.0.id - sensitive = true -} - -resource "tfe_variable" "k8s-token-stage" { - key = "k8s_token" - value = module.app-env-stage.service_account_token - category = "terraform" - workspace_id = module.tfcws-staging.workspace.0.id - sensitive = true -} diff --git a/terraform/platform/bootstrap/global.auto.tfvars b/terraform/platform/bootstrap/global.auto.tfvars deleted file mode 100644 index 3b3d620..0000000 --- a/terraform/platform/bootstrap/global.auto.tfvars +++ /dev/null @@ -1 +0,0 @@ -gcs_region = "us-east1-d" \ No newline at end of file diff --git a/terraform/platform/bootstrap/k8s.tf b/terraform/platform/bootstrap/k8s.tf deleted file mode 100644 index a689607..0000000 --- a/terraform/platform/bootstrap/k8s.tf +++ /dev/null @@ -1,26 +0,0 @@ -data "digitalocean_kubernetes_versions" "versions" { - version_prefix = "1.16." -} - -resource "digitalocean_kubernetes_cluster" "cluster" { - name = "roleypoly-nyc" - region = "nyc1" - version = data.digitalocean_kubernetes_versions.versions.latest_version - - node_pool { - name = "default-worker-pool" - size = "s-2vcpu-2gb" - node_count = 3 - labels = { - node_type = "static" - } - } -} - -locals { - k8sEndpoint = digitalocean_kubernetes_cluster.cluster.endpoint - k8sToken = digitalocean_kubernetes_cluster.cluster.kube_config[0].token - k8sCert = base64decode( - digitalocean_kubernetes_cluster.cluster.kube_config[0].cluster_ca_certificate - ) -} diff --git a/terraform/platform/bootstrap/provision.tf b/terraform/platform/bootstrap/provision.tf deleted file mode 100644 index 2d2784f..0000000 --- a/terraform/platform/bootstrap/provision.tf +++ /dev/null @@ -1,58 +0,0 @@ -terraform { - required_version = ">=0.12.6" - - backend "remote" { - organization = "Roleypoly" - - workspaces { - name = "roleypoly-platform-bootstrap" - } - } -} - -/* - Google Cloud -*/ -variable "gcs_token" { type = string } -variable "gcs_region" { type = string } -variable "gcs_project" { type = string } -provider "google" { - version = ">=3.18.0" - project = var.gcs_project - region = var.gcs_region - credentials = var.gcs_token - - scopes = [ - "https://www.googleapis.com/auth/devstorage.full_control", - "https://www.googleapis.com/auth/cloud-platform", - ] -} - -/* - DigitalOcean -*/ -variable "digitalocean_token" { type = string } -provider "digitalocean" { - version = ">=1.16.0" - token = var.digitalocean_token -} - -/* - Terraform Cloud -*/ -variable "tfc_token" { type = string } -variable "tfc_email" { type = string } -variable "tfc_oauth_token_id" { type = string } -variable "tfc_webhook_url" { type = string } -provider "tfe" { - version = ">=0.15.0" - token = var.tfc_token -} - -/* - Cloudflare (for tfc vars) -*/ -variable "cloudflare_token" { type = string } -variable "cloudflare_email" { type = string } -variable "cloudflare_zone_id" { type = string } -variable "cloudflare_origin_ca_token" { type = string } diff --git a/terraform/platform/bootstrap/tfcloud.tf b/terraform/platform/bootstrap/tfcloud.tf deleted file mode 100644 index c5b93c4..0000000 --- a/terraform/platform/bootstrap/tfcloud.tf +++ /dev/null @@ -1,65 +0,0 @@ -locals { - repo = "roleypoly/devops" - branch = "master" - tfc_org = "Roleypoly" -} - -module "tfcws-services" { - source = "github.com/roleypoly/devops.git//terraform/modules/tfc-workspace" - workspace-name = "roleypoly-platform-services" - repo = local.repo - branch = local.branch - tfc_webhook_url = var.tfc_webhook_url - directory = "terraform/platform/services" - auto_apply = false - dependent_modules = ["nginx-ingress-controller", "cloudflare-dns"] - tfc_org = local.tfc_org - tfc_oauth_token_id = var.tfc_oauth_token_id - - secret-vars = { - digitalocean_token = var.digitalocean_token - cloudflare_origin_ca_token = var.cloudflare_origin_ca_token - cloudflare_zone_id = var.cloudflare_zone_id - cloudflare_token = var.cloudflare_token - cloudflare_email = var.cloudflare_email - vault_gcs_token = local.vaultGcsSvcacctKey - vault_gcs_url = local.vaultGcsUrl - k8s_endpoint = local.k8sEndpoint - k8s_token = local.k8sToken - k8s_cert = local.k8sCert - } - - vars = { - gcp_region = var.gcs_region - gcp_project = var.gcs_project - } -} - -module "tfcws-app" { - source = "github.com/roleypoly/devops.git//terraform/modules/tfc-workspace" - workspace-name = "roleypoly-platform-app" - repo = local.repo - branch = local.branch - tfc_webhook_url = var.tfc_webhook_url - directory = "terraform/platform/app" - auto_apply = false - dependent_modules = ["tfc-workspace", "cluster-environment"] - tfc_org = local.tfc_org - tfc_oauth_token_id = var.tfc_oauth_token_id - - secret-vars = { - k8s_endpoint = local.k8sEndpoint - k8s_token = local.k8sToken - k8s_cert = local.k8sCert - cloudflare_zone_id = var.cloudflare_zone_id - cloudflare_token = var.cloudflare_token - cloudflare_email = var.cloudflare_email - tfc_email = var.tfc_email - tfc_oauth_token_id = var.tfc_oauth_token_id - tfc_webhook_url = var.tfc_webhook_url - } - - env-vars = { - TFE_TOKEN = var.tfc_token - } -} diff --git a/terraform/platform/bootstrap/vault-gcs.tf b/terraform/platform/bootstrap/vault-gcs.tf deleted file mode 100644 index 8233372..0000000 --- a/terraform/platform/bootstrap/vault-gcs.tf +++ /dev/null @@ -1,26 +0,0 @@ -locals { - vaultGcsSvcacctKey = google_service_account_key.vault-svcacct-key.private_key - vaultGcsUrl = google_storage_bucket.vault-backend.url -} - -resource "google_service_account" "vault-svcacct" { - account_id = "vault-gcs" - display_name = "Vault Svcacct" -} - -resource "google_service_account_key" "vault-svcacct-key" { - service_account_id = google_service_account.vault-svcacct.name -} - -resource "google_storage_bucket" "vault-backend" { - name = "roleypoly-vault" -} - -resource "google_storage_bucket_acl" "vault-backend-acl" { - bucket = google_storage_bucket.vault-backend.name - - role_entity = [ - "WRITER:user-${google_service_account.vault-svcacct.email}" - ] -} - diff --git a/terraform/platform/bootstrap/vault-kms.tf b/terraform/platform/bootstrap/vault-kms.tf deleted file mode 100644 index 0d75a8f..0000000 --- a/terraform/platform/bootstrap/vault-kms.tf +++ /dev/null @@ -1,42 +0,0 @@ -resource "google_kms_key_ring" "vault-kms-ring" { - name = "vault-keyring" - location = "global" - - lifecycle { - prevent_destroy = true - } -} - -locals { - iam_members = [ - "serviceAccount:${google_service_account.vault-svcacct.email}" - ] -} - -data "google_iam_policy" "vault" { - binding { - role = "roles/editor" - members = local.iam_members - } - - binding { - role = "roles/cloudkms.cryptoKeyEncrypterDecrypter" - members = local.iam_members - } -} - -resource "google_kms_key_ring_iam_policy" "vault-binding" { - key_ring_id = google_kms_key_ring.vault-kms-ring.id - policy_data = data.google_iam_policy.vault.policy_data -} - -resource "google_kms_crypto_key" "vault-key" { - name = "vault-key" - key_ring = google_kms_key_ring.vault-kms-ring.id - rotation_period = "100000s" // just over one day - - lifecycle { - prevent_destroy = true - } -} - diff --git a/terraform/platform/services/ingress.tf b/terraform/platform/services/ingress.tf deleted file mode 100644 index d6e3ed2..0000000 --- a/terraform/platform/services/ingress.tf +++ /dev/null @@ -1,13 +0,0 @@ -module "ingress-controller" { - source = "github.com/roleypoly/devops.git//terraform/modules/nginx-ingress-controller" - nginx-ingress-version = "0.32.0" -} - -module "cluster-dns" { - source = "github.com/roleypoly/devops.git//terraform/modules/cloudflare-cluster-dns" - ingress-name = module.ingress-controller.service-name - ingress-namespace = module.ingress-controller.service-namespace - ingress-endpoint = module.ingress-controller.service-endpoint - cloudflare-zone-id = var.cloudflare_zone_id - record-name = "roleypoly-nyc.kc" -} diff --git a/terraform/platform/services/provision.tf b/terraform/platform/services/provision.tf deleted file mode 100644 index bd381ae..0000000 --- a/terraform/platform/services/provision.tf +++ /dev/null @@ -1,56 +0,0 @@ -terraform { - required_version = ">=0.12.6" - - backend "remote" { - organization = "Roleypoly" - - workspaces { - name = "roleypoly-platform-services" - } - } -} - -/* - DigitalOcean -*/ -variable "digitalocean_token" { type = string } -provider "digitalocean" { - version = ">=1.16.0" - token = var.digitalocean_token -} - -/* - Cloudflare -*/ -variable "cloudflare_token" { type = string } -variable "cloudflare_email" { type = string } -variable "cloudflare_zone_id" { type = string } -variable "cloudflare_origin_ca_token" { type = string } -provider "cloudflare" { - version = ">=2.0" - email = var.cloudflare_email - api_token = var.cloudflare_token - api_user_service_key = var.cloudflare_origin_ca_token -} - -/* - Kubernetes -*/ -variable "k8s_endpoint" { type = string } -variable "k8s_token" { type = string } -variable "k8s_cert" { type = string } -provider "kubernetes" { - load_config_file = false - token = var.k8s_token - host = var.k8s_endpoint - cluster_ca_certificate = var.k8s_cert -} - -/* - Others -*/ -variable "vault_gcs_token" { type = string } -variable "vault_gcs_url" { type = string } -variable "gcp_project" { type = string } -variable "gcp_region" { type = string } - diff --git a/terraform/platform/services/vault.tf b/terraform/platform/services/vault.tf deleted file mode 100644 index a76d60d..0000000 --- a/terraform/platform/services/vault.tf +++ /dev/null @@ -1,207 +0,0 @@ -resource "kubernetes_namespace" "vault" { - metadata { - name = "vault" - } -} - -locals { - vaultNs = kubernetes_namespace.vault.metadata.0.name - vaultLabels = { - "app.kubernetes.io/name" = "vault" - "app.kubernetes.io/part-of" = "vault" - } -} - -resource "kubernetes_secret" "vault-svcacct" { - metadata { - generate_name = "vault-svcacct" - namespace = local.vaultNs - labels = local.vaultLabels - } - - data = { - "vault-service-account.json" = base64decode(var.vault_gcs_token) - } -} - -resource "kubernetes_config_map" "vault-cm" { - metadata { - generate_name = "vault-config" - namespace = local.vaultNs - labels = local.vaultLabels - } - - data = { - "vault-config.json" = jsonencode({ - // Enables UI - ui = true, - - // Storage with GCS - storage = { - gcs = { - bucket = "roleypoly-vault", - } - }, - - // Auto-seal setup with GCPKMS - seal = { - gcpckms = { - credentials = "/vault/mounted-secrets/vault-service-account.json", - project = var.gcp_project - region = "global" - key_ring = "vault-keyring" - crypto_key = "vault-key" - } - }, - - // TCP - listener = { - tcp = { - address = "0.0.0.0:8200" - } - }, - - // K8s service registration - service_registration = { - kubernetes = {} - } - }) - } -} - - - -resource "kubernetes_deployment" "vault" { - metadata { - name = "vault" - namespace = local.vaultNs - labels = local.vaultLabels - } - - spec { - replicas = 1 - - selector { - match_labels = local.vaultLabels - } - - template { - metadata { - labels = local.vaultLabels - } - - spec { - service_account_name = kubernetes_service_account.vault-sa.metadata.0.name - automount_service_account_token = true - - container { - image = "vault:1.5.0" - name = "vault" - - env { - name = "GOOGLE_APPLICATION_CREDENTIALS" - value = "/vault/mounted-secrets/vault-service-account.json" - } - - env { - name = "VAULT_K8S_NAMESPACE" - value_from { - field_ref { - field_path = "metadata.namespace" - } - } - } - - env { - name = "VAULT_K8S_POD_NAME" - value_from { - field_ref { - field_path = "metadata.name" - } - } - } - - volume_mount { - mount_path = "/vault/mounted-secrets" - name = "vault-secrets" - read_only = true - } - - volume_mount { - mount_path = "/vault/config/vault-config.json" - name = "vault-config" - sub_path = "vault-config.json" - } - - security_context { - capabilities { - add = ["IPC_LOCK"] - } - } - } - - node_selector = { - node_type = "static" - } - - restart_policy = "Always" - - volume { - name = "vault-secrets" - secret { - secret_name = kubernetes_secret.vault-svcacct.metadata.0.name - } - } - - volume { - name = "vault-config" - config_map { - name = kubernetes_config_map.vault-cm.metadata.0.name - } - } - } - } - } -} - -resource "kubernetes_service_account" "vault-sa" { - metadata { - namespace = local.vaultNs - name = "vault" - labels = local.vaultLabels - } -} - -resource "kubernetes_role" "vault-sa-role" { - metadata { - namespace = local.vaultNs - name = "vault" - labels = local.vaultLabels - } - - rule { - api_groups = [""] - resources = ["pods"] - verbs = ["get", "update"] - } -} - -resource "kubernetes_role_binding" "vault-sa-rb" { - metadata { - namespace = local.vaultNs - name = "vault-rb" - labels = local.vaultLabels - } - - role_ref { - api_group = "rbac.authorization.k8s.io" - kind = "Role" - name = kubernetes_role.vault-sa-role.metadata.0.name - } - - subject { - kind = "ServiceAccount" - name = kubernetes_service_account.vault-sa.metadata.0.name - namespace = local.vaultNs - } -} diff --git a/tsconfig.json b/tsconfig.json index 64bfdd1..001aebc 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -28,5 +28,5 @@ "isolatedModules": true }, "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], - "exclude": ["node_modules"] + "exclude": ["node_modules", "**/*.stories.tsx"] } diff --git a/tsconfig.stories.json b/tsconfig.stories.json new file mode 100644 index 0000000..01df361 --- /dev/null +++ b/tsconfig.stories.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx" + }, + "exclude": ["node_modules"] +} diff --git a/tsconfig.test.json b/tsconfig.test.json new file mode 100644 index 0000000..2589017 --- /dev/null +++ b/tsconfig.test.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx" + } +} diff --git a/yarn.lock b/yarn.lock index 6d77637..eaa9e0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@ampproject/toolbox-core@^2.6.0": - version "2.6.1" - resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.6.1.tgz#af97ec253bf39e5fe5121b8ec28f1f35d1878446" - integrity sha512-hTsd9J2yy3JPMClG8BuUhUfMDtd3oDhCuRe/SyZJYQfNMN8hQHt7LNXtdOzZr0Kw7nTepHmn7GODS68fZN4OQQ== +"@ampproject/toolbox-core@^2.6.0", "@ampproject/toolbox-core@^2.7.1": + version "2.7.1" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-2.7.1.tgz#d433a333c0dbb0bb6db7e69edd490d5694e06fc3" + integrity sha512-MWGmCLyBOouXTy1Vc30Jw7NkshJ5XkPlcXhhRc9Gw3dDAZJ8rUS69SIQ6cFMt2owCQnw7irMNlvZQTqdyx61rA== dependencies: cross-fetch "3.0.6" lru-cache "6.0.0" @@ -35,11 +35,11 @@ terser "5.1.0" "@ampproject/toolbox-runtime-version@^2.7.0-alpha.1": - version "2.7.0-alpha.1" - resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.0-alpha.1.tgz#2ecd603e1fc986f21048947639e99b5706e01ec3" - integrity sha512-JruvO4RfaC/piKOY/2w6vuasNjdrHnb+xvmQTl4zBBdMsDooohZKsN9jv9YiKIdpny4MzLt1ce497840vJJq+g== + version "2.7.1" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-2.7.1.tgz#2ae543c97e2659be444eb389b1277ed5a70568e6" + integrity sha512-3LsjaOz/Aw4YpWG6ZxpVhA2N8GF0gRfvCrNm0ZspUviz/NR+MLrJ50BPoOOAmKCzoNVA2Q8xF3Y8dfamGuoblA== dependencies: - "@ampproject/toolbox-core" "^2.6.0" + "@ampproject/toolbox-core" "^2.7.1" "@ampproject/toolbox-script-csp@^2.5.4": version "2.5.4" @@ -47,11 +47,11 @@ integrity sha512-+knTYetI5nWllRZ9wFcj7mYxelkiiFVRAAW/hl0ad8EnKHMH82tRlk40CapEnUHhp6Er5sCYkumQ8dngs3Q4zQ== "@ampproject/toolbox-validator-rules@^2.5.4": - version "2.5.4" - resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.5.4.tgz#7dee3a3edceefea459d060571db8cc6e7bbf0dd6" - integrity sha512-bS7uF+h0s5aiklc/iRaujiSsiladOsZBLrJ6QImJDXvubCAQtvE7om7ShlGSXixkMAO0OVMDWyuwLlEy8V1Ing== + version "2.7.1" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-validator-rules/-/toolbox-validator-rules-2.7.1.tgz#5a257f2b21d1d44167769fe3eae7f587d249d9fa" + integrity sha512-LYkGKqFBOC39lvRX38wGjbLf4r8VXJyiCZSLRepiHjO4xbstZLyHPwxHlobQrBhD7UbHZn5TVD+qw+VMJNMSxw== dependencies: - cross-fetch "3.0.5" + cross-fetch "^3.0.6" "@babel/code-frame@7.10.4", "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.5.5": version "7.10.4" @@ -2475,6 +2475,13 @@ "@types/react" "*" "@types/reactcss" "*" +"@types/react-custom-scrollbars@^4.0.7": + version "4.0.7" + resolved "https://registry.yarnpkg.com/@types/react-custom-scrollbars/-/react-custom-scrollbars-4.0.7.tgz#b1312ec749fcf4a01fee7466508501e072ede7ea" + integrity sha512-4QPZdwd+wmzWq9TyNSA/4MZFYvlQn1GlEFFkpFx8VSs13gR/L+hQne0vFnbzwlQmGG7OksthkoVpYxWJjzz95w== + dependencies: + "@types/react" "*" + "@types/react-dom@^17.0.0": version "17.0.0" resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-17.0.0.tgz#b3b691eb956c4b3401777ee67b900cb28415d95a" @@ -2592,9 +2599,9 @@ "@types/yargs-parser" "*" "@types/yargs@^15.0.0": - version "15.0.10" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.10.tgz#0fe3c8173a0d5c3e780b389050140c3f5ea6ea74" - integrity sha512-z8PNtlhrj7eJNLmrAivM7rjBESG6JwC5xP3RVk12i/8HVP7Xnx/sEmERnRImyEuUaJfO942X0qMOYsoupaJbZQ== + version "15.0.11" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.11.tgz#361d7579ecdac1527687bcebf9946621c12ab78c" + integrity sha512-jfcNBxHFYJ4nPIacsi3woz1+kvUO6s1CyeEhtnDHBjHUMNj5UlW2GynmnSgiJJEdNg9yW5C8lfoNRZrHGv5EqA== dependencies: "@types/yargs-parser" "*" @@ -3596,7 +3603,7 @@ babel-plugin-react-docgen@^4.2.1: lodash "^4.17.15" react-docgen "^5.0.0" -babel-plugin-styled-components@1.12.0, "babel-plugin-styled-components@>= 1": +"babel-plugin-styled-components@>= 1", babel-plugin-styled-components@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/babel-plugin-styled-components/-/babel-plugin-styled-components-1.12.0.tgz#1dec1676512177de6b827211e9eda5a30db4f9b9" integrity sha512-FEiD7l5ZABdJPpLssKXjBUJMYqzbcNzBowfXDCdJhOpbhWiewapUaY+LZGT8R4Jg2TwOjGjG4RKeyrO5p9sBkA== @@ -4822,7 +4829,7 @@ cross-fetch@3.0.5: dependencies: node-fetch "2.6.0" -cross-fetch@3.0.6: +cross-fetch@3.0.6, cross-fetch@^3.0.6: version "3.0.6" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== @@ -5390,7 +5397,7 @@ domelementtype@1, domelementtype@^1.3.0, domelementtype@^1.3.1: resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz#d048c44b37b0d10a7f2a3d5fee3f4333d790481f" integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== -domelementtype@^2.0.1: +domelementtype@^2.0.1, domelementtype@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.1.0.tgz#a851c080a6d1c3d94344aed151d99f669edf585e" integrity sha512-LsTgx/L5VpD+Q8lmsXSHW2WpA+eBlZ9HPf3erD1IoPF00/3JKHZ3BknUVA2QGDNu69ZNmyFmCWBSO45XjYKC5w== @@ -5423,13 +5430,20 @@ domhandler@^2.3.0: dependencies: domelementtype "1" -domhandler@^3.0.0, domhandler@^3.3.0: +domhandler@^3.0.0: version "3.3.0" resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-3.3.0.tgz#6db7ea46e4617eb15cf875df68b2b8524ce0037a" integrity sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA== dependencies: domelementtype "^2.0.1" +domhandler@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.0.0.tgz#01ea7821de996d85f69029e81fa873c21833098e" + integrity sha512-KPTbnGQ1JeEMQyO1iYXoagsI6so/C96HZiFyByU3T6iAzpXn8EGEvct6unm1ZGoed8ByO2oirxgwxBmqKF9haA== + dependencies: + domelementtype "^2.1.0" + domutils@1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz#dcd8488a26f563d61079e48c9f7b7e32373682cf" @@ -5456,13 +5470,13 @@ domutils@^1.5.1: domelementtype "1" domutils@^2.0.0: - version "2.4.2" - resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.2.tgz#7ee5be261944e1ad487d9aa0616720010123922b" - integrity sha512-NKbgaM8ZJOecTZsIzW5gSuplsX2IWW2mIK7xVr8hTQF2v1CJWTmLZ1HOCh5sH+IzVPAGE5IucooOkvwBRAdowA== + version "2.4.3" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.4.3.tgz#b8ca888695db9baf65b58462c0eff46d2d5cd85d" + integrity sha512-MDMfEjgtzHvRX7i21XQfkk/vfZbLOe0VJk8dDETkTTo3BTeH3NXz3Xvs94UQ+GzTw/GjRYKsfVKIIOheYX63fw== dependencies: dom-serializer "^1.0.1" domelementtype "^2.0.1" - domhandler "^3.3.0" + domhandler "^4.0.0" dot-case@^3.0.4: version "3.0.4" @@ -5547,9 +5561,9 @@ ejs@^3.1.2: jake "^10.6.1" electron-to-chromium@^1.3.378, electron-to-chromium@^1.3.585, electron-to-chromium@^1.3.612: - version "1.3.613" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.613.tgz#5ad7ec1e19d28c81edb6d61b9d4990d1c9716182" - integrity sha512-c3gkahddiUalk7HLhTC7PsKzPZmovYFtgh+g3rZJ+dGokk4n4dzEoOBnoV8VU8ptvnGJMhrjM/lyXKSltqf2hQ== + version "1.3.614" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.614.tgz#ff359e8d2249e2ce859a4c2bc34c22bd2e2eb0a2" + integrity sha512-JMDl46mg4G+n6q/hAJkwy9eMTj5FJjsE+8f/irAGRMLM4yeRVbMuRrdZrbbGGOrGVcZc4vJPjUpEUWNb/fA6hg== element-resize-detector@^1.2.1: version "1.2.1" @@ -7818,9 +7832,9 @@ is-number@^7.0.0: integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== is-object@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" - integrity sha1-iVJojF7C/9awPsyF52ngKQMINHA= + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== is-plain-obj@2.1.0, is-plain-obj@^2.0.0: version "2.1.0"