diff --git a/.github/workflows/scaffolder.yml b/.github/workflows/scaffolder.yml
new file mode 100644
index 0000000000..055fb109d5
--- /dev/null
+++ b/.github/workflows/scaffolder.yml
@@ -0,0 +1,29 @@
+name: Scaffolder CI
+
+on:
+ push:
+ paths:
+ - 'backend/scaffolder/**'
+ - '.github/workflows/scaffolder.yml'
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Set up Go
+ uses: actions/setup-go@v1
+ with:
+ go-version: 1.12
+ - name: checkout code
+ uses: actions/checkout@v1
+ - name: setup env
+ run: |
+ echo "::set-env name=GOPATH::$(go env GOPATH)"
+ echo "::add-path::$(go env GOPATH)/bin"
+ shell: bash
+ - name: build
+ run: go build -v ./...
+ working-directory: ./backend/scaffolder
+ - name: test
+ run: go test ./... -short
+ working-directory: ./backend/scaffolder
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000..191ad9deef
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+secrets.env
+.DS_Store
diff --git a/backend/.gitignore b/backend/.gitignore
deleted file mode 100644
index ba2906d066..0000000000
--- a/backend/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-main
diff --git a/backend/Dockerfile b/backend/Dockerfile
index a5aae4c2a8..f335af2324 100644
--- a/backend/Dockerfile
+++ b/backend/Dockerfile
@@ -16,6 +16,8 @@ RUN go build .
FROM debian:buster
ARG service
+RUN apt-get update && apt-get install -y ca-certificates
+
WORKDIR /app/
COPY --from=build /build/$service/$service /app/service
diff --git a/backend/builds/ghactions/client.go b/backend/builds/ghactions/client.go
new file mode 100644
index 0000000000..647197571c
--- /dev/null
+++ b/backend/builds/ghactions/client.go
@@ -0,0 +1,85 @@
+package ghactions
+
+import (
+ "context"
+ "encoding/json"
+ "fmt"
+ "net/http"
+ "os"
+)
+
+type Client struct {
+ client *http.Client
+ baseURL string
+ accessToken string
+}
+
+func NewFromEnv() (*Client, error) {
+ accessToken := os.Getenv("BOSS_GH_ACCESS_TOKEN")
+
+ if accessToken == "" {
+ return nil, fmt.Errorf("BOSS_GH_ACCESS_TOKEN not set")
+ }
+
+ return New(http.DefaultClient, "https://api.github.com", accessToken), nil
+}
+
+func New(client *http.Client, baseURL, accessToken string) *Client {
+ return &Client{
+ client: client,
+ baseURL: baseURL,
+ accessToken: accessToken,
+ }
+}
+
+func (c *Client) createRequest(ctx context.Context, owner, repo, path string) (*http.Request, error) {
+ url := fmt.Sprintf("%s/repos/%s/%s/actions%s", c.baseURL, owner, repo, path)
+ req, err := http.NewRequest(http.MethodGet, url, nil)
+ if err != nil {
+ return nil, err
+ }
+
+ req.Header.Add("Authorization", "Bearer "+c.accessToken)
+
+ return req.WithContext(ctx), nil
+}
+
+func (c *Client) ListWorkflowRuns(ctx context.Context, owner, repo string) (*WorkflowRunsListResponse, error) {
+ req, err := c.createRequest(ctx, owner, repo, "/runs")
+ if err != nil {
+ return nil, err
+ }
+
+ res, err := c.client.Do(req)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+
+ var resData WorkflowRunsListResponse
+ if err := json.NewDecoder(res.Body).Decode(&resData); err != nil {
+ return nil, err
+ }
+
+ return &resData, nil
+}
+
+func (c *Client) GetWorkflowRun(ctx context.Context, owner, repo, runId string) (*WorkflowRunResponse, error) {
+ req, err := c.createRequest(ctx, owner, repo, fmt.Sprintf("/runs/%s", runId))
+ if err != nil {
+ return nil, err
+ }
+
+ res, err := c.client.Do(req)
+ if err != nil {
+ return nil, err
+ }
+ defer res.Body.Close()
+
+ var resData WorkflowRunResponse
+ if err := json.NewDecoder(res.Body).Decode(&resData); err != nil {
+ return nil, err
+ }
+
+ return &resData, nil
+}
diff --git a/backend/builds/ghactions/model.go b/backend/builds/ghactions/model.go
new file mode 100644
index 0000000000..3b6844c2f7
--- /dev/null
+++ b/backend/builds/ghactions/model.go
@@ -0,0 +1,53 @@
+package ghactions
+
+type User struct {
+ Name string `json:"name"` // "Octo Cat"
+ Email string `json:"email"` // "octocat@github.com"
+}
+
+type Commit struct {
+ ID string `json:"id"` // "acb5820ced9479c074f688cc328bf03f341a511d"
+ TreeID string `json:"tree_id"` // "d23f6eedb1e1b9610bbc754ddb5197bfe7271223"
+ Message string `json:"message"` // "Create linter.yml"
+ Timestamp string `json:"timestamp"` // "2020-01-22T19:33:05Z"
+ Author User `json:"author"`
+ Committer User `json:"committer"`
+}
+
+type Repository struct {
+ ID int64 `json:"id"` // 217723378
+ NodeID string `json:"node_id"` // MDEwOlJlcG9zaXRvcnkyMTc3MjMzNzg="
+ Name string `json:"name"` // o-repo"
+ FullName string `json:"full_name"` // "octo-org/octo-repo"
+ HTMLURL string `json:"html_url"` // "https://github.com/octo-org/octo-repo"
+}
+
+type WorkflowRunResponse struct {
+ ID int64 `json:"id"` // 30433642
+ NodeID string `json:"node_id"` // "MDEyOldvcmtmbG93IFJ1bjI2OTI4OQ=="
+ HeadBranch string `json:"head_branch"` // "master"
+ HeadSha string `json:"head_sha"` // "acb5820ced9479c074f688cc328bf03f341a511d"
+ RunNumber int64 `json:"run_number"` // 562
+ CheckSuiteID int64 `json:"check_suite_id"` // 414944374
+ Event string `json:"event"` // "push"
+ Status string `json:"status"` // "queued"
+ Conclusion *string `json:"conclusion"` // null
+ URL string `json:"url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642"
+ HTMLURL string `json:"html_url"` // "https://github.com/octo-org/octo-repo/actions/runs/30433642"
+ CreatedAt string `json:"created_at"` // "2020-01-22T19:33:08Z"
+ UpdatedAt string `json:"updated_at"` // "2020-01-22T19:33:08Z"
+ JobsURL string `json:"jobs_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/jobs"
+ LogsURL string `json:"logs_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/logs"
+ ArtifactsURL string `json:"artifacts_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/artifacts"
+ CancelURL string `json:"cancel_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/cancel"
+ RerunURL string `json:"rerun_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/runs/30433642/rerun"
+ WorkflowURL string `json:"workflow_url"` // "https://api.github.com/repos/octo-org/octo-repo/actions/workflows/30433642"
+ HeadCommit Commit `json:"head_commit"`
+ Repository Repository `json:"repository"`
+ HeadRepository Repository `json:"head_repository"`
+}
+
+type WorkflowRunsListResponse struct {
+ TotalCount int64 `json:"total_count"`
+ Runs []WorkflowRunResponse `json:"workflow_runs"`
+}
diff --git a/backend/builds/go.mod b/backend/builds/go.mod
new file mode 100644
index 0000000000..de684f7593
--- /dev/null
+++ b/backend/builds/go.mod
@@ -0,0 +1,10 @@
+module github.com/spotify/backstage/builds
+
+go 1.12
+
+replace github.com/spotify/backstage/proto => ../proto
+
+require (
+ github.com/spotify/backstage/proto v0.0.0-00010101000000-000000000000
+ google.golang.org/grpc v1.27.1
+)
diff --git a/backend/builds/go.sum b/backend/builds/go.sum
new file mode 100644
index 0000000000..2193d76f62
--- /dev/null
+++ b/backend/builds/go.sum
@@ -0,0 +1,54 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
+github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I=
+github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
+github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+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-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
+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-20190423024810-112230192c58/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-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+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/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55 h1:gSJIx1SDwno+2ElGhA4+qG2zF97qiUzTM+rQ0klBOcE=
+google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
+google.golang.org/grpc v1.27.0 h1:rRYRFMVgRv6E0D70Skyfsr28tDXIuuPZyWGMPdMcnXg=
+google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+google.golang.org/grpc v1.27.1 h1:zvIju4sqAGvwKspUQOhwnpcqSbzi7/H6QomNNjTL4sk=
+google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
diff --git a/backend/builds/main.go b/backend/builds/main.go
new file mode 100644
index 0000000000..6dbf49de1f
--- /dev/null
+++ b/backend/builds/main.go
@@ -0,0 +1,34 @@
+package main
+
+import (
+ "log"
+ "net"
+
+ "github.com/spotify/backstage/builds/ghactions"
+ "github.com/spotify/backstage/builds/service"
+ buildsv1 "github.com/spotify/backstage/proto/builds/v1"
+
+ "google.golang.org/grpc"
+)
+
+const (
+ port = ":50051"
+)
+
+func main() {
+ lis, err := net.Listen("tcp", port)
+ if err != nil {
+ log.Fatalf("Failed to listen: %v", err)
+ }
+ grpcServer := grpc.NewServer()
+
+ ghClient, err := ghactions.NewFromEnv()
+ if err != nil {
+ log.Fatalf("Failed to create github client, %s", err)
+ }
+
+ buildsv1.RegisterBuildsServer(grpcServer, service.New(ghClient))
+
+ log.Println("Serving Builds Service")
+ grpcServer.Serve(lis)
+}
diff --git a/backend/builds/service/service.go b/backend/builds/service/service.go
new file mode 100644
index 0000000000..1b10fda980
--- /dev/null
+++ b/backend/builds/service/service.go
@@ -0,0 +1,116 @@
+package service
+
+import (
+ "context"
+ "fmt"
+ "regexp"
+
+ "github.com/spotify/backstage/builds/ghactions"
+ buildsv1 "github.com/spotify/backstage/proto/builds/v1"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+)
+
+type service struct {
+ ghClient *ghactions.Client
+}
+
+var _ buildsv1.BuildsServer = (*service)(nil)
+
+// New creates a new identity data server
+func New(ghClient *ghactions.Client) buildsv1.BuildsServer {
+ return &service{ghClient}
+}
+
+func (s *service) ListBuilds(ctx context.Context, req *buildsv1.ListBuildsRequest) (*buildsv1.ListBuildsReply, error) {
+ owner := "spotify"
+ repo := "backstage"
+
+ result, err := s.ghClient.ListWorkflowRuns(ctx, owner, repo)
+ if err != nil {
+ return nil, status.Errorf(codes.Internal, "Failed to fetch workflow runs for %s/%s, %s", owner, repo, err)
+ }
+
+ builds := make([]*buildsv1.Build, len(result.Runs))
+
+ for i, run := range result.Runs {
+ builds[i] = s.transformBuild(owner, repo, &run)
+ }
+
+ return &buildsv1.ListBuildsReply{
+ EntityUri: "",
+ Builds: builds,
+ }, nil
+}
+
+func (s *service) GetBuild(ctx context.Context, req *buildsv1.GetBuildRequest) (*buildsv1.GetBuildReply, error) {
+ uri := req.GetBuildUri()
+
+ owner, repo, runID, err := s.parseBuildURI(uri)
+ if err != nil {
+ return nil, status.Errorf(codes.InvalidArgument, "Invalid build URI '%s', %s", uri, err)
+ }
+
+ run, err := s.ghClient.GetWorkflowRun(ctx, owner, repo, runID)
+ if err != nil {
+ return nil, status.Errorf(codes.Internal, "Failed to fetch workflow run for %s/%s/%s, %s", owner, repo, runID, err)
+ }
+
+ return &buildsv1.GetBuildReply{
+ Build: s.transformBuild(owner, repo, run),
+ Details: &buildsv1.BuildDetails{
+ Author: run.HeadCommit.Author.Name,
+ LogUrl: run.LogsURL,
+ OverviewUrl: run.HTMLURL,
+ },
+ }, nil
+}
+
+func (s *service) transformBuild(owner, repo string, run *ghactions.WorkflowRunResponse) *buildsv1.Build {
+ stat := buildsv1.BuildStatus_NULL
+ switch run.Status {
+ case "queued":
+ stat = buildsv1.BuildStatus_PENDING
+ case "in_progress":
+ stat = buildsv1.BuildStatus_RUNNING
+ case "completed":
+ if run.Conclusion != nil {
+ switch *run.Conclusion {
+ case "success":
+ stat = buildsv1.BuildStatus_SUCCESS
+ case "neutral":
+ stat = buildsv1.BuildStatus_SUCCESS
+ case "failure":
+ stat = buildsv1.BuildStatus_FAILURE
+ case "cancelled":
+ stat = buildsv1.BuildStatus_FAILURE
+ case "timed_out":
+ stat = buildsv1.BuildStatus_FAILURE
+ case "action_required":
+ stat = buildsv1.BuildStatus_RUNNING
+ }
+ }
+ }
+
+ return &buildsv1.Build{
+ Uri: fmt.Sprintf("entity:build:%s/%s/%d", owner, repo, run.ID),
+ CommitId: run.HeadCommit.ID,
+ Message: run.HeadCommit.Message,
+ Status: stat,
+ }
+}
+
+var entityURIRegex = regexp.MustCompile("^entity:build:([^/:]+)/([^/:]+)/([^/:]+)$")
+
+func (s *service) parseBuildURI(uri string) (owner, repo, runID string, err error) {
+ if uri == "" {
+ return "", "", "", fmt.Errorf("uri is empty")
+ }
+
+ match := entityURIRegex.FindStringSubmatch(uri)
+ if err != nil {
+ return "", "", "", fmt.Errorf("uri does not match")
+ }
+
+ return match[1], match[2], match[3], nil
+}
diff --git a/backend/inventory/app/server.go b/backend/inventory/app/server.go
index f4ea8d71d6..1d2f94a668 100644
--- a/backend/inventory/app/server.go
+++ b/backend/inventory/app/server.go
@@ -3,6 +3,7 @@ package app
import (
"context"
"fmt"
+
"github.com/spotify/backstage/inventory/storage"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
@@ -15,27 +16,58 @@ type Server struct {
Storage *storage.Storage
}
+func (s *Server) ListEntities(ctx context.Context, req *pb.ListEntitiesRequest) (*pb.ListEntitiesReply, error) {
+ entities, err := s.Storage.ListEntities(req.UriPrefix)
+ if err != nil {
+ return nil, status.Error(codes.Internal, "could not list entities")
+ }
+
+ result := make([]*pb.Entity, len(entities))
+ for i, v := range entities {
+ result[i] = &pb.Entity{Uri: v}
+ }
+
+ return &pb.ListEntitiesReply{Entities: result}, nil
+}
+
func (s *Server) CreateEntity(ctx context.Context, req *pb.CreateEntityRequest) (*pb.CreateEntityReply, error) {
err := s.Storage.CreateEntity(req.GetEntity().GetUri())
if err != nil {
- return nil, status.Error(codes.Internal, "could not create entity")
+ return nil, status.Error(codes.Internal, "could not create entity")
}
- return &pb.CreateEntityReply{Entity: req.GetEntity()} , nil
+ return &pb.CreateEntityReply{Entity: req.GetEntity()}, nil
}
// GetEntity returns an inventory Entity with the selected facts
func (s *Server) GetEntity(ctx context.Context, req *pb.GetEntityRequest) (*pb.GetEntityReply, error) {
+ var facts []*pb.Fact
entityUri, err := s.Storage.GetEntity(req.GetEntity().GetUri())
if err != nil {
return nil, status.Error(codes.Internal, fmt.Sprintf("could not get entity %v", err))
}
- return &pb.GetEntityReply{Entity: &pb.Entity{Uri: entityUri}}, nil
+ for _, factName := range req.GetIncludeFacts() {
+ value, err := s.Storage.GetFact(entityUri, factName)
+ if err != nil {
+ return nil, status.Error(codes.Internal, fmt.Sprintf("could not get fact %v for %v", factName, entityUri))
+ }
+ facts = append(facts, &pb.Fact{Name: factName, Value: value})
+ }
+
+ return &pb.GetEntityReply{Entity: &pb.Entity{Uri: entityUri}, Facts: facts}, nil
}
func (s *Server) SetFact(ctx context.Context, req *pb.SetFactRequest) (*pb.SetFactReply, error) {
- factUri, err := s.Storage.SetFact(req.EntityUri, req.Name, req.Value)
+ err := s.Storage.SetFact(req.EntityUri, req.Name, req.Value)
if err != nil {
return nil, status.Error(codes.Internal, "could not set fact")
}
- return &pb.SetFactReply{FactUri: factUri} , nil
+ return &pb.SetFactReply{Fact: &pb.Fact{Name: req.GetName(), Value: req.GetValue()}}, nil
+}
+
+func (s *Server) GetFact(ctx context.Context, req *pb.GetFactRequest) (*pb.GetFactReply, error) {
+ val, err := s.Storage.GetFact(req.EntityUri, req.Name)
+ if err != nil {
+ return nil, status.Error(codes.Internal, "could not set fact")
+ }
+ return &pb.GetFactReply{Fact: &pb.Fact{Name: req.GetName(), Value: val}}, nil
}
diff --git a/backend/inventory/app/server_test.go b/backend/inventory/app/server_test.go
index 7829a0e22c..3bd6e95dd9 100644
--- a/backend/inventory/app/server_test.go
+++ b/backend/inventory/app/server_test.go
@@ -3,14 +3,48 @@ package app
import (
"context"
"fmt"
- "github.com/spotify/backstage/inventory/storage"
"io/ioutil"
"os"
+ "reflect"
"testing"
+ "github.com/spotify/backstage/inventory/storage"
+
pb "github.com/spotify/backstage/proto/inventory/v1"
)
+func TestServerListEntities(t *testing.T) {
+ testStorage := NewTestStorage()
+ defer testStorage.Close()
+ s := Server{Storage: testStorage.Storage}
+
+ entity := &pb.Entity{Uri: "boss://test/test"}
+
+ _, err := s.CreateEntity(context.Background(), &pb.CreateEntityRequest{Entity: entity})
+ if err != nil {
+ t.Errorf("ServerTest(TestServerListEntities) could not create: %v", err)
+ }
+
+ list, err := s.ListEntities(context.Background(), &pb.ListEntitiesRequest{UriPrefix: ""})
+ if err != nil {
+ t.Errorf("ServerTest(TestServerListEntities) could not list: %v", err)
+ }
+ if len(list.GetEntities()) != 1 {
+ t.Errorf("ServerTest(TestServerListEntities) expected %v items, got %v", 1, len(list.GetEntities()))
+ }
+ if list.GetEntities()[0].GetUri() != "boss://test/test" {
+ t.Errorf("ServerTest(TestServerListEntities) expected uri %v, got %v", "boss://test/test", list.GetEntities()[0].GetUri())
+ }
+
+ list, err = s.ListEntities(context.Background(), &pb.ListEntitiesRequest{UriPrefix: "boss://test2"})
+ if err != nil {
+ t.Errorf("ServerTest(TestServerListEntities) could not list: %v", err)
+ }
+ if len(list.GetEntities()) != 0 {
+ t.Errorf("ServerTest(TestServerListEntities) expected %v items, got %v", 0, len(list.GetEntities()))
+ }
+}
+
func TestServerCreateEntity(t *testing.T) {
testStorage := NewTestStorage()
defer testStorage.Close()
@@ -22,7 +56,7 @@ func TestServerCreateEntity(t *testing.T) {
if err != nil {
t.Errorf("ServerTest(CreateEntity) got unexpected error %v", err)
}
- if resp.GetEntity().GetUri() != entity.GetUri() {
+ if resp.GetEntity().GetUri() != entity.GetUri() {
t.Errorf("ServerTest(CreateEntity) expected %v, but got %v", entity.GetUri(), resp.GetEntity().GetUri())
}
}
@@ -49,6 +83,31 @@ func TestServerGetEntity(t *testing.T) {
}
}
+func TestServerGetEntityWithIncludedFacts(t *testing.T) {
+ testStorage := NewTestStorage()
+ defer testStorage.Close()
+ s := Server{Storage: testStorage.Storage}
+
+ entityUri := "boss://test/test"
+ setFactReq := &pb.SetFactRequest{EntityUri: entityUri, Name: "test-name", Value: "test-value"}
+ s.SetFact(context.Background(), setFactReq)
+
+ entity := &pb.Entity{Uri: entityUri}
+ req := &pb.GetEntityRequest{Entity: entity, IncludeFacts: []string{"test-name"}}
+
+ resp, err := s.GetEntity(context.Background(), req)
+ if err != nil {
+ t.Errorf("ServerTest(GetEntity) got unexpected error %v", err)
+ }
+ if resp == nil {
+ t.Errorf("ServerTest(GetEntity) returned nil")
+ }
+ expectedFacts := []*pb.Fact{{Name: "test-name", Value: "test-value"}}
+ if !reflect.DeepEqual(resp.GetFacts(), expectedFacts) {
+ t.Errorf("ServerTest(GetEntity) got %v, wanted %v", resp.GetFacts(), expectedFacts)
+ }
+}
+
func TestServerSetFactForExistingEntity(t *testing.T) {
testStorage := NewTestStorage()
defer testStorage.Close()
@@ -66,8 +125,9 @@ func TestServerSetFactForExistingEntity(t *testing.T) {
if resp == nil {
t.Errorf("ServerTest(SetFact) returned nil")
}
- if resp.GetFactUri() != entity.GetUri() + "/" + req.Name {
- t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFactUri(), entity.GetUri() + "/" + req.Name)
+ fact := &pb.Fact{Name: req.GetName(), Value: req.GetValue()}
+ if !reflect.DeepEqual(resp.GetFact(), fact) {
+ t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFact(), fact)
}
}
@@ -85,14 +145,16 @@ func TestServerSetFactForNonExistingEntity(t *testing.T) {
if resp == nil {
t.Errorf("ServerTest(SetFact) returned nil")
}
- if resp.GetFactUri() != entityUri + "/" + req.Name {
- t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFactUri(), entityUri + "/" + req.Name)
+
+ fact := &pb.Fact{Name: req.GetName(), Value: req.GetValue()}
+ if !reflect.DeepEqual(resp.GetFact(), fact) {
+ t.Errorf("ServerTest(SetFact) got %v, wanted %v", resp.GetFact(), fact)
}
}
type TestStorage struct {
Storage *storage.Storage
- Path string
+ Path string
}
// NewTestStorage returns a TestStorage using a temporary path.
@@ -114,4 +176,3 @@ func (db *TestStorage) Close() {
defer os.Remove(db.Path)
db.Storage.Close()
}
-
diff --git a/backend/inventory/go.mod b/backend/inventory/go.mod
index 7a2e505cf6..a7148725b1 100644
--- a/backend/inventory/go.mod
+++ b/backend/inventory/go.mod
@@ -8,8 +8,5 @@ require (
github.com/golang/protobuf v1.3.3
github.com/spotify/backstage/proto v0.0.0-00010101000000-000000000000
go.etcd.io/bbolt v1.3.3
- golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3 // indirect
- golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135 // indirect
google.golang.org/grpc v1.27.0
- honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc // indirect
)
diff --git a/backend/inventory/storage/storage.go b/backend/inventory/storage/storage.go
index 2f32087e47..8b88000fe6 100644
--- a/backend/inventory/storage/storage.go
+++ b/backend/inventory/storage/storage.go
@@ -3,6 +3,7 @@ package storage
import (
"fmt"
"os"
+ "strings"
"go.etcd.io/bbolt"
)
@@ -37,8 +38,8 @@ func (s *Storage) Close() error {
return s.db.Close()
}
-func (s *Storage) SetFact(entityUri, name, value string) (factUri string, err error) {
- err = s.db.Update(func(tx *bbolt.Tx) error {
+func (s *Storage) SetFact(entityUri, name, value string) (err error) {
+ return s.db.Update(func(tx *bbolt.Tx) error {
b, err := tx.CreateBucketIfNotExists([]byte(entityUri))
if err != nil {
return err
@@ -49,11 +50,6 @@ func (s *Storage) SetFact(entityUri, name, value string) (factUri string, err er
}
return nil
})
-
- if err != nil {
- return "", err
- }
- return entityUri + "/" + name, nil
}
func (s *Storage) GetFact(entityUri, name string) (string, error) {
@@ -67,6 +63,7 @@ func (s *Storage) GetFact(entityUri, name string) (string, error) {
value = string(b.Get([]byte(name)))
return nil
})
+
if err != nil {
return "", err
}
@@ -74,6 +71,31 @@ func (s *Storage) GetFact(entityUri, name string) (string, error) {
return value, nil
}
+func (s *Storage) ListEntities(uriPrefix string) ([]string, error) {
+ entities := []string{}
+ err := s.db.View(func(tx *bbolt.Tx) error {
+ err := tx.ForEach(func(name []byte, b *bbolt.Bucket) error {
+ namestring := string(name)
+ if uriPrefix == "" || strings.HasPrefix(namestring, uriPrefix) {
+ entities = append(entities, namestring)
+ }
+ return nil
+ })
+
+ if err != nil {
+ return err
+ }
+
+ return nil
+ })
+
+ if err != nil {
+ return nil, err
+ }
+
+ return entities, nil
+}
+
func (s *Storage) CreateEntity(entityUri string) error {
return s.db.Update(func(tx *bbolt.Tx) error {
_, err := tx.CreateBucketIfNotExists([]byte(entityUri))
diff --git a/backend/proto/builds/v1/builds.pb.go b/backend/proto/builds/v1/builds.pb.go
new file mode 100644
index 0000000000..2d00732d8b
--- /dev/null
+++ b/backend/proto/builds/v1/builds.pb.go
@@ -0,0 +1,509 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: builds/v1/builds.proto
+
+package buildsv1
+
+import (
+ context "context"
+ fmt "fmt"
+ proto "github.com/golang/protobuf/proto"
+ grpc "google.golang.org/grpc"
+ codes "google.golang.org/grpc/codes"
+ status "google.golang.org/grpc/status"
+ math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type BuildStatus int32
+
+const (
+ BuildStatus_NULL BuildStatus = 0
+ BuildStatus_SUCCESS BuildStatus = 1
+ BuildStatus_FAILURE BuildStatus = 2
+ BuildStatus_PENDING BuildStatus = 3
+ BuildStatus_RUNNING BuildStatus = 4
+)
+
+var BuildStatus_name = map[int32]string{
+ 0: "NULL",
+ 1: "SUCCESS",
+ 2: "FAILURE",
+ 3: "PENDING",
+ 4: "RUNNING",
+}
+
+var BuildStatus_value = map[string]int32{
+ "NULL": 0,
+ "SUCCESS": 1,
+ "FAILURE": 2,
+ "PENDING": 3,
+ "RUNNING": 4,
+}
+
+func (x BuildStatus) String() string {
+ return proto.EnumName(BuildStatus_name, int32(x))
+}
+
+func (BuildStatus) EnumDescriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{0}
+}
+
+type ListBuildsRequest struct {
+ EntityUri string `protobuf:"bytes,1,opt,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ListBuildsRequest) Reset() { *m = ListBuildsRequest{} }
+func (m *ListBuildsRequest) String() string { return proto.CompactTextString(m) }
+func (*ListBuildsRequest) ProtoMessage() {}
+func (*ListBuildsRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{0}
+}
+
+func (m *ListBuildsRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ListBuildsRequest.Unmarshal(m, b)
+}
+func (m *ListBuildsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ListBuildsRequest.Marshal(b, m, deterministic)
+}
+func (m *ListBuildsRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ListBuildsRequest.Merge(m, src)
+}
+func (m *ListBuildsRequest) XXX_Size() int {
+ return xxx_messageInfo_ListBuildsRequest.Size(m)
+}
+func (m *ListBuildsRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_ListBuildsRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListBuildsRequest proto.InternalMessageInfo
+
+func (m *ListBuildsRequest) GetEntityUri() string {
+ if m != nil {
+ return m.EntityUri
+ }
+ return ""
+}
+
+type ListBuildsReply struct {
+ EntityUri string `protobuf:"bytes,1,opt,name=entity_uri,json=entityUri,proto3" json:"entity_uri,omitempty"`
+ Builds []*Build `protobuf:"bytes,2,rep,name=builds,proto3" json:"builds,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ListBuildsReply) Reset() { *m = ListBuildsReply{} }
+func (m *ListBuildsReply) String() string { return proto.CompactTextString(m) }
+func (*ListBuildsReply) ProtoMessage() {}
+func (*ListBuildsReply) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{1}
+}
+
+func (m *ListBuildsReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ListBuildsReply.Unmarshal(m, b)
+}
+func (m *ListBuildsReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ListBuildsReply.Marshal(b, m, deterministic)
+}
+func (m *ListBuildsReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ListBuildsReply.Merge(m, src)
+}
+func (m *ListBuildsReply) XXX_Size() int {
+ return xxx_messageInfo_ListBuildsReply.Size(m)
+}
+func (m *ListBuildsReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_ListBuildsReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListBuildsReply proto.InternalMessageInfo
+
+func (m *ListBuildsReply) GetEntityUri() string {
+ if m != nil {
+ return m.EntityUri
+ }
+ return ""
+}
+
+func (m *ListBuildsReply) GetBuilds() []*Build {
+ if m != nil {
+ return m.Builds
+ }
+ return nil
+}
+
+type GetBuildRequest struct {
+ BuildUri string `protobuf:"bytes,1,opt,name=build_uri,json=buildUri,proto3" json:"build_uri,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *GetBuildRequest) Reset() { *m = GetBuildRequest{} }
+func (m *GetBuildRequest) String() string { return proto.CompactTextString(m) }
+func (*GetBuildRequest) ProtoMessage() {}
+func (*GetBuildRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{2}
+}
+
+func (m *GetBuildRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_GetBuildRequest.Unmarshal(m, b)
+}
+func (m *GetBuildRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_GetBuildRequest.Marshal(b, m, deterministic)
+}
+func (m *GetBuildRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GetBuildRequest.Merge(m, src)
+}
+func (m *GetBuildRequest) XXX_Size() int {
+ return xxx_messageInfo_GetBuildRequest.Size(m)
+}
+func (m *GetBuildRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_GetBuildRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBuildRequest proto.InternalMessageInfo
+
+func (m *GetBuildRequest) GetBuildUri() string {
+ if m != nil {
+ return m.BuildUri
+ }
+ return ""
+}
+
+type GetBuildReply struct {
+ Build *Build `protobuf:"bytes,1,opt,name=build,proto3" json:"build,omitempty"`
+ Details *BuildDetails `protobuf:"bytes,2,opt,name=details,proto3" json:"details,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *GetBuildReply) Reset() { *m = GetBuildReply{} }
+func (m *GetBuildReply) String() string { return proto.CompactTextString(m) }
+func (*GetBuildReply) ProtoMessage() {}
+func (*GetBuildReply) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{3}
+}
+
+func (m *GetBuildReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_GetBuildReply.Unmarshal(m, b)
+}
+func (m *GetBuildReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_GetBuildReply.Marshal(b, m, deterministic)
+}
+func (m *GetBuildReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GetBuildReply.Merge(m, src)
+}
+func (m *GetBuildReply) XXX_Size() int {
+ return xxx_messageInfo_GetBuildReply.Size(m)
+}
+func (m *GetBuildReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_GetBuildReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetBuildReply proto.InternalMessageInfo
+
+func (m *GetBuildReply) GetBuild() *Build {
+ if m != nil {
+ return m.Build
+ }
+ return nil
+}
+
+func (m *GetBuildReply) GetDetails() *BuildDetails {
+ if m != nil {
+ return m.Details
+ }
+ return nil
+}
+
+type Build struct {
+ Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
+ CommitId string `protobuf:"bytes,2,opt,name=commit_id,json=commitId,proto3" json:"commit_id,omitempty"`
+ Message string `protobuf:"bytes,3,opt,name=message,proto3" json:"message,omitempty"`
+ Status BuildStatus `protobuf:"varint,4,opt,name=status,proto3,enum=spotify.backstage.builds.v1.BuildStatus" json:"status,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *Build) Reset() { *m = Build{} }
+func (m *Build) String() string { return proto.CompactTextString(m) }
+func (*Build) ProtoMessage() {}
+func (*Build) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{4}
+}
+
+func (m *Build) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_Build.Unmarshal(m, b)
+}
+func (m *Build) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_Build.Marshal(b, m, deterministic)
+}
+func (m *Build) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_Build.Merge(m, src)
+}
+func (m *Build) XXX_Size() int {
+ return xxx_messageInfo_Build.Size(m)
+}
+func (m *Build) XXX_DiscardUnknown() {
+ xxx_messageInfo_Build.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Build proto.InternalMessageInfo
+
+func (m *Build) GetUri() string {
+ if m != nil {
+ return m.Uri
+ }
+ return ""
+}
+
+func (m *Build) GetCommitId() string {
+ if m != nil {
+ return m.CommitId
+ }
+ return ""
+}
+
+func (m *Build) GetMessage() string {
+ if m != nil {
+ return m.Message
+ }
+ return ""
+}
+
+func (m *Build) GetStatus() BuildStatus {
+ if m != nil {
+ return m.Status
+ }
+ return BuildStatus_NULL
+}
+
+type BuildDetails struct {
+ Author string `protobuf:"bytes,1,opt,name=author,proto3" json:"author,omitempty"`
+ OverviewUrl string `protobuf:"bytes,2,opt,name=overview_url,json=overviewUrl,proto3" json:"overview_url,omitempty"`
+ LogUrl string `protobuf:"bytes,3,opt,name=log_url,json=logUrl,proto3" json:"log_url,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *BuildDetails) Reset() { *m = BuildDetails{} }
+func (m *BuildDetails) String() string { return proto.CompactTextString(m) }
+func (*BuildDetails) ProtoMessage() {}
+func (*BuildDetails) Descriptor() ([]byte, []int) {
+ return fileDescriptor_05a627abb7f9adb4, []int{5}
+}
+
+func (m *BuildDetails) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_BuildDetails.Unmarshal(m, b)
+}
+func (m *BuildDetails) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_BuildDetails.Marshal(b, m, deterministic)
+}
+func (m *BuildDetails) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_BuildDetails.Merge(m, src)
+}
+func (m *BuildDetails) XXX_Size() int {
+ return xxx_messageInfo_BuildDetails.Size(m)
+}
+func (m *BuildDetails) XXX_DiscardUnknown() {
+ xxx_messageInfo_BuildDetails.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_BuildDetails proto.InternalMessageInfo
+
+func (m *BuildDetails) GetAuthor() string {
+ if m != nil {
+ return m.Author
+ }
+ return ""
+}
+
+func (m *BuildDetails) GetOverviewUrl() string {
+ if m != nil {
+ return m.OverviewUrl
+ }
+ return ""
+}
+
+func (m *BuildDetails) GetLogUrl() string {
+ if m != nil {
+ return m.LogUrl
+ }
+ return ""
+}
+
+func init() {
+ proto.RegisterEnum("spotify.backstage.builds.v1.BuildStatus", BuildStatus_name, BuildStatus_value)
+ proto.RegisterType((*ListBuildsRequest)(nil), "spotify.backstage.builds.v1.ListBuildsRequest")
+ proto.RegisterType((*ListBuildsReply)(nil), "spotify.backstage.builds.v1.ListBuildsReply")
+ proto.RegisterType((*GetBuildRequest)(nil), "spotify.backstage.builds.v1.GetBuildRequest")
+ proto.RegisterType((*GetBuildReply)(nil), "spotify.backstage.builds.v1.GetBuildReply")
+ proto.RegisterType((*Build)(nil), "spotify.backstage.builds.v1.Build")
+ proto.RegisterType((*BuildDetails)(nil), "spotify.backstage.builds.v1.BuildDetails")
+}
+
+func init() { proto.RegisterFile("builds/v1/builds.proto", fileDescriptor_05a627abb7f9adb4) }
+
+var fileDescriptor_05a627abb7f9adb4 = []byte{
+ // 447 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x53, 0x41, 0x6f, 0xd3, 0x30,
+ 0x18, 0x25, 0x6b, 0x97, 0xb6, 0x5f, 0x07, 0x0b, 0x3e, 0x8c, 0x68, 0x13, 0x52, 0xc9, 0xa9, 0x4c,
+ 0x28, 0x53, 0xcb, 0x05, 0x71, 0x82, 0x75, 0x65, 0xaa, 0xa8, 0x22, 0xe4, 0x2a, 0x17, 0x2e, 0x55,
+ 0xda, 0x98, 0x62, 0x70, 0x71, 0xb0, 0x9d, 0xa0, 0xfc, 0x09, 0x0e, 0xfc, 0x3c, 0x7e, 0x0d, 0xb2,
+ 0x9d, 0xa8, 0x11, 0x93, 0xda, 0xde, 0xfc, 0xbe, 0xf7, 0xbd, 0xbc, 0xf7, 0x49, 0x2f, 0x70, 0xb1,
+ 0xca, 0x29, 0x4b, 0xe5, 0x4d, 0x31, 0xba, 0xb1, 0xaf, 0x30, 0x13, 0x5c, 0x71, 0x74, 0x25, 0x33,
+ 0xae, 0xe8, 0x97, 0x32, 0x5c, 0x25, 0xeb, 0xef, 0x52, 0x25, 0x1b, 0x12, 0x56, 0x7c, 0x31, 0x0a,
+ 0xc6, 0xf0, 0x74, 0x4e, 0xa5, 0xba, 0x35, 0x03, 0x4c, 0x7e, 0xe6, 0x44, 0x2a, 0xf4, 0x1c, 0x80,
+ 0xfc, 0x50, 0x54, 0x95, 0xcb, 0x5c, 0x50, 0xdf, 0x19, 0x38, 0xc3, 0x1e, 0xee, 0xd9, 0x49, 0x2c,
+ 0x68, 0xc0, 0xe0, 0xbc, 0xa9, 0xc9, 0x58, 0x79, 0x40, 0x81, 0xde, 0x82, 0x6b, 0x2d, 0xfd, 0x93,
+ 0x41, 0x6b, 0xd8, 0x1f, 0x07, 0xe1, 0x9e, 0x4c, 0xa1, 0xf9, 0x30, 0xae, 0x14, 0x41, 0x08, 0xe7,
+ 0xf7, 0xc4, 0x9a, 0xd5, 0xf9, 0xae, 0xa0, 0x67, 0xc8, 0x86, 0x59, 0xd7, 0x0c, 0x74, 0xba, 0xdf,
+ 0x0e, 0x3c, 0xde, 0x09, 0x74, 0xb8, 0x37, 0x70, 0x6a, 0x58, 0xb3, 0x7a, 0x9c, 0xb9, 0x15, 0xa0,
+ 0x09, 0x74, 0x52, 0xa2, 0x12, 0xca, 0x74, 0x70, 0xad, 0x7d, 0x79, 0x58, 0x7b, 0x67, 0x05, 0xb8,
+ 0x56, 0x06, 0x7f, 0x1c, 0x38, 0x35, 0x0c, 0xf2, 0xa0, 0xb5, 0x4b, 0xac, 0x9f, 0xfa, 0x92, 0x35,
+ 0xdf, 0x6e, 0xa9, 0x5a, 0xd2, 0xd4, 0x58, 0xf4, 0x70, 0xd7, 0x0e, 0x66, 0x29, 0xf2, 0xa1, 0xb3,
+ 0x25, 0x52, 0x26, 0x1b, 0xe2, 0xb7, 0x0c, 0x55, 0x43, 0xf4, 0x0e, 0x5c, 0xa9, 0x12, 0x95, 0x4b,
+ 0xbf, 0x3d, 0x70, 0x86, 0x4f, 0xc6, 0xc3, 0xc3, 0xb1, 0x16, 0x66, 0x1f, 0x57, 0xba, 0x60, 0x05,
+ 0x67, 0xcd, 0xb4, 0xe8, 0x02, 0xdc, 0x24, 0x57, 0x5f, 0xb9, 0xa8, 0xd2, 0x55, 0x08, 0xbd, 0x80,
+ 0x33, 0x5e, 0x10, 0x51, 0x50, 0xf2, 0x6b, 0x99, 0x0b, 0x56, 0x65, 0xec, 0xd7, 0xb3, 0x58, 0x30,
+ 0xf4, 0x0c, 0x3a, 0x8c, 0x6f, 0x0c, 0x6b, 0x63, 0xba, 0x8c, 0x6f, 0x62, 0xc1, 0xae, 0x3f, 0x42,
+ 0xbf, 0x61, 0x8d, 0xba, 0xd0, 0x8e, 0xe2, 0xf9, 0xdc, 0x7b, 0x84, 0xfa, 0xd0, 0x59, 0xc4, 0x93,
+ 0xc9, 0x74, 0xb1, 0xf0, 0x1c, 0x0d, 0x3e, 0xbc, 0x9f, 0xcd, 0x63, 0x3c, 0xf5, 0x4e, 0x34, 0xf8,
+ 0x34, 0x8d, 0xee, 0x66, 0xd1, 0xbd, 0xd7, 0xd2, 0x00, 0xc7, 0x51, 0xa4, 0x41, 0x7b, 0xfc, 0xd7,
+ 0x01, 0xd7, 0x36, 0x0e, 0x7d, 0x03, 0xd8, 0xf5, 0x0f, 0x85, 0x7b, 0x6f, 0x7f, 0x50, 0xee, 0xcb,
+ 0x57, 0x47, 0xef, 0xeb, 0xee, 0xa4, 0xd0, 0xad, 0xcb, 0x84, 0xf6, 0x2b, 0xff, 0x2b, 0xe9, 0xe5,
+ 0xf5, 0x91, 0xdb, 0x19, 0x2b, 0x6f, 0xe1, 0xb3, 0xed, 0xaf, 0x2c, 0x46, 0x2b, 0xd7, 0xfc, 0xb5,
+ 0xaf, 0xff, 0x05, 0x00, 0x00, 0xff, 0xff, 0x40, 0xf3, 0x96, 0x0b, 0xcf, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConnInterface
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion6
+
+// BuildsClient is the client API for Builds service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type BuildsClient interface {
+ ListBuilds(ctx context.Context, in *ListBuildsRequest, opts ...grpc.CallOption) (*ListBuildsReply, error)
+ GetBuild(ctx context.Context, in *GetBuildRequest, opts ...grpc.CallOption) (*GetBuildReply, error)
+}
+
+type buildsClient struct {
+ cc grpc.ClientConnInterface
+}
+
+func NewBuildsClient(cc grpc.ClientConnInterface) BuildsClient {
+ return &buildsClient{cc}
+}
+
+func (c *buildsClient) ListBuilds(ctx context.Context, in *ListBuildsRequest, opts ...grpc.CallOption) (*ListBuildsReply, error) {
+ out := new(ListBuildsReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.builds.v1.Builds/ListBuilds", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *buildsClient) GetBuild(ctx context.Context, in *GetBuildRequest, opts ...grpc.CallOption) (*GetBuildReply, error) {
+ out := new(GetBuildReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.builds.v1.Builds/GetBuild", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+// BuildsServer is the server API for Builds service.
+type BuildsServer interface {
+ ListBuilds(context.Context, *ListBuildsRequest) (*ListBuildsReply, error)
+ GetBuild(context.Context, *GetBuildRequest) (*GetBuildReply, error)
+}
+
+// UnimplementedBuildsServer can be embedded to have forward compatible implementations.
+type UnimplementedBuildsServer struct {
+}
+
+func (*UnimplementedBuildsServer) ListBuilds(ctx context.Context, req *ListBuildsRequest) (*ListBuildsReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListBuilds not implemented")
+}
+func (*UnimplementedBuildsServer) GetBuild(ctx context.Context, req *GetBuildRequest) (*GetBuildReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetBuild not implemented")
+}
+
+func RegisterBuildsServer(s *grpc.Server, srv BuildsServer) {
+ s.RegisterService(&_Builds_serviceDesc, srv)
+}
+
+func _Builds_ListBuilds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListBuildsRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(BuildsServer).ListBuilds(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.builds.v1.Builds/ListBuilds",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(BuildsServer).ListBuilds(ctx, req.(*ListBuildsRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Builds_GetBuild_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetBuildRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(BuildsServer).GetBuild(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.builds.v1.Builds/GetBuild",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(BuildsServer).GetBuild(ctx, req.(*GetBuildRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+var _Builds_serviceDesc = grpc.ServiceDesc{
+ ServiceName: "spotify.backstage.builds.v1.Builds",
+ HandlerType: (*BuildsServer)(nil),
+ Methods: []grpc.MethodDesc{
+ {
+ MethodName: "ListBuilds",
+ Handler: _Builds_ListBuilds_Handler,
+ },
+ {
+ MethodName: "GetBuild",
+ Handler: _Builds_GetBuild_Handler,
+ },
+ },
+ Streams: []grpc.StreamDesc{},
+ Metadata: "builds/v1/builds.proto",
+}
diff --git a/backend/proto/inventory/v1/inventory.pb.go b/backend/proto/inventory/v1/inventory.pb.go
index 556ca48b82..589ed3154f 100644
--- a/backend/proto/inventory/v1/inventory.pb.go
+++ b/backend/proto/inventory/v1/inventory.pb.go
@@ -24,6 +24,84 @@ var _ = math.Inf
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+type ListEntitiesRequest struct {
+ UriPrefix string `protobuf:"bytes,1,opt,name=uriPrefix,proto3" json:"uriPrefix,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ListEntitiesRequest) Reset() { *m = ListEntitiesRequest{} }
+func (m *ListEntitiesRequest) String() string { return proto.CompactTextString(m) }
+func (*ListEntitiesRequest) ProtoMessage() {}
+func (*ListEntitiesRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_70be9028e322f9d8, []int{0}
+}
+
+func (m *ListEntitiesRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ListEntitiesRequest.Unmarshal(m, b)
+}
+func (m *ListEntitiesRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ListEntitiesRequest.Marshal(b, m, deterministic)
+}
+func (m *ListEntitiesRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ListEntitiesRequest.Merge(m, src)
+}
+func (m *ListEntitiesRequest) XXX_Size() int {
+ return xxx_messageInfo_ListEntitiesRequest.Size(m)
+}
+func (m *ListEntitiesRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_ListEntitiesRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEntitiesRequest proto.InternalMessageInfo
+
+func (m *ListEntitiesRequest) GetUriPrefix() string {
+ if m != nil {
+ return m.UriPrefix
+ }
+ return ""
+}
+
+type ListEntitiesReply struct {
+ Entities []*Entity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *ListEntitiesReply) Reset() { *m = ListEntitiesReply{} }
+func (m *ListEntitiesReply) String() string { return proto.CompactTextString(m) }
+func (*ListEntitiesReply) ProtoMessage() {}
+func (*ListEntitiesReply) Descriptor() ([]byte, []int) {
+ return fileDescriptor_70be9028e322f9d8, []int{1}
+}
+
+func (m *ListEntitiesReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ListEntitiesReply.Unmarshal(m, b)
+}
+func (m *ListEntitiesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ListEntitiesReply.Marshal(b, m, deterministic)
+}
+func (m *ListEntitiesReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ListEntitiesReply.Merge(m, src)
+}
+func (m *ListEntitiesReply) XXX_Size() int {
+ return xxx_messageInfo_ListEntitiesReply.Size(m)
+}
+func (m *ListEntitiesReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_ListEntitiesReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ListEntitiesReply proto.InternalMessageInfo
+
+func (m *ListEntitiesReply) GetEntities() []*Entity {
+ if m != nil {
+ return m.Entities
+ }
+ return nil
+}
+
type GetEntityRequest struct {
Entity *Entity `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"`
IncludeFacts []string `protobuf:"bytes,2,rep,name=include_facts,json=includeFacts,proto3" json:"include_facts,omitempty"`
@@ -36,7 +114,7 @@ func (m *GetEntityRequest) Reset() { *m = GetEntityRequest{} }
func (m *GetEntityRequest) String() string { return proto.CompactTextString(m) }
func (*GetEntityRequest) ProtoMessage() {}
func (*GetEntityRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{0}
+ return fileDescriptor_70be9028e322f9d8, []int{2}
}
func (m *GetEntityRequest) XXX_Unmarshal(b []byte) error {
@@ -83,7 +161,7 @@ func (m *GetEntityReply) Reset() { *m = GetEntityReply{} }
func (m *GetEntityReply) String() string { return proto.CompactTextString(m) }
func (*GetEntityReply) ProtoMessage() {}
func (*GetEntityReply) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{1}
+ return fileDescriptor_70be9028e322f9d8, []int{3}
}
func (m *GetEntityReply) XXX_Unmarshal(b []byte) error {
@@ -129,7 +207,7 @@ func (m *CreateEntityRequest) Reset() { *m = CreateEntityRequest{} }
func (m *CreateEntityRequest) String() string { return proto.CompactTextString(m) }
func (*CreateEntityRequest) ProtoMessage() {}
func (*CreateEntityRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{2}
+ return fileDescriptor_70be9028e322f9d8, []int{4}
}
func (m *CreateEntityRequest) XXX_Unmarshal(b []byte) error {
@@ -168,7 +246,7 @@ func (m *CreateEntityReply) Reset() { *m = CreateEntityReply{} }
func (m *CreateEntityReply) String() string { return proto.CompactTextString(m) }
func (*CreateEntityReply) ProtoMessage() {}
func (*CreateEntityReply) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{3}
+ return fileDescriptor_70be9028e322f9d8, []int{5}
}
func (m *CreateEntityReply) XXX_Unmarshal(b []byte) error {
@@ -209,7 +287,7 @@ func (m *SetFactRequest) Reset() { *m = SetFactRequest{} }
func (m *SetFactRequest) String() string { return proto.CompactTextString(m) }
func (*SetFactRequest) ProtoMessage() {}
func (*SetFactRequest) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{4}
+ return fileDescriptor_70be9028e322f9d8, []int{6}
}
func (m *SetFactRequest) XXX_Unmarshal(b []byte) error {
@@ -252,7 +330,7 @@ func (m *SetFactRequest) GetValue() string {
}
type SetFactReply struct {
- FactUri string `protobuf:"bytes,1,opt,name=factUri,proto3" json:"factUri,omitempty"`
+ Fact *Fact `protobuf:"bytes,1,opt,name=fact,proto3" json:"fact,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -262,7 +340,7 @@ func (m *SetFactReply) Reset() { *m = SetFactReply{} }
func (m *SetFactReply) String() string { return proto.CompactTextString(m) }
func (*SetFactReply) ProtoMessage() {}
func (*SetFactReply) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{5}
+ return fileDescriptor_70be9028e322f9d8, []int{7}
}
func (m *SetFactReply) XXX_Unmarshal(b []byte) error {
@@ -283,13 +361,99 @@ func (m *SetFactReply) XXX_DiscardUnknown() {
var xxx_messageInfo_SetFactReply proto.InternalMessageInfo
-func (m *SetFactReply) GetFactUri() string {
+func (m *SetFactReply) GetFact() *Fact {
if m != nil {
- return m.FactUri
+ return m.Fact
+ }
+ return nil
+}
+
+type GetFactRequest struct {
+ EntityUri string `protobuf:"bytes,1,opt,name=entityUri,proto3" json:"entityUri,omitempty"`
+ Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *GetFactRequest) Reset() { *m = GetFactRequest{} }
+func (m *GetFactRequest) String() string { return proto.CompactTextString(m) }
+func (*GetFactRequest) ProtoMessage() {}
+func (*GetFactRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_70be9028e322f9d8, []int{8}
+}
+
+func (m *GetFactRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_GetFactRequest.Unmarshal(m, b)
+}
+func (m *GetFactRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_GetFactRequest.Marshal(b, m, deterministic)
+}
+func (m *GetFactRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GetFactRequest.Merge(m, src)
+}
+func (m *GetFactRequest) XXX_Size() int {
+ return xxx_messageInfo_GetFactRequest.Size(m)
+}
+func (m *GetFactRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_GetFactRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFactRequest proto.InternalMessageInfo
+
+func (m *GetFactRequest) GetEntityUri() string {
+ if m != nil {
+ return m.EntityUri
}
return ""
}
+func (m *GetFactRequest) GetName() string {
+ if m != nil {
+ return m.Name
+ }
+ return ""
+}
+
+type GetFactReply struct {
+ Fact *Fact `protobuf:"bytes,1,opt,name=fact,proto3" json:"fact,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *GetFactReply) Reset() { *m = GetFactReply{} }
+func (m *GetFactReply) String() string { return proto.CompactTextString(m) }
+func (*GetFactReply) ProtoMessage() {}
+func (*GetFactReply) Descriptor() ([]byte, []int) {
+ return fileDescriptor_70be9028e322f9d8, []int{9}
+}
+
+func (m *GetFactReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_GetFactReply.Unmarshal(m, b)
+}
+func (m *GetFactReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_GetFactReply.Marshal(b, m, deterministic)
+}
+func (m *GetFactReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_GetFactReply.Merge(m, src)
+}
+func (m *GetFactReply) XXX_Size() int {
+ return xxx_messageInfo_GetFactReply.Size(m)
+}
+func (m *GetFactReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_GetFactReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_GetFactReply proto.InternalMessageInfo
+
+func (m *GetFactReply) GetFact() *Fact {
+ if m != nil {
+ return m.Fact
+ }
+ return nil
+}
+
type Entity struct {
Uri string `protobuf:"bytes,1,opt,name=uri,proto3" json:"uri,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -301,7 +465,7 @@ func (m *Entity) Reset() { *m = Entity{} }
func (m *Entity) String() string { return proto.CompactTextString(m) }
func (*Entity) ProtoMessage() {}
func (*Entity) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{6}
+ return fileDescriptor_70be9028e322f9d8, []int{10}
}
func (m *Entity) XXX_Unmarshal(b []byte) error {
@@ -330,9 +494,8 @@ func (m *Entity) GetUri() string {
}
type Fact struct {
- EntityUri string `protobuf:"bytes,1,opt,name=entityUri,proto3" json:"entityUri,omitempty"`
- Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
- Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"`
+ Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+ Value string `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@@ -342,7 +505,7 @@ func (m *Fact) Reset() { *m = Fact{} }
func (m *Fact) String() string { return proto.CompactTextString(m) }
func (*Fact) ProtoMessage() {}
func (*Fact) Descriptor() ([]byte, []int) {
- return fileDescriptor_70be9028e322f9d8, []int{7}
+ return fileDescriptor_70be9028e322f9d8, []int{11}
}
func (m *Fact) XXX_Unmarshal(b []byte) error {
@@ -363,13 +526,6 @@ func (m *Fact) XXX_DiscardUnknown() {
var xxx_messageInfo_Fact proto.InternalMessageInfo
-func (m *Fact) GetEntityUri() string {
- if m != nil {
- return m.EntityUri
- }
- return ""
-}
-
func (m *Fact) GetName() string {
if m != nil {
return m.Name
@@ -385,12 +541,16 @@ func (m *Fact) GetValue() string {
}
func init() {
+ proto.RegisterType((*ListEntitiesRequest)(nil), "spotify.backstage.inventory.v1.ListEntitiesRequest")
+ proto.RegisterType((*ListEntitiesReply)(nil), "spotify.backstage.inventory.v1.ListEntitiesReply")
proto.RegisterType((*GetEntityRequest)(nil), "spotify.backstage.inventory.v1.GetEntityRequest")
proto.RegisterType((*GetEntityReply)(nil), "spotify.backstage.inventory.v1.GetEntityReply")
proto.RegisterType((*CreateEntityRequest)(nil), "spotify.backstage.inventory.v1.CreateEntityRequest")
proto.RegisterType((*CreateEntityReply)(nil), "spotify.backstage.inventory.v1.CreateEntityReply")
proto.RegisterType((*SetFactRequest)(nil), "spotify.backstage.inventory.v1.SetFactRequest")
proto.RegisterType((*SetFactReply)(nil), "spotify.backstage.inventory.v1.SetFactReply")
+ proto.RegisterType((*GetFactRequest)(nil), "spotify.backstage.inventory.v1.GetFactRequest")
+ proto.RegisterType((*GetFactReply)(nil), "spotify.backstage.inventory.v1.GetFactReply")
proto.RegisterType((*Entity)(nil), "spotify.backstage.inventory.v1.Entity")
proto.RegisterType((*Fact)(nil), "spotify.backstage.inventory.v1.Fact")
}
@@ -398,29 +558,36 @@ func init() {
func init() { proto.RegisterFile("inventory/v1/inventory.proto", fileDescriptor_70be9028e322f9d8) }
var fileDescriptor_70be9028e322f9d8 = []byte{
- // 346 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x53, 0x4d, 0x4b, 0xc3, 0x40,
- 0x10, 0x25, 0xfd, 0x92, 0x4c, 0x3f, 0xa8, 0xab, 0x87, 0x50, 0x8a, 0x94, 0x55, 0xa4, 0xa7, 0xd4,
- 0xb4, 0x37, 0x0f, 0x1e, 0x14, 0x15, 0x2f, 0x1e, 0x52, 0x0a, 0xe2, 0x45, 0xb6, 0x75, 0x2a, 0xc1,
- 0x34, 0x89, 0xc9, 0x66, 0x25, 0xff, 0xc1, 0x5f, 0xeb, 0x2f, 0x90, 0xdd, 0xa4, 0x49, 0x15, 0xb1,
- 0x14, 0x73, 0xdb, 0x79, 0xb3, 0xef, 0xcd, 0xcb, 0xcb, 0x2c, 0xf4, 0x1d, 0x4f, 0xa0, 0xc7, 0xfd,
- 0x30, 0x19, 0x09, 0x6b, 0x94, 0x17, 0x66, 0x10, 0xfa, 0xdc, 0x27, 0x47, 0x51, 0xe0, 0x73, 0x67,
- 0x99, 0x98, 0x73, 0xb6, 0x78, 0x8d, 0x38, 0x7b, 0x41, 0xb3, 0xb8, 0x22, 0x2c, 0xfa, 0x0e, 0xdd,
- 0x5b, 0xe4, 0xd7, 0x1e, 0x77, 0x78, 0x62, 0xe3, 0x5b, 0x8c, 0x11, 0x27, 0x17, 0xd0, 0x40, 0x05,
- 0x18, 0xda, 0x40, 0x1b, 0x36, 0xc7, 0xa7, 0xe6, 0xdf, 0x22, 0x66, 0x46, 0xcf, 0x58, 0xe4, 0x18,
- 0xda, 0x8e, 0xb7, 0x70, 0xe3, 0x67, 0x7c, 0x5a, 0xb2, 0x05, 0x8f, 0x8c, 0xca, 0xa0, 0x3a, 0xd4,
- 0xed, 0x56, 0x06, 0xde, 0x48, 0x8c, 0x7e, 0x68, 0xd0, 0xd9, 0x98, 0x1c, 0xb8, 0xc9, 0xbf, 0xe7,
- 0x9e, 0x43, 0xbd, 0x98, 0xd7, 0x1c, 0x9f, 0x6c, 0xa3, 0x4b, 0x23, 0x76, 0x4a, 0xa1, 0x33, 0x38,
- 0xb8, 0x0a, 0x91, 0x71, 0x2c, 0x35, 0x0a, 0x3a, 0x85, 0xfd, 0xef, 0xb2, 0x25, 0x7c, 0x27, 0x7d,
- 0x80, 0xce, 0x14, 0xb9, 0x72, 0x9f, 0xd9, 0xec, 0x83, 0x9e, 0xf6, 0x66, 0xa1, 0xa3, 0x44, 0x75,
- 0xbb, 0x00, 0x08, 0x81, 0x9a, 0xc7, 0x56, 0x68, 0x54, 0x54, 0x43, 0x9d, 0xc9, 0x21, 0xd4, 0x05,
- 0x73, 0x63, 0x34, 0xaa, 0x0a, 0x4c, 0x0b, 0x3a, 0x84, 0x56, 0xae, 0x2c, 0x9d, 0x1a, 0xb0, 0x27,
- 0xe3, 0x29, 0x54, 0xd7, 0x25, 0xed, 0x41, 0x23, 0x75, 0x45, 0xba, 0x50, 0x8d, 0xf3, 0xbe, 0x3c,
- 0xd2, 0x7b, 0xa8, 0x49, 0x89, 0xb2, 0x5c, 0x8d, 0x3f, 0x35, 0xd0, 0xef, 0xd6, 0x79, 0x90, 0x15,
- 0xe8, 0xf9, 0xde, 0x90, 0xb3, 0x6d, 0xd1, 0xfd, 0x5c, 0xee, 0x9e, 0xb9, 0x03, 0x43, 0x46, 0x20,
- 0xa0, 0xb5, 0xf9, 0x07, 0xc9, 0x64, 0x1b, 0xff, 0x97, 0x35, 0xea, 0x59, 0xbb, 0x91, 0x02, 0x37,
- 0xb9, 0x6c, 0x3f, 0x36, 0xf3, 0x1b, 0xc2, 0x9a, 0x37, 0xd4, 0x73, 0x9e, 0x7c, 0x05, 0x00, 0x00,
- 0xff, 0xff, 0xae, 0xd9, 0x2b, 0x51, 0xee, 0x03, 0x00, 0x00,
+ // 457 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x55, 0x41, 0x8f, 0x93, 0x40,
+ 0x14, 0x0e, 0x85, 0xad, 0xf2, 0xca, 0x6e, 0x76, 0x67, 0x3d, 0x10, 0xb2, 0x31, 0xcd, 0x68, 0x4c,
+ 0x0f, 0x86, 0x5d, 0xda, 0x8b, 0xf1, 0xe0, 0xa1, 0x46, 0xd1, 0xc4, 0x83, 0xa1, 0x69, 0x34, 0x5e,
+ 0x0c, 0xad, 0xd3, 0x66, 0x62, 0x0b, 0x15, 0x06, 0x94, 0xff, 0xe0, 0x4f, 0xf2, 0xc7, 0x99, 0x19,
+ 0xa6, 0x03, 0xd5, 0x66, 0xa1, 0x69, 0x6f, 0x33, 0xef, 0xcd, 0xf7, 0xbe, 0xef, 0x3d, 0xde, 0x17,
+ 0xe0, 0x86, 0x46, 0x39, 0x89, 0x58, 0x9c, 0x14, 0xb7, 0xb9, 0x77, 0xab, 0x2e, 0xee, 0x26, 0x89,
+ 0x59, 0x8c, 0x1e, 0xa7, 0x9b, 0x98, 0xd1, 0x45, 0xe1, 0xce, 0xc2, 0xf9, 0xf7, 0x94, 0x85, 0x4b,
+ 0xe2, 0x56, 0x4f, 0x72, 0x0f, 0x8f, 0xe0, 0xfa, 0x03, 0x4d, 0xd9, 0x9b, 0x88, 0x51, 0x46, 0x49,
+ 0x1a, 0x90, 0x1f, 0x19, 0x49, 0x19, 0xba, 0x01, 0x33, 0x4b, 0xe8, 0xc7, 0x84, 0x2c, 0xe8, 0x2f,
+ 0x5b, 0xeb, 0x6b, 0x03, 0x33, 0xa8, 0x02, 0xf8, 0x13, 0x5c, 0xed, 0x82, 0x36, 0xab, 0x02, 0x8d,
+ 0xe1, 0x21, 0x91, 0x01, 0x5b, 0xeb, 0xeb, 0x83, 0xde, 0xf0, 0x99, 0x7b, 0x3f, 0xb9, 0x2b, 0x0a,
+ 0x14, 0x81, 0xc2, 0xe1, 0x9f, 0x70, 0xe9, 0x13, 0x26, 0xc3, 0x52, 0xca, 0x2b, 0xe8, 0x8a, 0x7c,
+ 0x21, 0x74, 0xb4, 0xaf, 0x2a, 0x51, 0xe8, 0x09, 0x9c, 0xd3, 0x68, 0xbe, 0xca, 0xbe, 0x91, 0xaf,
+ 0x8b, 0x70, 0xce, 0x52, 0xbb, 0xd3, 0xd7, 0x07, 0x66, 0x60, 0xc9, 0xe0, 0x5b, 0x1e, 0xc3, 0xbf,
+ 0x35, 0xb8, 0xa8, 0x31, 0xf3, 0x7e, 0x8e, 0xe5, 0x7d, 0x09, 0x67, 0x15, 0x5f, 0x6f, 0xf8, 0xb4,
+ 0x09, 0xce, 0x85, 0x04, 0x25, 0x04, 0x4f, 0xe1, 0xfa, 0x75, 0x42, 0x42, 0x46, 0x4e, 0x3a, 0x0a,
+ 0x3c, 0x81, 0xab, 0xdd, 0xb2, 0x27, 0xe8, 0x13, 0x7f, 0x86, 0x8b, 0x09, 0x61, 0x42, 0x7d, 0xb5,
+ 0x3c, 0x65, 0x6e, 0x9a, 0xd0, 0xed, 0xf2, 0xa8, 0x00, 0x42, 0x60, 0x44, 0xe1, 0x9a, 0xd8, 0x1d,
+ 0x91, 0x10, 0x67, 0xf4, 0x08, 0xce, 0xf2, 0x70, 0x95, 0x11, 0x5b, 0x17, 0xc1, 0xf2, 0x82, 0xdf,
+ 0x81, 0xa5, 0x2a, 0x73, 0xa5, 0x2f, 0xc0, 0xe0, 0xe3, 0x91, 0x3a, 0xdb, 0x0d, 0x54, 0x20, 0xf0,
+ 0x58, 0x7c, 0xdd, 0xa3, 0x34, 0x72, 0x35, 0xfe, 0x69, 0xd4, 0x38, 0xd0, 0x2d, 0x67, 0x88, 0x2e,
+ 0x41, 0xcf, 0x14, 0x3f, 0x3f, 0xe2, 0x3b, 0x30, 0xf8, 0x4b, 0xa5, 0x40, 0xdb, 0x37, 0xa5, 0x4e,
+ 0x6d, 0x4a, 0xc3, 0x3f, 0x06, 0x98, 0xef, 0xb7, 0x4c, 0x28, 0x07, 0xab, 0x6e, 0x4d, 0x34, 0x6a,
+ 0xd2, 0xb5, 0xc7, 0xfd, 0x8e, 0x77, 0x18, 0x88, 0x4f, 0x63, 0x0d, 0xa6, 0xf2, 0x0f, 0xba, 0x6b,
+ 0xc2, 0xff, 0x6b, 0x72, 0xc7, 0x3d, 0x00, 0xc1, 0xe9, 0x72, 0xb0, 0xea, 0x9b, 0xdc, 0xdc, 0xe6,
+ 0x1e, 0x3b, 0x35, 0xb7, 0xf9, 0xbf, 0x59, 0x96, 0xf0, 0x40, 0xae, 0x24, 0x6a, 0x94, 0xbc, 0xeb,
+ 0x0a, 0xe7, 0x79, 0xeb, 0xf7, 0x92, 0xc8, 0x6f, 0x4b, 0xe4, 0x1f, 0x48, 0x54, 0x5f, 0xe3, 0xf1,
+ 0xf9, 0x97, 0x9e, 0x4a, 0xe6, 0xde, 0xac, 0x2b, 0x7e, 0x1b, 0xa3, 0xbf, 0x01, 0x00, 0x00, 0xff,
+ 0xff, 0x0f, 0x08, 0x7c, 0x37, 0x56, 0x06, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -435,8 +602,11 @@ const _ = grpc.SupportPackageIsVersion6
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type InventoryClient interface {
+ ListEntities(ctx context.Context, in *ListEntitiesRequest, opts ...grpc.CallOption) (*ListEntitiesReply, error)
GetEntity(ctx context.Context, in *GetEntityRequest, opts ...grpc.CallOption) (*GetEntityReply, error)
CreateEntity(ctx context.Context, in *CreateEntityRequest, opts ...grpc.CallOption) (*CreateEntityReply, error)
+ SetFact(ctx context.Context, in *SetFactRequest, opts ...grpc.CallOption) (*SetFactReply, error)
+ GetFact(ctx context.Context, in *GetFactRequest, opts ...grpc.CallOption) (*GetFactReply, error)
}
type inventoryClient struct {
@@ -447,6 +617,15 @@ func NewInventoryClient(cc grpc.ClientConnInterface) InventoryClient {
return &inventoryClient{cc}
}
+func (c *inventoryClient) ListEntities(ctx context.Context, in *ListEntitiesRequest, opts ...grpc.CallOption) (*ListEntitiesReply, error) {
+ out := new(ListEntitiesReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.inventory.v1.Inventory/ListEntities", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
func (c *inventoryClient) GetEntity(ctx context.Context, in *GetEntityRequest, opts ...grpc.CallOption) (*GetEntityReply, error) {
out := new(GetEntityReply)
err := c.cc.Invoke(ctx, "/spotify.backstage.inventory.v1.Inventory/GetEntity", in, out, opts...)
@@ -465,27 +644,75 @@ func (c *inventoryClient) CreateEntity(ctx context.Context, in *CreateEntityRequ
return out, nil
}
+func (c *inventoryClient) SetFact(ctx context.Context, in *SetFactRequest, opts ...grpc.CallOption) (*SetFactReply, error) {
+ out := new(SetFactReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.inventory.v1.Inventory/SetFact", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *inventoryClient) GetFact(ctx context.Context, in *GetFactRequest, opts ...grpc.CallOption) (*GetFactReply, error) {
+ out := new(GetFactReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.inventory.v1.Inventory/GetFact", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
// InventoryServer is the server API for Inventory service.
type InventoryServer interface {
+ ListEntities(context.Context, *ListEntitiesRequest) (*ListEntitiesReply, error)
GetEntity(context.Context, *GetEntityRequest) (*GetEntityReply, error)
CreateEntity(context.Context, *CreateEntityRequest) (*CreateEntityReply, error)
+ SetFact(context.Context, *SetFactRequest) (*SetFactReply, error)
+ GetFact(context.Context, *GetFactRequest) (*GetFactReply, error)
}
// UnimplementedInventoryServer can be embedded to have forward compatible implementations.
type UnimplementedInventoryServer struct {
}
+func (*UnimplementedInventoryServer) ListEntities(ctx context.Context, req *ListEntitiesRequest) (*ListEntitiesReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListEntities not implemented")
+}
func (*UnimplementedInventoryServer) GetEntity(ctx context.Context, req *GetEntityRequest) (*GetEntityReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method GetEntity not implemented")
}
func (*UnimplementedInventoryServer) CreateEntity(ctx context.Context, req *CreateEntityRequest) (*CreateEntityReply, error) {
return nil, status.Errorf(codes.Unimplemented, "method CreateEntity not implemented")
}
+func (*UnimplementedInventoryServer) SetFact(ctx context.Context, req *SetFactRequest) (*SetFactReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method SetFact not implemented")
+}
+func (*UnimplementedInventoryServer) GetFact(ctx context.Context, req *GetFactRequest) (*GetFactReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method GetFact not implemented")
+}
func RegisterInventoryServer(s *grpc.Server, srv InventoryServer) {
s.RegisterService(&_Inventory_serviceDesc, srv)
}
+func _Inventory_ListEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(ListEntitiesRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(InventoryServer).ListEntities(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.inventory.v1.Inventory/ListEntities",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(InventoryServer).ListEntities(ctx, req.(*ListEntitiesRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
func _Inventory_GetEntity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetEntityRequest)
if err := dec(in); err != nil {
@@ -522,10 +749,50 @@ func _Inventory_CreateEntity_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler)
}
+func _Inventory_SetFact_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(SetFactRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(InventoryServer).SetFact(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.inventory.v1.Inventory/SetFact",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(InventoryServer).SetFact(ctx, req.(*SetFactRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Inventory_GetFact_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(GetFactRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(InventoryServer).GetFact(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.inventory.v1.Inventory/GetFact",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(InventoryServer).GetFact(ctx, req.(*GetFactRequest))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
var _Inventory_serviceDesc = grpc.ServiceDesc{
ServiceName: "spotify.backstage.inventory.v1.Inventory",
HandlerType: (*InventoryServer)(nil),
Methods: []grpc.MethodDesc{
+ {
+ MethodName: "ListEntities",
+ Handler: _Inventory_ListEntities_Handler,
+ },
{
MethodName: "GetEntity",
Handler: _Inventory_GetEntity_Handler,
@@ -534,6 +801,14 @@ var _Inventory_serviceDesc = grpc.ServiceDesc{
MethodName: "CreateEntity",
Handler: _Inventory_CreateEntity_Handler,
},
+ {
+ MethodName: "SetFact",
+ Handler: _Inventory_SetFact_Handler,
+ },
+ {
+ MethodName: "GetFact",
+ Handler: _Inventory_GetFact_Handler,
+ },
},
Streams: []grpc.StreamDesc{},
Metadata: "inventory/v1/inventory.proto",
diff --git a/backend/proto/scaffolder/v1/scaffolder.pb.go b/backend/proto/scaffolder/v1/scaffolder.pb.go
index b8587747c4..9e52b9b59f 100644
--- a/backend/proto/scaffolder/v1/scaffolder.pb.go
+++ b/backend/proto/scaffolder/v1/scaffolder.pb.go
@@ -7,6 +7,7 @@ import (
context "context"
fmt "fmt"
proto "github.com/golang/protobuf/proto"
+ _struct "github.com/golang/protobuf/ptypes/struct"
v1 "github.com/spotify/backstage/backend/proto/identity/v1"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
@@ -56,45 +57,158 @@ func (m *Empty) XXX_DiscardUnknown() {
var xxx_messageInfo_Empty proto.InternalMessageInfo
-type GetAllTemplatesReply struct {
+type ListTemplatesReply struct {
Templates []*Template `protobuf:"bytes,1,rep,name=templates,proto3" json:"templates,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
-func (m *GetAllTemplatesReply) Reset() { *m = GetAllTemplatesReply{} }
-func (m *GetAllTemplatesReply) String() string { return proto.CompactTextString(m) }
-func (*GetAllTemplatesReply) ProtoMessage() {}
-func (*GetAllTemplatesReply) Descriptor() ([]byte, []int) {
+func (m *ListTemplatesReply) Reset() { *m = ListTemplatesReply{} }
+func (m *ListTemplatesReply) String() string { return proto.CompactTextString(m) }
+func (*ListTemplatesReply) ProtoMessage() {}
+func (*ListTemplatesReply) Descriptor() ([]byte, []int) {
return fileDescriptor_6737326b433dc57d, []int{1}
}
-func (m *GetAllTemplatesReply) XXX_Unmarshal(b []byte) error {
- return xxx_messageInfo_GetAllTemplatesReply.Unmarshal(m, b)
+func (m *ListTemplatesReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_ListTemplatesReply.Unmarshal(m, b)
}
-func (m *GetAllTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
- return xxx_messageInfo_GetAllTemplatesReply.Marshal(b, m, deterministic)
+func (m *ListTemplatesReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_ListTemplatesReply.Marshal(b, m, deterministic)
}
-func (m *GetAllTemplatesReply) XXX_Merge(src proto.Message) {
- xxx_messageInfo_GetAllTemplatesReply.Merge(m, src)
+func (m *ListTemplatesReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_ListTemplatesReply.Merge(m, src)
}
-func (m *GetAllTemplatesReply) XXX_Size() int {
- return xxx_messageInfo_GetAllTemplatesReply.Size(m)
+func (m *ListTemplatesReply) XXX_Size() int {
+ return xxx_messageInfo_ListTemplatesReply.Size(m)
}
-func (m *GetAllTemplatesReply) XXX_DiscardUnknown() {
- xxx_messageInfo_GetAllTemplatesReply.DiscardUnknown(m)
+func (m *ListTemplatesReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_ListTemplatesReply.DiscardUnknown(m)
}
-var xxx_messageInfo_GetAllTemplatesReply proto.InternalMessageInfo
+var xxx_messageInfo_ListTemplatesReply proto.InternalMessageInfo
-func (m *GetAllTemplatesReply) GetTemplates() []*Template {
+func (m *ListTemplatesReply) GetTemplates() []*Template {
if m != nil {
return m.Templates
}
return nil
}
+type CreateReply struct {
+ ComponentId string `protobuf:"bytes,1,opt,name=component_id,json=componentId,proto3" json:"component_id,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *CreateReply) Reset() { *m = CreateReply{} }
+func (m *CreateReply) String() string { return proto.CompactTextString(m) }
+func (*CreateReply) ProtoMessage() {}
+func (*CreateReply) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6737326b433dc57d, []int{2}
+}
+
+func (m *CreateReply) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_CreateReply.Unmarshal(m, b)
+}
+func (m *CreateReply) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_CreateReply.Marshal(b, m, deterministic)
+}
+func (m *CreateReply) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_CreateReply.Merge(m, src)
+}
+func (m *CreateReply) XXX_Size() int {
+ return xxx_messageInfo_CreateReply.Size(m)
+}
+func (m *CreateReply) XXX_DiscardUnknown() {
+ xxx_messageInfo_CreateReply.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateReply proto.InternalMessageInfo
+
+func (m *CreateReply) GetComponentId() string {
+ if m != nil {
+ return m.ComponentId
+ }
+ return ""
+}
+
+type CreateRequest struct {
+ TemplateId string `protobuf:"bytes,1,opt,name=template_id,json=templateId,proto3" json:"template_id,omitempty"`
+ Org string `protobuf:"bytes,2,opt,name=org,proto3" json:"org,omitempty"`
+ ComponentId string `protobuf:"bytes,3,opt,name=component_id,json=componentId,proto3" json:"component_id,omitempty"`
+ Private bool `protobuf:"varint,4,opt,name=private,proto3" json:"private,omitempty"`
+ // here's the cookiecutter.json that is used for the request.
+ // make as a struct so that we can pass through the data in a nice way
+ // withouth having to mess around with stuff and special types.
+ Metadata *_struct.Struct `protobuf:"bytes,5,opt,name=metadata,proto3" json:"metadata,omitempty"`
+ XXX_NoUnkeyedLiteral struct{} `json:"-"`
+ XXX_unrecognized []byte `json:"-"`
+ XXX_sizecache int32 `json:"-"`
+}
+
+func (m *CreateRequest) Reset() { *m = CreateRequest{} }
+func (m *CreateRequest) String() string { return proto.CompactTextString(m) }
+func (*CreateRequest) ProtoMessage() {}
+func (*CreateRequest) Descriptor() ([]byte, []int) {
+ return fileDescriptor_6737326b433dc57d, []int{3}
+}
+
+func (m *CreateRequest) XXX_Unmarshal(b []byte) error {
+ return xxx_messageInfo_CreateRequest.Unmarshal(m, b)
+}
+func (m *CreateRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+ return xxx_messageInfo_CreateRequest.Marshal(b, m, deterministic)
+}
+func (m *CreateRequest) XXX_Merge(src proto.Message) {
+ xxx_messageInfo_CreateRequest.Merge(m, src)
+}
+func (m *CreateRequest) XXX_Size() int {
+ return xxx_messageInfo_CreateRequest.Size(m)
+}
+func (m *CreateRequest) XXX_DiscardUnknown() {
+ xxx_messageInfo_CreateRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CreateRequest proto.InternalMessageInfo
+
+func (m *CreateRequest) GetTemplateId() string {
+ if m != nil {
+ return m.TemplateId
+ }
+ return ""
+}
+
+func (m *CreateRequest) GetOrg() string {
+ if m != nil {
+ return m.Org
+ }
+ return ""
+}
+
+func (m *CreateRequest) GetComponentId() string {
+ if m != nil {
+ return m.ComponentId
+ }
+ return ""
+}
+
+func (m *CreateRequest) GetPrivate() bool {
+ if m != nil {
+ return m.Private
+ }
+ return false
+}
+
+func (m *CreateRequest) GetMetadata() *_struct.Struct {
+ if m != nil {
+ return m.Metadata
+ }
+ return nil
+}
+
type Template struct {
Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
@@ -109,7 +223,7 @@ func (m *Template) Reset() { *m = Template{} }
func (m *Template) String() string { return proto.CompactTextString(m) }
func (*Template) ProtoMessage() {}
func (*Template) Descriptor() ([]byte, []int) {
- return fileDescriptor_6737326b433dc57d, []int{2}
+ return fileDescriptor_6737326b433dc57d, []int{4}
}
func (m *Template) XXX_Unmarshal(b []byte) error {
@@ -160,31 +274,42 @@ func (m *Template) GetUser() *v1.User {
func init() {
proto.RegisterType((*Empty)(nil), "spotify.backstage.scaffolder.v1.Empty")
- proto.RegisterType((*GetAllTemplatesReply)(nil), "spotify.backstage.scaffolder.v1.GetAllTemplatesReply")
+ proto.RegisterType((*ListTemplatesReply)(nil), "spotify.backstage.scaffolder.v1.ListTemplatesReply")
+ proto.RegisterType((*CreateReply)(nil), "spotify.backstage.scaffolder.v1.CreateReply")
+ proto.RegisterType((*CreateRequest)(nil), "spotify.backstage.scaffolder.v1.CreateRequest")
proto.RegisterType((*Template)(nil), "spotify.backstage.scaffolder.v1.Template")
}
func init() { proto.RegisterFile("scaffolder/v1/scaffolder.proto", fileDescriptor_6737326b433dc57d) }
var fileDescriptor_6737326b433dc57d = []byte{
- // 270 bytes of a gzipped FileDescriptorProto
- 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x91, 0x4f, 0x4b, 0xc4, 0x30,
- 0x10, 0xc5, 0xe9, 0x6e, 0xfd, 0xb3, 0x53, 0x59, 0x21, 0x78, 0x28, 0x3d, 0x68, 0xa9, 0x20, 0xf5,
- 0x92, 0xa5, 0x15, 0xf1, 0xac, 0x20, 0x7b, 0xaf, 0x7a, 0xf1, 0x22, 0xdd, 0x76, 0x2a, 0xc1, 0xb6,
- 0x09, 0xc9, 0x58, 0xe8, 0xc5, 0xbb, 0xdf, 0x5a, 0x8c, 0x74, 0xbb, 0xc8, 0x42, 0x6f, 0x93, 0x97,
- 0xf7, 0x4b, 0xe6, 0xcd, 0xc0, 0xb9, 0x29, 0xf2, 0xaa, 0x92, 0x75, 0x89, 0x7a, 0xd5, 0x25, 0xab,
- 0xf1, 0xc4, 0x95, 0x96, 0x24, 0xd9, 0x85, 0x51, 0x92, 0x44, 0xd5, 0xf3, 0x4d, 0x5e, 0x7c, 0x18,
- 0xca, 0xdf, 0x91, 0xef, 0x78, 0xba, 0x24, 0x08, 0x44, 0x89, 0x2d, 0x09, 0xea, 0x7f, 0xf1, 0xa1,
- 0xfe, 0x83, 0xa3, 0x23, 0x38, 0x78, 0x6c, 0x14, 0xf5, 0xd1, 0x1b, 0x9c, 0xad, 0x91, 0xee, 0xeb,
- 0xfa, 0x19, 0x1b, 0x55, 0xe7, 0x84, 0x26, 0x43, 0x55, 0xf7, 0x6c, 0x0d, 0x0b, 0x1a, 0x14, 0xdf,
- 0x09, 0xe7, 0xb1, 0x97, 0x5e, 0xf3, 0x89, 0x1f, 0xf9, 0xf0, 0x46, 0x36, 0xb2, 0xd1, 0xb7, 0x03,
- 0xc7, 0x83, 0xce, 0x96, 0x30, 0x13, 0xa5, 0xef, 0x84, 0x4e, 0xbc, 0xc8, 0x66, 0xa2, 0x64, 0x0c,
- 0xdc, 0x36, 0x6f, 0xd0, 0x9f, 0x59, 0xc5, 0xd6, 0x2c, 0x04, 0xaf, 0x44, 0x53, 0x68, 0xa1, 0x48,
- 0xc8, 0xd6, 0x9f, 0xdb, 0xab, 0x5d, 0x89, 0xdd, 0x81, 0xfb, 0x69, 0x50, 0xfb, 0x6e, 0xe8, 0xc4,
- 0x5e, 0x7a, 0xb9, 0xa7, 0xad, 0x6d, 0xda, 0x2e, 0xe1, 0x2f, 0x06, 0x75, 0x66, 0x81, 0xf4, 0x0b,
- 0xe0, 0x69, 0xdb, 0x30, 0x53, 0x70, 0xfa, 0x2f, 0x3a, 0xbb, 0x9a, 0x8c, 0x68, 0xa7, 0x16, 0xdc,
- 0x4e, 0xfa, 0xf6, 0x0d, 0xf5, 0x61, 0xf9, 0x7a, 0x32, 0xba, 0xba, 0x64, 0x73, 0x68, 0x97, 0x71,
- 0xf3, 0x13, 0x00, 0x00, 0xff, 0xff, 0x5b, 0x4d, 0x79, 0x5e, 0xeb, 0x01, 0x00, 0x00,
+ // 411 bytes of a gzipped FileDescriptorProto
+ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0xd1, 0x8a, 0xd3, 0x40,
+ 0x14, 0x25, 0x6d, 0x77, 0xb7, 0x7b, 0xb3, 0xbb, 0xc8, 0xbc, 0x18, 0x82, 0xb8, 0x31, 0x82, 0x54,
+ 0x90, 0xa9, 0x6d, 0x1f, 0x7c, 0x57, 0x44, 0x16, 0x7c, 0xca, 0xea, 0x8b, 0x20, 0x32, 0x4d, 0x6e,
+ 0xca, 0x60, 0x92, 0x19, 0x67, 0x6e, 0x03, 0xf9, 0x04, 0xff, 0xc7, 0x2f, 0xf2, 0x4b, 0xa4, 0x53,
+ 0x27, 0xdd, 0x65, 0x0b, 0xd9, 0xb7, 0x7b, 0xcf, 0xbd, 0xe7, 0xce, 0xe1, 0x9c, 0x81, 0xe7, 0x36,
+ 0x17, 0x65, 0xa9, 0xaa, 0x02, 0xcd, 0xbc, 0x5d, 0xcc, 0x0f, 0x1d, 0xd7, 0x46, 0x91, 0x62, 0xd7,
+ 0x56, 0x2b, 0x92, 0x65, 0xc7, 0xd7, 0x22, 0xff, 0x69, 0x49, 0x6c, 0x90, 0xdf, 0xd9, 0x69, 0x17,
+ 0x71, 0x2c, 0x0b, 0x6c, 0x48, 0x52, 0xb7, 0xa3, 0xfb, 0x7a, 0x4f, 0x8e, 0x9f, 0x6d, 0x94, 0xda,
+ 0x54, 0x38, 0x77, 0xdd, 0x7a, 0x5b, 0xce, 0x2d, 0x99, 0x6d, 0x4e, 0xfb, 0x69, 0x7a, 0x06, 0x27,
+ 0x1f, 0x6b, 0x4d, 0x5d, 0xfa, 0x1d, 0xd8, 0x67, 0x69, 0xe9, 0x0b, 0xd6, 0xba, 0x12, 0x84, 0x36,
+ 0x43, 0x5d, 0x75, 0xec, 0x13, 0x9c, 0x93, 0x47, 0xa2, 0x20, 0x19, 0xcf, 0xc2, 0xe5, 0x6b, 0x3e,
+ 0xa0, 0x86, 0xfb, 0x1b, 0xd9, 0x81, 0x9b, 0xbe, 0x85, 0xf0, 0x83, 0xc1, 0x1d, 0xe8, 0xee, 0xbe,
+ 0x80, 0x8b, 0x5c, 0xd5, 0x5a, 0x35, 0xd8, 0xd0, 0x0f, 0x59, 0x44, 0x41, 0x12, 0xcc, 0xce, 0xb3,
+ 0xb0, 0xc7, 0x6e, 0x8a, 0xf4, 0x4f, 0x00, 0x97, 0x9e, 0xf2, 0x6b, 0x8b, 0x96, 0xd8, 0x35, 0x84,
+ 0xfe, 0xe0, 0x81, 0x03, 0x1e, 0xba, 0x29, 0xd8, 0x13, 0x18, 0x2b, 0xb3, 0x89, 0x46, 0x6e, 0xb0,
+ 0x2b, 0x1f, 0xbc, 0x33, 0x7e, 0xf0, 0x0e, 0x8b, 0xe0, 0x4c, 0x1b, 0xd9, 0x0a, 0xc2, 0x68, 0x92,
+ 0x04, 0xb3, 0x69, 0xe6, 0x5b, 0xb6, 0x82, 0x69, 0x8d, 0x24, 0x0a, 0x41, 0x22, 0x3a, 0x49, 0x82,
+ 0x59, 0xb8, 0x7c, 0xca, 0xf7, 0x66, 0x72, 0x6f, 0x26, 0xbf, 0x75, 0x66, 0x66, 0xfd, 0x62, 0xfa,
+ 0x3b, 0x80, 0xa9, 0x37, 0x80, 0x5d, 0xc1, 0xa8, 0x17, 0x3a, 0x92, 0x05, 0x63, 0x30, 0x69, 0x44,
+ 0x8d, 0xff, 0x15, 0xba, 0x9a, 0x25, 0x10, 0x16, 0x68, 0x73, 0x23, 0x35, 0x49, 0xd5, 0x78, 0x85,
+ 0x77, 0x20, 0xf6, 0x0e, 0x26, 0x5b, 0x8b, 0xc6, 0xc9, 0x0b, 0x97, 0x2f, 0x8f, 0xf8, 0xdf, 0x47,
+ 0xde, 0x2e, 0xf8, 0x57, 0x8b, 0x26, 0x73, 0x84, 0xe5, 0xdf, 0x00, 0xe0, 0xb6, 0x8f, 0x86, 0x55,
+ 0x70, 0x79, 0x2f, 0x62, 0xf6, 0x6a, 0x30, 0x4a, 0xf7, 0x37, 0xe2, 0xd5, 0xe0, 0xde, 0x91, 0xaf,
+ 0x53, 0xc2, 0xe9, 0x3e, 0x3e, 0xc6, 0x07, 0xe9, 0xf7, 0x72, 0x8e, 0xdf, 0x3c, 0x7a, 0x5f, 0x57,
+ 0xdd, 0xfb, 0xab, 0x6f, 0x17, 0x87, 0x61, 0xbb, 0x58, 0x9f, 0xba, 0x6c, 0x56, 0xff, 0x02, 0x00,
+ 0x00, 0xff, 0xff, 0xfc, 0x1f, 0xfc, 0xf0, 0x55, 0x03, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.
@@ -199,7 +324,8 @@ const _ = grpc.SupportPackageIsVersion6
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type ScaffolderClient interface {
- GetAllTemplates(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAllTemplatesReply, error)
+ ListTemplates(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListTemplatesReply, error)
+ Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateReply, error)
}
type scaffolderClient struct {
@@ -210,9 +336,18 @@ func NewScaffolderClient(cc grpc.ClientConnInterface) ScaffolderClient {
return &scaffolderClient{cc}
}
-func (c *scaffolderClient) GetAllTemplates(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*GetAllTemplatesReply, error) {
- out := new(GetAllTemplatesReply)
- err := c.cc.Invoke(ctx, "/spotify.backstage.scaffolder.v1.Scaffolder/GetAllTemplates", in, out, opts...)
+func (c *scaffolderClient) ListTemplates(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*ListTemplatesReply, error) {
+ out := new(ListTemplatesReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.scaffolder.v1.Scaffolder/ListTemplates", in, out, opts...)
+ if err != nil {
+ return nil, err
+ }
+ return out, nil
+}
+
+func (c *scaffolderClient) Create(ctx context.Context, in *CreateRequest, opts ...grpc.CallOption) (*CreateReply, error) {
+ out := new(CreateReply)
+ err := c.cc.Invoke(ctx, "/spotify.backstage.scaffolder.v1.Scaffolder/Create", in, out, opts...)
if err != nil {
return nil, err
}
@@ -221,35 +356,57 @@ func (c *scaffolderClient) GetAllTemplates(ctx context.Context, in *Empty, opts
// ScaffolderServer is the server API for Scaffolder service.
type ScaffolderServer interface {
- GetAllTemplates(context.Context, *Empty) (*GetAllTemplatesReply, error)
+ ListTemplates(context.Context, *Empty) (*ListTemplatesReply, error)
+ Create(context.Context, *CreateRequest) (*CreateReply, error)
}
// UnimplementedScaffolderServer can be embedded to have forward compatible implementations.
type UnimplementedScaffolderServer struct {
}
-func (*UnimplementedScaffolderServer) GetAllTemplates(ctx context.Context, req *Empty) (*GetAllTemplatesReply, error) {
- return nil, status.Errorf(codes.Unimplemented, "method GetAllTemplates not implemented")
+func (*UnimplementedScaffolderServer) ListTemplates(ctx context.Context, req *Empty) (*ListTemplatesReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method ListTemplates not implemented")
+}
+func (*UnimplementedScaffolderServer) Create(ctx context.Context, req *CreateRequest) (*CreateReply, error) {
+ return nil, status.Errorf(codes.Unimplemented, "method Create not implemented")
}
func RegisterScaffolderServer(s *grpc.Server, srv ScaffolderServer) {
s.RegisterService(&_Scaffolder_serviceDesc, srv)
}
-func _Scaffolder_GetAllTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+func _Scaffolder_ListTemplates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(Empty)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
- return srv.(ScaffolderServer).GetAllTemplates(ctx, in)
+ return srv.(ScaffolderServer).ListTemplates(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
- FullMethod: "/spotify.backstage.scaffolder.v1.Scaffolder/GetAllTemplates",
+ FullMethod: "/spotify.backstage.scaffolder.v1.Scaffolder/ListTemplates",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
- return srv.(ScaffolderServer).GetAllTemplates(ctx, req.(*Empty))
+ return srv.(ScaffolderServer).ListTemplates(ctx, req.(*Empty))
+ }
+ return interceptor(ctx, in, info, handler)
+}
+
+func _Scaffolder_Create_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+ in := new(CreateRequest)
+ if err := dec(in); err != nil {
+ return nil, err
+ }
+ if interceptor == nil {
+ return srv.(ScaffolderServer).Create(ctx, in)
+ }
+ info := &grpc.UnaryServerInfo{
+ Server: srv,
+ FullMethod: "/spotify.backstage.scaffolder.v1.Scaffolder/Create",
+ }
+ handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+ return srv.(ScaffolderServer).Create(ctx, req.(*CreateRequest))
}
return interceptor(ctx, in, info, handler)
}
@@ -259,8 +416,12 @@ var _Scaffolder_serviceDesc = grpc.ServiceDesc{
HandlerType: (*ScaffolderServer)(nil),
Methods: []grpc.MethodDesc{
{
- MethodName: "GetAllTemplates",
- Handler: _Scaffolder_GetAllTemplates_Handler,
+ MethodName: "ListTemplates",
+ Handler: _Scaffolder_ListTemplates_Handler,
+ },
+ {
+ MethodName: "Create",
+ Handler: _Scaffolder_Create_Handler,
},
},
Streams: []grpc.StreamDesc{},
diff --git a/backend/proxy/Dockerfile b/backend/proxy/Dockerfile
index 9a38a06255..cb7522cad2 100644
--- a/backend/proxy/Dockerfile
+++ b/backend/proxy/Dockerfile
@@ -1,4 +1,4 @@
-FROM envoyproxy/envoy:latest
+FROM envoyproxy/envoy:v1.13.0
COPY ./envoy.yaml /etc/envoy/envoy.yaml
diff --git a/backend/proxy/envoy.yaml b/backend/proxy/envoy.yaml
index f0a5568331..eca02ae0c8 100644
--- a/backend/proxy/envoy.yaml
+++ b/backend/proxy/envoy.yaml
@@ -28,6 +28,10 @@ static_resources:
route:
cluster: identity_service
max_grpc_timeout: 0s
+ - match: { prefix: '/spotify.backstage.builds.v1.Builds/' }
+ route:
+ cluster: builds_service
+ max_grpc_timeout: 0s
- match: { prefix: '/inventory' }
route:
cluster: inventory_service
@@ -58,6 +62,15 @@ static_resources:
- socket_address:
address: identity
port_value: 50051
+ - name: builds_service
+ connect_timeout: 0.25s
+ type: logical_dns
+ http2_protocol_options: {}
+ lb_policy: round_robin
+ hosts:
+ - socket_address:
+ address: builds
+ port_value: 50051
- name: inventory_service
connect_timeout: 0.25s
type: logical_dns
diff --git a/backend/scaffolder/app/server.go b/backend/scaffolder/app/server.go
index 88b6111bdf..b4bcb590ab 100644
--- a/backend/scaffolder/app/server.go
+++ b/backend/scaffolder/app/server.go
@@ -2,20 +2,56 @@ package app
import (
"context"
+ "fmt"
+ "google.golang.org/grpc/codes"
+ "google.golang.org/grpc/status"
+
identity "github.com/spotify/backstage/backend/proto/identity/v1"
- pb "github.com/spotify/backstage/proto/scaffolder/v1"
+ pb "github.com/spotify/backstage/backend/proto/scaffolder/v1"
+ "github.com/spotify/backstage/scaffolder/fs"
+ "github.com/spotify/backstage/scaffolder/remote"
"github.com/spotify/backstage/scaffolder/repository"
)
// Server is the inventory Grpc server
type Server struct {
- Repository *repository.Repository
+ repository *repository.Repository
+ github *remote.Github
+ fs *fs.Filesystem
}
-// GetAllTemplates returns the local templatess
-func (s *Server) GetAllTemplates(ctx context.Context, req *pb.Empty) (*pb.GetAllTemplatesReply, error) {
+// NewServer creates a new server for with all the things
+func NewServer() *Server {
+ return &Server{
+ github: remote.NewGithubClient(),
+ }
+}
+
+// Create scaffolds the repo in github and then will create push to the repository
+func (s *Server) Create(ctx context.Context, req *pb.CreateRequest) (*pb.CreateReply, error) {
+ // first create the repository with github
+ fmt.Sprintf("Creating repository for Component %s", req.ComponentId)
+ repo := remote.Repository{
+ Name: req.ComponentId,
+ Org: req.Org,
+ Private: req.Private,
+ }
+ if _, err := s.github.CreateRepository(repo); err != nil {
+ return nil, status.Error(codes.Internal, fmt.Sprintf("Could not create repository %s/%s", req.Org, req.ComponentId))
+ }
+
+ // move the template into a temporary directory
+ tempFolder, _ := s.fs.PrepareTemplate(fs.Template{req.TemplateId})
+
+ fmt.Sprintf("Created temporary folder %s", tempFolder)
+ // use git bindings to add the remote with access token and push to the directory
+ return nil, nil
+}
+
+// ListTemplates returns the local templatess
+func (s *Server) ListTemplates(ctx context.Context, req *pb.Empty) (*pb.ListTemplatesReply, error) {
// todo (blam): yes we currently read the disk on every load. but it's fine for now 🤷♂️
- definitions, err := s.Repository.Load()
+ definitions, err := s.repository.Load()
var templates []*pb.Template
for _, definition := range definitions {
@@ -34,7 +70,7 @@ func (s *Server) GetAllTemplates(ctx context.Context, req *pb.Empty) (*pb.GetAll
templates = append(templates, template)
}
- return &pb.GetAllTemplatesReply{
+ return &pb.ListTemplatesReply{
Templates: templates,
}, err
}
diff --git a/backend/scaffolder/app/server_test.go b/backend/scaffolder/app/server_test.go
new file mode 100644
index 0000000000..4e2597edef
--- /dev/null
+++ b/backend/scaffolder/app/server_test.go
@@ -0,0 +1,8 @@
+package app
+
+import (
+ "testing"
+)
+
+func TestSample(t *testing.T) {
+}
diff --git a/backend/scaffolder/fs/fs.go b/backend/scaffolder/fs/fs.go
new file mode 100644
index 0000000000..f7766650ce
--- /dev/null
+++ b/backend/scaffolder/fs/fs.go
@@ -0,0 +1,87 @@
+package fs
+
+import (
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "path"
+)
+
+// Filesystem Repository
+type Filesystem struct{}
+
+func file(src, dst string) error {
+ var err error
+ var srcfd *os.File
+ var dstfd *os.File
+ var srcinfo os.FileInfo
+
+ if srcfd, err = os.Open(src); err != nil {
+ return err
+ }
+ defer srcfd.Close()
+
+ if dstfd, err = os.Create(dst); err != nil {
+ return err
+ }
+ defer dstfd.Close()
+
+ if _, err = io.Copy(dstfd, srcfd); err != nil {
+ return err
+ }
+ if srcinfo, err = os.Stat(src); err != nil {
+ return err
+ }
+ return os.Chmod(dst, srcinfo.Mode())
+}
+
+func dir(src string, dst string) error {
+ var err error
+ var fds []os.FileInfo
+ var srcinfo os.FileInfo
+
+ if srcinfo, err = os.Stat(src); err != nil {
+ return err
+ }
+
+ if err = os.MkdirAll(dst, srcinfo.Mode()); err != nil {
+ return err
+ }
+
+ if fds, err = ioutil.ReadDir(src); err != nil {
+ return err
+ }
+ for _, fd := range fds {
+ srcfp := path.Join(src, fd.Name())
+ dstfp := path.Join(dst, fd.Name())
+
+ if fd.IsDir() {
+ if err = dir(srcfp, dstfp); err != nil {
+ fmt.Println(err)
+ }
+ } else {
+ if err = file(srcfp, dstfp); err != nil {
+ fmt.Println(err)
+ }
+ }
+ }
+ return nil
+}
+
+// Template holds the template ID for copying
+type Template struct {
+ ID string
+}
+
+// PrepareTemplate will copy the local template to temp folder
+// and return the temp location
+func (f *Filesystem) PrepareTemplate(template Template) (string, error) {
+ tempDirectory, _ := ioutil.TempDir(os.TempDir(), template.ID)
+ fmt.Println(tempDirectory)
+ if err := dir("./templates/"+template.ID, tempDirectory); err != nil {
+ return "", err
+ }
+
+ return tempDirectory, nil
+}
diff --git a/backend/scaffolder/go.mod b/backend/scaffolder/go.mod
index 76873ce771..c8df6d39e9 100644
--- a/backend/scaffolder/go.mod
+++ b/backend/scaffolder/go.mod
@@ -2,13 +2,16 @@ module github.com/spotify/backstage/scaffolder
go 1.13
-replace github.com/spotify/backstage/proto => ../proto
-
-replace github.com/spotify/backstage/backend/proto => ../proto
+replace (
+ github.com/spotify/backstage/backend/proto => ./../proto
+ github.com/spotify/backstage/proto => ../proto
+)
require (
github.com/golang/protobuf v1.3.3
+ github.com/google/go-github/v29 v29.0.2
github.com/spotify/backstage/backend/proto v0.0.0-00010101000000-000000000000
github.com/spotify/backstage/proto v0.0.0-00010101000000-000000000000
+ golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be
google.golang.org/grpc v1.27.0
)
diff --git a/backend/scaffolder/go.sum b/backend/scaffolder/go.sum
index 00cad08092..d280642a93 100644
--- a/backend/scaffolder/go.sum
+++ b/backend/scaffolder/go.sum
@@ -14,7 +14,13 @@ github.com/golang/protobuf v1.3.3 h1:gyjaxf+svBWX08ZjK86iN9geUJF0H6gp2IRKX6Nf6/I
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/google/go-cmp v0.2.0 h1:+dTQ8DZQJz0Mb/HjFlkptS1FeQ4cWSnN941F8aEG4SQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY=
+github.com/google/go-github/v29 v29.0.2 h1:opYN6Wc7DOz7Ku3Oh4l7prmkOMwEcQxpFtxdU8N8Pts=
+github.com/google/go-github/v29 v29.0.2/go.mod h1:CHKiKKPHJ0REzfwc14QMklvtHwCveD0PxlMjLlzAM5E=
+github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk=
+github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
@@ -25,6 +31,7 @@ golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73r
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a h1:oWX7TPOiFAMXLq8o0ikBYfCJVlRHBcsciT5bXOrH628=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs=
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
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=
diff --git a/backend/scaffolder/main.go b/backend/scaffolder/main.go
index 2187247d04..8bd6f3f5c0 100644
--- a/backend/scaffolder/main.go
+++ b/backend/scaffolder/main.go
@@ -4,9 +4,8 @@ import (
"log"
"net"
- pb "github.com/spotify/backstage/proto/scaffolder/v1"
+ pb "github.com/spotify/backstage/backend/proto/scaffolder/v1"
"github.com/spotify/backstage/scaffolder/app"
-
"google.golang.org/grpc"
)
@@ -21,7 +20,9 @@ func main() {
}
grpcServer := grpc.NewServer()
- pb.RegisterScaffolderServer(grpcServer, &app.Server{})
+ serverHandler := app.NewServer()
+
+ pb.RegisterScaffolderServer(grpcServer, serverHandler)
log.Println("Serving Scaffolder Service")
grpcServer.Serve(lis)
}
diff --git a/backend/scaffolder/remote/github.go b/backend/scaffolder/remote/github.go
new file mode 100644
index 0000000000..3cc4b9e9e9
--- /dev/null
+++ b/backend/scaffolder/remote/github.go
@@ -0,0 +1,62 @@
+package remote
+
+import (
+ "context"
+ "fmt"
+ gh "github.com/google/go-github/v29/github"
+ "golang.org/x/oauth2"
+ "os"
+)
+
+// Github is the exported struct
+type Github struct {
+ client *gh.Client
+ ctx *context.Context
+}
+
+// NewGithubClient returns a new client with the correct access token enabled
+func NewGithubClient() *Github {
+ accessToken := os.Getenv("BOSS_GH_ACCESS_TOKEN")
+
+ if accessToken == "" {
+ fmt.Println("No BOSS_GH_ACCESS_TOKEN set. Cannot continue")
+ os.Exit(1)
+ }
+
+ ctx := context.Background()
+ ts := oauth2.StaticTokenSource(
+ &oauth2.Token{AccessToken: accessToken},
+ )
+ tc := oauth2.NewClient(ctx, ts)
+ client := gh.NewClient(tc)
+
+ return &Github{
+ client: client,
+ ctx: &ctx,
+ }
+}
+
+// Repository holds the information of the created repo
+type Repository struct {
+ Org string
+ Name string
+ Private bool
+}
+
+// CreateRepository will create the repository in Github ready for use by the scaffolder
+func (g *Github) CreateRepository(repo Repository) (*gh.Repository, error) {
+ ghRepo := &gh.Repository{
+ Name: &repo.Name,
+ Private: &repo.Private,
+ }
+
+ var org string
+
+ if repo.Org != "" {
+ org = repo.Org
+ }
+
+ created, _, err := g.client.Repositories.Create(*g.ctx, org, ghRepo)
+
+ return created, err
+}
diff --git a/backend/scaffolder/repository/repository.go b/backend/scaffolder/repository/repository.go
index 1896cd0ce9..25b4cfce09 100644
--- a/backend/scaffolder/repository/repository.go
+++ b/backend/scaffolder/repository/repository.go
@@ -20,9 +20,10 @@ type TemplateDefinition struct {
// Load will return all the Repository templates
func (s *Repository) Load() ([]*TemplateDefinition, error) {
- templateInfoFilePaths, err := filepath.Glob("templates/**/template-info.json")
var templateDefinitions []*TemplateDefinition
+ templateInfoFilePaths, err := filepath.Glob("templates/**/template-info.json")
+
if err != nil {
fmt.Errorf("failed to load template-info files")
return nil, err
@@ -45,5 +46,5 @@ func (s *Repository) Load() ([]*TemplateDefinition, error) {
templateDefinitions = append(templateDefinitions, &definition)
}
- return templateDefinitions, err
+ return templateDefinitions, nil
}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/cookiecutter.json b/backend/scaffolder/templates/android-kotlin-app-template/cookiecutter.json
new file mode 100644
index 0000000000..3a1db16624
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/cookiecutter.json
@@ -0,0 +1,6 @@
+{
+ "app_id": "com.example.app",
+ "app_name": "SampleApp",
+ "owner": "",
+ "description": "We promise to update this description /{{cookiecutter.owner}}"
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/custom-fields.json b/backend/scaffolder/templates/android-kotlin-app-template/custom-fields.json
new file mode 100644
index 0000000000..c976b6785e
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/custom-fields.json
@@ -0,0 +1,57 @@
+{
+ "schema": [
+ {
+ "id": "app_name",
+ "title": "App name",
+ "type": "text",
+ "description": "App name used to generate Android Studio files and class names. CamelCase e.g. 'MyAndroidApp'",
+ "validators": [
+ {
+ "type": "required"
+ },
+ {
+ "type": "regex",
+ "match": "^[A-Z][A-Za-z]+$",
+ "message": "Project name must be CamelCase"
+ }
+ ]
+ },
+ {
+ "id": "app_id",
+ "title": "App ID",
+ "type": "text",
+ "description": "App id used as package for the new app. FQDN e.g. 'com.example.app'",
+ "validators": [
+ {
+ "type": "required"
+ },
+ {
+ "type": "regex",
+ "match": "^[a-z][a-z.]+$",
+ "message": "App ID must be a fully qualified domain name"
+ }
+ ]
+ },
+ {
+ "id": "owner",
+ "title": "owner",
+ "type": "text",
+ "description": "The owner name used to identify the owner of this component",
+ "validators": [
+ {
+ "type": "required"
+ },
+ {
+ "type": "string-range",
+ "min": 4,
+ "max": 33
+ },
+ {
+ "type": "regex",
+ "match": "^[a-z][a-z0-9]+$",
+ "message": "Owner names must consist only of lowercase letters"
+ }
+ ]
+ }
+ ]
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/.gitignore b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/.gitignore
new file mode 100644
index 0000000000..603b140773
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/.gitignore
@@ -0,0 +1,14 @@
+*.iml
+.gradle
+/local.properties
+/.idea/caches
+/.idea/libraries
+/.idea/modules.xml
+/.idea/workspace.xml
+/.idea/navEditor.xml
+/.idea/assetWizardSettings.xml
+.DS_Store
+/build
+/captures
+.externalNativeBuild
+.cxx
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/.gitignore b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/.gitignore
new file mode 100644
index 0000000000..796b96d1c4
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/build.gradle b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/build.gradle
new file mode 100644
index 0000000000..3f985e756e
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/build.gradle
@@ -0,0 +1,37 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+ compileSdkVersion 29
+ buildToolsVersion "29.0.2"
+
+ defaultConfig {
+ applicationId "{{cookiecutter.app_id}}"
+ minSdkVersion 21
+ targetSdkVersion 29
+ versionCode 1
+ versionName "1.0"
+
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+ }
+
+ buildTypes {
+ release {
+ minifyEnabled false
+ proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+ }
+ }
+
+}
+
+dependencies {
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+ implementation 'androidx.appcompat:appcompat:1.1.0'
+ implementation 'androidx.core:core-ktx:1.1.0'
+ implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+ testImplementation 'junit:junit:4.12'
+ androidTestImplementation 'androidx.test.ext:junit:1.1.1'
+ androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/proguard-rules.pro b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/proguard-rules.pro
new file mode 100644
index 0000000000..f1b424510d
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/proguard-rules.pro
@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+# http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+# public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/androidTest/java/{{cookiecutter.app_id}}/ExampleInstrumentedTest.kt b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/androidTest/java/{{cookiecutter.app_id}}/ExampleInstrumentedTest.kt
new file mode 100644
index 0000000000..8007f73724
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/androidTest/java/{{cookiecutter.app_id}}/ExampleInstrumentedTest.kt
@@ -0,0 +1,24 @@
+package {{cookiecutter.app_id}}
+
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.test.ext.junit.runners.AndroidJUnit4
+
+import org.junit.Test
+import org.junit.runner.RunWith
+
+import org.junit.Assert.*
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+@RunWith(AndroidJUnit4::class)
+class ExampleInstrumentedTest {
+ @Test
+ fun useAppContext() {
+ // Context of the app under test.
+ val appContext = InstrumentationRegistry.getInstrumentation().targetContext
+ assertEquals("com.example.mytemplate", appContext.packageName)
+ }
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/AndroidManifest.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000..ed5c38fd5b
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/AndroidManifest.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/java/{{cookiecutter.app_id}}/MainActivity.kt b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/java/{{cookiecutter.app_id}}/MainActivity.kt
new file mode 100644
index 0000000000..52875c19ff
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/java/{{cookiecutter.app_id}}/MainActivity.kt
@@ -0,0 +1,12 @@
+package {{cookiecutter.app_id}}
+
+import androidx.appcompat.app.AppCompatActivity
+import android.os.Bundle
+
+class MainActivity : AppCompatActivity() {
+
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ setContentView(R.layout.activity_main)
+ }
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
new file mode 100644
index 0000000000..2b068d1146
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable-v24/ic_launcher_foreground.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable/ic_launcher_background.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable/ic_launcher_background.xml
new file mode 100644
index 0000000000..07d5da9cbf
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/drawable/ic_launcher_background.xml
@@ -0,0 +1,170 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/layout/activity_main.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000..385886aa1b
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000..eca70cfe52
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
new file mode 100644
index 0000000000..eca70cfe52
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml
@@ -0,0 +1,5 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..a571e60098
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..61da551c55
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c41dd28531
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..db5080a752
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6dba46dab1
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..da31a871c8
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..15ac681720
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..b216f2d313
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f25a419744
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
new file mode 100644
index 0000000000..e96783ccce
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/colors.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000000..030098fe0f
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/colors.xml
@@ -0,0 +1,6 @@
+
+
+ #6200EE
+ #3700B3
+ #03DAC5
+
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/strings.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000..7536cf0385
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+
+ {{cookiecutter.app_name}}
+
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/styles.xml b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000..5885930df6
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/main/res/values/styles.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/test/java/{{cookiecutter.app_id}}/ExampleUnitTest.kt b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/test/java/{{cookiecutter.app_id}}/ExampleUnitTest.kt
new file mode 100644
index 0000000000..ab799dcad8
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/app/src/test/java/{{cookiecutter.app_id}}/ExampleUnitTest.kt
@@ -0,0 +1,17 @@
+package {{cookiecutter.app_id}}
+
+import org.junit.Test
+
+import org.junit.Assert.*
+
+/**
+ * Example local unit test, which will execute on the development machine (host).
+ *
+ * See [testing documentation](http://d.android.com/tools/testing).
+ */
+class ExampleUnitTest {
+ @Test
+ fun addition_isCorrect() {
+ assertEquals(4, 2 + 2)
+ }
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/build.gradle b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/build.gradle
new file mode 100644
index 0000000000..e946d57290
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/build.gradle
@@ -0,0 +1,29 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+ ext.kotlin_version = '1.3.61'
+ repositories {
+ google()
+ jcenter()
+
+ }
+ dependencies {
+ classpath 'com.android.tools.build:gradle:3.6.0-rc01'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+ // NOTE: Do not place your application dependencies here; they belong
+ // in the individual module build.gradle files
+ }
+}
+
+allprojects {
+ repositories {
+ google()
+ jcenter()
+
+ }
+}
+
+task clean(type: Delete) {
+ delete rootProject.buildDir
+}
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle.properties b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle.properties
new file mode 100644
index 0000000000..23339e0df6
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle.properties
@@ -0,0 +1,21 @@
+# Project-wide Gradle settings.
+# IDE (e.g. Android Studio) users:
+# Gradle settings configured through the IDE *will override*
+# any settings specified in this file.
+# For more details on how to configure your build environment visit
+# http://www.gradle.org/docs/current/userguide/build_environment.html
+# Specifies the JVM arguments used for the daemon process.
+# The setting is particularly useful for tweaking memory settings.
+org.gradle.jvmargs=-Xmx1536m
+# When configured, Gradle will run in incubating parallel mode.
+# This option should only be used with decoupled projects. More details, visit
+# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
+# org.gradle.parallel=true
+# AndroidX package structure to make it clearer which packages are bundled with the
+# Android operating system, and which are packaged with your app's APK
+# https://developer.android.com/topic/libraries/support-library/androidx-rn
+android.useAndroidX=true
+# Automatically convert third-party libraries to use AndroidX
+android.enableJetifier=true
+# Kotlin code style for this project: "official" or "obsolete":
+kotlin.code.style=official
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.jar b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000..f3d88b1c2f
Binary files /dev/null and b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.properties b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000..4e1cc9db6b
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,5 @@
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew
new file mode 100755
index 0000000000..2fe81a7d95
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew
@@ -0,0 +1,183 @@
+#!/usr/bin/env sh
+
+#
+# Copyright 2015 the original author or authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+##############################################################################
+##
+## Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+ ls=`ls -ld "$PRG"`
+ link=`expr "$ls" : '.*-> \(.*\)$'`
+ if expr "$link" : '/.*' > /dev/null; then
+ PRG="$link"
+ else
+ PRG=`dirname "$PRG"`"/$link"
+ fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn () {
+ echo "$*"
+}
+
+die () {
+ echo
+ echo "$*"
+ echo
+ exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+ CYGWIN* )
+ cygwin=true
+ ;;
+ Darwin* )
+ darwin=true
+ ;;
+ MINGW* )
+ msys=true
+ ;;
+ NONSTOP* )
+ nonstop=true
+ ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+ if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+ # IBM's JDK on AIX uses strange locations for the executables
+ JAVACMD="$JAVA_HOME/jre/sh/java"
+ else
+ JAVACMD="$JAVA_HOME/bin/java"
+ fi
+ if [ ! -x "$JAVACMD" ] ; then
+ die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+ fi
+else
+ JAVACMD="java"
+ which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+ MAX_FD_LIMIT=`ulimit -H -n`
+ if [ $? -eq 0 ] ; then
+ if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+ MAX_FD="$MAX_FD_LIMIT"
+ fi
+ ulimit -n $MAX_FD
+ if [ $? -ne 0 ] ; then
+ warn "Could not set maximum file descriptor limit: $MAX_FD"
+ fi
+ else
+ warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+ fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+ GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin or MSYS, switch paths to Windows format before running java
+if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
+ APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+ CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+ JAVACMD=`cygpath --unix "$JAVACMD"`
+
+ # We build the pattern for arguments to be converted via cygpath
+ ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+ SEP=""
+ for dir in $ROOTDIRSRAW ; do
+ ROOTDIRS="$ROOTDIRS$SEP$dir"
+ SEP="|"
+ done
+ OURCYGPATTERN="(^($ROOTDIRS))"
+ # Add a user-defined pattern to the cygpath arguments
+ if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+ OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+ fi
+ # Now convert the arguments - kludge to limit ourselves to /bin/sh
+ i=0
+ for arg in "$@" ; do
+ CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+ CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
+
+ if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
+ eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+ else
+ eval `echo args$i`="\"$arg\""
+ fi
+ i=`expr $i + 1`
+ done
+ case $i in
+ 0) set -- ;;
+ 1) set -- "$args0" ;;
+ 2) set -- "$args0" "$args1" ;;
+ 3) set -- "$args0" "$args1" "$args2" ;;
+ 4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+ 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+ 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+ 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+ 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+ 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+ esac
+fi
+
+# Escape application args
+save () {
+ for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+ echo " "
+}
+APP_ARGS=`save "$@"`
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+exec "$JAVACMD" "$@"
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew.bat b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew.bat
new file mode 100644
index 0000000000..24467a141f
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/gradlew.bat
@@ -0,0 +1,100 @@
+@rem
+@rem Copyright 2015 the original author or authors.
+@rem
+@rem Licensed under the Apache License, Version 2.0 (the "License");
+@rem you may not use this file except in compliance with the License.
+@rem You may obtain a copy of the License at
+@rem
+@rem https://www.apache.org/licenses/LICENSE-2.0
+@rem
+@rem Unless required by applicable law or agreed to in writing, software
+@rem distributed under the License is distributed on an "AS IS" BASIS,
+@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+@rem See the License for the specific language governing permissions and
+@rem limitations under the License.
+@rem
+
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/settings.gradle b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/settings.gradle
new file mode 100644
index 0000000000..ff0da436dc
--- /dev/null
+++ b/backend/scaffolder/templates/android-kotlin-app-template/{{cookiecutter.app_name}}/settings.gradle
@@ -0,0 +1,2 @@
+rootProject.name='{{cookiecutter.app_name}}'
+include ':app'
diff --git a/docker-compose.yaml b/docker-compose.yaml
index ece7545eb6..76f8f4f1c7 100755
--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -21,6 +21,15 @@ services:
volumes:
- ./backend/identity/identity-data.json:/app/identity-data.json
+ builds:
+ container_name: boss-builds
+ build:
+ context: backend
+ args:
+ service: builds
+ restart: unless-stopped
+ env_file: secrets.env
+
scaffolder:
container_name: boss-scaffolder
build:
@@ -28,3 +37,4 @@ services:
args:
service: scaffolder
restart: unless-stopped
+ env_file: secrets.env
diff --git a/frontend/packages/app/src/entities/index.ts b/frontend/packages/app/src/entities/index.ts
index 8b42342e5d..38e529d87f 100644
--- a/frontend/packages/app/src/entities/index.ts
+++ b/frontend/packages/app/src/entities/index.ts
@@ -1,7 +1,7 @@
import {
createEntityKind,
createWidgetView,
- createEntityView,
+ createEntityPage,
} from '@backstage/core';
import ComputerIcon from '@material-ui/icons/Computer';
import MockEntityPage from './MockEntityPage';
@@ -13,10 +13,10 @@ const serviceOverviewPage = createWidgetView()
.addComponent(MockEntityCard)
.addComponent(MockEntityCard);
-const serviceView = createEntityView()
- .addPage('Overview', 'overview', serviceOverviewPage)
+const serviceView = createEntityPage()
+ .addPage('Overview', '/overview', serviceOverviewPage)
.register(GithubActionsPlugin)
- .addComponent('Deployment', 'deployment', MockEntityPage);
+ .addComponent('Deployment', '/deployment', MockEntityPage);
const serviceEntity = createEntityKind({
kind: 'service',
diff --git a/frontend/packages/core/src/api/api.ts b/frontend/packages/core/src/api/api.ts
index 73ca5c1da3..9bff1e2a46 100644
--- a/frontend/packages/core/src/api/api.ts
+++ b/frontend/packages/core/src/api/api.ts
@@ -1,7 +1,7 @@
import AppBuilder from './app/AppBuilder';
import EntityKind, { EntityConfig } from './entity/EntityKind';
import WidgetViewBuilder from './widgetView/WidgetViewBuilder';
-import EntityViewBuilder from './entityView/EntityViewPageBuilder';
+import EntityPageBuilder from './entityView/EntityPageBuilder';
import BackstagePlugin, { PluginConfig } from './plugin/Plugin';
export function createApp() {
@@ -16,8 +16,8 @@ export function createWidgetView() {
return new WidgetViewBuilder();
}
-export function createEntityView() {
- return new EntityViewBuilder();
+export function createEntityPage() {
+ return new EntityPageBuilder();
}
export function createPlugin(config: PluginConfig): BackstagePlugin {
diff --git a/frontend/packages/core/src/api/app/AppBuilder.tsx b/frontend/packages/core/src/api/app/AppBuilder.tsx
index 349d9a7b06..1d2f9deb4d 100644
--- a/frontend/packages/core/src/api/app/AppBuilder.tsx
+++ b/frontend/packages/core/src/api/app/AppBuilder.tsx
@@ -1,10 +1,10 @@
import React, { ComponentType, FC } from 'react';
-import { Route, Switch, useParams } from 'react-router-dom';
+import { Route, Switch, useParams, Redirect } from 'react-router-dom';
import { AppContextProvider } from './AppContext';
import { App, AppComponentBuilder } from './types';
import EntityKind, { EntityConfig } from '../entity/EntityKind';
import { EntityContextProvider } from '../entityView/EntityContext';
-import BackstagePlugin, { registerSymbol } from '../plugin/Plugin';
+import BackstagePlugin from '../plugin/Plugin';
class AppImpl implements App {
constructor(private readonly entities: Map) {}
@@ -97,8 +97,31 @@ export default class AppBuilder {
const pluginRoutes = new Array();
for (const plugin of this.plugins.values()) {
- const { routes = [] } = plugin[registerSymbol]();
- pluginRoutes.push(...routes);
+ for (const output of plugin.output()) {
+ switch (output.type) {
+ case 'route': {
+ const { path, component, options = {} } = output;
+ const { exact = true } = options;
+ pluginRoutes.push(
+ ,
+ );
+ break;
+ }
+ case 'redirect-route': {
+ const { path, target, options = {} } = output;
+ const { exact = true } = options;
+ pluginRoutes.push(
+ ,
+ );
+ break;
+ }
+ }
+ }
}
const routes = [...pluginRoutes, ...entityRoutes];
diff --git a/frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx b/frontend/packages/core/src/api/entityView/EntityPageBuilder.tsx
similarity index 52%
rename from frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx
rename to frontend/packages/core/src/api/entityView/EntityPageBuilder.tsx
index e4089e16d7..8dbf6ba2a0 100644
--- a/frontend/packages/core/src/api/entityView/EntityViewPageBuilder.tsx
+++ b/frontend/packages/core/src/api/entityView/EntityPageBuilder.tsx
@@ -5,8 +5,7 @@ import ListItem from '@material-ui/core/ListItem';
import { AppComponentBuilder, App } from '../app/types';
import { useEntity, useEntityUri, useEntityConfig } from './EntityContext';
import EntityLink from '../../components/EntityLink/EntityLink';
-import BackstagePlugin, { outputSymbol } from '../plugin/Plugin';
-import { entityViewPage } from '../plugin/outputs';
+import BackstagePlugin from '../plugin/Plugin';
const EntityLayout: FC<{}> = ({ children }) => {
const config = useEntityConfig();
@@ -34,43 +33,48 @@ const EntitySidebarItem: FC<{ title: string; path: string }> = ({
);
};
-type EntityViewPage = {
+type EntityPageNavItem = {
title: string;
+ target: string;
+};
+
+type EntityPageView = {
path: string;
component: ComponentType;
};
type Props = {
- pages: EntityViewPage[];
+ navItems: EntityPageNavItem[];
+ views: EntityPageView[];
};
-const EntityViewComponent: FC = ({ pages }) => {
+const EntityPageComponent: FC = ({ navItems, views }) => {
const { kind, id } = useEntity();
const basePath = `/entity/${kind}/${id}`;
return (
- {pages.map(({ title, path }) => (
-
+ {navItems.map(({ title, target }) => (
+
))}
- {pages.map(({ path, component }) => (
+ {views.map(({ path, component }) => (
))}
-
+
);
};
-type EntityViewRegistration =
+type EntityPageRegistration =
| {
type: 'page';
title: string;
@@ -88,14 +92,14 @@ type EntityViewRegistration =
component: ComponentType;
};
-export default class EntityViewBuilder extends AppComponentBuilder {
- private readonly registrations = new Array();
+export default class EntityPageBuilder extends AppComponentBuilder {
+ private readonly registrations = new Array();
addPage(
title: string,
path: string,
page: AppComponentBuilder,
- ): EntityViewBuilder {
+ ): EntityPageBuilder {
this.registrations.push({ type: 'page', title, path, page });
return this;
}
@@ -104,42 +108,60 @@ export default class EntityViewBuilder extends AppComponentBuilder {
title: string,
path: string,
component: ComponentType,
- ): EntityViewBuilder {
+ ): EntityPageBuilder {
this.registrations.push({ type: 'component', title, path, component });
return this;
}
- register(plugin: BackstagePlugin): EntityViewBuilder {
+ register(plugin: BackstagePlugin): EntityPageBuilder {
this.registrations.push({ type: 'plugin', plugin });
return this;
}
build(app: App): ComponentType {
- const pages = this.registrations.map(registration => {
- switch (registration.type) {
+ const navItems = new Array();
+ const views = new Array();
+
+ for (const reg of this.registrations) {
+ switch (reg.type) {
case 'page': {
- const { title, path, page } = registration;
- return { title, path, component: page.build(app) };
+ const { title, path, page } = reg;
+ navItems.push({ title, target: path });
+ views.push({ path, component: page.build(app) });
+ break;
}
case 'component': {
- const { title, path, component } = registration;
- return { title, path, component };
+ const { title, path, component } = reg;
+ navItems.push({ title, target: path });
+ views.push({ path, component });
+ break;
}
case 'plugin': {
- const { plugin } = registration;
- const output = plugin[outputSymbol](entityViewPage);
- if (!output) {
+ let added = false;
+ for (const output of reg.plugin.output()) {
+ switch (output.type) {
+ case 'entity-page-nav-item':
+ const { title, target } = output;
+ navItems.push({ title, target });
+ added = true;
+ break;
+ case 'entity-page-view-route':
+ const { path, component } = output;
+ views.push({ path, component });
+ added = true;
+ break;
+ }
+ }
+ if (!added) {
throw new Error(
- `Plugin ${plugin} was registered as entity view, but did not have any output`,
+ `Plugin ${reg.plugin} was registered as entity view, but did not provide any output`,
);
}
- return output;
+ break;
}
- default:
- throw new Error(`Unknown EntityViewBuilder registration`);
}
- });
+ }
- return () => ;
+ return () => ;
}
}
diff --git a/frontend/packages/core/src/api/plugin/Plugin.tsx b/frontend/packages/core/src/api/plugin/Plugin.tsx
index a5714fb009..e351801047 100644
--- a/frontend/packages/core/src/api/plugin/Plugin.tsx
+++ b/frontend/packages/core/src/api/plugin/Plugin.tsx
@@ -1,6 +1,5 @@
-import React from 'react';
-import { Route, Redirect } from 'react-router-dom';
-import PluginOutputHook from './PluginOutputHook';
+import { ComponentType } from 'react';
+import { PluginOutput, RoutePath, RouteOptions } from './types';
export type PluginConfig = {
id: string;
@@ -8,101 +7,98 @@ export type PluginConfig = {
};
export type PluginHooks = {
- router: Router;
- provide(ref: PluginOutputHook, value: T): void;
+ router: RouterHooks;
+ entityPage: EntityPageHooks;
};
-export type RouteOptions = {
- // Whether the route path must match exactly, defaults to true.
- exact?: boolean;
-};
-
-export type RedirectOptions = {
- // Whether the route path must match exactly, defaults to true.
- exact?: boolean;
-};
-
-export type Router = {
+export type RouterHooks = {
registerRoute(
- path: string,
- Component: React.ComponentType,
+ path: RoutePath,
+ Component: ComponentType,
options?: RouteOptions,
): void;
+
registerRedirect(
- path: string,
- target: string,
- options?: RedirectOptions,
+ path: RoutePath,
+ target: RoutePath,
+ options?: RouteOptions,
): void;
};
-export type PluginRegistrationResult = {
- routes?: JSX.Element[];
- outputs?: Map, any>;
+type EntityPageSidebarItemOptions = {
+ title: string;
+ target: RoutePath;
+};
+
+export type EntityPageHooks = {
+ navItem(options: EntityPageSidebarItemOptions): void;
+ route(
+ path: RoutePath,
+ component: ComponentType,
+ options?: RouteOptions,
+ ): void;
};
export const registerSymbol = Symbol('plugin-register');
export const outputSymbol = Symbol('plugin-output');
export default class Plugin {
- private result?: PluginRegistrationResult;
+ private storedOutput?: PluginOutput[];
constructor(private readonly config: PluginConfig) {}
- [registerSymbol](): PluginRegistrationResult {
- if (this.result) {
- return this.result;
+ output(): PluginOutput[] {
+ if (this.storedOutput) {
+ return this.storedOutput;
}
if (!this.config.register) {
- return {};
+ return [];
}
const { id } = this.config;
- const routes = new Array();
- const outputs = new Map, any>();
+ const outputs = new Array();
this.config.register({
router: {
- registerRoute(path, component, options = {}) {
+ registerRoute(path, component, options) {
if (path.startsWith('/entity/')) {
throw new Error(
`Plugin ${id} tried to register forbidden route ${path}`,
);
}
- const { exact = true } = options;
- routes.push(
- ,
- );
+ outputs.push({ type: 'route', path, component, options });
},
- registerRedirect(path, target, options = {}) {
+ registerRedirect(path, target, options) {
if (path.startsWith('/entity/')) {
throw new Error(
`Plugin ${id} tried to register forbidden redirect ${path}`,
);
}
- const { exact = true } = options;
- routes.push(
- ,
- );
+ outputs.push({ type: 'redirect-route', path, target, options });
},
},
- provide(hook, value) {
- outputs.set(hook, value);
+ entityPage: {
+ navItem({ title, target }) {
+ outputs.push({
+ type: 'entity-page-nav-item',
+ target,
+ title,
+ });
+ },
+ route(path, component, options) {
+ outputs.push({
+ type: 'entity-page-view-route',
+ path,
+ component,
+ options,
+ });
+ },
},
});
- this.result = { routes, outputs };
- return this.result;
- }
-
- [outputSymbol](outputHook: PluginOutputHook): T | undefined {
- const { outputs } = this[registerSymbol]();
- return outputs?.get(outputHook) as T;
+ this.storedOutput = outputs;
+ return this.storedOutput;
}
toString() {
diff --git a/frontend/packages/core/src/api/plugin/PluginOutputHook.ts b/frontend/packages/core/src/api/plugin/PluginOutputHook.ts
deleted file mode 100644
index 2780117d24..0000000000
--- a/frontend/packages/core/src/api/plugin/PluginOutputHook.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-export default class PluginOutputHook {
- constructor(private readonly name: string) {}
-
- get T(): T {
- throw new Error('use typeof instead');
- }
-
- toString() {
- return `pluginOutput{${this.name}}`;
- }
-}
diff --git a/frontend/packages/core/src/api/plugin/outputs.ts b/frontend/packages/core/src/api/plugin/outputs.ts
deleted file mode 100644
index 59c4555cbf..0000000000
--- a/frontend/packages/core/src/api/plugin/outputs.ts
+++ /dev/null
@@ -1,8 +0,0 @@
-import PluginOutputHook from './PluginOutputHook';
-import { ComponentType } from 'react';
-
-export const entityViewPage = new PluginOutputHook<{
- title: string;
- path: string;
- component: ComponentType;
-}>('entity-view-page');
diff --git a/frontend/packages/core/src/api/plugin/types.ts b/frontend/packages/core/src/api/plugin/types.ts
new file mode 100644
index 0000000000..ddc6364ec5
--- /dev/null
+++ b/frontend/packages/core/src/api/plugin/types.ts
@@ -0,0 +1,41 @@
+import { ComponentType } from 'react';
+
+export type RouteOptions = {
+ // Whether the route path must match exactly, defaults to true.
+ exact?: boolean;
+};
+
+export type RoutePath = string;
+
+export type RouteOutput = {
+ type: 'route';
+ path: RoutePath;
+ component: ComponentType<{}>;
+ options?: RouteOptions;
+};
+
+export type RedirectRouteOutput = {
+ type: 'redirect-route';
+ path: RoutePath;
+ target: RoutePath;
+ options?: RouteOptions;
+};
+
+export type EntityPageViewRouteOutput = {
+ type: 'entity-page-view-route';
+ path: RoutePath;
+ component: ComponentType;
+ options?: RouteOptions;
+};
+
+export type EntityPageNavItemOutput = {
+ type: 'entity-page-nav-item';
+ title: string;
+ target: RoutePath;
+};
+
+export type PluginOutput =
+ | RouteOutput
+ | RedirectRouteOutput
+ | EntityPageViewRouteOutput
+ | EntityPageNavItemOutput;
diff --git a/frontend/packages/core/src/components/EntityLink/EntityLink.tsx b/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
index a060cb1719..04b070e397 100644
--- a/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
+++ b/frontend/packages/core/src/components/EntityLink/EntityLink.tsx
@@ -16,7 +16,7 @@ type Props = {
export function buildPath(kind: string, id?: string, subPath?: string) {
if (id) {
if (subPath) {
- return `/entity/${kind}/${id}/${subPath}`;
+ return `/entity/${kind}/${id}/${subPath.replace(/^\//, '')}`;
}
return `/entity/${kind}/${id}`;
}
diff --git a/frontend/packages/plugins/github-actions/package.json b/frontend/packages/plugins/github-actions/package.json
index cfe203d986..f1ad8c30e2 100644
--- a/frontend/packages/plugins/github-actions/package.json
+++ b/frontend/packages/plugins/github-actions/package.json
@@ -5,6 +5,7 @@
"main:src": "src/index.ts",
"devDependencies": {
"@backstage/core": "0.0.0",
+ "@backstage/protobuf-definitions": "0.0.0",
"@spotify/web-scripts": "^6.0.0",
"@testing-library/jest-dom": "^4.2.4",
"@testing-library/react": "^9.3.2",
diff --git a/frontend/packages/plugins/github-actions/src/apis/builds/BuildsClient.ts b/frontend/packages/plugins/github-actions/src/apis/builds/BuildsClient.ts
new file mode 100644
index 0000000000..d435bffbad
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/apis/builds/BuildsClient.ts
@@ -0,0 +1,59 @@
+import { buildsV1 } from '@backstage/protobuf-definitions';
+import { BuildStatus, Build, BuildDetails } from './types';
+
+const statusTable = {
+ [buildsV1.BuildStatus.NULL]: BuildStatus.Null,
+ [buildsV1.BuildStatus.SUCCESS]: BuildStatus.Success,
+ [buildsV1.BuildStatus.FAILURE]: BuildStatus.Failure,
+ [buildsV1.BuildStatus.PENDING]: BuildStatus.Pending,
+ [buildsV1.BuildStatus.RUNNING]: BuildStatus.Running,
+};
+
+export default class BuildsClient {
+ static create(grpcAddress: string): BuildsClient {
+ return new BuildsClient(new buildsV1.Client(grpcAddress));
+ }
+
+ constructor(private readonly client: buildsV1.Client) {}
+
+ async listBuilds(entityUri: string): Promise {
+ const req = new buildsV1.ListBuildsRequest();
+ req.setEntityUri(entityUri);
+
+ const res = await this.client.listBuilds(req);
+
+ return res.getBuildsList().map(this.transformBuild);
+ }
+
+ async getBuild(buildUri: string): Promise {
+ const req = new buildsV1.GetBuildRequest();
+ req.setBuildUri(buildUri);
+
+ const res = await this.client.getBuild(req);
+
+ const build = res.getBuild();
+ if (!build) {
+ throw new Error('No build in GetBuild response');
+ }
+ const details = res.getDetails();
+ if (!details) {
+ throw new Error('No details in GetBuild response');
+ }
+
+ return {
+ build: this.transformBuild(build),
+ author: details.getAuthor(),
+ logUrl: details.getLogUrl(),
+ overviewUrl: details.getOverviewUrl(),
+ };
+ }
+
+ private transformBuild = (build: buildsV1.Build): Build => {
+ return {
+ commitId: build.getCommitId(),
+ message: build.getMessage(),
+ status: statusTable[build.getStatus()] || BuildStatus.Null,
+ uri: build.getUri(),
+ };
+ };
+}
diff --git a/frontend/packages/plugins/github-actions/src/apis/builds/index.ts b/frontend/packages/plugins/github-actions/src/apis/builds/index.ts
new file mode 100644
index 0000000000..8a294efdf5
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/apis/builds/index.ts
@@ -0,0 +1,2 @@
+export * from './types';
+export { default as BuildsClient } from './BuildsClient';
diff --git a/frontend/packages/plugins/github-actions/src/apis/builds/types.ts b/frontend/packages/plugins/github-actions/src/apis/builds/types.ts
new file mode 100644
index 0000000000..3f4b205047
--- /dev/null
+++ b/frontend/packages/plugins/github-actions/src/apis/builds/types.ts
@@ -0,0 +1,21 @@
+export enum BuildStatus {
+ Null,
+ Success,
+ Failure,
+ Pending,
+ Running,
+}
+
+export type Build = {
+ commitId: string;
+ message: string;
+ status: BuildStatus;
+ uri: string;
+};
+
+export type BuildDetails = {
+ build: Build;
+ author: string;
+ logUrl: string;
+ overviewUrl: string;
+};
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx
index 5cd5e21bf7..a9ba638302 100644
--- a/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx
+++ b/frontend/packages/plugins/github-actions/src/components/BuildDetailsPage/BuildDetailsPage.tsx
@@ -1,19 +1,101 @@
import React, { FC } from 'react';
-import Button from '@material-ui/core/Button';
+import { BuildsClient } from '../../apis/builds';
+import { useAsync } from 'react-use';
+import { useRouteMatch } from 'react-router-dom';
+import {
+ LinearProgress,
+ Typography,
+ TableContainer,
+ Paper,
+ Table,
+ TableBody,
+ TableRow,
+ TableCell,
+ Link,
+ makeStyles,
+ ButtonGroup,
+ Button,
+} from '@material-ui/core';
-type Props = {
- buildId: string;
-};
+const useStyles = makeStyles({
+ root: {
+ maxWidth: 720,
+ },
+});
+
+type Props = {};
+
+const client = BuildsClient.create('http://localhost:8080');
+
+const BuildDetailsPage: FC = () => {
+ const classes = useStyles();
+ const match = useRouteMatch<{ buildUri: string }>();
+ const buildUri = decodeURIComponent(match.params.buildUri);
+ const status = useAsync(() => client.getBuild(buildUri), [buildUri]);
+
+ if (status.loading) {
+ return ;
+ }
+ if (status.error) {
+ return (
+
+ Failed to load build, {status.error}
+
+ );
+ }
+
+ const details = status.value;
-const BuildDetailsPage: FC = ({ buildId }) => {
return (
-
+
+
+
+
+
+ Message
+
+ {details?.build.message}
+
+
+
+ Commit ID
+
+ {details?.build.commitId}
+
+
+
+ Status
+
+ {details?.build.status}
+
+
+
+ Author
+
+ {details?.author}
+
+
+
+ Links
+
+
+
+
+
+
+
+
+
+
+
);
};
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx b/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx
index 697d9edfa6..009d1df4ef 100644
--- a/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx
+++ b/frontend/packages/plugins/github-actions/src/components/BuildListPage/BuildListPage.tsx
@@ -7,39 +7,79 @@ import {
TableCell,
Paper,
TableBody,
+ LinearProgress,
+ Typography,
+ Tooltip,
} from '@material-ui/core';
import { RelativeEntityLink } from '@backstage/core';
+import { BuildsClient } from '../../apis/builds';
+import { useAsync } from 'react-use';
+
+const client = BuildsClient.create('http://localhost:8080');
+
+const LongText: FC<{ text: string; max: number }> = ({ text, max }) => {
+ if (text.length < max) {
+ return {text};
+ }
+ return (
+
+ {text.slice(0, max)}...
+
+ );
+};
const BuildListPage: FC<{}> = () => {
- const rows = [
- { message: 'Fixed a Bar', commit: 'fb46ca3dfbd7af5bc43da', id: 165 },
- { message: 'Fixed a Foo', commit: 'd7af5bc43dafb46ca3dfb', id: 164 },
- ];
+ const status = useAsync(() => client.listBuilds('entity:spotify:backstage'));
+
+ if (status.loading) {
+ return ;
+ }
+ if (status.error) {
+ return (
+
+ Failed to load builds, {status.error}
+
+ );
+ }
+
return (
-
-
-
-
- Message
- Commit
- Build ID
-
-
-
- {rows.map(row => (
-
- {row.message}
- {row.commit}
-
-
- {row.commit}
-
-
+ <>
+ CI/CD Builds
+
+
+
+
+ Message
+ Commit
+ Status
- ))}
-
-
-
+
+
+ {status.value!.map(build => (
+
+
+
+
+
+
+
+
+
+
+
+ {build.commitId.slice(0, 10)}
+
+
+
+ {build.status}
+
+ ))}
+
+
+
+ >
);
};
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildPage/BuildPage.tsx b/frontend/packages/plugins/github-actions/src/components/BuildPage/BuildPage.tsx
deleted file mode 100644
index 6fff20640a..0000000000
--- a/frontend/packages/plugins/github-actions/src/components/BuildPage/BuildPage.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React, { FC } from 'react';
-import { Switch, Route } from 'react-router-dom';
-import BuildListPage from '../BuildListPage';
-import BuildDetailsPage from '../BuildDetailsPage';
-import { useRouteMatch } from 'react-router-dom';
-
-const BuildPage: FC<{}> = () => {
- const match = useRouteMatch();
- return (
-
- (
-
- )}
- />
-
-
- );
-};
-
-export default BuildPage;
diff --git a/frontend/packages/plugins/github-actions/src/components/BuildPage/index.ts b/frontend/packages/plugins/github-actions/src/components/BuildPage/index.ts
deleted file mode 100644
index 092d2e639d..0000000000
--- a/frontend/packages/plugins/github-actions/src/components/BuildPage/index.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { default } from './BuildPage';
diff --git a/frontend/packages/plugins/github-actions/src/plugin.ts b/frontend/packages/plugins/github-actions/src/plugin.ts
index 359ba2e7f9..6972d8d128 100644
--- a/frontend/packages/plugins/github-actions/src/plugin.ts
+++ b/frontend/packages/plugins/github-actions/src/plugin.ts
@@ -1,6 +1,6 @@
import { createPlugin } from '@backstage/core';
-import { entityViewPage } from '@backstage/core/src/api/plugin/outputs';
-import BuildPage from './components/BuildPage';
+import BuildDetailsPage from './components/BuildDetailsPage';
+import BuildListPage from './components/BuildListPage';
// export const buildListRoute = createEntityRoute<[]>('/builds')
// export const buildDetailsRoute = createEntityRoute<[number]>('/builds/:buildId')
@@ -8,11 +8,9 @@ import BuildPage from './components/BuildPage';
export default createPlugin({
id: 'github-actions',
- register({ provide }) {
- provide(entityViewPage, {
- title: 'CI/CD',
- path: 'builds',
- component: BuildPage,
- });
+ register({ entityPage }) {
+ entityPage.navItem({ title: 'CI/CD', target: '/builds' });
+ entityPage.route('/builds', BuildListPage);
+ entityPage.route('/builds/:buildUri', BuildDetailsPage);
},
});
diff --git a/frontend/packages/proto/package.json b/frontend/packages/proto/package.json
index b6a52085f5..e881635591 100644
--- a/frontend/packages/proto/package.json
+++ b/frontend/packages/proto/package.json
@@ -1,8 +1,11 @@
{
"private": true,
"name": "@backstage/protobuf-definitions",
+ "main": "src/index.ts",
+ "main:src": "src/index.ts",
"version": "0.0.0",
- "devDependencies": {
- "ts-protoc-gen": "^0.12.0"
+ "dependencies": {
+ "google-protobuf": "^3.11.2",
+ "grpc-web": "^1.0.7"
}
}
diff --git a/frontend/packages/proto/src/buildsv1.ts b/frontend/packages/proto/src/buildsv1.ts
new file mode 100644
index 0000000000..689f8dac0e
--- /dev/null
+++ b/frontend/packages/proto/src/buildsv1.ts
@@ -0,0 +1,2 @@
+export { BuildsPromiseClient as Client } from './generated/builds/v1/builds_grpc_web_pb';
+export * from './generated/builds/v1/builds_pb';
diff --git a/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.d.ts b/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.d.ts
new file mode 100644
index 0000000000..18b2187499
--- /dev/null
+++ b/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.d.ts
@@ -0,0 +1,46 @@
+import * as grpcWeb from 'grpc-web';
+
+import {
+ GetBuildReply,
+ GetBuildRequest,
+ ListBuildsReply,
+ ListBuildsRequest} from './builds_pb';
+
+export class BuildsClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listBuilds(
+ request: ListBuildsRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: ListBuildsReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ getBuild(
+ request: GetBuildRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: GetBuildReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+}
+
+export class BuildsPromiseClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listBuilds(
+ request: ListBuildsRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ getBuild(
+ request: GetBuildRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+}
+
diff --git a/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.js b/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.js
new file mode 100644
index 0000000000..b7b5369f0b
--- /dev/null
+++ b/frontend/packages/proto/src/generated/builds/v1/builds_grpc_web_pb.js
@@ -0,0 +1,233 @@
+/**
+ * @fileoverview gRPC-Web generated client stub for spotify.backstage.builds.v1
+ * @enhanceable
+ * @public
+ */
+
+// GENERATED CODE -- DO NOT EDIT!
+
+
+
+const grpc = {};
+grpc.web = require('grpc-web');
+
+const proto = {};
+proto.spotify = {};
+proto.spotify.backstage = {};
+proto.spotify.backstage.builds = {};
+proto.spotify.backstage.builds.v1 = require('./builds_pb.js');
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.builds.v1.BuildsClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.builds.v1.BuildsPromiseClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.builds.v1.ListBuildsRequest,
+ * !proto.spotify.backstage.builds.v1.ListBuildsReply>}
+ */
+const methodDescriptor_Builds_ListBuilds = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.builds.v1.Builds/ListBuilds',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.builds.v1.ListBuildsRequest,
+ proto.spotify.backstage.builds.v1.ListBuildsReply,
+ /**
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.builds.v1.ListBuildsReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.builds.v1.ListBuildsRequest,
+ * !proto.spotify.backstage.builds.v1.ListBuildsReply>}
+ */
+const methodInfo_Builds_ListBuilds = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.builds.v1.ListBuildsReply,
+ /**
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.builds.v1.ListBuildsReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.builds.v1.ListBuildsReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.builds.v1.BuildsClient.prototype.listBuilds =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.builds.v1.Builds/ListBuilds',
+ request,
+ metadata || {},
+ methodDescriptor_Builds_ListBuilds,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.builds.v1.BuildsPromiseClient.prototype.listBuilds =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.builds.v1.Builds/ListBuilds',
+ request,
+ metadata || {},
+ methodDescriptor_Builds_ListBuilds);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.builds.v1.GetBuildRequest,
+ * !proto.spotify.backstage.builds.v1.GetBuildReply>}
+ */
+const methodDescriptor_Builds_GetBuild = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.builds.v1.Builds/GetBuild',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.builds.v1.GetBuildRequest,
+ proto.spotify.backstage.builds.v1.GetBuildReply,
+ /**
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.builds.v1.GetBuildReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.builds.v1.GetBuildRequest,
+ * !proto.spotify.backstage.builds.v1.GetBuildReply>}
+ */
+const methodInfo_Builds_GetBuild = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.builds.v1.GetBuildReply,
+ /**
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.builds.v1.GetBuildReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.builds.v1.GetBuildReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.builds.v1.BuildsClient.prototype.getBuild =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.builds.v1.Builds/GetBuild',
+ request,
+ metadata || {},
+ methodDescriptor_Builds_GetBuild,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.builds.v1.BuildsPromiseClient.prototype.getBuild =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.builds.v1.Builds/GetBuild',
+ request,
+ metadata || {},
+ methodDescriptor_Builds_GetBuild);
+};
+
+
+module.exports = proto.spotify.backstage.builds.v1;
+
diff --git a/frontend/packages/proto/src/generated/builds/v1/builds_pb.d.ts b/frontend/packages/proto/src/generated/builds/v1/builds_pb.d.ts
new file mode 100644
index 0000000000..ff0c1489cf
--- /dev/null
+++ b/frontend/packages/proto/src/generated/builds/v1/builds_pb.d.ts
@@ -0,0 +1,151 @@
+import * as jspb from "google-protobuf"
+
+export class ListBuildsRequest extends jspb.Message {
+ getEntityUri(): string;
+ setEntityUri(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListBuildsRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: ListBuildsRequest): ListBuildsRequest.AsObject;
+ static serializeBinaryToWriter(message: ListBuildsRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): ListBuildsRequest;
+ static deserializeBinaryFromReader(message: ListBuildsRequest, reader: jspb.BinaryReader): ListBuildsRequest;
+}
+
+export namespace ListBuildsRequest {
+ export type AsObject = {
+ entityUri: string,
+ }
+}
+
+export class ListBuildsReply extends jspb.Message {
+ getEntityUri(): string;
+ setEntityUri(value: string): void;
+
+ getBuildsList(): Array;
+ setBuildsList(value: Array): void;
+ clearBuildsList(): void;
+ addBuilds(value?: Build, index?: number): Build;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListBuildsReply.AsObject;
+ static toObject(includeInstance: boolean, msg: ListBuildsReply): ListBuildsReply.AsObject;
+ static serializeBinaryToWriter(message: ListBuildsReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): ListBuildsReply;
+ static deserializeBinaryFromReader(message: ListBuildsReply, reader: jspb.BinaryReader): ListBuildsReply;
+}
+
+export namespace ListBuildsReply {
+ export type AsObject = {
+ entityUri: string,
+ buildsList: Array,
+ }
+}
+
+export class GetBuildRequest extends jspb.Message {
+ getBuildUri(): string;
+ setBuildUri(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetBuildRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: GetBuildRequest): GetBuildRequest.AsObject;
+ static serializeBinaryToWriter(message: GetBuildRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): GetBuildRequest;
+ static deserializeBinaryFromReader(message: GetBuildRequest, reader: jspb.BinaryReader): GetBuildRequest;
+}
+
+export namespace GetBuildRequest {
+ export type AsObject = {
+ buildUri: string,
+ }
+}
+
+export class GetBuildReply extends jspb.Message {
+ getBuild(): Build | undefined;
+ setBuild(value?: Build): void;
+ hasBuild(): boolean;
+ clearBuild(): void;
+
+ getDetails(): BuildDetails | undefined;
+ setDetails(value?: BuildDetails): void;
+ hasDetails(): boolean;
+ clearDetails(): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetBuildReply.AsObject;
+ static toObject(includeInstance: boolean, msg: GetBuildReply): GetBuildReply.AsObject;
+ static serializeBinaryToWriter(message: GetBuildReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): GetBuildReply;
+ static deserializeBinaryFromReader(message: GetBuildReply, reader: jspb.BinaryReader): GetBuildReply;
+}
+
+export namespace GetBuildReply {
+ export type AsObject = {
+ build?: Build.AsObject,
+ details?: BuildDetails.AsObject,
+ }
+}
+
+export class Build extends jspb.Message {
+ getUri(): string;
+ setUri(value: string): void;
+
+ getCommitId(): string;
+ setCommitId(value: string): void;
+
+ getMessage(): string;
+ setMessage(value: string): void;
+
+ getStatus(): BuildStatus;
+ setStatus(value: BuildStatus): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): Build.AsObject;
+ static toObject(includeInstance: boolean, msg: Build): Build.AsObject;
+ static serializeBinaryToWriter(message: Build, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): Build;
+ static deserializeBinaryFromReader(message: Build, reader: jspb.BinaryReader): Build;
+}
+
+export namespace Build {
+ export type AsObject = {
+ uri: string,
+ commitId: string,
+ message: string,
+ status: BuildStatus,
+ }
+}
+
+export class BuildDetails extends jspb.Message {
+ getAuthor(): string;
+ setAuthor(value: string): void;
+
+ getOverviewUrl(): string;
+ setOverviewUrl(value: string): void;
+
+ getLogUrl(): string;
+ setLogUrl(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): BuildDetails.AsObject;
+ static toObject(includeInstance: boolean, msg: BuildDetails): BuildDetails.AsObject;
+ static serializeBinaryToWriter(message: BuildDetails, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): BuildDetails;
+ static deserializeBinaryFromReader(message: BuildDetails, reader: jspb.BinaryReader): BuildDetails;
+}
+
+export namespace BuildDetails {
+ export type AsObject = {
+ author: string,
+ overviewUrl: string,
+ logUrl: string,
+ }
+}
+
+export enum BuildStatus {
+ NULL = 0,
+ SUCCESS = 1,
+ FAILURE = 2,
+ PENDING = 3,
+ RUNNING = 4,
+}
diff --git a/frontend/packages/proto/src/generated/builds/v1/builds_pb.js b/frontend/packages/proto/src/generated/builds/v1/builds_pb.js
new file mode 100644
index 0000000000..1f00094a1d
--- /dev/null
+++ b/frontend/packages/proto/src/generated/builds/v1/builds_pb.js
@@ -0,0 +1,1178 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.spotify.backstage.builds.v1.Build', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.BuildDetails', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.BuildStatus', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.GetBuildReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.GetBuildRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.ListBuildsReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.builds.v1.ListBuildsRequest', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.ListBuildsRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.ListBuildsRequest.displayName = 'proto.spotify.backstage.builds.v1.ListBuildsRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.builds.v1.ListBuildsReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.ListBuildsReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.ListBuildsReply.displayName = 'proto.spotify.backstage.builds.v1.ListBuildsReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.GetBuildRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.GetBuildRequest.displayName = 'proto.spotify.backstage.builds.v1.GetBuildRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.GetBuildReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.GetBuildReply.displayName = 'proto.spotify.backstage.builds.v1.GetBuildReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.Build = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.Build, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.Build.displayName = 'proto.spotify.backstage.builds.v1.Build';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.builds.v1.BuildDetails = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.builds.v1.BuildDetails, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.builds.v1.BuildDetails.displayName = 'proto.spotify.backstage.builds.v1.BuildDetails';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.ListBuildsRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entityUri: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.ListBuildsRequest}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.ListBuildsRequest;
+ return proto.spotify.backstage.builds.v1.ListBuildsRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.ListBuildsRequest}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEntityUri(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.ListBuildsRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntityUri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string entity_uri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.prototype.getEntityUri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.ListBuildsRequest.prototype.setEntityUri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.repeatedFields_ = [2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.ListBuildsReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entityUri: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ buildsList: jspb.Message.toObjectList(msg.getBuildsList(),
+ proto.spotify.backstage.builds.v1.Build.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.ListBuildsReply}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.ListBuildsReply;
+ return proto.spotify.backstage.builds.v1.ListBuildsReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.ListBuildsReply}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEntityUri(value);
+ break;
+ case 2:
+ var value = new proto.spotify.backstage.builds.v1.Build;
+ reader.readMessage(value,proto.spotify.backstage.builds.v1.Build.deserializeBinaryFromReader);
+ msg.addBuilds(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.ListBuildsReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.ListBuildsReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntityUri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getBuildsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 2,
+ f,
+ proto.spotify.backstage.builds.v1.Build.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional string entity_uri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.getEntityUri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.setEntityUri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * repeated Build builds = 2;
+ * @return {!Array}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.getBuildsList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.builds.v1.Build, 2));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.setBuildsList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 2, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.builds.v1.Build=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.builds.v1.Build}
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.addBuilds = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.spotify.backstage.builds.v1.Build, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.builds.v1.ListBuildsReply.prototype.clearBuildsList = function() {
+ this.setBuildsList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.GetBuildRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ buildUri: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.GetBuildRequest}
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.GetBuildRequest;
+ return proto.spotify.backstage.builds.v1.GetBuildRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.GetBuildRequest}
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setBuildUri(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.GetBuildRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getBuildUri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string build_uri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.GetBuildRequest.prototype.getBuildUri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.GetBuildRequest.prototype.setBuildUri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.GetBuildReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ build: (f = msg.getBuild()) && proto.spotify.backstage.builds.v1.Build.toObject(includeInstance, f),
+ details: (f = msg.getDetails()) && proto.spotify.backstage.builds.v1.BuildDetails.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.GetBuildReply}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.GetBuildReply;
+ return proto.spotify.backstage.builds.v1.GetBuildReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.GetBuildReply}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.builds.v1.Build;
+ reader.readMessage(value,proto.spotify.backstage.builds.v1.Build.deserializeBinaryFromReader);
+ msg.setBuild(value);
+ break;
+ case 2:
+ var value = new proto.spotify.backstage.builds.v1.BuildDetails;
+ reader.readMessage(value,proto.spotify.backstage.builds.v1.BuildDetails.deserializeBinaryFromReader);
+ msg.setDetails(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.GetBuildReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.GetBuildReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getBuild();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.builds.v1.Build.serializeBinaryToWriter
+ );
+ }
+ f = message.getDetails();
+ if (f != null) {
+ writer.writeMessage(
+ 2,
+ f,
+ proto.spotify.backstage.builds.v1.BuildDetails.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Build build = 1;
+ * @return {?proto.spotify.backstage.builds.v1.Build}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.getBuild = function() {
+ return /** @type{?proto.spotify.backstage.builds.v1.Build} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.builds.v1.Build, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.builds.v1.Build|undefined} value */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.setBuild = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.clearBuild = function() {
+ this.setBuild(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.hasBuild = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * optional BuildDetails details = 2;
+ * @return {?proto.spotify.backstage.builds.v1.BuildDetails}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.getDetails = function() {
+ return /** @type{?proto.spotify.backstage.builds.v1.BuildDetails} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.builds.v1.BuildDetails, 2));
+};
+
+
+/** @param {?proto.spotify.backstage.builds.v1.BuildDetails|undefined} value */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.setDetails = function(value) {
+ jspb.Message.setWrapperField(this, 2, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.clearDetails = function() {
+ this.setDetails(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.builds.v1.GetBuildReply.prototype.hasDetails = function() {
+ return jspb.Message.getField(this, 2) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.Build.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.Build} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.Build.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ uri: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ commitId: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ message: jspb.Message.getFieldWithDefault(msg, 3, ""),
+ status: jspb.Message.getFieldWithDefault(msg, 4, 0)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.Build}
+ */
+proto.spotify.backstage.builds.v1.Build.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.Build;
+ return proto.spotify.backstage.builds.v1.Build.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.Build} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.Build}
+ */
+proto.spotify.backstage.builds.v1.Build.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setUri(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setCommitId(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setMessage(value);
+ break;
+ case 4:
+ var value = /** @type {!proto.spotify.backstage.builds.v1.BuildStatus} */ (reader.readEnum());
+ msg.setStatus(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.Build.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.Build} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.Build.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getUri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getCommitId();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getMessage();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+ f = message.getStatus();
+ if (f !== 0.0) {
+ writer.writeEnum(
+ 4,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string uri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.getUri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.Build.prototype.setUri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string commit_id = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.getCommitId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.Build.prototype.setCommitId = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string message = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.getMessage = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.Build.prototype.setMessage = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional BuildStatus status = 4;
+ * @return {!proto.spotify.backstage.builds.v1.BuildStatus}
+ */
+proto.spotify.backstage.builds.v1.Build.prototype.getStatus = function() {
+ return /** @type {!proto.spotify.backstage.builds.v1.BuildStatus} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
+};
+
+
+/** @param {!proto.spotify.backstage.builds.v1.BuildStatus} value */
+proto.spotify.backstage.builds.v1.Build.prototype.setStatus = function(value) {
+ jspb.Message.setProto3EnumField(this, 4, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.builds.v1.BuildDetails.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.builds.v1.BuildDetails} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ author: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ overviewUrl: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ logUrl: jspb.Message.getFieldWithDefault(msg, 3, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.builds.v1.BuildDetails}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.builds.v1.BuildDetails;
+ return proto.spotify.backstage.builds.v1.BuildDetails.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.builds.v1.BuildDetails} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.builds.v1.BuildDetails}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setAuthor(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setOverviewUrl(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setLogUrl(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.builds.v1.BuildDetails.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.builds.v1.BuildDetails} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getAuthor();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getOverviewUrl();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getLogUrl();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string author = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.getAuthor = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.setAuthor = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string overview_url = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.getOverviewUrl = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.setOverviewUrl = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string log_url = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.getLogUrl = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.builds.v1.BuildDetails.prototype.setLogUrl = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * @enum {number}
+ */
+proto.spotify.backstage.builds.v1.BuildStatus = {
+ NULL: 0,
+ SUCCESS: 1,
+ FAILURE: 2,
+ PENDING: 3,
+ RUNNING: 4
+};
+
+goog.object.extend(exports, proto.spotify.backstage.builds.v1);
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.d.ts b/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.d.ts
new file mode 100644
index 0000000000..ab4076b19c
--- /dev/null
+++ b/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.d.ts
@@ -0,0 +1,46 @@
+import * as grpcWeb from 'grpc-web';
+
+import {
+ GetGroupReply,
+ GetGroupRequest,
+ GetUserReply,
+ GetUserRequest} from './identity_pb';
+
+export class IdentityClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ getUser(
+ request: GetUserRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: GetUserReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ getGroup(
+ request: GetGroupRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: GetGroupReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+}
+
+export class IdentityPromiseClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ getUser(
+ request: GetUserRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ getGroup(
+ request: GetGroupRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+}
+
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.js b/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.js
new file mode 100644
index 0000000000..6fc2bc948b
--- /dev/null
+++ b/frontend/packages/proto/src/generated/identity/v1/identity_grpc_web_pb.js
@@ -0,0 +1,233 @@
+/**
+ * @fileoverview gRPC-Web generated client stub for spotify.backstage.identity.v1
+ * @enhanceable
+ * @public
+ */
+
+// GENERATED CODE -- DO NOT EDIT!
+
+
+
+const grpc = {};
+grpc.web = require('grpc-web');
+
+const proto = {};
+proto.spotify = {};
+proto.spotify.backstage = {};
+proto.spotify.backstage.identity = {};
+proto.spotify.backstage.identity.v1 = require('./identity_pb.js');
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.identity.v1.IdentityClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.identity.v1.IdentityPromiseClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.identity.v1.GetUserRequest,
+ * !proto.spotify.backstage.identity.v1.GetUserReply>}
+ */
+const methodDescriptor_Identity_GetUser = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.identity.v1.Identity/GetUser',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.identity.v1.GetUserRequest,
+ proto.spotify.backstage.identity.v1.GetUserReply,
+ /**
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.identity.v1.GetUserReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.identity.v1.GetUserRequest,
+ * !proto.spotify.backstage.identity.v1.GetUserReply>}
+ */
+const methodInfo_Identity_GetUser = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.identity.v1.GetUserReply,
+ /**
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.identity.v1.GetUserReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.identity.v1.GetUserReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.identity.v1.IdentityClient.prototype.getUser =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.identity.v1.Identity/GetUser',
+ request,
+ metadata || {},
+ methodDescriptor_Identity_GetUser,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.identity.v1.IdentityPromiseClient.prototype.getUser =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.identity.v1.Identity/GetUser',
+ request,
+ metadata || {},
+ methodDescriptor_Identity_GetUser);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.identity.v1.GetGroupRequest,
+ * !proto.spotify.backstage.identity.v1.GetGroupReply>}
+ */
+const methodDescriptor_Identity_GetGroup = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.identity.v1.Identity/GetGroup',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.identity.v1.GetGroupRequest,
+ proto.spotify.backstage.identity.v1.GetGroupReply,
+ /**
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.identity.v1.GetGroupReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.identity.v1.GetGroupRequest,
+ * !proto.spotify.backstage.identity.v1.GetGroupReply>}
+ */
+const methodInfo_Identity_GetGroup = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.identity.v1.GetGroupReply,
+ /**
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.identity.v1.GetGroupReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.identity.v1.GetGroupReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.identity.v1.IdentityClient.prototype.getGroup =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.identity.v1.Identity/GetGroup',
+ request,
+ metadata || {},
+ methodDescriptor_Identity_GetGroup,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.identity.v1.IdentityPromiseClient.prototype.getGroup =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.identity.v1.Identity/GetGroup',
+ request,
+ metadata || {},
+ methodDescriptor_Identity_GetGroup);
+};
+
+
+module.exports = proto.spotify.backstage.identity.v1;
+
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_pb.d.ts b/frontend/packages/proto/src/generated/identity/v1/identity_pb.d.ts
index 163e30b52c..ac0f4de095 100644
--- a/frontend/packages/proto/src/generated/identity/v1/identity_pb.d.ts
+++ b/frontend/packages/proto/src/generated/identity/v1/identity_pb.d.ts
@@ -1,7 +1,4 @@
-// package: spotify.backstage.identity.v1
-// file: identity/v1/identity.proto
-
-import * as jspb from "google-protobuf";
+import * as jspb from "google-protobuf"
export class GetUserRequest extends jspb.Message {
getId(): string;
@@ -10,8 +7,6 @@ export class GetUserRequest extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetUserRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetUserRequest): GetUserRequest.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetUserRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetUserRequest;
static deserializeBinaryFromReader(message: GetUserRequest, reader: jspb.BinaryReader): GetUserRequest;
@@ -24,21 +19,19 @@ export namespace GetUserRequest {
}
export class GetUserReply extends jspb.Message {
- hasUser(): boolean;
- clearUser(): void;
getUser(): User | undefined;
setUser(value?: User): void;
+ hasUser(): boolean;
+ clearUser(): void;
- clearGroupsList(): void;
getGroupsList(): Array;
setGroupsList(value: Array): void;
+ clearGroupsList(): void;
addGroups(value?: Group, index?: number): Group;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetUserReply.AsObject;
static toObject(includeInstance: boolean, msg: GetUserReply): GetUserReply.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetUserReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetUserReply;
static deserializeBinaryFromReader(message: GetUserReply, reader: jspb.BinaryReader): GetUserReply;
@@ -58,8 +51,6 @@ export class GetGroupRequest extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetGroupRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetGroupRequest): GetGroupRequest.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetGroupRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetGroupRequest;
static deserializeBinaryFromReader(message: GetGroupRequest, reader: jspb.BinaryReader): GetGroupRequest;
@@ -72,16 +63,14 @@ export namespace GetGroupRequest {
}
export class GetGroupReply extends jspb.Message {
- hasGroup(): boolean;
- clearGroup(): void;
getGroup(): Group | undefined;
setGroup(value?: Group): void;
+ hasGroup(): boolean;
+ clearGroup(): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetGroupReply.AsObject;
static toObject(includeInstance: boolean, msg: GetGroupReply): GetGroupReply.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetGroupReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetGroupReply;
static deserializeBinaryFromReader(message: GetGroupReply, reader: jspb.BinaryReader): GetGroupReply;
@@ -103,8 +92,6 @@ export class User extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): User.AsObject;
static toObject(includeInstance: boolean, msg: User): User.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): User;
static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User;
@@ -121,21 +108,19 @@ export class Group extends jspb.Message {
getId(): string;
setId(value: string): void;
- clearUsersList(): void;
getUsersList(): Array;
setUsersList(value: Array): void;
+ clearUsersList(): void;
addUsers(value?: User, index?: number): User;
- clearGroupsList(): void;
getGroupsList(): Array;
setGroupsList(value: Array): void;
+ clearGroupsList(): void;
addGroups(value?: Group, index?: number): Group;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Group.AsObject;
static toObject(includeInstance: boolean, msg: Group): Group.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: Group, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Group;
static deserializeBinaryFromReader(message: Group, reader: jspb.BinaryReader): Group;
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_pb.js b/frontend/packages/proto/src/generated/identity/v1/identity_pb.js
new file mode 100644
index 0000000000..f298cad9bd
--- /dev/null
+++ b/frontend/packages/proto/src/generated/identity/v1/identity_pb.js
@@ -0,0 +1,1136 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.spotify.backstage.identity.v1.GetGroupReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.identity.v1.GetGroupRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.identity.v1.GetUserReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.identity.v1.GetUserRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.identity.v1.Group', null, global);
+goog.exportSymbol('proto.spotify.backstage.identity.v1.User', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.GetUserRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.GetUserRequest.displayName = 'proto.spotify.backstage.identity.v1.GetUserRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.GetUserReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.identity.v1.GetUserReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.GetUserReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.GetUserReply.displayName = 'proto.spotify.backstage.identity.v1.GetUserReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.GetGroupRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.GetGroupRequest.displayName = 'proto.spotify.backstage.identity.v1.GetGroupRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.GetGroupReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.GetGroupReply.displayName = 'proto.spotify.backstage.identity.v1.GetGroupReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.User = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.User, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.User.displayName = 'proto.spotify.backstage.identity.v1.User';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.identity.v1.Group = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.identity.v1.Group.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.identity.v1.Group, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.identity.v1.Group.displayName = 'proto.spotify.backstage.identity.v1.Group';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.GetUserRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.GetUserRequest}
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.GetUserRequest;
+ return proto.spotify.backstage.identity.v1.GetUserRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.GetUserRequest}
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.GetUserRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.GetUserRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.identity.v1.GetUserRequest.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.identity.v1.GetUserRequest.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.repeatedFields_ = [2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.GetUserReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.GetUserReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ user: (f = msg.getUser()) && proto.spotify.backstage.identity.v1.User.toObject(includeInstance, f),
+ groupsList: jspb.Message.toObjectList(msg.getGroupsList(),
+ proto.spotify.backstage.identity.v1.Group.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.GetUserReply}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.GetUserReply;
+ return proto.spotify.backstage.identity.v1.GetUserReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.GetUserReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.GetUserReply}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.identity.v1.User;
+ reader.readMessage(value,proto.spotify.backstage.identity.v1.User.deserializeBinaryFromReader);
+ msg.setUser(value);
+ break;
+ case 2:
+ var value = new proto.spotify.backstage.identity.v1.Group;
+ reader.readMessage(value,proto.spotify.backstage.identity.v1.Group.deserializeBinaryFromReader);
+ msg.addGroups(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.GetUserReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.GetUserReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getUser();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.identity.v1.User.serializeBinaryToWriter
+ );
+ }
+ f = message.getGroupsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 2,
+ f,
+ proto.spotify.backstage.identity.v1.Group.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional User user = 1;
+ * @return {?proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.getUser = function() {
+ return /** @type{?proto.spotify.backstage.identity.v1.User} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.identity.v1.User, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.identity.v1.User|undefined} value */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.setUser = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.clearUser = function() {
+ this.setUser(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.hasUser = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * repeated Group groups = 2;
+ * @return {!Array}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.getGroupsList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.identity.v1.Group, 2));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.setGroupsList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 2, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.Group=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.identity.v1.Group}
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.addGroups = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.spotify.backstage.identity.v1.Group, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.identity.v1.GetUserReply.prototype.clearGroupsList = function() {
+ this.setGroupsList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.GetGroupRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.GetGroupRequest}
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.GetGroupRequest;
+ return proto.spotify.backstage.identity.v1.GetGroupRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.GetGroupRequest}
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.GetGroupRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.identity.v1.GetGroupRequest.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.identity.v1.GetGroupRequest.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.GetGroupReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ group: (f = msg.getGroup()) && proto.spotify.backstage.identity.v1.Group.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.GetGroupReply}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.GetGroupReply;
+ return proto.spotify.backstage.identity.v1.GetGroupReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.GetGroupReply}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.identity.v1.Group;
+ reader.readMessage(value,proto.spotify.backstage.identity.v1.Group.deserializeBinaryFromReader);
+ msg.setGroup(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.GetGroupReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.GetGroupReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getGroup();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.identity.v1.Group.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Group group = 1;
+ * @return {?proto.spotify.backstage.identity.v1.Group}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.getGroup = function() {
+ return /** @type{?proto.spotify.backstage.identity.v1.Group} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.identity.v1.Group, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.identity.v1.Group|undefined} value */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.setGroup = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.clearGroup = function() {
+ this.setGroup(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.identity.v1.GetGroupReply.prototype.hasGroup = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.User.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.User.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.User} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.User.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ name: jspb.Message.getFieldWithDefault(msg, 2, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.identity.v1.User.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.User;
+ return proto.spotify.backstage.identity.v1.User.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.User} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.identity.v1.User.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.User.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.User.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.User} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.User.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.identity.v1.User.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.identity.v1.User.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.identity.v1.User.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.identity.v1.User.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.identity.v1.Group.repeatedFields_ = [2,3];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.identity.v1.Group.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.identity.v1.Group} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.Group.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ usersList: jspb.Message.toObjectList(msg.getUsersList(),
+ proto.spotify.backstage.identity.v1.User.toObject, includeInstance),
+ groupsList: jspb.Message.toObjectList(msg.getGroupsList(),
+ proto.spotify.backstage.identity.v1.Group.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.identity.v1.Group}
+ */
+proto.spotify.backstage.identity.v1.Group.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.identity.v1.Group;
+ return proto.spotify.backstage.identity.v1.Group.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.identity.v1.Group} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.identity.v1.Group}
+ */
+proto.spotify.backstage.identity.v1.Group.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = new proto.spotify.backstage.identity.v1.User;
+ reader.readMessage(value,proto.spotify.backstage.identity.v1.User.deserializeBinaryFromReader);
+ msg.addUsers(value);
+ break;
+ case 3:
+ var value = new proto.spotify.backstage.identity.v1.Group;
+ reader.readMessage(value,proto.spotify.backstage.identity.v1.Group.deserializeBinaryFromReader);
+ msg.addGroups(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.identity.v1.Group.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.identity.v1.Group} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.identity.v1.Group.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getUsersList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 2,
+ f,
+ proto.spotify.backstage.identity.v1.User.serializeBinaryToWriter
+ );
+ }
+ f = message.getGroupsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 3,
+ f,
+ proto.spotify.backstage.identity.v1.Group.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.identity.v1.Group.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * repeated User users = 2;
+ * @return {!Array}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.getUsersList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.identity.v1.User, 2));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.identity.v1.Group.prototype.setUsersList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 2, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.User=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.addUsers = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.spotify.backstage.identity.v1.User, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.clearUsersList = function() {
+ this.setUsersList([]);
+};
+
+
+/**
+ * repeated Group groups = 3;
+ * @return {!Array}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.getGroupsList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.identity.v1.Group, 3));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.identity.v1.Group.prototype.setGroupsList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 3, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.identity.v1.Group=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.identity.v1.Group}
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.addGroups = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 3, opt_value, proto.spotify.backstage.identity.v1.Group, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.identity.v1.Group.prototype.clearGroupsList = function() {
+ this.setGroupsList([]);
+};
+
+
+goog.object.extend(exports, proto.spotify.backstage.identity.v1);
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.d.ts b/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.d.ts
deleted file mode 100644
index 9c9e80f37f..0000000000
--- a/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-// package: spotify.backstage.identity.v1
-// file: identity/v1/identity.proto
-
-import * as identity_v1_identity_pb from "../../identity/v1/identity_pb";
-import {grpc} from "@improbable-eng/grpc-web";
-
-type IdentityGetUser = {
- readonly methodName: string;
- readonly service: typeof Identity;
- readonly requestStream: false;
- readonly responseStream: false;
- readonly requestType: typeof identity_v1_identity_pb.GetUserRequest;
- readonly responseType: typeof identity_v1_identity_pb.GetUserReply;
-};
-
-type IdentityGetGroup = {
- readonly methodName: string;
- readonly service: typeof Identity;
- readonly requestStream: false;
- readonly responseStream: false;
- readonly requestType: typeof identity_v1_identity_pb.GetGroupRequest;
- readonly responseType: typeof identity_v1_identity_pb.GetGroupReply;
-};
-
-export class Identity {
- static readonly serviceName: string;
- static readonly GetUser: IdentityGetUser;
- static readonly GetGroup: IdentityGetGroup;
-}
-
-export type ServiceError = { message: string, code: number; metadata: grpc.Metadata }
-export type Status = { details: string, code: number; metadata: grpc.Metadata }
-
-interface UnaryResponse {
- cancel(): void;
-}
-interface ResponseStream {
- cancel(): void;
- on(type: 'data', handler: (message: T) => void): ResponseStream;
- on(type: 'end', handler: (status?: Status) => void): ResponseStream;
- on(type: 'status', handler: (status: Status) => void): ResponseStream;
-}
-interface RequestStream {
- write(message: T): RequestStream;
- end(): void;
- cancel(): void;
- on(type: 'end', handler: (status?: Status) => void): RequestStream;
- on(type: 'status', handler: (status: Status) => void): RequestStream;
-}
-interface BidirectionalStream {
- write(message: ReqT): BidirectionalStream;
- end(): void;
- cancel(): void;
- on(type: 'data', handler: (message: ResT) => void): BidirectionalStream;
- on(type: 'end', handler: (status?: Status) => void): BidirectionalStream;
- on(type: 'status', handler: (status: Status) => void): BidirectionalStream;
-}
-
-export class IdentityClient {
- readonly serviceHost: string;
-
- constructor(serviceHost: string, options?: grpc.RpcOptions);
- getUser(
- requestMessage: identity_v1_identity_pb.GetUserRequest,
- metadata: grpc.Metadata,
- callback: (error: ServiceError|null, responseMessage: identity_v1_identity_pb.GetUserReply|null) => void
- ): UnaryResponse;
- getUser(
- requestMessage: identity_v1_identity_pb.GetUserRequest,
- callback: (error: ServiceError|null, responseMessage: identity_v1_identity_pb.GetUserReply|null) => void
- ): UnaryResponse;
- getGroup(
- requestMessage: identity_v1_identity_pb.GetGroupRequest,
- metadata: grpc.Metadata,
- callback: (error: ServiceError|null, responseMessage: identity_v1_identity_pb.GetGroupReply|null) => void
- ): UnaryResponse;
- getGroup(
- requestMessage: identity_v1_identity_pb.GetGroupRequest,
- callback: (error: ServiceError|null, responseMessage: identity_v1_identity_pb.GetGroupReply|null) => void
- ): UnaryResponse;
-}
-
diff --git a/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.js b/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.js
deleted file mode 100644
index 3fa97ae125..0000000000
--- a/frontend/packages/proto/src/generated/identity/v1/identity_pb_service.js
+++ /dev/null
@@ -1,101 +0,0 @@
-// package: spotify.backstage.identity.v1
-// file: identity/v1/identity.proto
-
-var identity_v1_identity_pb = require("../../identity/v1/identity_pb");
-var grpc = require("@improbable-eng/grpc-web").grpc;
-
-var Identity = (function () {
- function Identity() {}
- Identity.serviceName = "spotify.backstage.identity.v1.Identity";
- return Identity;
-}());
-
-Identity.GetUser = {
- methodName: "GetUser",
- service: Identity,
- requestStream: false,
- responseStream: false,
- requestType: identity_v1_identity_pb.GetUserRequest,
- responseType: identity_v1_identity_pb.GetUserReply
-};
-
-Identity.GetGroup = {
- methodName: "GetGroup",
- service: Identity,
- requestStream: false,
- responseStream: false,
- requestType: identity_v1_identity_pb.GetGroupRequest,
- responseType: identity_v1_identity_pb.GetGroupReply
-};
-
-exports.Identity = Identity;
-
-function IdentityClient(serviceHost, options) {
- this.serviceHost = serviceHost;
- this.options = options || {};
-}
-
-IdentityClient.prototype.getUser = function getUser(requestMessage, metadata, callback) {
- if (arguments.length === 2) {
- callback = arguments[1];
- }
- var client = grpc.unary(Identity.GetUser, {
- request: requestMessage,
- host: this.serviceHost,
- metadata: metadata,
- transport: this.options.transport,
- debug: this.options.debug,
- onEnd: function (response) {
- if (callback) {
- if (response.status !== grpc.Code.OK) {
- var err = new Error(response.statusMessage);
- err.code = response.status;
- err.metadata = response.trailers;
- callback(err, null);
- } else {
- callback(null, response.message);
- }
- }
- }
- });
- return {
- cancel: function () {
- callback = null;
- client.close();
- }
- };
-};
-
-IdentityClient.prototype.getGroup = function getGroup(requestMessage, metadata, callback) {
- if (arguments.length === 2) {
- callback = arguments[1];
- }
- var client = grpc.unary(Identity.GetGroup, {
- request: requestMessage,
- host: this.serviceHost,
- metadata: metadata,
- transport: this.options.transport,
- debug: this.options.debug,
- onEnd: function (response) {
- if (callback) {
- if (response.status !== grpc.Code.OK) {
- var err = new Error(response.statusMessage);
- err.code = response.status;
- err.metadata = response.trailers;
- callback(err, null);
- } else {
- callback(null, response.message);
- }
- }
- }
- });
- return {
- cancel: function () {
- callback = null;
- client.close();
- }
- };
-};
-
-exports.IdentityClient = IdentityClient;
-
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.d.ts b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.d.ts
new file mode 100644
index 0000000000..da57b03eb4
--- /dev/null
+++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.d.ts
@@ -0,0 +1,88 @@
+import * as grpcWeb from 'grpc-web';
+
+import {
+ CreateEntityReply,
+ CreateEntityRequest,
+ GetEntityReply,
+ GetEntityRequest,
+ GetFactReply,
+ GetFactRequest,
+ ListEntitiesReply,
+ ListEntitiesRequest,
+ SetFactReply,
+ SetFactRequest} from './inventory_pb';
+
+export class InventoryClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listEntities(
+ request: ListEntitiesRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: ListEntitiesReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ getEntity(
+ request: GetEntityRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: GetEntityReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ createEntity(
+ request: CreateEntityRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: CreateEntityReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ setFact(
+ request: SetFactRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: SetFactReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ getFact(
+ request: GetFactRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: GetFactReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+}
+
+export class InventoryPromiseClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listEntities(
+ request: ListEntitiesRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ getEntity(
+ request: GetEntityRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ createEntity(
+ request: CreateEntityRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ setFact(
+ request: SetFactRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ getFact(
+ request: GetFactRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+}
+
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.js b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.js
new file mode 100644
index 0000000000..1604b62d94
--- /dev/null
+++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_grpc_web_pb.js
@@ -0,0 +1,473 @@
+/**
+ * @fileoverview gRPC-Web generated client stub for spotify.backstage.inventory.v1
+ * @enhanceable
+ * @public
+ */
+
+// GENERATED CODE -- DO NOT EDIT!
+
+
+
+const grpc = {};
+grpc.web = require('grpc-web');
+
+const proto = {};
+proto.spotify = {};
+proto.spotify.backstage = {};
+proto.spotify.backstage.inventory = {};
+proto.spotify.backstage.inventory.v1 = require('./inventory_pb.js');
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.inventory.v1.ListEntitiesRequest,
+ * !proto.spotify.backstage.inventory.v1.ListEntitiesReply>}
+ */
+const methodDescriptor_Inventory_ListEntities = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.inventory.v1.Inventory/ListEntities',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.inventory.v1.ListEntitiesRequest,
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.inventory.v1.ListEntitiesRequest,
+ * !proto.spotify.backstage.inventory.v1.ListEntitiesReply>}
+ */
+const methodInfo_Inventory_ListEntities = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.inventory.v1.ListEntitiesReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient.prototype.listEntities =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/ListEntities',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_ListEntities,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient.prototype.listEntities =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/ListEntities',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_ListEntities);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.inventory.v1.GetEntityRequest,
+ * !proto.spotify.backstage.inventory.v1.GetEntityReply>}
+ */
+const methodDescriptor_Inventory_GetEntity = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.inventory.v1.Inventory/GetEntity',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.inventory.v1.GetEntityRequest,
+ proto.spotify.backstage.inventory.v1.GetEntityReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.GetEntityReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.inventory.v1.GetEntityRequest,
+ * !proto.spotify.backstage.inventory.v1.GetEntityReply>}
+ */
+const methodInfo_Inventory_GetEntity = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.inventory.v1.GetEntityReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.GetEntityReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.inventory.v1.GetEntityReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient.prototype.getEntity =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/GetEntity',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_GetEntity,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient.prototype.getEntity =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/GetEntity',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_GetEntity);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.inventory.v1.CreateEntityRequest,
+ * !proto.spotify.backstage.inventory.v1.CreateEntityReply>}
+ */
+const methodDescriptor_Inventory_CreateEntity = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.inventory.v1.Inventory/CreateEntity',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.inventory.v1.CreateEntityRequest,
+ proto.spotify.backstage.inventory.v1.CreateEntityReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.CreateEntityReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.inventory.v1.CreateEntityRequest,
+ * !proto.spotify.backstage.inventory.v1.CreateEntityReply>}
+ */
+const methodInfo_Inventory_CreateEntity = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.inventory.v1.CreateEntityReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.CreateEntityReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.inventory.v1.CreateEntityReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient.prototype.createEntity =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/CreateEntity',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_CreateEntity,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient.prototype.createEntity =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/CreateEntity',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_CreateEntity);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.inventory.v1.SetFactRequest,
+ * !proto.spotify.backstage.inventory.v1.SetFactReply>}
+ */
+const methodDescriptor_Inventory_SetFact = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.inventory.v1.Inventory/SetFact',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.inventory.v1.SetFactRequest,
+ proto.spotify.backstage.inventory.v1.SetFactReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.SetFactReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.inventory.v1.SetFactRequest,
+ * !proto.spotify.backstage.inventory.v1.SetFactReply>}
+ */
+const methodInfo_Inventory_SetFact = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.inventory.v1.SetFactReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.SetFactReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.inventory.v1.SetFactReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient.prototype.setFact =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/SetFact',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_SetFact,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient.prototype.setFact =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/SetFact',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_SetFact);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.inventory.v1.GetFactRequest,
+ * !proto.spotify.backstage.inventory.v1.GetFactReply>}
+ */
+const methodDescriptor_Inventory_GetFact = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.inventory.v1.Inventory/GetFact',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.inventory.v1.GetFactRequest,
+ proto.spotify.backstage.inventory.v1.GetFactReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.GetFactReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.inventory.v1.GetFactRequest,
+ * !proto.spotify.backstage.inventory.v1.GetFactReply>}
+ */
+const methodInfo_Inventory_GetFact = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.inventory.v1.GetFactReply,
+ /**
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.inventory.v1.GetFactReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.inventory.v1.GetFactReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.inventory.v1.InventoryClient.prototype.getFact =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/GetFact',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_GetFact,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.inventory.v1.InventoryPromiseClient.prototype.getFact =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.inventory.v1.Inventory/GetFact',
+ request,
+ metadata || {},
+ methodDescriptor_Inventory_GetFact);
+};
+
+
+module.exports = proto.spotify.backstage.inventory.v1;
+
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.d.ts b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.d.ts
index 754c935c2e..139857b3e2 100644
--- a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.d.ts
+++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.d.ts
@@ -1,24 +1,57 @@
-// package: spotify.backstage.inventory.v1
-// file: inventory/v1/inventory.proto
+import * as jspb from "google-protobuf"
-import * as jspb from "google-protobuf";
+export class ListEntitiesRequest extends jspb.Message {
+ getUriprefix(): string;
+ setUriprefix(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListEntitiesRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: ListEntitiesRequest): ListEntitiesRequest.AsObject;
+ static serializeBinaryToWriter(message: ListEntitiesRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): ListEntitiesRequest;
+ static deserializeBinaryFromReader(message: ListEntitiesRequest, reader: jspb.BinaryReader): ListEntitiesRequest;
+}
+
+export namespace ListEntitiesRequest {
+ export type AsObject = {
+ uriprefix: string,
+ }
+}
+
+export class ListEntitiesReply extends jspb.Message {
+ getEntitiesList(): Array;
+ setEntitiesList(value: Array): void;
+ clearEntitiesList(): void;
+ addEntities(value?: Entity, index?: number): Entity;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): ListEntitiesReply.AsObject;
+ static toObject(includeInstance: boolean, msg: ListEntitiesReply): ListEntitiesReply.AsObject;
+ static serializeBinaryToWriter(message: ListEntitiesReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): ListEntitiesReply;
+ static deserializeBinaryFromReader(message: ListEntitiesReply, reader: jspb.BinaryReader): ListEntitiesReply;
+}
+
+export namespace ListEntitiesReply {
+ export type AsObject = {
+ entitiesList: Array,
+ }
+}
export class GetEntityRequest extends jspb.Message {
- hasEntity(): boolean;
- clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): void;
- clearIncludeFactsList(): void;
getIncludeFactsList(): Array;
setIncludeFactsList(value: Array): void;
- addIncludeFacts(value: string, index?: number): string;
+ clearIncludeFactsList(): void;
+ addIncludeFacts(value: string, index?: number): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetEntityRequest.AsObject;
static toObject(includeInstance: boolean, msg: GetEntityRequest): GetEntityRequest.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetEntityRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetEntityRequest;
static deserializeBinaryFromReader(message: GetEntityRequest, reader: jspb.BinaryReader): GetEntityRequest;
@@ -32,21 +65,19 @@ export namespace GetEntityRequest {
}
export class GetEntityReply extends jspb.Message {
- hasEntity(): boolean;
- clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): void;
- clearFactsList(): void;
getFactsList(): Array;
setFactsList(value: Array): void;
+ clearFactsList(): void;
addFacts(value?: Fact, index?: number): Fact;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetEntityReply.AsObject;
static toObject(includeInstance: boolean, msg: GetEntityReply): GetEntityReply.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: GetEntityReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetEntityReply;
static deserializeBinaryFromReader(message: GetEntityReply, reader: jspb.BinaryReader): GetEntityReply;
@@ -60,16 +91,14 @@ export namespace GetEntityReply {
}
export class CreateEntityRequest extends jspb.Message {
- hasEntity(): boolean;
- clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateEntityRequest.AsObject;
static toObject(includeInstance: boolean, msg: CreateEntityRequest): CreateEntityRequest.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: CreateEntityRequest, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): CreateEntityRequest;
static deserializeBinaryFromReader(message: CreateEntityRequest, reader: jspb.BinaryReader): CreateEntityRequest;
@@ -82,16 +111,14 @@ export namespace CreateEntityRequest {
}
export class CreateEntityReply extends jspb.Message {
- hasEntity(): boolean;
- clearEntity(): void;
getEntity(): Entity | undefined;
setEntity(value?: Entity): void;
+ hasEntity(): boolean;
+ clearEntity(): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): CreateEntityReply.AsObject;
static toObject(includeInstance: boolean, msg: CreateEntityReply): CreateEntityReply.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: CreateEntityReply, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): CreateEntityReply;
static deserializeBinaryFromReader(message: CreateEntityReply, reader: jspb.BinaryReader): CreateEntityReply;
@@ -103,6 +130,94 @@ export namespace CreateEntityReply {
}
}
+export class SetFactRequest extends jspb.Message {
+ getEntityuri(): string;
+ setEntityuri(value: string): void;
+
+ getName(): string;
+ setName(value: string): void;
+
+ getValue(): string;
+ setValue(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): SetFactRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: SetFactRequest): SetFactRequest.AsObject;
+ static serializeBinaryToWriter(message: SetFactRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): SetFactRequest;
+ static deserializeBinaryFromReader(message: SetFactRequest, reader: jspb.BinaryReader): SetFactRequest;
+}
+
+export namespace SetFactRequest {
+ export type AsObject = {
+ entityuri: string,
+ name: string,
+ value: string,
+ }
+}
+
+export class SetFactReply extends jspb.Message {
+ getFact(): Fact | undefined;
+ setFact(value?: Fact): void;
+ hasFact(): boolean;
+ clearFact(): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): SetFactReply.AsObject;
+ static toObject(includeInstance: boolean, msg: SetFactReply): SetFactReply.AsObject;
+ static serializeBinaryToWriter(message: SetFactReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): SetFactReply;
+ static deserializeBinaryFromReader(message: SetFactReply, reader: jspb.BinaryReader): SetFactReply;
+}
+
+export namespace SetFactReply {
+ export type AsObject = {
+ fact?: Fact.AsObject,
+ }
+}
+
+export class GetFactRequest extends jspb.Message {
+ getEntityuri(): string;
+ setEntityuri(value: string): void;
+
+ getName(): string;
+ setName(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetFactRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: GetFactRequest): GetFactRequest.AsObject;
+ static serializeBinaryToWriter(message: GetFactRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): GetFactRequest;
+ static deserializeBinaryFromReader(message: GetFactRequest, reader: jspb.BinaryReader): GetFactRequest;
+}
+
+export namespace GetFactRequest {
+ export type AsObject = {
+ entityuri: string,
+ name: string,
+ }
+}
+
+export class GetFactReply extends jspb.Message {
+ getFact(): Fact | undefined;
+ setFact(value?: Fact): void;
+ hasFact(): boolean;
+ clearFact(): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): GetFactReply.AsObject;
+ static toObject(includeInstance: boolean, msg: GetFactReply): GetFactReply.AsObject;
+ static serializeBinaryToWriter(message: GetFactReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): GetFactReply;
+ static deserializeBinaryFromReader(message: GetFactReply, reader: jspb.BinaryReader): GetFactReply;
+}
+
+export namespace GetFactReply {
+ export type AsObject = {
+ fact?: Fact.AsObject,
+ }
+}
+
export class Entity extends jspb.Message {
getUri(): string;
setUri(value: string): void;
@@ -110,8 +225,6 @@ export class Entity extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Entity.AsObject;
static toObject(includeInstance: boolean, msg: Entity): Entity.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: Entity, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Entity;
static deserializeBinaryFromReader(message: Entity, reader: jspb.BinaryReader): Entity;
@@ -133,8 +246,6 @@ export class Fact extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Fact.AsObject;
static toObject(includeInstance: boolean, msg: Fact): Fact.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: Fact, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Fact;
static deserializeBinaryFromReader(message: Fact, reader: jspb.BinaryReader): Fact;
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.js b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.js
new file mode 100644
index 0000000000..f3f2c5d8c9
--- /dev/null
+++ b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb.js
@@ -0,0 +1,2166 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.CreateEntityReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.CreateEntityRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.Entity', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.Fact', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.GetEntityReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.GetEntityRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.GetFactReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.GetFactRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.ListEntitiesReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.ListEntitiesRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.SetFactReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.inventory.v1.SetFactRequest', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.ListEntitiesRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.ListEntitiesRequest.displayName = 'proto.spotify.backstage.inventory.v1.ListEntitiesRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.inventory.v1.ListEntitiesReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.ListEntitiesReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply.displayName = 'proto.spotify.backstage.inventory.v1.ListEntitiesReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.inventory.v1.GetEntityRequest.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.GetEntityRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.GetEntityRequest.displayName = 'proto.spotify.backstage.inventory.v1.GetEntityRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.inventory.v1.GetEntityReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.GetEntityReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.GetEntityReply.displayName = 'proto.spotify.backstage.inventory.v1.GetEntityReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.CreateEntityRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.CreateEntityRequest.displayName = 'proto.spotify.backstage.inventory.v1.CreateEntityRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.CreateEntityReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.CreateEntityReply.displayName = 'proto.spotify.backstage.inventory.v1.CreateEntityReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.SetFactRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.SetFactRequest.displayName = 'proto.spotify.backstage.inventory.v1.SetFactRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.SetFactReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.SetFactReply.displayName = 'proto.spotify.backstage.inventory.v1.SetFactReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.GetFactRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.GetFactRequest.displayName = 'proto.spotify.backstage.inventory.v1.GetFactRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.GetFactReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.GetFactReply.displayName = 'proto.spotify.backstage.inventory.v1.GetFactReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.Entity = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.Entity, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.Entity.displayName = 'proto.spotify.backstage.inventory.v1.Entity';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.inventory.v1.Fact = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.inventory.v1.Fact, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.inventory.v1.Fact.displayName = 'proto.spotify.backstage.inventory.v1.Fact';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.ListEntitiesRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ uriprefix: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.ListEntitiesRequest;
+ return proto.spotify.backstage.inventory.v1.ListEntitiesRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setUriprefix(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.ListEntitiesRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getUriprefix();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string uriPrefix = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.prototype.getUriprefix = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.ListEntitiesRequest.prototype.setUriprefix = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.ListEntitiesReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entitiesList: jspb.Message.toObjectList(msg.getEntitiesList(),
+ proto.spotify.backstage.inventory.v1.Entity.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.ListEntitiesReply}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.ListEntitiesReply;
+ return proto.spotify.backstage.inventory.v1.ListEntitiesReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.ListEntitiesReply}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Entity;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader);
+ msg.addEntities(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.ListEntitiesReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.ListEntitiesReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntitiesList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * repeated Entity entities = 1;
+ * @return {!Array}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.getEntitiesList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.inventory.v1.Entity, 1));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.setEntitiesList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.Entity=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.addEntities = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.spotify.backstage.inventory.v1.Entity, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.inventory.v1.ListEntitiesReply.prototype.clearEntitiesList = function() {
+ this.setEntitiesList([]);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.repeatedFields_ = [2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.GetEntityRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entity: (f = msg.getEntity()) && proto.spotify.backstage.inventory.v1.Entity.toObject(includeInstance, f),
+ includeFactsList: (f = jspb.Message.getRepeatedField(msg, 2)) == null ? undefined : f
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.GetEntityRequest}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.GetEntityRequest;
+ return proto.spotify.backstage.inventory.v1.GetEntityRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.GetEntityRequest}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Entity;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader);
+ msg.setEntity(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.addIncludeFacts(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.GetEntityRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntity();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter
+ );
+ }
+ f = message.getIncludeFactsList();
+ if (f.length > 0) {
+ writer.writeRepeatedString(
+ 2,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional Entity entity = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.getEntity = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Entity} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Entity, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Entity|undefined} value */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.setEntity = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.clearEntity = function() {
+ this.setEntity(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.hasEntity = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * repeated string include_facts = 2;
+ * @return {!Array}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.getIncludeFactsList = function() {
+ return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 2));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.setIncludeFactsList = function(value) {
+ jspb.Message.setField(this, 2, value || []);
+};
+
+
+/**
+ * @param {string} value
+ * @param {number=} opt_index
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.addIncludeFacts = function(value, opt_index) {
+ jspb.Message.addToRepeatedField(this, 2, value, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.inventory.v1.GetEntityRequest.prototype.clearIncludeFactsList = function() {
+ this.setIncludeFactsList([]);
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.repeatedFields_ = [2];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.GetEntityReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entity: (f = msg.getEntity()) && proto.spotify.backstage.inventory.v1.Entity.toObject(includeInstance, f),
+ factsList: jspb.Message.toObjectList(msg.getFactsList(),
+ proto.spotify.backstage.inventory.v1.Fact.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.GetEntityReply}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.GetEntityReply;
+ return proto.spotify.backstage.inventory.v1.GetEntityReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.GetEntityReply}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Entity;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader);
+ msg.setEntity(value);
+ break;
+ case 2:
+ var value = new proto.spotify.backstage.inventory.v1.Fact;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Fact.deserializeBinaryFromReader);
+ msg.addFacts(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.GetEntityReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.GetEntityReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntity();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter
+ );
+ }
+ f = message.getFactsList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 2,
+ f,
+ proto.spotify.backstage.inventory.v1.Fact.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Entity entity = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.getEntity = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Entity} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Entity, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Entity|undefined} value */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.setEntity = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.clearEntity = function() {
+ this.setEntity(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.hasEntity = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+/**
+ * repeated Fact facts = 2;
+ * @return {!Array}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.getFactsList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.inventory.v1.Fact, 2));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.setFactsList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 2, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.inventory.v1.Fact=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.inventory.v1.Fact}
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.addFacts = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 2, opt_value, proto.spotify.backstage.inventory.v1.Fact, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.inventory.v1.GetEntityReply.prototype.clearFactsList = function() {
+ this.setFactsList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.CreateEntityRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entity: (f = msg.getEntity()) && proto.spotify.backstage.inventory.v1.Entity.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.CreateEntityRequest}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.CreateEntityRequest;
+ return proto.spotify.backstage.inventory.v1.CreateEntityRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.CreateEntityRequest}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Entity;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader);
+ msg.setEntity(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.CreateEntityRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntity();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Entity entity = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.getEntity = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Entity} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Entity, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Entity|undefined} value */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.setEntity = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.clearEntity = function() {
+ this.setEntity(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityRequest.prototype.hasEntity = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.CreateEntityReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entity: (f = msg.getEntity()) && proto.spotify.backstage.inventory.v1.Entity.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.CreateEntityReply}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.CreateEntityReply;
+ return proto.spotify.backstage.inventory.v1.CreateEntityReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.CreateEntityReply}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Entity;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader);
+ msg.setEntity(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.CreateEntityReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.CreateEntityReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntity();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Entity entity = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.getEntity = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Entity} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Entity, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Entity|undefined} value */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.setEntity = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.clearEntity = function() {
+ this.setEntity(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.CreateEntityReply.prototype.hasEntity = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.SetFactRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entityuri: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ value: jspb.Message.getFieldWithDefault(msg, 3, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.SetFactRequest}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.SetFactRequest;
+ return proto.spotify.backstage.inventory.v1.SetFactRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.SetFactRequest}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEntityuri(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setValue(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.SetFactRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntityuri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getValue();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string entityUri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.getEntityuri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.setEntityuri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string value = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.getValue = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.SetFactRequest.prototype.setValue = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.SetFactReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ fact: (f = msg.getFact()) && proto.spotify.backstage.inventory.v1.Fact.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.SetFactReply}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.SetFactReply;
+ return proto.spotify.backstage.inventory.v1.SetFactReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.SetFactReply}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Fact;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Fact.deserializeBinaryFromReader);
+ msg.setFact(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.SetFactReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.SetFactReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getFact();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Fact.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Fact fact = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Fact}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.getFact = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Fact} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Fact, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Fact|undefined} value */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.setFact = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.clearFact = function() {
+ this.setFact(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.SetFactReply.prototype.hasFact = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.GetFactRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ entityuri: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ name: jspb.Message.getFieldWithDefault(msg, 2, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.GetFactRequest}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.GetFactRequest;
+ return proto.spotify.backstage.inventory.v1.GetFactRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.GetFactRequest}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setEntityuri(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.GetFactRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getEntityuri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string entityUri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.getEntityuri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.setEntityuri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.GetFactRequest.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.GetFactReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ fact: (f = msg.getFact()) && proto.spotify.backstage.inventory.v1.Fact.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.GetFactReply}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.GetFactReply;
+ return proto.spotify.backstage.inventory.v1.GetFactReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.GetFactReply}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.inventory.v1.Fact;
+ reader.readMessage(value,proto.spotify.backstage.inventory.v1.Fact.deserializeBinaryFromReader);
+ msg.setFact(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.GetFactReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.GetFactReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getFact();
+ if (f != null) {
+ writer.writeMessage(
+ 1,
+ f,
+ proto.spotify.backstage.inventory.v1.Fact.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional Fact fact = 1;
+ * @return {?proto.spotify.backstage.inventory.v1.Fact}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.getFact = function() {
+ return /** @type{?proto.spotify.backstage.inventory.v1.Fact} */ (
+ jspb.Message.getWrapperField(this, proto.spotify.backstage.inventory.v1.Fact, 1));
+};
+
+
+/** @param {?proto.spotify.backstage.inventory.v1.Fact|undefined} value */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.setFact = function(value) {
+ jspb.Message.setWrapperField(this, 1, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.clearFact = function() {
+ this.setFact(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.inventory.v1.GetFactReply.prototype.hasFact = function() {
+ return jspb.Message.getField(this, 1) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.Entity.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.Entity.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.Entity} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.Entity.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ uri: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.Entity.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.Entity;
+ return proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.Entity} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.Entity}
+ */
+proto.spotify.backstage.inventory.v1.Entity.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setUri(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.Entity.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.Entity} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.Entity.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getUri();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string uri = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.Entity.prototype.getUri = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.Entity.prototype.setUri = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.inventory.v1.Fact.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.inventory.v1.Fact.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.inventory.v1.Fact} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.Fact.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ name: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ value: jspb.Message.getFieldWithDefault(msg, 2, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.inventory.v1.Fact}
+ */
+proto.spotify.backstage.inventory.v1.Fact.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.inventory.v1.Fact;
+ return proto.spotify.backstage.inventory.v1.Fact.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.inventory.v1.Fact} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.inventory.v1.Fact}
+ */
+proto.spotify.backstage.inventory.v1.Fact.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setValue(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.inventory.v1.Fact.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.inventory.v1.Fact.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.inventory.v1.Fact} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.inventory.v1.Fact.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getValue();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string name = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.Fact.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.Fact.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string value = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.inventory.v1.Fact.prototype.getValue = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.inventory.v1.Fact.prototype.setValue = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+goog.object.extend(exports, proto.spotify.backstage.inventory.v1);
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.d.ts b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.d.ts
deleted file mode 100644
index 1b7ef69516..0000000000
--- a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-// package: spotify.backstage.inventory.v1
-// file: inventory/v1/inventory.proto
-
-import * as inventory_v1_inventory_pb from "../../inventory/v1/inventory_pb";
-import {grpc} from "@improbable-eng/grpc-web";
-
-type InventoryGetEntity = {
- readonly methodName: string;
- readonly service: typeof Inventory;
- readonly requestStream: false;
- readonly responseStream: false;
- readonly requestType: typeof inventory_v1_inventory_pb.GetEntityRequest;
- readonly responseType: typeof inventory_v1_inventory_pb.GetEntityReply;
-};
-
-type InventoryCreateEntity = {
- readonly methodName: string;
- readonly service: typeof Inventory;
- readonly requestStream: false;
- readonly responseStream: false;
- readonly requestType: typeof inventory_v1_inventory_pb.CreateEntityRequest;
- readonly responseType: typeof inventory_v1_inventory_pb.CreateEntityReply;
-};
-
-export class Inventory {
- static readonly serviceName: string;
- static readonly GetEntity: InventoryGetEntity;
- static readonly CreateEntity: InventoryCreateEntity;
-}
-
-export type ServiceError = { message: string, code: number; metadata: grpc.Metadata }
-export type Status = { details: string, code: number; metadata: grpc.Metadata }
-
-interface UnaryResponse {
- cancel(): void;
-}
-interface ResponseStream {
- cancel(): void;
- on(type: 'data', handler: (message: T) => void): ResponseStream;
- on(type: 'end', handler: (status?: Status) => void): ResponseStream;
- on(type: 'status', handler: (status: Status) => void): ResponseStream;
-}
-interface RequestStream {
- write(message: T): RequestStream;
- end(): void;
- cancel(): void;
- on(type: 'end', handler: (status?: Status) => void): RequestStream;
- on(type: 'status', handler: (status: Status) => void): RequestStream;
-}
-interface BidirectionalStream {
- write(message: ReqT): BidirectionalStream;
- end(): void;
- cancel(): void;
- on(type: 'data', handler: (message: ResT) => void): BidirectionalStream;
- on(type: 'end', handler: (status?: Status) => void): BidirectionalStream;
- on(type: 'status', handler: (status: Status) => void): BidirectionalStream;
-}
-
-export class InventoryClient {
- readonly serviceHost: string;
-
- constructor(serviceHost: string, options?: grpc.RpcOptions);
- getEntity(
- requestMessage: inventory_v1_inventory_pb.GetEntityRequest,
- metadata: grpc.Metadata,
- callback: (error: ServiceError|null, responseMessage: inventory_v1_inventory_pb.GetEntityReply|null) => void
- ): UnaryResponse;
- getEntity(
- requestMessage: inventory_v1_inventory_pb.GetEntityRequest,
- callback: (error: ServiceError|null, responseMessage: inventory_v1_inventory_pb.GetEntityReply|null) => void
- ): UnaryResponse;
- createEntity(
- requestMessage: inventory_v1_inventory_pb.CreateEntityRequest,
- metadata: grpc.Metadata,
- callback: (error: ServiceError|null, responseMessage: inventory_v1_inventory_pb.CreateEntityReply|null) => void
- ): UnaryResponse;
- createEntity(
- requestMessage: inventory_v1_inventory_pb.CreateEntityRequest,
- callback: (error: ServiceError|null, responseMessage: inventory_v1_inventory_pb.CreateEntityReply|null) => void
- ): UnaryResponse;
-}
-
diff --git a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.js b/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.js
deleted file mode 100644
index 02f48d037d..0000000000
--- a/frontend/packages/proto/src/generated/inventory/v1/inventory_pb_service.js
+++ /dev/null
@@ -1,101 +0,0 @@
-// package: spotify.backstage.inventory.v1
-// file: inventory/v1/inventory.proto
-
-var inventory_v1_inventory_pb = require("../../inventory/v1/inventory_pb");
-var grpc = require("@improbable-eng/grpc-web").grpc;
-
-var Inventory = (function () {
- function Inventory() {}
- Inventory.serviceName = "spotify.backstage.inventory.v1.Inventory";
- return Inventory;
-}());
-
-Inventory.GetEntity = {
- methodName: "GetEntity",
- service: Inventory,
- requestStream: false,
- responseStream: false,
- requestType: inventory_v1_inventory_pb.GetEntityRequest,
- responseType: inventory_v1_inventory_pb.GetEntityReply
-};
-
-Inventory.CreateEntity = {
- methodName: "CreateEntity",
- service: Inventory,
- requestStream: false,
- responseStream: false,
- requestType: inventory_v1_inventory_pb.CreateEntityRequest,
- responseType: inventory_v1_inventory_pb.CreateEntityReply
-};
-
-exports.Inventory = Inventory;
-
-function InventoryClient(serviceHost, options) {
- this.serviceHost = serviceHost;
- this.options = options || {};
-}
-
-InventoryClient.prototype.getEntity = function getEntity(requestMessage, metadata, callback) {
- if (arguments.length === 2) {
- callback = arguments[1];
- }
- var client = grpc.unary(Inventory.GetEntity, {
- request: requestMessage,
- host: this.serviceHost,
- metadata: metadata,
- transport: this.options.transport,
- debug: this.options.debug,
- onEnd: function (response) {
- if (callback) {
- if (response.status !== grpc.Code.OK) {
- var err = new Error(response.statusMessage);
- err.code = response.status;
- err.metadata = response.trailers;
- callback(err, null);
- } else {
- callback(null, response.message);
- }
- }
- }
- });
- return {
- cancel: function () {
- callback = null;
- client.close();
- }
- };
-};
-
-InventoryClient.prototype.createEntity = function createEntity(requestMessage, metadata, callback) {
- if (arguments.length === 2) {
- callback = arguments[1];
- }
- var client = grpc.unary(Inventory.CreateEntity, {
- request: requestMessage,
- host: this.serviceHost,
- metadata: metadata,
- transport: this.options.transport,
- debug: this.options.debug,
- onEnd: function (response) {
- if (callback) {
- if (response.status !== grpc.Code.OK) {
- var err = new Error(response.statusMessage);
- err.code = response.status;
- err.metadata = response.trailers;
- callback(err, null);
- } else {
- callback(null, response.message);
- }
- }
- }
- });
- return {
- cancel: function () {
- callback = null;
- client.close();
- }
- };
-};
-
-exports.InventoryClient = InventoryClient;
-
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.d.ts b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.d.ts
new file mode 100644
index 0000000000..f2a2819bf2
--- /dev/null
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.d.ts
@@ -0,0 +1,49 @@
+import * as grpcWeb from 'grpc-web';
+
+import * as identity_v1_identity_pb from '../../identity/v1/identity_pb';
+import * as google_protobuf_struct_pb from 'google-protobuf/google/protobuf/struct_pb';
+
+import {
+ CreateReply,
+ CreateRequest,
+ Empty,
+ ListTemplatesReply} from './scaffolder_pb';
+
+export class ScaffolderClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listTemplates(
+ request: Empty,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: ListTemplatesReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+ create(
+ request: CreateRequest,
+ metadata: grpcWeb.Metadata | undefined,
+ callback: (err: grpcWeb.Error,
+ response: CreateReply) => void
+ ): grpcWeb.ClientReadableStream;
+
+}
+
+export class ScaffolderPromiseClient {
+ constructor (hostname: string,
+ credentials?: null | { [index: string]: string; },
+ options?: null | { [index: string]: string; });
+
+ listTemplates(
+ request: Empty,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+ create(
+ request: CreateRequest,
+ metadata?: grpcWeb.Metadata
+ ): Promise;
+
+}
+
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.js b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.js
new file mode 100644
index 0000000000..0885d0c7f0
--- /dev/null
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_grpc_web_pb.js
@@ -0,0 +1,237 @@
+/**
+ * @fileoverview gRPC-Web generated client stub for spotify.backstage.scaffolder.v1
+ * @enhanceable
+ * @public
+ */
+
+// GENERATED CODE -- DO NOT EDIT!
+
+
+
+const grpc = {};
+grpc.web = require('grpc-web');
+
+
+var identity_v1_identity_pb = require('../../identity/v1/identity_pb.js')
+
+var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js')
+const proto = {};
+proto.spotify = {};
+proto.spotify.backstage = {};
+proto.spotify.backstage.scaffolder = {};
+proto.spotify.backstage.scaffolder.v1 = require('./scaffolder_pb.js');
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @param {string} hostname
+ * @param {?Object} credentials
+ * @param {?Object} options
+ * @constructor
+ * @struct
+ * @final
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderPromiseClient =
+ function(hostname, credentials, options) {
+ if (!options) options = {};
+ options['format'] = 'text';
+
+ /**
+ * @private @const {!grpc.web.GrpcWebClientBase} The client
+ */
+ this.client_ = new grpc.web.GrpcWebClientBase(options);
+
+ /**
+ * @private @const {string} The hostname
+ */
+ this.hostname_ = hostname;
+
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.scaffolder.v1.Empty,
+ * !proto.spotify.backstage.scaffolder.v1.ListTemplatesReply>}
+ */
+const methodDescriptor_Scaffolder_ListTemplates = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.scaffolder.v1.Scaffolder/ListTemplates',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.scaffolder.v1.Empty,
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply,
+ /**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.scaffolder.v1.Empty,
+ * !proto.spotify.backstage.scaffolder.v1.ListTemplatesReply>}
+ */
+const methodInfo_Scaffolder_ListTemplates = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply,
+ /**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.scaffolder.v1.ListTemplatesReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderClient.prototype.listTemplates =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.scaffolder.v1.Scaffolder/ListTemplates',
+ request,
+ metadata || {},
+ methodDescriptor_Scaffolder_ListTemplates,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderPromiseClient.prototype.listTemplates =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.scaffolder.v1.Scaffolder/ListTemplates',
+ request,
+ metadata || {},
+ methodDescriptor_Scaffolder_ListTemplates);
+};
+
+
+/**
+ * @const
+ * @type {!grpc.web.MethodDescriptor<
+ * !proto.spotify.backstage.scaffolder.v1.CreateRequest,
+ * !proto.spotify.backstage.scaffolder.v1.CreateReply>}
+ */
+const methodDescriptor_Scaffolder_Create = new grpc.web.MethodDescriptor(
+ '/spotify.backstage.scaffolder.v1.Scaffolder/Create',
+ grpc.web.MethodType.UNARY,
+ proto.spotify.backstage.scaffolder.v1.CreateRequest,
+ proto.spotify.backstage.scaffolder.v1.CreateReply,
+ /**
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.scaffolder.v1.CreateReply.deserializeBinary
+);
+
+
+/**
+ * @const
+ * @type {!grpc.web.AbstractClientBase.MethodInfo<
+ * !proto.spotify.backstage.scaffolder.v1.CreateRequest,
+ * !proto.spotify.backstage.scaffolder.v1.CreateReply>}
+ */
+const methodInfo_Scaffolder_Create = new grpc.web.AbstractClientBase.MethodInfo(
+ proto.spotify.backstage.scaffolder.v1.CreateReply,
+ /**
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} request
+ * @return {!Uint8Array}
+ */
+ function(request) {
+ return request.serializeBinary();
+ },
+ proto.spotify.backstage.scaffolder.v1.CreateReply.deserializeBinary
+);
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @param {function(?grpc.web.Error, ?proto.spotify.backstage.scaffolder.v1.CreateReply)}
+ * callback The callback function(error, response)
+ * @return {!grpc.web.ClientReadableStream|undefined}
+ * The XHR Node Readable Stream
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderClient.prototype.create =
+ function(request, metadata, callback) {
+ return this.client_.rpcCall(this.hostname_ +
+ '/spotify.backstage.scaffolder.v1.Scaffolder/Create',
+ request,
+ metadata || {},
+ methodDescriptor_Scaffolder_Create,
+ callback);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} request The
+ * request proto
+ * @param {?Object} metadata User defined
+ * call metadata
+ * @return {!Promise}
+ * A native promise that resolves to the response
+ */
+proto.spotify.backstage.scaffolder.v1.ScaffolderPromiseClient.prototype.create =
+ function(request, metadata) {
+ return this.client_.unaryCall(this.hostname_ +
+ '/spotify.backstage.scaffolder.v1.Scaffolder/Create',
+ request,
+ metadata || {},
+ methodDescriptor_Scaffolder_Create);
+};
+
+
+module.exports = proto.spotify.backstage.scaffolder.v1;
+
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.d.ts b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.d.ts
index a04b41d40a..96ceaae85d 100644
--- a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.d.ts
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.d.ts
@@ -1,15 +1,12 @@
-// package: spotify.backstage.scaffolder.v1
-// file: scaffolder/v1/scaffolder.proto
+import * as jspb from "google-protobuf"
-import * as jspb from "google-protobuf";
-import * as identity_v1_identity_pb from "../../identity/v1/identity_pb";
+import * as identity_v1_identity_pb from '../../identity/v1/identity_pb';
+import * as google_protobuf_struct_pb from 'google-protobuf/google/protobuf/struct_pb';
export class Empty extends jspb.Message {
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Empty.AsObject;
static toObject(includeInstance: boolean, msg: Empty): Empty.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: Empty, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Empty;
static deserializeBinaryFromReader(message: Empty, reader: jspb.BinaryReader): Empty;
@@ -20,28 +17,80 @@ export namespace Empty {
}
}
-export class GetAllTemplatesResponse extends jspb.Message {
- clearTemplatesList(): void;
+export class ListTemplatesReply extends jspb.Message {
getTemplatesList(): Array;
setTemplatesList(value: Array): void;
+ clearTemplatesList(): void;
addTemplates(value?: Template, index?: number): Template;
serializeBinary(): Uint8Array;
- toObject(includeInstance?: boolean): GetAllTemplatesResponse.AsObject;
- static toObject(includeInstance: boolean, msg: GetAllTemplatesResponse): GetAllTemplatesResponse.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
- static serializeBinaryToWriter(message: GetAllTemplatesResponse, writer: jspb.BinaryWriter): void;
- static deserializeBinary(bytes: Uint8Array): GetAllTemplatesResponse;
- static deserializeBinaryFromReader(message: GetAllTemplatesResponse, reader: jspb.BinaryReader): GetAllTemplatesResponse;
+ toObject(includeInstance?: boolean): ListTemplatesReply.AsObject;
+ static toObject(includeInstance: boolean, msg: ListTemplatesReply): ListTemplatesReply.AsObject;
+ static serializeBinaryToWriter(message: ListTemplatesReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): ListTemplatesReply;
+ static deserializeBinaryFromReader(message: ListTemplatesReply, reader: jspb.BinaryReader): ListTemplatesReply;
}
-export namespace GetAllTemplatesResponse {
+export namespace ListTemplatesReply {
export type AsObject = {
templatesList: Array,
}
}
+export class CreateReply extends jspb.Message {
+ getComponentId(): string;
+ setComponentId(value: string): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CreateReply.AsObject;
+ static toObject(includeInstance: boolean, msg: CreateReply): CreateReply.AsObject;
+ static serializeBinaryToWriter(message: CreateReply, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): CreateReply;
+ static deserializeBinaryFromReader(message: CreateReply, reader: jspb.BinaryReader): CreateReply;
+}
+
+export namespace CreateReply {
+ export type AsObject = {
+ componentId: string,
+ }
+}
+
+export class CreateRequest extends jspb.Message {
+ getTemplateId(): string;
+ setTemplateId(value: string): void;
+
+ getOrg(): string;
+ setOrg(value: string): void;
+
+ getComponentId(): string;
+ setComponentId(value: string): void;
+
+ getPrivate(): boolean;
+ setPrivate(value: boolean): void;
+
+ getMetadata(): google_protobuf_struct_pb.Struct | undefined;
+ setMetadata(value?: google_protobuf_struct_pb.Struct): void;
+ hasMetadata(): boolean;
+ clearMetadata(): void;
+
+ serializeBinary(): Uint8Array;
+ toObject(includeInstance?: boolean): CreateRequest.AsObject;
+ static toObject(includeInstance: boolean, msg: CreateRequest): CreateRequest.AsObject;
+ static serializeBinaryToWriter(message: CreateRequest, writer: jspb.BinaryWriter): void;
+ static deserializeBinary(bytes: Uint8Array): CreateRequest;
+ static deserializeBinaryFromReader(message: CreateRequest, reader: jspb.BinaryReader): CreateRequest;
+}
+
+export namespace CreateRequest {
+ export type AsObject = {
+ templateId: string,
+ org: string,
+ componentId: string,
+ pb_private: boolean,
+ metadata?: google_protobuf_struct_pb.Struct.AsObject,
+ }
+}
+
export class Template extends jspb.Message {
getId(): string;
setId(value: string): void;
@@ -49,16 +98,17 @@ export class Template extends jspb.Message {
getName(): string;
setName(value: string): void;
- hasUser(): boolean;
- clearUser(): void;
+ getDescription(): string;
+ setDescription(value: string): void;
+
getUser(): identity_v1_identity_pb.User | undefined;
setUser(value?: identity_v1_identity_pb.User): void;
+ hasUser(): boolean;
+ clearUser(): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): Template.AsObject;
static toObject(includeInstance: boolean, msg: Template): Template.AsObject;
- static extensions: {[key: number]: jspb.ExtensionFieldInfo};
- static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo};
static serializeBinaryToWriter(message: Template, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): Template;
static deserializeBinaryFromReader(message: Template, reader: jspb.BinaryReader): Template;
@@ -68,6 +118,7 @@ export namespace Template {
export type AsObject = {
id: string,
name: string,
+ description: string,
user?: identity_v1_identity_pb.User.AsObject,
}
}
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js
new file mode 100644
index 0000000000..a210e84645
--- /dev/null
+++ b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb.js
@@ -0,0 +1,995 @@
+/**
+ * @fileoverview
+ * @enhanceable
+ * @suppress {messageConventions} JS Compiler reports an error if a variable or
+ * field starts with 'MSG_' and isn't a translatable message.
+ * @public
+ */
+// GENERATED CODE -- DO NOT EDIT!
+
+var jspb = require('google-protobuf');
+var goog = jspb;
+var global = Function('return this')();
+
+var identity_v1_identity_pb = require('../../identity/v1/identity_pb.js');
+goog.object.extend(proto, identity_v1_identity_pb);
+var google_protobuf_struct_pb = require('google-protobuf/google/protobuf/struct_pb.js');
+goog.object.extend(proto, google_protobuf_struct_pb);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.CreateReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.CreateRequest', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.Empty', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.ListTemplatesReply', null, global);
+goog.exportSymbol('proto.spotify.backstage.scaffolder.v1.Template', null, global);
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.Empty = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.Empty, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.Empty.displayName = 'proto.spotify.backstage.scaffolder.v1.Empty';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.repeatedFields_, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.ListTemplatesReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.displayName = 'proto.spotify.backstage.scaffolder.v1.ListTemplatesReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.CreateReply, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.CreateReply.displayName = 'proto.spotify.backstage.scaffolder.v1.CreateReply';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.CreateRequest, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.CreateRequest.displayName = 'proto.spotify.backstage.scaffolder.v1.CreateRequest';
+}
+/**
+ * Generated by JsPbCodeGenerator.
+ * @param {Array=} opt_data Optional initial data array, typically from a
+ * server response, or constructed directly in Javascript. The array is used
+ * in place and becomes part of the constructed object. It is not cloned.
+ * If no data is provided, the constructed object will be empty, but still
+ * valid.
+ * @extends {jspb.Message}
+ * @constructor
+ */
+proto.spotify.backstage.scaffolder.v1.Template = function(opt_data) {
+ jspb.Message.initialize(this, opt_data, 0, -1, null, null);
+};
+goog.inherits(proto.spotify.backstage.scaffolder.v1.Template, jspb.Message);
+if (goog.DEBUG && !COMPILED) {
+ /**
+ * @public
+ * @override
+ */
+ proto.spotify.backstage.scaffolder.v1.Template.displayName = 'proto.spotify.backstage.scaffolder.v1.Template';
+}
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.Empty.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.toObject = function(includeInstance, msg) {
+ var f, obj = {
+
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Empty}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.Empty;
+ return proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Empty}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.Empty.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Empty} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Empty.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+};
+
+
+
+/**
+ * List of repeated fields within this message type.
+ * @private {!Array}
+ * @const
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.repeatedFields_ = [1];
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.ListTemplatesReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ templatesList: jspb.Message.toObjectList(msg.getTemplatesList(),
+ proto.spotify.backstage.scaffolder.v1.Template.toObject, includeInstance)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.ListTemplatesReply}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.ListTemplatesReply;
+ return proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.ListTemplatesReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.ListTemplatesReply}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = new proto.spotify.backstage.scaffolder.v1.Template;
+ reader.readMessage(value,proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader);
+ msg.addTemplates(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.ListTemplatesReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getTemplatesList();
+ if (f.length > 0) {
+ writer.writeRepeatedMessage(
+ 1,
+ f,
+ proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * repeated Template templates = 1;
+ * @return {!Array}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.getTemplatesList = function() {
+ return /** @type{!Array} */ (
+ jspb.Message.getRepeatedWrapperField(this, proto.spotify.backstage.scaffolder.v1.Template, 1));
+};
+
+
+/** @param {!Array} value */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.setTemplatesList = function(value) {
+ jspb.Message.setRepeatedWrapperField(this, 1, value);
+};
+
+
+/**
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template=} opt_value
+ * @param {number=} opt_index
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.addTemplates = function(opt_value, opt_index) {
+ return jspb.Message.addToRepeatedWrapperField(this, 1, opt_value, proto.spotify.backstage.scaffolder.v1.Template, opt_index);
+};
+
+
+/**
+ * Clears the list making it empty but non-null.
+ */
+proto.spotify.backstage.scaffolder.v1.ListTemplatesReply.prototype.clearTemplatesList = function() {
+ this.setTemplatesList([]);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.CreateReply.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateReply} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ componentId: jspb.Message.getFieldWithDefault(msg, 1, "")
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.CreateReply}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.CreateReply;
+ return proto.spotify.backstage.scaffolder.v1.CreateReply.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateReply} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.CreateReply}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setComponentId(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.CreateReply.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateReply} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getComponentId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+};
+
+
+/**
+ * optional string component_id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateReply.prototype.getComponentId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.CreateReply.prototype.setComponentId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.CreateRequest.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ templateId: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ org: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ componentId: jspb.Message.getFieldWithDefault(msg, 3, ""),
+ pb_private: jspb.Message.getBooleanFieldWithDefault(msg, 4, false),
+ metadata: (f = msg.getMetadata()) && google_protobuf_struct_pb.Struct.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.CreateRequest}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.CreateRequest;
+ return proto.spotify.backstage.scaffolder.v1.CreateRequest.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.CreateRequest}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setTemplateId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setOrg(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setComponentId(value);
+ break;
+ case 4:
+ var value = /** @type {boolean} */ (reader.readBool());
+ msg.setPrivate(value);
+ break;
+ case 5:
+ var value = new google_protobuf_struct_pb.Struct;
+ reader.readMessage(value,google_protobuf_struct_pb.Struct.deserializeBinaryFromReader);
+ msg.setMetadata(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.CreateRequest.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.CreateRequest} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getTemplateId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getOrg();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getComponentId();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+ f = message.getPrivate();
+ if (f) {
+ writer.writeBool(
+ 4,
+ f
+ );
+ }
+ f = message.getMetadata();
+ if (f != null) {
+ writer.writeMessage(
+ 5,
+ f,
+ google_protobuf_struct_pb.Struct.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional string template_id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.getTemplateId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.setTemplateId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string org = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.getOrg = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.setOrg = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string component_id = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.getComponentId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.setComponentId = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional bool private = 4;
+ * @return {boolean}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.getPrivate = function() {
+ return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 4, false));
+};
+
+
+/** @param {boolean} value */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.setPrivate = function(value) {
+ jspb.Message.setProto3BooleanField(this, 4, value);
+};
+
+
+/**
+ * optional google.protobuf.Struct metadata = 5;
+ * @return {?proto.google.protobuf.Struct}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.getMetadata = function() {
+ return /** @type{?proto.google.protobuf.Struct} */ (
+ jspb.Message.getWrapperField(this, google_protobuf_struct_pb.Struct, 5));
+};
+
+
+/** @param {?proto.google.protobuf.Struct|undefined} value */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.setMetadata = function(value) {
+ jspb.Message.setWrapperField(this, 5, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.clearMetadata = function() {
+ this.setMetadata(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.scaffolder.v1.CreateRequest.prototype.hasMetadata = function() {
+ return jspb.Message.getField(this, 5) != null;
+};
+
+
+
+
+
+if (jspb.Message.GENERATE_TO_OBJECT) {
+/**
+ * Creates an object representation of this proto.
+ * Field names that are reserved in JavaScript and will be renamed to pb_name.
+ * Optional fields that are not set will be set to undefined.
+ * To access a reserved field use, foo.pb_, eg, foo.pb_default.
+ * For the list of reserved names please see:
+ * net/proto2/compiler/js/internal/generator.cc#kKeyword.
+ * @param {boolean=} opt_includeInstance Deprecated. whether to include the
+ * JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @return {!Object}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.toObject = function(opt_includeInstance) {
+ return proto.spotify.backstage.scaffolder.v1.Template.toObject(opt_includeInstance, this);
+};
+
+
+/**
+ * Static version of the {@see toObject} method.
+ * @param {boolean|undefined} includeInstance Deprecated. Whether to include
+ * the JSPB instance for transitional soy proto support:
+ * http://goto/soy-param-migration
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} msg The msg instance to transform.
+ * @return {!Object}
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Template.toObject = function(includeInstance, msg) {
+ var f, obj = {
+ id: jspb.Message.getFieldWithDefault(msg, 1, ""),
+ name: jspb.Message.getFieldWithDefault(msg, 2, ""),
+ description: jspb.Message.getFieldWithDefault(msg, 3, ""),
+ user: (f = msg.getUser()) && identity_v1_identity_pb.User.toObject(includeInstance, f)
+ };
+
+ if (includeInstance) {
+ obj.$jspbMessageInstance = msg;
+ }
+ return obj;
+};
+}
+
+
+/**
+ * Deserializes binary data (in protobuf wire format).
+ * @param {jspb.ByteSource} bytes The bytes to deserialize.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.deserializeBinary = function(bytes) {
+ var reader = new jspb.BinaryReader(bytes);
+ var msg = new proto.spotify.backstage.scaffolder.v1.Template;
+ return proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader(msg, reader);
+};
+
+
+/**
+ * Deserializes binary data (in protobuf wire format) from the
+ * given reader into the given message object.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} msg The message object to deserialize into.
+ * @param {!jspb.BinaryReader} reader The BinaryReader to use.
+ * @return {!proto.spotify.backstage.scaffolder.v1.Template}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.deserializeBinaryFromReader = function(msg, reader) {
+ while (reader.nextField()) {
+ if (reader.isEndGroup()) {
+ break;
+ }
+ var field = reader.getFieldNumber();
+ switch (field) {
+ case 1:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setId(value);
+ break;
+ case 2:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setName(value);
+ break;
+ case 3:
+ var value = /** @type {string} */ (reader.readString());
+ msg.setDescription(value);
+ break;
+ case 4:
+ var value = new identity_v1_identity_pb.User;
+ reader.readMessage(value,identity_v1_identity_pb.User.deserializeBinaryFromReader);
+ msg.setUser(value);
+ break;
+ default:
+ reader.skipField();
+ break;
+ }
+ }
+ return msg;
+};
+
+
+/**
+ * Serializes the message to binary data (in protobuf wire format).
+ * @return {!Uint8Array}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.serializeBinary = function() {
+ var writer = new jspb.BinaryWriter();
+ proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter(this, writer);
+ return writer.getResultBuffer();
+};
+
+
+/**
+ * Serializes the given message to binary data (in protobuf wire
+ * format), writing to the given BinaryWriter.
+ * @param {!proto.spotify.backstage.scaffolder.v1.Template} message
+ * @param {!jspb.BinaryWriter} writer
+ * @suppress {unusedLocalVariables} f is only used for nested messages
+ */
+proto.spotify.backstage.scaffolder.v1.Template.serializeBinaryToWriter = function(message, writer) {
+ var f = undefined;
+ f = message.getId();
+ if (f.length > 0) {
+ writer.writeString(
+ 1,
+ f
+ );
+ }
+ f = message.getName();
+ if (f.length > 0) {
+ writer.writeString(
+ 2,
+ f
+ );
+ }
+ f = message.getDescription();
+ if (f.length > 0) {
+ writer.writeString(
+ 3,
+ f
+ );
+ }
+ f = message.getUser();
+ if (f != null) {
+ writer.writeMessage(
+ 4,
+ f,
+ identity_v1_identity_pb.User.serializeBinaryToWriter
+ );
+ }
+};
+
+
+/**
+ * optional string id = 1;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getId = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setId = function(value) {
+ jspb.Message.setProto3StringField(this, 1, value);
+};
+
+
+/**
+ * optional string name = 2;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getName = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setName = function(value) {
+ jspb.Message.setProto3StringField(this, 2, value);
+};
+
+
+/**
+ * optional string description = 3;
+ * @return {string}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getDescription = function() {
+ return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, ""));
+};
+
+
+/** @param {string} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setDescription = function(value) {
+ jspb.Message.setProto3StringField(this, 3, value);
+};
+
+
+/**
+ * optional spotify.backstage.identity.v1.User user = 4;
+ * @return {?proto.spotify.backstage.identity.v1.User}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.getUser = function() {
+ return /** @type{?proto.spotify.backstage.identity.v1.User} */ (
+ jspb.Message.getWrapperField(this, identity_v1_identity_pb.User, 4));
+};
+
+
+/** @param {?proto.spotify.backstage.identity.v1.User|undefined} value */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.setUser = function(value) {
+ jspb.Message.setWrapperField(this, 4, value);
+};
+
+
+/**
+ * Clears the message field making it undefined.
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.clearUser = function() {
+ this.setUser(undefined);
+};
+
+
+/**
+ * Returns whether this field is set.
+ * @return {boolean}
+ */
+proto.spotify.backstage.scaffolder.v1.Template.prototype.hasUser = function() {
+ return jspb.Message.getField(this, 4) != null;
+};
+
+
+goog.object.extend(exports, proto.spotify.backstage.scaffolder.v1);
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.d.ts b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.d.ts
deleted file mode 100644
index a32d1ebb96..0000000000
--- a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.d.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-// package: spotify.backstage.scaffolder.v1
-// file: scaffolder/v1/scaffolder.proto
-
-import * as scaffolder_v1_scaffolder_pb from "../../scaffolder/v1/scaffolder_pb";
-import {grpc} from "@improbable-eng/grpc-web";
-
-type ScaffolderGetAllTemplates = {
- readonly methodName: string;
- readonly service: typeof Scaffolder;
- readonly requestStream: false;
- readonly responseStream: false;
- readonly requestType: typeof scaffolder_v1_scaffolder_pb.Empty;
- readonly responseType: typeof scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse;
-};
-
-export class Scaffolder {
- static readonly serviceName: string;
- static readonly GetAllTemplates: ScaffolderGetAllTemplates;
-}
-
-export type ServiceError = { message: string, code: number; metadata: grpc.Metadata }
-export type Status = { details: string, code: number; metadata: grpc.Metadata }
-
-interface UnaryResponse {
- cancel(): void;
-}
-interface ResponseStream {
- cancel(): void;
- on(type: 'data', handler: (message: T) => void): ResponseStream;
- on(type: 'end', handler: (status?: Status) => void): ResponseStream;
- on(type: 'status', handler: (status: Status) => void): ResponseStream;
-}
-interface RequestStream {
- write(message: T): RequestStream;
- end(): void;
- cancel(): void;
- on(type: 'end', handler: (status?: Status) => void): RequestStream;
- on(type: 'status', handler: (status: Status) => void): RequestStream;
-}
-interface BidirectionalStream {
- write(message: ReqT): BidirectionalStream;
- end(): void;
- cancel(): void;
- on(type: 'data', handler: (message: ResT) => void): BidirectionalStream;
- on(type: 'end', handler: (status?: Status) => void): BidirectionalStream;
- on(type: 'status', handler: (status: Status) => void): BidirectionalStream;
-}
-
-export class ScaffolderClient {
- readonly serviceHost: string;
-
- constructor(serviceHost: string, options?: grpc.RpcOptions);
- getAllTemplates(
- requestMessage: scaffolder_v1_scaffolder_pb.Empty,
- metadata: grpc.Metadata,
- callback: (error: ServiceError|null, responseMessage: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse|null) => void
- ): UnaryResponse;
- getAllTemplates(
- requestMessage: scaffolder_v1_scaffolder_pb.Empty,
- callback: (error: ServiceError|null, responseMessage: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse|null) => void
- ): UnaryResponse;
-}
-
diff --git a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.js b/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.js
deleted file mode 100644
index cc186c2087..0000000000
--- a/frontend/packages/proto/src/generated/scaffolder/v1/scaffolder_pb_service.js
+++ /dev/null
@@ -1,61 +0,0 @@
-// package: spotify.backstage.scaffolder.v1
-// file: scaffolder/v1/scaffolder.proto
-
-var scaffolder_v1_scaffolder_pb = require("../../scaffolder/v1/scaffolder_pb");
-var grpc = require("@improbable-eng/grpc-web").grpc;
-
-var Scaffolder = (function () {
- function Scaffolder() {}
- Scaffolder.serviceName = "spotify.backstage.scaffolder.v1.Scaffolder";
- return Scaffolder;
-}());
-
-Scaffolder.GetAllTemplates = {
- methodName: "GetAllTemplates",
- service: Scaffolder,
- requestStream: false,
- responseStream: false,
- requestType: scaffolder_v1_scaffolder_pb.Empty,
- responseType: scaffolder_v1_scaffolder_pb.GetAllTemplatesResponse
-};
-
-exports.Scaffolder = Scaffolder;
-
-function ScaffolderClient(serviceHost, options) {
- this.serviceHost = serviceHost;
- this.options = options || {};
-}
-
-ScaffolderClient.prototype.getAllTemplates = function getAllTemplates(requestMessage, metadata, callback) {
- if (arguments.length === 2) {
- callback = arguments[1];
- }
- var client = grpc.unary(Scaffolder.GetAllTemplates, {
- request: requestMessage,
- host: this.serviceHost,
- metadata: metadata,
- transport: this.options.transport,
- debug: this.options.debug,
- onEnd: function (response) {
- if (callback) {
- if (response.status !== grpc.Code.OK) {
- var err = new Error(response.statusMessage);
- err.code = response.status;
- err.metadata = response.trailers;
- callback(err, null);
- } else {
- callback(null, response.message);
- }
- }
- }
- });
- return {
- cancel: function () {
- callback = null;
- client.close();
- }
- };
-};
-
-exports.ScaffolderClient = ScaffolderClient;
-
diff --git a/frontend/packages/proto/src/identityv1.ts b/frontend/packages/proto/src/identityv1.ts
new file mode 100644
index 0000000000..a64ecab2a5
--- /dev/null
+++ b/frontend/packages/proto/src/identityv1.ts
@@ -0,0 +1,2 @@
+export { IdentityPromiseClient as Client } from './generated/identity/v1/identity_grpc_web_pb';
+export * from './generated/identity/v1/identity_pb';
diff --git a/frontend/packages/proto/src/index.ts b/frontend/packages/proto/src/index.ts
new file mode 100644
index 0000000000..caa5fe7c3d
--- /dev/null
+++ b/frontend/packages/proto/src/index.ts
@@ -0,0 +1,6 @@
+import * as buildsV1 from './buildsv1';
+import * as identityV1 from './identityv1';
+import * as inventoryV1 from './inventoryv1';
+import * as scaffolderV1 from './scaffolderv1';
+
+export { buildsV1, identityV1, inventoryV1, scaffolderV1 };
diff --git a/frontend/packages/proto/src/inventoryv1.ts b/frontend/packages/proto/src/inventoryv1.ts
new file mode 100644
index 0000000000..92c628a1dc
--- /dev/null
+++ b/frontend/packages/proto/src/inventoryv1.ts
@@ -0,0 +1,2 @@
+export { InventoryPromiseClient as Client } from './generated/inventory/v1/inventory_grpc_web_pb';
+export * from './generated/inventory/v1/inventory_pb';
diff --git a/frontend/packages/proto/src/scaffolderv1.ts b/frontend/packages/proto/src/scaffolderv1.ts
new file mode 100644
index 0000000000..47c1d48489
--- /dev/null
+++ b/frontend/packages/proto/src/scaffolderv1.ts
@@ -0,0 +1,2 @@
+export { ScaffolderPromiseClient as Client } from './generated/scaffolder/v1/scaffolder_grpc_web_pb';
+export * from './generated/scaffolder/v1/scaffolder_pb';
diff --git a/frontend/yarn.lock b/frontend/yarn.lock
index 16fe8b2055..654452f794 100644
--- a/frontend/yarn.lock
+++ b/frontend/yarn.lock
@@ -2375,10 +2375,10 @@
once "^1.4.0"
universal-user-agent "^4.0.0"
-"@octokit/rest@^16.27.0", "@octokit/rest@^16.28.4":
- version "16.43.0"
- resolved "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.0.tgz#519ac030b5c3604afde6550720ff56513aee32aa"
- integrity sha512-u+OwrTxHuppVcssGmwCmb4jgPNzsRseJ2rS5PrZk2ASC+WkaF5Q7wu8zVtJ4OA24jK6aRymlwA2uwL36NU9nAA==
+"@octokit/rest@^16.28.4", "@octokit/rest@^16.43.0":
+ version "16.43.1"
+ resolved "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b"
+ integrity sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==
dependencies:
"@octokit/auth-token" "^2.4.0"
"@octokit/plugin-paginate-rest" "^1.1.1"
@@ -2490,11 +2490,11 @@
integrity sha512-9Tj/qn+y2j+sjCI3Jd+qseGtHjOAeg7dU2/lVcqIQ9TV3QDaDXDYXcoOHU+7o2Hwh8L8ymL4gfuO7KxDs3q2zg==
"@semantic-release/github@^7.0.0":
- version "7.0.1"
- resolved "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.1.tgz#16fdd37c9f65e3e3801d0d15a0aab1cf08ecb608"
- integrity sha512-V3PWdsUL1h69BT6QCBVq1Eh7n2g/EfBVAeEx8agc4tEFIKzpHhhaUrrsLltZoZvgPoPZTCxUxSPbkzhAWKOGFw==
+ version "7.0.2"
+ resolved "https://registry.npmjs.org/@semantic-release/github/-/github-7.0.2.tgz#5f036bc66bf27019b03ee1f04722c3dbfa4155da"
+ integrity sha512-WD9cIsBxKV8U/zisBxp/YZRYmU9TBs/GNlnE1/3Levs5Kyeb5/IwOKw96LP4HY92xudsKPhBCkpmnGwn6sELGg==
dependencies:
- "@octokit/rest" "^16.27.0"
+ "@octokit/rest" "^16.43.0"
"@semantic-release/error" "^2.2.0"
aggregate-error "^3.0.0"
bottleneck "^2.18.1"
@@ -2883,9 +2883,9 @@
jest-diff "^24.3.0"
"@types/jest@^25.1.0":
- version "25.1.1"
- resolved "https://registry.npmjs.org/@types/jest/-/jest-25.1.1.tgz#dcf65a8ee315b91ad39c0d358ae0ddc5602ab0e9"
- integrity sha512-bKSZJYZJLzwaoVYNN4W3A0RvKNYsrLm5tsuXaMlfYDxKf4gY2sFrMYneCugNQWGg1gjPW+FHBwNrwPzEi4sIsw==
+ version "25.1.2"
+ resolved "https://registry.npmjs.org/@types/jest/-/jest-25.1.2.tgz#1c4c8770c27906c7d8def5d2033df9dbd39f60da"
+ integrity sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==
dependencies:
jest-diff "^25.1.0"
pretty-format "^25.1.0"
@@ -3024,39 +3024,39 @@
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
"@typescript-eslint/eslint-plugin@^2.14.0", "@typescript-eslint/eslint-plugin@^2.8.0":
- version "2.18.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.18.0.tgz#f8cf272dfb057ecf1ea000fea1e0b3f06a32f9cb"
- integrity sha512-kuO8WQjV+RCZvAXVRJfXWiJ8iYEtfHlKgcqqqXg9uUkIolEHuUaMmm8/lcO4xwCOtaw6mY0gStn2Lg4/eUXXYQ==
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.19.0.tgz#bf743448a4633e4b52bee0c40148ba072ab3adbd"
+ integrity sha512-u7IcQ9qwsB6U806LupZmINRnQjC+RJyv36sV/ugaFWMHTbFm/hlLTRx3gGYJgHisxcGSTnf+I/fPDieRMhPSQQ==
dependencies:
- "@typescript-eslint/experimental-utils" "2.18.0"
+ "@typescript-eslint/experimental-utils" "2.19.0"
eslint-utils "^1.4.3"
functional-red-black-tree "^1.0.1"
regexpp "^3.0.0"
tsutils "^3.17.1"
-"@typescript-eslint/experimental-utils@2.18.0", "@typescript-eslint/experimental-utils@^2.5.0":
- version "2.18.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.18.0.tgz#e4eab839082030282496c1439bbf9fdf2a4f3da8"
- integrity sha512-J6MopKPHuJYmQUkANLip7g9I82ZLe1naCbxZZW3O2sIxTiq/9YYoOELEKY7oPg0hJ0V/AQ225h2z0Yp+RRMXhw==
+"@typescript-eslint/experimental-utils@2.19.0", "@typescript-eslint/experimental-utils@^2.5.0":
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-2.19.0.tgz#d5ca732f22c009e515ba09fcceb5f2127d841568"
+ integrity sha512-zwpg6zEOPbhB3+GaQfufzlMUOO6GXCNZq6skk+b2ZkZAIoBhVoanWK255BS1g5x9bMwHpLhX0Rpn5Fc3NdCZdg==
dependencies:
"@types/json-schema" "^7.0.3"
- "@typescript-eslint/typescript-estree" "2.18.0"
+ "@typescript-eslint/typescript-estree" "2.19.0"
eslint-scope "^5.0.0"
"@typescript-eslint/parser@^2.14.0", "@typescript-eslint/parser@^2.8.0":
- version "2.18.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.18.0.tgz#d5f7fc1839abd4a985394e40e9d2454bd56aeb1f"
- integrity sha512-SJJPxFMEYEWkM6pGfcnjLU+NJIPo+Ko1QrCBL+i0+zV30ggLD90huEmMMhKLHBpESWy9lVEeWlQibweNQzyc+A==
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-2.19.0.tgz#912160d9425395d09857dcd5382352bc98be11ae"
+ integrity sha512-s0jZoxAWjHnuidbbN7aA+BFVXn4TCcxEVGPV8lWMxZglSs3NRnFFAlL+aIENNmzB2/1jUJuySi6GiM6uACPmpg==
dependencies:
"@types/eslint-visitor-keys" "^1.0.0"
- "@typescript-eslint/experimental-utils" "2.18.0"
- "@typescript-eslint/typescript-estree" "2.18.0"
+ "@typescript-eslint/experimental-utils" "2.19.0"
+ "@typescript-eslint/typescript-estree" "2.19.0"
eslint-visitor-keys "^1.1.0"
-"@typescript-eslint/typescript-estree@2.18.0":
- version "2.18.0"
- resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.18.0.tgz#cfbd16ed1b111166617d718619c19b62764c8460"
- integrity sha512-gVHylf7FDb8VSi2ypFuEL3hOtoC4HkZZ5dOjXvVjoyKdRrvXAOPSzpNRnKMfaUUEiSLP8UF9j9X9EDLxC0lfZg==
+"@typescript-eslint/typescript-estree@2.19.0":
+ version "2.19.0"
+ resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-2.19.0.tgz#6bd7310b9827e04756fe712909f26956aac4b196"
+ integrity sha512-n6/Xa37k0jQdwpUszffi19AlNbVCR0sdvCs3DmSKMD7wBttKY31lhD2fug5kMD91B2qW4mQldaTEc1PEzvGu8w==
dependencies:
debug "^4.1.1"
eslint-visitor-keys "^1.1.0"
@@ -4410,9 +4410,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001020, caniuse-lite@^1.0.30001023:
- version "1.0.30001023"
- resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001023.tgz#b82155827f3f5009077bdd2df3d8968bcbcc6fc4"
- integrity sha512-C5TDMiYG11EOhVOA62W1p3UsJ2z4DsHtMBQtjzp3ZsUglcQn62WOUgW0y795c7A5uZ+GCEIvzkMatLIlAsbNTA==
+ version "1.0.30001025"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz#30336a8aca7f98618eb3cf38e35184e13d4e5fe6"
+ integrity sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==
capture-exit@^2.0.0:
version "2.0.0"
@@ -4699,9 +4699,9 @@ clone@^1.0.2:
integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4=
clsx@^1.0.2:
- version "1.0.4"
- resolved "https://registry.npmjs.org/clsx/-/clsx-1.0.4.tgz#0c0171f6d5cb2fe83848463c15fcc26b4df8c2ec"
- integrity sha512-1mQ557MIZTrL/140j+JVdRM6e31/OA4vTYxXgqIIZlndyfjHpyawKZia1Im05Vp9BWmImkcNrNtFYQMyFcgJDg==
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/clsx/-/clsx-1.1.0.tgz#62937c6adfea771247c34b54d320fb99624f5702"
+ integrity sha512-3avwM37fSK5oP6M5rQ9CNe99lwxhXDOeSWVPAOYF6OazUTgZCMb0yWlJpmdD74REy1gkEaFiub2ULv4fq9GUhA==
cmd-shim@^3.0.0, cmd-shim@^3.0.3:
version "3.0.3"
@@ -5671,14 +5671,14 @@ debug@4, debug@^4.0.0, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1:
dependencies:
ms "^2.1.1"
-debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5:
+debug@^3.0.0, debug@^3.1.0, debug@^3.1.1, debug@^3.2.5, debug@^3.2.6:
version "3.2.6"
resolved "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz#e83d17de16d8a7efb7717edbe5fb10135eee629b"
integrity sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==
dependencies:
ms "^2.1.1"
-debuglog@^1.0.1:
+debuglog@*, debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
integrity sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=
@@ -5833,6 +5833,11 @@ detect-indent@^5.0.0, detect-indent@~5.0.0:
resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-5.0.0.tgz#3871cc0a6a002e8c3e5b3cf7f336264675f06b9d"
integrity sha1-OHHMCmoALow+Wzz38zYmRnXwa50=
+detect-libc@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+ integrity sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=
+
detect-newline@^2.1.0:
version "2.1.0"
resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
@@ -6090,9 +6095,9 @@ ee-first@1.1.1:
integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=
electron-to-chromium@^1.3.341:
- version "1.3.344"
- resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.344.tgz#f1397a633c35e726730c24be1084cd25c3ee8148"
- integrity sha512-tvbx2Wl8WBR+ym3u492D0L6/jH+8NoQXqe46+QhbWH3voVPauGuZYeb1QAXYoOAWuiP2dbSvlBx0kQ1F3hu/Mw==
+ version "1.3.345"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz#2569d0d54a64ef0f32a4b7e8c80afa5fe57c5d98"
+ integrity sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==
elegant-spinner@^1.0.1:
version "1.0.1"
@@ -6289,9 +6294,9 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
escodegen@^1.11.0, escodegen@^1.11.1, escodegen@^1.9.1:
- version "1.13.0"
- resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.13.0.tgz#c7adf9bd3f3cc675bb752f202f79a720189cab29"
- integrity sha512-eYk2dCkxR07DsHA/X2hRBj0CFAZeri/LyDMc0C8JT1Hqi6JnVpMhJ7XFITbb0+yZS3lVkaPL2oCkZ3AVmeVbMw==
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz#ba01d0c8278b5e95a9a45350142026659027a457"
+ integrity sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==
dependencies:
esprima "^4.0.1"
estraverse "^4.2.0"
@@ -7578,11 +7583,6 @@ globby@^9.2.0:
slash "^2.0.0"
google-protobuf@^3.11.2:
- version "3.11.2"
- resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.2.tgz#43272974521a5cec35a21f62730cf517a5a8e38c"
- integrity sha512-T4fin7lcYLUPj2ChUZ4DvfuuHtg3xi1621qeRZt2J7SvOQusOzq+sDT4vbotWTCjUXJoR36CA016LlhtPy80uQ==
-
-google-protobuf@^3.6.1:
version "3.11.3"
resolved "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.3.tgz#660977f5de29cc8f647172a170602887102fa677"
integrity sha512-Sp8E+0AJLxmiPwAk9VH3MkYAmYYheNUhywIyXOS7wvRkqbIYcHtGzJzIYicNqYsqgKmY35F9hxRkI+ZTqTB4Tg==
@@ -7638,9 +7638,9 @@ handle-thing@^2.0.0:
integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
handlebars@^4.4.0:
- version "4.7.2"
- resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7"
- integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw==
+ version "4.7.3"
+ resolved "https://registry.npmjs.org/handlebars/-/handlebars-4.7.3.tgz#8ece2797826886cf8082d1726ff21d2a022550ee"
+ integrity sha512-SRGwSYuNfx8DwHD/6InAPzD6RgeruWLT+B8e8a7gGs8FWgHzlExpTFMEq2IA6QpAfOClpKHy6+8IqTjeBCu6Kg==
dependencies:
neo-async "^2.6.0"
optimist "^0.6.1"
@@ -8022,7 +8022,7 @@ hyphenate-style-name@^1.0.2, hyphenate-style-name@^1.0.3:
resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.3.tgz#097bb7fa0b8f1a9cf0bd5c734cf95899981a9b48"
integrity sha512-EcuixamT82oplpoJ2XU4pDtKGWQ7b00CD9f1ug9IaQ3p1bkHMiKCZ9ut9QDI6qsa6cpUuB+A/I+zLtdNK4n2DQ==
-iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@~0.4.13:
+iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4, iconv-lite@~0.4.13:
version "0.4.24"
resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
@@ -8143,7 +8143,7 @@ import-local@^3.0.2:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
-imurmurhash@^0.1.4:
+imurmurhash@*, imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
integrity sha1-khi5srkoojixPcT7a21XbyMUU+o=
@@ -10347,6 +10347,11 @@ lockfile@^1.0.4:
dependencies:
signal-exit "^3.0.2"
+lodash._baseindexof@*:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/lodash._baseindexof/-/lodash._baseindexof-3.1.0.tgz#fe52b53a1c6761e42618d654e4a25789ed61822c"
+ integrity sha1-/lK1OhxnYeQmGNZU5KJXie1hgiw=
+
lodash._baseuniq@~4.6.0:
version "4.6.0"
resolved "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz#0ebb44e456814af7905c6212fa2c9b2d51b841e8"
@@ -10355,11 +10360,33 @@ lodash._baseuniq@~4.6.0:
lodash._createset "~4.0.0"
lodash._root "~3.0.0"
+lodash._bindcallback@*:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e"
+ integrity sha1-5THCdkTPi1epnhftlbNcdIeJOS4=
+
+lodash._cacheindexof@*:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/lodash._cacheindexof/-/lodash._cacheindexof-3.0.2.tgz#3dc69ac82498d2ee5e3ce56091bafd2adc7bde92"
+ integrity sha1-PcaayCSY0u5ePOVgkbr9Ktx73pI=
+
+lodash._createcache@*:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/lodash._createcache/-/lodash._createcache-3.1.2.tgz#56d6a064017625e79ebca6b8018e17440bdcf093"
+ integrity sha1-VtagZAF2JeeevKa4AY4XRAvc8JM=
+ dependencies:
+ lodash._getnative "^3.0.0"
+
lodash._createset@~4.0.0:
version "4.0.3"
resolved "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz#0f4659fbb09d75194fa9e2b88a6644d363c9fe26"
integrity sha1-D0ZZ+7CddRlPqeK4imZE02PJ/iY=
+lodash._getnative@*, lodash._getnative@^3.0.0:
+ version "3.9.1"
+ resolved "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5"
+ integrity sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=
+
lodash._reinterpolate@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d"
@@ -10415,6 +10442,11 @@ lodash.memoize@4.x, lodash.memoize@^4.1.2:
resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+lodash.restparam@*:
+ version "3.6.1"
+ resolved "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805"
+ integrity sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=
+
lodash.set@^4.3.2:
version "4.3.2"
resolved "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23"
@@ -11143,6 +11175,15 @@ natural-compare@^1.4.0:
resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=
+needle@^2.2.1:
+ version "2.3.2"
+ resolved "https://registry.npmjs.org/needle/-/needle-2.3.2.tgz#3342dea100b7160960a450dc8c22160ac712a528"
+ integrity sha512-DUzITvPVDUy6vczKKYTnWc/pBZ0EnjMJnQ3y+Jo5zfKFimJs7S3HFCxCRZYB9FUZcrzUQr3WsmvZgddMEIZv6w==
+ dependencies:
+ debug "^3.2.6"
+ iconv-lite "^0.4.4"
+ sax "^1.2.4"
+
negotiator@0.6.2:
version "0.6.2"
resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb"
@@ -11210,9 +11251,9 @@ node-forge@0.9.0:
integrity sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==
node-gyp@^5.0.2, node-gyp@^5.0.7:
- version "5.0.7"
- resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.0.7.tgz#dd4225e735e840cf2870e4037c2ed9c28a31719e"
- integrity sha512-K8aByl8OJD51V0VbUURTKsmdswkQQusIvlvmTyhHlIT1hBvaSxzdxpSle857XuXa7uc02UEZx9OR5aDxSWS5Qw==
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-5.1.0.tgz#8e31260a7af4a2e2f994b0673d4e0b3866156332"
+ integrity sha512-OUTryc5bt/P8zVgNUmC6xdXiDJxLMAW8cF5tLQOT9E5sOQj+UeQxnnPy74K3CLCa/SOjjBlbuzDLR8ANwA+wmw==
dependencies:
env-paths "^2.2.0"
glob "^7.1.4"
@@ -11287,10 +11328,26 @@ node-notifier@^6.0.0:
shellwords "^0.1.1"
which "^1.3.1"
+node-pre-gyp@*:
+ version "0.14.0"
+ resolved "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.14.0.tgz#9a0596533b877289bcad4e143982ca3d904ddc83"
+ integrity sha512-+CvDC7ZttU/sSt9rFjix/P05iS43qHCOOGzcr3Ry99bXG7VX953+vFyEuph/tfqoYu8dttBkE86JSKBO2OzcxA==
+ dependencies:
+ detect-libc "^1.0.2"
+ mkdirp "^0.5.1"
+ needle "^2.2.1"
+ nopt "^4.0.1"
+ npm-packlist "^1.1.6"
+ npmlog "^4.0.2"
+ rc "^1.2.7"
+ rimraf "^2.6.1"
+ semver "^5.3.0"
+ tar "^4.4.2"
+
node-releases@^1.1.47:
- version "1.1.47"
- resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.47.tgz#c59ef739a1fd7ecbd9f0b7cf5b7871e8a8b591e4"
- integrity sha512-k4xjVPx5FpwBUj0Gw7uvFOTF4Ep8Hok1I6qjwL3pLfwe7Y0REQSAqOwwv9TWBCUtMHxcXfY4PgRLRozcChvTcA==
+ version "1.1.48"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-1.1.48.tgz#7f647f0c453a0495bcd64cbd4778c26035c2f03a"
+ integrity sha512-Hr8BbmUl1ujAST0K0snItzEA5zkJTQup8VNTKNfT6Zw8vTJkIiagUPNfxHmgDOyfFYNfKAul40sD0UEYTvwebw==
dependencies:
semver "^6.3.0"
@@ -11415,7 +11472,7 @@ npm-normalize-package-bin@^1.0.0, npm-normalize-package-bin@^1.0.1:
semver "^5.6.0"
validate-npm-package-name "^3.0.0"
-npm-packlist@^1.1.12, npm-packlist@^1.4.4, npm-packlist@^1.4.7:
+npm-packlist@^1.1.12, npm-packlist@^1.1.6, npm-packlist@^1.4.4, npm-packlist@^1.4.7:
version "1.4.8"
resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz#56ee6cc135b9f98ad3d51c1c95da22bbb9b2ef3e"
integrity sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==
@@ -11595,7 +11652,7 @@ npm@^6.10.3:
worker-farm "^1.7.0"
write-file-atomic "^2.4.3"
-npmlog@^4.1.2, npmlog@~4.1.2:
+npmlog@^4.0.2, npmlog@^4.1.2, npmlog@~4.1.2:
version "4.1.2"
resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b"
integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
@@ -13398,7 +13455,7 @@ rc-progress@^2.5.2:
babel-runtime "6.x"
prop-types "^15.5.8"
-rc@^1.0.1, rc@^1.1.6, rc@^1.2.8:
+rc@^1.0.1, rc@^1.1.6, rc@^1.2.7, rc@^1.2.8:
version "1.2.8"
resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==
@@ -14117,9 +14174,9 @@ resolve@1.12.2:
path-parse "^1.0.6"
resolve@1.x, resolve@^1.1.6, resolve@^1.10.0, resolve@^1.11.0, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.3.2, resolve@^1.8.1:
- version "1.15.0"
- resolved "https://registry.npmjs.org/resolve/-/resolve-1.15.0.tgz#1b7ca96073ebb52e741ffd799f6b39ea462c67f5"
- integrity sha512-+hTmAldEGE80U2wJJDC1lebb5jWqvTYAfm3YZ1ckk1gBr0MnCqUKlwK1e+anaFljIl+F5tR5IoZcm4ZDA1zMQw==
+ version "1.15.1"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.15.1.tgz#27bdcdeffeaf2d6244b95bb0f9f4b4653451f3e8"
+ integrity sha512-84oo6ZTtoTUpjgNEr5SJyzQhzL72gaRodsSfyxC/AXRvwu0Yse9H8eF9IpGo7b8YetZhlI6v7ZQ6bKBFV/6S7w==
dependencies:
path-parse "^1.0.6"
@@ -14194,7 +14251,7 @@ rimraf@2.6.3:
dependencies:
glob "^7.1.3"
-rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
+rimraf@^2.5.2, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2, rimraf@^2.6.3, rimraf@^2.7.1:
version "2.7.1"
resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@@ -14419,7 +14476,7 @@ semver-regex@^2.0.0:
resolved "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz#a93c2c5844539a770233379107b38c7b4ac9d338"
integrity sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==
-"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
+"semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@^2.3.0 || 3.x || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1:
version "5.7.1"
resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7"
integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
@@ -15381,7 +15438,7 @@ tapable@^1.0.0, tapable@^1.1.0, tapable@^1.1.3:
resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
-tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.8:
+tar@^4.4.10, tar@^4.4.12, tar@^4.4.13, tar@^4.4.2, tar@^4.4.8:
version "4.4.13"
resolved "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz#43b364bc52888d555298637b10d60790254ab525"
integrity sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==
@@ -15710,9 +15767,9 @@ ts-easing@^0.2.0:
integrity sha512-Z86EW+fFFh/IFB1fqQ3/+7Zpf9t2ebOAxNI/V6Wo7r5gqiqtxmgTlQ1qbqQcjLKYeSHPTsEmvlJUDg/EuL0uHQ==
ts-jest@^25.0.0:
- version "25.1.0"
- resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-25.1.0.tgz#06e776c4cce8a4da8eec4945f36a5823d0c0f9ba"
- integrity sha512-1Lf576ulKhbxX5og+tG8udVg/5cgcMLPBxp1iCqbbf6VvUK4gEsgAtzMjl8u98izhLrzKMPB0LxCBKEZ5l19Hw==
+ version "25.2.0"
+ resolved "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.0.tgz#dfd87c2b71ef4867f5a0a44f40cb9c67e02991ac"
+ integrity sha512-VaRdb0da46eorLfuHEFf0G3d+jeREcV+Wb/SvW71S4y9Oe8SHWU+m1WY/3RaMknrBsnvmVH0/rRjT8dkgeffNQ==
dependencies:
bs-logger "0.x"
buffer-from "1.x"
@@ -15730,13 +15787,6 @@ ts-pnp@1.1.5, ts-pnp@^1.1.2:
resolved "https://registry.npmjs.org/ts-pnp/-/ts-pnp-1.1.5.tgz#840e0739c89fce5f3abd9037bb091dbff16d9dec"
integrity sha512-ti7OGMOUOzo66wLF3liskw6YQIaSsBgc4GOAlWRnIEj8htCxJUxskanMUoJOD6MDCRAXo36goXJZch+nOS0VMA==
-ts-protoc-gen@^0.12.0:
- version "0.12.0"
- resolved "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz#932e5738f14b67e7202825b06f8c548cb7d8ef34"
- integrity sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==
- dependencies:
- google-protobuf "^3.6.1"
-
tslib@^1.10.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
@@ -15842,9 +15892,9 @@ uglify-js@3.4.x:
source-map "~0.6.1"
uglify-js@^3.1.4:
- version "3.7.6"
- resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.6.tgz#0783daa867d4bc962a37cc92f67f6e3238c47485"
- integrity sha512-yYqjArOYSxvqeeiYH2VGjZOqq6SVmhxzaPjJC1W2F9e+bqvFL9QXQ2osQuKUFjM2hGjKG2YclQnRKWQSt/nOTQ==
+ version "3.7.7"
+ resolved "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz#21e52c7dccda80a53bf7cde69628a7e511aec9c9"
+ integrity sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==
dependencies:
commander "~2.20.3"
source-map "~0.6.1"
@@ -16177,9 +16227,9 @@ w3c-xmlserializer@^1.1.2:
xml-name-validator "^3.0.0"
wait-for-expect@^3.0.0:
- version "3.0.1"
- resolved "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.1.tgz#ec204a76b0038f17711e575720aaf28505ac7185"
- integrity sha512-3Ha7lu+zshEG/CeHdcpmQsZnnZpPj/UsG3DuKO8FskjuDbkx3jE3845H+CuwZjA2YWYDfKMU2KhnCaXMLd3wVw==
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/wait-for-expect/-/wait-for-expect-3.0.2.tgz#d2f14b2f7b778c9b82144109c8fa89ceaadaa463"
+ integrity sha512-cfS1+DZxuav1aBYbaO/kE06EOS8yRw7qOFoD3XtjTkYvCvh3zUvNST8DXK/nPaeqIzIv3P3kL3lRJn8iwOiSag==
walker@^1.0.7, walker@~1.0.5:
version "1.0.7"
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000000..7f0e501513
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,1892 @@
+{
+ "requires": true,
+ "lockfileVersion": 1,
+ "dependencies": {
+ "ansi-bgblack": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgblack/-/ansi-bgblack-0.1.1.tgz",
+ "integrity": "sha1-poulAHiHcBtqr74/oNrf36juPKI=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgblue": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgblue/-/ansi-bgblue-0.1.1.tgz",
+ "integrity": "sha1-Z73ATtybm1J4lp2hlt6j11yMNhM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgcyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgcyan/-/ansi-bgcyan-0.1.1.tgz",
+ "integrity": "sha1-WEiUJWAL3p9VBwaN2Wnr/bUP52g=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bggreen": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bggreen/-/ansi-bggreen-0.1.1.tgz",
+ "integrity": "sha1-TjGRJIUplD9DIelr8THRwTgWr0k=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgmagenta": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgmagenta/-/ansi-bgmagenta-0.1.1.tgz",
+ "integrity": "sha1-myhDLAduqpmUGGcqPvvhk5HCx6E=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgred": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgred/-/ansi-bgred-0.1.1.tgz",
+ "integrity": "sha1-p2+Sg4OCukMpCmwXeEJPmE1vEEE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgwhite": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgwhite/-/ansi-bgwhite-0.1.1.tgz",
+ "integrity": "sha1-ZQRlE3elim7OzQMxmU5IAljhG6g=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bgyellow": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bgyellow/-/ansi-bgyellow-0.1.1.tgz",
+ "integrity": "sha1-w/4usIzUdmSAKeaHTRWgs49h1E8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-black": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-black/-/ansi-black-0.1.1.tgz",
+ "integrity": "sha1-9hheiJNgslRaHsUMC/Bj/EMDJFM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-blue": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-blue/-/ansi-blue-0.1.1.tgz",
+ "integrity": "sha1-FbgEmQ6S/JyoxUds6PaZd3wh7b8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-bold": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-bold/-/ansi-bold-0.1.1.tgz",
+ "integrity": "sha1-PmOVCvWswq4uZw5vZ96xFdGl9QU=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-colors": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-0.2.0.tgz",
+ "integrity": "sha1-csMd4qDZoszQysMMyYI+6y9kNLU=",
+ "requires": {
+ "ansi-bgblack": "^0.1.1",
+ "ansi-bgblue": "^0.1.1",
+ "ansi-bgcyan": "^0.1.1",
+ "ansi-bggreen": "^0.1.1",
+ "ansi-bgmagenta": "^0.1.1",
+ "ansi-bgred": "^0.1.1",
+ "ansi-bgwhite": "^0.1.1",
+ "ansi-bgyellow": "^0.1.1",
+ "ansi-black": "^0.1.1",
+ "ansi-blue": "^0.1.1",
+ "ansi-bold": "^0.1.1",
+ "ansi-cyan": "^0.1.1",
+ "ansi-dim": "^0.1.1",
+ "ansi-gray": "^0.1.1",
+ "ansi-green": "^0.1.1",
+ "ansi-grey": "^0.1.1",
+ "ansi-hidden": "^0.1.1",
+ "ansi-inverse": "^0.1.1",
+ "ansi-italic": "^0.1.1",
+ "ansi-magenta": "^0.1.1",
+ "ansi-red": "^0.1.1",
+ "ansi-reset": "^0.1.1",
+ "ansi-strikethrough": "^0.1.1",
+ "ansi-underline": "^0.1.1",
+ "ansi-white": "^0.1.1",
+ "ansi-yellow": "^0.1.1",
+ "lazy-cache": "^2.0.1"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-dim": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-dim/-/ansi-dim-0.1.1.tgz",
+ "integrity": "sha1-QN5MYDqoCG2Oeoa4/5mNXDbu/Ww=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-green": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-green/-/ansi-green-0.1.1.tgz",
+ "integrity": "sha1-il2al55FjVfEDjNYCzc5C44Q0Pc=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-grey": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-grey/-/ansi-grey-0.1.1.tgz",
+ "integrity": "sha1-WdmLasK6GfilF5jphT+6eDOaM8E=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-hidden": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-hidden/-/ansi-hidden-0.1.1.tgz",
+ "integrity": "sha1-7WpMSY0rt8uyidvyqNHcyFZ/rg8=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-inverse": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-inverse/-/ansi-inverse-0.1.1.tgz",
+ "integrity": "sha1-tq9Fgm/oJr+1KKbHmIV5Q1XM0mk=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-italic": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-italic/-/ansi-italic-0.1.1.tgz",
+ "integrity": "sha1-EEdDRj9iXBQqA2c5z4XtpoiYbyM=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-magenta": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-magenta/-/ansi-magenta-0.1.1.tgz",
+ "integrity": "sha1-BjtboW+z8j4c/aKwfAqJ3hHkMK4=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-reset": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-reset/-/ansi-reset-0.1.1.tgz",
+ "integrity": "sha1-5+cSksPH3c1NYu9KbHwFmAkRw7c=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-strikethrough": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-strikethrough/-/ansi-strikethrough-0.1.1.tgz",
+ "integrity": "sha1-2Eh3FAss/wfRyT685pkE9oiF5Wg=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-underline": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-underline/-/ansi-underline-0.1.1.tgz",
+ "integrity": "sha1-38kg9Ml7WXfqFi34/7mIMIqqcaQ=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-white": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-white/-/ansi-white-0.1.1.tgz",
+ "integrity": "sha1-nHe3wZPF7pkuYBHTbsTJIbRXiUQ=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768="
+ },
+ "ansi-yellow": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-yellow/-/ansi-yellow-0.1.1.tgz",
+ "integrity": "sha1-y5NW8vRscy8OMZnmEClVp32oPB0=",
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "requires": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "arr-diff": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA="
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg=="
+ },
+ "arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ="
+ },
+ "array-sort": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/array-sort/-/array-sort-0.1.4.tgz",
+ "integrity": "sha512-BNcM+RXxndPxiZ2rd76k6nyQLRZr2/B/sdi8pQ+Joafr5AH279L40dfokSUTp8O+AaqYjXWhblBWa2st2nc4fQ==",
+ "requires": {
+ "default-compare": "^1.0.0",
+ "get-value": "^2.0.6",
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "array-unique": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg="
+ },
+ "assign-symbols": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c="
+ },
+ "atob": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg=="
+ },
+ "autolinker": {
+ "version": "0.28.1",
+ "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-0.28.1.tgz",
+ "integrity": "sha1-BlK0kYgYefB3XazgzcoyM5QqTkc=",
+ "requires": {
+ "gulp-header": "^1.7.1"
+ }
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "requires": {
+ "cache-base": "^1.0.1",
+ "class-utils": "^0.3.5",
+ "component-emitter": "^1.2.1",
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.1",
+ "mixin-deep": "^1.2.0",
+ "pascalcase": "^0.1.1"
+ }
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-unique": "^0.3.2",
+ "extend-shallow": "^2.0.1",
+ "fill-range": "^4.0.0",
+ "isobject": "^3.0.1",
+ "repeat-element": "^1.1.2",
+ "snapdragon": "^0.8.1",
+ "snapdragon-node": "^2.0.1",
+ "split-string": "^3.0.2",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "cache-base": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
+ "requires": {
+ "collection-visit": "^1.0.0",
+ "component-emitter": "^1.2.1",
+ "get-value": "^2.0.6",
+ "has-value": "^1.0.0",
+ "isobject": "^3.0.1",
+ "set-value": "^2.0.0",
+ "to-object-path": "^0.3.0",
+ "union-value": "^1.0.0",
+ "unset-value": "^1.0.0"
+ }
+ },
+ "class-utils": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "define-property": "^0.2.5",
+ "isobject": "^3.0.0",
+ "static-extend": "^0.1.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
+ },
+ "concat-with-sourcemaps": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/concat-with-sourcemaps/-/concat-with-sourcemaps-1.1.0.tgz",
+ "integrity": "sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==",
+ "requires": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40="
+ },
+ "core-util-is": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
+ },
+ "create-frame": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/create-frame/-/create-frame-1.0.0.tgz",
+ "integrity": "sha1-i5XyaR4ySbYIBEPjPQutn49pdao=",
+ "requires": {
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "isobject": "^3.0.0",
+ "lazy-cache": "^2.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "date.js": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/date.js/-/date.js-0.3.3.tgz",
+ "integrity": "sha512-HgigOS3h3k6HnW011nAb43c5xx5rBXk8P2v/WIT9Zv4koIaVXiH2BURguI78VVp+5Qc076T7OR378JViCnZtBw==",
+ "requires": {
+ "debug": "~3.1.0"
+ }
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "decode-uri-component": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU="
+ },
+ "default-compare": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/default-compare/-/default-compare-1.0.0.tgz",
+ "integrity": "sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==",
+ "requires": {
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
+ "requires": {
+ "is-descriptor": "^1.0.0"
+ },
+ "dependencies": {
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "ent": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz",
+ "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0="
+ },
+ "error-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/error-symbol/-/error-symbol-0.1.0.tgz",
+ "integrity": "sha1-Ck2uN9YA0VopukU9jvkg8YRDM/Y="
+ },
+ "expand-brackets": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
+ "requires": {
+ "debug": "^2.3.3",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "posix-character-classes": "^0.1.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "requires": {
+ "array-unique": "^0.3.2",
+ "define-property": "^1.0.0",
+ "expand-brackets": "^2.1.4",
+ "extend-shallow": "^2.0.1",
+ "fragment-cache": "^0.2.1",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ }
+ },
+ "falsey": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/falsey/-/falsey-0.3.2.tgz",
+ "integrity": "sha512-lxEuefF5MBIVDmE6XeqCdM4BWk1+vYmGZtkbKZ/VFcg6uBBw6fXNEbWmxCjDdQlFc9hy450nkiWwM3VAW6G1qg==",
+ "requires": {
+ "kind-of": "^5.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA="
+ },
+ "for-own": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz",
+ "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=",
+ "requires": {
+ "for-in": "^1.0.1"
+ }
+ },
+ "fragment-cache": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
+ "requires": {
+ "map-cache": "^0.2.2"
+ }
+ },
+ "fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha1-mC1ok6+RjnLQjeyehnP/K1qNat0="
+ },
+ "get-object": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/get-object/-/get-object-0.2.0.tgz",
+ "integrity": "sha1-2S/31RkMZFMM2gVD2sY6PUf+jAw=",
+ "requires": {
+ "is-number": "^2.0.2",
+ "isobject": "^0.2.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "isobject": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-0.2.0.tgz",
+ "integrity": "sha1-o0MhkvObkQtfAsyYlIeDbscKqF4="
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg="
+ },
+ "google-protobuf": {
+ "version": "3.11.3",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.11.3.tgz",
+ "integrity": "sha512-Sp8E+0AJLxmiPwAk9VH3MkYAmYYheNUhywIyXOS7wvRkqbIYcHtGzJzIYicNqYsqgKmY35F9hxRkI+ZTqTB4Tg=="
+ },
+ "grpc_tools_node_protoc_ts": {
+ "version": "2.5.10",
+ "resolved": "https://registry.npmjs.org/grpc_tools_node_protoc_ts/-/grpc_tools_node_protoc_ts-2.5.10.tgz",
+ "integrity": "sha512-oPiY3+7ZlZWiuZ00liGH97R0UdWr7v2ioKuUQIil9kKFEDB8vezvW5gL2My3DrU+TZSL3fnwdydJX9uiD1KzQg==",
+ "requires": {
+ "google-protobuf": "3.5.0",
+ "handlebars": "4.5.3",
+ "handlebars-helpers": "0.10.0"
+ },
+ "dependencies": {
+ "google-protobuf": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/google-protobuf/-/google-protobuf-3.5.0.tgz",
+ "integrity": "sha1-uMxjx02DRXvYqakEUDyO+ya8ozk="
+ }
+ }
+ },
+ "gulp-header": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/gulp-header/-/gulp-header-1.8.12.tgz",
+ "integrity": "sha512-lh9HLdb53sC7XIZOYzTXM4lFuXElv3EVkSDhsd7DoJBj7hm+Ni7D3qYbb+Rr8DuM8nRanBvkVO9d7askreXGnQ==",
+ "requires": {
+ "concat-with-sourcemaps": "*",
+ "lodash.template": "^4.4.0",
+ "through2": "^2.0.0"
+ }
+ },
+ "handlebars": {
+ "version": "4.5.3",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.3.tgz",
+ "integrity": "sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA==",
+ "requires": {
+ "neo-async": "^2.6.0",
+ "optimist": "^0.6.1",
+ "source-map": "^0.6.1",
+ "uglify-js": "^3.1.4"
+ }
+ },
+ "handlebars-helper-create-frame": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/handlebars-helper-create-frame/-/handlebars-helper-create-frame-0.1.0.tgz",
+ "integrity": "sha1-iqUdEK62QI/MZgXUDXc1YohIegM=",
+ "requires": {
+ "create-frame": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "handlebars-helpers": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/handlebars-helpers/-/handlebars-helpers-0.10.0.tgz",
+ "integrity": "sha512-QiyhQz58u/DbuV41VnfpE0nhy6YCH4vB514ajysV8SoKmP+DxU+pR+fahVyNECHj+jiwEN2VrvxD/34/yHaLUg==",
+ "requires": {
+ "arr-flatten": "^1.1.0",
+ "array-sort": "^0.1.4",
+ "create-frame": "^1.0.0",
+ "define-property": "^1.0.0",
+ "falsey": "^0.3.2",
+ "for-in": "^1.0.2",
+ "for-own": "^1.0.0",
+ "get-object": "^0.2.0",
+ "get-value": "^2.0.6",
+ "handlebars": "^4.0.11",
+ "handlebars-helper-create-frame": "^0.1.0",
+ "handlebars-utils": "^1.0.6",
+ "has-value": "^1.0.0",
+ "helper-date": "^1.0.1",
+ "helper-markdown": "^1.0.0",
+ "helper-md": "^0.2.2",
+ "html-tag": "^2.0.0",
+ "is-even": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "is-number": "^4.0.0",
+ "kind-of": "^6.0.0",
+ "lazy-cache": "^2.0.2",
+ "logging-helpers": "^1.0.0",
+ "micromatch": "^3.1.4",
+ "relative": "^3.0.2",
+ "striptags": "^3.1.0",
+ "to-gfm-code-block": "^0.1.1",
+ "year": "^0.2.1"
+ }
+ },
+ "handlebars-utils": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/handlebars-utils/-/handlebars-utils-1.0.6.tgz",
+ "integrity": "sha512-d5mmoQXdeEqSKMtQQZ9WkiUcO1E3tPbWxluCK9hVgIDPzQa9WsKo3Lbe/sGflTe7TomHEeZaOgwIkyIr1kfzkw==",
+ "requires": {
+ "kind-of": "^6.0.0",
+ "typeof-article": "^0.1.1"
+ }
+ },
+ "has-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
+ "requires": {
+ "get-value": "^2.0.6",
+ "has-values": "^1.0.0",
+ "isobject": "^3.0.0"
+ }
+ },
+ "has-values": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "helper-date": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/helper-date/-/helper-date-1.0.1.tgz",
+ "integrity": "sha512-wU3VOwwTJvGr/w5rZr3cprPHO+hIhlblTJHD6aFBrKLuNbf4lAmkawd2iK3c6NbJEvY7HAmDpqjOFSI5/+Ey2w==",
+ "requires": {
+ "date.js": "^0.3.1",
+ "handlebars-utils": "^1.0.4",
+ "moment": "^2.18.1"
+ }
+ },
+ "helper-markdown": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/helper-markdown/-/helper-markdown-1.0.0.tgz",
+ "integrity": "sha512-AnDqMS4ejkQK0MXze7pA9TM3pu01ZY+XXsES6gEE0RmCGk5/NIfvTn0NmItfyDOjRAzyo9z6X7YHbHX4PzIvOA==",
+ "requires": {
+ "handlebars-utils": "^1.0.2",
+ "highlight.js": "^9.12.0",
+ "remarkable": "^1.7.1"
+ }
+ },
+ "helper-md": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/helper-md/-/helper-md-0.2.2.tgz",
+ "integrity": "sha1-wfWdflW7riM2L9ig6XFgeuxp1B8=",
+ "requires": {
+ "ent": "^2.2.0",
+ "extend-shallow": "^2.0.1",
+ "fs-exists-sync": "^0.1.0",
+ "remarkable": "^1.6.2"
+ }
+ },
+ "highlight.js": {
+ "version": "9.18.1",
+ "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.18.1.tgz",
+ "integrity": "sha512-OrVKYz70LHsnCgmbXctv/bfuvntIKDz177h0Co37DQ5jamGZLVmoCVMtjMtNZY3X9DrCcKfklHPNeA0uPZhSJg=="
+ },
+ "html-tag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/html-tag/-/html-tag-2.0.0.tgz",
+ "integrity": "sha512-XxzooSo6oBoxBEUazgjdXj7VwTn/iSTSZzTYKzYY6I916tkaYzypHxy+pbVU1h+0UQ9JlVf5XkNQyxOAiiQO1g==",
+ "requires": {
+ "is-self-closing": "^1.0.1",
+ "kind-of": "^6.0.0"
+ }
+ },
+ "info-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/info-symbol/-/info-symbol-0.1.0.tgz",
+ "integrity": "sha1-J4QdcoZ920JCzWEtecEGM4gcang="
+ },
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "is-accessor-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
+ },
+ "is-data-descriptor": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-descriptor": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
+ "requires": {
+ "is-accessor-descriptor": "^0.1.6",
+ "is-data-descriptor": "^0.1.4",
+ "kind-of": "^5.0.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw=="
+ }
+ }
+ },
+ "is-even": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-even/-/is-even-1.0.0.tgz",
+ "integrity": "sha1-drUFX7rY0pSoa2qUkBXhyXtxfAY=",
+ "requires": {
+ "is-odd": "^0.1.2"
+ }
+ },
+ "is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik="
+ },
+ "is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-number": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-4.0.0.tgz",
+ "integrity": "sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ=="
+ },
+ "is-odd": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-0.1.2.tgz",
+ "integrity": "sha1-vFc7XONx7yqtbm9JeZtyvvE5eKc=",
+ "requires": {
+ "is-number": "^3.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "is-self-closing": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-self-closing/-/is-self-closing-1.0.1.tgz",
+ "integrity": "sha512-E+60FomW7Blv5GXTlYee2KDrnG6srxF7Xt1SjrhWUGUEsTFIqY/nq2y3DaftCsgUMdh89V07IVfhY9KIJhLezg==",
+ "requires": {
+ "self-closing-tags": "^1.0.1"
+ }
+ },
+ "is-windows": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA=="
+ },
+ "isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8="
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
+ },
+ "lazy-cache": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz",
+ "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=",
+ "requires": {
+ "set-getter": "^0.1.0"
+ }
+ },
+ "lodash._reinterpolate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz",
+ "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0="
+ },
+ "lodash.template": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz",
+ "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0",
+ "lodash.templatesettings": "^4.0.0"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz",
+ "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==",
+ "requires": {
+ "lodash._reinterpolate": "^3.0.0"
+ }
+ },
+ "log-ok": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/log-ok/-/log-ok-0.1.1.tgz",
+ "integrity": "sha1-vqPdNqzQuKckDXhza1uXxlREozQ=",
+ "requires": {
+ "ansi-green": "^0.1.1",
+ "success-symbol": "^0.1.0"
+ }
+ },
+ "log-utils": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/log-utils/-/log-utils-0.2.1.tgz",
+ "integrity": "sha1-pMIXoN2aUFFdm5ICBgkas9TgMc8=",
+ "requires": {
+ "ansi-colors": "^0.2.0",
+ "error-symbol": "^0.1.0",
+ "info-symbol": "^0.1.0",
+ "log-ok": "^0.1.1",
+ "success-symbol": "^0.1.0",
+ "time-stamp": "^1.0.1",
+ "warning-symbol": "^0.1.0"
+ }
+ },
+ "logging-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/logging-helpers/-/logging-helpers-1.0.0.tgz",
+ "integrity": "sha512-qyIh2goLt1sOgQQrrIWuwkRjUx4NUcEqEGAcYqD8VOnOC6ItwkrVE8/tA4smGpjzyp4Svhc6RodDp9IO5ghpyA==",
+ "requires": {
+ "isobject": "^3.0.0",
+ "log-utils": "^0.2.1"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8="
+ },
+ "map-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "braces": "^2.3.1",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "extglob": "^2.0.4",
+ "fragment-cache": "^0.2.1",
+ "kind-of": "^6.0.2",
+ "nanomatch": "^1.2.9",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.2"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "minimist": {
+ "version": "0.0.10",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
+ "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8="
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "requires": {
+ "for-in": "^1.0.2",
+ "is-extendable": "^1.0.1"
+ },
+ "dependencies": {
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "moment": {
+ "version": "2.24.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
+ "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "requires": {
+ "arr-diff": "^4.0.0",
+ "array-unique": "^0.3.2",
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "fragment-cache": "^0.2.1",
+ "is-windows": "^1.0.2",
+ "kind-of": "^6.0.2",
+ "object.pick": "^1.3.0",
+ "regex-not": "^1.0.0",
+ "snapdragon": "^0.8.1",
+ "to-regex": "^3.0.1"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "neo-async": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
+ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "requires": {
+ "copy-descriptor": "^0.1.0",
+ "define-property": "^0.2.5",
+ "kind-of": "^3.0.3"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-visit": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.pick": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
+ "requires": {
+ "isobject": "^3.0.1"
+ }
+ },
+ "optimist": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
+ "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
+ "requires": {
+ "minimist": "~0.0.1",
+ "wordwrap": "~0.0.2"
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ="
+ },
+ "posix-character-classes": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs="
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "requires": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "regex-not": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "relative": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/relative/-/relative-3.0.2.tgz",
+ "integrity": "sha1-Dc2OxUpdNaPBXhBFA9ZTdbWlNn8=",
+ "requires": {
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "remarkable": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-1.7.4.tgz",
+ "integrity": "sha512-e6NKUXgX95whv7IgddywbeN/ItCkWbISmc2DiqHJb0wTrqZIexqdco5b8Z3XZoo/48IdNVKM9ZCvTPJ4F5uvhg==",
+ "requires": {
+ "argparse": "^1.0.10",
+ "autolinker": "~0.28.0"
+ }
+ },
+ "repeat-element": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g=="
+ },
+ "repeat-string": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
+ },
+ "resolve-url": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
+ },
+ "ret": {
+ "version": "0.1.15",
+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg=="
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "safe-regex": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
+ "requires": {
+ "ret": "~0.1.10"
+ }
+ },
+ "self-closing-tags": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/self-closing-tags/-/self-closing-tags-1.0.1.tgz",
+ "integrity": "sha512-7t6hNbYMxM+VHXTgJmxwgZgLGktuXtVVD5AivWzNTdJBM4DBjnDKDzkf2SrNjihaArpeJYNjxkELBu1evI4lQA=="
+ },
+ "set-getter": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz",
+ "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=",
+ "requires": {
+ "to-object-path": "^0.3.0"
+ }
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-extendable": "^0.1.1",
+ "is-plain-object": "^2.0.3",
+ "split-string": "^3.0.1"
+ }
+ },
+ "snapdragon": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
+ "requires": {
+ "base": "^0.11.1",
+ "debug": "^2.2.0",
+ "define-property": "^0.2.5",
+ "extend-shallow": "^2.0.1",
+ "map-cache": "^0.2.2",
+ "source-map": "^0.5.6",
+ "source-map-resolve": "^0.5.0",
+ "use": "^3.1.0"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
+ }
+ }
+ },
+ "snapdragon-node": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
+ "requires": {
+ "define-property": "^1.0.0",
+ "isobject": "^3.0.0",
+ "snapdragon-util": "^3.0.1"
+ }
+ },
+ "snapdragon-util": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
+ "requires": {
+ "kind-of": "^3.2.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-url": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM="
+ },
+ "split-string": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
+ "requires": {
+ "extend-shallow": "^3.0.0"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
+ },
+ "static-extend": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
+ "requires": {
+ "define-property": "^0.2.5",
+ "object-copy": "^0.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "requires": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "striptags": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/striptags/-/striptags-3.1.1.tgz",
+ "integrity": "sha1-yMPn/db7S7OjKjt1LltePjgJPr0="
+ },
+ "success-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/success-symbol/-/success-symbol-0.1.0.tgz",
+ "integrity": "sha1-JAIuSG878c3KCUKDt2nEctO3KJc="
+ },
+ "through2": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
+ "requires": {
+ "readable-stream": "~2.3.6",
+ "xtend": "~4.0.1"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM="
+ },
+ "to-gfm-code-block": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/to-gfm-code-block/-/to-gfm-code-block-0.1.1.tgz",
+ "integrity": "sha1-JdBFpfrlUxielje1kJANpzLYqoI="
+ },
+ "to-object-path": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-regex": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
+ "requires": {
+ "define-property": "^2.0.2",
+ "extend-shallow": "^3.0.2",
+ "regex-not": "^1.0.2",
+ "safe-regex": "^1.1.0"
+ },
+ "dependencies": {
+ "define-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
+ "requires": {
+ "is-descriptor": "^1.0.2",
+ "isobject": "^3.0.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
+ "requires": {
+ "assign-symbols": "^1.0.0",
+ "is-extendable": "^1.0.1"
+ }
+ },
+ "is-accessor-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-data-descriptor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
+ "requires": {
+ "kind-of": "^6.0.0"
+ }
+ },
+ "is-descriptor": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ },
+ "is-extendable": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "to-regex-range": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "ts-protoc-gen": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/ts-protoc-gen/-/ts-protoc-gen-0.12.0.tgz",
+ "integrity": "sha512-V7jnICJxKqalBrnJSMTW5tB9sGi48gOC325bfcM7TDNUItVOlaMM//rQmuo49ybipk/SyJTnWXgtJnhHCevNJw==",
+ "requires": {
+ "google-protobuf": "^3.6.1"
+ }
+ },
+ "typeof-article": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/typeof-article/-/typeof-article-0.1.1.tgz",
+ "integrity": "sha1-nwfnM8P7tkb/qeYcCN66zUYOBq8=",
+ "requires": {
+ "kind-of": "^3.1.0"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "uglify-js": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.7.tgz",
+ "integrity": "sha512-FeSU+hi7ULYy6mn8PKio/tXsdSXN35lm4KgV2asx00kzrLU9Pi3oAslcJT70Jdj7PHX29gGUPOT6+lXGBbemhA==",
+ "requires": {
+ "commander": "~2.20.3",
+ "source-map": "~0.6.1"
+ }
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "unset-value": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
+ "requires": {
+ "has-value": "^0.3.1",
+ "isobject": "^3.0.0"
+ },
+ "dependencies": {
+ "has-value": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
+ "requires": {
+ "get-value": "^2.0.3",
+ "has-values": "^0.1.4",
+ "isobject": "^2.0.0"
+ },
+ "dependencies": {
+ "isobject": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ }
+ }
+ },
+ "has-values": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E="
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI="
+ },
+ "use": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ=="
+ },
+ "util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
+ },
+ "warning-symbol": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/warning-symbol/-/warning-symbol-0.1.0.tgz",
+ "integrity": "sha1-uzHdEbeg+dZ6su2V9Fe2WCW7rSE="
+ },
+ "wordwrap": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
+ "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc="
+ },
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="
+ },
+ "year": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/year/-/year-0.2.1.tgz",
+ "integrity": "sha1-QIOuUgoxiyPshgN/MADLiSvfm7A="
+ }
+ }
+}
diff --git a/proto/README.md b/proto/README.md
index 62591bab5e..e052080b22 100644
--- a/proto/README.md
+++ b/proto/README.md
@@ -23,15 +23,11 @@ $ go get -u github.com/golang/protobuf/protoc-gen-go
$ protoc-gen-go # should now be available in your path providing you GOPATH + GOBIN paths are setup correctly.
```
-### protoc-gen-ts
+### protoc-gen-grpc-web
-This will enable code generation in TypeScript for interacting with gRPC-Web. From the root, you will need to run [Yarn](https://yarnpkg.com) in the `frontend` folder:
+This will enable code generation for interacting with gRPC-Web.
-```bash
-$ yarn --cwd ./frontend install
-```
-
-After this, you should be all set!
+Installation instructions are found at https://github.com/grpc/grpc-web#code-generator-plugin
## Generating Code
@@ -77,9 +73,9 @@ Firstly, ensure this line is in your `package.json` within the `frontend/` folde
Next, you can use them in your [Yarn Workspaces](https://yarnpkg.com/en/docs/workspaces/) package using the following:
```ts
-import { IdentityClient } from "@backstage/protocol-definitions/generated/identity/v1/identity_pb_service";
+import { IdentityClient } from '@backstage/protocol-definitions/generated/identity/v1/identity_pb_service';
-const client = new IdentityClient("http://localhost:8080");
+const client = new IdentityClient('http://localhost:8080');
// const req = new GetUserRequest();
// req.setUsername("johndoe");
// client.getUser(req, (err, user) => {
diff --git a/proto/builds/v1/builds.proto b/proto/builds/v1/builds.proto
new file mode 100644
index 0000000000..7d62de0af7
--- /dev/null
+++ b/proto/builds/v1/builds.proto
@@ -0,0 +1,49 @@
+syntax = "proto3";
+
+package spotify.backstage.builds.v1;
+
+option go_package = "buildsv1";
+
+service Builds {
+ rpc ListBuilds(ListBuildsRequest) returns (ListBuildsReply);
+ rpc GetBuild(GetBuildRequest) returns (GetBuildReply);
+}
+
+message ListBuildsRequest {
+ string entity_uri = 1;
+}
+
+message ListBuildsReply {
+ string entity_uri = 1;
+ repeated Build builds = 2;
+}
+
+message GetBuildRequest {
+ string build_uri = 1;
+}
+
+message GetBuildReply {
+ Build build = 1;
+ BuildDetails details = 2;
+}
+
+message Build {
+ string uri = 1;
+ string commit_id = 2;
+ string message = 3;
+ BuildStatus status = 4;
+}
+
+message BuildDetails {
+ string author = 1;
+ string overview_url = 2;
+ string log_url = 3;
+}
+
+enum BuildStatus {
+ NULL = 0;
+ SUCCESS = 1;
+ FAILURE = 2;
+ PENDING = 3;
+ RUNNING = 4;
+}
diff --git a/proto/inventory/v1/inventory.proto b/proto/inventory/v1/inventory.proto
index 33a32f8e8f..c8aca22c2b 100644
--- a/proto/inventory/v1/inventory.proto
+++ b/proto/inventory/v1/inventory.proto
@@ -5,8 +5,19 @@ package spotify.backstage.inventory.v1;
option go_package = "inventoryv1";
service Inventory {
+ rpc ListEntities(ListEntitiesRequest) returns (ListEntitiesReply);
rpc GetEntity(GetEntityRequest) returns (GetEntityReply);
rpc CreateEntity(CreateEntityRequest) returns (CreateEntityReply);
+ rpc SetFact(SetFactRequest) returns (SetFactReply);
+ rpc GetFact(GetFactRequest) returns (GetFactReply);
+}
+
+message ListEntitiesRequest {
+ string uriPrefix = 1;
+}
+
+message ListEntitiesReply {
+ repeated Entity entities = 1;
}
message GetEntityRequest {
@@ -34,7 +45,16 @@ message SetFactRequest {
}
message SetFactReply {
- string factUri = 1;
+ Fact fact = 1;
+}
+
+message GetFactRequest {
+ string entityUri = 1;
+ string name = 2;
+}
+
+message GetFactReply {
+ Fact fact = 1;
}
message Entity {
@@ -42,7 +62,6 @@ message Entity {
}
message Fact {
- string entityUri = 1;
- string name = 2;
- string value = 3;
+ string name = 1;
+ string value = 2;
}
\ No newline at end of file
diff --git a/proto/prototool.yaml b/proto/prototool.yaml
index 510471107c..cb8503583d 100644
--- a/proto/prototool.yaml
+++ b/proto/prototool.yaml
@@ -15,7 +15,9 @@ generate:
type: go
flags: plugins=grpc
output: ../backend/proto
- - name: ts
- path: frontend/node_modules/ts-protoc-gen/bin/protoc-gen-ts
+ - name: js
+ flags: import_style=commonjs
+ output: ../frontend/packages/proto/src/generated
+ - name: grpc-web
+ flags: import_style=commonjs+dts,mode=grpcwebtext
output: ../frontend/packages/proto/src/generated
- flags: service=grpc-web
diff --git a/proto/scaffolder/v1/scaffolder.proto b/proto/scaffolder/v1/scaffolder.proto
index a1dbff29d3..7b185b7fcd 100644
--- a/proto/scaffolder/v1/scaffolder.proto
+++ b/proto/scaffolder/v1/scaffolder.proto
@@ -3,22 +3,41 @@ syntax = "proto3";
package spotify.backstage.scaffolder.v1;
import "identity/v1/identity.proto";
+import "google/protobuf/struct.proto";
option go_package = "scaffolderv1";
service Scaffolder {
- rpc GetAllTemplates(Empty) returns (GetAllTemplatesReply);
+ rpc ListTemplates(Empty) returns (ListTemplatesReply);
+ rpc Create(CreateRequest) returns (CreateReply);
}
message Empty {}
-message GetAllTemplatesReply {
+message ListTemplatesReply {
repeated Template templates = 1;
}
-message Template {
- string id = 1;
- string name = 2;
- string description = 3;
- spotify.backstage.identity.v1.User user = 4;
+message CreateReply {
+ string component_id = 1;
+
}
+
+message CreateRequest {
+ string template_id = 1;
+ string org = 2;
+ string component_id = 3;
+ bool private = 4;
+
+ // here's the cookiecutter.json that is used for the request.
+ // make as a struct so that we can pass through the data in a nice way
+ // withouth having to mess around with stuff and special types.
+ google.protobuf.Struct metadata = 5;
+}
+
+message Template {
+ string id = 1;
+ string name = 2;
+ string description = 3;
+ spotify.backstage.identity.v1.User user = 4;
+}
\ No newline at end of file